我的编程空间,编程开发者的网络收藏夹
学习永远不晚

PostgreSQL源码学习(2)插入数据#0

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

PostgreSQL源码学习(2)插入数据#0

PostgreSQL源码学习(2)插入数据#0

插入数据主要的实现在bufpage.c中,主要的函数是PageAddItemExtended。查看调用栈:

#0  PageAddItemExtended (page=0x7fddcac3cd00 "", item=0x141f540 "34701", 
    size=32, offsetNumber=0, flags=2) at bufpage.c:199
#1  0x00000000004d9e70 in RelationPutHeapTuple (relation=0x7fddda866178, 
    buffer=158, tuple=0x141f528, token=false) at hio.c:53
#2  0x00000000004c76d2 in heap_insert (relation=0x7fddda866178, tup=0x141f528, 
    cid=0, options=0, bistate=0x0) at heapam.c:1913
#3  0x00000000004d3ead in heapam_tuple_insert (relation=0x7fddda866178, 
    slot=0x141f3c8, cid=0, options=0, bistate=0x0) at heapam_handler.c:257
#4  0x00000000006dae8a in table_tuple_insert (rel=0x7fddda866178, 
    slot=0x141f3c8, cid=0, options=0, bistate=0x0)
    at ../../../class="lazy" data-src/include/access/tableam.h:1140
#5  0x00000000006dbf87 in ExecInsert (mtstate=0x141e8d0, slot=0x141f3c8, 
    planSlot=0x141f3c8, estate=0x141e540, canSetTag=true)
    at nodeModifyTable.c:586
#6  0x00000000006de2fa in ExecModifyTable (pstate=0x141e8d0)
    at nodeModifyTable.c:2215
#7  0x00000000006b2af7 in ExecProcNodeFirst (node=0x141e8d0)
    at execProcnode.c:445
#8  0x00000000006a8cd7 in ExecProcNode (node=0x141e8d0)
    at ../../../class="lazy" data-src/include/executor/executor.h:239
#9  0x00000000006ab053 in ExecutePlan (estate=0x141e540, planstate=0x141e8d0, 
    use_parallel_mode=false, operation=CMD_INSERT, sendTuples=false, 
    numberTuples=0, direction=ForwardScanDirection, dest=0x1419ff8, 
---Type  to continue, or q  to quit---
    execute_once=true) at execMain.c:1646
#10 0x00000000006a91b4 in standard_ExecutorRun (queryDesc=0x141d910, 
    direction=ForwardScanDirection, count=0, execute_once=true)
    at execMain.c:364
#11 0x00000000006a9059 in ExecutorRun (queryDesc=0x141d910, 
    direction=ForwardScanDirection, count=0, execute_once=true)
    at execMain.c:308
#12 0x000000000088016a in ProcessQuery (plan=0x1419f18, 
    sourceText=0x13606f0 "insert into test values(123,"abc");", params=0x0, 
    queryEnv=0x0, dest=0x1419ff8, completionTag=0x7ffd63e18570 "")
    at pquery.c:161
#13 0x00000000008818b1 in PortalRunMulti (portal=0x13c6490, isTopLevel=true, 
    setHoldSnapshot=false, dest=0x1419ff8, altdest=0x1419ff8, 
    completionTag=0x7ffd63e18570 "") at pquery.c:1283
#14 0x0000000000880eeb in PortalRun (portal=0x13c6490, 
    count=9223372036854775807, isTopLevel=true, run_once=true, dest=0x1419ff8, 
    altdest=0x1419ff8, completionTag=0x7ffd63e18570 "") at pquery.c:796
#15 0x000000000087b27f in exec_simple_query (
    query_string=0x13606f0 "insert into test values(123,"abc");")
    at postgres.c:1215
#16 0x000000000087f2ff in PostgresMain (argc=1, argv=0x138a5c8, 
    dbname=0x138a490 "postgres", username=0x138a478 "nail") at postgres.c:4247
#17 0x00000000007e6a8e in BackendRun (port=0x1382470) at postmaster.c:4437
#18 0x00000000007e628d in BackendStartup (port=0x1382470) at postmaster.c:4128
#19 0x00000000007e292d in ServerLoop () at postmaster.c:1704
#20 0x00000000007e21ed in PostmasterMain (argc=3, argv=0x135b1b0)
    at postmaster.c:1377
#21 0x000000000070f75d in main (argc=3, argv=0x135b1b0) at main.c:228

相关数据结构

代码流程涉及的PageHeader结构体已在之前了解过。PostgreSQL源码学习(1)Page页

OffsetNumber
PageAddItemExtended(Page page,
					Item item,
					Size size,
					OffsetNumber offsetNumber,
					int flags);

PageAddItemExtended函数

// class="lazy" data-src/backend/storage/page/bufpage.c


