import org.antlr.v4.runtime.tree.ParseTree;
import org.apache.shardingsphere.sql.parser.core.parser.SQLParserExecutor;
import org.junit.Test;
import javax.xml.bind.SchemaOutputResolver;
public class T1 {
@Test
public void t1() {
ParseTree parseTree = new SQLParserExecutor("MySQL", "insert into T_NAME (POINT) values (?)").execute().getRootNode();
}
}此代码将报告以下错误:
line 1:20 no viable alternative at input '(POINT'当我使用其他列名时,这是可以的,但是POINT不起作用。为什么?
Java项目,pom.xml:
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-namespace</artifactId>
<version>4.1.1</version>
</dependency>发布于 2021-05-07 21:32:43
我怀疑所有(MySQL)或更多的关键字都会触发这个错误(POLYGON可能也会产生这个错误)。语法可能正在尝试匹配标识符,但由于输入POINTS已经作为关键字进行了匹配,因此无法正确匹配它。
如下所示:
insert_stat
: INSERT INTO? table_name '(' column_names ')' ...
;
column_names
: IDENTIFIER ( ',' IDENTIFIER )*
;看一下Github的问题,一个维护者表示5.0.0-alpha正确地处理了这个问题,这意味着他们可能做了类似这样的事情来修复它:
insert_stat
: INSERT INTO? table_name '(' column_names ')' ...
;
column_names
: identifier ( ',' identifier )*
;
identifier
: IDENTIFIER
| POINT
| POLYGON
| ...
;即:他们在解析器中扩展了一组有效的标识符。
https://stackoverflow.com/questions/67415281
复制相似问题