Thread: [BUGS] BUG #14521: pg_attribute.attndims = 0 for array column

[BUGS] BUG #14521: pg_attribute.attndims = 0 for array column

From
krzysztof.heim@gmail.com
Date:
The following bug has been logged on the website:

Bug reference:      14521
Logged by:          Krzysztof Heim
Email address:      krzysztof.heim@gmail.com
PostgreSQL version: 9.6.1
Operating system:   Ubuntu 16.04
Description:

Hello,

I have base table A with column type integer array.
I also have table B derived from table A.

When I query pg_attribute for table A, attndims shows 1 (correct), when I do
same query for table B - attndims shows 0 for same column.

Is it a bug, or it's desired behavior (since it's a derived column).

I checked documentation, and it does not say anything about behavior in case
of derived - just says if attndims is > 0 you can assume it's array.

Thanks



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

Re: [BUGS] BUG #14521: pg_attribute.attndims = 0 for array column

From
Tom Lane
Date:
krzysztof.heim@gmail.com writes:
> I have base table A with column type integer array.
> I also have table B derived from table A.

> When I query pg_attribute for table A, attndims shows 1 (correct), when I do
> same query for table B - attndims shows 0 for same column.

> Is it a bug, or it's desired behavior (since it's a derived column).

We don't really care.  attndims is a historical leftover and should never
be relied on for any semantically significant purpose.

TBH, my inclination would be to remove the column altogether rather than
"fix" this.

            regards, tom lane


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

Re: [BUGS] BUG #14521: pg_attribute.attndims = 0 for array column

From
Tom Lane
Date:
Krzysztof Heim <krzysztof.heim@gmail.com> writes:
> If I may ask, what is then the best way of checking if column is array.

The standard way for C code is to use this macro from lsyscache.h:

#define type_is_array(typid)  (get_element_type(typid) != InvalidOid)

or depending on what you're doing, you might want these semantics:

/* type_is_array_domain accepts both plain arrays and domains over arrays */
#define type_is_array_domain(typid)  (get_base_element_type(typid) != InvalidOid)

or then again, you might just want to check if the type has nonzero
typelem --- that would be the appropriate thing if you want to see
whether the type is subscriptable.

            regards, tom lane


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