postgres数据库内部提供了大量的系统参数做各种管理、控制、调优等无处不在无孔不入无所不用其及的精细功能调整,毫不客气的说,一个DBA对参数的理解程度往往决定了这个DBA的水平。那么我们如何增加一个自己的参数呢?其实很简单。
前面 postgresql内核开发之Oracle date类型兼容 这篇介绍了如何增加一个兼容oracle的date类型。实际上类型的修改对数据库内核的影响是比较大的,往往希望这个功能可以控制,想用时兼容oracle,不用时保持postgres功能最好,增加一个参数就能很方便的满足需求。
假如我们新增加的参数叫 oracle_style, 把它定义成全局变量:
bool oracle_style = false;
定义位置放哪无所谓,比方说我们这个定义要在gram.y中用,那么就把定义把gram.y上面,注意要放C代码段。如果增加的参数要能允许插件使用,那么在声名前要加上 PGDLLEXPORT,如 PGDLLEXPORT bool oracle_style = false;
然后在增加逻辑控制date类型行为,如下:
if(oracle_style && (0 == strcmp($1, "date")))
{
$$ = makeTypeName(pstrdup("timestamp"));
$$->typmods = list_make1(makeIntConst(0, @1));
}
oracle_style为true时才生效,否则走默认用法。
然后在guc.c中增加参数,这是bool型参数就增加到bool参数数组中,注意要在上面 extern bool oracle_style;
{
{ "oracle_style", PGC_USERSET, QUERY_TUNING_METHOD,
gettext_noop("compatible oracle."),
NULL
},
&oracle_style,
false,
NULL, NULL, NULL
},
加到 static struct config_bool ConfigureNamesBool[] 数组中。
这里第一个”oracle_sytle”定义的是我们的参数名,即可以写到postgrsql.conf中的参数名字,PGC_USERSET是参数级别,用户可以随意改,&oracle_style是参数 “oracle_sytle”实际的存值地址,通过这样的方式把两者联系起来,虽然两者大多是相同的字符串,但可以不同,false是初始值。其它有信息有大家可看看注释,对字符串、整型等参数可以参考其它定义,如新增参数有不明白可以参考一个类似的学习。
下面看看实际效果:
postgres=# show oracle_style;
oracle_style
--------------
off
(1 row)
postgres=# create table a(d1 date);
CREATE TABLE
postgres=# insert into a values(now());
INSERT 0 1
postgres=# set oracle_style = on;
SET
postgres=# show oracle_style;
oracle_style
--------------
on
(1 row)
postgres=# create table b(d1 date);
CREATE TABLE
postgres=# insert into b values(now());
INSERT 0 1
postgres=# select *from a;
d1
------------
2016-12-07
(1 row)
postgres=# select *from b;
d1
---------------------
2016-12-07 00:34:59
(1 row)
参数增加是不是很简单?这样增加的参数往往能满足绝大部分用法了,但有时也会有些奇葩需求,比方说,A用户连进来,修改某个参数值,希望这个值能立即让所以活跃连接生效,当前10个连接的10个子进程立马能更新这个参数值。postgres本身不支持这样的功能,但我们可能利用现有的功能实现一个,具体请见下篇。