diff options
author | Peter Eisentraut <peter@eisentraut.org> | 2022-07-05 10:26:36 +0200 |
---|---|---|
committer | Peter Eisentraut <peter@eisentraut.org> | 2022-07-05 10:26:36 +0200 |
commit | 6ffff0fd225432fe2ae4bd5abb7ff6113e255418 (patch) | |
tree | f91bd8fc1216b34cace2ac81a5aeab6ec3fb8cb8 /src/backend/commands | |
parent | e3dd7c06e62774628e102c3cd47ee46e85519de7 (diff) | |
download | postgresql-6ffff0fd225432fe2ae4bd5abb7ff6113e255418.tar.gz postgresql-6ffff0fd225432fe2ae4bd5abb7ff6113e255418.zip |
Fix pg_prepared_statements.result_types for DML statements
Amendment to 84ad713cf85aeffee5dd39f62d49a1b9e34632da: Not all
prepared statements have a result descriptor. As currently coded,
this would crash when reading pg_prepared_statements. Make those
cases return null for result_types instead. Also add a test case for
it.
Diffstat (limited to 'src/backend/commands')
-rw-r--r-- | src/backend/commands/prepare.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/src/backend/commands/prepare.c b/src/backend/commands/prepare.c index d1deb97fffb..2333aae4673 100644 --- a/src/backend/commands/prepare.c +++ b/src/backend/commands/prepare.c @@ -684,15 +684,10 @@ pg_prepared_statement(PG_FUNCTION_ARGS) while ((prep_stmt = hash_seq_search(&hash_seq)) != NULL) { TupleDesc result_desc; - Oid *result_types; Datum values[8]; bool nulls[8]; result_desc = prep_stmt->plansource->resultDesc; - result_types = (Oid *) palloc(result_desc->natts * sizeof(Oid)); - - for (int i = 0; i < result_desc->natts; i++) - result_types[i] = result_desc->attrs[i].atttypid; MemSet(nulls, 0, sizeof(nulls)); @@ -701,7 +696,20 @@ pg_prepared_statement(PG_FUNCTION_ARGS) values[2] = TimestampTzGetDatum(prep_stmt->prepare_time); values[3] = build_regtype_array(prep_stmt->plansource->param_types, prep_stmt->plansource->num_params); - values[4] = build_regtype_array(result_types, result_desc->natts); + if (result_desc) + { + Oid *result_types; + + result_types = (Oid *) palloc(result_desc->natts * sizeof(Oid)); + for (int i = 0; i < result_desc->natts; i++) + result_types[i] = result_desc->attrs[i].atttypid; + values[4] = build_regtype_array(result_types, result_desc->natts); + } + else + { + /* no result descriptor (for example, DML statement) */ + nulls[4] = true; + } values[5] = BoolGetDatum(prep_stmt->from_sql); values[6] = Int64GetDatumFast(prep_stmt->plansource->num_generic_plans); values[7] = Int64GetDatumFast(prep_stmt->plansource->num_custom_plans); |