From 6fe6810c8a4a87cc266a6cb2957fdcfbe480549a Mon Sep 17 00:00:00 2001 From: Ard Biesheuvel Date: Fri, 13 Feb 2004 10:43:24 +0000 Subject: [PATCH] Fixed bug #27235 (NUMERIC x.0 field returns empty string on 0) CS/WS # MFB not necessary, bug doesn't apply to HEAD --- ext/interbase/interbase.c | 36 +++++++++++++++++++----------------- ext/interbase/tests/003.phpt | 4 ++-- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/ext/interbase/interbase.c b/ext/interbase/interbase.c index 81a37640fd..70abb42eaf 100644 --- a/ext/interbase/interbase.c +++ b/ext/interbase/interbase.c @@ -1836,32 +1836,34 @@ static int _php_ibase_var_zval(zval *val, void *data, int type, int len, int sca } break; #ifdef SQL_INT64 - case SQL_INT64: + case SQL_INT64: { + ISC_INT64 n = *(ISC_INT64 *) data; Z_TYPE_P(val) = IS_STRING; - if (scale < 0 ){ - short j = 0; - ISC_INT64 n, f = 1; - n = (ISC_INT64) *(ISC_INT64 *) data; - for (j = 0; j < -scale; j++) { + + if (scale < 0) { + short j; + ISC_INT64 f = 1; + + for (j = 0; j < -scale; ++j) { f *= 10; } - if ( n >= 0){ - Z_STRLEN_P(val) = sprintf (string_data, "%" ISC_INT64_FORMAT "d.%0*" ISC_INT64_FORMAT "d", - (ISC_INT64) n / f, -scale, (ISC_INT64) n % f ); - }else if ((n/f) != 0 ){ - Z_STRLEN_P(val) = sprintf (string_data, "%" ISC_INT64_FORMAT "d.%0*" ISC_INT64_FORMAT "d", - (ISC_INT64) n / f, -scale, (ISC_INT64) -(n % f) ); - }else{ - Z_STRLEN_P(val) = sprintf (string_data, "%s.%0*" ISC_INT64_FORMAT "d", - "-0", -scale, (ISC_INT64) -(n % f) ); + if (n >= 0) { + Z_STRLEN_P(val) = sprintf (string_data, + "%" ISC_INT64_FORMAT "d.%0*" ISC_INT64_FORMAT "d", n / f, -scale, n % f); + } else if (n < -f) { + Z_STRLEN_P(val) = sprintf (string_data, + "%" ISC_INT64_FORMAT "d.%0*" ISC_INT64_FORMAT "d", n / f, -scale, -n % f); + } else { + Z_STRLEN_P(val) = sprintf (string_data, + "-0.%0*" ISC_INT64_FORMAT "d", -scale, -n % f); } } else { - Z_STRLEN_P(val) =sprintf (string_data, "%.0" ISC_INT64_FORMAT "d", - (ISC_INT64) *(ISC_INT64 *) data); + Z_STRLEN_P(val) = sprintf (string_data, "%" ISC_INT64_FORMAT "d", n); } Z_STRVAL_P(val) = estrdup(string_data); break; + } #endif #ifndef SQL_TIMESTAMP case SQL_DATE: diff --git a/ext/interbase/tests/003.phpt b/ext/interbase/tests/003.phpt index 341be8e310..06a5c709c0 100644 --- a/ext/interbase/tests/003.phpt +++ b/ext/interbase/tests/003.phpt @@ -41,7 +41,7 @@ InterBase: misc sql types (may take a while) $v_decimal7_2 = rand_number(7,2); $v_decimal7_0 = rand_number(7,0); $v_numeric15_15 = rand_number(15,15); - $v_numeric15_0 = rand_number(15,0); + $v_numeric15_0 = $iter ? rand_number(15,0) : 0; $v_double = rand_number(18); $v_float = rand_number(7); $v_integer = rand_number(9,0); @@ -88,7 +88,7 @@ InterBase: misc sql types (may take a while) echo " in: $v_numeric15_15\n"; echo " out: $row->V_NUMERIC15_15\n"; } - if($row->V_NUMERIC15_0 != $v_numeric15_0){ + if($row->V_NUMERIC15_0 != (string)$v_numeric15_0){ echo " NUMERIC15_0 fail\n"; echo " in: $v_numeric15_0\n"; echo " out: $row->V_NUMERIC15_0\n"; -- 2.50.1