Commit a3eac988 authored by Alvaro Herrera's avatar Alvaro Herrera

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
parent cccbddeb
...@@ -1552,7 +1552,7 @@ get_object_address_opf_member(ObjectType objtype, ...@@ -1552,7 +1552,7 @@ get_object_address_opf_member(ObjectType objtype,
ObjectAddress address; ObjectAddress address;
ListCell *cell; ListCell *cell;
List *copy; List *copy;
char *typenames[2]; TypeName *typenames[2];
Oid typeoids[2]; Oid typeoids[2];
int membernum; int membernum;
int i; int i;
...@@ -1574,8 +1574,8 @@ get_object_address_opf_member(ObjectType objtype, ...@@ -1574,8 +1574,8 @@ get_object_address_opf_member(ObjectType objtype,
{ {
ObjectAddress typaddr; ObjectAddress typaddr;
typenames[i] = strVal(lfirst(cell)); typenames[i] = castNode(TypeName, lfirst(cell));
typaddr = get_object_address_type(OBJECT_TYPE, castNode(TypeName, lfirst(cell)), missing_ok); typaddr = get_object_address_type(OBJECT_TYPE, typenames[i], missing_ok);
typeoids[i] = typaddr.objectId; typeoids[i] = typaddr.objectId;
if (++i >= 2) if (++i >= 2)
break; break;
...@@ -1601,7 +1601,9 @@ get_object_address_opf_member(ObjectType objtype, ...@@ -1601,7 +1601,9 @@ get_object_address_opf_member(ObjectType objtype,
ereport(ERROR, ereport(ERROR,
(errcode(ERRCODE_UNDEFINED_OBJECT), (errcode(ERRCODE_UNDEFINED_OBJECT),
errmsg("operator %d (%s, %s) of %s does not exist", errmsg("operator %d (%s, %s) of %s does not exist",
membernum, typenames[0], typenames[1], membernum,
TypeNameToString(typenames[0]),
TypeNameToString(typenames[1]),
getObjectDescription(&famaddr)))); getObjectDescription(&famaddr))));
} }
else else
...@@ -1630,7 +1632,9 @@ get_object_address_opf_member(ObjectType objtype, ...@@ -1630,7 +1632,9 @@ get_object_address_opf_member(ObjectType objtype,
ereport(ERROR, ereport(ERROR,
(errcode(ERRCODE_UNDEFINED_OBJECT), (errcode(ERRCODE_UNDEFINED_OBJECT),
errmsg("function %d (%s, %s) of %s does not exist", errmsg("function %d (%s, %s) of %s does not exist",
membernum, typenames[0], typenames[1], membernum,
TypeNameToString(typenames[0]),
TypeNameToString(typenames[1]),
getObjectDescription(&famaddr)))); getObjectDescription(&famaddr))));
} }
else else
...@@ -2023,7 +2027,7 @@ pg_get_object_address(PG_FUNCTION_ARGS) ...@@ -2023,7 +2027,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. * check that they're what it wants.
*/ */
switch (type) switch (type)
...@@ -2064,7 +2068,7 @@ pg_get_object_address(PG_FUNCTION_ARGS) ...@@ -2064,7 +2068,7 @@ pg_get_object_address(PG_FUNCTION_ARGS)
} }
/* /*
* Now build the Node type that get_object_name() expects for the given * Now build the Node type that get_object_address() expects for the given
* type. * type.
*/ */
switch (type) switch (type)
......
...@@ -67,6 +67,15 @@ WARNING: error for sequence column: unsupported object type "sequence column" ...@@ -67,6 +67,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 toast table column: unsupported object type "toast table column"
WARNING: error for view column: unsupported object type "view column" WARNING: error for view column: unsupported object type "view column"
WARNING: error for materialized view column: unsupported object type "materialized 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 $$ DO $$
DECLARE DECLARE
objtype text; objtype text;
......
...@@ -64,6 +64,12 @@ BEGIN ...@@ -64,6 +64,12 @@ BEGIN
END; 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 $$ DO $$
DECLARE DECLARE
objtype text; objtype text;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment