PostgreSQL源码分析——绑定变量

这里分析一下函数中应用绑定变量的问题,但实际应用场景中,不推荐这么使用。

prepare divplan2(int,int) as select div($1,$2);
execute divplan2(4,2);
语法解析

分别分析prepare语句以及execute语句。
gram.y中定义

/*********************************************************************		QUERY:*				PREPARE <plan_name> [(args, ...)] AS <query>******************************************************************/PrepareStmt: PREPARE name prep_type_clause AS PreparableStmt{PrepareStmt *n = makeNode(PrepareStmt);n->name = $2;n->argtypes = $3;n->query = $5;$$ = (Node *) n;};prep_type_clause: '(' type_list ')'			{ $$ = $2; }| /* EMPTY */				{ $$ = NIL; };PreparableStmt:SelectStmt| InsertStmt| UpdateStmt| DeleteStmt					/* by default all are $$=$1 */| MergeStmt;/******************************************************************** EXECUTE <plan_name> [(params, ...)]******************************************************************/
ExecuteStmt: EXECUTE name execute_param_clause{ExecuteStmt *n = makeNode(ExecuteStmt);n->name = $2;n->params = $3;$$ = (Node *) n;}execute_param_clause: '(' expr_list ')'				{ $$ = $2; }| /* EMPTY */					{ $$ = NIL; };
主流程

prepare,execute语句代码主流程如下,

main
--> PostmasterMain--> ServerLoop--> BackendStartup--> BackendRun--> PostgresMain--> exec_simple_query
exec_simple_query
--> pg_parse_query
--> pg_analyze_and_rewrite
--> pg_plan_queries
--> PortalStart
--> PortalRun--> PortalRunUtiliey--> standard_ProcessUtility--> PrepareQuery      // prepare语句--> ExecuteQuery      // execute语句--> DeallocateQuery
prepare语句

prepare divplan2(int,int) as select div($1,$2);
Prepare语句主流程如下:

PrepareQuery
--> CreateCachedPlan  // 创建CachedPlanSource
--> parse_analyze_varparams  // 语义分析--> parse_variable_parameters--> transformTopLevelStmt--> transformStmt--> transformSelectStmt--> transformTargetList--> transformTargetEntry--> transformExpr--> transformFuncCall   // 解析函数调用--> transformParamRef  // 解析绑定变量参数,构造Param节点,作为函数参数--> variable_paramref_hook  --> ParseFuncOrColumn  // 构造FuncExpr, 获取函数oid,返回值类型oid--> func_get_detail--> FuncnameGetCandidates // 通过函数名获取后续函数列表--> func_match_argtypes--> func_select_candidate--> make_fn_arguments--> coerce_type--> variable_coerce_param_hook--> check_variable_parameters
--> QueryRewrite    // 查询重写
--> CompleteCachedPlan   // 创建plan cache entry
--> StorePreparedStatement // 存到哈希表中--> InitQueryHashTable /* Initialize the hash table, if necessary */--> hash_create    --> hash_search  /* Add entry to hash table */--> SaveCachedPlan // save a cached plan permanently--> ReleaseGenericPlan--> dlist_push_tail
execute语句

execute divplan2(4,2);
Execute主流程如下:

ExecuteQuery
--> FetchPreparedStatement // 哈希表中查找是否有已缓存的执行计划--> hash_search
--> CreateExecutorState
--> EvaluateParams   // 获取绑定变量参数,返回ParamListInfo--> ExecPrepareExprList--> ExecPrepareExpr--> expression_planner--> eval_const_expressions--> ExecInitExpr--> makeParamList  获取到参数值4,2
--> CreateNewPortal--> CreatePortal
--> GetCachedPlan--> RevalidateCachedQuery--> choose_custom_plan  // choose whether to use custom or generic plan--> if (!customplan) // 走generic plan--> if (CheckCachedPlan)// 直接获取已有的有效generic planelse--> BuildCachedPlan--> pg_plan_queries--> pg_plan_query--> planner--> standard_planner--> subquery_planner--> preprocess_expression   // 复合常量化简,直接调用函数--> eval_const_expressions--> simplify_function  --> evaluate_function--> evaluate_expr--> cached_plan_cost--> if (customplan)  // 走custom plan--> BuildCachedPlan--> pg_plan_queries--> pg_plan_query--> planner--> standard_planner--> subquery_planner--> preprocess_qual_conditions--> eval_const_expressions--> create_plan--> PortalDefineQuery
--> PortalStart--> ExecutorStart--> InitPlan
--> PortalRun--> ExecutorRun--> standard_ExecutorRun--> ExecutePlan--> PortalDrop--> ExecutorEnd--> standard_ExecutorEnd--> ExecEndPlan--> PortalReleaseCachedPlan  /* drop cached plan reference, if any */

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

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

