]> granicus.if.org Git - postgresql/commitdiff
Add sanity check for pg_proc.provariadic
authorRobert Haas <rhaas@postgresql.org>
Tue, 31 Oct 2017 04:22:39 +0000 (09:52 +0530)
committerRobert Haas <rhaas@postgresql.org>
Tue, 31 Oct 2017 04:22:39 +0000 (09:52 +0530)
Check that the values from pg_proc.h match what ProcedureCreate would
have done.

Robert Haas and Amul Sul

Discussion: http://postgr.es/m/CA+TgmoZ_UGXfq5ygeDDMdUSJ4J_VX7nFnjC6mfY6BgOJ3qZCmw@mail.gmail.com

src/test/regress/expected/type_sanity.out
src/test/regress/sql/type_sanity.sql

index 7b200baef825fd23a63aa39bb92f2aafe037b479..c6440060dcbd3beccde10eda98d689a1fc3fa56b 100644 (file)
@@ -129,6 +129,24 @@ WHERE p1.typinput = p2.oid AND NOT
 -----+---------+-----+---------
 (0 rows)
 
+-- Check for type of the variadic array parameter's elements.
+-- provariadic should be ANYOID if the type of the last element is ANYOID,
+-- ANYELEMENTOID if the type of the last element is ANYARRAYOID, and otherwise
+-- the element type corresponding to the array type.
+SELECT oid::regprocedure, provariadic::regtype, proargtypes::regtype[]
+FROM pg_proc
+WHERE provariadic != 0
+AND case proargtypes[array_length(proargtypes, 1)-1]
+    WHEN 2276 THEN 2276 -- any -> any
+       WHEN 2277 THEN 2283 -- anyarray -> anyelement
+       ELSE (SELECT t.oid
+                 FROM pg_type t
+                 WHERE t.typarray = proargtypes[array_length(proargtypes, 1)-1])
+       END  != provariadic;
+ oid | provariadic | proargtypes 
+-----+-------------+-------------
+(0 rows)
+
 -- As of 8.0, this check finds refcursor, which is borrowing
 -- other types' I/O routines
 SELECT p1.oid, p1.typname, p2.oid, p2.proname
index 4c658140081503d873aefd65d198fbb53bd485dd..428c2d324dd9abb069bc7222dcd6c0c9239606a6 100644 (file)
@@ -104,6 +104,22 @@ WHERE p1.typinput = p2.oid AND NOT
       p2.proargtypes[1] = 'oid'::regtype AND
       p2.proargtypes[2] = 'int4'::regtype));
 
+-- Check for type of the variadic array parameter's elements.
+-- provariadic should be ANYOID if the type of the last element is ANYOID,
+-- ANYELEMENTOID if the type of the last element is ANYARRAYOID, and otherwise
+-- the element type corresponding to the array type.
+
+SELECT oid::regprocedure, provariadic::regtype, proargtypes::regtype[]
+FROM pg_proc
+WHERE provariadic != 0
+AND case proargtypes[array_length(proargtypes, 1)-1]
+    WHEN 2276 THEN 2276 -- any -> any
+       WHEN 2277 THEN 2283 -- anyarray -> anyelement
+       ELSE (SELECT t.oid
+                 FROM pg_type t
+                 WHERE t.typarray = proargtypes[array_length(proargtypes, 1)-1])
+       END  != provariadic;
+
 -- As of 8.0, this check finds refcursor, which is borrowing
 -- other types' I/O routines
 SELECT p1.oid, p1.typname, p2.oid, p2.proname