From a1d2e165500d65375145a5149a288ca34f8bd90d Mon Sep 17 00:00:00 2001 From: Heikki Linnakangas Date: Fri, 31 Oct 2008 09:17:17 +0000 Subject: [PATCH] Add test case for CREATE CAST. --- src/test/regress/expected/create_cast.out | 74 +++++++++++++++++++++++ src/test/regress/parallel_schedule | 4 +- src/test/regress/serial_schedule | 3 +- src/test/regress/sql/create_cast.sql | 54 +++++++++++++++++ 4 files changed, 132 insertions(+), 3 deletions(-) create mode 100644 src/test/regress/expected/create_cast.out create mode 100644 src/test/regress/sql/create_cast.sql diff --git a/src/test/regress/expected/create_cast.out b/src/test/regress/expected/create_cast.out new file mode 100644 index 0000000000..67eaab2316 --- /dev/null +++ b/src/test/regress/expected/create_cast.out @@ -0,0 +1,74 @@ +-- +-- CREATE_CAST +-- +-- Create some types to test with +CREATE TYPE casttesttype; +CREATE FUNCTION casttesttype_in(cstring) + RETURNS casttesttype + AS 'textin' + LANGUAGE internal STRICT; +NOTICE: return type casttesttype is only a shell +CREATE FUNCTION casttesttype_out(casttesttype) + RETURNS cstring + AS 'textout' + LANGUAGE internal STRICT; +NOTICE: argument type casttesttype is only a shell +CREATE TYPE casttesttype ( + internallength = variable, + input = casttesttype_in, + output = casttesttype_out, + alignment = int4 +); +-- a dummy function to test with +CREATE FUNCTION casttestfunc(casttesttype) RETURNS int4 LANGUAGE SQL AS +$$ SELECT 1; $$; +SELECT casttestfunc('foo'::text); -- fails, as there's no cast +ERROR: function casttestfunc(text) does not exist +LINE 1: SELECT casttestfunc('foo'::text); + ^ +HINT: No function matches the given name and argument types. You might need to add explicit type casts. +-- Try binary coercion cast +CREATE CAST (text AS casttesttype) WITHOUT FUNCTION; +SELECT casttestfunc('foo'::text); -- doesn't work, as the cast is explicit +ERROR: function casttestfunc(text) does not exist +LINE 1: SELECT casttestfunc('foo'::text); + ^ +HINT: No function matches the given name and argument types. You might need to add explicit type casts. +SELECT casttestfunc('foo'::text::casttesttype); -- should work + casttestfunc +-------------- + 1 +(1 row) + +DROP CAST (text AS casttesttype); -- cleanup +-- Try IMPLICIT binary coercion cast +CREATE CAST (text AS casttesttype) WITHOUT FUNCTION AS IMPLICIT; +SELECT casttestfunc('foo'::text); -- Should work now + casttestfunc +-------------- + 1 +(1 row) + +-- Try I/O conversion cast. +SELECT 1234::int4::casttesttype; -- No cast yet, should fail +ERROR: cannot cast type integer to casttesttype +LINE 1: SELECT 1234::int4::casttesttype; + ^ +CREATE CAST (int4 AS casttesttype) WITH INOUT; +SELECT 1234::int4::casttesttype; -- Should work now + casttesttype +-------------- + 1234 +(1 row) + +DROP CAST (int4 AS casttesttype); +-- Try cast with a function +CREATE FUNCTION int4_casttesttype(int4) RETURNS casttesttype LANGUAGE SQL AS +$$ SELECT ('foo'::text || $1::text)::casttesttype; $$; +CREATE CAST (int4 AS casttesttype) WITH FUNCTION int4_casttesttype(int4) AS IMPLICIT; +SELECT 1234::int4::casttesttype; -- Should work now + casttesttype +-------------- + foo1234 +(1 row) + diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule index d822005873..5257b46301 100644 --- a/src/test/regress/parallel_schedule +++ b/src/test/regress/parallel_schedule @@ -1,5 +1,5 @@ # ---------- -# $PostgreSQL: pgsql/src/test/regress/parallel_schedule,v 1.49 2008/10/04 21:56:55 tgl Exp $ +# $PostgreSQL: pgsql/src/test/regress/parallel_schedule,v 1.50 2008/10/31 09:17:16 heikki Exp $ # # By convention, we put no more than twenty tests in any one parallel group; # this limits the number of connections needed to run the tests. @@ -47,7 +47,7 @@ test: copy copyselect # ---------- # Another group of parallel tests # ---------- -test: constraints triggers create_misc create_aggregate create_operator inherit vacuum drop_if_exists +test: constraints triggers create_misc create_aggregate create_operator inherit vacuum drop_if_exists create_cast # Depends on the above test: create_index create_view diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule index f90a404235..70dd424849 100644 --- a/src/test/regress/serial_schedule +++ b/src/test/regress/serial_schedule @@ -1,4 +1,4 @@ -# $PostgreSQL: pgsql/src/test/regress/serial_schedule,v 1.46 2008/10/04 21:56:55 tgl Exp $ +# $PostgreSQL: pgsql/src/test/regress/serial_schedule,v 1.47 2008/10/31 09:17:16 heikki Exp $ # This should probably be in an order similar to parallel_schedule. test: boolean test: char @@ -48,6 +48,7 @@ test: create_function_1 test: create_type test: create_table test: create_function_2 +test: create_cast test: copy test: copyselect test: constraints diff --git a/src/test/regress/sql/create_cast.sql b/src/test/regress/sql/create_cast.sql new file mode 100644 index 0000000000..ad348daa09 --- /dev/null +++ b/src/test/regress/sql/create_cast.sql @@ -0,0 +1,54 @@ +-- +-- CREATE_CAST +-- + +-- Create some types to test with +CREATE TYPE casttesttype; + +CREATE FUNCTION casttesttype_in(cstring) + RETURNS casttesttype + AS 'textin' + LANGUAGE internal STRICT; +CREATE FUNCTION casttesttype_out(casttesttype) + RETURNS cstring + AS 'textout' + LANGUAGE internal STRICT; + +CREATE TYPE casttesttype ( + internallength = variable, + input = casttesttype_in, + output = casttesttype_out, + alignment = int4 +); + +-- a dummy function to test with +CREATE FUNCTION casttestfunc(casttesttype) RETURNS int4 LANGUAGE SQL AS +$$ SELECT 1; $$; + +SELECT casttestfunc('foo'::text); -- fails, as there's no cast + +-- Try binary coercion cast +CREATE CAST (text AS casttesttype) WITHOUT FUNCTION; +SELECT casttestfunc('foo'::text); -- doesn't work, as the cast is explicit +SELECT casttestfunc('foo'::text::casttesttype); -- should work +DROP CAST (text AS casttesttype); -- cleanup + +-- Try IMPLICIT binary coercion cast +CREATE CAST (text AS casttesttype) WITHOUT FUNCTION AS IMPLICIT; +SELECT casttestfunc('foo'::text); -- Should work now + +-- Try I/O conversion cast. +SELECT 1234::int4::casttesttype; -- No cast yet, should fail + +CREATE CAST (int4 AS casttesttype) WITH INOUT; +SELECT 1234::int4::casttesttype; -- Should work now + +DROP CAST (int4 AS casttesttype); + +-- Try cast with a function + +CREATE FUNCTION int4_casttesttype(int4) RETURNS casttesttype LANGUAGE SQL AS +$$ SELECT ('foo'::text || $1::text)::casttesttype; $$; + +CREATE CAST (int4 AS casttesttype) WITH FUNCTION int4_casttesttype(int4) AS IMPLICIT; +SELECT 1234::int4::casttesttype; -- Should work now -- 2.40.0