pg 绑定变量源码解析

news2024/12/23 19:08:14

pg 绑定变量相关源码解析

下面以callstmt 为例 说明一下绑定参数的执行流程(基于pg13)

整体架构

bind param

1. exec_parse_message

解析变量。


	--> parse_analyze_varparams 解析绑定参数$id
		--->parse_variable_parameters , 把返回值paramTypes, numParams绑定到VarParamState *parstate中
		--> transformTopLevelStmt
			--> transformCallStmt
				--> transformExpr
					--> transformParamRef 
						--> p_paramref_hook  variable_paramref_hook 转换参数,并设置 VarParamState *parstate.numParams,初始化paramTypes 为UNKNOWNOID。
				--> ParseFuncOrColumn
					--> p_coerce_param_hook variable_coerce_param_hook 设置param 节点及要返回的paramTypes中的类型
				
	--> 判断paramTypes 中类型是否都准确设置, 不为UNKNOWNOID,InvalidOid

	--> CompleteCachedPlan 设置plansource->param_types,plansource->num_params,plansource->resultDesc (返回结果)	
		--> PlanCacheComputeResultDesc
			--> ChoosePortalStrategy   返回PORTAL_UTIL_SELECT
UtilityReturnsTuples 返回 如果有返回值则返回true 
			--> UtilityTupleDescriptor 有返回值,构造tuple

2. exec_bind_message

设置实际变量值。

exec_bind_message 根据plansource->param_types, plansource->num_params 来转换输入的变量值,构造ParamListInfo 保存转换后的值。然后调用PortalStart 设置portal->tupDesc,portal->portalParams -》ParamListInfo

3. exec_execute_message

portal 的执行策略

portal 的执行策略有如下几种:

typedef enum PortalStrategy
{
	PORTAL_ONE_SELECT,   // 一条select查询
	PORTAL_ONE_RETURNING, //一条带有返回值的INSERT/UPDATE/DELETE查询(with a RETURNING clause) 
	PORTAL_ONE_MOD_WITH,  // 一条带有data-modifying CTEs的select 查询
	PORTAL_UTIL_SELECT,   // 带返回结果的util
	PORTAL_MULTI_QUERY    // 所有其他情况: 没有返回值的util/INSERT/UPDATE/DELETE
} PortalStrategy;

PORTAL_ONE_SELECT 在 PortalStart时会调用CreateQueryDesc创建 QueryDesc,会设置params。 然后调用ExecutorStart,然后执行ExecInitNode, 最终会调用ExecInitExprRec 设置变量的实际值。

callstmt 为 portal 策略为 PORTAL_UTIL_SELECT

根据实际变量值,执行SQL。

        --> PortalRun   PORTAL_UTIL_SELECT
          --> FillPortalStore   Run the query and load result tuples into the portal's tuple store. portal->holdStore
            --> standard_ProcessUtility
				--> ExecuteCallStmt  传入ParamListInfo(portal->portalParams) 和DestReceiver *dest(返回值发送到dest, DestTuplestore, 实际为portal->holdStore)
          --> PortalRunSelect  forward=true, fetching from a completed holdStore
              --> RunFromStore  从portal->holdStore 获取数据发给客户端,用portal->tupDesc描述结构

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

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

相关文章

《Java黑皮书基础篇第10版》 第18章【习题】

Java语言程序设计 习题第十八章 18.2章节习题 18.1 什么是递归方法?什么是无限递归? 递归方法可以拆解为递和归。在Java中,大多数方法的执行都需要调用栈,来跟踪方法的调用和返回。在递的过程中,递归方法调用自身,把新的调用添…

Vue3 开发语法使用总结(超详细、超基础)

前言 最近开源了一套后台管理模板Wocwin-Admin,是基于 Vue3.2、TypeScript、Vite4、Pinia、Element-Plus、Qiankun(微前端) 技术栈,借此归纳一下Vue3.2的新语法。 一、全局注册(属性/方法) 1、main.ts注册 import { createApp } from "vue";…

Ubuntu22 2023最新版安装教程

Ubuntu22安装教程 2023全网最新版 前置资源准备 如果选择使用虚拟机安装,那么需要准备VmwareWorkstation 在官网进行下载安装 VmwareWorkstation官网:https://www.vmware.com/products/workstation-pro/workstation-pro-evaluation.html 前置资源准备好后就可以…

【SpringCloud config分布式配置中心】—— 每天一点小知识

