Skip to content

Commit

Permalink
Fix ancient get_object_address_opf_member bug
Browse files Browse the repository at this point in the history
The original coding was trying to use a TypeName as a string Value,
which doesn't work; an oversight in my commit a61fd53.  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
  • Loading branch information
alvherre committed Mar 16, 2017
1 parent 5feb78a commit 41306a5
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 5 deletions.
14 changes: 9 additions & 5 deletions src/backend/catalog/objectaddress.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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)
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand Down
9 changes: 9 additions & 0 deletions src/test/regress/expected/object_address.out
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
6 changes: 6 additions & 0 deletions src/test/regress/sql/object_address.sql
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit 41306a5

Please sign in to comment.