Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SQL-parser在解析有中括号的sql时报错,替换成array()函数就没问题。 #5908

Closed
cjjcoolboy opened this issue May 13, 2024 · 0 comments

Comments

@cjjcoolboy
Copy link

dbtype: doris
dbversion: 1.2.7
druid verion: 1.2.22
error sql:

SELECT CONCAT(date_id, ' ', e1, e2) hour_minute1 
from (select 1 k1) AS t,
(SELECT date_id FROM dim_date 
WHERE date_id between date_format(DATE_SUB(20240513, INTERVAL 7 DAY), 'yyyy-MM-dd') AND date_format(20240513, 'yyyy-MM-dd')) dd
lateral VIEW explode(['00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23']) tmp1 as e1
lateral VIEW explode([':00:00', ':30:00']) tmp2 AS e2

testcase code:

-- 步骤1:先创建一个时间维表,用于上述sql执行
CREATE TABLE `dim_date` (
  `date_id` varchar(30) NULL
) ENGINE=OLAP
UNIQUE KEY(`date_id`)
COMMENT '时间维表'
DISTRIBUTED BY HASH(`date_id`) BUCKETS 1
PROPERTIES (
"replication_allocation" = "tag.location.default: 3",
"in_memory" = "false",
"storage_format" = "V2",
"enable_unique_key_merge_on_write" = "true",
"light_schema_change" = "true",
"disable_auto_compaction" = "false"
);

-- 步骤2:随便插入一些日期,日期格式为 2024-05-13
INSERT INTO dim_date
(date_id)
VALUES
('2024-05-10'),
('2024-05-11'),
('2024-05-12'),
('2024-05-13');

-- 步骤3:执行上述error sql解析
String sql = "上述error sql";
SQLSelectStatement sqlSelectStatement = (SQLSelectStatement) SQLUtils.parseStatements(sql, "mysql").get(0);

error info:

Exception in thread "main" com.alibaba.druid.sql.parser.ParserException: ERROR. pos 263, line 5, column 22, token [
	at com.alibaba.druid.sql.parser.SQLExprParser.primary(SQLExprParser.java:1314)
	at com.alibaba.druid.sql.dialect.mysql.parser.MySqlExprParser.primary(MySqlExprParser.java:527)
	at com.alibaba.druid.sql.parser.SQLExprParser.expr(SQLExprParser.java:109)
	at com.alibaba.druid.sql.parser.SQLExprParser.exprList(SQLExprParser.java:2231)
	at com.alibaba.druid.sql.parser.SQLExprParser.methodRest(SQLExprParser.java:1877)
	at com.alibaba.druid.sql.parser.SQLExprParser.primaryRest(SQLExprParser.java:1647)
	at com.alibaba.druid.sql.dialect.mysql.parser.MySqlExprParser.primaryRest(MySqlExprParser.java:751)
	at com.alibaba.druid.sql.parser.SQLExprParser.primary(SQLExprParser.java:1354)
	at com.alibaba.druid.sql.dialect.mysql.parser.MySqlExprParser.primary(MySqlExprParser.java:492)
	at com.alibaba.druid.sql.parser.SQLSelectParser.parseLateralView(SQLSelectParser.java:2017)
	at com.alibaba.druid.sql.parser.SQLSelectParser.parseTableSourceRest(SQLSelectParser.java:1886)
	at com.alibaba.druid.sql.dialect.mysql.parser.MySqlSelectParser.parseTableSourceRest(MySqlSelectParser.java:820)
	at com.alibaba.druid.sql.parser.SQLSelectParser.parseTableSourceRest(SQLSelectParser.java:1445)
	at com.alibaba.druid.sql.dialect.mysql.parser.MySqlSelectParser.parseTableSourceRest(MySqlSelectParser.java:820)
	at com.alibaba.druid.sql.parser.SQLSelectParser.parseTableSourceRest(SQLSelectParser.java:1875)
	at com.alibaba.druid.sql.dialect.mysql.parser.MySqlSelectParser.parseTableSourceRest(MySqlSelectParser.java:820)
	at com.alibaba.druid.sql.parser.SQLSelectParser.parseTableSourceRest(SQLSelectParser.java:1445)
	at com.alibaba.druid.sql.dialect.mysql.parser.MySqlSelectParser.parseTableSourceRest(MySqlSelectParser.java:820)
	at com.alibaba.druid.sql.dialect.mysql.parser.MySqlSelectParser.parseTableSource(MySqlSelectParser.java:446)
	at com.alibaba.druid.sql.dialect.mysql.parser.MySqlSelectParser.parseFrom(MySqlSelectParser.java:99)
	at com.alibaba.druid.sql.dialect.mysql.parser.MySqlSelectParser.query(MySqlSelectParser.java:247)
	at com.alibaba.druid.sql.parser.SQLSelectParser.select(SQLSelectParser.java:62)
	at com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser.parseSelect(MySqlStatementParser.java:112)
	at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:233)
	at com.alibaba.druid.sql.SQLUtils.parseStatements(SQLUtils.java:600)
	at com.alibaba.druid.sql.SQLUtils.parseStatements(SQLUtils.java:594)
	at com.alibaba.druid.sql.SQLUtils.parseStatements(SQLUtils.java:617)
	at com.fcbox.nebula.util.SqlParser.getSqlLimit(SqlParser.java:298)
	at com.fcbox.nebula.util.SqlParser.main(SqlParser.java:1781)

true case:

-- 用array替代[]数组写法即可
SELECT CONCAT(date_id, ' ', e1, e2) hour_minute1 
from (select 1 k1) AS t,
(SELECT date_id FROM dim_date 
WHERE date_id between date_format(DATE_SUB(20240513, INTERVAL 7 DAY), 'yyyy-MM-dd') AND date_format(20240513, 'yyyy-MM-dd')) dd
lateral VIEW explode(array('00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23')) tmp1 as e1
lateral VIEW explode(array(':00:00', ':30:00')) tmp2 AS e2
lizongbo added a commit to lizongbo/druid that referenced this issue May 14, 2024
lizongbo added a commit that referenced this issue May 14, 2024
优化中括号解析逻辑 #5908 , #5743
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants