token IDENTIFIER SQL
- 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
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