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

zsh*_*eon 3 apache-calcite

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

小智 9

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

第一个是分叉项目并更改核心语法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"
  ]
Run Code Online (Sandbox Code Playgroud)

使用以下哪种方法?如果可以的话,绝对使用第二个,也就是说,如果您的语法更改发生在其中一个预定义的扩展点中.如果必须,请使用第一个,因为您将遇到维护语法分叉的问题.

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