当前位置: 首页 > news >正文

openGauss之系统隐藏列

一. 前言

        openGauss在建表时,系统会自动插入tableoid,cmax,xmax,cmin,xmin,ctid 六个系统隐藏列,在select*的时候也会自动隐藏这6个系统隐藏列,如下所示:

       本文主要走读代码了解openGauss是如何实现系统隐藏列的功能的。

二.  create table时自动往表中插入系统隐藏列

​         create table时自动往表中插入系统隐藏列的核心代码入口在heap_create_with_catalog函数中,在往pg_attribute元数据表insert完普通的列后接着insert系统隐藏列的信息,代码流程如下所示:

heap_create_with_catalogAddNewAttributeTuplesfor (i = 0; i < natts; i++) {InsertPgAttributeTuple(rel, attr, indstate);  // 往PG_ATTRIBUTE系统表中插入表的普通字段}if (relkind != RELKIND_VIEW && relkind != RELKIND_COMPOSITE_TYPE && relkind != RELKIND_CONTQUERY) {for (i = 0; i < (int)lengthof(SysAtt); i++) {InsertPgAttributeTuple(rel, &attStruct, indstate);  往PG_ATTRIBUTE系统表中插入表的隐藏字段,也即xmin,xmax,cmin,cmax等字段,另外,系统隐藏列的AttributeNumber均为在代码中硬编码且均为小于0的负数,这也为区分是某一列是系统隐藏列还是普通列提供了区分的方式}}
三.  insert数据时自动往隐藏列insert数据

​      在insert数据的时候,系统的隐藏列的数据也要同时被insert进去,核心代码入口在heap_insert中,insert的场景主要是xmin的值比较重要。

heap_insertTransactionId xid = GetCurrentTransactionId();heaptup = heap_prepare_insert(relation, tup, cid, options);HeapTupleHeaderSetCmin(tup->t_data, cid);   // 设置cminHeapTupleSetXmax(tup, 0);  // 设置xmax值,其实insert场景xmax值一直都是0RelationPutHeapTuple(relation, buffer, heaptup, xid);tuple->t_data->t_choice.t_heap.t_xmin = NormalTransactionIdToShort(pd_xid_base, xid) // 设置xmin,xmin其实就是xid的值,但元组中存储的其实是将xid与xid的差值(HeapTupleHeader)item)->t_ctid = tuple->t_self;  // 保存t_ctid
四. select *的时候自动忽略隐藏列的数据

​       seelct * 的时候自动屏蔽系统隐藏列是扫描pg_attribute获取表的列信息时自动添加过滤条件attnum > 0实现的,主要的实现入口在relation_open中,代码流程如下所示:

relation_openRelationIdGetRelationRelationBuildDescRelationBuildTupleDescScanKeyInit(&skey[1], Anum_pg_attribute_attnum, BTGreaterStrategyNumber, F_INT2GT, Int16GetDatum(0));  // 只扫描attnum大于0的列,因为隐藏列的attnum都小于0但真正的物理表的列大于0,因此扫描表的列信息时自动将系统隐藏列忽略pg_attribute_scan = systable_beginscan(...skey...)while (HeapTupleIsValid(pg_attribute_tuple = systable_getnext(pg_attribute_scan))) {memcpy_s(&relation->rd_att->attrs[attp->attnum - 1]...attp...)  // 保存列信息到relation中}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Vue路由—进阶篇
  • Spring Boot + MyBatis-Plus 实现 MySQL 主从复制动态数据源切换
  • 鸿蒙HarmonyOS开发:如何使用第三方库,加速应用开发
  • MAML算法详解
  • Oracle RAC 集群启动顺序
  • C语言——位运算
  • linux系统使用 docker 来部署web环境 nginx+php7.4 并配置称 docker-compose-mysql.yml 文件
  • 【第一章概述—计算机中的数制】非十进制数到十进制数的转换,八进制转十进制,16进制转十进制。十进制转8进制,十进制转16进制
  • SSRF漏洞实现
  • Flask返回Json格式字符,中文导致unicode乱码问题
  • Unity URP Shader 修改深度让人物不再被地面遮挡
  • 数论之组合数
  • git cherry-pick 合并多个提交
  • Go 调用Rust函数
  • 浅谈线性表——链表
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • 【前端学习】-粗谈选择器
  • Angularjs之国际化
  • ES6核心特性
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • js算法-归并排序(merge_sort)
  • linux学习笔记
  • PaddlePaddle-GitHub的正确打开姿势
  • php ci框架整合银盛支付
  • SegmentFault 2015 Top Rank
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 对JS继承的一点思考
  • 后端_ThinkPHP5
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 前言-如何学习区块链
  • 学习笔记TF060:图像语音结合,看图说话
  • 在Unity中实现一个简单的消息管理器
  • ​Linux·i2c驱动架构​
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • #Java第九次作业--输入输出流和文件操作
  • #java学习笔记(面向对象)----(未完结)
  • (八)Flask之app.route装饰器函数的参数
  • (二)学习JVM —— 垃圾回收机制
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (附源码)ssm高校实验室 毕业设计 800008
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (转)德国人的记事本
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • **python多态
  • ./configure,make,make install的作用(转)
  • .bat批处理(一):@echo off
  • .mysql secret在哪_MySQL如何使用索引
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .NetCore发布到IIS
  • .NET编程C#线程之旅:十种开启线程的方式以及各自使用场景和优缺点