postgresql 内核源码分析 语法解析 gram.y

news2025/1/10 16:48:13

 

  • 专栏内容:postgresql内核源码分析
  • 个人主页:我的主页
  • 座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物.

目录

前言

概述

流程简介

调用流程

语法解析详细分解

raw_parser的主流程

词法与语法分析器的实例化

与词法解析器的使用

scanner_init的流程

与语法解析器的使用

parser_init的流程

base_yyparse执行

scanner_finish清理

结尾


前言

本文是基于postgresql 15的代码进行分析解读,演示是在centos8系统上进行。


概述

通过flex/bison进行词法和语法解析,生成语法分树。

当然这里使用的是pure-parse模式,也就是flex的输入是指定的str,而且需要初始化每个scanner的额外数据及扫描状态结构;

在bison中也是,需要初始化对应的词法scanner状态结构和额外数据的结构。

这样就可以将客户端输入的SQL字符串输入到词法分析器,这个词法分析器的输出对应到语法分析器,语法分析器将解析后的内容存到语法树中。

当然,这样做的另一个好处是,可以实例化词法-语法分析器,也就是可以并发处理多个客户端的SQL输入,启用多个词法-语法分析对输入进行分析,并生成多个语法树,这就是数据库并发多客户端。

流程简介

代码位置:

src/backend/parser/parser.c

raw_parser函数中初始化词法,语法分析器,并将SQL字符串输入,并输出语法树。

调用流程

exec_simple_query

-> pg_parse_query

-> raw_parser

在pg_parse_query 中可以定义 这两个宏,打开调试代码。

COPY_PARSE_PLAN_TREES

WRITE_READ_PARSE_PLAN_TREES

在pg_parse_query中只是包装了raw_parser,返回parse_tree_list;

然后由exec_simple_query继续进行分析,成生解析树,再生成计划树,到执行;

语法解析详细分解

  • raw_parser的主流程

(1)初始化词法分析器;客户端收到的SQL字符串做为词法分析器的输入;

(2)初始化语法分析器;

(3)开始语法分析,调用base_yyparse解析语法,当然它的输入是词法分析器上下文yyscanner;

(4)返回语法树;

  • 词法与语法分析器的实例化

在我的博客《postgresql 词法/语法(scanner/parser)中flex/bison介绍》

一文中已经介绍了flex/bison的机制和简单用法。

Postgresql是可以并发访问的数据库,所以同时会有多个输入SQL同时进行解析,当然我们不能用一套词法/语法解析器,那它就成了性能瓶颈。

那如何做呢?

也就是刚看到的raw_parser中的主流程,每个并发分别动态初始化词法/语法分析器,词法分析器的输入不再是标准输入,而直接就是字符串指定。

而对应的语法分析器,输入就成了刚才初始化的词法分析器。

这样多个并发,互相独立进行解析。

  • 与词法解析器的使用

词法分析器的初始化

core_yyscan_t

scanner_init(const char *str,

                         core_yy_extra_type *yyext,

                          const ScanKeywordList *keywordlist,

                          const uint16 *keyword_tokens)

它定义在

src/backend/parser/scan.l

由flex编译之后生成

src/backend/parser.scan.c

  • scanner_init的流程

(1)调用yylex_init初始化词法分析器上下文scan

(2)将用户数据绑定到词法分析器的yyextra;这里的用户数据是指在词法分析器返回标识时,同时还需要记录一些数据,这些数据就记录在yyextra中。

(3)初始化用户数据结构,同时将SQL字符串拷到用户数据中;

(4)调用yy_scan_buffer,将词法分析器的输入设置为用户数据中的SQL字符buffer;

(5)最后初始化解析使用的buffer;

(6)返回以上初始化的scanner;

  • 与语法解析器的使用

语法分析器的初始化

void

parser_init(base_yy_extra_type *yyext)

语法分析的执行

int        base_yyparse(core_yyscan_t yyscanner);

