From a1d2e165500d65375145a5149a288ca34f8bd90d Mon Sep 17 00:00:00 2001
From: Heikki Linnakangas <heikki.linnakangas@iki.fi>
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 00000000000..67eaab23166
--- /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 d8220058733..5257b463018 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 f90a4042352..70dd424849c 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 00000000000..ad348daa097
--- /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
-- 
GitLab