文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>postgresql类型转换相关源码分析

postgresql类型转换相关源码分析

时间:2009-10-16  来源:fghler

postgresql类型转换相关源码分析  

版本是postgresql 8.2.12
相关关键源码:
文件:pg_cast.h,包含类型转换相关定义
#define CastRelationId 2605
CATALOG(pg_cast,2605)
{
   Oid    castsource;   /* source datatype for cast */
   Oid    casttarget;   /* destination datatype for cast */
   Oid    castfunc;      /* cast function*/
   char   castcontext;         /*标识这个转换函数在什么环境里被调用*/
} FormData_pg_cast;
typedef enum CoercionCodes
{
COERCION_CODE_IMPLICIT = 'i',   /*隐含的类型转换*/
COERCION_CODE_ASSIGNMENT = 'a',   /*赋值语句中的类型转换*/
COERCION_CODE_EXPLICIT = 'e'         /*明确地类型转换*/
} CoercionCodes;
文件:pg_proc.h,包含系统过程相关定义
文件:pg_type.h,包含系统类型相关定义


实例分析:源码中将int4转化为bool的过程。


文件 pg_cast.h 第108行
DATA(insert ( 23 16 2557 e ));
解释:postgresql里面所有对象,包括类型,函数等都用一个OID(Object ID)表示,23是int4的OID,16是bool的OID,2557是转换函数的OID,e表示明确的类型转换。


文件 pg_proc.h 第3875行
DATA(insert OID = 2557 ( bool       PGNSP PGUID 12 f f t f i 1 16 "23" _null_ _null_ _null_ int4_bool - _null_ ));
DESCR("convert int4 to boolean");
解释:声明OID为2557的对象和转换函数int4_bool的关联关系。


文件 builtins.h 内部类型的操作声明 第125行
extern Datum int4_bool(PG_FUNCTION_ARGS);
解释:声明转换函数。


文件 int.c 内建int类型相关函数 第410行
/* Cast int4 -> bool */
Datum
int4_bool(PG_FUNCTION_ARGS)
{
   if (PG_GETARG_INT32(0) == 0)
    PG_RETURN_BOOL(false);
   else
    PG_RETURN_BOOL(true);
}
解释:int4到bool转换函数的定义
这样,比如,本来postgresql是不允许bool转化为char的,可以对源码进行修改使其支持这个转换。

相关阅读 更多 +
排行榜 更多 +
找茬脑洞的世界安卓版

找茬脑洞的世界安卓版

休闲益智 下载
滑板英雄跑酷2手游

滑板英雄跑酷2手游

休闲益智 下载
披萨对对看下载

披萨对对看下载

休闲益智 下载