PostgreSQL 9.4 patch, Obtaining the call stack context information in plpgsql

PostgreSQL 9.4 新增plpgsql补丁, 该补丁增加了调用堆信息的输出. 可以用于plpgsql debug等.

测试 :

pg94@db-192-168-100-216-> psql
psql (9.4devel)
Type "help" for help.

digoal=# -- access to call stack
digoal=# create or replace function inner_func(int)
digoal-# returns int as $$
digoal$# declare _context text;
digoal$# begin
digoal$#   get diagnostics _context = pg_context;
digoal$#   raise notice '***%***', _context;
digoal$#   return 2 * $1;
digoal$# end;
digoal$# $$ language plpgsql;
CREATE FUNCTION
digoal=#
digoal=# create or replace function outer_func(int)
digoal-# returns int as $$
digoal$# begin
digoal$#   return inner_func($1);
digoal$# end;
digoal$# $$ language plpgsql;
CREATE FUNCTION
digoal=#
digoal=# create or replace function outer_outer_func(int)
digoal-# returns int as $$
digoal$# begin
digoal$#   return outer_func($1);
digoal$# end;
digoal$# $$ language plpgsql;
CREATE FUNCTION
digoal=#
digoal=# select outer_outer_func(10);
NOTICE:  ***PL/pgSQL function inner_func(integer) line 4 at GET DIAGNOSTICS
PL/pgSQL function outer_func(integer) line 3 at RETURN
PL/pgSQL function outer_outer_func(integer) line 3 at RETURN***
CONTEXT:  PL/pgSQL function outer_func(integer) line 3 at RETURN
PL/pgSQL function outer_outer_func(integer) line 3 at RETURN
 outer_outer_func
------------------
               20
(1 row)

以下SQL : 

digoal$#   get diagnostics _context = pg_context;
digoal$#   raise notice '***%***', _context;

将call stack的信息打印出来如下 : 

NOTICE:  ***PL/pgSQL function inner_func(integer) line 4 at GET DIAGNOSTICS
PL/pgSQL function outer_func(integer) line 3 at RETURN
PL/pgSQL function outer_outer_func(integer) line 3 at RETURN***
CONTEXT:  PL/pgSQL function outer_func(integer) line 3 at RETURN
PL/pgSQL function outer_outer_func(integer) line 3 at RETURN

对于一些敏感函数, 如果要跟踪被调用或者间接调用的情况, 可以把stack的信息输出到表中 例如.

digoal=#  create table if not exists rec_inner_func_called (id serial8 primary key, info text, crt_time timestamp default clock_timestamp());
digoal=#
create or replace function inner_func(int)
returns int as $$
declare _context text;
begin
  get diagnostics _context = pg_context;
  insert into rec_inner_func_called(info) values (_context);
  return 2 * $1;
end;
$$ language plpgsql;
CREATE FUNCTION

digoal=# select outer_outer_func(10);
 outer_outer_func
------------------
               20
(1 row)

digoal=# select * from rec_inner_func_called;
 id |                              info                               |          crt_time
----+-----------------------------------------------------------------+----------------------------
  1 | PL/pgSQL function inner_func(integer) line 4 at GET DIAGNOSTICS+| 2013-07-26 09:19:32.588016
    | PL/pgSQL function outer_func(integer) line 3 at RETURN         +|
    | PL/pgSQL function outer_outer_func(integer) line 3 at RETURN    |
(1 row)
digoal=# select outer_outer_func(100);
 outer_outer_func
------------------
              200
(1 row)

digoal=# select outer_outer_func(100);
 outer_outer_func
------------------
              200
(1 row)

digoal=#
digoal=#
digoal=# select * from rec_inner_func_called;
 id |                              info                               |          crt_time
----+-----------------------------------------------------------------+----------------------------
  1 | PL/pgSQL function inner_func(integer) line 4 at GET DIAGNOSTICS+| 2013-07-26 09:19:32.588016
    | PL/pgSQL function outer_func(integer) line 3 at RETURN         +|
    | PL/pgSQL function outer_outer_func(integer) line 3 at RETURN    |
  2 | PL/pgSQL function inner_func(integer) line 4 at GET DIAGNOSTICS+| 2013-07-26 09:19:46.031669
    | PL/pgSQL function outer_func(integer) line 3 at RETURN         +|
    | PL/pgSQL function outer_outer_func(integer) line 3 at RETURN    |
  3 | PL/pgSQL function inner_func(integer) line 4 at GET DIAGNOSTICS+| 2013-07-26 09:20:30.25935
    | PL/pgSQL function outer_func(integer) line 3 at RETURN         +|
    | PL/pgSQL function outer_outer_func(integer) line 3 at RETURN    |
  4 | PL/pgSQL function inner_func(integer) line 4 at GET DIAGNOSTICS+| 2013-07-26 09:20:32.665713
    | PL/pgSQL function outer_func(integer) line 3 at RETURN         +|
    | PL/pgSQL function outer_outer_func(integer) line 3 at RETURN    |
(4 rows)

[参考]
1. http://www.postgresql.org/docs/devel/static/plpgsql-control-structures.html#PLPGSQL-DIAGNOSTICS

2. http://www.postgresql.org/message-id/flat/CAFj8pRChsM1zshEFi0Sy6_VHQpWQ6gr0o6d3qvt9tGG9ovnNNA@mail.gmail.com#CAFj8pRChsM1zshEFi0Sy6_VHQpWQ6gr0o6d3qvt9tGG9ovnNNA@mail.gmail.com