相关文章

奔驰EQS SUV升级增强现实AR抬头显示HUD香氛系统

增强AR实景抬头显示HUD&#xff08;Augmented Reality Head-Up Display&#xff09;是一种更高级的驾驶辅助技术&#xff0c;相比于普通抬头显示HUD&#xff0c;它提供了更丰富、更具沉浸感的驾驶体验。以下是它比普通抬头显示HUD多的一些功能&#xff1a; • 信息呈现方式&am…

RFID期末复习 | 防碰撞算法 | 信源编码 | 差错控制 | 系统调制 | S50卡 | 无源标签 | 工作频率 | 自动识别

防碰撞算法 ALOHA算法 ALOHA算法是一种随机接入方法&#xff0c;其基本思想是采取标签先发言的方式&#xff0c;当标签进入读写器的识别区域内时就自动向读写器发送其自身的ID号&#xff0c;在标签发送数据的过程中&#xff0c;若有其他标签也在发送数据&#xff0c;将会发生…

【K8s】专题五(4):Kubernetes 配置之 ConfigMap 与 Secret 使用

以下内容均来自个人笔记并重新梳理&#xff0c;如有错误欢迎指正&#xff01;如果对您有帮助&#xff0c;烦请点赞、关注、转发&#xff01;欢迎扫码关注个人公众号&#xff01; 目录 一、ConfigMap 使用方式 1、注入环境变量 2、挂载配置文件 二、Secret 使用方式 1、注入…

03- jQuery事件处理和动画效果

1. jQuery的事件处理 1.1 绑定事件处理函数 on() 将一个或多个事件的处理方法绑定到被选择的元素上。on()方法适用于当前或未来的元素&#xff0c;如用脚本创建的新元素。 $(selector).on(event,childSelector,data,function) 参数描述event必需。规定要从被选元素添加的一…

计算机毕业设计Python+Flask弹幕情感分析 B站视频数据可视化 B站爬虫 机器学习 深度学习 人工智能 NLP文本分类 数据可视化 大数据毕业设计

首先安装需要的python库&#xff0c; 安装完之后利用navicat导入数据库文件bili100.sql到mysql中&#xff0c; 再在pycharm编译器中连接mysql数据库&#xff0c;并在设置文件中将密码修改成你的数据库密码。最后运行app.py&#xff0c;打开链接&#xff0c;即可运行。 B站爬虫数…

大学物理实验分析

终于整理完了 测量误差分类 天平未校准引起的误差 天平设计、制造、使用或环境因素引起偏差属于系统误差应定期校准天平 游标卡尺测量物体长度 读取主尺整毫米数读取副尺小数部分相加得出测量结果记录测量结果时保留适当小数位数可通过多次测量取平均值提高精确度注明单位…

防泄密解决方案

防泄密解决方案是一个系统性的策略&#xff0c;旨在保护敏感信息不被非法获取、泄露或滥用。以下是一个结构清晰、分点表示的防泄密解决方案&#xff0c;结合了参考文章中的关键信息和建议&#xff1a; 一、策略制定与政策明确 明确数据分类&#xff1a;将数据分为公开、内部…

私有化地图离线部署方案之基础地图服务

私有化地图离线部署整体解决方案&#xff0c;除硬件之外&#xff0c;一般主要由基础地图服务、地理逆编码服务、离线路径规划服务和海拔高程检索服务构成。 现在先为你分享基础地图服务&#xff0c;它是私有化地图离线部署的基础。 基础地图服务 基础地图服务是私有化离线部…

升级gradle8.x无法编译aar上传maven without declaring an explit or implicit dependency

修改好的代码maven-publish.gradle文件&#xff1a; apply plugin: maven-publish //上一层目录创建local.properties&#xff0c;里面放 //usernamexxxx //passwordxxxx//上一层目录创建或者已有gradle.properties&#xff0c;里面添加 //myGroup.idcom.xxx.android //mave…

06文件和文件夹的操作

