当关键字为 POINT 时,Antlr 在输入时没有可行的替代方案
Antlr no viable alternative at input when the keyword is POINT
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>
我怀疑所有 (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
| ...
;
即:他们扩展了解析器内部的有效标识符集。
感谢@Bart 的评论Here。此错误已从 5.0.0-alpha 中修复。
顺便说一句,ShardingSphere 支持许多主流的 RDBMS,如 MySQL、PostgreSQL、SQLServer 和 Oracle。因此你会在这个 repo 中看到大量的 g4 文件。理想情况下,Antlr g4 文件中的这些定义应该与相应的官方 SQL 文档保持一致。因此,如果有任何不匹配,请在 ISSUES 报告。非常感谢。
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>
我怀疑所有 (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
| ...
;
即:他们扩展了解析器内部的有效标识符集。
感谢@Bart 的评论Here。此错误已从 5.0.0-alpha 中修复。
顺便说一句,ShardingSphere 支持许多主流的 RDBMS,如 MySQL、PostgreSQL、SQLServer 和 Oracle。因此你会在这个 repo 中看到大量的 g4 文件。理想情况下,Antlr g4 文件中的这些定义应该与相应的官方 SQL 文档保持一致。因此,如果有任何不匹配,请在 ISSUES 报告。非常感谢。