Postgresql源码(138)alter table增加列的执行流程分析

news2024/11/15 18:34:40

alter table 逻辑比较繁琐,但并不复杂,这里以增加列为例简单梳理流程。

测试用例

drop table t_echo;
create table t_echo(a int,b int);
insert into t_echo select t.i, t.i*10 from generate_series(1,10) t(i);
alter table t_echo add c varchar(32) default pg_backend_pid();

postgres=# select * from t_echo;
 a  |  b  |   c
----+-----+-------
  1 |  10 | 13425
  2 |  20 | 13425
  3 |  30 | 13425
  4 |  40 | 13425
  5 |  50 | 13425
  6 |  60 | 13425
  7 |  70 | 13425
  8 |  80 | 13425
  9 |  90 | 13425
 10 | 100 | 13425
(10 rows)

alter table流程分析

alter table t_echo add c varchar(32) default pg_backend_pid();

1 analyze_and_rewrite阶段

parse_analyze_fixedparams

transform阶段对语句没有太多处理。使用Parse树直接返回。
在这里插入图片描述
在transformStmt中,使用switch (nodeTag(parseTree))来决定对一些需要处理的parseTree进行语义分析:

switch (nodeTag(parseTree))
	case T_InsertStmt:
			result = transformInsertStmt(pstate, (InsertStmt *) parseTree);
			break;

		case T_DeleteStmt:
			result = transformDeleteStmt(pstate, (DeleteStmt *) parseTree);
			break;

		...
		...

这里比较好扩展,如果想自己对alter语句进行处理:在switch中截获需要的类型,写个类似上面的函数进行处理即可。

alter table t_echo add c varchar(32) default pg_backend_pid();
输出Query树:
在这里插入图片描述

pg_rewrite_query

rewrite阶段对ddl也没有什么特殊处理:
在这里插入图片描述

2 plan阶段

优化器对DDL也不做特殊处理。
在这里插入图片描述

3 执行阶段

3.1 DDL走哪个分支处理?

ProcessUtilitySlow
	Node	   *parsetree = pstmt->utilityStmt;
	switch (nodeTag(parsetree))
		case T_AlterTableStmt:
			...
			AlterTable
			...

3.2 处理流程

