-
Notifications
You must be signed in to change notification settings - Fork 19
/
pldbgapi--1.1.sql
155 lines (135 loc) · 7.29 KB
/
pldbgapi--1.1.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
-- pldbgapi--1.1.sql
-- This script creates the data types and functions defined by the PL debugger API
--
-- Copyright (c) 2004-2024 EnterpriseDB Corporation. All Rights Reserved.
--
-- Licensed under the Artistic License v2.0, see
-- https://opensource.org/licenses/artistic-license-2.0
-- for full details
\echo Installing pldebugger as unpackaged objects. If you are using PostgreSQL
\echo version 9.1 or above, use "CREATE EXTENSION pldbgapi" instead.
CREATE TYPE breakpoint AS ( func OID, linenumber INTEGER, targetName TEXT );
CREATE TYPE frame AS ( level INT, targetname TEXT, func OID, linenumber INTEGER, args TEXT );
CREATE TYPE var AS ( name TEXT, varClass char, lineNumber INTEGER, isUnique bool, isConst bool, isNotNull bool, dtype OID, value TEXT );
CREATE TYPE proxyInfo AS ( serverVersionStr TEXT, serverVersionNum INT, proxyAPIVer INT, serverProcessID INT );
CREATE FUNCTION pldbg_oid_debug( functionOID OID ) RETURNS INTEGER AS '$libdir/plugin_debugger' LANGUAGE C STRICT;
-- for backwards-compatibility
CREATE FUNCTION plpgsql_oid_debug( functionOID OID ) RETURNS INTEGER AS $$ SELECT pldbg_oid_debug($1) $$ LANGUAGE sql STRICT;
CREATE FUNCTION pldbg_abort_target( session INTEGER ) RETURNS SETOF boolean AS '$libdir/plugin_debugger' LANGUAGE C STRICT;
CREATE FUNCTION pldbg_attach_to_port( portNumber INTEGER ) RETURNS INTEGER AS '$libdir/plugin_debugger' LANGUAGE C STRICT;
CREATE FUNCTION pldbg_continue( session INTEGER ) RETURNS breakpoint AS '$libdir/plugin_debugger' LANGUAGE C STRICT;
CREATE FUNCTION pldbg_create_listener() RETURNS INTEGER AS '$libdir/plugin_debugger' LANGUAGE C STRICT;
CREATE FUNCTION pldbg_deposit_value( session INTEGER, varName TEXT, lineNumber INTEGER, value TEXT ) RETURNS boolean AS '$libdir/plugin_debugger' LANGUAGE C STRICT;
CREATE FUNCTION pldbg_drop_breakpoint( session INTEGER, func OID, linenumber INTEGER ) RETURNS boolean AS '$libdir/plugin_debugger' LANGUAGE C STRICT;
CREATE FUNCTION pldbg_get_breakpoints( session INTEGER ) RETURNS SETOF breakpoint AS '$libdir/plugin_debugger' LANGUAGE C STRICT;
CREATE FUNCTION pldbg_get_source( session INTEGER, func OID ) RETURNS TEXT AS '$libdir/plugin_debugger' LANGUAGE C STRICT;
CREATE FUNCTION pldbg_get_stack( session INTEGER ) RETURNS SETOF frame AS '$libdir/plugin_debugger' LANGUAGE C STRICT;
CREATE FUNCTION pldbg_get_proxy_info( ) RETURNS proxyInfo AS '$libdir/plugin_debugger' LANGUAGE C STRICT;
CREATE FUNCTION pldbg_get_variables( session INTEGER ) RETURNS SETOF var AS '$libdir/plugin_debugger' LANGUAGE C STRICT;
CREATE FUNCTION pldbg_select_frame( session INTEGER, frame INTEGER ) RETURNS breakpoint AS '$libdir/plugin_debugger' LANGUAGE C STRICT;
CREATE FUNCTION pldbg_set_breakpoint( session INTEGER, func OID, linenumber INTEGER ) RETURNS boolean AS '$libdir/plugin_debugger' LANGUAGE C STRICT;
CREATE FUNCTION pldbg_set_global_breakpoint( session INTEGER, func OID, linenumber INTEGER, targetPID INTEGER ) RETURNS boolean AS '$libdir/plugin_debugger' LANGUAGE C;
CREATE FUNCTION pldbg_step_into( session INTEGER ) RETURNS breakpoint AS '$libdir/plugin_debugger' LANGUAGE C STRICT;
CREATE FUNCTION pldbg_step_over( session INTEGER ) RETURNS breakpoint AS '$libdir/plugin_debugger' LANGUAGE C STRICT;
CREATE FUNCTION pldbg_wait_for_breakpoint( session INTEGER ) RETURNS breakpoint AS '$libdir/plugin_debugger' LANGUAGE C STRICT;
CREATE FUNCTION pldbg_wait_for_target( session INTEGER ) RETURNS INTEGER AS '$libdir/plugin_debugger' LANGUAGE C STRICT;
/*
* pldbg_get_target_info() function can be used to return information about
* a function.
*
* Deprecated. This is used by the pgAdmin debugger GUI, but new applications
* should just query the catalogs directly.
*/
CREATE TYPE targetinfo AS ( target OID, schema OID, nargs INT, argTypes oidvector, targetName NAME, argModes "char"[], argNames TEXT[], targetLang OID, fqName TEXT, returnsSet BOOL, returnType OID,
-- The following columns are only needed when running in an EnterpriseDB
-- server. On PostgreSQL, we return just dummy values for them.
--
-- 'isFunc' and 'pkg' only make sense on EnterpriseDB. 'isfunc' is true
-- if the function is a regular function, not a stored procedure or a
-- function that was created implictly to back a trigger created with the
-- Oracle-compatible CREATE TRIGGER syntax. If the function belongs to a
-- package, 'pkg' is the package's OID, or 0 otherwise.
--
-- 'argDefVals' is a representation of the function's argument DEFAULTs.
-- That would be nice to have on PostgreSQL as well. Unfortunately our
-- current implementation relies on an EDB-only function to get that
-- information, so we cannot just use it as is. TODO: rewrite that using
-- pg_get_expr(pg_proc.proargdefaults).
isFunc BOOL,
pkg OID,
argDefVals TEXT[]
);
-- Create the pldbg_get_target_info() function. We use an inline code block
-- so that we can check and create it slightly differently if running on
-- an EnterpriseDB server.
DO $do$
declare
isedb bool;
createstmt text;
begin
isedb = (SELECT version() LIKE '%EnterpriseDB%');
createstmt := $create_stmt$
CREATE FUNCTION pldbg_get_target_info(signature text, targetType "char") returns targetinfo AS $$
SELECT p.oid AS target,
pronamespace AS schema,
pronargs::int4 AS nargs,
-- The returned argtypes column is of type oidvector, but unlike
-- proargtypes, it's supposed to include OUT params. So we
-- essentially have to return proallargtypes, converted to an
-- oidvector. There is no oid[] -> oidvector cast, so we have to
-- do it via text.
CASE WHEN proallargtypes IS NOT NULL THEN
translate(proallargtypes::text, ',{}', ' ')::oidvector
ELSE
proargtypes
END AS argtypes,
proname AS targetname,
proargmodes AS argmodes,
proargnames AS proargnames,
prolang AS targetlang,
quote_ident(nspname) || '.' || quote_ident(proname) AS fqname,
proretset AS returnsset,
prorettype AS returntype,
$create_stmt$;
-- Add the three EDB-columns to the query (as dummies if we're installing
-- to PostgreSQL)
IF isedb THEN
createstmt := createstmt ||
$create_stmt$
p.protype='0' AS isfunc,
CASE WHEN n.nspparent <> 0 THEN n.oid ELSE 0 END AS pkg,
edb_get_func_defvals(p.oid) AS argdefvals
$create_stmt$;
ELSE
createstmt := createstmt ||
$create_stmt$
't'::bool AS isfunc,
0::oid AS pkg,
NULL::text[] AS argdefvals
$create_stmt$;
END IF;
-- End of conditional part
createstmt := createstmt ||
$create_stmt$
FROM pg_proc p, pg_namespace n
WHERE p.pronamespace = n.oid
AND p.oid = $1::oid
-- We used to support querying by function name or trigger name/oid as well,
-- but that was never used in the client, so the support for that has been
-- removed. The targeType argument remains as a legacy of that. You're
-- expected to pass 'o' as target type, but it doesn't do anything.
AND $2 = 'o'
$$ LANGUAGE SQL;
$create_stmt$;
execute createstmt;
-- Add a couple of EDB specific functions
IF isedb THEN
CREATE FUNCTION edb_oid_debug(functionOID oid) RETURNS integer AS $$
select pldbg_oid_debug($1);
$$ LANGUAGE SQL;
CREATE FUNCTION pldbg_get_pkg_cons(packageOID oid) RETURNS oid AS $$
select oid from pg_proc where pronamespace=$1 and proname='cons';
$$ LANGUAGE SQL;
END IF;
end;
$do$;