动态分配空间的清理

void

scanner_finish(core_yyscan_t yyscanner)

定义在

src/backend/parser/gram.y,

通过bison编译后生成

src/backend/parser/gram.c

  • parser_init的流程

这里只是将语法树初始化为NULL;对用户数据并没有使用,为什么呢?

因为语法解析树也是存储在用户数据部分。在语法定义时gram.y中,对语法表达式绑定了对应结构的类型,对应数据就在语法树中进行存储,所以语法解析器只是解析就OK了。

  • base_yyparse执行

语法解析的执行,其实它同时驱动词法分析和语法解析,词法分析每解析返回一个标识,语法解析就进行表达式规则匹配。

当有匹配的表达式,就执行对应规则,将数据存到语法树节点中。

具 体规则,可以看当前专栏的博文

在我的博客《postgresql 词法/语法(scanner/parser)中flex/bison介绍》

  • scanner_finish清理

这里只对SQL和分析buffer进行了清理,对词法分析器scanner并没有清理。


结尾

作者邮箱:study@senllang.onaliyun.com
如有错误或者疏漏欢迎指出,互相学习。

注:未经同意,不得转载!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/580808.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Wireshark使用手册

目录 前言 Wireshark不能做的 Wireshark VS Fiddler 同类的其他工具 什么人会用到wireshark wireshark 开始抓包 Wireshark 窗口介绍 Wireshark 显示过滤 保存过滤 过滤表达式的规则 封包列表(Packet List Pane) 封包详细信息 (Packet Details Pane) wireshark与…

【CVPR_2023论文精读】E4S: Fine-grained Face Swapping via Regional GAN Inversion

【CVPR_2023论文精读】E4S: Fine-grained Face Swapping via Regional GAN Inversion 0、前言Abstract1. Introduction2. Related Work2.1 GAN Inversion2.2 Face Swapping 3. Methodology3.1. Editing-for-Swapping (E4S) Framework3.1.1 Reenactment.3.1.2 Swapping and Gene…

学习:双重差分模型DIDPSM-基于Stata实现

双重差分模型 定义 双重差分法(Difference in Differences): 通过利用观察学习的数据,计算自然实验中“实验组”与“对照组”在干预下增量的差距。 步骤: 分组:对于一个自然实验,其将全部的样本数据分为…

JMeter性能测试101:一步一步教你如何开始

1. Jmeter简介 Apache JMeter是一款纯java编写负载功能测试和性能测试开源工具软件。相比Loadrunner而言,JMeter小巧轻便且免费,逐渐成为了主流的性能测试工具,是每个测试人员都必须要掌握的工具之一。 2023年最新版Jmeter性能测试项目实战…

FFmpeg5.0源码阅读——mov文件格式解析

摘要:之前在Mp4格式详解中详细描述了Mp4文件格式的具体布局方式。为了更加深入理解mp4文件格式,本文记录了ffmpeg中解封装mp4文件的基本实现。关键字:mov、FFmpeg、mp4 1 简介 mp4文件格式是现如今网络上最常见的视频文件格式,其和mov等格式…

复合查询.

基本查询 查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J select * from EMP where (sal>500 or jobMANAGER) and ename like J%;按照部门号升序而雇员的工资降序排序 select * from EMP order by deptno, sal desc;使用年薪进…

