当关键字为 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 报告。非常感谢。