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 */
相关文章:
PostgreSQL源码分析——绑定变量
这里分析一下函数中应用绑定变量的问题,但实际应用场景中,不推荐这么使用。 prepare divplan2(int,int) as select div($1,$2); execute divplan2(4,2);语法解析 分别分析prepare语句以及execute语句。 gram.y中定义 /******************************…...
Zynq学习笔记--了解中断配置方式
目录 1. 简介 2. 工程与代码解析 2.1 Vivado 工程 2.2 Vitis 裸机代码 2.3 关键代码解析 3. 总结 1. 简介 Zynq 中的中断可以分为以下几种类型: 软件中断(Software Generated Interrupt, SGI):由软件触发,通常…...
吴恩达机器学习 第二课 week2 多分类问题
目录 01 学习目标 02 实现工具 03 概念与原理 04 应用示例 05 总结 01 学习目标 (1)理解二分类与多分类的原理区别 (2)掌握简单多分类问题的神经网络实现方法 (3)理解多分类问题算法中的激活函数与损失…...
112、路径总和
给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。 叶子节点 是指没有子节点…...
Vue 封装组件之Input框
封装Input组件:MyInput.vue <template><div class"base-input-wraper"><el-inputv-bind"$attrs"v-on"$listeners"class"e-input":style"inputStyle":value"value":size"size"input&quo…...
一段代码让你了解Java中的抽象
我们先来看一道题! 计算几何对象的面积之和)编写一个方法,该方法用于计算数组中所有几何对象的面积之和。该方法的签名是: public static double sumArea(GeometricObject[] a) 编写一个测试程序,该程序创建一个包含四…...
Sping源码(九)—— Bean的初始化(非懒加载)— Bean的创建方式(factoryMethod)
序言 前面文章介绍了在Spring中多种创建Bean实例的方式,包括采用FactoryBean的方式创建对象、使用反射创建对象、自定义BeanFactoryPostProcessor。 这篇文章继续介绍Spring中创建Bean的形式之一——factoryMethod。方法用的不多,感兴趣可以当扩展了解。…...
绝对全网首发,利用Disruptor EventHandler实现在多线程下顺序执行任务
disruptor有两种任务处理器,一个是EventHandler ,另一个是WorkHandler. EventHandler可以彼此独立消费同一个队列中的任务,WorkHandler可以共同竞争消费同一个队列中的任务。也就是说,假设任务队列中有a、b、c、d三个事件,eventHa…...
单例设计模式双重检查的作用
先看双重校验锁的写法 public class Singleton {/*volatile 修饰,singleton new Singleton() 可以拆解为3步:1、分配对象内存(给singleton分配内存)2、调用构造器方法,执行初始化(调用 Singleton 的构造函数来初始化成员变量&am…...
NGINX_十二 nginx 地址重写 rewrite
十二 nginx 地址重写 rewrite 1 什么是Rewrite Rewrite对称URL Rewrite,即URL重写,就是把传入Web的请求重定向到其他URL的过程。URL Rewrite最常见的应用是URL伪静态化,是将动态页面显示为静态页面方式的一种技术。比如 http://www.123.com…...
react用ECharts实现组织架构图
找到ECharts中路径图。 然后开始爆改。 <div id{org- name} style{{ width: 100%, height: 650, display: flex, justifyContent: center }}></div> // data的数据格式 interface ChartData {name: string;value: number;children: ChartData[]; } const treeDep…...
坚持刷题|合并有序链表
文章目录 题目思考代码实现迭代递归 扩展实现k个有序链表合并方法一方法二 PriorityQueue基本操作Java示例注意事项 Hello,大家好,我是阿月。坚持刷题,老年痴呆追不上我,消失了一段时间,我又回来刷题啦,今天…...
SPI协议——对外部SPI Flash操作
目录 1. W25Q32JVSSIQ背景知识 1.1 64个可擦除块 1.2 1024个扇区(每个块有16个扇区) 1.3 页 1. W25Q32JVSSIQ背景知识 W25Q32JV阵列被组织成16,384个可编程页,每页有256字节。一次最多可以编程256个字节。页面可分为16组(4KB扇区清除&…...
kotlin类型检测与类型转换
一、is与!is操作符 1、使用 is 操作符或其否定形式 !is 在运行时检测对象是否符合给定类型。 fun main() {var a "1"if(a is String) {println("a是字符串类型:${a.length}")}// 或val b a is Stringprintln(b) } 二、"不安全的"转换操作符…...
【JDBC】Oracle数据库连接问题记录
Failed to load driver class oracle.jdbc.driver.OracleDriver in either of HikariConfig class oracle驱动包未正确加载,可以先尝试使用下面方式加载检查类是否存在,如果不存在需要手动下载odbc包 try {Class.forName("oracle.jdbc.driver.Ora…...
leetcode45 跳跃游戏II
题目 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返回到达 nums[n - 1]…...
【数学】什么是方法矩估计?和最大似然估计是什么关系?
背景 方法矩估计(Method of Moments Estimation)和最大似然估计(Maximum Likelihood Estimation, MLE)是两种常用的参数估计方法。方法矩估计基于样本矩与总体矩的关系,通过样本数据计算样本矩来估计总体参数。最大似…...
C++初学者指南第一步---10.内存(基础)
C初学者指南第一步—10.内存(基础) 文章目录 C初学者指南第一步---10.内存(基础)1.内存模型1.1 纸上谈兵:C的抽象内存模型1.2 实践:内存的实际处理 2. 自动存储3.动态存储:std::vector3.1 动态内…...
扩散模型详细推导过程——编码与解码
符号表 符号含义 x ( i ) z 0 ( i ) \boldsymbol{x}^{(i)}\boldsymbol{z}_0^{(i)} x(i)z0(i)第 i i i个训练数据,其为长度为 d d d的向量 z t ( i ) \boldsymbol{z}_t^{(i)} zt(i)第 i i i个训练数据在第 t t t时刻的加噪版本 ϵ t ( i ) \boldsymbol{\epsilo…...
js如何实现开屏弹窗
开屏弹窗是什么,其实就是第一次登录后进入页面给你的一种公告提示,此后再回到当前这个页面时弹窗是不会再出现的。也就是说这个弹窗只会出现一次。 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>…...
Jellyfin智能片头检测解决方案:Intro Skipper插件技术指南
Jellyfin智能片头检测解决方案:Intro Skipper插件技术指南 【免费下载链接】intro-skipper Fingerprint audio to automatically detect and skip intro sequences in Jellyfin 项目地址: https://gitcode.com/gh_mirrors/in/intro-skipper Intro Skipper是一…...
三阶段掌握罗技鼠标压枪宏:从新手到精准射击的完整指南
三阶段掌握罗技鼠标压枪宏:从新手到精准射击的完整指南 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 你是否在绝地求生中遇到过这样…...
GitHub 代码提交常见问题及解决指南
摘要本文聚焦 GitHub 代码提交流程,围绕本地文件上传、远程仓库关联、分支推送等核心操作,梳理常见报错(如可疑所有权、分支不匹配、协议不支持等),解析错误成因并提供分步解决方法,覆盖 Git 命令执行、仓库…...
综述篇 | 2015-2024,情绪识别(Emotion Recognition)技术演进与核心论文全景解读
1. 情绪识别技术演进全景图(2015-2024) 十年前,当研究人员试图通过摄像头分析人脸肌肉变化来判断情绪时,准确率还停留在60%左右。如今,结合多模态数据的情绪识别系统在特定场景下已突破90%准确率。这九年间的技术跃迁可…...
【其他】Obsidian笔记Remotely Save插件中国科技云数据胶囊 配置免费的笔记同步
目录 一 注册中国科技云数据胶囊 二 插件下载 & 配置 三 同步测试 一 注册中国科技云数据胶囊 【1】搜索“中国科技云”,找到“数据胶囊”选项,实名注册可以领取20G的容量: 【2】选择“新数据空间”,输入库的标题…...
Midjourney Basic计划真实体验:7天高强度测试+37组对比图,揭示隐藏限制与生产力断层
更多请点击: https://intelliparadigm.com 第一章:Midjourney Basic计划真实体验:7天高强度测试37组对比图,揭示隐藏限制与生产力断层 过去一周,我以全职创作者身份深度使用 Midjourney Basic 计划($10/月…...
基于SpringBoot的企业客户管理系统(附源码)
项目编号050 项目获取:合集 想学习Java开发却找不到合适的项目练手?这套基于Spring Boot的企业客户管理系统就是你的最佳选择!代码简单清晰,功能实用完整,非常适合初学者学习和二次开发。 这是什么项目? …...
从一次失败的模型交付说起:我是如何用random_state拯救项目复现的
从一次失败的模型交付说起:我是如何用random_state拯救项目复现的 那是一个周五的下午,团队群里的消息突然炸开了锅。"你确定这是同一个模型?测试集AUC从0.92跌到0.68了!"看着同事发来的对比截图,我的后背瞬…...
突破性能瓶颈:深入理解 JavaScript TypedArray
🚀 突破性能瓶颈:深入理解 JavaScript TypedArray 🤔 为什么普通 Array 不够用? 在 JavaScript 中,普通的 Array 是一个非常灵活但“沉重”的对象: 动态类型:它可以同时存放数字、字符串、对…...
从Concur到特斯拉:为什么伟大产品始于“丑陋”的1.0版本
1. 从一笔74亿美元的收购案说起:为什么别急着给1.0产品判死刑 前几天翻看一些旧资料,看到一篇2014年的行业评论,讲的是德国软件巨头SAP以74亿美元的天价,收购了一家名叫Concur的西雅图公司。当时很多人觉得不可思议,Co…...
