【发布时间】:2017-06-10 07:15:37
【问题描述】:
如何改变Calcite默认的sql语法,支持“select func(id) as (a, b, c) from xx;”这样的sql语句
【问题讨论】:
-
你期望这样的 SQL 语句会产生什么?
标签: apache-calcite
如何改变Calcite默认的sql语法,支持“select func(id) as (a, b, c) from xx;”这样的sql语句
【问题讨论】:
标签: apache-calcite
要更改 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 ?