From:             [EMAIL PROTECTED]
Operating system: Debian Linux
PHP version:      4.0.5
PHP Bug Type:     InterBase related
Bug description:  InterBase/Firebird Decimal/Numeric type returns incorrect value type

ibase_query() returns incorrect value about Decimal/Numeric type on
InterBase6/Firebird.

--- interbase.c.orig    Fri Jun 15 11:32:31 2001
+++ interbase.c Tue Jun 12 18:09:07 2001
@@ -1741,7 +1741,22 @@
                        val->value.str.len = len;
                        break;
                case SQL_LONG:
-                       if (scale) {
+                       if (scale < 0) {
+                               int j;
+                               long dt, dth, dtl, pow_scale = 1;
+                               for (j = 0; j < -scale; j++) pow_scale *= 10;
+                               dt = *(long *)data;
+                               dth = dt / pow_scale;
+                               dtl = dt % pow_scale;
+                               if (dtl < 0) dtl *= -1;
+                               if ((dt < 0) && (dth == 0)) {
+                                       val->value.str.len = sprintf(string_data, 
+"-0.%0*ld", -scale, dtl);
+                               } else {
+                                       val->value.str.len = sprintf(string_data, 
+"%ld.%0*ld", dth, -scale, dtl);
+                               }
+                               val->type = IS_STRING;
+                               val->value.str.val = estrdup(string_data);
+                               /*
                                int j, f = 1;
                                float n = (float) *(long *)(data);
                                
@@ -1750,18 +1765,36 @@
                                val->type = IS_STRING;
                                val->value.str.len = sprintf(string_data, "%.*f", 
-scale, n / f);
                                val->value.str.val = estrdup(string_data);
+                               */
                        } else {
                                val->type = IS_LONG;
                                val->value.lval = *(long *)(data);
                        }
                        break;
                case SQL_SHORT:
-                       val->type = IS_LONG;
-                       val->value.lval = *(short *)(data);
+                       if (scale < 0) {
+                               int j;
+                               short dt, dth, dtl, pow_scale = 1;
+                               for (j = 0; j < -scale; j++) pow_scale *= 10;
+                               dt = *(short *)data;
+                               dth = dt / pow_scale;
+                               dtl = dt % pow_scale;
+                               if (dtl < 0) dtl *= -1;
+                               if ((dt < 0) && (dth == 0)) {
+                                       val->value.str.len = sprintf(string_data, 
+"-0.%0*hd", -scale, (int)dtl);
+                               } else {
+                                       val->value.str.len = sprintf(string_data, 
+"%hd.%0*hd", (int)dth, -scale, (int)dtl);
+                               }
+                               val->type = IS_STRING;
+                               val->value.str.val = estrdup(string_data);
+                       } else {
+                               val->type = IS_LONG;
+                               val->value.lval = *(short *)(data);
+                       }
                        break;
                case SQL_FLOAT:
                        val->type = IS_DOUBLE;
-                       val->value.dval = *(float *)(data);
+                       val->value.dval = (double) *(float *)(data);
                        break;
                case SQL_DOUBLE:
                        if (scale) {
@@ -1778,11 +1811,31 @@
                        break;
 #ifdef SQL_INT64
                case SQL_INT64:
-                       val->type = IS_STRING;
+                       if (scale) {
+                               int j;
+                               ISC_INT64 dt, dth, dtl, pow_scale = 1;
+                               for (j = 0; j < -scale; j++) pow_scale *= 10;
+                               dt = *(ISC_INT64 *)data;
+                               dth = (ISC_INT64) (dt / pow_scale);
+                               dtl = (ISC_INT64) (dt % pow_scale);
+                               if (dtl < 0) dtl *= -1;
+                               if ((dt < 0) && (dth == 0)) {
+                                       val->value.str.len = sprintf(string_data, 
+"-0.%0*Ld", -scale, dtl);
+                               } else {
+                                       val->value.str.len = sprintf(string_data, 
+"%Ld.%0*Ld", dth, -scale, dtl);
+                               }
+                               val->type = IS_STRING;
+                               val->value.str.val = estrdup(string_data);
+                       /*
                        val->value.str.len = sprintf(string_data, "%Ld.%Ld",
                                                                                 
(ISC_INT64) (*((ISC_INT64 *)data) / (int) pow(10.0, (double) -scale)),
                                                                                 
(ISC_INT64) abs((int) (*((ISC_INT64 *)data) % (int) pow(10.0, (double) -scale))));
-                       val->value.str.val = estrdup(string_data);
+                       */
+                       } else {
+                               val->type = IS_STRING;
+                               val->value.str.len = sprintf(string_data, "%Ld", 
+*(ISC_INT64 *)data);
+                               val->value.str.val = estrdup(string_data);
+                       }
                        break;
 #endif
 #ifndef SQL_TIMESTAMP



-- 
Edit Bug report at: http://bugs.php.net/?id=11530&edit=1



-- 
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]

Reply via email to