【问题标题】:Apache Calcite - Can't seem to parse DDL statementsApache Calcite - 似乎无法解析 DDL 语句
【发布时间】:2018-12-16 09:38:06
【问题描述】:

以下是我用来解析 MySQL 语句的配置。我能够很好地解析和处理 DML 语句,但我似乎无法解析任何 DDL 语句(CREATE TABLE、ALTER TABLE、DROP TABLE 等)。

public static SqlNode parse(String query) {
    SqlParser.Config sqlParserConfig = SqlParser.configBuilder()
        .setConformance(SqlConformanceEnum.MYSQL_5)
        .setLex(Lex.MYSQL)
        .build();

    SqlParser parser = SqlParser.create(query, sqlParserConfig);

    try {
        return parser.parseStmt();
    } catch (SqlParseException e) {
        lastErrorMessage = e.getMessage();
        return null;
    }
}

当我尝试解析 CREATE TABLE 语句时,它给了我以下错误消息。

Encountered "ALTER TABLE" at line 1, column 1.
Was expecting one of:
    "SET" ...
    "RESET" ...
    "ALTER" "SYSTEM" ...
    "ALTER" "SESSION" ...
    "WITH" ...
    "+" ...
    "-" ...
    "NOT" ...
    "EXISTS" ...
    <UNSIGNED_INTEGER_LITERAL> ...
    <DECIMAL_NUMERIC_LITERAL> ...
    <APPROX_NUMERIC_LITERAL> ...
    <BINARY_STRING_LITERAL> ...
    <PREFIXED_STRING_LITERAL> ...
    <QUOTED_STRING> ...
    <UNICODE_STRING_LITERAL> ...
... 

我可以在库中看到像SqlAlterSqlCreateSqlDrop 这样的类。是否有不同的方式来解析 DDL?

我正在使用1.17.0 版本。

【问题讨论】:

  • 好像parseStmt 调用了parseQuery,它被记录为“Parses a SELECT statement and reuses parser.”。所以看起来这两种方法都只能解析一个选择语句(github.com/apache/calcite/blob/…
  • @Caramiriel 否。文档是这么说的,但他们也可以解析 INSERT、UPDATE 和 DELETE 语句。

标签: apache-calcite


【解决方案1】:

我认为您只是缺少适当的解析器工厂。请尝试以下操作:

SqlParser.Config sqlParserConfig = SqlParser.configBuilder()
    .setParserFactory(SqlDdlParserImpl.FACTORY)
    .setConformance(SqlConformanceEnum.MYSQL_5)
    .setLex(Lex.MYSQL)
    .build();

SqlParser parser = SqlParser.create(query, sqlParserConfig);

【讨论】:

  • 显然,SqlDdlParserImplcalcite-server 中可用。因此,我也必须添加该依赖项。
  • configBuilder() 在 Calcite 1.26.0 上已弃用。看起来SqlParser.Config.DEFAULT 是替代品。
猜你喜欢
  • 2020-04-09
  • 1970-01-01
  • 1970-01-01
  • 2018-03-21
  • 1970-01-01
  • 2012-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多