#20861 [Csd]: sybase_query fail to handle stored procedure result with "nocount" option
| From: | thekid@php.net | Date: | Wed, 21 May 2003 08:19:03 +0000 |
| Subject: | #20861 [Csd]: sybase_query fail to handle stored procedure result with "nocount" option | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-40118@lists.php.net to get a copy of this message | ||
ID: 20861
Updated by: thekid@php.net
Reported By: csollet at coleebris dot com
Status: Closed
Bug Type: Sybase-ct (ctlib) related
Operating System: Linux
PHP Version: 4.3.0RC2
Assigned To: thekid
New Comment:
Cannot reproduce on Debian / Sybase-Libs / ASE 12.5.0.3
cgi@hlt1:~$ cat bug20861.php
<?php
$db= @sybase_connect('sybase', '*****', '*****');
@sybase_select_db('MIGRAENE', $db);
$query= sybase_query('sp_pkeys contract', $db);
var_dump(sybase_fetch_assoc($query));
var_dump(sybase_fetch_assoc(sybase_query('select @@version', $db)));
var_dump(phpversion());
?>
cgi@hlt1:~$ php4 bug20861.php
array(5) {
["table_qualifier"]=>
string(8) "MIGRAENE"
["table_owner"]=>
string(3) "dbo"
["table_name"]=>
string(11) "contract"
["column_name"]=>
string(14) "contract_id"
["key_seq"]=>
int(1)
}
array(1) {
["computed"]=>
string(119) "Adaptive Server Enterprise/12.5.0.3/EBF 10973
ESD#1/P/Sun_svr4/OS 5.8/rel12503/1920/64-bit/FBO/Thu Mar 27
01:09:31 2003"
}
string(5) "4.3.1"
cgi@hlt1:~$ php4 -v
PHP 4.3.1 (cli) (built: Feb 24 2003 11:37:26)
Copyright (c) 1997-2002 The PHP Group
Zend Engine v1.3.0, Copyright (c) 1998-2002 Zend Technologies
Previous Comments:
------------------------------------------------------------------------
[2003-05-20 15:21:56] thekid@php.net
Have not been able to reproduce (FreeBSD, FreeTDS, SQL Server/11.0.3.3,
PHP Versions 4.3.1 and 5.0.0-dev):
sa@gurke:CAFFEINE.493> sp_pkeys news;-m vert
table_qualifier: CAFFEINE
table_owner: dbo
table_name: news
column_name: news_id
key_seq: 1
thekid@friebes:~/devel/php/php5/ext/sybase_ct/tests > cat bug20861.php
<?php
$db= @sybase_connect('gurke', 'sa', '');
@sybase_select_db('CAFFEINE', $db);
$query= sybase_query('sp_pkeys news', $db);
var_dump(sybase_fetch_assoc($query));
?>
thekid@friebes:~/devel/php/php5/ext/sybase_ct/tests > php bug20861.php
array(5) {
["table_qualifier"]=>
string(8) "CAFFEINE"
["table_owner"]=>
string(3) "dbo"
["table_name"]=>
string(4) "news"
["column_name"]=>
string(7) "news_id"
["key_seq"]=>
int(1)
}
thekid@friebes:~/devel/php/php5/ext/sybase_ct/tests > php -v
PHP 4.3.1 (cli) (built: Feb 23 2003 20:37:24)
Copyright (c) 1997-2002 The PHP Group
Zend Engine v1.3.0, Copyright (c) 1998-2002 Zend Technologies
thekid@friebes:~/devel/php/php5/ext/sybase_ct/tests > php5 bug20861.php
array(5) {
["table_qualifier"]=>
string(8) "CAFFEINE"
["table_owner"]=>
string(3) "dbo"
["table_name"]=>
string(4) "news"
["column_name"]=>
string(7) "news_id"
["key_seq"]=>
int(1)
}
thekid@friebes:~/devel/php/php5/ext/sybase_ct/tests > php5 -v
PHP 5.0.0-dev (cli) (built: Apr 29 2003 11:25:44)
Copyright (c) 1997-2003 The PHP Group
Zend Engine v2.0.0-dev, Copyright (c) 1998-2003 Zend Technologies
------------------------------------------------------------------------
[2003-05-06 06:52:49] steil at zweitwerk dot com
Bug #20861 seems to be closed since supposed to be bogus if I
understand things correctly.
I found the same bug and don't believe it being bogus.
My example (Sybase 11.7, Linux, PHP4.3.1) arose when trying to call
sybase' build-in procedure sp_pkeys, i.e.
$db = sybase_connect("host", "user", "pass");
$query = sybase_query('sp_pkeys some_table', $db);
var_dump(sybase_fetch_array($query));
This results in "bool(false)".
A closer look at the procedure's body shows that it 'set nocount on'.
Recompiling the procedure without this line gives the expected result,
e.g.
array(10) {
[0]=> string(11) "jadisnetHUM" ["table_qualifier"]=> string(11)
"jadisnetHUM"
[1]=> string(3) "dbo" ["table_owner"]=> string(3) "dbo"
[2]=> string(5) "asset" ["table_name"]=> string(5) "asset"
[3]=> string(7) "assetid" ["column_name"]=> string(7)
"assetid"
[4]=> string(1) "1" ["key_seq"]=> string(1) "1"
}
I strongly suspect PHP is looking for the rowcount before trying to
retrieve data and therefore is mislead by 'nocount on'.
I also called both, original and without 'nocount on', versions of the
procedure with a different programming language (Omnis) and encountered
no problems in either case.
Therefore it should be possible to correct PHP's fetching routine to
not relying on not setting 'nocount on'.
I would expect at least to be able to excute build-in procedures
without problems, i.e. 'set nocount on' seems not to be that special as
a former submitter suggested.
------------------------------------------------------------------------
[2002-12-10 05:11:16] thekid@php.net
------ Feedback from original reporter ------
Timm Friebe wrote:
[...]
> Thanks - I've updated the bug. What do you think?
> Should I remove the notice?
Hum, after getting a closer look at the problem, i've realized that
i've been fooled by another new features of PHP4.3 that breaks our apps
a bit later :
Dispite new sybase notice, i got expected result as you wrote it in
#20861 (not what i figured out at first look).
So #20861 is boggus. Sorry for the false alarm.
About the notice itself, i haven't, personaly, any requirement since,
except for debuging purpose, all our sybase_query are @ prefixed (don't
want any sql print out to users in case of errors). Maybe PHP4.3 should
be shipped with a "BC changes" file that stat this one?
Regards,
Christophe.
------------------------------------------------------------------------
[2002-12-07 13:51:51] thekid@php.net
<?php
/* Script to reproduce bug #20861
*
* $Id$
*/
ini_set('sybct.min_server_severity', 11);
$db= sybase_connect('gurke', '******', '******');
sybase_select_db('tempdb', $db);
// var_dump(sybase_query('
// create procedure test_bug
// @input int
// AS
// BEGIN
// set nocount on
//
// select @input 'result'
// return 2
// END
// ', $db));
// This doesn't print out the error message
$q= sybase_query('test_bug 1', $db);
while ($data= sybase_fetch_object($q)) {
var_dump($q, $data);
}
// This actually prints out the warning message as
// we have two resultsets
$q= sybase_query('
declare @return int
exec @return= test_bug 1
select @return
', $db);
while ($data= sybase_fetch_object($q)) {
var_dump($q, $data);
}
// var_dump(sybase_query('drop procedure test_bug', $db));
sybase_close($db);
?>
------------------------------------------------------------------------
[2002-12-07 08:38:54] thekid@php.net
Well, in earlier versions sybase_ct silently cancelled the unexpected
results, now it will inform you it is doing so - I thought it was nice
to be a bit more verbose about things.
------------------------------------------------------------------------
The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
http://bugs.php.net/20861
--
Edit this bug report at http://bugs.php.net/?id=20861&edit=1