授课进程 一、文件操作 在操作的时候尽量选择Linux下面的/opt目录 使用ls -l 命令&#xff0c;相对简化的命令ll 在Linux中&#xff0c;ls -l是一个常用的命令&#xff0c;用于列出文件和目录的详细信息。下面是ls -l命令的一些常见选项和输出示例&#xff1a; ​ - 使用ls -…

SQL Server入门-SSMS简单使用(2008R2版)-2

环境&#xff1a; win10&#xff0c;SQL Server 2008 R2 参考&#xff1a; SQL Server 管理套件&#xff08;SSMS&#xff09;_w3cschool https://www.w3cschool.cn/sqlserver/sqlserver-oe8928ks.html SQL Server存储过程_w3cschool https://www.w3cschool.cn/sqlserver/sql…

2025年计算机毕业设计题目参考-简单容易

2025年最新计算机毕业设计题目参考-第二批 以下可以参考 企业员工薪酬关系系统的设计 基于SpringBoot在线远程考试系统 SpringBootVue的乡政府管理系统 springboot青年公寓服务平台 springboot大学生就业需求分析系统 基于Spring Boot的疗养院管理系统 基于SpringBoot的房屋交…

vue3实现div盒子的内容hover上去时样式改变及部分元素的显隐

样式&#xff1a; hover后的样式&#xff1a; 整体盒子的背景颜色发生了改变&#xff0c;盒子内边距发生了改变&#xff0c;右下侧的箭头出现 实现方式&#xff1a; 利用mouseover和mouseout并结合css样式实现 template中&#xff1a; <divclass"new-item"v-f…

动手学深度学习(Pytorch版)代码实践 -深度学习基础-13Kaggle竞赛:2020加州房价预测

13Kaggle竞赛&#xff1a;2020加州房价预测 # 导入所需的库 import numpy as np import pandas as pd import torch import hashlib import os import tarfile import zipfile import requests from torch import nn from d2l import torch as d2l# 读取训练和测试数据 train_…

电脑数据恢复,掌握4个方法,恢复数据很简单!

在数字化浪潮席卷全球的今天&#xff0c;电脑数据已成为我们生活与工作中不可或缺的一部分。然而&#xff0c;当这些数据因各种原因意外丢失或损坏时&#xff0c;那种失落与无助的感觉常常令人倍感焦虑。 想象一下&#xff0c;你正在为一项重要项目加班加点&#xff0c;突然电…

家用洗地机哪个牌子的质量最好最耐用?四款出色机型推荐

在清洁家电市场迅猛发展的今天&#xff0c;洗地机深度清洁效果和高效便捷性&#xff0c;成为家庭地面清洁的首选。然而&#xff0c;随着洗地机的普及&#xff0c;各大家电品牌纷纷推出洗地机产品&#xff0c;竞争日益激烈。那么&#xff0c;如何在众多洗地机中&#xff0c;挑选…

30. 光纤耦合器

导论&#xff1a; 物理光学传播&#xff08;POP&#xff09;可用于计算光纤耦合效率。 设计流程&#xff1a; 光束建模和聚焦 在系统选项中选择系统孔径&#xff0c;在系统孔径下选择“入瞳直径”&#xff0c;并输入“4”。 设置0视场&#xff0c;选择角度。 加入1um波长。…

【vue】form表单提交validate验证不进valid原因

目录 1. 原因 1. 原因 1.<el-form>是否写了ref“form”。2.是否有其它标签写了ref“form”。3.<el-form>中要写成:model&#xff0c;不能使用v-model。4.自定义的validate要各个路径均能返回callback()。 const validatePass (rule, value, callback) > {if (…

基于JSP的房屋租赁系统

开头语&#xff1a; 你好&#xff0c;我是专注于计算机科学与技术研究的学长。如果你对房屋租赁系统感兴趣或有相关开发需求&#xff0c;欢迎联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSPJavaBeansServlet 工具&#xff1a;MyEclipse、…

Ubuntu 22.04 一键安装 Oracle 19C 单机

前言 Oracle 一键安装脚本&#xff0c;演示华为 Ubuntu 22.04 一键安装 Oracle 19C 单机版过程&#xff08;全程无需人工干预&#xff09;。 ⭐️ 脚本下载地址&#xff1a;Shell脚本安装Oracle数据库 安装准备 1、安装好操作系统&#xff0c;建议安装图形化2、配置好网络3、…