387 lines
9.9 KiB
PL/PgSQL
387 lines
9.9 KiB
PL/PgSQL
/* contrib/gms_debug/gms_debug--1.0.sql */
|
|
|
|
-- complain if script is sourced in psql, rather than via CREATE EXTENSION
|
|
\echo Use "CREATE EXTENSION gms_debug" to load this file. \quit
|
|
|
|
-- gms_debug package begin
|
|
set behavior_compat_options='proc_outparam_override';
|
|
CREATE SCHEMA gms_debug;
|
|
GRANT USAGE ON SCHEMA gms_debug TO PUBLIC;
|
|
|
|
CREATE TYPE gms_debug.program_info AS (
|
|
namespace oid,
|
|
name varchar2(30),
|
|
owner varchar2(30),
|
|
dblink varchar2(30),
|
|
line# binary_integer,
|
|
libunittype binary_integer,
|
|
entrypointname varchar2(30));
|
|
|
|
CREATE TYPE gms_debug.runtime_info AS (
|
|
line# binary_integer,
|
|
terminated binary_integer,
|
|
breakpoint binary_integer,
|
|
stackdepth binary_integer,
|
|
interpreterdepth binary_integer,
|
|
reason binary_integer,
|
|
program gms_debug.program_info);
|
|
|
|
CREATE or REPLACE FUNCTION gms_debug.initialize(
|
|
IN debug_session_id varchar2(30) DEFAULT '' ,
|
|
IN diagnostics binary_integer DEFAULT 0)
|
|
returns varchar2
|
|
AS 'MODULE_PATHNAME', 'gms_debug_initialize'
|
|
LANGUAGE C VOLATILE NOT FENCED;
|
|
|
|
CREATE or REPLACE FUNCTION gms_debug.debug_on(
|
|
IN no_client_side_plsql_engine BOOLEAN DEFAULT TRUE ,
|
|
IN immediate BOOLEAN DEFAULT FALSE)
|
|
returns void AS $$
|
|
BEGIN
|
|
return;
|
|
END;
|
|
$$ language plpgsql IMMUTABLE;
|
|
|
|
CREATE or REPLACE FUNCTION gms_debug.attach_session(
|
|
IN debug_session_id varchar2(30) ,
|
|
IN diagnostics binary_integer DEFAULT 0)
|
|
returns void
|
|
AS 'MODULE_PATHNAME', 'gms_debug_attach_session'
|
|
LANGUAGE C VOLATILE NOT FENCED;
|
|
|
|
CREATE or REPLACE FUNCTION gms_debug.add_breakpoint(
|
|
IN proid oid,
|
|
IN line# binary_integer ,
|
|
OUT breakpoint# binary_integer,
|
|
IN fuzzy binary_integer,
|
|
IN iterations binary_integer,
|
|
OUT sts binary_integer)
|
|
AS 'MODULE_PATHNAME', 'gms_debug_set_breakpoint'
|
|
LANGUAGE C VOLATILE NOT FENCED;
|
|
|
|
CREATE or REPLACE FUNCTION gms_debug.set_breakpoint(
|
|
IN program gms_debug.program_info,
|
|
IN line# binary_integer,
|
|
OUT breakpoint# binary_integer,
|
|
IN fuzzy binary_integer,
|
|
IN iterations binary_integer)
|
|
returns binary_integer AS $$
|
|
DECLARE
|
|
proid oid;
|
|
sts binary_integer;
|
|
BEGIN
|
|
select oid from pg_proc where proname = program.name limit 1 into proid;
|
|
set behavior_compat_options='';
|
|
gms_debug.add_breakpoint(proid, line#, breakpoint#, fuzzy, iterations, sts);
|
|
set behavior_compat_options='proc_outparam_override';
|
|
return sts;
|
|
END;
|
|
$$ language plpgsql;
|
|
|
|
CREATE or REPLACE FUNCTION gms_debug.call_continue(
|
|
IN breakflags binary_integer ,
|
|
IN info_requested binary_integer DEFAULT NULL,
|
|
OUT err_code binary_integer,
|
|
OUT run_line binary_integer,
|
|
OUT run_breakpoint binary_integer,
|
|
OUT run_stackdepth binary_integer,
|
|
OUT run_reason binary_integer,
|
|
OUT pro_namespace oid,
|
|
OUT pro_name varchar2(30),
|
|
OUT pro_owner oid)
|
|
AS 'MODULE_PATHNAME', 'gms_debug_continue'
|
|
LANGUAGE C VOLATILE NOT FENCED;
|
|
|
|
CREATE or REPLACE FUNCTION gms_debug.continue(
|
|
OUT run_info gms_debug.runtime_info ,
|
|
IN breakflags binary_integer ,
|
|
IN info_requested binary_integer DEFAULT NULL)
|
|
returns binary_integer AS $$
|
|
DECLARE
|
|
err_code binary_integer;
|
|
run_line binary_integer;
|
|
run_terminated binary_integer;
|
|
run_breakpoint binary_integer;
|
|
run_stackdepth binary_integer;
|
|
run_interpreterdepth binary_integer;
|
|
run_reason binary_integer;
|
|
pro_namespace oid;
|
|
pro_name varchar2(30);
|
|
pro_owner oid;
|
|
pro_ownername varchar2(30);
|
|
pro gms_debug.program_info;
|
|
BEGIN
|
|
set behavior_compat_options='';
|
|
gms_debug.call_continue(breakflags, info_requested, err_code, run_line,
|
|
run_breakpoint, run_stackdepth, run_reason, pro_namespace,
|
|
pro_name, pro_owner);
|
|
set behavior_compat_options='proc_outparam_override';
|
|
select usename from pg_user where usesysid = pro_owner into pro_ownername;
|
|
run_info.line# = run_line;
|
|
run_info.terminated = 0;
|
|
run_info.breakpoint = run_breakpoint;
|
|
run_info.stackdepth = run_stackdepth;
|
|
run_info.interpreterdepth = -1;
|
|
run_info.reason = run_reason;
|
|
pro.namespace = pro_namespace;
|
|
pro.name = pro_name;
|
|
pro.owner = pro_ownername;
|
|
pro.dblink = '';
|
|
pro.line# = run_line;
|
|
pro.libunittype = 0;
|
|
pro.entrypointname = '';
|
|
run_info.program = pro;
|
|
return err_code;
|
|
END;
|
|
$$ language plpgsql;
|
|
|
|
CREATE or REPLACE FUNCTION gms_debug.get_debug_runtime_info(
|
|
IN info_requested binary_integer,
|
|
OUT err_code binary_integer,
|
|
OUT run_line binary_integer,
|
|
OUT run_breakpoint binary_integer,
|
|
OUT run_stackdepth binary_integer,
|
|
OUT run_reason binary_integer,
|
|
OUT pro_namespace oid,
|
|
OUT pro_name varchar2(30),
|
|
OUT pro_owner oid)
|
|
AS 'MODULE_PATHNAME', 'gms_debug_get_runtime_info'
|
|
LANGUAGE C VOLATILE NOT FENCED;
|
|
|
|
CREATE or REPLACE FUNCTION gms_debug.get_runtime_info(
|
|
IN info_requested binary_integer,
|
|
OUT run_info gms_debug.runtime_info)
|
|
returns binary_integer AS $$
|
|
DECLARE
|
|
err_code binary_integer;
|
|
run_line binary_integer;
|
|
run_terminated binary_integer;
|
|
run_breakpoint binary_integer;
|
|
run_stackdepth binary_integer;
|
|
run_interpreterdepth binary_integer;
|
|
run_reason binary_integer;
|
|
pro_namespace oid;
|
|
pro_name varchar2(30);
|
|
pro_owner oid;
|
|
pro_ownername varchar2(30);
|
|
pro gms_debug.program_info;
|
|
BEGIN
|
|
set behavior_compat_options='';
|
|
gms_debug.get_debug_runtime_info(info_requested, err_code, run_line,
|
|
run_breakpoint, run_stackdepth, run_reason, pro_namespace,
|
|
pro_name, pro_owner);
|
|
set behavior_compat_options='proc_outparam_override';
|
|
select usename from pg_user where usesysid = pro_owner into pro_ownername;
|
|
run_info.line# = run_line;
|
|
run_info.terminated = 0;
|
|
run_info.breakpoint = run_breakpoint;
|
|
run_info.stackdepth = run_stackdepth;
|
|
run_info.interpreterdepth = -1;
|
|
run_info.reason = run_reason;
|
|
pro.namespace = pro_namespace;
|
|
pro.name = pro_name;
|
|
pro.owner = pro_ownername;
|
|
pro.dblink = '';
|
|
pro.line# = run_line;
|
|
pro.libunittype = 0;
|
|
pro.entrypointname = '';
|
|
run_info.program = pro;
|
|
return err_code;
|
|
END;
|
|
$$ language plpgsql;
|
|
|
|
CREATE or REPLACE FUNCTION gms_debug.debug_off()
|
|
returns void
|
|
AS 'MODULE_PATHNAME', 'gms_debug_off'
|
|
LANGUAGE C VOLATILE NOT FENCED;
|
|
|
|
CREATE or REPLACE FUNCTION gms_debug.detach_session()
|
|
returns void
|
|
AS 'MODULE_PATHNAME', 'gms_debug_detach_session'
|
|
LANGUAGE C VOLATILE NOT FENCED;
|
|
|
|
CREATE or REPLACE PROCEDURE gms_debug.probe_version(OUT major binary_integer, OUT minor binary_integer)
|
|
AS
|
|
BEGIN
|
|
major := 1;
|
|
minor := 0;
|
|
END;
|
|
|
|
CREATE FUNCTION gms_debug.success() RETURNS int AS $$
|
|
BEGIN
|
|
return 0;
|
|
END;
|
|
$$ language plpgsql IMMUTABLE;
|
|
|
|
CREATE FUNCTION gms_debug.error_illegal_line() RETURNS int AS $$
|
|
BEGIN
|
|
return -1;
|
|
END;
|
|
$$ language plpgsql IMMUTABLE;
|
|
|
|
CREATE FUNCTION gms_debug.error_bad_handle() RETURNS int AS $$
|
|
BEGIN
|
|
return -2;
|
|
END;
|
|
$$ language plpgsql IMMUTABLE;
|
|
|
|
CREATE FUNCTION gms_debug.error_already_exists() RETURNS int AS $$
|
|
BEGIN
|
|
return -3;
|
|
END;
|
|
$$ language plpgsql IMMUTABLE;
|
|
|
|
CREATE FUNCTION gms_debug.error_communication() RETURNS int AS $$
|
|
BEGIN
|
|
return -4;
|
|
END;
|
|
$$ language plpgsql IMMUTABLE;
|
|
|
|
CREATE FUNCTION gms_debug.info_getstackdepth() RETURNS int AS $$
|
|
BEGIN
|
|
return 0;
|
|
END;
|
|
$$ language plpgsql IMMUTABLE;
|
|
|
|
CREATE FUNCTION gms_debug.info_getbreakpoint() RETURNS int AS $$
|
|
BEGIN
|
|
return 2;
|
|
END;
|
|
$$ language plpgsql IMMUTABLE;
|
|
|
|
CREATE FUNCTION gms_debug.info_getlineinfo() RETURNS int AS $$
|
|
BEGIN
|
|
return 4;
|
|
END;
|
|
$$ language plpgsql IMMUTABLE;
|
|
|
|
CREATE FUNCTION gms_debug.break_next_line() RETURNS int AS $$
|
|
BEGIN
|
|
return 2;
|
|
END;
|
|
$$ language plpgsql IMMUTABLE;
|
|
|
|
CREATE FUNCTION gms_debug.break_any_call() RETURNS int AS $$
|
|
BEGIN
|
|
return 4;
|
|
END;
|
|
$$ language plpgsql IMMUTABLE;
|
|
|
|
CREATE FUNCTION gms_debug.break_any_return() RETURNS int AS $$
|
|
BEGIN
|
|
return 8;
|
|
END;
|
|
$$ language plpgsql IMMUTABLE;
|
|
|
|
CREATE FUNCTION gms_debug.break_return() RETURNS int AS $$
|
|
BEGIN
|
|
return 16;
|
|
END;
|
|
$$ language plpgsql IMMUTABLE;
|
|
|
|
CREATE FUNCTION gms_debug.break_exception() RETURNS int AS $$
|
|
BEGIN
|
|
return 32;
|
|
END;
|
|
$$ language plpgsql IMMUTABLE;
|
|
|
|
CREATE FUNCTION gms_debug.break_handler() RETURNS int AS $$
|
|
BEGIN
|
|
return 64;
|
|
END;
|
|
$$ language plpgsql IMMUTABLE;
|
|
|
|
CREATE FUNCTION gms_debug.abort_execution() RETURNS int AS $$
|
|
BEGIN
|
|
return 128;
|
|
END;
|
|
$$ language plpgsql IMMUTABLE;
|
|
|
|
CREATE FUNCTION gms_debug.reason_none() RETURNS int AS $$
|
|
BEGIN
|
|
return 0;
|
|
END;
|
|
$$ language plpgsql IMMUTABLE;
|
|
|
|
CREATE FUNCTION gms_debug.reason_breakpoint() RETURNS int AS $$
|
|
BEGIN
|
|
return 1;
|
|
END;
|
|
$$ language plpgsql IMMUTABLE;
|
|
|
|
CREATE FUNCTION gms_debug.reason_enter() RETURNS int AS $$
|
|
BEGIN
|
|
return 2;
|
|
END;
|
|
$$ language plpgsql IMMUTABLE;
|
|
|
|
CREATE FUNCTION gms_debug.reason_return() RETURNS int AS $$
|
|
BEGIN
|
|
return 3;
|
|
END;
|
|
$$ language plpgsql IMMUTABLE;
|
|
|
|
CREATE FUNCTION gms_debug.reason_finish() RETURNS int AS $$
|
|
BEGIN
|
|
return 4;
|
|
END;
|
|
$$ language plpgsql IMMUTABLE;
|
|
|
|
CREATE FUNCTION gms_debug.reason_line() RETURNS int AS $$
|
|
BEGIN
|
|
return 5;
|
|
END;
|
|
$$ language plpgsql IMMUTABLE;
|
|
|
|
CREATE FUNCTION gms_debug.reason_interrupt() RETURNS int AS $$
|
|
BEGIN
|
|
return 6;
|
|
END;
|
|
$$ language plpgsql IMMUTABLE;
|
|
|
|
CREATE FUNCTION gms_debug.reason_exception() RETURNS int AS $$
|
|
BEGIN
|
|
return 7;
|
|
END;
|
|
$$ language plpgsql IMMUTABLE;
|
|
|
|
CREATE FUNCTION gms_debug.reason_exit() RETURNS int AS $$
|
|
BEGIN
|
|
return 8;
|
|
END;
|
|
$$ language plpgsql IMMUTABLE;
|
|
|
|
CREATE FUNCTION gms_debug.reason_knl_exit() RETURNS int AS $$
|
|
BEGIN
|
|
return 9;
|
|
END;
|
|
$$ language plpgsql IMMUTABLE;
|
|
|
|
CREATE FUNCTION gms_debug.reason_handler() RETURNS int AS $$
|
|
BEGIN
|
|
return 10;
|
|
END;
|
|
$$ language plpgsql IMMUTABLE;
|
|
|
|
CREATE FUNCTION gms_debug.reason_timeout() RETURNS int AS $$
|
|
BEGIN
|
|
return 11;
|
|
END;
|
|
$$ language plpgsql IMMUTABLE;
|
|
|
|
CREATE FUNCTION gms_debug.reason_instantiate() RETURNS int AS $$
|
|
BEGIN
|
|
return 12;
|
|
END;
|
|
$$ language plpgsql IMMUTABLE;
|
|
|
|
CREATE FUNCTION gms_debug.reason_abort() RETURNS int AS $$
|
|
BEGIN
|
|
return 13;
|
|
END;
|
|
$$ language plpgsql IMMUTABLE;
|
|
|
|
|
|
|
|
|
|
-- gms_debug package end |