PostgreSQL令牌机制解析

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 或开发数据库扩展(如自定义语法)。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码的余温

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值