ID:               15151
 Updated by:       [EMAIL PROTECTED]
 Reported By:      [EMAIL PROTECTED]
 Status:           Feedback
 Bug Type:         InterBase related
 Operating System: Windows
 PHP Version:      4.1.1
 New Comment:

I think it must be already fixed in CVS.
Have a look at it and if you can try it on Win32.

Daniela


Previous Comments:
------------------------------------------------------------------------

[2002-03-27 12:17:45] [EMAIL PROTECTED]

please make a patch against the current CVS version.

Derick

------------------------------------------------------------------------

[2002-03-27 11:08:06] [EMAIL PROTECTED]

The original fix I posted has its own bug (due to me not VC++) when the
number is less than 0 but greater than -1 the negative sign does not
appear.  This fixes it (and the original problem also):
Add these declarations:
 ISC_INT64      tv64;
 ISC_INT64      iv64;
 ISC_INT64      fv64;

then change the code:

case SQL_INT64:
 tv64 = (ISC_INT64) *((ISC_INT64 *) data);
 iv64 = (tv64 / (int) pow(10.0, (double) -scale));
 fv64 = (ISC_INT64) abs((int) tv64
       % (int) pow(10.0, (double) -scale));
 val->type = IS_STRING;
 if ( tv64 < 0  &&  iv64 == 0 ) 
  val->value.str.len = sprintf(string_data, "-0");
 else
  val->value.str.len = sprintf(string_data, "%Ld", iv64);
 val->value.str.len += sprintf(string_data +
           val->value.str.len, ".%0*Ld", -scale, fv64);
 val->value.str.val = estrdup(string_data);
 break;

------------------------------------------------------------------------

[2002-03-27 11:06:10] [EMAIL PROTECTED]

The original fix I posted has its own bug (due to me not VC++) when the
number is less than 0 but greater than -1 the negative sign does not
appear.  This fixes it (and the original problem also):
case SQL_INT64:
tv64 = (ISC_INT64) *((ISC_INT64 *) data);
                        iv64 = (tv64 / (int) pow(10.0, (double) -scale));
                        fv64 = (ISC_INT64) abs((int) tv64 % (int) pow(10.0, (double)
-scale));
                        val->type = IS_STRING;
                        if ( tv64 < 0  &&  iv64 == 0 ) 
                                val->value.str.len = sprintf(string_data, "-0");
                        else
                                val->value.str.len = sprintf(string_data, "%Ld", 
iv64);
                        val->value.str.len += sprintf(string_data + val->value.str.len,
".%0*Ld", -scale, fv64);
                        val->value.str.val = estrdup(string_data);
                        break;

------------------------------------------------------------------------

[2002-01-21 13:15:30] [EMAIL PROTECTED]

This is also reported as #13807

------------------------------------------------------------------------

[2002-01-21 13:10:17] [EMAIL PROTECTED]

Decimals/Numerics that are stored as 64-bit integers always display as
xxx.2.

The following should fix the problem:

Original code (on or about line 1782):

val->value.str.len = sprintf(string_data, "%Ld.%0*Ld",
     (ISC_INT64) (*((ISC_INT64 *)data) /
     (int) pow(10.0, (double) -scale)),
     -scale,
     (ISC_INT64) abs((int) (*((ISC_INT64 *)data) %
     (int) pow(10.0, (double) -scale))));

Change to:
val->value.str.len = sprintf(string_data, "%Ld",
     (ISC_INT64) (*((ISC_INT64 *)data) /
     (int) pow(10.0, (double) -scale)));
val->value.str.len += sprintf(string_data +
     val->value.str.len, ".%0*Ld",
     -scale,
    (ISC_INT64) abs((int) (*((ISC_INT64 *)data) %
    (int) pow(10.0, (double) -scale))));



The problem is with MSVC++.  It doesn't seem to like two int64s in the
same sprintf statement.  I don't yet have all the pieces to compile the
extension so I have not fully tested it, but I have duplicated the
problem in a test program and verified that the above code fixes the
problem in the test program.

------------------------------------------------------------------------


-- 
Edit this bug report at http://bugs.php.net/?id=15151&edit=1

Reply via email to