Skip to content

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

@cjjcoolboy

Description

@cjjcoolboy

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions