On 2014-06-03 10:37:53 -0400, Tom Lane wrote:
> It hasn't even got a comment saying why changes here should
> receive any scrutiny; moreover, it's not in a file where changes would be
> likely to excite suspicion.  (Probably it should be in opr_sanity, if
> we're going to have such a thing at all.)

I've written up the attached patch that moves the test to opr_sanity and
adds a littlebit of commentary. Will apply unless somebody protests in
the next 24h or so.

Greetings,

Andres Freund

-- 
 Andres Freund                     http://www.2ndQuadrant.com/
 PostgreSQL Development, 24x7 Support, Training & Services
>From 61339023f026be3e61acc5e29038e0b3484b4ddc Mon Sep 17 00:00:00 2001
From: Andres Freund <and...@anarazel.de>
Date: Thu, 5 Jun 2014 00:52:49 +0200
Subject: [PATCH] Move regression test listing of builtin leakproof functions
 to opr_sanity.sql.

The original location in create_function_3.sql didn't invite the close
structinity warranted for adding new leakproof functions. Add comments
to the test explaining that functions should only be added after
careful consideration and understanding what a leakproof function is.

Per complaint from Tom Lane after 5eebb8d954ad.
---
 src/test/regress/expected/create_function_3.out | 238 ----------------------
 src/test/regress/expected/opr_sanity.out        | 249 +++++++++++++++++++++++-
 src/test/regress/sql/create_function_3.sql      |  14 --
 src/test/regress/sql/opr_sanity.sql             |  25 ++-
 4 files changed, 268 insertions(+), 258 deletions(-)

diff --git a/src/test/regress/expected/create_function_3.out b/src/test/regress/expected/create_function_3.out
index a4b2d99..6a4352c 100644
--- a/src/test/regress/expected/create_function_3.out
+++ b/src/test/regress/expected/create_function_3.out
@@ -149,244 +149,6 @@ CREATE FUNCTION functext_E_3(int) RETURNS bool LANGUAGE 'sql'
        LEAKPROOF AS 'SELECT $1 < 200';	-- failed
 ERROR:  only superuser can define a leakproof function
 RESET SESSION AUTHORIZATION;
----
--- list of built-in leakproof functions
----
--- temporarily disable fancy output, so catalog changes create less diff noise
-\a\t
-SELECT proname, prorettype::regtype, proargtypes::regtype[]
-       FROM pg_proc JOIN pg_namespace ON pronamespace = pg_namespace.oid
-       WHERE nspname = 'pg_catalog' AND proleakproof ORDER BY proname;
-abstimeeq|boolean|[0:1]={abstime,abstime}
-abstimege|boolean|[0:1]={abstime,abstime}
-abstimegt|boolean|[0:1]={abstime,abstime}
-abstimele|boolean|[0:1]={abstime,abstime}
-abstimelt|boolean|[0:1]={abstime,abstime}
-abstimene|boolean|[0:1]={abstime,abstime}
-biteq|boolean|[0:1]={bit,bit}
-bitge|boolean|[0:1]={bit,bit}
-bitgt|boolean|[0:1]={bit,bit}
-bitle|boolean|[0:1]={bit,bit}
-bitlt|boolean|[0:1]={bit,bit}
-bitne|boolean|[0:1]={bit,bit}
-booleq|boolean|[0:1]={boolean,boolean}
-boolge|boolean|[0:1]={boolean,boolean}
-boolgt|boolean|[0:1]={boolean,boolean}
-boolle|boolean|[0:1]={boolean,boolean}
-boollt|boolean|[0:1]={boolean,boolean}
-boolne|boolean|[0:1]={boolean,boolean}
-bpchareq|boolean|[0:1]={character,character}
-bpcharne|boolean|[0:1]={character,character}
-byteaeq|boolean|[0:1]={bytea,bytea}
-byteage|boolean|[0:1]={bytea,bytea}
-byteagt|boolean|[0:1]={bytea,bytea}
-byteale|boolean|[0:1]={bytea,bytea}
-bytealt|boolean|[0:1]={bytea,bytea}
-byteane|boolean|[0:1]={bytea,bytea}
-cash_eq|boolean|[0:1]={money,money}
-cash_ge|boolean|[0:1]={money,money}
-cash_gt|boolean|[0:1]={money,money}
-cash_le|boolean|[0:1]={money,money}
-cash_lt|boolean|[0:1]={money,money}
-cash_ne|boolean|[0:1]={money,money}
-chareq|boolean|[0:1]={"\"char\"","\"char\""}
-charge|boolean|[0:1]={"\"char\"","\"char\""}
-chargt|boolean|[0:1]={"\"char\"","\"char\""}
-charle|boolean|[0:1]={"\"char\"","\"char\""}
-charlt|boolean|[0:1]={"\"char\"","\"char\""}
-charne|boolean|[0:1]={"\"char\"","\"char\""}
-cideq|boolean|[0:1]={cid,cid}
-circle_eq|boolean|[0:1]={circle,circle}
-circle_ge|boolean|[0:1]={circle,circle}
-circle_gt|boolean|[0:1]={circle,circle}
-circle_le|boolean|[0:1]={circle,circle}
-circle_lt|boolean|[0:1]={circle,circle}
-circle_ne|boolean|[0:1]={circle,circle}
-date_eq|boolean|[0:1]={date,date}
-date_ge|boolean|[0:1]={date,date}
-date_gt|boolean|[0:1]={date,date}
-date_le|boolean|[0:1]={date,date}
-date_lt|boolean|[0:1]={date,date}
-date_ne|boolean|[0:1]={date,date}
-float48eq|boolean|[0:1]={real,"double precision"}
-float48ge|boolean|[0:1]={real,"double precision"}
-float48gt|boolean|[0:1]={real,"double precision"}
-float48le|boolean|[0:1]={real,"double precision"}
-float48lt|boolean|[0:1]={real,"double precision"}
-float48ne|boolean|[0:1]={real,"double precision"}
-float4eq|boolean|[0:1]={real,real}
-float4ge|boolean|[0:1]={real,real}
-float4gt|boolean|[0:1]={real,real}
-float4le|boolean|[0:1]={real,real}
-float4lt|boolean|[0:1]={real,real}
-float4ne|boolean|[0:1]={real,real}
-float84eq|boolean|[0:1]={"double precision",real}
-float84ge|boolean|[0:1]={"double precision",real}
-float84gt|boolean|[0:1]={"double precision",real}
-float84le|boolean|[0:1]={"double precision",real}
-float84lt|boolean|[0:1]={"double precision",real}
-float84ne|boolean|[0:1]={"double precision",real}
-float8eq|boolean|[0:1]={"double precision","double precision"}
-float8ge|boolean|[0:1]={"double precision","double precision"}
-float8gt|boolean|[0:1]={"double precision","double precision"}
-float8le|boolean|[0:1]={"double precision","double precision"}
-float8lt|boolean|[0:1]={"double precision","double precision"}
-float8ne|boolean|[0:1]={"double precision","double precision"}
-int24eq|boolean|[0:1]={smallint,integer}
-int24ge|boolean|[0:1]={smallint,integer}
-int24gt|boolean|[0:1]={smallint,integer}
-int24le|boolean|[0:1]={smallint,integer}
-int24lt|boolean|[0:1]={smallint,integer}
-int24ne|boolean|[0:1]={smallint,integer}
-int28eq|boolean|[0:1]={smallint,bigint}
-int28ge|boolean|[0:1]={smallint,bigint}
-int28gt|boolean|[0:1]={smallint,bigint}
-int28le|boolean|[0:1]={smallint,bigint}
-int28lt|boolean|[0:1]={smallint,bigint}
-int28ne|boolean|[0:1]={smallint,bigint}
-int2eq|boolean|[0:1]={smallint,smallint}
-int2ge|boolean|[0:1]={smallint,smallint}
-int2gt|boolean|[0:1]={smallint,smallint}
-int2le|boolean|[0:1]={smallint,smallint}
-int2lt|boolean|[0:1]={smallint,smallint}
-int2ne|boolean|[0:1]={smallint,smallint}
-int42eq|boolean|[0:1]={integer,smallint}
-int42ge|boolean|[0:1]={integer,smallint}
-int42gt|boolean|[0:1]={integer,smallint}
-int42le|boolean|[0:1]={integer,smallint}
-int42lt|boolean|[0:1]={integer,smallint}
-int42ne|boolean|[0:1]={integer,smallint}
-int48eq|boolean|[0:1]={integer,bigint}
-int48ge|boolean|[0:1]={integer,bigint}
-int48gt|boolean|[0:1]={integer,bigint}
-int48le|boolean|[0:1]={integer,bigint}
-int48lt|boolean|[0:1]={integer,bigint}
-int48ne|boolean|[0:1]={integer,bigint}
-int4eq|boolean|[0:1]={integer,integer}
-int4ge|boolean|[0:1]={integer,integer}
-int4gt|boolean|[0:1]={integer,integer}
-int4le|boolean|[0:1]={integer,integer}
-int4lt|boolean|[0:1]={integer,integer}
-int4ne|boolean|[0:1]={integer,integer}
-int82eq|boolean|[0:1]={bigint,smallint}
-int82ge|boolean|[0:1]={bigint,smallint}
-int82gt|boolean|[0:1]={bigint,smallint}
-int82le|boolean|[0:1]={bigint,smallint}
-int82lt|boolean|[0:1]={bigint,smallint}
-int82ne|boolean|[0:1]={bigint,smallint}
-int84eq|boolean|[0:1]={bigint,integer}
-int84ge|boolean|[0:1]={bigint,integer}
-int84gt|boolean|[0:1]={bigint,integer}
-int84le|boolean|[0:1]={bigint,integer}
-int84lt|boolean|[0:1]={bigint,integer}
-int84ne|boolean|[0:1]={bigint,integer}
-int8eq|boolean|[0:1]={bigint,bigint}
-int8ge|boolean|[0:1]={bigint,bigint}
-int8gt|boolean|[0:1]={bigint,bigint}
-int8le|boolean|[0:1]={bigint,bigint}
-int8lt|boolean|[0:1]={bigint,bigint}
-int8ne|boolean|[0:1]={bigint,bigint}
-interval_eq|boolean|[0:1]={interval,interval}
-interval_ge|boolean|[0:1]={interval,interval}
-interval_gt|boolean|[0:1]={interval,interval}
-interval_le|boolean|[0:1]={interval,interval}
-interval_lt|boolean|[0:1]={interval,interval}
-interval_ne|boolean|[0:1]={interval,interval}
-lseg_eq|boolean|[0:1]={lseg,lseg}
-lseg_ge|boolean|[0:1]={lseg,lseg}
-lseg_gt|boolean|[0:1]={lseg,lseg}
-lseg_le|boolean|[0:1]={lseg,lseg}
-lseg_lt|boolean|[0:1]={lseg,lseg}
-lseg_ne|boolean|[0:1]={lseg,lseg}
-macaddr_eq|boolean|[0:1]={macaddr,macaddr}
-macaddr_ge|boolean|[0:1]={macaddr,macaddr}
-macaddr_gt|boolean|[0:1]={macaddr,macaddr}
-macaddr_le|boolean|[0:1]={macaddr,macaddr}
-macaddr_lt|boolean|[0:1]={macaddr,macaddr}
-macaddr_ne|boolean|[0:1]={macaddr,macaddr}
-nameeq|boolean|[0:1]={name,name}
-namege|boolean|[0:1]={name,name}
-namegt|boolean|[0:1]={name,name}
-namele|boolean|[0:1]={name,name}
-namelt|boolean|[0:1]={name,name}
-namene|boolean|[0:1]={name,name}
-network_eq|boolean|[0:1]={inet,inet}
-network_ge|boolean|[0:1]={inet,inet}
-network_gt|boolean|[0:1]={inet,inet}
-network_le|boolean|[0:1]={inet,inet}
-network_lt|boolean|[0:1]={inet,inet}
-network_ne|boolean|[0:1]={inet,inet}
-oideq|boolean|[0:1]={oid,oid}
-oidge|boolean|[0:1]={oid,oid}
-oidgt|boolean|[0:1]={oid,oid}
-oidle|boolean|[0:1]={oid,oid}
-oidlt|boolean|[0:1]={oid,oid}
-oidne|boolean|[0:1]={oid,oid}
-reltimeeq|boolean|[0:1]={reltime,reltime}
-reltimege|boolean|[0:1]={reltime,reltime}
-reltimegt|boolean|[0:1]={reltime,reltime}
-reltimele|boolean|[0:1]={reltime,reltime}
-reltimelt|boolean|[0:1]={reltime,reltime}
-reltimene|boolean|[0:1]={reltime,reltime}
-texteq|boolean|[0:1]={text,text}
-textne|boolean|[0:1]={text,text}
-tideq|boolean|[0:1]={tid,tid}
-tidge|boolean|[0:1]={tid,tid}
-tidgt|boolean|[0:1]={tid,tid}
-tidle|boolean|[0:1]={tid,tid}
-tidlt|boolean|[0:1]={tid,tid}
-tidne|boolean|[0:1]={tid,tid}
-time_eq|boolean|[0:1]={"time without time zone","time without time zone"}
-time_ge|boolean|[0:1]={"time without time zone","time without time zone"}
-time_gt|boolean|[0:1]={"time without time zone","time without time zone"}
-time_le|boolean|[0:1]={"time without time zone","time without time zone"}
-time_lt|boolean|[0:1]={"time without time zone","time without time zone"}
-time_ne|boolean|[0:1]={"time without time zone","time without time zone"}
-timestamp_eq|boolean|[0:1]={"timestamp without time zone","timestamp without time zone"}
-timestamp_ge|boolean|[0:1]={"timestamp without time zone","timestamp without time zone"}
-timestamp_gt|boolean|[0:1]={"timestamp without time zone","timestamp without time zone"}
-timestamp_le|boolean|[0:1]={"timestamp without time zone","timestamp without time zone"}
-timestamp_lt|boolean|[0:1]={"timestamp without time zone","timestamp without time zone"}
-timestamp_ne|boolean|[0:1]={"timestamp without time zone","timestamp without time zone"}
-timestamptz_eq|boolean|[0:1]={"timestamp with time zone","timestamp with time zone"}
-timestamptz_ge|boolean|[0:1]={"timestamp with time zone","timestamp with time zone"}
-timestamptz_gt|boolean|[0:1]={"timestamp with time zone","timestamp with time zone"}
-timestamptz_le|boolean|[0:1]={"timestamp with time zone","timestamp with time zone"}
-timestamptz_lt|boolean|[0:1]={"timestamp with time zone","timestamp with time zone"}
-timestamptz_ne|boolean|[0:1]={"timestamp with time zone","timestamp with time zone"}
-timetz_eq|boolean|[0:1]={"time with time zone","time with time zone"}
-timetz_ge|boolean|[0:1]={"time with time zone","time with time zone"}
-timetz_gt|boolean|[0:1]={"time with time zone","time with time zone"}
-timetz_le|boolean|[0:1]={"time with time zone","time with time zone"}
-timetz_lt|boolean|[0:1]={"time with time zone","time with time zone"}
-timetz_ne|boolean|[0:1]={"time with time zone","time with time zone"}
-tintervaleq|boolean|[0:1]={tinterval,tinterval}
-tintervalge|boolean|[0:1]={tinterval,tinterval}
-tintervalgt|boolean|[0:1]={tinterval,tinterval}
-tintervalle|boolean|[0:1]={tinterval,tinterval}
-tintervalleneq|boolean|[0:1]={tinterval,reltime}
-tintervallenge|boolean|[0:1]={tinterval,reltime}
-tintervallengt|boolean|[0:1]={tinterval,reltime}
-tintervallenle|boolean|[0:1]={tinterval,reltime}
-tintervallenlt|boolean|[0:1]={tinterval,reltime}
-tintervallenne|boolean|[0:1]={tinterval,reltime}
-tintervallt|boolean|[0:1]={tinterval,tinterval}
-tintervalne|boolean|[0:1]={tinterval,tinterval}
-uuid_eq|boolean|[0:1]={uuid,uuid}
-uuid_ge|boolean|[0:1]={uuid,uuid}
-uuid_gt|boolean|[0:1]={uuid,uuid}
-uuid_le|boolean|[0:1]={uuid,uuid}
-uuid_lt|boolean|[0:1]={uuid,uuid}
-uuid_ne|boolean|[0:1]={uuid,uuid}
-varbiteq|boolean|[0:1]={"bit varying","bit varying"}
-varbitge|boolean|[0:1]={"bit varying","bit varying"}
-varbitgt|boolean|[0:1]={"bit varying","bit varying"}
-varbitle|boolean|[0:1]={"bit varying","bit varying"}
-varbitlt|boolean|[0:1]={"bit varying","bit varying"}
-varbitne|boolean|[0:1]={"bit varying","bit varying"}
-xideq|boolean|[0:1]={xid,xid}
--- restore normal output mode
-\a\t
 --
 -- CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT
 --
diff --git a/src/test/regress/expected/opr_sanity.out b/src/test/regress/expected/opr_sanity.out
index 886e68a..b8a76e6 100644
--- a/src/test/regress/expected/opr_sanity.out
+++ b/src/test/regress/expected/opr_sanity.out
@@ -4,9 +4,9 @@
 -- pg_operator, pg_proc, pg_cast, pg_aggregate, pg_am,
 -- pg_amop, pg_amproc, pg_opclass, pg_opfamily.
 --
--- None of the SELECTs here should ever find any matching entries,
--- so the expected output is easy to maintain ;-).
--- A test failure indicates someone messed up an entry in the system tables.
+-- Every test failures in this file should be closely inspected. The
+-- description of the failing test should be read carefully before
+-- adjusting the expected output.
 --
 -- NB: we assume the oidjoins test will have caught any dangling links,
 -- that is OID or REGPROC fields that are not zero and do not match some
