Re: [HACKERS] pg_get_object_address() doesn't support composites

2017-02-19 Thread Jim Nasby

On 2/18/17 4:26 PM, Jim Nasby wrote:

On 2/17/17 9:53 PM, Alvaro Herrera wrote:

Jim Nasby wrote:

See below. ISTM that pg_get_object_address should support everything
pg_identify_object_as_address can output, no?

I'm guessing the answer here is to have pg_identify_object_as_address
complain if you ask it for something that's not mapable.

Yes, I think we should just reject the case in
pg_identify_object_as_address.


Attached patch does that, and tests for it. Note that there were some
unsupported types that were not being tested before. I've added a
comment requesting people update the test if they add more types.


While testing a view on pg_depend, I discovered this has the unfortunate 
side-effect of meaning you can no longer use 
pg_identify_object_as_address against pg_depend.ref*. Using it against 
pg_depend was already problematic though, because it throws an error on 
the pinned objects if you try and hand it classid, objid or objsubid. So 
maybe it's OK.

--
Jim Nasby, Data Architect, Blue Treble Consulting, Austin TX
Experts in Analytics, Data Architecture and PostgreSQL
Data in Trouble? Get it in Treble! http://BlueTreble.com
855-TREBLE2 (855-873-2532)


--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] pg_get_object_address() doesn't support composites

2017-02-18 Thread Jim Nasby

On 2/17/17 9:53 PM, Alvaro Herrera wrote:

Jim Nasby wrote:

See below. ISTM that pg_get_object_address should support everything
pg_identify_object_as_address can output, no?

I'm guessing the answer here is to have pg_identify_object_as_address
complain if you ask it for something that's not mapable.

Yes, I think we should just reject the case in
pg_identify_object_as_address.


Attached patch does that, and tests for it. Note that there were some 
unsupported types that were not being tested before. I've added a 
comment requesting people update the test if they add more types.

--
Jim Nasby, Data Architect, Blue Treble Consulting, Austin TX
Experts in Analytics, Data Architecture and PostgreSQL
Data in Trouble? Get it in Treble! http://BlueTreble.com
855-TREBLE2 (855-873-2532)
diff --git a/src/backend/catalog/objectaddress.c 
b/src/backend/catalog/objectaddress.c
index 2a38792ed6..27ac6ca79a 100644
--- a/src/backend/catalog/objectaddress.c
+++ b/src/backend/catalog/objectaddress.c
@@ -488,7 +488,8 @@ static const ObjectPropertyType ObjectProperty[] =
  * do not have corresponding values in the output enum.  The user of this map
  * must be careful to test for invalid values being returned.
  *
