44 *
55 * Copyright (c) 2003-2005, PostgreSQL Global Development Group
66 *
7- * $PostgreSQL: pgsql/src/backend/catalog/information_schema.sql,v 1.27 2005/03/29 00:16:56 tgl Exp $
7+ * $PostgreSQL: pgsql/src/backend/catalog/information_schema.sql,v 1.28 2005/05/31 03:36:24 tgl Exp $
88 */
99
1010/*
@@ -30,22 +30,14 @@ SET search_path TO information_schema, public;
3030 * A few supporting functions first ...
3131 */
3232
33- /* Expand an oidvector or smallint[] into a set with integers 1..N */
34- CREATE TYPE _pg_expandoidvector_type AS (o oid , n int );
35-
36- CREATE FUNCTION _pg_expandoidvector (oidvector)
37- RETURNS SETOF _pg_expandoidvector_type
33+ /* Expand any 1-D array into a set with integers 1..N */
34+ CREATE FUNCTION _pg_expandarray (IN anyarray, OUT x anyelement, OUT n int )
35+ RETURNS SETOF RECORD
3836 LANGUAGE sql STRICT IMMUTABLE
39- AS ' select $1[s], s+1
40- from generate_series(0,array_upper($1,1),1) as g(s)' ;
41-
42- CREATE TYPE _pg_expandsmallint_type AS (i smallint , n int );
43-
44- CREATE FUNCTION _pg_expandsmallint (smallint [])
45- RETURNS SETOF _pg_expandsmallint_type
46- LANGUAGE sql STRICT IMMUTABLE
47- AS ' select $1[s], s
48- from generate_series(1,array_upper($1,1),1) as g(s)' ;
37+ AS ' select $1[s], s - pg_catalog.array_lower($1,1) + 1
38+ from pg_catalog.generate_series(pg_catalog.array_lower($1,1),
39+ pg_catalog.array_upper($1,1),
40+ 1) as g(s)' ;
4941
5042CREATE FUNCTION _pg_keyissubset (smallint [], smallint []) RETURNS boolean
5143 LANGUAGE sql
@@ -727,7 +719,7 @@ CREATE VIEW key_column_usage AS
727719 FROM pg_attribute a,
728720 (SELECT r .oid , nc .nspname AS nc_nspname, c .conname ,
729721 nr .nspname AS nr_nspname, r .relname ,
730- _pg_expandsmallint (c .conkey ) AS x
722+ _pg_expandarray (c .conkey ) AS x
731723 FROM pg_namespace nr, pg_class r, pg_namespace nc,
732724 pg_constraint c, pg_user u
733725 WHERE nr .oid = r .relnamespace
@@ -738,7 +730,7 @@ CREATE VIEW key_column_usage AS
738730 AND r .relowner = u .usesysid
739731 AND u .usename = current_user ) AS ss
740732 WHERE ss .oid = a .attrelid
741- AND a .attnum = (ss .x ).i
733+ AND a .attnum = (ss .x ).x
742734 AND NOT a .attisdropped ;
743735
744736GRANT SELECT ON key_column_usage TO PUBLIC;
@@ -754,7 +746,12 @@ CREATE VIEW parameters AS
754746 CAST(n_nspname AS sql_identifier) AS specific_schema,
755747 CAST(proname || ' _' || CAST(p_oid AS text ) AS sql_identifier) AS specific_name,
756748 CAST((ss .x ).n AS cardinal_number) AS ordinal_position,
757- CAST(' IN' AS character_data) AS parameter_mode,
749+ CAST(
750+ CASE WHEN proargmodes IS NULL THEN ' IN'
751+ WHEN proargmodes[(ss .x ).n] = ' i' THEN ' IN'
752+ WHEN proargmodes[(ss .x ).n] = ' o' THEN ' OUT'
753+ WHEN proargmodes[(ss .x ).n] = ' b' THEN ' INOUT'
754+ END AS character_data) AS parameter_mode,
758755 CAST(' NO' AS character_data) AS is_result,
759756 CAST(' NO' AS character_data) AS as_locator,
760757 CAST(NULLIF(proargnames[(ss .x ).n], ' ' ) AS sql_identifier) AS parameter_name,
@@ -788,13 +785,14 @@ CREATE VIEW parameters AS
788785
789786 FROM pg_type t, pg_namespace nt,
790787 (SELECT n .nspname AS n_nspname, p .proname , p .oid AS p_oid,
791- p .proargnames , _pg_expandoidvector(p .proargtypes ) AS x
788+ p .proargnames , p .proargmodes ,
789+ _pg_expandarray(coalesce(p .proallargtypes , p .proargtypes ::oid [])) AS x
792790 FROM pg_namespace n, pg_proc p, pg_user u
793791 WHERE n .oid = p .pronamespace
794792 AND p .proowner = u .usesysid
795793 AND (u .usename = current_user OR
796794 has_function_privilege(p .oid , ' EXECUTE' ))) AS ss
797- WHERE t .oid = (ss .x ).o AND t .typnamespace = nt .oid ;
795+ WHERE t .oid = (ss .x ).x AND t .typnamespace = nt .oid ;
798796
799797GRANT SELECT ON parameters TO PUBLIC;
800798
@@ -1718,9 +1716,9 @@ CREATE VIEW element_types AS
17181716
17191717 /* parameters */
17201718 SELECT pronamespace, CAST(proname || ' _' || CAST(oid AS text ) AS sql_identifier),
1721- ' ROUTINE' ::text , (ss .x ).n, (ss .x ).o
1719+ ' ROUTINE' ::text , (ss .x ).n, (ss .x ).x
17221720 FROM (SELECT p .pronamespace , p .proname , p .oid ,
1723- _pg_expandoidvector( p . proargtypes ) AS x
1721+ _pg_expandarray(coalesce( p . proallargtypes , p . proargtypes :: oid []) ) AS x
17241722 FROM pg_proc p) AS ss
17251723
17261724 UNION ALL
0 commit comments