在Apache AGE中如何通过DirectFunctionCall传递NULL参数?
如何通过DirectFunctionCall向PostgreSQL/Apache AGE函数传递NULL参数
在PostgreSQL(以及基于它的Apache AGE)中,通过DirectFunctionCall系列宏传递NULL参数的正确方式是使用**NullDatum**宏——这是PostgreSQL专门定义用来表示NULL类型Datum的常量。
为什么你之前的尝试都无效
你试的几种方法都没命中PostgreSQL对NULL参数的定义逻辑:
- 直接传
NULL:这是C语言的空指针,不是PostgreSQL认可的NULL Datum值,会被视为无效参数 CStringGetDatum("NULL")/CStringGetDatum(""):这是将字符串转换为Datum,本质是有效的非NULL字符串值,函数内的PG_ARGISNULL检查不会判定为NULLCStringGetDatum(NULL):CStringGetDatum要求传入合法的C字符串指针,传NULL会触发未定义行为PointerGetDatum(NULL):这只是将空指针转为Datum,但PG_ARGISNULL检查的是参数的null标记,而非Datum值本身,因此无法被识别为NULL
正确的调用方式
NullDatum会被DirectFunctionCall宏正确解析,让函数内部的PG_ARGISNULL(n)检查返回true。比如你要给create_vlabel的第2个参数传NULL(对应PG_ARGISNULL(2)),假设该函数是3参数函数,调用示例如下:
DirectFunctionCall3(create_vlabel, DatumGetSomeType(...), // 第1个参数的Datum值 NullDatum, // 第2个参数传NULL DatumGetAnotherType(...) // 第3个参数的Datum值 );
如果是单参数调用(你之前用的DirectFunctionCall1),要传NULL的话直接写:
DirectFunctionCall1(create_vlabel, NullDatum);
NullDatum在PostgreSQL的postgres.h头文件中定义,语义上等价于(Datum) 0,但使用宏更符合PostgreSQL的编码规范,也更易读。
内容的提问来源于stack exchange,提问作者Marco Souza
相关产品推荐
相关产品推荐

