n.zhuch...@postgrespro.ru писал 2018-02-28 18:04:
Attached patch allow direct convertion of numeric types to bool like
integer::bool.
Supported types:
 - smallint;
 - bigint;
 - real;
 - double precision;
 - decimal(numeric).

This functionality is helped with migration from Oracle.
diff --git a/src/backend/catalog/information_schema.sql b/src/backend/catalog/information_schema.sql
index 686528c..6cbfcf5 100644
--- a/src/backend/catalog/information_schema.sql
+++ b/src/backend/catalog/information_schema.sql
@@ -2970,3 +2970,83 @@ CREATE VIEW user_mappings AS
     FROM _pg_user_mappings;
 
 GRANT SELECT ON user_mappings TO PUBLIC;
+
+-- bool --> smallint(int2)
+CREATE OR REPLACE FUNCTION bool_smallint(boolean)
+  RETURNS smallint AS
+  'bool_int2'
+  LANGUAGE internal IMMUTABLE STRICT  PARALLEL SAFE
+  COST 1;
+CREATE CAST (boolean AS smallint) WITH FUNCTION bool_smallint(boolean) as implicit;
+
+-- smallint(int2) --> bool
+CREATE OR REPLACE FUNCTION smallint_bool(smallint)
+  RETURNS bool AS
+  'int2_bool'
+  LANGUAGE internal IMMUTABLE STRICT  PARALLEL SAFE
+  COST 1;
+CREATE CAST (smallint AS boolean) WITH FUNCTION smallint_bool(smallint) as implicit;
+
+-- bigint(int8) --> bool
+CREATE OR REPLACE FUNCTION bool_bigint(boolean)
+  RETURNS bigint AS
+  'bool_int8'
+  LANGUAGE internal IMMUTABLE STRICT  PARALLEL SAFE
+  COST 1;
+CREATE CAST (boolean AS bigint) WITH FUNCTION bool_bigint(boolean) as implicit;
+
+-- bool --> bigint(int8)
+CREATE OR REPLACE FUNCTION bigint_bool(bigint)
+  RETURNS bool AS
+  'int8_bool'
+  LANGUAGE internal IMMUTABLE STRICT  PARALLEL SAFE
+  COST 1;
+CREATE CAST (bigint AS boolean) WITH FUNCTION bigint_bool(bigint) as implicit;
+
+-- double precision(float8) --> bool
+CREATE OR REPLACE FUNCTION double_precision_bool(double precision)
+  RETURNS bool AS
+  'float8_bool'
+  LANGUAGE internal IMMUTABLE STRICT  PARALLEL SAFE
+  COST 1;
+CREATE CAST (double precision AS boolean) WITH FUNCTION double_precision_bool(double precision) as implicit;
+
+-- bool --> double precision(float8)
+CREATE OR REPLACE FUNCTION bool_double_precision(boolean)
+  RETURNS double precision AS
+  'bool_float8'
+  LANGUAGE internal IMMUTABLE STRICT  PARALLEL SAFE
+  COST 1;
+CREATE CAST (boolean AS double precision) WITH FUNCTION bool_double_precision(boolean) as implicit;
+
+-- real(float4) --> bool
+CREATE OR REPLACE FUNCTION real_bool(real)
+  RETURNS bool AS
+  'float4_bool'
+  LANGUAGE internal IMMUTABLE STRICT  PARALLEL SAFE
+  COST 1;
+CREATE CAST (real AS boolean) WITH FUNCTION real_bool(real) as implicit;
+
+-- bool --> real(float4)
+CREATE OR REPLACE FUNCTION bool_real(boolean)
+  RETURNS real AS
+  'bool_float4'
+  LANGUAGE internal IMMUTABLE STRICT  PARALLEL SAFE
+  COST 1;
+CREATE CAST (boolean AS real) WITH FUNCTION bool_real(boolean) as implicit;
+
+-- numeric(decimal) --> bool
+CREATE OR REPLACE FUNCTION numeric_bool(decimal)
+  RETURNS bool AS
+  'numeric_bool'
+  LANGUAGE internal IMMUTABLE STRICT  PARALLEL SAFE
+  COST 1;
+CREATE CAST (decimal AS boolean) WITH FUNCTION numeric_bool(decimal) as implicit;
+
+-- bool --> numeric(decimal)
+CREATE OR REPLACE FUNCTION bool_numeric(boolean)
+  RETURNS decimal AS
+  'bool_numeric'
+  LANGUAGE internal IMMUTABLE STRICT  PARALLEL SAFE
+  COST 1;
+CREATE CAST (boolean AS decimal) WITH FUNCTION bool_numeric(boolean) as implicit;
diff --git a/src/backend/utils/adt/float.c b/src/backend/utils/adt/float.c
index bc6a3e0..a687104 100644
--- a/src/backend/utils/adt/float.c
+++ b/src/backend/utils/adt/float.c
@@ -1331,6 +1331,53 @@ i2tof(PG_FUNCTION_ARGS)
 	PG_RETURN_FLOAT4((float4) num);
 }
 
