Flink - Row 里使用字符串的 ParseException
1. Row 里显式使用字符串的问题
在 20 年初最开始使用 Flink 1.9.1 时,有一些看似普通的 SQL 也会执行失败。比如下面这个:
package cn.izualzhy
import org.apache.flink.streaming.api.scala._
import org.apache.flink.table.api.bridge.scala.StreamTableEnvironment
object LiteralInRowTest extends App {
val env = StreamExecutionEnvironment.createLocalEnvironment(1)
val tEnv = StreamTableEnviro...
Calcite-5:SQL解析
C 代码编译时要经过词法分析、语法分析:比如提取关键字(int/for/#define, ETC.),判断语法是否正确。
类似的,SQL 字符串解析为SqlNode也需要词法分析。
在 Calcite 中,这一过程借助于 javacc 完成。预配置的语法文件里,包含了需要的关键字以及对应的代码模板。随着解析字符串匹配到关键字,一步步生成需要的代码。
这篇笔记主要记录 javacc 以及 Calcite 里对应的源码分析。
1. javacc
javacc1是一个 java 版本的语法解析库,我们可以用来定义自己的关键字,生成 java 代码。
举个例子,我们定义一个自解释的Explain关键字,输入形如:
EXPLAIN javacc;
预期的输出是打印参数(java...
Calcite-4:代码生成与编译
1. Csv表
之前记录了 Calcite 的架构和简化后的代码流程,这篇笔记回归下最开始Tutorial笔记里的 Csv 表,仿照写了一个可以 Debug 的例子(TutorialTest.scala):
val csvPath = getClass.getClassLoader.getResource("sales_from_calcite_sources").getPath
// val csvSchema = new CsvSchema(new File(csvPath), CsvTable.Flavor.SCANNABLE)
val csvSchema = new CsvSchema(new File(csvPath), CsvTable.Flavor.TRAN...
Calcite-3:处理流程的代码例子
单纯看Calcite-2里的架构图理解不深,这篇笔记通过代码示例补充下 SqlParser、SqlValiator、SqlToRelConverter 等的处理流程。
实现主要参考了1和源码单测里的CsvTest,使用 Book & Author 表,查询 SQL 跟关系代数里基本一致以方便前后对比,完整的代码可以参考CalciteProcessSteps.scala
1. SqlParser
val query =
"""SELECT b.id,
| b.title,
| b.publish_year,
| a.fname,
| a.lname
...
232 post articles, 29 pages.