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

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

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

本节介绍heapam_tuple_insert函数的代码流程

相关数据结构

结构体中有些成员可能目前难以理解,暂时先列出来,先把当前用到的成员能搞明白就可以。

// src/include/executor/tuptable.h

typedef struct TupleTableSlot
{
	NodeTag		type;
#define FIELDNO_TUPLETABLESLOT_FLAGS 1
	uint16		tts_flags;		/* Boolean states */
#define FIELDNO_TUPLETABLESLOT_NVALID 2
	AttrNumber	tts_nvalid;		/* # of valid values in tts_values */
	const TupleTableSlotOps *const tts_ops; /* implementation of slot */
#define FIELDNO_TUPLETABLESLOT_TUPLEDESCRIPTOR 4
	TupleDesc	tts_tupleDescriptor;	/* slot"s tuple descriptor */
#define FIELDNO_TUPLETABLESLOT_VALUES 5
	Datum	   *tts_values;		/* current per-attribute values */
#define FIELDNO_TUPLETABLESLOT_ISNULL 6
	bool	   *tts_isnull;		/* current per-attribute isnull flags */
	MemoryContext tts_mcxt;		/* slot itself is in this context */
	ItemPointerData tts_tid;	/* stored tuple"s tid */
	Oid			tts_tableOid;	/* table oid of tuple */
} TupleTableSlot;

代码100分

代码100分static void
heapam_tuple_insert(Relation relation, TupleTableSlot *slot, CommandId cid,
					int options, BulkInsertState bistate);

heapam_tuple_insert函数

/* 获取tuple。在当前示例中其tts_ops指向的是TTSOpsBufferHeapTuple,
   所以调用tts_buffer_heap_get_heap_tuple来取得tuple */
HeapTuple	tuple = ExecFetchSlotHeapTuple(slot, true, &shouldFree);

/* 设置tuple的tableoid为目标relation的oid */
slot->tts_tableOid = RelationGetRelid(relation);
tuple->t_tableOid = slot->tts_tableOid;

/*  插入tuple,复制Item指针到slot->tts_tid */
heap_insert(relation, tuple, cid, options, bistate);
ItemPointerCopy(&tuple->t_self, &slot->tts_tid);

/* 在获取tuple时如果使用了copy,那么现在可以释放了 */
if (shouldFree)
	pfree(tuple);

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/8984.html

(0)
上一篇 2023-02-18
下一篇 2023-02-18

相关推荐

  • mysql启动流程[通俗易懂]

    mysql启动流程[通俗易懂]配置流程实例展示 阅读本文前的知识准备: mysql程序启动流程.7z SET MYSQL_HOST="127.0.0.1"SET MYSQL_PWD="123456&q

    2023-02-23
    144
  • 在PyCharm中导入项目

    在PyCharm中导入项目PyCharm是一款流行的Python开发环境,可以帮助Python开发者提高开发效率和代码质量。在PyCharm中导入项目是一个必要的步骤,本文将详细介绍如何在PyCharm中导入项目。

    2024-05-26
    68
  • 使用Django测试

    使用Django测试在Web应用开发中,测试是一个重要的环节。而Django作为一个流行的Web框架,在测试方面也提供了良好的支持。本文将从多个角度详细介绍Django测试的相关内容。

    2024-08-07
    35
  • 将Django Model转换为字典格式的实用函数

    将Django Model转换为字典格式的实用函数在Django应用程序中,进行数据库操作主要使用Django的ORM框架,这个框架可以方便的将数据库中的表映射成为Python类,然后通过这个类就可以进行数据库的增删改查等操作了。ORM框架提供了manager、queryset等对象来帮助我们更加方便的操作数据库。然而,在一些情况下,我们需要将Django的Model对象转换成Python字典,以便于对返回数据进行处理、或者我们希望将Model对象序列化成JSON字符串。这篇文章将介绍从Django Model转换为Python字典的实用函数。

    2024-04-09
    72
  • Python split函数用于字符串分割

    Python split函数用于字符串分割在Python中,字符串是一种常见的数据类型,而字符串分割是在操作字符串时经常需要用到的操作之一。Python提供了一个内置的split()函数,可以对字符串进行分割。该函数非常灵活,可以以指定的分隔符为基础,对字符串进行分割,并返回一个分隔后的列表。在本文中,我们将详细介绍Python split函数的使用。

    2023-12-15
    100
  • 快速整明白Redis中的整数集合到底是个啥「建议收藏」

    快速整明白Redis中的整数集合到底是个啥「建议收藏」整数集合简介 整数集合(intset)是Redis集合数据类型的内部编码之一,当集合数据类型中的元素都是整数并且元素数量较少的时候,Redis就使用整数集合作为内部编码。 整数集合(intset)中可

    2023-05-09
    141
  • Python 3 教程「终于解决」

    Python 3 教程「终于解决」Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python …

    2023-03-31
    172
  • 用Python string操作轻松处理文本数据

    用Python string操作轻松处理文本数据Python string是Python中最基础的数据类型之一,它用于表示一系列字符(字符序列)。Python提供了一系列的内置函数,可以方便地对string进行操作。下面我们来看一些常见的操作。

    2024-03-20
    75

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注