ID:               33693
 Comment by:       walter at wjd dot nu
 Reported By:      r dot vanicek at seznam dot cz
 Status:           No Feedback
 Bug Type:         Sybase-ct (ctlib) related
 Operating System: Linux (Debian 3.1)
 PHP Version:      4.4.0
 New Comment:

You need tds version 7.0 for the bug to rear it's head.

E.g. by "tds version = 7.0" in /etc/freetds/freetds.conf or with
TDSVER=7.0 environment variable.
(The 7.0 version transmits UCS-2 instead of ASCII which is used with
4.2) 

I'd really like this fixed, because I need 7.0 for working UTF8 support
(with NVARCHARs in my database).

When PHP is run from an apache module and the bug occurs, apache fails
to serve (crashes?) any page that uses sybase-connections!


#--------------------------------------------------
# Versions
#--------------------------------------------------
PHP 5.2.0-8+etch7 (cli) (built: Jul  2 2007 21:46:15)
Copyright (c) 1997-2006 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2006 Zend Technologies

#--------------------------------------------------
# Output of my own test code using SELECT *
#--------------------------------------------------
$ TDSVER=4.2 php test2.php
Success!
$ TDSVER=7.0 php test2.php
error_handler: Data-conversion resulted in overflow.
Segmentation fault (core dumped)


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

[2007-07-12 21:41:58] shiftlessways at hotmail dot com

This bug still seems to exist in current php 5 and 6 snapshots.

I don't know how exactly there is not enough info in the original post
but while the provided patch does fix the problem and work perfectly,
patching php may not be an option. So altering your sql to cast the id
value into a varchar before it is returned can be used as a workaround
untill this ever gets fixed.

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

[2005-07-26 01:00:05] php-bugs at lists dot php dot net

No feedback was provided for this bug for over a week, so it is
being suspended automatically. If you are able to provide the
information that was originally requested, please do so and change
the status of the bug back to "Open".

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

[2005-07-18 02:37:25] [EMAIL PROTECTED]

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.




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

[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