標籤:
How to debug plpgsql with pgAdminIII
[[email protected] soft_bak]# git clone git://git.postgresql.org/git/pldebugger.git
Initialized empty Git repository in /opt/soft_bak/pldebugger/.git/
remote: Counting objects: 445, done.
remote: Compressing objects: 100% (341/341), done.
remote: Total 445 (delta 285), reused 171 (delta 104)
Receiving objects: 100% (445/445), 170.50 KiB | 54 KiB/s, done.
Resolving deltas: 100% (285/285), done.
[[email protected] soft_bak]# cd pldebugger/
[[email protected] pldebugger]# ls
dbgcomm.c Makefile pldbgapi.control pldebugger.proj plugin_debugger.def uninstall_pldbgapi.sql
dbgcomm.h pldbgapi--1.0.sql pldbgapi--unpackaged--1.0.sql plpgsql_debugger.c README.pldebugger
globalbp.h pldbgapi.c pldebugger.h plugin_debugger.c settings.projinc
[[email protected] soft_bak]# cd postgresql-9.4.5/contrib/
[[email protected] contrib]# cp -R /opt/soft_bak/pldebugger/ ./
[[email protected] contrib]# cd pldebugger/
[[email protected] pldebugger]# make
gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -O2 -fpic -I../../src/pl/plpgsql/src -I. -I. -I../../src/include -D_GNU_SOURCE -c -o plpgsql_debugger.o plpgsql_debugger.c
gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -O2 -fpic -I. -I. -I../../src/include -D_GNU_SOURCE -c -o plugin_debugger.o plugin_debugger.c
gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -O2 -fpic -I. -I. -I../../src/include -D_GNU_SOURCE -c -o dbgcomm.o dbgcomm.c
gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -O2 -fpic -I. -I. -I../../src/include -D_GNU_SOURCE -c -o pldbgapi.o pldbgapi.c
gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -O2 -fpic -shared -o plugin_debugger.so plpgsql_debugger.o plugin_debugger.o dbgcomm.o pldbgapi.o -L../../src/port -L../../src/common -Wl,--as-needed -Wl,-rpath,‘/ext4/pgdefaultgcc530/lib‘,--enable-new-dtags
[[email protected] pldebugger]# make install
/bin/mkdir -p ‘/ext4/pgdefaultgcc530/lib/postgresql‘
/bin/mkdir -p ‘/ext4/pgdefaultgcc530/share/postgresql/extension‘
/bin/mkdir -p ‘/ext4/pgdefaultgcc530/share/postgresql/extension‘
/bin/mkdir -p ‘/ext4/pgdefaultgcc530/share/doc//postgresql/extension‘
/usr/bin/install -c -m 755 plugin_debugger.so ‘/ext4/pgdefaultgcc530/lib/postgresql/plugin_debugger.so‘
/usr/bin/install -c -m 644 pldbgapi.control ‘/ext4/pgdefaultgcc530/share/postgresql/extension/‘
/usr/bin/install -c -m 644 pldbgapi--1.0.sql pldbgapi--unpackaged--1.0.sql ‘/ext4/pgdefaultgcc530/share/postgresql/extension/‘
/usr/bin/install -c -m 644 README.pldebugger ‘/ext4/pgdefaultgcc530/share/doc//postgresql/extension/‘
[[email protected] ~]# vim /ext4/pgdefaultgcc530/data/postgresql.conf
shared_preload_libraries = ‘$libdir/plugin_debugger‘
[[email protected] ~]# su - postgres
[[email protected] ~]$ cd /ext4/pgdefaultgcc530/bin/
[[email protected] bin]$ ./pg_ctl -D /ext4/pgdefaultgcc530/data/ restart
waiting for server to shut down.... done
server stopped
server starting
[[email protected] bin]$ LOG: redirecting log output to logging collector process
HINT: Future log output will appear in directory "pg_log".
[[email protected] bin]$ ./psql -h localhost -U postgres
psql (9.4.5)
Type "help" for help.
postgres=# CREATE EXTENSION pldbgapi;
CREATE EXTENSION
postgres=# CREATE TABLE accounts(owner text, balance numeric, amount numeric);
CREATE TABLE
postgres=# INSERT INTO accounts VALUES (‘Bob‘,100);
INSERT 0 1
postgres=# INSERT INTO accounts VALUES (‘Mary‘,200);
INSERT 0 1
postgres=# select * from accounts ;
owner | balance | amount
-------+---------+--------
Bob | 100 |
Mary | 200 |
(2 rows)
postgres=# CREATE OR REPLACE FUNCTION transfer(
postgres(# i_payer text,
postgres(# i_recipient text,
postgres(# i_amount numeric(15,2))
postgres-# RETURNS text
postgres-# AS
postgres-# $$
postgres$# DECLARE
postgres$# payer_bal numeric;
postgres$# BEGIN
postgres$# SELECT balance INTO payer_bal
postgres$# FROM accounts
postgres$# WHERE owner = i_payer FOR UPDATE;
postgres$# IF NOT FOUND THEN
postgres$# RETURN ‘Payer account not found‘;
postgres$# END IF;
postgres$# IF payer_bal < i_amount THEN
postgres$# RETURN ‘Not enough funds‘;
postgres$# END IF;
postgres$# UPDATE accounts
postgres$# SET balance = balance + i_amount
postgres$# WHERE owner = i_recipient;
postgres$# IF NOT FOUND THEN
postgres$# RETURN ‘Recipient does not exist‘;
postgres$# END IF;
postgres$# UPDATE accounts
postgres$# SET balance = balance - i_amount
postgres$# WHERE owner = i_payer;
postgres$# RETURN ‘OK‘;
postgres$# END;
postgres$# $$ LANGUAGE plpgsql;
CREATE FUNCTION
postgres=# \df
List of functions
Schema | Name | Result data type | Argument data types | Type
--------+-----------------------------+------------------+------------------------------------------------------------------+--------
public | pldbg_abort_target | SETOF boolean | session integer | normal
public | pldbg_attach_to_port | integer | portnumber integer | normal
public | pldbg_continue | breakpoint | session integer | normal
public | pldbg_create_listener | integer | | normal
public | pldbg_deposit_value | boolean | session integer, varname text, linenumber integer, value text | normal
public | pldbg_drop_breakpoint | boolean | session integer, func oid, linenumber integer | normal
public | pldbg_get_breakpoints | SETOF breakpoint | session integer | normal
public | pldbg_get_proxy_info | proxyinfo | | normal
public | pldbg_get_source | text | session integer, func oid | normal
public | pldbg_get_stack | SETOF frame | session integer | normal
public | pldbg_get_target_info | targetinfo | signature text, targettype "char" | normal
public | pldbg_get_variables | SETOF var | session integer | normal
public | pldbg_oid_debug | integer | functionoid oid | normal
public | pldbg_select_frame | breakpoint | session integer, frame integer | normal
public | pldbg_set_breakpoint | boolean | session integer, func oid, linenumber integer | normal
public | pldbg_set_global_breakpoint | boolean | session integer, func oid, linenumber integer, targetpid integer | normal
public | pldbg_step_into | breakpoint | session integer | normal
public | pldbg_step_over | breakpoint | session integer | normal
public | pldbg_wait_for_breakpoint | breakpoint | session integer | normal
public | pldbg_wait_for_target | integer | session integer | normal
public | plpgsql_oid_debug | integer | functionoid oid | normal
public | transfer | text | i_payer text, i_recipient text, i_amount numeric | normal
(22 rows)
Connect to PostgreSQL Server with pgAdminIII
Find to postgreSQL function to be debuged transfer
Right click the transfer function and Input the parameter to be test
How to debug PostgreSQL function with pgAdminIII