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

pg空值管理

文章目录

  • 环境
  • 文档用途
  • 详细信息

环境

系统平台:Linux x86-64 Red Hat Enterprise Linux 7
版本:14,13,12

文档用途

从元组底层的角度看属性为空的判定

详细信息

1.元组头部结构及其主要字段解释说明


2.伪代码
HeapTupleHeader tup = tuple->t_data; // 某个表当中某个元组的元组头部指针

bits8 *bp = tup->t_bits; // ptr to null bitmap in one tuple

int tdesc_natts = ((Relation)rel)->rd_att->natts; // 从RelationData中的TupleDescData获取元组的属性数量

int natts = ((tup)->t_infomask2 & HEAP_NATTS_MASK) // 在该元组的元组头部中,根据infomask2计算该元组的属性数目 HEAP_NATTS_MASK = 0x7ff, 11位

natts = Min(natts, tdesc_natts); // 新元组数目可能比预期的要多,为了避免越界访问,选小

bool hasnulls = tup->infomask & HEAP_HASNULL;

for (attnum = 0; attnum < natts; attnum++)

{

Form_pg_attribute thisatt = &((Relation)rel)->rd_att->attrs[i]; //对每个属性获取pg_attribute的描述

if (hasnulls && att_isnull(attnum, bp))// 在该元组的t_bits当中判断该属性对应的属性值是否为空

{

......

}

}

att_isnull实现:

/*

  • Check a tuple’s null bitmap to determine whether the attribute is null.

  • Note that a 0 in the null bitmap indicates a null, while 1 indicates

  • non-null.

*/

static inline bool att_isnull(int ATT, const bits8 *BITS)

{

return !(BITS[ATT >> 3] & (1 << (ATT & 0x07)));

}

att_isnull解释:

t_bits[…]的每一个元素是一个字节的数,bits8==uint8

ATT >> 3: 元组属性编号从0开始编号,8位一组,正好对应一个t_bits[]当中的一个元素

1<<(ATT&Ox7): 8位一组,从0开始编号, 1<<ATT&(111)b计算的这这一组中的位置。

3.TEST

infomask_show函数实现:

#include "postgres.h" #include "fmgr.h" #include "utils/varlena.h" #include "utils/builtins.h" PG_MODULE_MAGIC; PG_FUNCTION_INFO_V1(infomask_show); //#define HEAP_HASNULL 0x0001 /* has null attribute(s) */ //#define HEAP_HASVARWIDTH 0x0002 /* has variable-width attribute(s) */ //#define HEAP_HASEXTERNAL 0x0004 /* has external stored attribute(s) */ //#define HEAP_HASOID_OLD 0x0008 /* has an object-id field */ //#define HEAP_XMAX_KEYSHR_LOCK 0x0010 /* xmax is a key-shared locker */ //#define HEAP_COMBOCID 0x0020 /* t_cid is a combo CID */ //#define HEAP_XMAX_EXCL_LOCK 0x0040 /* xmax is exclusive locker */ //#define HEAP_XMAX_LOCK_ONLY 0x0080 /* xmax, if valid, is only a locker */ /* xmax is a shared locker */ //#define HEAP_XMAX_SHR_LOCK (HEAP_XMAX_EXCL_LOCK | HEAP_XMAX_KEYSHR_LOCK) //#define HEAP_LOCK_MASK (HEAP_XMAX_SHR_LOCK | HEAP_XMAX_EXCL_LOCK | \ HEAP_XMAX_KEYSHR_LOCK) //#define HEAP_XMIN_COMMITTED 0x0100 /* t_xmin committed */ //#define HEAP_XMIN_INVALID 0x0200 /* t_xmin invalid/aborted */ //#define HEAP_XMIN_FROZEN (HEAP_XMIN_COMMITTED|HEAP_XMIN_INVALID) //#define HEAP_XMAX_COMMITTED 0x0400 /* t_xmax committed */ //#define HEAP_XMAX_INVALID 0x0800 /* t_xmax invalid/aborted */ //#define HEAP_XMAX_IS_MULTI 0x1000 /* t_xmax is a MultiXactId */ //#define HEAP_UPDATED 0x2000 /* this is UPDATEd version of row */ //#define HEAP_MOVED_OFF 0x4000 /* moved to another place by pre-9.0 * VACUUM FULL; kept for binary * * upgrade support */ //#define HEAP_MOVED_IN 0x8000 /* moved from another place by pre-9.0* VACUUM FULL; kept for binary* * upgrade support */ char buf[1024]; char *macro_vector[] = {"HEAP_HASNULL","HEAP_HASVARWIDTH","HEAP_HASEXTERNAL","HEAP_HASOID_OLD","HEAP_XMAX_KEYSHR_LOCK","HEAP_COMBOCID", "HEAP_XMAX_EXCL_LOCK","HEAP_XMAX_LOCK_ONLY","HEAP_XMIN_COMMITTED","HEAP_XMIN_INVALID","HEAP_XMIN_FROZEN","HEAP_XMAX_COMMITTED","HEAP_XMAX_INVALID","HEAP_XMAX_IS_MULTI", "HEAP_UPDATED","HEAP_MOVED_OFF","HEAP_MOVED_IN"}; Datum infomask_show(PG_FUNCTION_ARGS) { unsigned short infomask_bits = PG_GETARG_UINT16(0); //PG_RETURN_UINT16(infomask_bits); int i = 0; char *start = buf; while (i < 16) { if (infomask_bits & (1 << i)) { if( i > 0 ) { int len = strlen(buf); strcpy(buf+len, " | "); len = strlen(buf); start = buf + len; } strcpy(start,macro_vector[i]); } i++; } PG_RETURN_TEXT_P(cstring_to_text(buf)); }
http://www.gsyq.cn/news/1606063.html

