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

PostgreSQL令牌机制解析

PostgreSQL 中的 令牌机制(Tokenization) 是 SQL 查询处理的第一步,属于**词法分析(Lexical Analysis)**阶段。它的核心任务是将输入的 SQL 字符串分解为有意义的语法单元(Tokens),为后续的语法解析(Parsing)做准备。以下是其工作机制详解:


一、什么是 Token(令牌)?

Token 是 SQL 中最小的有语义单位,例如:

输入字符串分解后的 Tokens
SELECT id FROM users;SELECT (关键词), id (标识符), FROM (关键词), users (标识符), ; (分隔符)
WHERE price > 100.5WHERE (关键词), price (标识符), > (操作符), 100.5 (数字常量)

二、PostgreSQL 的词法分析器(Lexer)

PostgreSQL 使用 Flex(词法分析器生成器) 实现词法扫描,核心代码在 src/backend/parser/scan.l
工作流程:

  1. 读取输入字符串:逐字符扫描 SQL 文本。
  2. 匹配正则规则:根据预定义规则(如关键词、标识符、数字等模式)切分 Token。
  3. 生成 Token 序列:输出 Token + 值 + 位置信息 给语法分析器(Bison)。

三、Token 的分类

PostgreSQL 的 Token 主要分为以下几类:

类型示例说明
关键词 (KEYWORD)SELECT, INSERT, WHERESQL 保留字,有固定语义
标识符 (IDENTIFIER)表名、列名(如 users, id用户自定义的名称,需大小写处理(默认转小写)
常量 (CONSTANT)100, 'text', 3.14, TRUE数字、字符串、布尔值等字面量
操作符 (OPERATOR)+, >, =, ~~ (LIKE)数学、比较、逻辑运算符
分隔符 (DELIMITER),, ;, (, )分隔语句或子句的符号
注释 (COMMENT)-- comment, /* comment */执行时被忽略

四、关键处理逻辑

  1. 大小写折叠 (Case Folding)

    • 关键词和标识符默认转为小写(除非用双引号包裹 "MyTable")。
    • 例如:SELECTselect(内部处理),"SELECT" → 保留大写(作为标识符)。
  2. 字符串与转义

    • 单引号字符串 'value' 支持转义:E'\\n' → 换行符。
    • 美元引号(Dollar Quoting)避免转义混乱:
      $$This is a 'string' without escaping$$ 
      
  3. 注释处理

    • 单行注释 (-- ...) 和多行注释 (/* ... */) 在词法阶段被直接丢弃,不进入语法树。
  4. 操作符歧义消除

    • 字符组合需区分含义(如 -- 可能是注释或减法运算符),依赖上下文规则解决。

五、示例:Token 生成过程

输入 SQL:

SELECT name FROM "Users" WHERE id = 100 + 1; -- 查询用户

Token 序列

Token 值类型说明
SELECTKEYWORD关键词
nameIDENTIFIER标识符(转为小写)
FROMKEYWORD关键词
"Users"IDENTIFIER带引号标识符(保留大小写)
WHEREKEYWORD关键词
idIDENTIFIER标识符
=OPERATOR比较操作符
100CONSTANT整数常量
+OPERATOR加法操作符
1CONSTANT整数常量
;DELIMITER语句结束符
-- 查询用户COMMENT丢弃

六、与后续流程的衔接

生成的 Token 序列会交给 语法分析器(Parser,基于 Bison 实现)

  1. 语法器根据 gram.y 中的规则构建抽象语法树(AST)
  2. 例如:SELECT ... WHERE ... → 生成 SelectStmt 语法树节点。

七、高级特性:自定义操作符

PostgreSQL 允许用户自定义操作符(如 !!),词法器通过 OPERATOR 规则自动识别:

CREATE OPERATOR !! ( ... );  -- 定义后,词法分析器会将 "!!" 识别为操作符 Token

总结

PostgreSQL 的令牌机制是 SQL 执行的基石:
输入字符串 → 词法分析(Tokenization)→ 语法分析(Parsing)→ 语义分析 → 查询优化
理解 Token 的生成逻辑,有助于调试复杂 SQL 或开发数据库扩展(如自定义语法)。

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

相关文章:

  • Linux从入门到进阶--第四章--Linux使用操作
  • TuringComplete游戏攻略(2.1算数运算)
  • Xshell 自动化脚本大赛技术文章大纲
  • BGP路由协议(三):路径属性
  • Git 的核心工作流程(三区域模型)
  • 第四章:大模型(LLM)】08.Agent 教程-(11)构建历史与数据分析协作系统
  • Kafka 主题级配置从创建到优化
  • 第二十六天-ADC基本原理
  • 一个wordpress的网站需要什么样的服务器配置
  • 医疗AI时代的生物医学Go编程:高性能计算与精准医疗的案例分析(七)
  • 本地运行的检索PDF文件中出现关键字的python程序
  • Coze源码分析-API授权-编辑令牌-后端源码
  • K8s服务日志收集方案文档
  • 【90页PPT】新能源汽车数字化转型SAP解决方案(附下载方式)
  • (纯新手教学)计算机视觉(opencv)实战十——轮廓特征(轮廓面积、 轮廓周长、外接圆与外接矩形)
  • Redis 缓存热身(Cache Warm-up):原理、方案与实践
  • docker,mysql安装
  • 35.Ansible的yaml语法与playbook的写法
  • 嵌入式Linux I2C驱动开发
  • 从零到一:使用Flask构建“我的笔记”网站
  • [光学原理与应用-337]:ZEMAX - 自带的用于学习的样例设计
  • LeetCode100-240搜索二维矩阵Ⅱ
  • Mysql常用函数
  • 针对 “TCP 会话维持与身份验证” 的攻击
  • LabVIEW测斜设备承压试验台
  • SQL学习记录
  • 使用git bash ,出现Can‘t get terminal settings: The handle is invalid. 的解决方法与思路
  • 【OpenGL ES】光栅化插值原理和射线拾取原理
  • 把 AI 塞进「智能跳绳」——基于 MEMS 传感器的零样本卡路里估算器
  • [HFCTF2020]EasyLogin