PostgreSQL码农集散地

PolarDB内核学习 - parser SQL解析器

PolarDB内核学习 - parser SQL解析器

parser 概览

1. 概述

src/backend/parser 目录是 PostgreSQL 解析器的核心部分,负责将 SQL 查询转换为查询树(Query Tree)。这个过程包括词法分析、语法分析、语义分析等步骤,最终生成的结构会被优化器和执行器使用。

2. 主要文件及其功能

Image


3. 文件详细解析

  1. parser.c

  • 功能: 解析器的入口点,负责调用词法分析器scan.l、语法分析器gram.y和语义分析器analyze.c。
  • 注释: 该文件是 PostgreSQL 语法的入口点,确保在事务中止时仍能进行基本解析。接收 SQL 查询字符串,将其传递给词法分析器,然后将词法分析器生成的 token 流传递给语法分析器,最后将语法分析器生成的原始语法树传递给语义分析器。
  • scan.l

    • 功能: 词法分析器(lexer)使用 flex 工具生成,将 SQL 查询分解为标记(tokens)。Tokenization: 将 SQL 查询字符串分解成一个个的 token(关键字、标识符、常量、运算符等)。
    • 注释: 该文件必须与 src/fe_utils/psqlscan.l 和 src/interfaces/ecpg/preproc/pgc.l 保持同步。需要与前端工具 psql 和 ecpg 的词法分析器保持同步,确保一致的 token 定义。
  • scansup.c

    • 功能: 支持核心词法分析器的辅助函数,处理输入字符串中的转义字符等。
    • 注释: 提供词法分析器的支持功能。
  • gram.y

    • 功能: 语法分析器,使用 Bison 工具将标记(tokens)解析为“原始”解析树。接收 scan.l 产生的 token 流,根据语法规则构建一个原始的语法树(Raw Parse Tree)。
    • 注释: 该文件包含 PostgreSQL 的 Bison 规则和动作,确保不进行数据库访问或依赖可变状态。
  • analyze.c

    • 功能: 将 gram.y 生成的原始解析树转换为查询树(Query Tree),对查询进行语义分析,例如类型检查、名称解析、权限检查等。
    • 注释: 对于可优化语句,获取适当的锁并进行语义分析;对于实用命令,直接将其转储到查询节点中。特殊处理: DECLARE CURSOR、EXPLAIN 和 CREATE TABLE AS 等命令包含可优化的语句,需要进行转换。
  • parse_agg.c

    • 功能: 处理聚合函数和窗口函数。
    • 注释: 负责解析和处理聚合函数和窗口函数。
  • parse_clause.c

    • 功能: 处理 SQL 查询中的子句,如 WHERE、ORDER BY、GROUP BY 等。
    • 注释: 负责解析和处理各种查询子句。
  • parse_coerce.c

    • 功能: 处理类型强制转换。
    • 注释: 负责解析和处理表达式中的类型强制转换。
  • parse_collate.c

    • 功能: 分配排序规则信息。
    • 注释: 在表达式解析完成后,分配排序规则信息。
  • parse_cte.c

    • 功能: 处理公共表表达式(WITH 子句)。
    • 注释: 负责解析和处理公共表表达式。
  • parse_expr.c

    • 功能: 处理表达式,如列、列 + 3、x = 3 或 x = 4 等。
    • 注释: 负责解析和处理各种表达式。
  • parse_func.c

    • 功能: 处理函数、表.列和列标识符。
    • 注释: 负责解析和处理函数调用和标识符。
  • parse_node.c

    • 功能: 创建各种结构的节点。
    • 注释: 负责创建各种解析树节点。
  • parse_oper.c

    • 功能: 处理表达式中的运算符。
    • 注释: 负责解析和处理表达式中的运算符。
  • parse_param.c

    • 功能: 处理参数。例如预编译语句中的 $1、$2 等。
    • 注释: 负责解析和处理查询中的参数。
  • parse_relation.c

    • 功能: 支持表和列处理的辅助函数。
    • 注释: 提供表和列处理的支持功能。
  • parse_target.c

    • 功能: 处理查询的结果列表。
    • 注释: 负责解析和处理查询的结果列表。
  • parse_type.c

    • 功能: 支持数据类型处理的辅助函数。
    • 注释: 提供数据类型处理的支持功能。
  • parse_utilcmd.c

    • 功能: 对实用命令(utility commands)进行解析分析。这些命令的分析通常在执行时进行,以避免依赖过时的数据库状态。
    • 注释: 在实用命令执行时进行解析分析,确保数据库状态的正确性。

    4. 总结

    src/backend/parser 目录中的文件共同协作,将 SQL 查询从字符串形式转换为查询树,供优化器和执行器使用。每个文件都有其特定的职责,从词法分析到语法分析,再到语义分析和特定功能的处理。理解这些文件的功能和它们之间的关系,有助于深入理解 PostgreSQL 的查询处理机制。

     以上内容基于DeepSeek及诸多AI生成, 轻微人工调整, 感谢杭州深度求索人工智能等公司. 

     AI 生成的内容请自行辨别正确性, 当然也多了些许踩坑的乐趣, 毕竟冒险是每个男人的天性.