#0  pg_backend_pid (fcinfo=0x3249ea0) at pgstatfuncs.c:663
#1  0x0000000000748fea in ExecInterpExpr (state=0x3249ce0, econtext=0x324a460, isnull=0x7ffffe4d9f07) at execExprInterp.c:746
#2  0x000000000074b332 in ExecInterpExprStillValid (state=0x3249ce0, econtext=0x324a460, isNull=0x7ffffe4d9f07) at execExprInterp.c:2033
#3  0x00000000005e6ab7 in ExecEvalExpr (state=0x3249ce0, econtext=0x324a460, isNull=0x7ffffe4d9f07) at ../../../src/include/executor/executor.h:348
#4  0x00000000005e6e3a in StoreAttrDefault (rel=0x7fc0d9c1e6a8, attnum=3, expr=0x325b718, is_internal=false, add_column_mode=true) at pg_attrdef.c:131
#5  0x00000000005c5270 in AddRelationNewConstraints (rel=0x7fc0d9c1e6a8, newColDefaults=0x325b208, newConstraints=0x0, allow_merge=false, is_local=true, is_internal=false, queryString=0x0) at heap.c:2337
#6  0x00000000006f4e32 in ATExecAddColumn (wqueue=0x7ffffe4da448, tab=0x3237e80, rel=0x7fc0d9c1e6a8, cmd=0x7ffffe4da328, recurse=true, recursing=false, lockmode=8, cur_pass=AT_PASS_ADD_COL, context=0x7ffffe4da5e0) at tablecmds.c:7174
#7  0x00000000006f09bc in ATExecCmd (wqueue=0x7ffffe4da448, tab=0x3237e80, cmd=0x32468b8, lockmode=8, cur_pass=AT_PASS_ADD_COL, context=0x7ffffe4da5e0) at tablecmds.c:5182
#8  0x00000000006f075a in ATRewriteCatalogs (wqueue=0x7ffffe4da448, lockmode=8, context=0x7ffffe4da5e0) at tablecmds.c:5129
#9  0x00000000006efafe in ATController (parsetree=0x313d2d8, rel=0x7fc0d9c1e6a8, cmds=0x313d288, recurse=true, lockmode=8, context=0x7ffffe4da5e0) at tablecmds.c:4722
#10 0x00000000006ef752 in AlterTable (stmt=0x313d2d8, lockmode=8, context=0x7ffffe4da5e0) at tablecmds.c:4368
#11 0x00000000009f7816 in ProcessUtilitySlow (pstate=0x3237d70, pstmt=0x313d388, queryString=0x313c360 "alter table t_echo add c varchar(32) default pg_backend_pid();", context=PROCESS_UTILITY_TOPLEVEL, params=0x0, queryEnv=0x0, dest=0x313d748, qc=0x7ffffe4dac10) at utility.c:1318
#12 0x00000000009f71ed in standard_ProcessUtility (pstmt=0x313d388, queryString=0x313c360 "alter table t_echo add c varchar(32) default pg_backend_pid();", readOnlyTree=false, context=PROCESS_UTILITY_TOPLEVEL, params=0x0, queryEnv=0x0, dest=0x313d748, qc=0x7ffffe4dac10) at utility.c:1067
#13 0x00000000009f6389 in ProcessUtility (pstmt=0x313d388, queryString=0x313c360 "alter table t_echo add c varchar(32) default pg_backend_pid();", readOnlyTree=false, context=PROCESS_UTILITY_TOPLEVEL, params=0x0, queryEnv=0x0, dest=0x313d748, qc=0x7ffffe4dac10) at utility.c:523
#14 0x00000000009f4fab in PortalRunUtility (portal=0x31e4ca0, pstmt=0x313d388, isTopLevel=true, setHoldSnapshot=false, dest=0x313d748, qc=0x7ffffe4dac10) at pquery.c:1158
#15 0x00000000009f5200 in PortalRunMulti (portal=0x31e4ca0, isTopLevel=true, setHoldSnapshot=false, dest=0x313d748, altdest=0x313d748, qc=0x7ffffe4dac10) at pquery.c:1316
#16 0x00000000009f4731 in PortalRun (portal=0x31e4ca0, count=9223372036854775807, isTopLevel=true, run_once=true, dest=0x313d748, altdest=0x313d748, qc=0x7ffffe4dac10) at pquery.c:791
#17 0x00000000009edfba in exec_simple_query (query_string=0x313c360 "alter table t_echo add c varchar(32) default pg_backend_pid();") at postgres.c:1284
#18 0x00000000009f288e in PostgresMain (dbname=0x3174b70 "postgres", username=0x3174b58 "mingjie") at postgres.c:4766
#19 0x00000000009ea38d in BackendMain (startup_data=0x7ffffe4daf10 "", startup_data_len=4) at backend_startup.c:107
#20 0x000000000091675c in postmaster_child_launch (child_type=B_BACKEND, startup_data=0x7ffffe4daf10 "", startup_data_len=4, client_sock=0x7ffffe4daf40) at launch_backend.c:274
#21 0x000000000091bca8 in BackendStartup (client_sock=0x7ffffe4daf40) at postmaster.c:3414
#22 0x0000000000919607 in ServerLoop () at postmaster.c:1648
#23 0x0000000000918fd5 in PostmasterMain (argc=1, argv=0x3136e70) at postmaster.c:1346
#24 0x00000000007d9efd in main (argc=1, argv=0x3136e70) at main.c:197

AlterTable执行:

AlterTable
	ATController
		/* Phase 1: preliminary examination of commands, create work queue */
		foreach
			ATPrepCmd
		/* Phase 2: update system catalogs */
		ATRewriteCatalogs
		/* Phase 3: scan/rewrite tables as needed, and run afterStmts */
		ATRewriteTables

