Calcite SqlParser не соответствует спецификации типа данных int (11) в инструкции CREATE TABLE с использованием соответствия MYSQL_5

У меня есть проект, который требует использования синтаксического анализатора SQL Calcite для анализа большого количества операторов DDL, которые находятся на тяжелом диалекте MySQL.

Я выделил проблему, которую можно проиллюстрировать на этом конкретном примере:

create table `t1` (x int(11))

Проницательный читатель может распознать int(11) диалект MySQL. Мне нужно иметь возможность разобрать это. Удаление (11) в этом примере не является приемлемым решением.

Вот тест Java JUnit, который воспроизводит проблему:

public class SqlParserMysqlTest {

    private static final Config CONFIG = SqlParser.Config.DEFAULT
        .withLex(Lex.MYSQL).withConformance(SqlConformanceEnum.MYSQL_5)
        .withParserFactory(SqlDdlParserImpl.FACTORY);

    @Test
    public void testMysqlCreate() throws SqlParseException {
        SqlParser sqlParser = SqlParser.create(
                new SourceStringReader("create table `t1` (x int(11))"), CONFIG);
        SqlNode sqlNode = sqlParser.parseQuery();

        Assert.assertEquals(SqlKind.CREATE_TABLE, sqlNode.getKind());

        SqlCreateTable create = (SqlCreateTable) sqlNode;
        Assert.assertEquals("T1", create.name.getSimple());
        final SqlColumnDeclaration sqlColumnDeclaration = (SqlColumnDeclaration) create.columnList
                .get(0);
        Assert.assertEquals("X", sqlColumnDeclaration.name.getSimple());
        Assert.assertEquals("INTEGER",
                sqlColumnDeclaration.dataType.getTypeName().getSimple());
    }

}

POM-зависимости:

    <dependency>
        <groupId>org.apache.calcite</groupId>
        <artifactId>calcite-core</artifactId>
        <version>1.26.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.calcite</groupId>
        <artifactId>calcite-server</artifactId>
        <version>1.26.0</version>
    </dependency>

Проблема в том, что синтаксический анализатор ругается на круглые скобки в int(11):

org.apache.calcite.sql.parser.SqlParseException: Encountered "(" at line 1, column 25.
Was expecting one of:
    "ARRAY" ...
    "AS" ...
    "DEFAULT" ...
    "GENERATED" ...
    "MULTISET" ...
    "NOT" ...
    "NULL" ...
    ")" ...
    "," ...
    
    at org.apache.calcite.sql.parser.ddl.SqlDdlParserImpl.convertException(SqlDdlParserImpl.java:394)
    at org.apache.calcite.sql.parser.ddl.SqlDdlParserImpl.normalizeException(SqlDdlParserImpl.java:157)
    at org.apache.calcite.sql.parser.SqlParser.handleException(SqlParser.java:140)
    at org.apache.calcite.sql.parser.SqlParser.parseQuery(SqlParser.java:155)

Я знаю, что другие люди успешно используют Calcite для разбора синтаксиса MySQL, так что я делаю неправильно? ?


person Alex R    schedule 15.11.2020    source источник


Ответы (1)


Судя по документации по элементам таблицы, исправленный синтаксис может быть create table `t1` (x int 11) (теряя внутренние скобки), но у меня нет возможности проверить это.

person Joseph E    schedule 25.11.2020