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;