From 41306a511c01dd299115cf447858a00e34aebbf6 Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Thu, 16 Mar 2017 12:51:08 -0300 Subject: [PATCH] Fix ancient get_object_address_opf_member bug The original coding was trying to use a TypeName as a string Value, which doesn't work; an oversight in my commit a61fd533. Repair. Also, make sure we cover the broken case in the relevant test script. Backpatch to 9.5. Discussion: https://postgr.es/m/20170315151829.bhxsvrp75xdxhm3n@alvherre.pgsql --- src/backend/catalog/objectaddress.c | 14 +++++++++----- src/test/regress/expected/object_address.out | 9 +++++++++ src/test/regress/sql/object_address.sql | 6 ++++++ 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/backend/catalog/objectaddress.c b/src/backend/catalog/objectaddress.c index e60e8e84bc..8ccc171d03 100644 --- a/src/backend/catalog/objectaddress.c +++ b/src/backend/catalog/objectaddress.c @@ -1578,7 +1578,7 @@ get_object_address_opf_member(ObjectType objtype, ObjectAddress address; ListCell *cell; List *copy; - char *typenames[2]; + TypeName *typenames[2]; Oid typeoids[2]; int membernum; int i; @@ -1600,7 +1600,7 @@ get_object_address_opf_member(ObjectType objtype, { ObjectAddress typaddr; - typenames[i] = strVal(lfirst(cell)); + typenames[i] = (TypeName *) lfirst(cell); typaddr = get_object_address_type(OBJECT_TYPE, cell, missing_ok); typeoids[i] = typaddr.objectId; if (++i >= 2) @@ -1627,7 +1627,9 @@ get_object_address_opf_member(ObjectType objtype, ereport(ERROR, (errcode(ERRCODE_UNDEFINED_OBJECT), errmsg("operator %d (%s, %s) of %s does not exist", - membernum, typenames[0], typenames[1], + membernum, + TypeNameToString(typenames[0]), + TypeNameToString(typenames[1]), getObjectDescription(&famaddr)))); } else @@ -1656,7 +1658,9 @@ get_object_address_opf_member(ObjectType objtype, ereport(ERROR, (errcode(ERRCODE_UNDEFINED_OBJECT), errmsg("function %d (%s, %s) of %s does not exist", - membernum, typenames[0], typenames[1], + membernum, + TypeNameToString(typenames[0]), + TypeNameToString(typenames[1]), getObjectDescription(&famaddr)))); } else @@ -1993,7 +1997,7 @@ pg_get_object_address(PG_FUNCTION_ARGS) } /* - * get_object_name is pretty sensitive to the length its input lists; + * get_object_address is pretty sensitive to the length its input lists; * check that they're what it wants. */ switch (type) diff --git a/src/test/regress/expected/object_address.out b/src/test/regress/expected/object_address.out index 7e81cdd087..eb2ddc516a 100644 --- a/src/test/regress/expected/object_address.out +++ b/src/test/regress/expected/object_address.out @@ -65,6 +65,15 @@ WARNING: error for sequence column: unsupported object type "sequence column" WARNING: error for toast table column: unsupported object type "toast table column" WARNING: error for view column: unsupported object type "view column" WARNING: error for materialized view column: unsupported object type "materialized view column" +-- miscellaneous other errors +select * from pg_get_object_address('operator of access method', '{btree,integer_ops,1}', '{int4,bool}'); +ERROR: operator 1 (int4, bool) of operator family integer_ops for access method btree does not exist +select * from pg_get_object_address('operator of access method', '{btree,integer_ops,99}', '{int4,int4}'); +ERROR: operator 99 (int4, int4) of operator family integer_ops for access method btree does not exist +select * from pg_get_object_address('function of access method', '{btree,integer_ops,1}', '{int4,bool}'); +ERROR: function 1 (int4, bool) of operator family integer_ops for access method btree does not exist +select * from pg_get_object_address('function of access method', '{btree,integer_ops,99}', '{int4,int4}'); +ERROR: function 99 (int4, int4) of operator family integer_ops for access method btree does not exist DO $$ DECLARE objtype text; diff --git a/src/test/regress/sql/object_address.sql b/src/test/regress/sql/object_address.sql index 7d1f93f3b2..f65c037f71 100644 --- a/src/test/regress/sql/object_address.sql +++ b/src/test/regress/sql/object_address.sql @@ -62,6 +62,12 @@ BEGIN END; $$; +-- miscellaneous other errors +select * from pg_get_object_address('operator of access method', '{btree,integer_ops,1}', '{int4,bool}'); +select * from pg_get_object_address('operator of access method', '{btree,integer_ops,99}', '{int4,int4}'); +select * from pg_get_object_address('function of access method', '{btree,integer_ops,1}', '{int4,bool}'); +select * from pg_get_object_address('function of access method', '{btree,integer_ops,99}', '{int4,int4}'); + DO $$ DECLARE objtype text; -- 2.40.0