alibaba / alibaba/druid

token IDENTIFIER SQL

Open
#5,232 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
Java
Stars
28.2k
Forks
8.6k
PR merge metrics
No merged PRs in 30d

Description

sql解析异常,

[destination = example , address = /127.0.0.1:3306 , EventParser] WARN c.a.otter.canal.parse.inbound.mysql.tsdb.MemoryTableMeta - parse faield : CREATE DEFINER=`root`@`%` FUNCTION `FUNCTION_DBKEY`() RETURNS varchar(30) CHARSET utf8
DETERMINISTIC
SQL SECURITY INVOKER
BEGIN^M
^M
declare dstring char(62) default 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';^M
^M
declare rndstr char(6);^M
^M
DECLARE result VARCHAR(30) DEFAULT "AUTOID_";^M
^M
DECLARE dtime LONG DEFAULT UNIX_TIMESTAMP(NOW())*1000;^M
^M
set rndstr = SUBSTRING(dstring,1 + FLOOR(RAND()*61),1);^M
^M
SET rndstr = CONCAT(rndstr,SUBSTRING(dstring,1 + FLOOR(RAND()*61),1));^M
^M
SET rndstr = CONCAT(rndstr,SUBSTRING(dstring,1 + FLOOR(RAND()*61),1));^M
^M
SET rndstr = CONCAT(rndstr,SUBSTRING(dstring,1 + FLOOR(RAND()*61),1));^M
^M
SET rndstr = CONCAT(rndstr,SUBSTRING(dstring,1 + FLOOR(RAND()*61),1));^M
^M
SET rndstr = CONCAT(rndstr,SUBSTRING(dstring,1 + FLOOR(RAND()*61),1));^M
^M
set dtime = dtime + FLOOR(RAND()*1000);^M
^M
SET result = CONCAT(result,dtime,rndstr);^M
^M
RETURN result;^M
^M
END
com.alibaba.druid.sql.parser.ParserException: not supported.pos 112, line 3, column 6, token IDENTIFIER SQL
at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:615) ~[druid-1.2.12.jar:1.2.12]
at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatement(SQLStatementParser.java:4738) ~[druid-1.2.12.jar:1.2.12]
at com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser.parseCreateFunction(MySqlStatementParser.java:8423) ~[druid-1.2.12.jar:1.2.12]
at com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser.parseCreate(MySqlStatementParser.java:397) ~[druid-1.2.12.jar:1.2.12]
at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:245) ~[druid-1.2.12.jar:1.2.12]
at com.alibaba.druid.sql.SQLUtils.parseStatements(SQLUtils.java:592) ~[druid-1.2.12.jar:1.2.12]
at com.alibaba.druid.sql.SQLUtils.parseStatements(SQLUtils.java:613) ~[druid-1.2.12.jar:1.2.12]
at com.alibaba.druid.sql.repository.SchemaRepository.console(SchemaRepository.java:463) ~[druid-1.2.12.jar:1.2.12]
at com.alibaba.otter.canal.parse.inbound.mysql.tsdb.MemoryTableMeta.apply(MemoryTableMeta.java:85) ~[canal.parse-1.1.7-SNAPSHOT.jar:na]
at com.alibaba.otter.canal.parse.inbound.mysql.tsdb.DatabaseTableMeta.applyHistoryOnMemory(DatabaseTableMeta.java:467) [canal.parse-1.1.7-SNAPSHOT.jar:na]
at com.alibaba.otter.canal.parse.inbound.mysql.tsdb.DatabaseTableMeta.rollback(DatabaseTableMeta.java:168) [canal.parse-1.1.7-SNAPSHOT.jar:na]
at com.alibaba.otter.canal.parse.inbound.mysql.AbstractMysqlEventParser.processTableMeta(AbstractMysqlEventParser.java:142) [canal.parse-1.1.7-SNAPSHOT.jar:na]
at com.alibaba.otter.canal.parse.inbound.AbstractEventParser$1.run(AbstractEventParser.java:197) [canal.parse-1.1.7-SNAPSHOT.jar:na]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_151]

删除SQL SECURITY INVOKER 后,星号也不能解析

