-- wait for server establishment CREATE OR REPLACE FUNCTION wait_for_gms_debug_extension() RETURNS BOOLEAN AS $$ DECLARE extension_exists BOOLEAN; BEGIN -- 初始化变量 extension_exists := FALSE; -- 循环查询扩展是否存在 WHILE NOT extension_exists LOOP -- 查询扩展是否存在 PERFORM 1 FROM pg_extension WHERE extname = 'gms_debug'; IF FOUND THEN -- 如果扩展存在,则退出循环 extension_exists := TRUE; ELSE -- 如果扩展不存在,则等待一段时间再重试 PERFORM pg_sleep(1); -- 等待1秒 END IF; END LOOP; -- 返回扩展存在的标志 RETURN extension_exists; END; $$ LANGUAGE plpgsql; DO $$ BEGIN IF wait_for_gms_debug_extension() THEN -- 扩展存在,执行下一步操作 END IF; END $$; set search_path = gms_debugger_test1; CREATE or REPLACE FUNCTION gms_breakpoint(funcname text, lineno int) returns void as $$ declare pro_info gms_debug.program_info; bkline binary_integer; ret binary_integer; begin pro_info.name := funcname; ret := gms_debug.set_breakpoint(pro_info, lineno, bkline,1,1); RAISE NOTICE 'ret= %', ret; RAISE NOTICE 'ret= %', bkline; end; $$ LANGUAGE plpgsql; CREATE or REPLACE FUNCTION gms_continue() returns void as $$ declare run_info gms_debug.runtime_info; ret binary_integer; begin ret := gms_debug.continue(run_info, 0, 2); RAISE NOTICE 'breakpoint= %', run_info.breakpoint; RAISE NOTICE 'stackdepth= %', run_info.stackdepth; RAISE NOTICE 'line= %', run_info.line#; RAISE NOTICE 'reason= %', run_info.reason; RAISE NOTICE 'ret= %',ret; end; $$ LANGUAGE plpgsql; CREATE or REPLACE FUNCTION gms_next() returns void as $$ declare run_info gms_debug.runtime_info; ret binary_integer; begin ret := gms_debug.continue(run_info, 2, 2); RAISE NOTICE 'breakpoint= %', run_info.breakpoint; RAISE NOTICE 'stackdepth= %', run_info.stackdepth; RAISE NOTICE 'line= %', run_info.line#; RAISE NOTICE 'reason= %', run_info.reason; RAISE NOTICE 'ret= %',ret; end; $$ LANGUAGE plpgsql; CREATE or REPLACE FUNCTION gms_step() returns void as $$ declare run_info gms_debug.runtime_info; ret binary_integer; begin ret := gms_debug.continue(run_info, 4, 2); RAISE NOTICE 'breakpoint= %', run_info.breakpoint; RAISE NOTICE 'stackdepth= %', run_info.stackdepth; RAISE NOTICE 'line= %', run_info.line#; RAISE NOTICE 'reason= %', run_info.reason; RAISE NOTICE 'ret= %',ret; end; $$ LANGUAGE plpgsql; CREATE or REPLACE FUNCTION gms_info() returns void as $$ declare run_info gms_debug.runtime_info; ret binary_integer; begin ret := gms_debug.get_runtime_info(1, run_info); RAISE NOTICE 'breakpoint= %', run_info.breakpoint; RAISE NOTICE 'stackdepth= %', run_info.stackdepth; RAISE NOTICE 'line= %', run_info.line#; RAISE NOTICE 'reason= %', run_info.reason; RAISE NOTICE 'ret= %',ret; end; $$ LANGUAGE plpgsql; -- attach debug server select * from gms_debug.attach_session('datanode1-0'); attach_session ---------------- (1 row) select pg_sleep(3); pg_sleep ---------- (1 row) select gms_breakpoint('test_debug', 0); -- negative NOTICE: ret= 0 CONTEXT: referenced column: gms_breakpoint NOTICE: ret= 0 CONTEXT: referenced column: gms_breakpoint gms_breakpoint ---------------- (1 row) select gms_breakpoint('test_debug', 15); -- ok NOTICE: ret= 1 CONTEXT: referenced column: gms_breakpoint NOTICE: ret= 0 CONTEXT: referenced column: gms_breakpoint gms_breakpoint ---------------- (1 row) select gms_breakpoint('test_debug', 17); -- invalid NOTICE: ret= 2 CONTEXT: referenced column: gms_breakpoint NOTICE: ret= 0 CONTEXT: referenced column: gms_breakpoint gms_breakpoint ---------------- (1 row) select gms_breakpoint('test_debug', 22); -- ok NOTICE: ret= 3 CONTEXT: referenced column: gms_breakpoint NOTICE: ret= 0 CONTEXT: referenced column: gms_breakpoint gms_breakpoint ---------------- (1 row) select gms_breakpoint('test_debug', 15); -- ok WARNING: the given line number already contains a valid breakpoint. CONTEXT: SQL statement "CALL gms_debug.add_breakpoint(proid,line#,breakpoint#,fuzzy,iterations,sts)" PL/pgSQL function gms_debug.set_breakpoint(gms_debug.program_info,integer,integer,integer) line 8 at SQL statement SQL statement "CALL gms_debug.set_breakpoint(pro_info,lineno,bkline,1,1)" PL/pgSQL function gms_breakpoint(text,integer) line 8 at assignment referenced column: gms_breakpoint NOTICE: ret= -1 CONTEXT: referenced column: gms_breakpoint NOTICE: ret= -3 CONTEXT: referenced column: gms_breakpoint gms_breakpoint ---------------- (1 row) select gms_next(); NOTICE: breakpoint= -1 CONTEXT: referenced column: gms_next NOTICE: stackdepth= 0 CONTEXT: referenced column: gms_next NOTICE: line= 16 CONTEXT: referenced column: gms_next NOTICE: reason= 6 CONTEXT: referenced column: gms_next NOTICE: ret= 0 CONTEXT: referenced column: gms_next gms_next ---------- (1 row) select gms_next(); NOTICE: breakpoint= -1 CONTEXT: referenced column: gms_next NOTICE: stackdepth= 0 CONTEXT: referenced column: gms_next NOTICE: line= 19 CONTEXT: referenced column: gms_next NOTICE: reason= 6 CONTEXT: referenced column: gms_next NOTICE: ret= 0 CONTEXT: referenced column: gms_next gms_next ---------- (1 row) select gms_next(); NOTICE: breakpoint= -1 CONTEXT: referenced column: gms_next NOTICE: stackdepth= 0 CONTEXT: referenced column: gms_next NOTICE: line= 19 CONTEXT: referenced column: gms_next NOTICE: reason= 6 CONTEXT: referenced column: gms_next NOTICE: ret= 0 CONTEXT: referenced column: gms_next gms_next ---------- (1 row) select gms_next(); NOTICE: breakpoint= 3 CONTEXT: referenced column: gms_next NOTICE: stackdepth= 0 CONTEXT: referenced column: gms_next NOTICE: line= 22 CONTEXT: referenced column: gms_next NOTICE: reason= 2 CONTEXT: referenced column: gms_next NOTICE: ret= 0 CONTEXT: referenced column: gms_next gms_next ---------- (1 row) select gms_continue(); NOTICE: breakpoint= -1 CONTEXT: referenced column: gms_continue NOTICE: stackdepth= 0 CONTEXT: referenced column: gms_continue NOTICE: line= 46 CONTEXT: referenced column: gms_continue NOTICE: reason= 0 CONTEXT: referenced column: gms_continue NOTICE: ret= 0 CONTEXT: referenced column: gms_continue gms_continue -------------- (1 row) select gms_continue(); NOTICE: breakpoint= -1 CONTEXT: referenced column: gms_continue NOTICE: stackdepth= 0 CONTEXT: referenced column: gms_continue NOTICE: line= 46 CONTEXT: referenced column: gms_continue NOTICE: reason= 0 CONTEXT: referenced column: gms_continue NOTICE: ret= 0 CONTEXT: referenced column: gms_continue gms_continue -------------- (1 row) select gms_debug.detach_session(); connection to server was lost