处理分为三个阶段:

  1. 预检查:主要是权限检查,会递归到每一层函数。
  2. 改表结构:ATExecCmd函数中的大switch控制具体执行的指令,例如add column、column default等等。
    • 例如本文开头提供的用例:alter table t_echo add c varchar(32) default pg_backend_pid();
    • ATExecCmd
      • ATExecAddColumn:增加列
        • AddRelationNewConstraints
          • StoreAttrDefault:设置列默认值
            • ExecEvalExpr:计算列默认值表达式
                • ExecInterpExpr
                  • pg_backend_pid
  3. 收尾工作:比如修改某些数据类型了要检查依赖、修改约束了要检查约束等等。

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

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

相关文章

MobaXterm 软件及如何设置取消自动断开连接

MobaXterm 软件及如何设置取消自动断开连接 背景软件资料取消自动断开连接找打设置找到SSH Setting 背景 其实很容易找到类似的资料, 主要为了简单的记录一下, 还是写一下这个博客吧, 也算是自己的输出了. 当练习打字也行吧, 反正自己打字也是一坨, 打字太慢了. 软件资料 官…

【代码审计】常见漏洞专项审计-业务逻辑漏洞审计

❤️博客主页: iknow181 🔥系列专栏: 网络安全、 Python、JavaSE、JavaWeb、CCNP 🎉欢迎大家点赞👍收藏⭐评论✍ 0x01 漏洞介绍 1、 原理 业务逻辑漏洞是一类特殊的安全漏洞,业务逻辑漏洞属于设计漏洞而非实…

YOLOv11实战垃圾分类

本文采用YOLOv11作为核心算法框架,结合PyQt5构建用户界面,使用Python3进行开发。YOLOv11以其高效的特征提取能力,在多个图像分类任务中展现出卓越性能。本研究针对4种垃圾数据集进行训练和优化,该数据集包含丰富的垃圾图像样本&am…

Kafka集群中数据的存储是按照什么方式存储的?

1)Topic 数据的存储机制 Topic是逻辑上的概念,而partition是物理上的概念,每个partition对应于一个log文件,该log文件中存储的就是Producer生产的数据。Producer生产的数据会被不断追加到该log文件末端,为防止log文件…

渗透测试靶场 - vulhub -CVE漏洞 Weblogic 任意文件上传漏洞(CVE-2018-2894) 漏洞讲解 漏洞复现 亲测步骤能通过哟

漏洞说明 Weblogic管理端未授权的两个页面存在任意上传jsp文件漏洞,可直接获取服务器权限。 两个页面 /ws_utc/begin.do /ws_utc/config.do Oracle 在2018年7月更新中,修复了Weblogic Web Service Test Page中一处任意文件上传漏洞, Web Se…

使用 PyTorch 实现 AlexNet 进行 MNIST 图像分类

AlexNet 是一种经典的深度学习模型,它在 2012 年的 ImageNet 图像分类比赛中大放异彩,彻底改变了计算机视觉领域的格局。AlexNet 的核心创新包括使用深度卷积神经网络(CNN)来处理图像,并采用了多个先进的技术如 ReLU 激…

基于图的去中心化社会推荐过滤器

🏡作者主页:点击! 🤖编程探索专栏:点击! ⏰️创作时间:2024年11月11日19点20分 点击开启你的论文编程之旅https://www.aspiringcode.com/content?id17176636216843&uideba758a1550b46bb…

深度学习模型评价指标介绍

模型评价指标 模型评价指标1.混淆矩阵2.Overall Accuracy3.Average accuracy4.Kappa系数5.Recall6.Precision7.F18.PR曲线9.置信度10.IOU11.AP12.mAP 模型评价指标 在我们学习机器学习以及深度学习,甚至在计算机视觉领域,我们不可避免的要利用一些指标评…

k8s 1.28.2 集群部署 docker registry 接入 MinIO 存储

文章目录 [toc]docker registry 部署生成 htpasswd 文件生成 secret 文件 生成 registry 配置文件创建 service创建 statefulset创建 ingress验证 docker registry docker registry 监控docker registry ui docker registry dockerfile docker registry 配置文件 S3 storage dr…