@@ -395,6 +395,249 @@ WHERE d.classoid IS NULL AND p1.oid <= 9999;
 -----+---------
 (0 rows)
 
+-- List of built-in leakproof functions
+--
+-- Leakproof functions should only be added after carefully
+-- scrutinizing all possibly executed codepaths for possible
+-- information leaks. Don't add functions here unless you know what a
+-- leakproof function is. If unsure, don't mark it as such.
+-- temporarily disable fancy output, so catalog changes create less diff noise
+\a\t
+SELECT proname, prorettype::regtype, proargtypes::regtype[]
+FROM pg_proc JOIN pg_namespace
+     ON pronamespace = pg_namespace.oid
+WHERE nspname = 'pg_catalog' AND proleakproof
+ORDER BY proname, pg_proc.oid;
+abstimeeq|boolean|[0:1]={abstime,abstime}
+abstimege|boolean|[0:1]={abstime,abstime}
+abstimegt|boolean|[0:1]={abstime,abstime}
+abstimele|boolean|[0:1]={abstime,abstime}
+abstimelt|boolean|[0:1]={abstime,abstime}
+abstimene|boolean|[0:1]={abstime,abstime}
+biteq|boolean|[0:1]={bit,bit}
+bitge|boolean|[0:1]={bit,bit}
+bitgt|boolean|[0:1]={bit,bit}
+bitle|boolean|[0:1]={bit,bit}
+bitlt|boolean|[0:1]={bit,bit}
+bitne|boolean|[0:1]={bit,bit}
+booleq|boolean|[0:1]={boolean,boolean}
+boolge|boolean|[0:1]={boolean,boolean}
+boolgt|boolean|[0:1]={boolean,boolean}
+boolle|boolean|[0:1]={boolean,boolean}
+boollt|boolean|[0:1]={boolean,boolean}
+boolne|boolean|[0:1]={boolean,boolean}
+bpchareq|boolean|[0:1]={character,character}
+bpcharne|boolean|[0:1]={character,character}
+byteaeq|boolean|[0:1]={bytea,bytea}
+byteage|boolean|[0:1]={bytea,bytea}
+byteagt|boolean|[0:1]={bytea,bytea}
+byteale|boolean|[0:1]={bytea,bytea}
+bytealt|boolean|[0:1]={bytea,bytea}
+byteane|boolean|[0:1]={bytea,bytea}
+cash_eq|boolean|[0:1]={money,money}
+cash_ge|boolean|[0:1]={money,money}
+cash_gt|boolean|[0:1]={money,money}
+cash_le|boolean|[0:1]={money,money}
+cash_lt|boolean|[0:1]={money,money}
+cash_ne|boolean|[0:1]={money,money}
+chareq|boolean|[0:1]={"\"char\"","\"char\""}
+charge|boolean|[0:1]={"\"char\"","\"char\""}
+chargt|boolean|[0:1]={"\"char\"","\"char\""}
+charle|boolean|[0:1]={"\"char\"","\"char\""}
+charlt|boolean|[0:1]={"\"char\"","\"char\""}
+charne|boolean|[0:1]={"\"char\"","\"char\""}
+cideq|boolean|[0:1]={cid,cid}
+circle_eq|boolean|[0:1]={circle,circle}
+circle_ge|boolean|[0:1]={circle,circle}
+circle_gt|boolean|[0:1]={circle,circle}
+circle_le|boolean|[0:1]={circle,circle}
+circle_lt|boolean|[0:1]={circle,circle}
+circle_ne|boolean|[0:1]={circle,circle}
+date_eq|boolean|[0:1]={date,date}
+date_ge|boolean|[0:1]={date,date}
+date_gt|boolean|[0:1]={date,date}
+date_le|boolean|[0:1]={date,date}
+date_lt|boolean|[0:1]={date,date}
+date_ne|boolean|[0:1]={date,date}
+float48eq|boolean|[0:1]={real,"double precision"}
+float48ge|boolean|[0:1]={real,"double precision"}
+float48gt|boolean|[0:1]={real,"double precision"}
+float48le|boolean|[0:1]={real,"double precision"}
+float48lt|boolean|[0:1]={real,"double precision"}
+float48ne|boolean|[0:1]={real,"double precision"}
+float4eq|boolean|[0:1]={real,real}
+float4ge|boolean|[0:1]={real,real}
+float4gt|boolean|[0:1]={real,real}
+float4le|boolean|[0:1]={real,real}
+float4lt|boolean|[0:1]={real,real}
+float4ne|boolean|[0:1]={real,real}
+float84eq|boolean|[0:1]={"double precision",real}
+float84ge|boolean|[0:1]={"double precision",real}
+float84gt|boolean|[0:1]={"double precision",real}
+float84le|boolean|[0:1]={"double precision",real}
+float84lt|boolean|[0:1]={"double precision",real}
+float84ne|boolean|[0:1]={"double precision",real}
+float8eq|boolean|[0:1]={"double precision","double precision"}
+float8ge|boolean|[0:1]={"double precision","double precision"}
+float8gt|boolean|[0:1]={"double precision","double precision"}
+float8le|boolean|[0:1]={"double precision","double precision"}
+float8lt|boolean|[0:1]={"double precision","double precision"}
+float8ne|boolean|[0:1]={"double precision","double precision"}
+int24eq|boolean|[0:1]={smallint,integer}
+int24ge|boolean|[0:1]={smallint,integer}
+int24gt|boolean|[0:1]={smallint,integer}
+int24le|boolean|[0:1]={smallint,integer}
+int24lt|boolean|[0:1]={smallint,integer}
+int24ne|boolean|[0:1]={smallint,integer}
+int28eq|boolean|[0:1]={smallint,bigint}
+int28ge|boolean|[0:1]={smallint,bigint}
+int28gt|boolean|[0:1]={smallint,bigint}
+int28le|boolean|[0:1]={smallint,bigint}
+int28lt|boolean|[0:1]={smallint,bigint}
+int28ne|boolean|[0:1]={smallint,bigint}
+int2eq|boolean|[0:1]={smallint,smallint}
+int2ge|boolean|[0:1]={smallint,smallint}
+int2gt|boolean|[0:1]={smallint,smallint}
+int2le|boolean|[0:1]={smallint,smallint}
+int2lt|boolean|[0:1]={smallint,smallint}
+int2ne|boolean|[0:1]={smallint,smallint}
+int42eq|boolean|[0:1]={integer,smallint}
+int42ge|boolean|[0:1]={integer,smallint}
+int42gt|boolean|[0:1]={integer,smallint}
+int42le|boolean|[0:1]={integer,smallint}
+int42lt|boolean|[0:1]={integer,smallint}
+int42ne|boolean|[0:1]={integer,smallint}
+int48eq|boolean|[0:1]={integer,bigint}
+int48ge|boolean|[0:1]={integer,bigint}
+int48gt|boolean|[0:1]={integer,bigint}
+int48le|boolean|[0:1]={integer,bigint}
+int48lt|boolean|[0:1]={integer,bigint}
+int48ne|boolean|[0:1]={integer,bigint}
+int4eq|boolean|[0:1]={integer,integer}
+int4ge|boolean|[0:1]={integer,integer}
+int4gt|boolean|[0:1]={integer,integer}
+int4le|boolean|[0:1]={integer,integer}
+int4lt|boolean|[0:1]={integer,integer}
+int4ne|boolean|[0:1]={integer,integer}
+int82eq|boolean|[0:1]={bigint,smallint}
+int82ge|boolean|[0:1]={bigint,smallint}
+int82gt|boolean|[0:1]={bigint,smallint}
+int82le|boolean|[0:1]={bigint,smallint}
+int82lt|boolean|[0:1]={bigint,smallint}
+int82ne|boolean|[0:1]={bigint,smallint}
+int84eq|boolean|[0:1]={bigint,integer}
+int84ge|boolean|[0:1]={bigint,integer}
+int84gt|boolean|[0:1]={bigint,integer}
+int84le|boolean|[0:1]={bigint,integer}
+int84lt|boolean|[0:1]={bigint,integer}
+int84ne|boolean|[0:1]={bigint,integer}
+int8eq|boolean|[0:1]={bigint,bigint}
+int8ge|boolean|[0:1]={bigint,bigint}
+int8gt|boolean|[0:1]={bigint,bigint}
+int8le|boolean|[0:1]={bigint,bigint}
+int8lt|boolean|[0:1]={bigint,bigint}
+int8ne|boolean|[0:1]={bigint,bigint}
+interval_eq|boolean|[0:1]={interval,interval}
+interval_ge|boolean|[0:1]={interval,interval}
+interval_gt|boolean|[0:1]={interval,interval}
+interval_le|boolean|[0:1]={interval,interval}
+interval_lt|boolean|[0:1]={interval,interval}
+interval_ne|boolean|[0:1]={interval,interval}
+lseg_eq|boolean|[0:1]={lseg,lseg}
+lseg_ge|boolean|[0:1]={lseg,lseg}
+lseg_gt|boolean|[0:1]={lseg,lseg}
+lseg_le|boolean|[0:1]={lseg,lseg}
+lseg_lt|boolean|[0:1]={lseg,lseg}
+lseg_ne|boolean|[0:1]={lseg,lseg}
+macaddr_eq|boolean|[0:1]={macaddr,macaddr}
+macaddr_ge|boolean|[0:1]={macaddr,macaddr}
+macaddr_gt|boolean|[0:1]={macaddr,macaddr}
+macaddr_le|boolean|[0:1]={macaddr,macaddr}
+macaddr_lt|boolean|[0:1]={macaddr,macaddr}
+macaddr_ne|boolean|[0:1]={macaddr,macaddr}
+nameeq|boolean|[0:1]={name,name}
+namege|boolean|[0:1]={name,name}
+namegt|boolean|[0:1]={name,name}
+namele|boolean|[0:1]={name,name}
+namelt|boolean|[0:1]={name,name}
+namene|boolean|[0:1]={name,name}
+network_eq|boolean|[0:1]={inet,inet}
+network_ge|boolean|[0:1]={inet,inet}
+network_gt|boolean|[0:1]={inet,inet}
+network_le|boolean|[0:1]={inet,inet}
+network_lt|boolean|[0:1]={inet,inet}
+network_ne|boolean|[0:1]={inet,inet}
+oideq|boolean|[0:1]={oid,oid}
+oidge|boolean|[0:1]={oid,oid}
+oidgt|boolean|[0:1]={oid,oid}
+oidle|boolean|[0:1]={oid,oid}
+oidlt|boolean|[0:1]={oid,oid}
+oidne|boolean|[0:1]={oid,oid}
+reltimeeq|boolean|[0:1]={reltime,reltime}
+reltimege|boolean|[0:1]={reltime,reltime}
+reltimegt|boolean|[0:1]={reltime,reltime}
+reltimele|boolean|[0:1]={reltime,reltime}
+reltimelt|boolean|[0:1]={reltime,reltime}
+reltimene|boolean|[0:1]={reltime,reltime}
+texteq|boolean|[0:1]={text,text}
+textne|boolean|[0:1]={text,text}
+tideq|boolean|[0:1]={tid,tid}
+tidge|boolean|[0:1]={tid,tid}
+tidgt|boolean|[0:1]={tid,tid}
+tidle|boolean|[0:1]={tid,tid}
+tidlt|boolean|[0:1]={tid,tid}
+tidne|boolean|[0:1]={tid,tid}
+time_eq|boolean|[0:1]={"time without time zone","time without time zone"}
+time_ge|boolean|[0:1]={"time without time zone","time without time zone"}
+time_gt|boolean|[0:1]={"time without time zone","time without time zone"}
+time_le|boolean|[0:1]={"time without time zone","time without time zone"}
+time_lt|boolean|[0:1]={"time without time zone","time without time zone"}
+time_ne|boolean|[0:1]={"time without time zone","time without time zone"}
+timestamp_eq|boolean|[0:1]={"timestamp without time zone","timestamp without time zone"}
+timestamp_ge|boolean|[0:1]={"timestamp without time zone","timestamp without time zone"}
+timestamp_gt|boolean|[0:1]={"timestamp without time zone","timestamp without time zone"}
+timestamp_le|boolean|[0:1]={"timestamp without time zone","timestamp without time zone"}
+timestamp_lt|boolean|[0:1]={"timestamp without time zone","timestamp without time zone"}
+timestamp_ne|boolean|[0:1]={"timestamp without time zone","timestamp without time zone"}
+timestamptz_eq|boolean|[0:1]={"timestamp with time zone","timestamp with time zone"}
+timestamptz_ge|boolean|[0:1]={"timestamp with time zone","timestamp with time zone"}
+timestamptz_gt|boolean|[0:1]={"timestamp with time zone","timestamp with time zone"}
+timestamptz_le|boolean|[0:1]={"timestamp with time zone","timestamp with time zone"}
+timestamptz_lt|boolean|[0:1]={"timestamp with time zone","timestamp with time zone"}
+timestamptz_ne|boolean|[0:1]={"timestamp with time zone","timestamp with time zone"}
+timetz_eq|boolean|[0:1]={"time with time zone","time with time zone"}
+timetz_ge|boolean|[0:1]={"time with time zone","time with time zone"}
+timetz_gt|boolean|[0:1]={"time with time zone","time with time zone"}
+timetz_le|boolean|[0:1]={"time with time zone","time with time zone"}
+timetz_lt|boolean|[0:1]={"time with time zone","time with time zone"}
+timetz_ne|boolean|[0:1]={"time with time zone","time with time zone"}
+tintervaleq|boolean|[0:1]={tinterval,tinterval}
+tintervalge|boolean|[0:1]={tinterval,tinterval}
+tintervalgt|boolean|[0:1]={tinterval,tinterval}
+tintervalle|boolean|[0:1]={tinterval,tinterval}
+tintervalleneq|boolean|[0:1]={tinterval,reltime}
+tintervallenge|boolean|[0:1]={tinterval,reltime}
+tintervallengt|boolean|[0:1]={tinterval,reltime}
+tintervallenle|boolean|[0:1]={tinterval,reltime}
+tintervallenlt|boolean|[0:1]={tinterval,reltime}
+tintervallenne|boolean|[0:1]={tinterval,reltime}
+tintervallt|boolean|[0:1]={tinterval,tinterval}
+tintervalne|boolean|[0:1]={tinterval,tinterval}
+uuid_eq|boolean|[0:1]={uuid,uuid}
+uuid_ge|boolean|[0:1]={uuid,uuid}
+uuid_gt|boolean|[0:1]={uuid,uuid}
+uuid_le|boolean|[0:1]={uuid,uuid}
+uuid_lt|boolean|[0:1]={uuid,uuid}
+uuid_ne|boolean|[0:1]={uuid,uuid}
+varbiteq|boolean|[0:1]={"bit varying","bit varying"}
+varbitge|boolean|[0:1]={"bit varying","bit varying"}
+varbitgt|boolean|[0:1]={"bit varying","bit varying"}
+varbitle|boolean|[0:1]={"bit varying","bit varying"}
+varbitlt|boolean|[0:1]={"bit varying","bit varying"}
+varbitne|boolean|[0:1]={"bit varying","bit varying"}
+xideq|boolean|[0:1]={xid,xid}
+-- restore normal output mode
+\a\t
 -- **************** pg_cast ****************
 -- Catch bogus values in pg_cast columns (other than cases detected by
 -- oidjoins test).