为建筑物的供暖系统实施MPC控制器的小型项目(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

【网络】- TCP/IP四层(五层)协议 - 网际层(网络层) - 路由控制

目录 一、概述二、路由表(Routing table)三、最长匹配、默认路由、特定主机路由四 、IP数据报路由过程五、路由聚合 一、概述 网际协议 IP 大致分为三大作用模块, ①IP寻址、 ②路由(最终节点为止的转发) 、③IP分包与组包。前面两篇文章讨论…

dpdk ip分片报文重组处理

dpdk ip报文重组及分片API及处理逻辑介绍 DPDK的分片和重组实现零拷贝,详细介绍可以参阅DPDK分片与重组用户手则 相关数据结构 /** Fragmented packet to reassemble.* First two entries in the frags[] array are for the last and first fragments.*/ struct …

【测试平台开发】

【测试平台开发】 一、 后端开发 1、常见的技术架构与组件 语言: 项目注重高并发:选用go 注重区块链:选用go、rust(主打高性能) 大型浏览网站(如电商):Java 技术架构与组件: 前端技术架构&a…

多元回归预测 | Matlab白鲸算法(BWO)优化BP神经网络回归预测,BWO-BP回归预测,多变量输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元回归预测 | Matlab白鲸算法(BWO)优化BP神经网络回归预测,BWO-BP回归预测,多变量输入模型 评价指标包括:MAE、RMSE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 部分源码 %--------------…

供收藏:国内各种免费可用ChatGPT实测(兼验伪) 版本不断更新补充 更新日期:2023/05/28

文章目录 供收藏:国内各种免费可用ChatGPT实测(兼验伪) 版本不断更新补充 更新日期:2023/05/28国内大厂的人工智能语言模型国内可访问的ChatGPT资源(创业公司)ZelinAI(国内可直接访问的ChatGPT)注册邀请码网…

2023全国大学生信息安全竞赛(ciscn)初赛题解

战队信息 安全知识 甚至不用看视频,百度就有答案。除了那个最新的美国时政,其它的ChatGPT就能回答。 Misc 签到卡 关注公众号,根据提示,直接print(open(‘/flag’).read()): 国粹 脑洞题,给的题目原图…

【LeetCode热题100】打卡第6天:正则表达式匹配

文章目录 正则表达式匹配⛅前言🔒题目🔑题解 正则表达式匹配 ⛅前言 大家好,我是知识汲取者,欢迎来到我的LeetCode热题100刷题专栏! 精选 100 道力扣(LeetCode)上最热门的题目,适合…

从原理总结chatGPT的Prompt的方法

一 什么是chatGPT chatGPT全称是Generative Pre-trained Transformer,它是一种专注于对话生成的语言模型,可以根据用户的文本输入,做出相应的智能回答。chatGPT是由OpenAI于2018年研发的语言模型,其中OpenAI是于2015年由特斯拉的…

Postman新手教程

博主简介:想进大厂的打工人博主主页:xyk:所属专栏: JavaEE初阶 目录 文章目录 一、Postman背景介绍 二、Postman下载地址 三、Postman简单使用 一、Postman背景介绍 Postman是Chrome插件类产品中的代表产品之一,这款网页调试工具不仅可以调…

位图布隆过滤器

位图 概念:就是用每一位来存放某种状态,适用于海量数据,数据无重复的场景。通常是用来判断某个数据存不存在的。 比如,需要在40亿个整数中,查看某个数是否存在? 1G1024M*1024KB*1024B~10亿字节~80亿比特。…

k8s实战篇1-用minikube发布服务hello-minikube

1 安装minikube curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64 sudo install minikube-darwin-amd64 /usr/local/bin/minikube 2 Install kubectl binary with curl on macOS 1 Download the latest release: curl -LO "h…

Eclipse Ⅶ

哈喽各位,今天继续分享第七部分的内容,喜欢可以点赞和收藏,这是我的动力来源hahahhah! 今天谈谈Eclipse 生成 jar 包、Eclipse 关闭项目以及Eclipse 编译项目。 废话不多说,开始咯! Eclipse 生成 jar 包…

Linux常见指令-2

我们本期继续学习Linux基本指令,没有看过第一期的小伙伴建议先看第一期 (4条消息) Linux常见指令-1_KLZUQ的博客-CSDN博客 目录 15.时间相关指令 16.cal指令 17.find指令 18.grep指令 19.zip/unzip指令 20.tar指令 21.bc指令 22.uname –r指令 22.重要的几…