【自用】0-1背包问题与完全背包问题的Java实现

引言 背包问题是计算机科学领域的一个经典优化问题,分为多种类型,其中最常见的是0-1背包问题和完全背包问题。这两种问题的核心在于如何在有限的空间内最大化收益,但它们之间存在一些关键的区别:0-1背包问题允许每个物品只能选择…

Zookeeper的安装与使用

一、简介 1.1、概念 ZooKeeper 是一个开源的分布式协调服务,主要用于解决分布式系统中的数据一致性问题。它提供了一种可靠的机制来管理和协调分布式系统的各个节点。ZooKeeper 的设计目标是简化分布式应用的开发,提供简单易用的接口和高性能、高稳定性…

【模块一】kubernetes容器编排进阶实战之etcd的介绍与使用

etcd进阶 etcd简介:  etcd是CoreOS团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库。etcd内部采用raft协议作为一致性算法,etcd基于Go语言实现。 官方网站:https://etcd.io/  gith…

【机器学习】如何配置anaconda环境(无脑版)

马上就要上机器学习的实验,这里想写一下我配置机器学习的anaconda环境的二三事 一、首先,下载安装包: Download Now | Anaconda 二、打开安装包,一直点NEXT进行安装 这里要记住你要下载安装的路径在哪,后续配置环境…

矩阵中的路径(dfs)-acwing

题目 23. 矩阵中的路径 - AcWing题库 代码 class Solution { public://以每一个坐标作为dfs起点bool hasPath(vector<vector<char>>& matrix, string str) {for (int i 0; i < matrix.size(); i )for (int j 0; j < matrix[i].size(); j )if (dfs(…

WEB攻防-通用漏洞SQL注入sqlmapOracleMongodbDB2等

SQL注入课程体系&#xff1a; 1、数据库注入-access mysql mssql oracle mongodb postgresql 2、数据类型注入-数字型 字符型 搜索型 加密型&#xff08;base64 json等&#xff09; 3、提交方式注入-get post cookie http头等 4、查询方式注入-查询 增加 删除 更新 堆叠等 …

android studio 更改gradle版本方法(备忘)

如果出现类似以下&#xff1a; Your build is currently configured to use Java 17.0.11 and Gradle 6.1.1. 或者类似&#xff1a; Failed to calculate the value of task ‘:app:compileDebugJavaWithJavac‘ property ‘options.generatedSo 消息时需要修改gradle版本&…

设计模式之装饰器模式(SSO单点登录功能扩展,增加拦截用户访问方法范围场景)

前言&#xff1a; 两个本想描述一样的意思的词&#xff0c;只因一字只差就让人觉得一个是好牛&#xff0c;一个好搞笑。往往我们去开发编程写代码时也经常将一些不恰当的用法用于业务需求实现中&#xff0c;但却不能意识到。一方面是由于编码不多缺少较大型项目的实践&#xff…

日志:中文 URI 参数乱码之 encodeURI、encodeURIComponent、escape 作为 Ajax 中文参数编码给 ASP 的记录

前面提到的了 ASP 输出 UTF-8 编码的中文不定时出现乱码的解决方案&#xff1a;ASP页面改为UTF-8编码后&#xff0c;刷新页面中文输入输出不定时乱码终极解决方案 今天遇到的则是输入 UTF-8 编码中文 URI 参数乱码的问题&#xff0c;第一次可以&#xff0c;刷新后取得的输入参…

Intern大模型训练营(八):Llamaindex RAG 实践

1. 基于 LlamaIndex 构建自己的 RAG 知识库 首先在Intern Studio中申请30% A100的开发机。 进入开发机后&#xff0c;创建新的conda环境&#xff0c;命名为 llamaindex&#xff0c;在命令行模式下运行&#xff1a; conda create -n llamaindex python3.10 复制完成后&#…

leetcode104:二叉树的最大深度

给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3示例 2&#xff1a; 输入&#xff1a;root [1,null,2] 输出…