- * To ease maintenance, this follows the order of getObjectTypeDescription.
+ * To ease maintenance, this follows the order of getObjectTypeDescription. If
+ * you add anything here please update test/regress/sql/object_address.sql.
  */
 static const struct object_type_map
 {
@@ -3634,6 +3635,7 @@ pg_identify_object_as_address(PG_FUNCTION_ARGS)
Oid objid = PG_GETARG_OID(1);
int32   subobjid = PG_GETARG_INT32(2);
ObjectAddress address;
+   char   *type;
char   *identity;
List   *names;
List   *args;
@@ -3646,6 +3648,13 @@ pg_identify_object_as_address(PG_FUNCTION_ARGS)
address.objectId = objid;
address.objectSubId = subobjid;
 
+   /* Verify pg_get_object_address() would be able to do something with 
this type */
+   type = getObjectTypeDescription();
+   if (read_objtype_from_string(type) < 0)
+   ereport(ERROR,
+   (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+errmsg("unsupported object type \"%s\"", 
type)));
+
/*
 * Construct a tuple descriptor for the result row.  This must match 
this
 * function's pg_proc entry!
@@ -3661,7 +3670,7 @@ pg_identify_object_as_address(PG_FUNCTION_ARGS)
tupdesc = BlessTupleDesc(tupdesc);
 
/* object type */
-   values[0] = CStringGetTextDatum(getObjectTypeDescription());
+   values[0] = CStringGetTextDatum(type);
nulls[0] = false;
 
/* object identity */
diff --git a/src/test/regress/expected/object_address.out 
b/src/test/regress/expected/object_address.out
index ec5ada97ad..4e99068425 100644
--- a/src/test/regress/expected/object_address.out
+++ b/src/test/regress/expected/object_address.out
@@ -50,8 +50,9 @@ DO $$
 DECLARE
objtype text;
 BEGIN
-   FOR objtype IN VALUES ('toast table'), ('index column'), ('sequence 
column'),
-   ('toast table column'), ('view column'), ('materialized view 
column')
+   FOR objtype IN VALUES ('toast table'), ('composite type'), ('index 
column'),
+   ('sequence column'), ('toast table column'), ('view column'),
+   ('materialized view column'), ('composite type column')
LOOP
BEGIN
PERFORM pg_get_object_address(objtype, '{one}', '{}');
@@ -62,11 +63,52 @@ BEGIN
 END;
 $$;
 WARNING:  error for toast table: unsupported object type "toast table"
+WARNING:  error for composite type: unsupported object type "composite type"
 WARNING:  error for index column: unsupported object type "index column"
 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"
+WARNING:  error for composite type column: unsupported object type "composite 
type column"
+DO $$
+DECLARE
+   toastid oid;
+   classid oid;
+   objid oid;
+   objsubid int;
+   objtype text;
+BEGIN
+   SELECT INTO STRICT toastid
+   reltoastrelid
+   FROM pg_class
+   WHERE oid = 'addr_nsp.gentable'::regclass
+   ;
+   FOR classid, objid, objsubid, objtype IN VALUES
+   (1259, toastid, 0, 'toast table'),
+   (1259, 'addr_nsp.gencomptype'::regclass, 0, 'composite type'),
+   (1259, 'addr_nsp.gentable_pkey'::regclass, 1, 'index column'),
+   (1259, 'addr_nsp.gentable_a_seq'::regclass, 1, 'sequence 
column'),
+   (1259, toastid, 1, 

Re: [HACKERS] pg_get_object_address() doesn't support composites

2017-02-17 Thread Jim Nasby

On 2/17/17 9:53 PM, Alvaro Herrera wrote:

Another way to think about this problem is an approach Peter E suggested
not long ago, which was to change the objname/objargs representation
more completely.


Hrm, I didn't see that. What was the idea?

BTW, I do find it odd (and might eventually find it irritating) that 
some objname's squash schema and name into a single element. Not sure 
that's worth fixing at this point, though.

--
Jim Nasby, Data Architect, Blue Treble Consulting, Austin TX
Experts in Analytics, Data Architecture and PostgreSQL
Data in Trouble? Get it in Treble! http://BlueTreble.com
855-TREBLE2 (855-873-2532)


--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] pg_get_object_address() doesn't support composites

2017-02-17 Thread Alvaro Herrera
Jim Nasby wrote:
> See below. ISTM that pg_get_object_address should support everything
> pg_identify_object_as_address can output, no?
> 
> I'm guessing the answer here is to have pg_identify_object_as_address
> complain if you ask it for something that's not mapable.

Yes, I think we should just reject the case in
pg_identify_object_as_address.  Note that you can refer to the type
using it pg_type entry:

alvherre=# select * from pg_identify_object_as_address(1247,'comp'::regtype, 
0); 
 type │ object_names  │ object_args 
──┼───┼─
 type │ {public.comp} │ {}
(1 fila)

alvherre=# select * from pg_get_object_address('type', '{public.comp}', '{}');
 classid │ objid │ subobjid 
─┼───┼──
1247 │ 16400 │0
(1 fila)


Trying to accept it using its pg_class entry would require adding an
OBJECT_COMPOSITE_TYPE member to the ObjectType enum.  I considered it
back then, and eventually decided that it was not worth the trouble.


Another way to think about this problem is an approach Peter E suggested
not long ago, which was to change the objname/objargs representation
more completely.

-- 
Álvaro Herrerahttps://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services


-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


[HACKERS] pg_get_object_address() doesn't support composites

2017-02-17 Thread Jim Nasby
See below. ISTM that pg_get_object_address should support everything 
pg_identify_object_as_address can output, no?


I'm guessing the answer here is to have pg_identify_object_as_address 
complain if you ask it for something that's not mapable.



~@decina.local/5621# CREATE TYPE comp AS (a int, b int);
CREATE TYPE
~@decina.local/5621# select * from 
pg_identify_object_as_address(1259,'comp'::regclass, 0);
  type  | object_names  | object_args
+---+-
 composite type | {public,comp} | {}
(1 row)

~@decina.local/5621# select * from pg_get_object_address('composite type', 
'{public,comp}', '{}');
ERROR:  unsupported object type "composite type"
~@decina.local/5621#

--
Jim Nasby, Data Architect, Blue Treble Consulting, Austin TX
Experts in Analytics, Data Architecture and PostgreSQL
Data in Trouble? Get it in Treble! http://BlueTreble.com
855-TREBLE2 (855-873-2532)


--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers