From 5c29e59612f91f98fb2a74815f1efe34bbf8577e Mon Sep 17 00:00:00 2001 From: liruixiang <461834084@qq.com> Date: Fri, 2 Dec 2022 19:34:22 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3ceil=E5=87=BD=E6=95=B0?= =?UTF-8?q?=E5=B5=8C=E5=A5=97tan=E5=87=BD=E6=95=B0=E5=8F=AF=E8=83=BD?= =?UTF-8?q?=E8=BF=94=E5=9B=9E-0=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/backend/utils/adt/float.cpp | 8 +++- .../regress/expected/ceil_negtive_zero.out | 43 +++++++++++++++++++ src/test/regress/parallel_schedule0 | 3 ++ src/test/regress/sql/ceil_negtive_zero.sql | 27 ++++++++++++ 4 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 src/test/regress/expected/ceil_negtive_zero.out create mode 100644 src/test/regress/sql/ceil_negtive_zero.sql diff --git a/src/common/backend/utils/adt/float.cpp b/src/common/backend/utils/adt/float.cpp index f76a2c971..c9ce96cb0 100644 --- a/src/common/backend/utils/adt/float.cpp +++ b/src/common/backend/utils/adt/float.cpp @@ -1418,7 +1418,13 @@ Datum dceil(PG_FUNCTION_ARGS) { float8 arg1 = PG_GETARG_FLOAT8(0); - PG_RETURN_FLOAT8(ceil(arg1)); + float8 result = ceil(arg1); + if (DB_IS_CMPT(A_FORMAT) && -0.0 == result) { + /* ceil function won't return -0 if compatible with O type database */ + result = 0.0; + } + + PG_RETURN_FLOAT8(result); } /* diff --git a/src/test/regress/expected/ceil_negtive_zero.out b/src/test/regress/expected/ceil_negtive_zero.out new file mode 100644 index 000000000..b65fd6d21 --- /dev/null +++ b/src/test/regress/expected/ceil_negtive_zero.out @@ -0,0 +1,43 @@ +-- +-- 处理ceil函数返回-0问题 +-- +create database ceil_nzero_test DBCOMPATIBILITY 'A'; +\c ceil_nzero_test +select ceil(tan(-0.5)); + ceil +------ + 0 +(1 row) + +\c postgres +drop database ceil_nzero_test; +create database ceil_nzero_test DBCOMPATIBILITY 'B'; +\c ceil_nzero_test +select ceil(tan(-0.5)); + ceil +------ + -0 +(1 row) + +\c postgres +drop database ceil_nzero_test; +create database ceil_nzero_test DBCOMPATIBILITY 'C'; +\c ceil_nzero_test +select ceil(tan(-0.5)); + ceil +------ + -0 +(1 row) + +\c postgres +drop database ceil_nzero_test; +create database ceil_nzero_test DBCOMPATIBILITY 'PG'; +\c ceil_nzero_test +select ceil(tan(-0.5)); + ceil +------ + -0 +(1 row) + +\c postgres +drop database ceil_nzero_test; diff --git a/src/test/regress/parallel_schedule0 b/src/test/regress/parallel_schedule0 index 0aaf2be33..55f350fa9 100644 --- a/src/test/regress/parallel_schedule0 +++ b/src/test/regress/parallel_schedule0 @@ -1028,6 +1028,9 @@ test: gsbasebackup_options test: gsdump_options test: gsloader_options +# debug ceil(-0.5) -0 +test: ceil_negtive_zero + # dolphin_guc_config test: dolphin_guc_config diff --git a/src/test/regress/sql/ceil_negtive_zero.sql b/src/test/regress/sql/ceil_negtive_zero.sql new file mode 100644 index 000000000..49bf520dd --- /dev/null +++ b/src/test/regress/sql/ceil_negtive_zero.sql @@ -0,0 +1,27 @@ +-- +-- 处理ceil函数返回-0问题 +-- + +create database ceil_nzero_test DBCOMPATIBILITY 'A'; +\c ceil_nzero_test +select ceil(tan(-0.5)); +\c postgres +drop database ceil_nzero_test; + +create database ceil_nzero_test DBCOMPATIBILITY 'B'; +\c ceil_nzero_test +select ceil(tan(-0.5)); +\c postgres +drop database ceil_nzero_test; + +create database ceil_nzero_test DBCOMPATIBILITY 'C'; +\c ceil_nzero_test +select ceil(tan(-0.5)); +\c postgres +drop database ceil_nzero_test; + +create database ceil_nzero_test DBCOMPATIBILITY 'PG'; +\c ceil_nzero_test +select ceil(tan(-0.5)); +\c postgres +drop database ceil_nzero_test;