mirror of
https://github.com/postgres/postgres.git
synced 2025-05-08 07:21:33 +03:00
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
This commit is contained in:
parent
5feb78ae88
commit
41306a511c
@ -1578,7 +1578,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;
|
||||||
@ -1600,7 +1600,7 @@ get_object_address_opf_member(ObjectType objtype,
|
|||||||
{
|
{
|
||||||
ObjectAddress typaddr;
|
ObjectAddress typaddr;
|
||||||
|
|
||||||
typenames[i] = strVal(lfirst(cell));
|
typenames[i] = (TypeName *) lfirst(cell);
|
||||||
typaddr = get_object_address_type(OBJECT_TYPE, cell, missing_ok);
|
typaddr = get_object_address_type(OBJECT_TYPE, cell, missing_ok);
|
||||||
typeoids[i] = typaddr.objectId;
|
typeoids[i] = typaddr.objectId;
|
||||||
if (++i >= 2)
|
if (++i >= 2)
|
||||||
@ -1627,7 +1627,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
|
||||||
@ -1656,7 +1658,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
|
||||||
@ -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.
|
* check that they're what it wants.
|
||||||
*/
|
*/
|
||||||
switch (type)
|
switch (type)
|
||||||
|
@ -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 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;
|
||||||
|
@ -62,6 +62,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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user