4

如何更改Calcite默认的sql语法,支持“select func(id) as (a, b, c) from xx;”这样的sql语句

4

1 回答 1

12

要更改 SQL 解析器接受的语法,您需要更改解析器。有两种方法可以做到这一点。

首先是 fork 项目并更改核心语法Parser.jj。但与以往一样,当您分叉一个项目时,您有责任在每次升级到项目的新版本时重新应用您的更改。

第二种是使用 Calcite 项目提供的语法扩展点之一。Calcite 的语法是用JavaCC编写的,但它首先通过FreeMarker模板引擎运行语法。扩展点是您的项目可以重新分配的模板中的变量。例如,如果你想添加一个新的 DDL 命令,你可以修改createStatementParserMethods变量,就像在Calcite 的解析器扩展测试中所做的那样:

  # List of methods for parsing extensions to "CREATE [OR REPLACE]" calls.
  # Each must accept arguments "(Span span, boolean replace)".
  createStatementParserMethods: [
    "SqlCreateTable"
  ]

使用这些方法中的哪一种?如果可以,请务必使用第二个,也就是说,如果您的语法更改发生在预定义的扩展点之一。仅在必须时才使用第一个,因为您将遇到维护语法分支的问题。

如果可能,看看 Calcite 是否会接受这些更改作为贡献。这是您的理想方案,因为 Calcite 将负责维护您的语法扩展。但是,如果它是标准 SQL 或由一个或多个主要数据库实现的有用功能,他们可能只会接受您的更改。他们将要求您的代码质量高,并附有测试。

于 2017-06-09T23:15:37.257 回答