У меня есть проект, который требует использования синтаксического анализатора 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, так что я делаю неправильно? ?