Skip to content

Commit 99ea961

Browse files
committed
Fix Segmentation fault during fetch command execution + add test for this case
1 parent 9ec1dde commit 99ea961

File tree

2 files changed

+33
-2
lines changed

2 files changed

+33
-2
lines changed

src/trace_session.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -666,7 +666,7 @@ TraceSessionExecutorProcessUtility(PlannedStmt *pstmt,
666666
fetch = (FetchStmt*) pstmt->utilityStmt;
667667
portal = GetPortalByName(fetch->portalname);
668668

669-
if (!PortalIsValid(portal))
669+
if (!PortalIsValid(portal) || portal->queryDesc == NULL)
670670
{
671671
CallOriginalExecutorFinish(pstmt, queryString, readOnlyTree,
672672
context, params, queryEnv,

tests/test_trace_session.py

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -568,6 +568,36 @@ def trace_session_correct_with_jit(node: PostgresNode):
568568
result = node_read_file_one_line(node, f"/pg_uprobe/trace_file.txt_{conn.pid}")
569569
validate_each_session_trace_result(json.loads(result), conn.pid)
570570

571+
def trace_session_correct_fetch_zero_desc(node: PostgresNode):
572+
with node.connect("postgres", autocommit=True) as conn:
573+
start_session_trace(conn)
574+
575+
conn.execute("CREATE FUNCTION create_temp_tab() RETURNS text \
576+
LANGUAGE plpgsql AS $$ \
577+
BEGIN \
578+
CREATE TEMP TABLE new_table (f1 float); \
579+
INSERT INTO new_table SELECT invert(0.0); \
580+
RETURN 'foo'; \
581+
END $$;")
582+
conn.execute("BEGIN")
583+
conn.execute("DECLARE ctt CURSOR FOR SELECT create_temp_tab()")
584+
conn.execute("SAVEPOINT s1")
585+
try:
586+
conn.execute("FETCH ctt")
587+
except:
588+
pass
589+
conn.execute("ROLLBACK TO s1")
590+
try:
591+
conn.execute("FETCH ctt")
592+
except:
593+
pass
594+
conn.execute("COMMIT")
595+
596+
stop_session_trace(conn)
597+
598+
result = node_read_file_one_line(node, f"/pg_uprobe/trace_file.txt_{conn.pid}")
599+
validate_each_session_trace_result(json.loads(result), conn.pid)
600+
571601
def run_tests(node: PostgresNode):
572602
test_wrapper(node, trace_current_session_trace)
573603
test_wrapper(node, trace_current_session_trace_non_sleep_buffer_locks)
@@ -585,4 +615,5 @@ def run_tests(node: PostgresNode):
585615
test_wrapper(node, trace_session_plpgsql_functions_exceptions)
586616
test_wrapper(node, trace_session_correct_executor_finish)
587617
test_wrapper(node, trace_session_fetch)
588-
test_wrapper(node, trace_session_correct_with_jit)
618+
test_wrapper(node, trace_session_correct_with_jit)
619+
test_wrapper(node, trace_session_correct_fetch_zero_desc)

0 commit comments

Comments
 (0)