PostgreSQL SPI_commit
SPI_commit 是 PostgreSQL 中用于提交事务的 SPI (Server Programming Interface) 函数。在 PostgreSQL 中,SPI 函数允许在服务器端以 C 语言编写的存储过程或触发器中执行 SQL 查询和操作。SPI_commit 函数用于提交当前事务。事务是数据库中一系列 SQL 操作的逻辑单元,要么全部执行,要么全部回滚。通过调用 SPI_commit,你可以将之前的 SQL 操作永久地应用到数据库中,并结束当前的事务。下面是一个简单的示例代码,展示了如何在 PostgreSQL 存储过程中使用 SPI_commit:#include "postgres.h"#include "fmgr.h"#include "executor/spi.h"PG_MODULE_MAGIC;PG_FUNCTION_INFO_V1(my_function);Datum my_function(PG_FUNCTION_ARGS) { /* 开始一个事务 */ SPI_connect(...
PostgreSQL SPI_freeplan
在 PostgreSQL 的 SPI(Server Programming Interface)中,SPI_freeplan 函数用于释放通过 SPI 准备的查询计划占用的内存。当使用 SPI_prepare 或 SPI_saveplan 准备查询计划后,通过调用 SPI_freeplan 函数可以释放相关的内存。以下是 SPI_freeplan 函数的函数原型:void SPI_freeplan(SPIPlanPtr plan); plan: 要释放的查询计划(通常是由 SPI_prepare 或 SPI_saveplan 创建的)。在执行 SPI 查询时,首先使用 SPI_prepare 或 SPI_saveplan 函数准备查询计划。当不再需要查询计划时,通过调用 SPI_freeplan 函数释放相关的内存。以下是一个简单的示例,演示了如何使用 SPI_freeplan 函数释放查询计划的内存:#include "executor/spi.h"PG_FUNCTION_INFO_V1(my_function);Datum my_function(PG_FUNC...
PostgreSQL SPI_freetuptable
在 PostgreSQL 的 SPI(Server Programming Interface)中,SPI_freetuptable 函数用于释放通过 SPI 查询操作获取的元组集合的内存。当执行 SPI 查询后,可以通过 SPI_freetuptable 来释放整个结果集所占用的内存。以下是 SPI_freetuptable 函数的函数原型:void SPI_freetuptable(SPIPlanPtr plan); plan: 要释放的查询计划(通常是由 SPI_prepare 或 SPI_saveplan 创建的)。在使用 SPI 执行查询并获取结果集后,通常会有一个查询计划对象(SPIPlanPtr),该对象包含了查询的结果集。通过调用 SPI_freetuptable 函数,可以释放这个结果集占用的内存。以下是一个简单的示例,演示了如何使用 SPI_freetuptable 函数释放通过 SPI 查询操作获取的结果集的内存:#include "executor/spi.h"PG_FUNCTION_INFO_V1(my_function);Datum my...
PostgreSQL SPI_freetuple
在 PostgreSQL 的 SPI(Server Programming Interface)中,SPI_freetuple 函数用于释放通过 SPI 获取的元组。具体而言,SPI_freetuple 释放由 SPI_exec 函数或其他 SPI 查询操作返回的元组。以下是 SPI_freetuple 函数的函数原型:void SPI_freetuple(HeapTuple tuple); tuple: 要释放的元组。在使用 SPI 执行查询后,通常会得到一个元组,可以通过 SPI_freetuple 来释放这个元组的内存,防止内存泄漏。以下是一个简单的示例,演示了如何使用 SPI_freetuple 函数释放通过 SPI 获取的元组:#include "executor/spi.h"PG_FUNCTION_INFO_V1(my_function);Datum my_function(PG_FUNCTION_ARGS) { if (SPI_connect() != SPI_OK_CONNECT) { elog(ERROR, "Fail...
PostgreSQL SPI_modifytuple
在 PostgreSQL 的 SPI(Server Programming Interface)中,没有直接的 SPI_modifytuple 函数。要修改表中的元组,通常会使用 SPI_exec 函数执行 UPDATE 语句或者使用底层的 HeapTuple 接口。以下是一个简单的示例,演示如何使用 SPI_exec 来修改表中的元组:#include "executor/spi.h"PG_FUNCTION_INFO_V1(my_function);Datum my_function(PG_FUNCTION_ARGS) { if (SPI_connect() != SPI_OK_CONNECT) { elog(ERROR, "Failed to connect to SPI"); PG_RETURN_NULL(); } /* 构建 UPDATE 语句 */ const char *sql = "UPDATE my_table SET column1 = 'new_value&...
PostgreSQL SPI_copytuple
在 PostgreSQL 的 SPI(Server Programming Interface)中,SPI_copytuple 是一个用于复制元组的函数。它的函数原型如下:HeapTuple SPI_copytuple(HeapTuple tuple); tuple: 要复制的源元组。SPI_copytuple 函数用于复制一个给定的元组。该函数会创建并返回源元组的一个新副本,而不影响原始元组。这对于在进行元组处理时需要创建副本以防止修改原始元组时产生的副作用是很有用的。以下是一个简单的示例,演示了如何使用 SPI_copytuple 函数复制元组:#include "executor/spi.h"PG_FUNCTION_INFO_V1(my_function);Datum my_function(PG_FUNCTION_ARGS) { if (SPI_connect() != SPI_OK_CONNECT) { elog(ERROR, "Failed to connect to SPI"); PG_RETURN...
PostgreSQL SPI_pfree
在 PostgreSQL 的 SPI(Server Programming Interface)中,SPI_pfree 是一个用于释放通过 SPI 内存分配器分配的内存的函数。它的函数原型如下:void SPI_pfree(void *pointer); pointer: 指向先前通过 SPI 内存分配器分配的内存块的指针。SPI_pfree 函数用于释放在 SPI 内存上下文中分配的内存块。当你使用 SPI_palloc 或者 SPI_repalloc 分配内存时,当不再需要该内存块时,应该使用 SPI_pfree 来释放它。在执行结束时,SPI 上下文及其相关的内存将被自动释放,不需要显式调用 SPI_pfree。以下是一个简单的示例,演示了如何使用 SPI_pfree 函数释放内存:#include "executor/spi.h"PG_FUNCTION_INFO_V1(my_function);Datum my_function(PG_FUNCTION_ARGS) { if (SPI_connect() != SPI_OK_CONNECT) { ...
PostgreSQL SPI_repalloc
在 PostgreSQL 的 SPI(Server Programming Interface)中,SPI_repalloc 是一个用于在 SPI 内存上下文中重新分配内存的函数。它的函数原型如下:void *SPI_repalloc(void *pointer, Size size); pointer: 指向先前通过 SPI 内存分配器分配的内存块的指针。 size: 要重新分配的内存块的新大小。SPI_repalloc 函数用于更改先前分配的内存块的大小。它接受一个指针和新的大小,并尝试将内存块的大小更改为新的大小。如果成功,它返回指向重新分配内存块的指针;如果失败,它返回 NULL。在成功的情况下,如果新的大小比原来的大小大,额外的内存将未初始化;如果新的大小比原来的大小小,超出新大小的部分将被截断。以下是一个简单的示例,演示了如何使用 SPI_repalloc 函数在 SPI 内存上下文中重新分配内存:#include "executor/spi.h"PG_FUNCTION_INFO_V1(my_function);Datum my_function(PG_...
PostgreSQL SPI_palloc
在 PostgreSQL 的 SPI(Server Programming Interface)中,SPI_palloc 是一个用于在 SPI 内存上下文中分配内存的函数。它的函数原型如下:void *SPI_palloc(Size size); size: 要分配的内存块的大小。SPI_palloc 函数分配一个指定大小的内存块,并将其关联到当前 SPI 上下文中。在执行 SPI 函数期间分配的内存块通常是与 SPI 上下文相关的,因此可以通过 SPI 的内存管理机制一次性地释放整个 SPI 上下文,从而释放相关的内存。以下是一个简单的示例,演示了如何使用 SPI_palloc 函数在 SPI 内存上下文中分配内存:#include "executor/spi.h"PG_FUNCTION_INFO_V1(my_function);Datum my_function(PG_FUNCTION_ARGS) { if (SPI_connect() != SPI_OK_CONNECT) { elog(ERROR, "Failed to conn...
PostgreSQL SPI_gettype
在 PostgreSQL 中,SPI_gettype 是 SPI(Server Programming Interface)中的一个函数,用于获取查询结果集中指定列的数据类型 OID(Object ID)。这个函数的原型如下:Oid SPI_gettype(TupleDesc tupleDesc, int colNumber); tupleDesc: 查询结果集的描述符,包含关于结果集中列的信息。 colNumber: 要获取类型的列的索引(从 1 开始)。该函数返回指定列的数据类型 OID。如果请求的列号无效,函数返回 InvalidOid。以下是一个简单的例子,演示了如何使用 SPI_gettype 来获取查询结果中特定列的数据类型 OID:#include "executor/spi.h"PG_FUNCTION_INFO_V1(my_function);Datum my_function(PG_FUNCTION_ARGS) { if (SPI_connect() != SPI_OK_CONNECT) { elog(ERROR, "...
PostgreSQL SPI_getbinval
在 PostgreSQL 中,SPI_getbinval 是 SPI(Server Programming Interface)中的一个函数,用于获取查询结果集中指定元组和列的二进制数据值。这个函数的原型如下:Datum SPI_getbinval(HeapTuple tuple, TupleDesc tupleDesc, int attnum, bool *isnull); tuple: 包含结果的元组。 tupleDesc: 查询结果集的描述符,包含关于结果集中列的信息。 attnum: 要获取值的列的索引(从 1 开始)。 isnull: 用于返回指示请求的列是否为 NULL 的标志。该函数返回指定列的二进制数据值,以 PostgreSQL Datum 类型表示。如果请求的列号无效或者出现其他错误,函数返回 0。通过检查 isnull 指针,可以确定请求的列是否为 NULL。以下是一个简单的例子,演示了如何使用 SPI_getbinval 来获取查询结果中特定列的二进制数据值:#include "executor/spi.h"PG_FUNCTION_INFO_...
PostgreSQL SPI_getvalue
在 PostgreSQL 中,SPI_getvalue 是 SPI(Server Programming Interface)中的一个函数,用于获取查询结果集中指定元组和列的值。这个函数的原型如下:char *SPI_getvalue(HeapTuple tuple, TupleDesc tupleDesc, int attnum); tuple: 包含结果的元组。 tupleDesc: 查询结果集的描述符,包含关于结果集中列的信息。 attnum: 要获取值的列的索引(从 1 开始)。该函数返回指定列的值,以 C 字符串的形式表示。如果请求的列号无效或者出现其他错误,函数返回 NULL。以下是一个简单的例子,演示了如何使用 SPI_getvalue 来获取查询结果中特定列的值:#include "executor/spi.h"PG_FUNCTION_INFO_V1(my_function);Datum my_function(PG_FUNCTION_ARGS) { if (SPI_connect() != SPI_OK_CONNECT) { e...
PostgreSQL SPI_fnumber
在 PostgreSQL 中,SPI_fnumber 是 SPI(Server Programming Interface)中的一个宏,用于获取查询结果集中给定列名的列号(即列的位置索引)。这个宏的原型如下:int SPI_fnumber(TupleDesc tupleDesc, const char *fname); tupleDesc: 查询结果集的描述符,包含关于结果集中列的信息。 fname: 要查找的列名。该宏返回指定列名在结果集中的位置索引,如果列名不存在,则返回 0。以下是一个简单的例子,演示了如何使用 SPI_fnumber 来获取列名在结果集中的位置:#include "executor/spi.h"PG_FUNCTION_INFO_V1(my_function);Datum my_function(PG_FUNCTION_ARGS) { if (SPI_connect() != SPI_OK_CONNECT) { elog(ERROR, "Failed to connect to SPI"); ...
PostgreSQL SPI_fname
在 PostgreSQL 中,SPI_fname 不是一个特定的函数,而是一个SPI(Server Programming Interface)中的宏。SPI 是 PostgreSQL 提供的一组用于服务器编程的接口函数和宏。SPI_fname 用于获取当前查询的结果集中的列名。这个宏的使用通常是在使用 SPI 进行动态 SQL 查询时,通过 SPI 执行查询并获取结果的元数据。以下是一个简单的例子:#include "executor/spi.h"PG_FUNCTION_INFO_V1(my_function);Datum my_function(PG_FUNCTION_ARGS) { if (SPI_connect() != SPI_OK_CONNECT) { elog(ERROR, "Failed to connect to SPI"); PG_RETURN_NULL(); } /* 执行动态 SQL 查询 */ if (SPI_execute("SELECT column1, ...
PostgreSQL SPI_register_trigger_data
SPI_register_trigger_data 是 PostgreSQL 中的一个函数,用于在触发器函数中注册触发器相关的信息。以下是该函数的一般用法:#include "executor/spi.h"voidSPI_register_trigger_data(void *tdata)这个函数用于注册触发器函数的上下文信息,以便在触发器函数中可以通过 SPI_getargtypeid、SPI_getargcount 等 SPI 函数获取触发器函数的参数信息。在触发器函数中使用这个函数的示例可能如下:#include "postgres.h"#include "fmgr.h"#include "executor/spi.h"PG_MODULE_MAGIC;PG_FUNCTION_INFO_V1(my_trigger_function);void _PG_init(void);void_PG_init(void){ if (!process_shared_preload_libraries_in_pr...
PostgreSQL SPI_unregister_relation
SPI_unregister_relation 是 PostgreSQL 中的一个 SPI(Server Programming Interface)函数,用于取消注册一个先前使用 SPI_register_relation 注册的关系(relation)。在 PostgreSQL 中,SPI 是一组允许 C 函数直接访问 PostgreSQL 数据库系统内部的接口函数。以下是 SPI_unregister_relation 函数的一般形式:void SPI_unregister_relation(Oid relid)其中,relid 是一个表示待取消注册关系的对象 ID(Object ID)的参数。该函数用于释放与指定关系相关联的资源。在使用 SPI_register_relation 注册关系后,当不再需要使用该关系时,可以调用 SPI_unregister_relation 来清理相关资源,以避免资源泄漏。请注意,SPI 函数主要用于开发 PostgreSQL 插件和扩展,直接使用 SPI 需要对 PostgreSQL 内部结构和API有一定的了解。
PostgreSQL SPI_saveplan
SPI_saveplan 是 PostgreSQL 中的一个函数,用于保存一个执行计划(execution plan)以便后续使用。执行计划是 PostgreSQL 查询执行器生成的内部数据结构,描述了如何执行一个查询。以下是一个简单的示例,演示如何在 PostgreSQL 中使用 SPI_saveplan 函数:#include "postgres.h"#include "executor/spi.h"#include "commands/prepare.h"#include "utils/builtins.h"PG_MODULE_MAGIC;PG_FUNCTION_INFO_V1(save_plan_example);Datum save_plan_example(PG_FUNCTION_ARGS) { SPIPlanPtr plan; int arg_types[1] = { INT4OID }; char *query = "SELECT * FROM my_table ...
PostgreSQL SPI_cursor_close
在 PostgreSQL 的 SPI(Server Programming Interface)库中,SPI_cursor_close 函数用于关闭游标。其原型如下:void SPI_cursor_close(Portal portal);参数说明如下: portal:要关闭的游标的 Portal 对象。函数不返回任何值。以下是一个简单的示例,演示如何使用 SPI_cursor_close 函数关闭游标:#include "postgres.h"#include "executor/spi.h"PG_MODULE_MAGIC;PG_FUNCTION_INFO_V1(my_function);Datummy_function(PG_FUNCTION_ARGS){ Portal portal; /* 假设已经通过 SPI_cursor_open 打开了一个游标 */ /* 关闭游标 */ SPI_cursor_close(portal); PG_RETURN_NULL();}在这个例子中,假设已经通过 SPI_curso...
PostgreSQL SPI_cursor_fetch
在 PostgreSQL 的 SPI(Server Programming Interface)库中,SPI_cursor_fetch 函数用于从游标中获取数据行。它的原型如下:int SPI_cursor_fetch(Portal portal, bool forward, long count);参数说明如下: portal:要从中获取数据的 Portal。 forward:一个布尔值,表示是否向前移动游标。如果为 true,则向前移动;如果为 false,则向后移动。 count:要检索的行数。如果为 0,则表示检索所有行。函数返回一个整数,表示查询执行的结果。可能的返回值包括: SPI_OK_FETCH:成功获取数据行。 SPI_CURSOR_NULL:游标无效或已经关闭。 SPI_ERROR_NO_TUPLE:未找到数据行。以下是一个简单的示例,演示如何使用 SPI_cursor_fetch 从游标中获取数据行:#include "postgres.h"#include "executor/spi.h"PG_MODULE_MAGIC;P...
PostgreSQL SPI_cursor_open
在 PostgreSQL 的 SPI(Server Programming Interface)库中,SPI_cursor_open 函数用于打开一个基于查询计划的游标(cursor)。它的原型如下:Portal SPI_cursor_open(const char *name, SPIPlanPtr plan, Datum *Values, const char *Nulls, bool read_only);参数说明如下: name:游标的名字,可以为 NULL。 plan:已经准备好的查询计划,通过 SPI_prepare 获得。 Values:包含实际参数值的数组。 Nulls:指示每个参数是否为 NULL 的字符数组。 read_only:标志是否是只读游标。函数返回一个 Portal 类型的指针,该指针指向已打开的游标,可以使用它来执行查询。如果函数执行失败,它将返回 NULL。以下是一个简单的示例,演示如何使用 SPI_cursor_open 打开一个游标并执行查询:#include "postgres.h"...