Skip to content

Commit 982888b

Browse files
committed
Fix information_schema for OUT and INOUT parameters.
1 parent 6dfe64e commit 982888b

File tree

1 file changed

+21
-23
lines changed

1 file changed

+21
-23
lines changed

src/backend/catalog/information_schema.sql

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
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

5042
CREATE 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

744736
GRANT 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

799797
GRANT 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

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy