PostgreSQL 如何打印函数调用栈信息

本文涉及的产品
RDS PostgreSQL Serverless,0.5-4RCU 50GB 3个月
推荐场景:
对影评进行热评分析
云数据库 RDS SQL Server,基础系列 2核4GB
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介:
增加了调用堆信息的输出. 可以用于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
相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
5月前
|
存储 关系型数据库 分布式数据库
PolarDB产品使用问题之如何查看PolarDB for PostgreSQL的备份信息
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
7月前
|
SQL 关系型数据库 PostgreSQL
PostgreSQL【SQL 01】根据条件更新字段值或追加信息STRPOS(string, substring)函数使用及LIKE函数对比
PostgreSQL【SQL 01】根据条件更新字段值或追加信息STRPOS(string, substring)函数使用及LIKE函数对比
168 0
|
SQL 关系型数据库 Java
PostgreSQL统计信息的几个重要视图
PostgreSQL统计信息的几个重要视图
285 1
|
SQL 缓存 监控
PostgreSQL 监控1统计进程和统计信息的解读|学习笔记(二)
快速学习PostgreSQL 监控1统计进程和统计信息的解读
434 0
PostgreSQL 监控1统计进程和统计信息的解读|学习笔记(二)
|
SQL 监控 IDE
PostgreSQL监控1统计进程和统计信息的解读|学习笔记(一)
快速学习PostgreSQL监控1统计进程和统计信息的解读
611 0
PostgreSQL监控1统计进程和统计信息的解读|学习笔记(一)
|
SQL 关系型数据库 数据库
PostgreSQL统计信息
PostgreSQL统计信息 1.数据库统计信息概览 2.pg_stat_database关键指标 postgres=# select * from pg_stat_database where datname='postgres'; -[ RECORD 1 ]-----+-----------...
4114 0
|
SQL 关系型数据库 数据库
PostgreSQL:SQL信息统计拓展
概述 pg_stat_statements是PostgreSQL数据库的一个拓展插件,用于收集数据库中的SQL运行信息,例如SQL的总执行时间,调用次数,共享内存命中率等信息。用于监控数据库的性能,是数据库性能监控的重要拓展模块pg_stat_statements 默认在PG的源码包中就有,无需下...
2103 0
|
关系型数据库 PostgreSQL 机器学习/深度学习
PostgreSQL 12: 新增 pg_partition_tree() 函数显示分区表信息
PostgreSQL 12 新增三个分区查询函数,如下: pg_partition_tree(regclass): 返回分区表详细信息,例如分区名称、上一级分区名称、是否叶子结点、层级,层级 0 表示顶层父表。
6512 0
|
SQL Java 数据库连接
SQL 中删除超出时间限制的数据,并返回删除数据信息(Mybatis+postgresql)
前言 前一阵子,接到一个活,主要内容是这样的,数据库中存在一些过期的日志(可能是一天前的数据,或者是一个月前的数据,等等),将这些数据删除掉,并且返回这些数据的信息(就是说我得知道自己到底删了哪些数据呀?)。
2073 0
|
SQL 关系型数据库 数据库
PostgreSQL技术周刊第23期:PostgreSQL统计信息
PostgreSQL(简称PG)的开发者们:云栖社区已有5000位PG开发者,发布了3000+PG文章(文章列表),沉淀了700+的PG精品问答(问答列表)。 PostgreSQL技术周刊会为大家介绍最新的PG技术与动态、预告活动、最热问答、直播教程等,欢迎大家订阅PostgreSQL技术周刊。
4539 0

相关产品

  • 云原生数据库 PolarDB
  • 云数据库 RDS PostgreSQL 版