当前位置: 首页 > ops >正文

GaussDB 数据库架构师修炼(十八) SQL引擎-解析器

什么是SQL解析

SQL解析是SQL查询处理中的第一个模块。对输入的原始SQL语句,SQL解析将SQL查询语句转换为等效的关系代数运算,它通常以基于关系代数的查询树来表示。查询树会作为后续查询优化模块的输入。
SQL解析又可划分为三个子模块,包括词法分析、语法分析和语义分析,三个模 块按照顺序执行:
词法分析提取出SQL语句中的关键词、常量等成分
语法分析:将词法分析提取的成分构建为一棵语法分析树
语义分析:检查语法分析树的语义正确性, 并将其转化为基于关系代数式表达的查询树

2 词法分析

SQL解析的第一步是对SQL查询进行词法分析。

词法分析模块会按照查询语句的词法规则(通常使用正则表达式定义 将查询语句拆解为token 序列,并提取关键词、标识、常量等,并对不同类别的单词进行类别标记

3 语法分析

1)根据词法分析输出的原子节点构建语法分析树

2)首先根据语法规则判断SQL语句是否符合语法限制。如果符合语法规则,则按照语法规则识别出SQL查询中的语法类节点, 并结合词法分析输出的原子节点(关键词等)构建一棵语法分析树

在SQL解析中,关键字(也称为关键词)是一种特殊定义的字符串。关键字分为 保留关键字非保留关键字

  • 1)保留关键字是在SQL中具有特殊含义的单词 ,通常用于表示SQL查询语句的不同部分,如操作类型或条件。例如SELECT 、CREATE 、ALL 、GROUP  BY 、IS 、NOT 、WHERE等。特别要注意的是保留关键字不可被用作列名、表名其他标识, 但添加双引号后可支持,例如"SELECT"。

2)非保留关键字只是在特定的环境里有特殊的含义, 而在其他环境里是可以用作标识符的。例如 ABORT 、ADD 、AT 、BLOB 、COLVIEW 、COPY等。这些关键字不支持直接作为列别名使用,  但可以作为列名和表名。 GaussDB还存在一些特别的非保留关键字在一些情况下有特殊限制。

3)移进规约

对于自下而上的上下文无关语法分析器中, 栈保留正在处理的字符。 移进指将输入字符压入栈顶, 规约指根据文法规则将栈顶的若干字符替换为一个非终结符(匹配到某个语法规则)。

  • 移进-规约冲突:在某一时刻,可以移进,也可以规约。GaussDB会选择移进,继续向下匹配。  

    规约-规约冲突:所处理的字符串可以匹配到多个规则,分析器无法判断到底该选择哪项规则。这种就需 要指定优先级等策略辅助确定规则。

  • 4 语义分析

  • 语义分析要对语法分析所输出的语法分析树进行语义上的正确性检查 并将语法分析树转化为方 便查询优化阶段处理的查询树

  • 正确性检查包括:

      关系进行检查:查询中出现的关系是否存在于关系模式

      属性的检查:查询中涉及的属性是否能在数据库关系中找到匹配项

      数据类型的检查:查询中的运算是否与涉及的属性类型相匹配

    正确性检查完毕后,则将语法树逻辑等价转化为基于关系代数式表达的查询树以便后面的查询优化。   

(Π)表示投影; (X)表示笛卡尔积; (σ)表示选择; (^)表示逻辑与

          转化后的关系代数查询树

http://www.xdnf.cn/news/18525.html

相关文章:

  • 学习游戏制作记录(合并更多的技能与技能树)8.23
  • [e3nn] 模型部署 | TorchScript JIT | `@compile_mode`装饰器 | Cython
  • 老年常见疾病及健康管理建议
  • 精斗云智能开单解决方案:高效移动办公新体验
  • Qt/C++开发监控GB28181系统/录像文件回放/自动播放下一个录像文件/倍速回放/录像文件下载
  • openharmony之一多开发:产品形态配置讲解
  • 使用自制的NTC测量模块测试Plecs的热仿真效果
  • 分布式蜜罐系统的部署安装
  • 微服务统一入口——Gateway
  • Redis 从入门到精通:原理、实战与性能优化全解析
  • Flutter BLoC 全面入门与实战(含代码示例)
  • 云计算-K8s 运维:Python SDK 操作 Job/Deployment/Pod+RBAC 权限配置及自定义 Pod 调度器实战
  • 概率论基础教程第六章 随机变量的联合分布(一)
  • FastAPI + SQLAlchemy 数据库对象转字典
  • 解决coze api使用coze.workflows.runs.create运行workflow返回400,但text为空
  • SEO优化工具学习——Ahrefs进行关键词调研(包含实战)
  • 市政道路井盖缺失识别误报率↓82%!陌讯多模态融合算法实战优化与边缘部署
  • ChipCamp探索系列 -- 4. Intel CPU的十八代微架构
  • 【React Native】自定义轮盘(大转盘)组件Wheel
  • 【KO】前端面试题四
  • 今日科技热点 | 量子计算突破、AI芯片与5G加速行业变革
  • PLECS 中使用 C-Script 来模拟 NTC 热敏电阻(如 NTC3950B)
  • 【K8s】整体认识K8s之Docker篇
  • 百度面试题:赛马问题
  • 嵌入式LINUX-------------数据库
  • 循环中的阻塞风险与异步线程解法
  • 搜索体验优化:ABP vNext 的查询改写(Query Rewrite)与同义词治理
  • 前端安全之XSS和CSRF
  • 鸿蒙异步处理从入门到实战:Promise、async/await、并发池、超时重试全套攻略
  • 互联网大厂Java面试实战:核心技术栈与场景化提问解析(含Spring Boot、微服务、测试框架等)