limit = OffsetNumberNext(PageGetMaxOffsetNumber(page));


if (OffsetNumberIsValid(offsetNumber))
{
	if ((flags & PAI_OVERWRITE) != 0)
		
	else
		
}
else
{
	
}

if ((flags & PAI_IS_HEAP) != 0 && offsetNumber > MaxHeapTuplesPerPage)
	;



if (needshuffle)
	
	memmove(itemId + 1, itemId,
				(limit - offsetNumber) * sizeof(ItemIdData));


ItemIdSetNormal(itemId, upper, size);


memcpy((char *) page + upper, item, size);




return offsetNumber;

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

PostgreSQL源码学习(2)插入数据#0

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

PostgreSQL源码学习(2)插入数据#0

插入数据主要的实现在bufpage.c中,主要的函数是PageAddItemExtended。查看调用栈:#0 PageAddItemExtended (page=0x7fddcac3cd00 "", item=0x141f540 "34701",
PostgreSQL源码学习(2)插入数据#0
2019-10-17

PostgreSQL源码学习--插入数据#2

本节介绍heap_insert函数的代码流程本节前置toast机制:https://www.postgresql.org/docs/12/storage-toast.html可见性映射表:https://www.postgresql.org/docs/12/s
PostgreSQL源码学习--插入数据#2
2020-02-11

PostgreSQL源码学习--插入数据#6

本节介绍ExecModifyTable函数。相关数据结构typedef struct ModifyTableState{PlanStateps;CmdTypeoperation;/* INSERT
PostgreSQL源码学习--插入数据#6
2020-08-14

PostgreSQL源码学习--插入数据#4,5

本节介绍table_tuple_insert和ExecInsert函数。相关数据结构//src/include/utils/rel.htypedef struct RelationData{TupleDescrd_att;/* tupl
PostgreSQL源码学习--插入数据#4,5
2016-01-11

PostgreSQL源码学习--插入数据#3

本节介绍heapam_tuple_insert函数的代码流程相关数据结构结构体中有些成员可能目前难以理解,暂时先列出来,先把当前用到的成员能搞明白就可以。// src/include/executor/tuptable.htypedef struct Tupl
PostgreSQL源码学习--插入数据#3
2014-10-19

PostgreSQL源码学习(3)插入数据#1

相关数据结构//src/interfaces/ecpg/preproc/type.htypedef int Buffer;HeapTupleData的结构已在前面
PostgreSQL源码学习(3)插入数据#1
2015-01-16

PostgreSQL源码学习--更新数据#0

以一条update test set b = "bcd" where a = 123;的SQL语句为例,跟踪更新数据的代码逻辑。(PG版本为12.2)删除数据主要的函数是heap_update。查看调用栈:#0 heap_update (relation=0
PostgreSQL源码学习--更新数据#0
2017-05-20

PostgreSQL源码学习--删除数据#0

以一条delete from test where a = 123;的SQL语句为例,跟踪删除数据的代码逻辑。(PG版本为12.2)删除数据主要的函数是heap_delete。查看调用栈:#0 heap_delete (relation=0x7f67ac24
PostgreSQL源码学习--删除数据#0
2015-03-25

PostgreSQL源码学习--更新数据#3

本节介绍ExecUpdate函数。ExecUpdate函数static TupleTableSlot *ExecUpdate(ModifyTableState *mtstate, ItemPointer tupleid, HeapTuple oldtu
PostgreSQL源码学习--更新数据#3
2016-11-30

PostgreSQL源码学习--更新数据#1,2

本节介绍heapam_tuple_update和table_tuple_update函数。heapam_tuple_update函数//src/backend/access/heap/heapam_handler.cstatic TM_Resultheapam
PostgreSQL源码学习--更新数据#1,2
2018-03-29

PostgreSQL源码学习--删除数据#1,2

本节介绍heapam_tuple_delete和table_tuple_delete函数。heapam_tuple_delete函数//src/backend/access/heap/heapam_handler.cstatic TM_Resultheapam
PostgreSQL源码学习--删除数据#1,2
2020-08-27

PostgreSQL源码学习--删除数据#3

本节介绍ExecDelete函数。从表中删除时,tupleid标识要删除的元组,oldtuple为空;从视图中删除时,oldtuple传递给INSTEAD OF触发器标识要删除的内容,tupleid无效;从外部表中删除时,tupleid无效,fdw使用plan
PostgreSQL源码学习--删除数据#3
2020-01-09

redis源码学习02:跳跃表插入结点

本文是本人在学习redis源码时的笔记,本文主要是对跳跃表插入结点代码的中文注释,如有错误欢迎指正。 有关跳跃表的原理可以上网搜材料,有很多。 首先看下redis源码里有关跳跃表的相关结构体: typedef struct zskiplistNode { /
redis源码学习02:跳跃表插入结点
2015-07-29

编程热搜

目录