]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Replace opr_sanity test's binary_coercible() function with C code.
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 11 May 2021 18:28:11 +0000 (14:28 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 11 May 2021 18:28:11 +0000 (14:28 -0400)
opr_sanity's binary_coercible() function has always been meant
to match the parser's notion of binary coercibility, but it also
has always been a rather poor approximation of the parser's
real rules (as embodied in IsBinaryCoercible()).  That hasn't
bit us so far, but it's predictable that it will eventually.

It also now emerges that implementing this check in plpgsql
performs absolutely horribly in clobber-cache-always testing.
(Perhaps we could do something about that, but I suspect it just
means that plpgsql is exploiting catalog caching to the hilt.)

Hence, let's replace binary_coercible() with a C shim that directly
invokes IsBinaryCoercible(), eliminating both the semantic hazard
and the performance issue.

Most of regress.c's C functions are declared in create_function_1,
but we can't simply move that to before opr_sanity/type_sanity
since those tests would complain about the resulting shell types.
I chose to split it into create_function_0 and create_function_1.
Since create_function_0 now runs as part of a parallel group while
create_function_1 doesn't, reduce the latter to create just those
functions that opr_sanity and type_sanity would whine about.

To make room for create_function_0 in the second parallel group
of tests, move tstypes to the third parallel group.

In passing, clean up some ordering deviations between
parallel_schedule and serial_schedule.

Discussion: https://postgr.es/m/292305.1620503097@sss.pgh.pa.us

15 files changed:
src/test/regress/expected/.gitignore
src/test/regress/expected/conversion.out
src/test/regress/expected/opr_sanity.out
src/test/regress/expected/type_sanity.out
src/test/regress/input/create_function_0.source [new file with mode: 0644]
src/test/regress/input/create_function_1.source
src/test/regress/output/create_function_0.source [new file with mode: 0644]
src/test/regress/output/create_function_1.source
src/test/regress/parallel_schedule
src/test/regress/regress.c
src/test/regress/serial_schedule
src/test/regress/sql/.gitignore
src/test/regress/sql/conversion.sql
src/test/regress/sql/opr_sanity.sql
src/test/regress/sql/type_sanity.sql

index 93c56c85a09a598cdef93f0fc7626bcc0d1670df..b99caf5f40b09c54f4875c4784f46d2ae0976a7e 100644 (file)
@@ -1,5 +1,6 @@
 /constraints.out
 /copy.out
+/create_function_0.out
 /create_function_1.out
 /create_function_2.out
 /largeobject.out
index e34ab20974dcedc715745230dacda53ed7af5448..04fdcba4964a5669721a65393d273e7ba7aac730 100644 (file)
@@ -41,7 +41,7 @@ DROP USER regress_conversion_user;
 -- Test built-in conversion functions.
 --
 -- Helper function to test a conversion. Uses the test_enc_conversion function
--- that was created in the create_function_1 test.
+-- that was created in the create_function_0 test.
 create or replace function test_conv(
   input IN bytea,
   src_encoding IN text,
index 7a0d345b608cf281bc4106521ad5d304bda5a0b8..562b586d8e0482150882f868bd8f56306b37a631 100644 (file)
 --
 -- NB: run this test earlier than the create_operator test, because
 -- that test creates some bogus operators...
--- Helper functions to deal with cases where binary-coercible matches are
--- allowed.
--- This should match IsBinaryCoercible() in parse_coerce.c.
--- It doesn't currently know about some cases, notably domains, anyelement,
--- anynonarray, anyenum, or record, but it doesn't need to (yet).
-create function binary_coercible(oid, oid) returns bool as $$
-begin
-  if $1 = $2 then return true; end if;
-  if EXISTS(select 1 from pg_catalog.pg_cast where
-            castsource = $1 and casttarget = $2 and
-            castmethod = 'b' and castcontext = 'i')
-  then return true; end if;
-  if $2 = 'pg_catalog.any'::pg_catalog.regtype then return true; end if;
-  if $2 = 'pg_catalog.anyarray'::pg_catalog.regtype then
-    if EXISTS(select 1 from pg_catalog.pg_type where
-              oid = $1 and typelem != 0 and
-              typsubscript = 'pg_catalog.array_subscript_handler'::pg_catalog.regproc)
-    then return true; end if;
-  end if;
-  if $2 = 'pg_catalog.anyrange'::pg_catalog.regtype then
-    if (select typtype from pg_catalog.pg_type where oid = $1) = 'r'
-    then return true; end if;
-  end if;
-  if $2 = 'pg_catalog.anymultirange'::pg_catalog.regtype then
-    if (select typtype from pg_catalog.pg_type where oid = $1) = 'm'
-    then return true; end if;
-  end if;
-  return false;
-end
-$$ language plpgsql strict stable;
--- This one ignores castcontext, so it will allow cases where an explicit
--- (but still binary) cast would be required to convert the input type.
--- We don't currently use this for any tests in this file, but it is a
--- reasonable alternative definition for some scenarios.
-create function explicitly_binary_coercible(oid, oid) returns bool as $$
-begin
-  if $1 = $2 then return true; end if;
-  if EXISTS(select 1 from pg_catalog.pg_cast where
-            castsource = $1 and casttarget = $2 and
-            castmethod = 'b')
-  then return true; end if;
-  if $2 = 'pg_catalog.any'::pg_catalog.regtype then return true; end if;
-  if $2 = 'pg_catalog.anyarray'::pg_catalog.regtype then
-    if EXISTS(select 1 from pg_catalog.pg_type where
-              oid = $1 and typelem != 0 and
-              typsubscript = 'pg_catalog.array_subscript_handler'::pg_catalog.regproc)
-    then return true; end if;
-  end if;
-  if $2 = 'pg_catalog.anyrange'::pg_catalog.regtype then
-    if (select typtype from pg_catalog.pg_type where oid = $1) = 'r'
-    then return true; end if;
-  end if;
-  return false;
-end
-$$ language plpgsql strict stable;
 -- **************** pg_proc ****************
 -- Look for illegal values in pg_proc fields.
 SELECT p1.oid, p1.proname
index 5480f979c65e0a2335e3b1a4dd102cad9aedb494..f567fd378e79c9f5d362a4dc7035d51c090a6553 100644 (file)
@@ -635,7 +635,7 @@ WHERE (rngcollation = 0) != (typcollation = 0);
 (0 rows)
 
 -- opclass had better be a btree opclass accepting the subtype.
--- We must allow anyarray matches, cf opr_sanity's binary_coercible()
+-- We must allow anyarray matches, cf IsBinaryCoercible()
 SELECT p1.rngtypid, p1.rngsubtype, o.opcmethod, o.opcname
 FROM pg_range p1 JOIN pg_opclass o ON o.oid = p1.rngsubopc
 WHERE o.opcmethod != 403 OR
diff --git a/src/test/regress/input/create_function_0.source b/src/test/regress/input/create_function_0.source
new file mode 100644 (file)
index 0000000..f47f635
--- /dev/null
@@ -0,0 +1,95 @@
+--
+-- CREATE_FUNCTION_0
+--
+
+-- Create a bunch of C functions that will be used by later tests:
+
+CREATE FUNCTION check_primary_key ()
+       RETURNS trigger
+       AS '@libdir@/refint@DLSUFFIX@'
+       LANGUAGE C;
+
+CREATE FUNCTION check_foreign_key ()
+       RETURNS trigger
+       AS '@libdir@/refint@DLSUFFIX@'
+       LANGUAGE C;
+
+CREATE FUNCTION autoinc ()
+       RETURNS trigger
+       AS '@libdir@/autoinc@DLSUFFIX@'
+       LANGUAGE C;
+
+CREATE FUNCTION trigger_return_old ()
+        RETURNS trigger
+        AS '@libdir@/regress@DLSUFFIX@'
+        LANGUAGE C;
+
+CREATE FUNCTION ttdummy ()
+        RETURNS trigger
+        AS '@libdir@/regress@DLSUFFIX@'
+        LANGUAGE C;
+
+CREATE FUNCTION set_ttdummy (int4)
+        RETURNS int4
+        AS '@libdir@/regress@DLSUFFIX@'
+        LANGUAGE C STRICT;
+
+CREATE FUNCTION make_tuple_indirect (record)
+        RETURNS record
+        AS '@libdir@/regress@DLSUFFIX@'
+        LANGUAGE C STRICT;
+
+CREATE FUNCTION test_atomic_ops()
+    RETURNS bool
+    AS '@libdir@/regress@DLSUFFIX@'
+    LANGUAGE C;
+
+CREATE FUNCTION test_fdw_handler()
+    RETURNS fdw_handler
+    AS '@libdir@/regress@DLSUFFIX@', 'test_fdw_handler'
+    LANGUAGE C;
+
+CREATE FUNCTION test_support_func(internal)
+    RETURNS internal
+    AS '@libdir@/regress@DLSUFFIX@', 'test_support_func'
+    LANGUAGE C STRICT;
+
+CREATE FUNCTION test_opclass_options_func(internal)
+    RETURNS void
+    AS '@libdir@/regress@DLSUFFIX@', 'test_opclass_options_func'
+    LANGUAGE C;
+
+CREATE FUNCTION test_enc_conversion(bytea, name, name, bool, validlen OUT int, result OUT bytea)
+    AS '@libdir@/regress@DLSUFFIX@', 'test_enc_conversion'
+    LANGUAGE C STRICT;
+
+CREATE FUNCTION binary_coercible(oid, oid)
+    RETURNS bool
+    AS '@libdir@/regress@DLSUFFIX@', 'binary_coercible'
+    LANGUAGE C STRICT STABLE PARALLEL SAFE;
+
+-- Things that shouldn't work:
+
+CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL
+    AS 'SELECT ''not an integer'';';
+
+CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL
+    AS 'not even SQL';
+
+CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL
+    AS 'SELECT 1, 2, 3;';
+
+CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL
+    AS 'SELECT $2;';
+
+CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL
+    AS 'a', 'b';
+
+CREATE FUNCTION test1 (int) RETURNS int LANGUAGE C
+    AS 'nosuchfile';
+
+CREATE FUNCTION test1 (int) RETURNS int LANGUAGE C
+    AS '@libdir@/regress@DLSUFFIX@', 'nosuchsymbol';
+
+CREATE FUNCTION test1 (int) RETURNS int LANGUAGE internal
+    AS 'nosuch';
index 6c69b7fe6cbbf13a5bff1c121c74a98b4fac8d36..79a41562bb04b91f72736f5a7c242b88bd7b5192 100644 (file)
@@ -2,6 +2,8 @@
 -- CREATE_FUNCTION_1
 --
 
+-- Create C functions needed by create_type.sql
+
 CREATE FUNCTION widget_in(cstring)
    RETURNS widget
    AS '@libdir@/regress@DLSUFFIX@'
@@ -21,89 +23,3 @@ CREATE FUNCTION int44out(city_budget)
    RETURNS cstring
    AS '@libdir@/regress@DLSUFFIX@'
    LANGUAGE C STRICT IMMUTABLE;
-
-CREATE FUNCTION check_primary_key ()
-       RETURNS trigger
-       AS '@libdir@/refint@DLSUFFIX@'
-       LANGUAGE C;
-
-CREATE FUNCTION check_foreign_key ()
-       RETURNS trigger
-       AS '@libdir@/refint@DLSUFFIX@'
-       LANGUAGE C;
-
-CREATE FUNCTION autoinc ()
-       RETURNS trigger
-       AS '@libdir@/autoinc@DLSUFFIX@'
-       LANGUAGE C;
-
-CREATE FUNCTION trigger_return_old ()
-        RETURNS trigger
-        AS '@libdir@/regress@DLSUFFIX@'
-        LANGUAGE C;
-
-CREATE FUNCTION ttdummy ()
-        RETURNS trigger
-        AS '@libdir@/regress@DLSUFFIX@'
-        LANGUAGE C;
-
-CREATE FUNCTION set_ttdummy (int4)
-        RETURNS int4
-        AS '@libdir@/regress@DLSUFFIX@'
-        LANGUAGE C STRICT;
-
-CREATE FUNCTION make_tuple_indirect (record)
-        RETURNS record
-        AS '@libdir@/regress@DLSUFFIX@'
-        LANGUAGE C STRICT;
-
-CREATE FUNCTION test_atomic_ops()
-    RETURNS bool
-    AS '@libdir@/regress@DLSUFFIX@'
-    LANGUAGE C;
-
--- Tests creating a FDW handler
-CREATE FUNCTION test_fdw_handler()
-    RETURNS fdw_handler
-    AS '@libdir@/regress@DLSUFFIX@', 'test_fdw_handler'
-    LANGUAGE C;
-
-CREATE FUNCTION test_support_func(internal)
-    RETURNS internal
-    AS '@libdir@/regress@DLSUFFIX@', 'test_support_func'
-    LANGUAGE C STRICT;
-
-CREATE FUNCTION test_opclass_options_func(internal)
-    RETURNS void
-    AS '@libdir@/regress@DLSUFFIX@', 'test_opclass_options_func'
-    LANGUAGE C;
-
-CREATE FUNCTION test_enc_conversion(bytea, name, name, bool, validlen OUT int, result OUT bytea)
-    AS '@libdir@/regress@DLSUFFIX@', 'test_enc_conversion'
-    LANGUAGE C STRICT;
-
--- Things that shouldn't work:
-
-CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL
-    AS 'SELECT ''not an integer'';';
-
-CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL
-    AS 'not even SQL';
-
-CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL
-    AS 'SELECT 1, 2, 3;';
-
-CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL
-    AS 'SELECT $2;';
-
-CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL
-    AS 'a', 'b';
-
-CREATE FUNCTION test1 (int) RETURNS int LANGUAGE C
-    AS 'nosuchfile';
-
-CREATE FUNCTION test1 (int) RETURNS int LANGUAGE C
-    AS '@libdir@/regress@DLSUFFIX@', 'nosuchsymbol';
-
-CREATE FUNCTION test1 (int) RETURNS int LANGUAGE internal
-    AS 'nosuch';
diff --git a/src/test/regress/output/create_function_0.source b/src/test/regress/output/create_function_0.source
new file mode 100644 (file)
index 0000000..342bc40
--- /dev/null
@@ -0,0 +1,88 @@
+--
+-- CREATE_FUNCTION_0
+--
+-- Create a bunch of C functions that will be used by later tests:
+CREATE FUNCTION check_primary_key ()
+       RETURNS trigger
+       AS '@libdir@/refint@DLSUFFIX@'
+       LANGUAGE C;
+CREATE FUNCTION check_foreign_key ()
+       RETURNS trigger
+       AS '@libdir@/refint@DLSUFFIX@'
+       LANGUAGE C;
+CREATE FUNCTION autoinc ()
+       RETURNS trigger
+       AS '@libdir@/autoinc@DLSUFFIX@'
+       LANGUAGE C;
+CREATE FUNCTION trigger_return_old ()
+        RETURNS trigger
+        AS '@libdir@/regress@DLSUFFIX@'
+        LANGUAGE C;
+CREATE FUNCTION ttdummy ()
+        RETURNS trigger
+        AS '@libdir@/regress@DLSUFFIX@'
+        LANGUAGE C;
+CREATE FUNCTION set_ttdummy (int4)
+        RETURNS int4
+        AS '@libdir@/regress@DLSUFFIX@'
+        LANGUAGE C STRICT;
+CREATE FUNCTION make_tuple_indirect (record)
+        RETURNS record
+        AS '@libdir@/regress@DLSUFFIX@'
+        LANGUAGE C STRICT;
+CREATE FUNCTION test_atomic_ops()
+    RETURNS bool
+    AS '@libdir@/regress@DLSUFFIX@'
+    LANGUAGE C;
+CREATE FUNCTION test_fdw_handler()
+    RETURNS fdw_handler
+    AS '@libdir@/regress@DLSUFFIX@', 'test_fdw_handler'
+    LANGUAGE C;
+CREATE FUNCTION test_support_func(internal)
+    RETURNS internal
+    AS '@libdir@/regress@DLSUFFIX@', 'test_support_func'
+    LANGUAGE C STRICT;
+CREATE FUNCTION test_opclass_options_func(internal)
+    RETURNS void
+    AS '@libdir@/regress@DLSUFFIX@', 'test_opclass_options_func'
+    LANGUAGE C;
+CREATE FUNCTION test_enc_conversion(bytea, name, name, bool, validlen OUT int, result OUT bytea)
+    AS '@libdir@/regress@DLSUFFIX@', 'test_enc_conversion'
+    LANGUAGE C STRICT;
+CREATE FUNCTION binary_coercible(oid, oid)
+    RETURNS bool
+    AS '@libdir@/regress@DLSUFFIX@', 'binary_coercible'
+    LANGUAGE C STRICT STABLE PARALLEL SAFE;
+-- Things that shouldn't work:
+CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL
+    AS 'SELECT ''not an integer'';';
+ERROR:  return type mismatch in function declared to return integer
+DETAIL:  Actual return type is text.
+CONTEXT:  SQL function "test1"
+CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL
+    AS 'not even SQL';
+ERROR:  syntax error at or near "not"
+LINE 2:     AS 'not even SQL';
+                ^
+CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL
+    AS 'SELECT 1, 2, 3;';
+ERROR:  return type mismatch in function declared to return integer
+DETAIL:  Final statement must return exactly one column.
+CONTEXT:  SQL function "test1"
+CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL
+    AS 'SELECT $2;';
+ERROR:  there is no parameter $2
+LINE 2:     AS 'SELECT $2;';
+                       ^
+CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL
+    AS 'a', 'b';
+ERROR:  only one AS item needed for language "sql"
+CREATE FUNCTION test1 (int) RETURNS int LANGUAGE C
+    AS 'nosuchfile';
+ERROR:  could not access file "nosuchfile": No such file or directory
+CREATE FUNCTION test1 (int) RETURNS int LANGUAGE C
+    AS '@libdir@/regress@DLSUFFIX@', 'nosuchsymbol';
+ERROR:  could not find function "nosuchsymbol" in file "@libdir@/regress@DLSUFFIX@"
+CREATE FUNCTION test1 (int) RETURNS int LANGUAGE internal
+    AS 'nosuch';
+ERROR:  there is no built-in function named "nosuch"
index c66146db9d53ea6b4db467505987fe1d883dcf31..616b610e862458d0351e95b71e31d91eb8fa6dd1 100644 (file)
@@ -1,6 +1,7 @@
 --
 -- CREATE_FUNCTION_1
 --
+-- Create C functions needed by create_type.sql
 CREATE FUNCTION widget_in(cstring)
    RETURNS widget
    AS '@libdir@/regress@DLSUFFIX@'
@@ -23,84 +24,3 @@ CREATE FUNCTION int44out(city_budget)
    AS '@libdir@/regress@DLSUFFIX@'
    LANGUAGE C STRICT IMMUTABLE;
 NOTICE:  argument type city_budget is only a shell
-CREATE FUNCTION check_primary_key ()
-       RETURNS trigger
-       AS '@libdir@/refint@DLSUFFIX@'
-       LANGUAGE C;
-CREATE FUNCTION check_foreign_key ()
-       RETURNS trigger
-       AS '@libdir@/refint@DLSUFFIX@'
-       LANGUAGE C;
-CREATE FUNCTION autoinc ()
-       RETURNS trigger
-       AS '@libdir@/autoinc@DLSUFFIX@'
-       LANGUAGE C;
-CREATE FUNCTION trigger_return_old ()
-        RETURNS trigger
-        AS '@libdir@/regress@DLSUFFIX@'
-        LANGUAGE C;
-CREATE FUNCTION ttdummy ()
-        RETURNS trigger
-        AS '@libdir@/regress@DLSUFFIX@'
-        LANGUAGE C;
-CREATE FUNCTION set_ttdummy (int4)
-        RETURNS int4
-        AS '@libdir@/regress@DLSUFFIX@'
-        LANGUAGE C STRICT;
-CREATE FUNCTION make_tuple_indirect (record)
-        RETURNS record
-        AS '@libdir@/regress@DLSUFFIX@'
-        LANGUAGE C STRICT;
-CREATE FUNCTION test_atomic_ops()
-    RETURNS bool
-    AS '@libdir@/regress@DLSUFFIX@'
-    LANGUAGE C;
--- Tests creating a FDW handler
-CREATE FUNCTION test_fdw_handler()
-    RETURNS fdw_handler
-    AS '@libdir@/regress@DLSUFFIX@', 'test_fdw_handler'
-    LANGUAGE C;
-CREATE FUNCTION test_support_func(internal)
-    RETURNS internal
-    AS '@libdir@/regress@DLSUFFIX@', 'test_support_func'
-    LANGUAGE C STRICT;
-CREATE FUNCTION test_opclass_options_func(internal)
-    RETURNS void
-    AS '@libdir@/regress@DLSUFFIX@', 'test_opclass_options_func'
-    LANGUAGE C;
-CREATE FUNCTION test_enc_conversion(bytea, name, name, bool, validlen OUT int, result OUT bytea)
-    AS '@libdir@/regress@DLSUFFIX@', 'test_enc_conversion'
-    LANGUAGE C STRICT;
--- Things that shouldn't work:
-CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL
-    AS 'SELECT ''not an integer'';';
-ERROR:  return type mismatch in function declared to return integer
-DETAIL:  Actual return type is text.
-CONTEXT:  SQL function "test1"
-CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL
-    AS 'not even SQL';
-ERROR:  syntax error at or near "not"
-LINE 2:     AS 'not even SQL';
-                ^
-CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL
-    AS 'SELECT 1, 2, 3;';
-ERROR:  return type mismatch in function declared to return integer
-DETAIL:  Final statement must return exactly one column.
-CONTEXT:  SQL function "test1"
-CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL
-    AS 'SELECT $2;';
-ERROR:  there is no parameter $2
-LINE 2:     AS 'SELECT $2;';
-                       ^
-CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL
-    AS 'a', 'b';
-ERROR:  only one AS item needed for language "sql"
-CREATE FUNCTION test1 (int) RETURNS int LANGUAGE C
-    AS 'nosuchfile';
-ERROR:  could not access file "nosuchfile": No such file or directory
-CREATE FUNCTION test1 (int) RETURNS int LANGUAGE C
-    AS '@libdir@/regress@DLSUFFIX@', 'nosuchsymbol';
-ERROR:  could not find function "nosuchsymbol" in file "@libdir@/regress@DLSUFFIX@"
-CREATE FUNCTION test1 (int) RETURNS int LANGUAGE internal
-    AS 'nosuch';
-ERROR:  there is no built-in function named "nosuch"
index a0913008577203fa7b4edeb3266148a4b209cbde..22b0d3584da94b504c8e50ae4a233f8a5d7b5014 100644 (file)
@@ -20,16 +20,17 @@ test: boolean char name varchar text int2 int4 int8 oid float4 float8 bit numeri
 # strings depends on char, varchar and text
 # numerology depends on int2, int4, int8, float4, float8
 # multirangetypes depends on rangetypes
-# multirangetypes shouldn't be in the one group with type_sanity
+# multirangetypes shouldn't run concurrently with type_sanity
 # ----------
-test: strings numerology point lseg line box path polygon circle date time timetz timestamp timestamptz interval inet macaddr macaddr8 tstypes multirangetypes
+test: strings numerology point lseg line box path polygon circle date time timetz timestamp timestamptz interval inet macaddr macaddr8 multirangetypes create_function_0
 
 # ----------
 # Another group of parallel tests
 # geometry depends on point, lseg, box, path, polygon and circle
 # horology depends on interval, timetz, timestamp, timestamptz
+# opr_sanity depends on create_function_0
 # ----------
-test: geometry horology regex type_sanity opr_sanity misc_sanity comments expressions unicode xid mvcc
+test: geometry horology tstypes regex type_sanity opr_sanity misc_sanity comments expressions unicode xid mvcc
 
 # ----------
 # These four each depend on the previous one
index 1990cbb6a13baa19409ce81a075a2b85f2d36687..d8756e5ba005afb7144b4cf9406fc26895b11572 100644 (file)
@@ -36,6 +36,7 @@
 #include "nodes/supportnodes.h"
 #include "optimizer/optimizer.h"
 #include "optimizer/plancat.h"
+#include "parser/parse_coerce.h"
 #include "port/atomics.h"
 #include "storage/spin.h"
 #include "utils/builtins.h"
@@ -1194,3 +1195,14 @@ test_enc_conversion(PG_FUNCTION_ARGS)
 
        PG_RETURN_DATUM(HeapTupleGetDatum(tuple));
 }
+
+/* Provide SQL access to IsBinaryCoercible() */
+PG_FUNCTION_INFO_V1(binary_coercible);
+Datum
+binary_coercible(PG_FUNCTION_ARGS)
+{
+       Oid                     srctype = PG_GETARG_OID(0);
+       Oid                     targettype = PG_GETARG_OID(1);
+
+       PG_RETURN_BOOL(IsBinaryCoercible(srctype, targettype));
+}
index 56448476015657f0b0ddf6912efa4f6fe52e2b53..6e9cdf92af39c3bdd89023d06d5f590982a1a5c9 100644 (file)
@@ -10,8 +10,6 @@ test: int2
 test: int4
 test: int8
 test: oid
-test: xid
-test: mvcc
 test: float4
 test: float8
 test: bit
@@ -21,7 +19,6 @@ test: uuid
 test: enum
 test: money
 test: rangetypes
-test: multirangetypes
 test: pg_lsn
 test: regproc
 test: strings
@@ -42,9 +39,11 @@ test: interval
 test: inet
 test: macaddr
 test: macaddr8
-test: tstypes
+test: multirangetypes
+test: create_function_0
 test: geometry
 test: horology
+test: tstypes
 test: regex
 test: type_sanity
 test: opr_sanity
@@ -52,6 +51,8 @@ test: misc_sanity
 test: comments
 test: expressions
 test: unicode
+test: xid
+test: mvcc
 test: create_function_1
 test: create_type
 test: create_table
@@ -92,7 +93,6 @@ test: select_distinct_on
 test: select_implicit
 test: select_having
 test: subselect
-test: incremental_sort
 test: union
 test: case
 test: join
@@ -109,8 +109,6 @@ test: delete
 test: namespace
 test: prepared_xacts
 test: brin
-test: brin_bloom
-test: brin_multi
 test: gin
 test: gist
 test: spgist
@@ -130,6 +128,8 @@ test: password
 test: identity
 test: generated
 test: join_hash
+test: brin_bloom
+test: brin_multi
 test: create_table_like
 test: alter_generic
 test: alter_operator
@@ -143,6 +143,7 @@ test: tid
 test: tidscan
 test: tidrangescan
 test: collate.icu.utf8
+test: incremental_sort
 test: rules
 test: psql
 test: psql_crosstab
index 46c8112094c9e761eb0c1ab91d7fe4270895f04f..fe14af6ae7a9d56d06f3ab04b883c49142a3bd8d 100644 (file)
@@ -1,5 +1,6 @@
 /constraints.sql
 /copy.sql
+/create_function_0.sql
 /create_function_1.sql
 /create_function_2.sql
 /largeobject.sql
index ea85f20ed8354e8d4dd1605cd7f334af4d209a89..835868243219774e1a3e23ce2368a7f2f32710ca 100644 (file)
@@ -40,7 +40,7 @@ DROP USER regress_conversion_user;
 --
 
 -- Helper function to test a conversion. Uses the test_enc_conversion function
--- that was created in the create_function_1 test.
+-- that was created in the create_function_0 test.
 create or replace function test_conv(
   input IN bytea,
   src_encoding IN text,
index 393acdf8c3cf3e9fd77528072f26b10d8ed7b339..5a9c4796923d65af2d66fb7b5ea9530fa385f895 100644 (file)
 -- that test creates some bogus operators...
 
 
--- Helper functions to deal with cases where binary-coercible matches are
--- allowed.
-
--- This should match IsBinaryCoercible() in parse_coerce.c.
--- It doesn't currently know about some cases, notably domains, anyelement,
--- anynonarray, anyenum, or record, but it doesn't need to (yet).
-create function binary_coercible(oid, oid) returns bool as $$
-begin
-  if $1 = $2 then return true; end if;
-  if EXISTS(select 1 from pg_catalog.pg_cast where
-            castsource = $1 and casttarget = $2 and
-            castmethod = 'b' and castcontext = 'i')
-  then return true; end if;
-  if $2 = 'pg_catalog.any'::pg_catalog.regtype then return true; end if;
-  if $2 = 'pg_catalog.anyarray'::pg_catalog.regtype then
-    if EXISTS(select 1 from pg_catalog.pg_type where
-              oid = $1 and typelem != 0 and
-              typsubscript = 'pg_catalog.array_subscript_handler'::pg_catalog.regproc)
-    then return true; end if;
-  end if;
-  if $2 = 'pg_catalog.anyrange'::pg_catalog.regtype then
-    if (select typtype from pg_catalog.pg_type where oid = $1) = 'r'
-    then return true; end if;
-  end if;
-  if $2 = 'pg_catalog.anymultirange'::pg_catalog.regtype then
-    if (select typtype from pg_catalog.pg_type where oid = $1) = 'm'
-    then return true; end if;
-  end if;
-  return false;
-end
-$$ language plpgsql strict stable;
-
--- This one ignores castcontext, so it will allow cases where an explicit
--- (but still binary) cast would be required to convert the input type.
--- We don't currently use this for any tests in this file, but it is a
--- reasonable alternative definition for some scenarios.
-create function explicitly_binary_coercible(oid, oid) returns bool as $$
-begin
-  if $1 = $2 then return true; end if;
-  if EXISTS(select 1 from pg_catalog.pg_cast where
-            castsource = $1 and casttarget = $2 and
-            castmethod = 'b')
-  then return true; end if;
-  if $2 = 'pg_catalog.any'::pg_catalog.regtype then return true; end if;
-  if $2 = 'pg_catalog.anyarray'::pg_catalog.regtype then
-    if EXISTS(select 1 from pg_catalog.pg_type where
-              oid = $1 and typelem != 0 and
-              typsubscript = 'pg_catalog.array_subscript_handler'::pg_catalog.regproc)
-    then return true; end if;
-  end if;
-  if $2 = 'pg_catalog.anyrange'::pg_catalog.regtype then
-    if (select typtype from pg_catalog.pg_type where oid = $1) = 'r'
-    then return true; end if;
-  end if;
-  return false;
-end
-$$ language plpgsql strict stable;
-
-
 -- **************** pg_proc ****************
 
 -- Look for illegal values in pg_proc fields.
index 4739aca84a39067444583a681f535a209b75901e..404c3a20432e577271bd364c9e92234b1f0b43bc 100644 (file)
@@ -465,7 +465,7 @@ FROM pg_range p1 JOIN pg_type t ON t.oid = p1.rngsubtype
 WHERE (rngcollation = 0) != (typcollation = 0);
 
 -- opclass had better be a btree opclass accepting the subtype.
--- We must allow anyarray matches, cf opr_sanity's binary_coercible()
+-- We must allow anyarray matches, cf IsBinaryCoercible()
 
 SELECT p1.rngtypid, p1.rngsubtype, o.opcmethod, o.opcname
 FROM pg_range p1 JOIN pg_opclass o ON o.oid = p1.rngsubopc