postgresql 源码 insert 返回字段说明

--当我们插入一条数据到数据库时,pg会返回给我们如下信息,
postgres=# insert into test_2(id) select n from generate_series(1,10000) n;
INSERT 0 10000
--第一列说明是插入动作,第三列表示插入了多少行,那么第二列是什么呐

--查看源码,可知
ProcessQuery(PlannedStmt *plan,
			 const char *sourceText,
			 ParamListInfo params,
			 DestReceiver *dest,
			 char *completionTag)
{
	if (completionTag)
	{
		Oid			lastOid;

		switch (queryDesc->operation)
		{
			case CMD_SELECT:
				snprintf(completionTag, COMPLETION_TAG_BUFSIZE,
						 "SELECT %u", queryDesc->estate->es_processed);
				break;
			case CMD_INSERT:  --如果执行的命令是 insert
				if (queryDesc->estate->es_processed == 1) --如果插入了一行
					lastOid = queryDesc->estate->es_lastoid; --插入表的 OID
				else
					lastOid = InvalidOid; --插入的行数超过一行,则返回系统默认OID=0
				snprintf(completionTag, COMPLETION_TAG_BUFSIZE,
				   "INSERT %u %u", lastOid, queryDesc->estate->es_processed); --实际打印的输出
				break;
			case CMD_UPDATE:
				snprintf(completionTag, COMPLETION_TAG_BUFSIZE,
						 "UPDATE %u", queryDesc->estate->es_processed);
				break;
			case CMD_DELETE:
				snprintf(completionTag, COMPLETION_TAG_BUFSIZE,
						 "DELETE %u", queryDesc->estate->es_processed);
				break;
			default:
				strcpy(completionTag, "???");
				break;
		}
	}

}

--由以上可知 pg插入返回的第二列是一个oid
--只有在表具有oid属性,且插入行数为一行时,第二列才实际被填充

postgres=# create table t1(id int) with (oids=true);
CREATE TABLE
postgres=# \d+ t1;
                          Table "public.t1"
 Column |  Type   | Modifiers | Storage | Stats target | Description
--------+---------+-----------+---------+--------------+-------------
 id     | integer |           | plain   |              |
Has OIDs: yes

--oid列被填充
postgres=# insert into t1 values(1);
INSERT 33125 1
--超过一行,oid列被填充为0
postgres=# insert into t1 values(1),(2);
INSERT 0 2	
时间: 2024-12-23 13:03:23

postgresql 源码 insert 返回字段说明的相关文章

如何从PostgreSQL源码分析哪些操作需要超级用户权限 - 阿里云rds superuser提供了哪些权限

标签 PostgreSQL , 超级用户 , superuser 背景 在数据库中哪些操作需要超级用户的权限才能执行? 这个问题翻文档可能翻不全面,或者是已经比较难以完成的任务. 但是从源码里面是比较好找出这个答案的. 权限 例如 postgres=# select * from pg_authid; rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rol

PostgreSQL 源码性能诊断(perf profiling)指南

标签 PostgreSQL , Linux , perf , 性能诊断 , stap , systemtap , strace , dtrace , dwarf , profiler , perf_events , probe , dynamic probe , tracepoint 背景 数据库的性能优化是一个非常经典的话题,数据库的优化手段以及优化的角度也各不相同. 例如,可以从OS内核.网络.块设备.编译器.文件系统.SQL.数据库参数.业务逻辑.源码等各个方面去进行优化. 但是如果在优化

PostgreSQL源码分析 备库查询冲突 - User was holding shared buffer pin for too long

背景 PostgreSQL 的基于流复制的物理备库是基于redo的物理块复制备库,允许开放只读的功能,但是需要注意,由于主库可能不断的产生redo,这些redo可能会与备库的QUERY产生冲突. 什么情况下query会堵塞.或与恢复冲突? 当以下操作产生的REDO被复制到备库,并且备库准备拿这些REDO来恢复时. Access Exclusive locks taken on the primary server, including both explicit LOCK commands an

postgresql 源码客户端认证

--在使用pg中登陆数据库是第一步,其代码结构如下: --原始代码在如下文件中 src/backend/libpq/auth.c --其入口函数为ClientAuthentication,其接受一个Port结构体 void ClientAuthentication(Port *port) { --通过此函数解析客户的ip类型,确定其使用的是什么样的方式进行认证,比如能过local还是ip,是md5还是trust认证等 -- hba_getauthmethod 会调用函数 check_hba()

Laravel学习笔记之Middleware源码解析

说明:本文主要学习Laravel的Middleware的源码设计思想,并将学习心得分享出来,希望对别人有所帮助.Laravel学习笔记之Decorator Pattern已经聊过Laravel使用了Decorator Pattern来设计Middleware,看Laravel源码发现其巧妙用了Closure和PHP的一些数组函数来设计Middleware. 开发环境:Laravel5.3 + PHP7 + OS X 10.11 PHP内置函数array_reverse.array_reduce.

utf-8-WinHttpRequst获取网页源码乱码

问题描述 WinHttpRequst获取网页源码乱码 返回的网页编码是utf-8的,我这样转显示乱码,应该怎么做 CString strRetData; _variant_t varRspBody = pHttpReq->GetResponseBody(); char *pContentBuffer = (char *)varRspBody.parray->pvData; strRetData = pContentBuffer; 解决方案 获取网页源码c# 获取网页源码C#获取网页源码 解决方

PostgreSQL 9.6 快照过旧 - 源码浅析

PostgreSQL 9.6 快照过旧 - 源码浅析 作者 digoal 日期 2016-10-05 标签 PostgreSQL , 9.6 , 快照过旧 , snapshot too old 背景 在PostgreSQL 9.6以前,垃圾回收存在的问题. 当vacuum回收垃圾时,遇到垃圾记录的xmax大于数据库中现存的最早未提交事务xmin时,不会对其进行回收. 因此当数据库中存在很久为结束的事务时,可能会导致数据库膨胀. PostgreSQL 9.6加入了快照过旧的功能,目的是防止过长的事

PostgreSQL 统计信息混淆之处(scan,read,fetch,hit)源码解读

PostgreSQL 几个统计信息的解释难以理解,所以本文花一些时间从源码的角度来解释一下.让大家对这几个容易误解的统计值有更好的理解. 比较难理解的几个统计值为:pg_stat_all_indexes 的 idx_scan idx_tup_read idx_tup_fetch pg_statio_all_indexes 的 idx_blks_read idx_blks_hit pg_stat_all_tables 的 seq_scan seq_tup_read idx_scan idx_tup

PostgreSQL 从源码找出哪些操作需要超级用户权限 - 阿里云rds_superuser和superuser有什么区别

标签 PostgreSQL , 超级用户 , superuser 背景 在数据库中哪些操作需要超级用户的权限才能执行? 这个问题翻文档可能翻不全面,或者是已经比较难以完成的任务. 但是从源码里面是比较好找出这个答案的. 权限 例如 postgres=# select * from pg_authid; rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rol