tony2001 Wed Aug 9 12:13:30 2006 UTC Added files: /php-src/ext/oci8/tests bug38161.phpt
Modified files: /php-src/ext/oci8 oci8_statement.c php_oci8_int.h /php-src/ext/oci8/tests bug37581.phpt Log: fix #38161 (oci_bind_by_name() returns garbage when Oracle didn't set the variable) http://cvs.php.net/viewvc.cgi/php-src/ext/oci8/oci8_statement.c?r1=1.22&r2=1.23&diff_format=u Index: php-src/ext/oci8/oci8_statement.c diff -u php-src/ext/oci8/oci8_statement.c:1.22 php-src/ext/oci8/oci8_statement.c:1.23 --- php-src/ext/oci8/oci8_statement.c:1.22 Wed Aug 9 11:48:50 2006 +++ php-src/ext/oci8/oci8_statement.c Wed Aug 9 12:13:30 2006 @@ -25,7 +25,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: oci8_statement.c,v 1.22 2006/08/09 11:48:50 tony2001 Exp $ */ +/* $Id: oci8_statement.c,v 1.23 2006/08/09 12:13:30 tony2001 Exp $ */ #ifdef HAVE_CONFIG_H @@ -826,9 +826,11 @@ case SQLT_LNG: case SQLT_CHR: /* this is the default case when type was not specified */ - convert_to_string(var); + if (Z_TYPE_P(var) != IS_NULL) { + convert_to_string(var); + } if (maxlength == -1) { - value_sz = Z_STRLEN_P(var); + value_sz = (Z_TYPE_P(var) == IS_STRING) ? Z_STRLEN_P(var) : 0; } else { value_sz = maxlength; @@ -1003,7 +1005,7 @@ zval_dtor(val); Z_STRLEN_P(val) = PHP_OCI_PIECE_SIZE; /* 64K-1 is max XXX */ - Z_STRVAL_P(val) = emalloc(Z_STRLEN_P(phpbind->zval)); + Z_STRVAL_P(val) = ecalloc(1, Z_STRLEN_P(phpbind->zval) + 1); /* XXX we assume that zend-zval len has 4 bytes */ *alenpp = (ub4*) &Z_STRLEN_P(phpbind->zval); http://cvs.php.net/viewvc.cgi/php-src/ext/oci8/php_oci8_int.h?r1=1.18&r2=1.19&diff_format=u Index: php-src/ext/oci8/php_oci8_int.h diff -u php-src/ext/oci8/php_oci8_int.h:1.18 php-src/ext/oci8/php_oci8_int.h:1.19 --- php-src/ext/oci8/php_oci8_int.h:1.18 Mon Jul 31 10:28:46 2006 +++ php-src/ext/oci8/php_oci8_int.h Wed Aug 9 12:13:30 2006 @@ -25,7 +25,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_oci8_int.h,v 1.18 2006/07/31 10:28:46 tony2001 Exp $ */ +/* $Id: php_oci8_int.h,v 1.19 2006/08/09 12:13:30 tony2001 Exp $ */ #if HAVE_OCI8 # ifndef PHP_OCI8_INT_H @@ -186,7 +186,7 @@ long max_length; long type; } array; - sb2 indicator; /* */ + sb2 indicator; /* -1 means NULL */ ub2 retcode; /* */ } php_oci_bind; /* }}} */ http://cvs.php.net/viewvc.cgi/php-src/ext/oci8/tests/bug37581.phpt?r1=1.1&r2=1.2&diff_format=u Index: php-src/ext/oci8/tests/bug37581.phpt diff -u /dev/null php-src/ext/oci8/tests/bug37581.phpt:1.2 --- /dev/null Wed Aug 9 12:13:30 2006 +++ php-src/ext/oci8/tests/bug37581.phpt Wed Aug 9 12:13:30 2006 @@ -0,0 +1,69 @@ +--TEST-- +Bug #37581 (oci_bind_array_by_name clobbers input array when using SQLT_AFC, AVC) +--SKIPIF-- +<?php if (!extension_loaded("oci8")) print "skip"; ?> +--FILE-- +<?php + +require dirname(__FILE__)."/connect.inc"; + +$p1 = "create or replace package ARRAYBINDPKG1 as +type str_array is table of char(2) index by binary_integer; +procedure array_bind(in_str in str_array, out_str out string); +end ARRAYBINDPKG1;"; + +$p2 = "create or replace package body ARRAYBINDPKG1 as + procedure array_bind(in_str in str_array, out_str out string) is + begin + for i in 1 .. in_str.count loop + out_str := in_str(i); + end loop; + end array_bind; +end ARRAYBINDPKG1;"; + +$s1 = oci_parse($c, $p1); +$s2 = oci_parse($c, $p2); +oci_execute($s1); +oci_execute($s2); + + +$stmt = oci_parse($c,'begin ARRAYBINDPKG1.array_bind(:in_arr, :out_str); end;'); +$strings = array('A','B','C','D','E'); + +oci_bind_array_by_name($stmt,':in_arr',$strings,5,1,SQLT_AFC); +oci_bind_by_name($stmt,':out_str',$result,10); + +oci_execute($stmt); +var_dump($strings); + +oci_execute($stmt); +var_dump($strings); + +echo "Done\n"; +?> +--EXPECTF-- +array(5) { + [0]=> + string(1) "A" + [1]=> + string(1) "B" + [2]=> + string(1) "C" + [3]=> + string(1) "D" + [4]=> + string(1) "E" +} +array(5) { + [0]=> + string(1) "A" + [1]=> + string(1) "B" + [2]=> + string(1) "C" + [3]=> + string(1) "D" + [4]=> + string(1) "E" +} +Done http://cvs.php.net/viewvc.cgi/php-src/ext/oci8/tests/bug38161.phpt?view=markup&rev=1.1 Index: php-src/ext/oci8/tests/bug38161.phpt +++ php-src/ext/oci8/tests/bug38161.phpt --TEST-- bug #38161 (oci_bind_by_name() returns garbage when Oracle didn't set the variable) --SKIPIF-- <?php if (!extension_loaded("oci8")) print "skip"; ?> --FILE-- <?php require dirname(__FILE__).'/connect.inc'; $query = "begin if false then :bv := 1; end if; end;"; $stid = oci_parse($c, $query); oci_bind_by_name($stid, ":bv", $bv, 22); oci_execute($stid, OCI_DEFAULT); var_dump($bv); unset($bv); $query = "begin if false then :bv := 1; end if; end;"; $stid = oci_parse($c, $query); oci_bind_by_name($stid, ":bv", $bv, 22, SQLT_INT); oci_execute($stid, OCI_DEFAULT); var_dump($bv); echo "Done\n"; ?> --EXPECTF-- NULL int(0) Done -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php