2023-04-20 14:38:52.472 [destination = example , address = /127.0.0.1:3306 , EventParser] WARN c.a.otter.canal.parse.inbound.mysql.tsdb.MemoryTableMeta - parse faield : CREATE DEFINER=`root`@`%` FUNCTION `FUNCTION_DBKEY`() RETURNS varchar(30) CHARSET utf8
DETERMINISTIC
BEGIN^M
^M
declare dstring char(62) default 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';^M
^M
declare rndstr char(6);^M
^M
DECLARE result VARCHAR(30) DEFAULT "AUTOID_";^M
^M
DECLARE dtime LONG DEFAULT UNIX_TIMESTAMP(NOW())*1000;^M
^M
set rndstr = SUBSTRING(dstring,1 + FLOOR(RAND()*61),1);^M
^M
SET rndstr = CONCAT(rndstr,SUBSTRING(dstring,1 + FLOOR(RAND()*61),1));^M
^M
SET rndstr = CONCAT(rndstr,SUBSTRING(dstring,1 + FLOOR(RAND()*61),1));^M
^M
SET rndstr = CONCAT(rndstr,SUBSTRING(dstring,1 + FLOOR(RAND()*61),1));^M
^M
SET rndstr = CONCAT(rndstr,SUBSTRING(dstring,1 + FLOOR(RAND()*61),1));^M
^M
SET rndstr = CONCAT(rndstr,SUBSTRING(dstring,1 + FLOOR(RAND()*61),1));^M
^M
set dtime = dtime + FLOOR(RAND()*1000);^M
^M
SET result = CONCAT(result,dtime,rndstr);^M
^M
RETURN result;^M
^M
END
com.alibaba.druid.sql.parser.ParserException: not supported.pos 369, line 11, column 57, token *
at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:615) ~[druid-1.2.16.jar:na]
at com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser.parseBlock(MySqlStatementParser.java:2365) ~[druid-1.2.16.jar:na]
at com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser.parseCreateFunction(MySqlStatementParser.java:8439) ~[druid-1.2.16.jar:na]
at com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser.parseCreate(MySqlStatementParser.java:397) ~[druid-1.2.16.jar:na]
at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:245) ~[druid-1.2.16.jar:na]
at com.alibaba.druid.sql.SQLUtils.parseStatements(SQLUtils.java:596) ~[druid-1.2.16.jar:na]
at com.alibaba.druid.sql.repository.SchemaRepository.console(SchemaRepository.java:468) ~[druid-1.2.16.jar:na]
at com.alibaba.otter.canal.parse.inbound.mysql.tsdb.MemoryTableMeta.apply(MemoryTableMeta.java:85) ~[canal.parse-1.1.7-SNAPSHOT.jar:na]
at com.alibaba.otter.canal.parse.inbound.mysql.tsdb.DatabaseTableMeta.applyHistoryOnMemory(DatabaseTableMeta.java:467) [canal.parse-1.1.7-SNAPSHOT.jar:na]
at com.alibaba.otter.canal.parse.inbound.mysql.tsdb.DatabaseTableMeta.rollback(DatabaseTableMeta.java:168) [canal.parse-1.1.7-SNAPSHOT.jar:na]
at com.alibaba.otter.canal.parse.inbound.mysql.AbstractMysqlEventParser.processTableMeta(AbstractMysqlEventParser.java:142) [canal.parse-1.1.7-SNAPSHOT.jar:na]
at com.alibaba.otter.canal.parse.inbound.AbstractEventParser$1.run(AbstractEventParser.java:197) [canal.parse-1.1.7-SNAPSHOT.jar:na]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_151]

Contributor guide

Open the contributing guide

Research direction

Start with MySqlStatementParser.parseCreateFunction and parseBlock, then reproduce the supplied CREATE FUNCTION statements through SQLUtils.parseStatements. Compare the failures involving SQL SECURITY INVOKER and RAND()* expressions, and consider the work done when both forms parse without ParserException.

Written by the indexing model from the issue text.

Assessment

Tech stack
java, mysql, sql
Domain
databases
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.