Skip to content

Commit ad89a5d

Browse files
committed
Add transforms to pg_get_object_address and friends
This was missed when transforms were added by commit cac7658. Extracted from a larger patch Author: Michael Paquier
1 parent 667912a commit ad89a5d

File tree

3 files changed

+64
-6
lines changed

3 files changed

+64
-6
lines changed

src/backend/catalog/objectaddress.c

+44-1
Original file line numberDiff line numberDiff line change
@@ -634,6 +634,10 @@ static const struct object_type_map
634634
/* OCLASS_POLICY */
635635
{
636636
"policy", OBJECT_POLICY
637+
},
638+
/* OCLASS_TRANSFORM */
639+
{
640+
"transform", OBJECT_TRANSFORM
637641
}
638642
};
639643

@@ -1855,7 +1859,7 @@ pg_get_object_address(PG_FUNCTION_ARGS)
18551859
* exceptions.
18561860
*/
18571861
if (type == OBJECT_TYPE || type == OBJECT_DOMAIN || type == OBJECT_CAST ||
1858-
type == OBJECT_DOMCONSTRAINT)
1862+
type == OBJECT_TRANSFORM || type == OBJECT_DOMCONSTRAINT)
18591863
{
18601864
Datum *elems;
18611865
bool *nulls;
@@ -1946,6 +1950,7 @@ pg_get_object_address(PG_FUNCTION_ARGS)
19461950
case OBJECT_CAST:
19471951
case OBJECT_USER_MAPPING:
19481952
case OBJECT_DEFACL:
1953+
case OBJECT_TRANSFORM:
19491954
if (list_length(args) != 1)
19501955
ereport(ERROR,
19511956
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
@@ -3599,6 +3604,10 @@ getObjectTypeDescription(const ObjectAddress *object)
35993604
appendStringInfoString(&buffer, "policy");
36003605
break;
36013606

3607+
case OCLASS_TRANSFORM:
3608+
appendStringInfoString(&buffer, "transform");
3609+
break;
3610+
36023611
default:
36033612
appendStringInfo(&buffer, "unrecognized %u", object->classId);
36043613
break;
@@ -4521,6 +4530,40 @@ getObjectIdentityParts(const ObjectAddress *object,
45214530
break;
45224531
}
45234532

4533+
case OCLASS_TRANSFORM:
4534+
{
4535+
Relation transformDesc;
4536+
HeapTuple tup;
4537+
Form_pg_transform transform;
4538+
char *transformLang;
4539+
char *transformType;
4540+
4541+
transformDesc = heap_open(TransformRelationId, AccessShareLock);
4542+
4543+
tup = get_catalog_object_by_oid(transformDesc, object->objectId);
4544+
4545+
if (!HeapTupleIsValid(tup))
4546+
elog(ERROR, "could not find tuple for transform %u",
4547+
object->objectId);
4548+
4549+
transform = (Form_pg_transform) GETSTRUCT(tup);
4550+
4551+
transformType = format_type_be_qualified(transform->trftype);
4552+
transformLang = get_language_name(transform->trflang, false);
4553+
4554+
appendStringInfo(&buffer, "for %s on language %s",
4555+
transformType,
4556+
transformLang);
4557+
if (objname)
4558+
{
4559+
*objname = list_make1(transformType);
4560+
*objargs = list_make1(pstrdup(transformLang));
4561+
}
4562+
4563+
heap_close(transformDesc, AccessShareLock);
4564+
}
4565+
break;
4566+
45244567
default:
45254568
appendStringInfo(&buffer, "unrecognized object %u %u %d",
45264569
object->classId,

src/test/regress/expected/object_address.out

+14-3
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ CREATE SERVER "integer" FOREIGN DATA WRAPPER addr_fdw;
3232
CREATE USER MAPPING FOR regtest_addr_user SERVER "integer";
3333
ALTER DEFAULT PRIVILEGES FOR ROLE regtest_addr_user IN SCHEMA public GRANT ALL ON TABLES TO regtest_addr_user;
3434
ALTER DEFAULT PRIVILEGES FOR ROLE regtest_addr_user REVOKE DELETE ON TABLES FROM regtest_addr_user;
35+
CREATE TRANSFORM FOR int LANGUAGE SQL (
36+
FROM SQL WITH FUNCTION varchar_transform(internal),
37+
TO SQL WITH FUNCTION int4recv(internal));
3538
-- test some error cases
3639
SELECT pg_get_object_address('stone', '{}', '{}');
3740
ERROR: unrecognized object type "stone"
@@ -76,7 +79,7 @@ BEGIN
7679
('operator'), ('operator class'), ('operator family'), ('rule'), ('trigger'),
7780
('text search parser'), ('text search dictionary'),
7881
('text search template'), ('text search configuration'),
79-
('policy'), ('user mapping'), ('default acl'),
82+
('policy'), ('user mapping'), ('default acl'), ('transform'),
8083
('operator of access method'), ('function of access method')
8184
LOOP
8285
FOR names IN VALUES ('{eins}'), ('{addr_nsp, zwei}'), ('{eins, zwei, drei}')
@@ -261,6 +264,12 @@ WARNING: error for default acl,{addr_nsp,zwei},{}: argument list length must be
261264
WARNING: error for default acl,{addr_nsp,zwei},{integer}: unrecognized default ACL object type i
262265
WARNING: error for default acl,{eins,zwei,drei},{}: argument list length must be exactly 1
263266
WARNING: error for default acl,{eins,zwei,drei},{integer}: unrecognized default ACL object type i
267+
WARNING: error for transform,{eins},{}: argument list length must be exactly 1
268+
WARNING: error for transform,{eins},{integer}: type "eins" does not exist
269+
WARNING: error for transform,{addr_nsp,zwei},{}: name list length must be exactly 1
270+
WARNING: error for transform,{addr_nsp,zwei},{integer}: name list length must be exactly 1
271+
WARNING: error for transform,{eins,zwei,drei},{}: name list length must be exactly 1
272+
WARNING: error for transform,{eins,zwei,drei},{integer}: name list length must be exactly 1
264273
WARNING: error for operator of access method,{eins},{}: name list length must be at least 3
265274
WARNING: error for operator of access method,{eins},{integer}: name list length must be at least 3
266275
WARNING: error for operator of access method,{addr_nsp,zwei},{}: name list length must be at least 3
@@ -363,7 +372,8 @@ WITH objects (type, name, args) AS (VALUES
363372
('default acl', '{regtest_addr_user}', '{r}'),
364373
-- extension
365374
-- event trigger
366-
('policy', '{addr_nsp, gentable, genpol}', '{}')
375+
('policy', '{addr_nsp, gentable, genpol}', '{}'),
376+
('transform', '{int}', '{sql}')
367377
)
368378
SELECT (pg_identify_object(addr1.classid, addr1.objid, addr1.subobjid)).*,
369379
-- test roundtrip through pg_identify_object_as_address
@@ -411,11 +421,12 @@ SELECT (pg_identify_object(addr1.classid, addr1.objid, addr1.subobjid)).*,
411421
operator family | pg_catalog | integer_ops | pg_catalog.integer_ops USING btree | t
412422
policy | | | genpol on addr_nsp.gentable | t
413423
collation | pg_catalog | "default" | pg_catalog."default" | t
424+
transform | | | for integer on language sql | t
414425
text search dictionary | addr_nsp | addr_ts_dict | addr_nsp.addr_ts_dict | t
415426
text search parser | addr_nsp | addr_ts_prs | addr_nsp.addr_ts_prs | t
416427
text search configuration | addr_nsp | addr_ts_conf | addr_nsp.addr_ts_conf | t
417428
text search template | addr_nsp | addr_ts_temp | addr_nsp.addr_ts_temp | t
418-
(40 rows)
429+
(41 rows)
419430

420431
---
421432
--- Cleanup resources

src/test/regress/sql/object_address.sql

+6-2
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ CREATE SERVER "integer" FOREIGN DATA WRAPPER addr_fdw;
3636
CREATE USER MAPPING FOR regtest_addr_user SERVER "integer";
3737
ALTER DEFAULT PRIVILEGES FOR ROLE regtest_addr_user IN SCHEMA public GRANT ALL ON TABLES TO regtest_addr_user;
3838
ALTER DEFAULT PRIVILEGES FOR ROLE regtest_addr_user REVOKE DELETE ON TABLES FROM regtest_addr_user;
39+
CREATE TRANSFORM FOR int LANGUAGE SQL (
40+
FROM SQL WITH FUNCTION varchar_transform(internal),
41+
TO SQL WITH FUNCTION int4recv(internal));
3942

4043
-- test some error cases
4144
SELECT pg_get_object_address('stone', '{}', '{}');
@@ -74,7 +77,7 @@ BEGIN
7477
('operator'), ('operator class'), ('operator family'), ('rule'), ('trigger'),
7578
('text search parser'), ('text search dictionary'),
7679
('text search template'), ('text search configuration'),
77-
('policy'), ('user mapping'), ('default acl'),
80+
('policy'), ('user mapping'), ('default acl'), ('transform'),
7881
('operator of access method'), ('function of access method')
7982
LOOP
8083
FOR names IN VALUES ('{eins}'), ('{addr_nsp, zwei}'), ('{eins, zwei, drei}')
@@ -162,7 +165,8 @@ WITH objects (type, name, args) AS (VALUES
162165
('default acl', '{regtest_addr_user}', '{r}'),
163166
-- extension
164167
-- event trigger
165-
('policy', '{addr_nsp, gentable, genpol}', '{}')
168+
('policy', '{addr_nsp, gentable, genpol}', '{}'),
169+
('transform', '{int}', '{sql}')
166170
)
167171
SELECT (pg_identify_object(addr1.classid, addr1.objid, addr1.subobjid)).*,
168172
-- test roundtrip through pg_identify_object_as_address

0 commit comments

Comments
 (0)