您如何在 Postgres 的 C 语言函数中 return bit(n) 或 bit varying(n) 字段?
How do you return a bit(n) or bit varying(n) field in a C-language function for Postgres?
问题说明了一切;如何为 Postgres 提供 C 语言函数 return 位串?
扩展 Nick 的(非常有帮助!)评论,这是一个简单的例子,return 在 Postgres 中的结果(Postgres.app 9.4,OS X Yosemite):
#include <postgres.h>
#include <utils/array.h>
#include <utils/varbit.h>
#include <fmgr.h>
#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif
Datum pg_test_varbit(PG_FUNCTION_ARGS);
PG_FUNCTION_INFO_V1(pg_test_varbit);
Datum
pg_test_varbit(PG_FUNCTION_ARGS)
{
VarBit *result;
int len, rlen;
len = 16;
rlen = VARBITTOTALLEN(len);
result = palloc0(rlen);
SET_VARSIZE(result, rlen);
VARBITLEN(result)
= len;
VARBITS(result)[0] = 0xFF;
VARBITS(result)[1] = 0x0;
PG_RETURN_VARBIT_P(result);
}
曾经 compiled/installed,我 运行 在 Postgres shell:
DROP FUNCTION IF EXISTS pg_test_varbit();
CREATE OR REPLACE FUNCTION pg_test_varbit() RETURNS varbit
AS 'pgtestvarbit', 'pg_test_varbit'
LANGUAGE C STRICT;
SELECT pg_test_varbit();
并收到“1111111100000000”作为结果。
问题说明了一切;如何为 Postgres 提供 C 语言函数 return 位串?
扩展 Nick 的(非常有帮助!)评论,这是一个简单的例子,return 在 Postgres 中的结果(Postgres.app 9.4,OS X Yosemite):
#include <postgres.h>
#include <utils/array.h>
#include <utils/varbit.h>
#include <fmgr.h>
#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif
Datum pg_test_varbit(PG_FUNCTION_ARGS);
PG_FUNCTION_INFO_V1(pg_test_varbit);
Datum
pg_test_varbit(PG_FUNCTION_ARGS)
{
VarBit *result;
int len, rlen;
len = 16;
rlen = VARBITTOTALLEN(len);
result = palloc0(rlen);
SET_VARSIZE(result, rlen);
VARBITLEN(result)
= len;
VARBITS(result)[0] = 0xFF;
VARBITS(result)[1] = 0x0;
PG_RETURN_VARBIT_P(result);
}
曾经 compiled/installed,我 运行 在 Postgres shell:
DROP FUNCTION IF EXISTS pg_test_varbit();
CREATE OR REPLACE FUNCTION pg_test_varbit() RETURNS varbit
AS 'pgtestvarbit', 'pg_test_varbit'
LANGUAGE C STRICT;
SELECT pg_test_varbit();
并收到“1111111100000000”作为结果。