【问题标题】:How to change Calcite's default sql grammar?"如何更改 Calcite 的默认 sql 语法?”
【发布时间】:2017-06-10 07:15:37
【问题描述】:

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

【问题讨论】:

  • 你期望这样的 SQL 语句会产生什么?

标签: apache-calcite


【解决方案1】:

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

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

第二种是使用Calcite项目提供的语法扩展点之一。 Calcite 的语法是用JavaCC 编写的,但它首先通过FreeMarker 模板引擎运行语法。扩展点是您的项目可以重新分配的模板中的变量。例如,如果要添加新的 DDL 命令,可以修改 createStatementParserMethods 变量,就像在 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 或由一个或多个主要数据库实现的有用功能,他们可能只会接受您的更改。他们将要求您的代码质量高,并附有测试。

【讨论】:

  • 正如你所提到的,我不想修改jj 文件本身,但似乎*.ftl 文件只能接受新的自定义标识符定义和解析方法,如果我想怎么办覆盖默认的Parser.jj ?
  • 有没有办法使用现有命令(如 INSERT OVERWRITE 或 LATERAL VIEW EXPLODE)的数据库特定关键字来扩展语法?谢谢!
猜你喜欢
  • 2019-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-13
  • 1970-01-01
  • 2012-01-29
  • 1970-01-01
相关资源
最近更新 更多