+ /*
+ *   float4_bool     - converts a float4 number to a bool
+ *   epsilon - machine epsilon gives an upper bound on the relative error
+ *   due to rounding in floating point arithmetic.
+ */
+Datum
+float4_bool(PG_FUNCTION_ARGS)
+{
+ float epsilon = 5.96e-08;
+
+ if (fabs(PG_GETARG_FLOAT4(0)) <= epsilon)
+   PG_RETURN_BOOL(false);
+ else
+ PG_RETURN_BOOL(true);
+}
+
+/*
+ *   bool_float4     - converts a bool to a float4 number
+ */
+Datum
+bool_float4(PG_FUNCTION_ARGS)
+{
+ if (PG_GETARG_BOOL(0) == false)
+   PG_RETURN_FLOAT4(0);
+ else
+   PG_RETURN_FLOAT4(1);
+}
+
+/*
+ *   float8_bool     - converts a float4 number to a bool
+ *   epsilon - machine epsilon gives an upper bound on the relative error
+ *   due to rounding in floating point arithmetic.
+ */
+Datum
+float8_bool(PG_FUNCTION_ARGS)
+{
+ float epsilon = 1.11e-16;
+
+ if (fabs(PG_GETARG_FLOAT8(0)) <= epsilon)
+   PG_RETURN_BOOL(false);
+ else
+   PG_RETURN_BOOL(true);
+}
+
+/*
+ *   bool_float8     - converts a bool to a float4 number
+ */
+Datum
+bool_float8(PG_FUNCTION_ARGS)
+{
+ if (PG_GETARG_BOOL(0) == false)
+   PG_RETURN_FLOAT8(0);
+ else
+   PG_RETURN_FLOAT8(1);
+}
 
 /*
  *		=======================
diff --git a/src/backend/utils/adt/int.c b/src/backend/utils/adt/int.c
index 559c365..a6ea79b 100644
--- a/src/backend/utils/adt/int.c
+++ b/src/backend/utils/adt/int.c
@@ -354,6 +354,26 @@ bool_int4(PG_FUNCTION_ARGS)
 		PG_RETURN_INT32(1);
 }
 
+/* Cast int2 -> bool */
+Datum
+int2_bool(PG_FUNCTION_ARGS)
+{
+	if (PG_GETARG_INT16(0) == 0)
+		PG_RETURN_BOOL(false);
+	else
+		PG_RETURN_BOOL(true);
+}
+
+/* Cast bool -> int2 */
+Datum
+bool_int2(PG_FUNCTION_ARGS)
+{
+	if (PG_GETARG_BOOL(0) == false)
+		PG_RETURN_INT16(0);
+	else
+		PG_RETURN_INT16(1);
+}
+
 /*
  *		============================
  *		COMPARISON OPERATOR ROUTINES
diff --git a/src/backend/utils/adt/int8.c b/src/backend/utils/adt/int8.c
index e6bae68..06ec92d 100644
--- a/src/backend/utils/adt/int8.c
+++ b/src/backend/utils/adt/int8.c
@@ -1357,3 +1357,23 @@ generate_series_step_int8(PG_FUNCTION_ARGS)
 		/* do when there is no more left */
 		SRF_RETURN_DONE(funcctx);
 }
