前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >原 对于PostgreSQL中Datum的解释

原 对于PostgreSQL中Datum的解释

作者头像
王果壳
发布2018-05-17 14:20:14
2.1K0
发布2018-05-17 14:20:14
举报
文章被收录于专栏:王硕王硕

Datum类型是PG系统函数大量引用的类型,其定义为:

代码语言:javascript
复制
typedef uintptr_t Datum;
typedef unsigned long long uintptr;

这里举一个比较简单的例子进行解释:

代码语言:javascript
复制
Datum
cstring_in(PG_FUNCTION_ARGS)
{
 char	   *str = PG_GETARG_CSTRING(0);

 PG_RETURN_CSTRING(pstrdup(str));
}

/*
 * cstring_out		- output routine for pseudo-type CSTRING.
 *
 * We allow this mainly so that "SELECT some_output_function(...)" does
 * what the user will expect.
 */
Datum
cstring_out(PG_FUNCTION_ARGS)
{
 char	   *str = PG_GETARG_CSTRING(0);

 PG_RETURN_CSTRING(pstrdup(str));
}

这里主要说明的是PG_GETARG_***和PG_RETURN_***。

这些函数的定义可以在fmgr.h中看到,时间类型的需要在其头文件看到。

以PG_GETARG_CSTRING来说明一下,其定义为:

代码语言:javascript
复制
#define PG_GETARG_CSTRING(n) DatumGetCString(PG_GETARG_DATUM(n))

#define PG_GETARG_DATUM(n)	 (fcinfo->arg[n])

#define DatumGetCString(X) ((char *) DatumGetPointer(X)) #define DatumGetPointer(X) ((Pointer) (X))
   
  
typedef char *Pointer;

PG_GETARG_DATUM是获取参数中第一个Datum类型的值。

PG_GETARG_CSTRING是将Datum这种类型转换为字符指针类型,基本都是用char *来转化。

下面看一下:

代码语言:javascript
复制
#define PG_RETURN_CSTRING(x) return CStringGetDatum(x)

#define CStringGetDatum(X) PointerGetDatum(X)

#define PointerGetDatum(X) ((Datum) (X))

和上面的类似也是对类型的转换,这里是将字符指针类型转换为无符号长整形。

所以PG内部进行传参实际上并没有对指针进行传递,而是将指针转化为整形,然后进行传递。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档