diff --git a/src/test/regress/sql/create_function_3.sql b/src/test/regress/sql/create_function_3.sql
index e78a2ba..86d69ba 100644
--- a/src/test/regress/sql/create_function_3.sql
+++ b/src/test/regress/sql/create_function_3.sql
@@ -107,20 +107,6 @@ CREATE FUNCTION functext_E_3(int) RETURNS bool LANGUAGE 'sql'
 
 RESET SESSION AUTHORIZATION;
 
----
--- list of built-in leakproof functions
----
-
--- temporarily disable fancy output, so catalog changes create less diff noise
-\a\t
-
-SELECT proname, prorettype::regtype, proargtypes::regtype[]
-       FROM pg_proc JOIN pg_namespace ON pronamespace = pg_namespace.oid
-       WHERE nspname = 'pg_catalog' AND proleakproof ORDER BY proname;
-
--- restore normal output mode
-\a\t
-
 --
 -- CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT
 --
diff --git a/src/test/regress/sql/opr_sanity.sql b/src/test/regress/sql/opr_sanity.sql
index a932ff2..cf7ba43 100644
--- a/src/test/regress/sql/opr_sanity.sql
+++ b/src/test/regress/sql/opr_sanity.sql
@@ -4,9 +4,9 @@
 -- pg_operator, pg_proc, pg_cast, pg_aggregate, pg_am,
 -- pg_amop, pg_amproc, pg_opclass, pg_opfamily.
 --
