本期分享如下:
- 大小写不敏感的citext类型
- 追踪服务端错误堆栈
- 表与数组构造引用
- function、procedure、routine
一、citext数据类型
一个迁移案例里Java程序提示找不到该扩展的控制文件,截图如下:

进一步发现应用框架使用了citext扩展插件,在服务端手工编译这个插件即可正常。
PG里使用citext插件可以创建citext数据类型,citext数据类型是一个不区分大小写的文本类型,允许在进行文本比较时忽略大小写,可以在进行文本比较时更加方便和快速。
据称这个扩展插件在各大云厂商的服务里是标配。
citext的详细介绍请参考官网:https://www.postgresql.org/docs/16/citext.html
二、追踪服务端错误堆栈
排查openGauss的一个业务问题时,了解可以通过服务端设置如下参数:
backtrace_min_messages='error'
该参数会打印函数的堆栈信息到服务器日志文件中,方便数据库研发人员准确定位分析问题。
借助该参数很快定位到引起业务异常的原因,在当前最新版本的PG里并没有这样一个友好的参数。
不过当前PG里有个类似的参数backtrace_functions,需要了解内部函数名称,然后配置到该参数里,然后PG可以获取调用的函数堆栈信息,通过查看日志可以详细分析。
好消息是在开发中的PG 17引入了backtrace_on_internal_error,大概是对其了上面这个功能,参考截图如下:

三、表与数组构造及元素引用
从Oracle迁移过来的table()函数,接收数组类型,参考SQL如下:
select * from table(array);
在PG里可以使用unnest函数替换
select unnest(array);
例如:先使用array + values列表或子查询来构建数组
postgres=# select array(values('one'), ('two') );
array
-----------
{one,two}
(1 row)
再使用unnest函数转换
postgres=# select unnest(array(values('one'), ('two') ));
unnest
--------
one
two
(2 rows)
对数组元素的引用,PG里还可以使用[N:M],尤其是使用[:M],取前M个元素;或者使用[N:],取后N个元素。
select (array_agg(pid))[:2] from pg_stat_activity;
select (array_agg(pid))[2:] from pg_stat_activity;
这个小特性是从9.6版本开始支持。
四、function、procedure、routine
如下的授权语句在PG 11之前的版本执行时提示错误如下:
postgres=# grant execute on all routines in schema pg_catalog to admin;
ERROR: syntax error at or near "routines"
...
从PG 11开始,才正式引入procedure存储过程,对函数及存储过程授权即可以分开
grant execute on all functions in schema pg_catalog to admin;
grant execute on all procedures in schema pg_catalog to admin;
也可以使用routine包含:
grant execute on all routines in schema pg_catalog to admin;
routine的概念在PG里包含的范围其实更广,可参考如下描述:

关联推荐
- PostgreSQL知识问答分享-第36期
- PostgreSQL知识问答分享-第35期
- PostgreSQL知识问答分享-第34期
- PostgreSQL知识问答分享-第33期
- PostgreSQL知识问答分享-第32期
- PostgreSQL知识问答分享-第31期
- PostgreSQL知识问答分享-第30期
- PostgreSQL知识问答分享-第29期
- PostgreSQL知识问答分享-第28期
- PostgreSQL知识问答分享-第27期
如果有任何问题需要讨论交流的朋友,欢迎添加本人微信号skypkmoon。




