diff --git a/src/backend/utils/cache/plancache.c b/src/backend/utils/cache/plancache.c index 0ad3e3c7366..e0a2ef7d83d 100644 --- a/src/backend/utils/cache/plancache.c +++ b/src/backend/utils/cache/plancache.c @@ -74,9 +74,11 @@ /* * We must skip "overhead" operations that involve database access when the * cached plan's subject statement is a transaction control command. + * For the convenience of postgres.c, treat empty statements as control + * commands too. */ #define IsTransactionStmtPlan(plansource) \ - ((plansource)->raw_parse_tree && \ + ((plansource)->raw_parse_tree == NULL || \ IsA((plansource)->raw_parse_tree->stmt, TransactionStmt)) /* diff --git a/src/test/regress/expected/psql.out b/src/test/regress/expected/psql.out index 9c389c8f049..79dd9808f60 100644 --- a/src/test/regress/expected/psql.out +++ b/src/test/regress/expected/psql.out @@ -215,6 +215,17 @@ SELECT 3 AS x, 'Hello', 4 AS y, true AS "dirty\name" \gdesc \g 3 | Hello | 4 | t (1 row) +-- test for server bug #17983 with empty statement in aborted transaction +set search_path = default; +begin; +bogus; +ERROR: syntax error at or near "bogus" +LINE 1: bogus; + ^ +; +\gdesc +The command has no result, or the result has no columns. +rollback; -- \gexec create temporary table gexec_test(a int, b text, c date, d float); select format('create index on gexec_test(%I)', attname) diff --git a/src/test/regress/sql/psql.sql b/src/test/regress/sql/psql.sql index 7279b984709..0120cffe807 100644 --- a/src/test/regress/sql/psql.sql +++ b/src/test/regress/sql/psql.sql @@ -112,6 +112,14 @@ SELECT 1 AS x, 'Hello', 2 AS y, true AS "dirty\name" -- all on one line SELECT 3 AS x, 'Hello', 4 AS y, true AS "dirty\name" \gdesc \g +-- test for server bug #17983 with empty statement in aborted transaction +set search_path = default; +begin; +bogus; +; +\gdesc +rollback; + -- \gexec create temporary table gexec_test(a int, b text, c date, d float);