Received: from maia.hub.org (maia-3.hub.org [200.46.204.243]) by mail.postgresql.org (Postfix) with ESMTP id AE9EC1337BCC for ; Fri, 11 Mar 2011 09:18:30 -0400 (AST) Received: from mail.postgresql.org ([200.46.204.86]) by maia.hub.org (mx1.hub.org [200.46.204.243]) (amavisd-maia, port 10024) with ESMTP id 13739-05 for ; Fri, 11 Mar 2011 13:18:30 +0000 (UTC) X-Greylist: from auto-whitelisted by SQLgrey-1.7.6 Received: from wwwmaster.postgresql.org (wwwmaster.postgresql.org [217.196.146.204]) by mail.postgresql.org (Postfix) with ESMTP id EA5D51337BBC for ; Fri, 11 Mar 2011 09:18:29 -0400 (AST) Received: from wwwmaster.postgresql.org (wwwmaster.postgresql.org [217.196.146.204]) by wwwmaster.postgresql.org (8.14.3/8.14.3) with ESMTP id p2BDITBu034901 for ; Fri, 11 Mar 2011 13:18:29 GMT (envelope-from www@wwwmaster.postgresql.org) Received: (from www@localhost) by wwwmaster.postgresql.org (8.14.3/8.14.3/Submit) id p2BDITcL034900; Fri, 11 Mar 2011 13:18:29 GMT (envelope-from www) Date: Fri, 11 Mar 2011 13:18:29 GMT Message-Id: <201103111318.p2BDITcL034900@wwwmaster.postgresql.org> To: pgsql-bugs@postgresql.org Subject: BUG #5926: information schema dtd_identifier for element_types, columns, parameters views inconsistent From: "Ingmar Brouns" Content-Type: text/plain; charset=utf-8 X-Virus-Scanned: Maia Mailguard 1.0.1 X-Archive-Number: 201103/189 X-Sequence-Number: 29699 The following bug has been logged online: Bug reference: 5926 Logged by: Ingmar Brouns Email address: swingi@gmail.com PostgreSQL version: 9.0.3 Operating system: Ubuntu 9.0.4 Description: information schema dtd_identifier for element_types, columns, parameters views inconsistent Details: Hi, I am writing a function that needs to retrieve information with respect to the types of parameters of functions. I use the information schema for that. The parameters view documentation states: data_type: Data type of the parameter, if it is a built-in type, or ARRAY if it is some array (in that case, see the view element_types) So for arrays I will have to join with information_schema.element_types http://www.postgresql.org/docs/9.0/static/infoschema-element-types.html At the top op that documentation is some example code, it joins on dtd_identifier, the code does not work: create table public.test_table(a varchar array, b integer, c integer array); SELECT c.column_name, c.data_type, e.data_type AS element_type FROM information_schema.columns c LEFT JOIN information_schema.element_types e ON ((c.table_catalog, c.table_schema, c.table_name, 'TABLE', c.dtd_identifier) = (e.object_catalog, e.object_schema, e.object_name, e.object_type, e.dtd_identifier)) WHERE c.table_schema = 'public' AND c.table_name = 'test_table' ORDER BY c.ordinal_position; column_name | data_type | element_type -------------+-----------+-------------- a | ARRAY | b | integer | c | ARRAY | (3 rows) The same holds when joining with the parameters view. The reason seems to be that the dtd_identifier of the element_types view has prepended 'a's whereas the dtd_identifiers of the columns and parameter views do not: select column_name,dtd_identifier from information_schema.columns c where c.table_schema = 'public' and c.table_name = 'test_table'; column_name | dtd_identifier -------------+---------------- a | 1 b | 2 c | 3 (3 rows) select dtd_identifier from information_schema.element_types e where e.object_schema = 'public' and e.object_name = 'test_table'; dtd_identifier ---------------- a1 a3 (2 rows) The element_types view has a column 'collection_type_identifier', this column is not present in the documentation. It is defined exactly as the dtd_identifier, only then without the prepended 'a': ('a'::text || x.objdtdid::text)::information_schema.sql_identifier AS dtd_identifier x.objdtdid ::information_schema.sql_identifier AS collection_type_identifier When I modify the example code to join on this column instead, I get the expected results: SELECT c.column_name, c.data_type, e.data_type AS element_type FROM information_schema.columns c LEFT JOIN information_schema.element_types e ON ((c.table_catalog, c.table_schema, c.table_name, 'TABLE', c.dtd_identifier) = (e.object_catalog, e.object_schema, e.object_name, e.object_type, e.collection_type_identifier)) WHERE c.table_schema = 'public' AND c.table_name = 'test_table' ORDER BY c.ordinal_position; column_name | data_type | element_type -------------+-----------+------------------- a | ARRAY | character varying b | integer | c | ARRAY | integer (3 rows) Kind regards, Ingmar Brouns