--- None of the SELECTs here should ever find any matching entries,
--- so the expected output is easy to maintain ;-).
--- A test failure indicates someone messed up an entry in the system tables.
+-- Every test failures in this file should be closely inspected. The
+-- description of the failing test should be read carefully before
+-- adjusting the expected output.
 --
 -- NB: we assume the oidjoins test will have caught any dangling links,
 -- that is OID or REGPROC fields that are not zero and do not match some
@@ -298,6 +298,25 @@ FROM pg_proc as p1 LEFT JOIN pg_description as d
      ON p1.tableoid = d.classoid and p1.oid = d.objoid and d.objsubid = 0
 WHERE d.classoid IS NULL AND p1.oid <= 9999;
 
+-- List of built-in leakproof functions
+--
+-- Leakproof functions should only be added after carefully
+-- scrutinizing all possibly executed codepaths for possible
+-- information leaks. Don't add functions here unless you know what a
+-- leakproof function is. If unsure, don't mark it as such.
+
+-- temporarily disable fancy output, so catalog changes create less diff noise
+\a\t
+
+SELECT proname, prorettype::regtype, proargtypes::regtype[]
+FROM pg_proc JOIN pg_namespace
+     ON pronamespace = pg_namespace.oid
+WHERE nspname = 'pg_catalog' AND proleakproof
+ORDER BY proname, pg_proc.oid;
+
+-- restore normal output mode
+\a\t
+
 
 -- **************** pg_cast ****************
 
-- 
2.0.0.rc2.4.g1dc51c6.dirty

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

Reply via email to