3. http://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=831283256796d1c20858862b568d73e505eb4a84

时间: 2024-10-11 02:19:52

PostgreSQL 9.4 patch, Obtaining the call stack context information in plpgsql的相关文章

我对struts 2.x 中的ValueStack和Stack Context不太懂,请教大家!

问题描述 Struts2.x中的经常提到,默认的范围是Stack Context ,请问这个范围是指的那个存值空间啊? 解决方案 请求开始被创建,请求结束消亡.ActionInvocation类从FilterDispatcher开始接管请求以后就创建了ValueStack了.解决方案二:默认的就是ValueStack.他是request持有的,而ValueStack中又包含ActionContext引用,然后ActionContext回过头又持有request,session之类的映像Map的引

PostgreSQL 9.4 patch : Row-Level Security

前段时间写过一篇关于使用视图来提供行级别的数据保护, 当创建视图时如果未使用security_barriers, 那么这个视图是不安全的, 攻击者可以利用低成本函数打印出隐藏的基表数据. 使用security_barriers可以规避这个问题, 但是牺牲了SQL优化器的作用, 查询将会变成seq scan, 全表扫描. 感兴趣的朋友可以参见如下BLOG :  http://blog.163.com/digoal@126/blog/static/163877040201361031431669/

异步调用中的上下文控制Tornado stack context

1. 面临的问题 这里说的"异步调用", 在形式上是指那种"调用函数"里, 需要传入一个"回调函数", 然后调用函数马上就返回. 在这种情况下, 回调函数的异常显然与调用函数的异常是不同的, 并且如果不作特殊处理, 回调函数的异常并不会影响调用函数的表现, 比如下例: # -*- coding: utf-8 -*- import tornado.ioloop IL = tornado.ioloop.IOLoop.instance() def ca

PostgreSQL integration with pg_matlab

pg_matlab是一个pg插件, 并非一般的过程语言. 使用pg_matlab创建的函数必须转换成c代码后, 编译并在数据库中使用共享库的方式调用. pg_matlab下载和安装 :  wget http://www.cybertec.at/download/pg_matlab/pg_matlab-v2.tar.gz tar -zxvf pg_matlab-v2.tar.gz mv pg_matlab /opt/soft_bak/postgresql-9.3beta2/contrib/ [ro

PostgreSQL 如何轻松搞定行驶、运动轨迹合并和切分

物联网兴起,GPS终端也越来越普及,比如车载的终端,带GPS功能的手表,手机等等.比如滴滴打车,出租车都记录了车辆的行驶的位点.位点通常会带有终端ID,经纬度,时间等信息.但是我们如何将这些点的信息合并成车辆的运行轨迹呢?并不是粗暴的聚合这么简单.因为车辆在使用过程中会遇到等红灯,停车等乘客,穿越没有GPS信号的地方(如隧道),或者终端异常,未打开GPS记录等情况.直接将行驶记录的位置信息串起来之后并不是真正的运行轨迹.那么怎么合并或切分成有价值的连续行驶的数据呢?一种较为通用的手段,通过距离,

从微信小程序 到 数据库"小程序" - 鬼知道我经历了什么

标签 PostgreSQL , 服务端编程接口 , pl language , 小程序 , 地球语言 , java , perl , python , php , tcl , R , go , JULIA 背景 微信小程序最近比较火,大概以后大家都不需要安装程序了,直接在微信中调用运行.跑在微信里的小程序类似一个虚拟机或者一个Docker容器,这是腾讯要分APP store蛋糕的节奏吗? 从技术角度来看,微信小程序带来了几个好处,不需要安装软件,用户不需要进行软件的版本管理,节省了一点点手机的空

又来勒索,有完没完 - 数据库安全指南

背景 数据库在一个企业中通常都处于非常核心的位置,数据库安全是一个非常严肃的话题. 从机房.网络.服务器.数据交换设备.操作系统.应用程序.数据库本身,数据库所处的环境非常复杂,安全隐患也非常多. 所以本文将从各个层面帮助大家理解和避免一些常见的安全隐患问题. 本文是PostgreSQL使用安全指导性的文章,涉及详细的用法或原理请参考相关链接. 如何安全的使用PostgreSQL,让用户高枕无忧呢? 可以分为如下几个方面来加固你的数据库. 一.认证安全 认证前的安全,端口暴露度的把握. Post

Unmi的Struts2学习笔记(十)

有一日,帮外公翻腾出他箱底的照片进行数字化留存,已是耄耋之年的外公端 详起那些记忆来,看到都是一同革命的热情小伙,不时感慨:唉!好多人都不在 啦! 1. <s:action .../> 可以用来在 JSP 页面直接调用 Action,用 name 指定 Action,executeResult(默认为 false) 指定是否包含那个 Action 转向视 图的内容:executeResult 会把视图的所有内容输出在标签位置. ignoreContextParams(默认为 false),是否

Unmi的Struts2学习笔记(八)

吾同人数进寺庙,却从未点过一柱香.概因精神世界里终无所寄托.既不为生 儿还是女而筹算,也无须因落下亏心事要请得神灵庇佑.想来,真要的东西,阿 弥陀佛也给不了.在物价飞涨之际,谁能给你加薪,何来民主,看看这辈子能不 能有机会参与选一回国家领导人,少说几句了,就这点言论自由了. 1. Struts 2 标签库以 OGNL 表达式为基础,对集合.对象的访问功能更强了 .Struts 2 的标签用统一的前缀,一般为 "s",不再像 Struts1 那样分 <html:.../>.&