ID:               33693
 Updated by:       [EMAIL PROTECTED]
 Reported By:      r dot vanicek at seznam dot cz
-Status:           Open
+Status:           Feedback
 Bug Type:         Sybase-ct (ctlib) related
 Operating System: Linux (Debian 3.1)
 PHP Version:      4.4.0
 New Comment:

Not enough information was provided for us to be able
to handle this bug. Please re-read the instructions at
http://bugs.php.net/how-to-report.php

If you can provide more information, feel free to add it
to this bug and change the status back to "Open".

Thank you for your interest in PHP.





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

[2005-07-14 10:53:46] r dot vanicek at seznam dot cz

Description:
------------
I am connecting from PHP to Sybase and MSSQL. I have sybase-ct
extension enabled. I use freetds-0.63. When I select from MSSQL any
column of type "uniqueidentifier", PHP crashes on fetch.

The problem is conversion. Sybase-ct module does not handle
CS_UNIQUE_TYPE,  and tries to store the 38 byte string that freetds
returns to it into 16 byte string. Freetds refuses to do so and signals
an error, which is probably fatal.

Test suite: see reproduce code.

The solution I suggest is to intoduce CS_UNIQUE_TYPE into
php_sybase_ct.c, function php_sybase_fetch_result_set for example like
this:

                        case CS_DECIMAL_TYPE:
                                result->datafmt[i].maxlength = 
result->datafmt[i].precision + 3;
                                /* numeric(10) vs numeric(10, 1) */
                                result->numerics[i] = (result->datafmt[i].scale 
== 0) ? 3 : 2;
                                break;
                        case CS_UNIQUE_TYPE:
                                result->datafmt[i].maxlength = 38;
                                result->numerics[i] = 0;
                                break;
                        default:
                                result->datafmt[i].maxlength++;
                                result->numerics[i] = 0;
                                break;



This solution works for me quite well.


Reproduce code:
---------------
create table TEST (a int, b varchar, c uniqueidentifier);
insert into TEST values (1,'hello',newid());

sybase_connect( "srv", "uid", "pwd" );
sybase_select_db( "dbname" );

// this works fine
$res = sybase_query( "select a,b from TEST" );
$row = sybase_fetch_array( $res );

// this crashes
$res = sybase_query( "select a,b,c from TEST" );
$row = sybase_fetch_array( $res );

It is all the same if you use mssql_ functions instead of sybase_
functions.


Expected result:
----------------
eg. row containing
1
'hello'
'EB668095-F85D-4C59-A202-120C5CE1B65'

Actual result:
--------------
crash, in Apache error.log I see this:

[notice] child pid 18857 exit signal Segmentation fault (11)
error_handler: Data-conversion resulted in overflow.



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


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

Reply via email to