前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Calcite系列(七):执行流程-合法性校验

Calcite系列(七):执行流程-合法性校验

原创
作者头像
Yiwenwu
修改2024-04-20 10:31:15
1590
修改2024-04-20 10:31:15
举报
文章被收录于专栏:Calcite剖析Calcite剖析

基本概念

合法性校验是SQL处理的第二步,在计算执行前,提前验证SQL正确性。该验证操作是非线性的,需要基于语法树处理各种嵌套的复杂情况。Calcite合法性校验基于SqlValidator 接口和对应实现类SqlValidatorImpl 完成。

Calcite合法性校验涉及到两个基本概念:

  • 命名空间(SqlValidatorNamespace):描述SqlNode节点关联的关系模型信息,包括Schema信息,字段类型等
  • 命名解析域(SqlValidatorScope):基于接口方法提供一系列解析验证功能
命名空间
命名空间

SqlValidatorScope基于的基本解析&验证功能列表如下所示:

基本功能

说明

resolve

名字解析,?根据给定的path查找SqlNode

findQualifyingTableNames

收集解析域内的所有数据表信息

findAllColumnNames

收集解析域内所有的列名信息

findAliases

收集解析域内的所有别名(alias)信息

fullyQualify

返回列的全称,例如“deptno”得到“emp.deptno”

addChild

在解析域内注册一个SqlValidatorNamespace

getMonotonicity

返回某个表达式在该解析域内是否有序

getOrderList

作用域内有序的表达式,若没有则返回null

validateExpr

在解析域范围内验证表达式的合法性

lookupWindow

查找解析域内的Window表达式,未找到则返回null

resolveTable

解析域范围内解析数据表的信息

resolveColumn

解析列名并返回其类型,不合法的抛出异常

执行流程

Calcite合法性校验主要分为两个执行阶段:

1. 注册阶段:遍历整个SqlNode语法树,基于MAP哈希表维护各个SqlNode节点的命名空间Namespace和解析域Scope。

以如下查询SQL为例,首先识别到绿色SELECT节点会生成对应SelectNamesapceSelectScope,继续识别紫色Table节点生成对应IdentifierNamespaceTableScope。同样的,依次不断遍历执行,完成所有节点的Namespace和Scope注册。

代码语言:sql
复制
select emp_id, dept_id, 
(select dept_name from hr.depts where dept_id = e.dept_id) as dname
from hr.emps as e
注册阶段
注册阶段

2.?校验阶段SqlValidator定义了校验的全流程,基于各节点已注册关联的Namespace和Scope执行对应validate操作。校验处理可简化为:??validate = Namespace#validate + Scope#validateExpr + 额外校验

校验阶段
校验阶段

校验示例

表/字段校验

基于CalciteSchema(元数据定义)获取表定义,校验:(1).表是否存在;(2).字段类型是否匹配。校验流程如下图所示

Function校验

Calcite支持两种函数类型:

  • 标准内置函数(SqlStdOperatorTable):定义通用的Function函数列表
  • 特定引擎相关的自定义函数(SqlLibraryOperators):定义各个执行引擎扩展的特性函数

在合法性校验阶段会对使用的Function函数逐个验证,主要分为两步:

  1. Function查找:根据名称匹配查找Function,基于SqlOperatorTable#lookupOperatorOverloads 实现
  2. Function校验:基于查找到的Function定义,校验函数入参个数、入参类型、返回类型等信息

隐式转换

为确保数据操作的灵活性和兼容性,SQL引擎会提供数据转换功能,数据转换可分为显式转换隐式转换两类:

  • 显式转换:在SQL语句中明确指定的转换,通常有CAST函数完成,如:CAST(str_column AS INT)
  • 隐式转换:数据库(计算引擎)系统自动进行转换,而无需在SQL语句中明确指定

各类计算引擎所具备的隐式转换能力矩阵各不相同,隐式转换能力越强,则引擎在校验阶段,对字段类型的校验越宽松。例如,Spark的隐式转换能力远胜于Presto,相同的SQL语句在Spark中可以执行成功,但在Presto中可能会直接抛出类型不匹配的错误。

为解决底层各类计算引擎隐式转换能力不同的问题,尽可能让相同语义的SQL可以在不同引擎执行成功。Calcite在validate阶段实现了一套通用的隐式转换处理机制,主要处理包括:

  1. 类型簇校验:基于类型校验,判断SQL中目标类型与源类型是否属于相同的类型簇
  2. 显式转换改写:若目标类型与源类型的类型簇不相同,且这两种类型簇之间允许隐式转换,则基于CAST函数处理显式转换改写

Calcite隐式转换如下图所示:

  • 类型簇:NUMERIC、STRING、DATETIME、BOOLEAN
  • 转换入口:1. DQL校验:SqlValidator#deriveType;2. DML校验:SqlValidator#checkTypeAssignment;
  • 转换处理:基于TypeCoercion实现不同的运算符类型的隐式转换处理

我正在参与2024腾讯技术创作特训营最新征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基本概念
  • 执行流程
  • 校验示例
    • 表/字段校验
      • Function校验
        • 隐式转换
        相关产品与服务
        大数据处理套件 TBDS
        腾讯大数据处理套件(Tencent Big Data Suite,TBDS)依托腾讯多年海量数据处理经验,基于云原生技术和泛 Hadoop 生态开源技术提供的可靠、安全、易用的大数据处理平台。 TBDS可在公有云、私有云、非云化环境,根据不同数据处理需求组合合适的存算分析组件,包括 Hive、Spark、HBase、Flink、Presto、Iceberg、Elasticsearch、StarRocks 等,以快速构建企业级数据湖仓。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
        http://www.vxiaotou.com