💧 S p r i n g C l o u d c o n f i g 分布式配置中心 \color{#FF1493}{SpringCloud config分布式配置中心} SpringCloudconfig分布式配置中心💧 🌷 仰望天空,妳我亦是行人.✨ 🦄 个人主页——微风撞见云的…

okcc呼叫系统运营商的重点功能有什么

一、资费套餐模块 资费套餐,即客户进行业务时使用的资费标准。填写资费套餐名称,选择计费规则方式,点击“确认”按钮即可创建一条资费套餐,如下图所示。 计费规则即计费所遵循的规则。OKCC系统目前设计了以下三种计费方式(后续还…

Caretta 利用 eBPF 实现 Kubernetes 应用网络拓扑

介绍 Caretta 是一种轻量级的独立工具,快速展示集群中运行的服务可视化网络图。 Caretta 利用 eBPF 有效地展示 K8s 集群中的服务网络交互图,并利用 Grafana 查询和可视化收集的数据。科学家们早就知道,海龟和许多动物一样,通过…

【瑞萨RA_FSP】AGT——低功耗定时器

文章目录 一、AGT简介二、AGT的框图分析1. 16位计数器2. 16位重装载寄存器3. 计数时钟源4. 比较匹配功能5. 比较匹配输出引脚6. 输出引脚7. 下溢事件信号/测量完成事件信号输出 三、AGT工作模式详解四、实验:比较匹配功能——PWM输出1. 硬件设计2. 文件结构3. FSP配…

基础篇:新手使用vs code新建go项目(从0开始到运行)

学习新语言,搭建新环境。在网上找了一些教程,感觉还是写一个比较详细的方便以后自己使用。其实vs code没有新建项目这个功能,具体怎么运行go语言的项目请看下文。 一、下载GO安装包 1.点击go安装包下载链接下载相应的版本(本次下…

【计算机网络自顶向下】简答题习题总结(三)

文章目录 第三章 传输层UDP用户数据报协议可靠数据传输原理面向连接传输TCP流量控制可靠数据传输机制 题目 第三章 传输层 传输层服务:在两个不同的主机的运行应用程序之间提供逻辑通信 在接收主机多路分解 将接收到的数据段传递给正确的套接字【多路分解】 在发送…

线程与轻进程(OS)

目录 1、进程的引入 2、线程的概念 3、线程的结构 3、线程控制块 5、线程的实现 (1)用户级别线程 (2)核心级别线程 (3)混合线程 6、线程的应用 1、进程的引入 进程切换 上下文涉及内容多&#xf…

软件测试面试,从简历到面试常问,不学几招怎么跳槽?

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 软件测试面试环节…

关于Java多线程不安全的问题简析

在了解多线程不安全的问题之前 让我们先来看如下代码 public class demo18 {public static int count 0;public static void main(String[] args) throws InterruptedException {Thread t1 new Thread(()->{for (int i 0; i < 10000; i) {count;}});Thread t2 new …

软件测试报告需要做哪些测试内容?软件测试外包服务公司靠谱吗?

在软件开发领域中&#xff0c;测试是最为重要的环节之一&#xff0c;它在确保软件质量方面有着至关重要的作用。软件测试是一种检验软件代码是否符合设计和用户期望的过程。软件测试的主要目的是发现缺陷并确保软件在实际使用中的可靠性&#xff0c;安全性&#xff0c;以及稳定…

Linux中centos修改系统时间并写到硬件,Linux中centos设置定时自动同步网络时间

文章目录 前言一、centos修改系统时间并写到硬件1.1查看当前的系统时间1.2修改系统时间1.3查看硬件时间1.4同步系统时间和硬件时间1.5本地时间写入硬件时间 二、centos设置定时自动同步网络时间2.1安装ntpdate工具2.2CentOS安装/操纵crontab2.3启动crontab并查看状态2.4写一个c…

Ubuntu系统安装Mysql服务并设置远程连接-Navicat连接Mysql-物联网系统

目录 一、前言 二、Mysql的安装 三、Mysql服务管理 四、配置Mysql远程连接 五、修改登录限制 六、修改Root密码 七、Navicat连接Mysql 一、前言 在我们购买服务器后&#xff0c;常需要在服务器上部署数据库以存储我们所需要的数据&#xff0c;因此我们本文将在Ubuntu系统…

LeetCode - #81 搜索旋转排序数组 II

文章目录 前言1. 描述2. 示例3. 答案关于我们 前言 我们社区陆续会将顾毅&#xff08;Netflix 增长黑客&#xff0c;《iOS 面试之道》作者&#xff0c;ACE 职业健身教练。&#xff09;的 Swift 算法题题解整理为文字版以方便大家学习与阅读。 LeetCode 算法到目前我们已经更新…

解决阿里云服务器被植入挖矿脚本过程

文章目录 前言一、服务器为什么会被告警挖矿&#xff1f;二、怎么解决&#xff1a;1.top 命令查看进程cpu 占用情况&#xff1a;2.通过pid进程号&#xff0c;查找改程序所在的目录&#xff1a;3. 强制删除脚本文件&#xff1a;4. 强制杀死进程&#xff1a;5. 检查是否有脚本的定…

three.js物体纹理及其常用属性介绍

一、Three中的纹理和材质介绍 THREE中的纹理和材质是用来渲染3D场景中的物体表面的。纹理贴图定义物体表面的颜色和外观&#xff0c;而材质则定义物体表面如何反射光线。 纹理可以使用多种类型的图像文件&#xff0c;包括JPEG、PNG、GIF等。纹理可以是简单的颜色、图案或者是复…

史上最卷618背后:国产手机厂商突围的“新武器”

智能手机&#xff0c;究竟还是不是个好生意? 这个问题在近些年被市场反复追问&#xff0c;在最近被称为“史上最卷”的618期间&#xff0c;更是被增添了悲观的色彩。IDC中国研究经理郭天翔表示&#xff0c;本次618智能终端市场是低于预期的&#xff0c;同时也低于去年同期。除…

Qt6.2教程——1.Qt安装及编写登录界面

本文旨在帮助读者理解如何使用ChatGPT来辅助安装和学习Qt 6.2。我们将从Qt 6.2的基本概念开始&#xff0c;然后深入了解其安装过程&#xff0c;并探讨如何使用ChatGPT作为一个强大的辅助工具。对于那些寻求在学习和使用Qt 6.2中找到有效支持的人来说&#xff0c;这篇文章将提供…