如何更改 Calcite 的默认 sql 语法?”

How to change Calcite's default sql grammar?"

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

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

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

第二种是使用Calcite项目提供的语法扩展点之一。 Calcite的语法写在JavaCC, but the it first runs the grammar though the FreeMarker template engine. The expansion points are variables in the template that your project can re-assign. For example, if you want to add a new DDL command, you can modify the createStatementParserMethods variable, as is done in Calcite's parser extension test:

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

使用以下哪种方法?如果可以,一定要使用第二种,也就是说,如果您的语法更改发生在预定义的扩展点之一。仅在必须时使用第一个,因为您将 运行 陷入维护语法分支的问题。

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