相关文章:

  • 主流办公APP对比,图文会议总结功能谁更实用
  • 621万vs697万!2026年结婚人数预测你信哪个?
  • Python列表去重的20种实现方式
  • 时间管理:番茄工作法在编程中的应用
  • title: Claude Code 教程:从零搭建 AI 驱动的开发工作流(基于 Google 新版 SDLC 白皮书)
  • Linux:进程
  • SpringBoot 整合 MinIO 实现文件存储——私有化 OSS 方案
  • 吉阳区正宗椰子鸡推荐|符合海南本土特色的宝藏门店
  • 《AI抢产能致车规存储缺货?欣芯半导体给出eMMC/UFS“供应韧性”破局与选型指南》
  • 如何甄选靠谱展厅设计公司:从效果到落地的实战指南
  • 2026去水印不破坏原图的方法!电脑手机在线无痕去水印工具+PS教程
  • Java计算机毕设之基于 Java 的部门通知与任务一体化管理系统 团队协作型任务分配管理系统(完整前后端代码+说明文档+LW,调试定制等)
  • 2026奶茶店收银系统维护商推荐解析:凤梨收银系统适配茶饮业态的专业参考
  • 专业的杭州Geo哪家有实力
  • 查询优化-提升子查询-UNION类型
  • STM32和STM32CubeMX实现SHT30温湿度传感器 保姆级教程
  • 社区公益服务平台 Java+SpringBoot+Vue 前后分离
  • 营销智能体选哪个?一份基于实际场景的对比指南正在改变内容生成、投放优化和用户互动的效率。但市场上的产品形态差异很大:有的只是套了壳的通用写作工具,有的是传统营销 SaaS 加了个 AI 入口。选错不仅
  • 口碑佳的智能产品有何奥秘
  • 收藏!AI应用开发路线图:Java后端+Python大模型,小白也能轻松入门并快速上手
  • 软件数据可视化化的图表展示与交互
  • 暑假将至,校园安防不“放假”:国标GB28181视频监控平台EasyCVR这套视频融合方案让安全“全年无休”
  • [百度网盘] 大模型AI应用开发企业级项目实战(提示词工程+大模型NLP应用+AI对话产品)
  • 数据库巡检怎么做?Prometheus+Grafana监控体系搭建指南
  • 记一次由「系统Swap空间」被频繁使用导致的性能急剧下降
  • 软件检测实验室CMA资质认定技术人员和管理人员岗位要求与职责划分
  • GPT-5.6震撼来袭!OpenAI开启智能体基础设施时代,跑分已不重要!
  • 快速集成脑筋急转弯API:用Python构建你的命令行问答游戏
  • MSPM0 SYSCTL模块深度解析:时钟与功耗管理实战指南
  • 16 CFR 1640软垫家具阻燃