+
+/* Cast int8 -> bool */
+Datum
+int8_bool(PG_FUNCTION_ARGS)
+{
+	if (PG_GETARG_INT64(0) == 0)
+		PG_RETURN_BOOL(false);
+	else
+		PG_RETURN_BOOL(true);
+}
+
+/* Cast bool -> int8 */
+Datum
+bool_int8(PG_FUNCTION_ARGS)
+{
+	if (PG_GETARG_BOOL(0) == false)
+		PG_RETURN_INT64(0);
+	else
+		PG_RETURN_INT64(1);
+}
\ No newline at end of file
diff --git a/src/backend/utils/adt/numeric.c b/src/backend/utils/adt/numeric.c
index 5b34bad..513dabb 100644
--- a/src/backend/utils/adt/numeric.c
+++ b/src/backend/utils/adt/numeric.c
@@ -3184,6 +3184,38 @@ numeric_float8(PG_FUNCTION_ARGS)
 	PG_RETURN_DATUM(result);
 }
 
+Datum
+bool_numeric(PG_FUNCTION_ARGS)
+{
+	bool		val = PG_GETARG_BOOL(0);
+	Numeric		res;
+	NumericVar	result;
+
+	init_var(&result);
+
+	int64_to_numericvar((int64) val, &result);
+
+	res = make_result(&result);
+
+	free_var(&result);
+
+	PG_RETURN_NUMERIC(res);
+}
+
+Datum
+numeric_bool(PG_FUNCTION_ARGS)
+{
+	Numeric		num = PG_GETARG_NUMERIC(0);
+	Numeric		num2;
+	NumericVar	num2v;
+
+	init_var(&num2v);
+	
+	int64_to_numericvar((int64) 0, &num2v);
+	num2 = make_result(&num2v);
+
+	PG_RETURN_BOOL(cmp_numerics(num, num2) != 0);
+}
 
 /*
  * Convert numeric to float8; if out of range, return +/- HUGE_VAL
diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h
index 2a53213..28b823f 100644
--- a/src/include/catalog/pg_proc.h
+++ b/src/include/catalog/pg_proc.h
@@ -5561,6 +5561,32 @@ DESCR("list of files in the WAL directory");
 DATA(insert OID = 5028 ( satisfies_hash_partition PGNSP PGUID 12 1 0 2276 0 f f f f f f i s 4 0 16 "26 23 23 2276" _null_ "{i,i,i,v}" _null_ _null_ _null_ satisfies_hash_partition _null_ _null_ _null_ ));
 DESCR("hash partition CHECK constraint");
 
+/* Convertation type->bool and bool->type for numeric types exclude int4 */
+DATA(insert OID = 7557 ( bool				   PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 16 "20" _null_ _null_ _null_ _null_ _null_ int8_bool _null_ _null_ _null_ ));
+DESCR("convert int8 to boolean");
+DATA(insert OID = 7558 ( int8				   PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 20 "16" _null_ _null_ _null_ _null_ _null_ bool_int8 _null_ _null_ _null_ ));
+DESCR("convert boolean to int8");
+
+DATA(insert OID = 7559 ( bool				   PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 16 "21" _null_ _null_ _null_ _null_ _null_ int2_bool _null_ _null_ _null_ ));
+DESCR("convert int2 to boolean");
+DATA(insert OID = 7560 ( int2				   PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 21 "16" _null_ _null_ _null_ _null_ _null_ bool_int2 _null_ _null_ _null_ ));
+DESCR("convert boolean to int2");
+
+DATA(insert OID = 7561 ( bool				   PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 16 "701" _null_ _null_ _null_ _null_ _null_ float8_bool _null_ _null_ _null_ ));
+DESCR("convert float8 to boolean");
+DATA(insert OID = 7562 ( float8				   PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 701 "16" _null_ _null_ _null_ _null_ _null_ bool_float8 _null_ _null_ _null_ ));
+DESCR("convert boolean to float8");
+
+DATA(insert OID = 7563 ( bool				   PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 16 "700" _null_ _null_ _null_ _null_ _null_ float4_bool _null_ _null_ _null_ ));
+DESCR("convert float4 to boolean");
+DATA(insert OID = 7564 ( float4				   PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 700 "16" _null_ _null_ _null_ _null_ _null_ bool_float4 _null_ _null_ _null_ ));
+DESCR("convert boolean to float4");
+
+DATA(insert OID = 7565 ( numeric			   PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 1700 "16" _null_ _null_ _null_ _null_ _null_ bool_numeric _null_ _null_ _null_ ));
+DESCR("convert numeric to boolean");
+DATA(insert OID = 7566 ( bool				   PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 16 "1700" _null_ _null_ _null_ _null_ _null_ numeric_bool _null_ _null_ _null_ ));
+DESCR("convert boolean to numeric");
+
 /*
  * Symbolic values for provolatile column: these indicate whether the result
  * of a function is dependent *only* on the values of its explicit arguments,
  diff --git a/src/test/regress/expected/alter_table.out b/src/test/regress/expected/alter_table.out
index af416ad..d9ffe98 100644
--- a/src/test/regress/expected/alter_table.out
+++ b/src/test/regress/expected/alter_table.out
@@ -1851,8 +1851,8 @@ select * from anothertab;
 (2 rows)
 
 alter table anothertab alter column atcol1 type boolean; -- fails
-ERROR:  column "atcol1" cannot be cast automatically to type boolean
-HINT:  You might need to specify "USING atcol1::boolean".
+ERROR:  operator is not unique: boolean <= integer
+HINT:  Could not choose a best candidate operator. You might need to add explicit type casts.
 alter table anothertab alter column atcol1 type boolean using atcol1::int; -- fails
 ERROR:  result of USING clause for column "atcol1" cannot be cast automatically to type boolean
 HINT:  You might need to add an explicit cast.
@@ -1890,12 +1890,13 @@ select * from anothertab;
 
 alter table anothertab alter column atcol1 type boolean
         using case when atcol1 % 2 = 0 then true else false end; -- fails
-ERROR:  default for column "atcol1" cannot be cast automatically to type boolean
+ERROR:  operator is not unique: boolean <= integer
+HINT:  Could not choose a best candidate operator. You might need to add explicit type casts.
 alter table anothertab alter column atcol1 drop default;
 alter table anothertab alter column atcol1 type boolean
         using case when atcol1 % 2 = 0 then true else false end; -- fails
-ERROR:  operator does not exist: boolean <= integer
-HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.
+ERROR:  operator is not unique: boolean <= integer
+HINT:  Could not choose a best candidate operator. You might need to add explicit type casts.
 alter table anothertab drop constraint anothertab_chk;
 alter table anothertab drop constraint anothertab_chk; -- fails
 ERROR:  constraint "anothertab_chk" of relation "anothertab" does not exist
diff --git a/src/test/regress/expected/float4.out b/src/test/regress/expected/float4.out
index fd46a4a..342b671 100644
--- a/src/test/regress/expected/float4.out
+++ b/src/test/regress/expected/float4.out
@@ -257,3 +257,77 @@ SELECT '' AS five, * FROM FLOAT4_TBL;
       | -1.23457e-20
 (5 rows)
 
+-- strict direct convertation from  real(float4) to bool
+select 2.2::real::bool;
+ bool 
+------
+ t
+(1 row)
+
+select 0.2::real::bool;
+ bool 
+------
+ t
+(1 row)
+
+select 0.0::real::bool;
+ bool 
+------
+ f
+(1 row)
+
+select 'NaN'::real::bool;
+ bool 
+------
+ t
+(1 row)
+
+select '+infinity'::real::bool;
+ bool 
+------
+ t
+(1 row)
+
+select '-infinity'::real::bool;
+ bool 
+------
+ t
+(1 row)
+
+select 2.22e-16::real::bool;
+ bool 
+------
+ f
+(1 row)
+
+select 6.96e-08::real::bool;
+ bool 
+------
+ t
+(1 row)
+
+select 5.96e-08::real::bool;
+ bool 
+------
+ f
+(1 row)
+
+select (-2.22e-16)::real::bool;
+ bool 
+------
+ f
+(1 row)
+
+select (-6.96e-08)::real::bool;
+ bool 
+------
+ t
+(1 row)
+
+select (-5.96e-08)::real::bool;
+ bool 
+------
+ f
+(1 row)
+
+-- strict direct convertation from bool to real(float4)
+select true::bool::real;
+ float4 
+--------
+      1
+(1 row)
+
+select false::bool::real;
+ float4 
+--------
+      0
+(1 row)
+
diff --git a/src/test/regress/expected/float8.out b/src/test/regress/expected/float8.out
index 20c985e..acb340c 100644
--- a/src/test/regress/expected/float8.out
+++ b/src/test/regress/expected/float8.out
@@ -548,3 +548,77 @@ FROM (SELECT 10*cosd(a), 10*sind(a)
 (5 rows)
 
 RESET extra_float_digits;
+-- strict direct convertation from  double precision(float8) to bool
+select 2.2::double precision::bool;
+ bool 
+------
+ t
+(1 row)
+
+select 0.2::double precision::bool;
+ bool 
+------
+ t
+(1 row)
+
+select 0.0::double precision::bool;
+ bool 
+------
+ f
+(1 row)
+
+select 'NaN'::double precision::bool;
+ bool 
+------
+ t
+(1 row)
+
+select '+infinity'::double precision::bool;
+ bool 
+------
+ t
+(1 row)
+
+select '-infinity'::double precision::bool;
+ bool 
+------
+ t
+(1 row)
+
+select 0.11e-16::double precision::bool;
+ bool 
+------
+ f
+(1 row)
+
+select 2.96e-08::double precision::bool;
+ bool 
+------
+ t
+(1 row)
+
+select 1.11e-16::double precision::bool;
+ bool 
+------
+ f
+(1 row)
+
+select (-0.15e-17)::double precision::bool;
+ bool 
+------
+ f
+(1 row)
+
+select (-2.96e-08)::double precision::bool;
+ bool 
+------
+ t
+(1 row)
+
+select (-1.11e-16)::double precision::bool;
+ bool 
+------
+ f
+(1 row)
+
+-- strict direct convertation from bool to double precision(float8)
+select true::bool::double precision;
+ float8 
+--------
+      1
+(1 row)
+
+select false::bool::double precision;
+ float8 
+--------
+      0
+(1 row)
+
diff --git a/src/test/regress/expected/int2.out b/src/test/regress/expected/int2.out
index 3ea4ed9..d5c81d1 100644
--- a/src/test/regress/expected/int2.out
+++ b/src/test/regress/expected/int2.out
@@ -306,3 +306,41 @@ FROM (VALUES (-2.5::numeric),
   2.5 |          3
 (7 rows)
 
+-- strict direct convertation from bool to smallint(int2)
+SELECT 1::bool::smallint;
+ int2 
+------
+    1
+(1 row)
+
+SELECT 0::bool::smallint;
+ int2 
+------
+    0
+(1 row)
+
+SELECT 100::bool::smallint;
+ int2 
+------
+    1
+(1 row)
+
+-- strict direct convertation from  smallint(int2) to bool
+SELECT 1::smallint::bool;
+ bool 
+------
+ t
+(1 row)
+
+SELECT 0::smallint::bool;
+ bool 
+------
+ f
+(1 row)
+
+SELECT 100::smallint::bool;
+ bool 
+------
+ t
+(1 row)
+
diff --git a/src/test/regress/expected/int8.out b/src/test/regress/expected/int8.out
index ed0bd34..f5b9277 100644
--- a/src/test/regress/expected/int8.out
+++ b/src/test/regress/expected/int8.out
@@ -886,3 +886,41 @@ FROM (VALUES (-2.5::numeric),
   2.5 |          3
 (7 rows)
 
+-- strict direct convertation from bool to bigint(int8)
+SELECT 1::bool::bigint;
+ int8 
+------
+    1
+(1 row)
+
+SELECT 0::bool::bigint;
+ int8 
+------
+    0
+(1 row)
+
+SELECT 1234567890::bool::bigint;
+ int8 
+------
+    1
+(1 row)
+
+-- strict direct convertation from  bigint(int8) to bool
+SELECT 1::bigint::bool;
+ bool 
+------
+ t
+(1 row)
+
+SELECT 0::bigint::bool;
+ bool 
+------
+ f
+(1 row)
+
+SELECT 1234567890::bigint::bool;
+ bool 
+------
+ t
+(1 row)
+
diff --git a/src/test/regress/expected/numeric.out b/src/test/regress/expected/numeric.out
index 17985e8..2b426a4 100644
--- a/src/test/regress/expected/numeric.out
+++ b/src/test/regress/expected/numeric.out
@@ -2063,3 +2063,41 @@ SELECT SUM((-9999)::numeric) FROM generate_series(1, 100000);
  -999900000
 (1 row)
 
+-- strict direct convertation from bool to decimal(numeric)
+SELECT 1::bool::decimal;
+ numeric 
+---------
+       1
+(1 row)
+
+SELECT 0::bool::decimal;
+ numeric 
+---------
+       0
+(1 row)
+
+SELECT 1234567890::bool::decimal;
+ numeric 
+---------
+       1
+(1 row)
+
+-- strict direct convertation from  decimal(numeric) to bool
+SELECT 1::decimal::bool;
+ bool 
+------
+ t
+(1 row)
+
+SELECT 0::decimal::bool;
+ bool 
+------
+ f
+(1 row)
+
+SELECT 1234567890::decimal::bool;
+ bool 
+------
+ t
+(1 row)
+
diff --git a/src/test/regress/expected/prepare.out b/src/test/regress/expected/prepare.out
index 7016e82..460e78f 100644
--- a/src/test/regress/expected/prepare.out
+++ b/src/test/regress/expected/prepare.out
@@ -112,7 +112,7 @@ ERROR:  wrong number of parameters for prepared statement "q3"
 DETAIL:  Expected 6 parameters but got 7.
 -- wrong param types
 EXECUTE q3(5::smallint, 10.5::float, false, 500::oid, 4::bigint, 'bytea');
-ERROR:  parameter $3 of type boolean cannot be coerced to the expected type double precision
+ERROR:  parameter $4 of type oid cannot be coerced to the expected type boolean
 HINT:  You will need to rewrite or cast the expression.
 -- invalid type
 PREPARE q4(nonexistenttype) AS SELECT $1;
diff --git a/src/test/regress/sql/float4.sql b/src/test/regress/sql/float4.sql
index 3b363f9..9a48085 100644
--- a/src/test/regress/sql/float4.sql
+++ b/src/test/regress/sql/float4.sql
@@ -81,3 +81,19 @@ UPDATE FLOAT4_TBL
    WHERE FLOAT4_TBL.f1 > '0.0';
 
 SELECT '' AS five, * FROM FLOAT4_TBL;
+
+-- strict direct convertation from  real(float4) to bool
+select 2.2::real::bool;
+select 0.2::real::bool;
+select 0.0::real::bool;
+select 'NaN'::real::bool;
+select '+infinity'::real::bool;
+select '-infinity'::real::bool;
+select 2.22e-16::real::bool;
+select 6.96e-08::real::bool;
+select 5.96e-08::real::bool;
+select (-2.22e-16)::real::bool;
+select (-6.96e-08)::real::bool;
+select (-5.96e-08)::real::bool;
+
+-- strict direct convertation from bool to real(float4)
+select true::bool::real;
+select false::bool::real;
\ No newline at end of file
diff --git a/src/test/regress/sql/float8.sql b/src/test/regress/sql/float8.sql
index 215e7a4..5b85cfc 100644
--- a/src/test/regress/sql/float8.sql
+++ b/src/test/regress/sql/float8.sql
@@ -213,3 +213,19 @@ FROM (SELECT 10*cosd(a), 10*sind(a)
       FROM generate_series(0, 360, 90) AS t(a)) AS t(x,y);
 
 RESET extra_float_digits;
+
+-- strict direct convertation from  double precision(float8) to bool
+select 2.2::double precision::bool;
+select 0.2::double precision::bool;
+select 0.0::double precision::bool;
+select 'NaN'::double precision::bool;
+select '+infinity'::double precision::bool;
+select '-infinity'::double precision::bool;
+select 0.11e-16::double precision::bool;
+select 2.96e-08::double precision::bool;
+select 1.11e-16::double precision::bool;
+select (-0.15e-17)::double precision::bool;
+select (-2.96e-08)::double precision::bool;
+select (-1.11e-16)::double precision::bool;
+
+-- strict direct convertation from bool to double precision(float8)
+select true::bool::double precision;
+select false::bool::double precision;
\ No newline at end of file
diff --git a/src/test/regress/sql/int2.sql b/src/test/regress/sql/int2.sql
index 7dbafb6..3652271 100644
--- a/src/test/regress/sql/int2.sql
+++ b/src/test/regress/sql/int2.sql
@@ -112,3 +112,13 @@ FROM (VALUES (-2.5::numeric),
              (0.5::numeric),
              (1.5::numeric),
              (2.5::numeric)) t(x);
+
+-- strict direct convertation from bool to smallint(int2)
+SELECT 1::bool::smallint;
+SELECT 0::bool::smallint;
+SELECT 100::bool::smallint;
+
+-- strict direct convertation from  smallint(int2) to bool
+SELECT 1::smallint::bool;
+SELECT 0::smallint::bool;
+SELECT 100::smallint::bool;
\ No newline at end of file
diff --git a/src/test/regress/sql/int8.sql b/src/test/regress/sql/int8.sql
index e890452..aaa2b19 100644
--- a/src/test/regress/sql/int8.sql
+++ b/src/test/regress/sql/int8.sql
@@ -225,3 +225,13 @@ FROM (VALUES (-2.5::numeric),
              (0.5::numeric),
              (1.5::numeric),
              (2.5::numeric)) t(x);
+
+-- strict direct convertation from bool to bigint(int8)
+SELECT 1::bool::bigint;
+SELECT 0::bool::bigint;
+SELECT 1234567890::bool::bigint;
+
+-- strict direct convertation from  bigint(int8) to bool
+SELECT 1::bigint::bool;
+SELECT 0::bigint::bool;
+SELECT 1234567890::bigint::bool;
\ No newline at end of file
diff --git a/src/test/regress/sql/numeric.sql b/src/test/regress/sql/numeric.sql
index d77504e..4398594 100644
--- a/src/test/regress/sql/numeric.sql
+++ b/src/test/regress/sql/numeric.sql
@@ -1036,3 +1036,13 @@ select scale(-13.000000000000000);
 -- cases that need carry propagation
 SELECT SUM(9999::numeric) FROM generate_series(1, 100000);
 SELECT SUM((-9999)::numeric) FROM generate_series(1, 100000);
+
+-- strict direct convertation from bool to decimal(numeric)
+SELECT 1::bool::decimal;
+SELECT 0::bool::decimal;
+SELECT 1234567890::bool::decimal;
+
+-- strict direct convertation from  decimal(numeric) to bool
+SELECT 1::decimal::bool;
+SELECT 0::decimal::bool;
+SELECT 1234567890::decimal::bool;
\ No newline at end of file

Reply via email to