mirror of
https://github.com/php/php-src.git
synced 2024-09-23 19:07:26 +00:00
fix #40078 (ORA-01405 when fetching NULL values using oci_bind_array_by_name())
This commit is contained in:
parent
ff29842edb
commit
4a7093c531
@ -778,13 +778,16 @@ void php_oci_bind_hash_dtor(void *data)
|
||||
if (bind->array.elements) {
|
||||
efree(bind->array.elements);
|
||||
}
|
||||
|
||||
if (bind->array.element_lengths) {
|
||||
efree(bind->array.element_lengths);
|
||||
}
|
||||
/*
|
||||
|
||||
if (bind->array.indicators) {
|
||||
efree(bind->array.indicators);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
if (bind->array.retcodes) {
|
||||
efree(bind->array.retcodes);
|
||||
}
|
||||
|
@ -1336,7 +1336,7 @@ int php_oci_bind_array_by_name(php_oci_statement *statement, zstr name, int name
|
||||
(dvoid *) bindp->array.elements,
|
||||
(sb4) bind->array.max_length,
|
||||
type,
|
||||
(dvoid *)0, /* bindp->array.indicators, */
|
||||
(dvoid *)bindp->array.indicators,
|
||||
(ub2 *)bind->array.element_lengths,
|
||||
(ub2 *)0, /* bindp->array.retcodes, */
|
||||
(ub4) max_table_length,
|
||||
@ -1391,13 +1391,18 @@ php_oci_bind *php_oci_bind_array_helper_string(zval* var, long max_table_length,
|
||||
bind->array.max_length = TEXT_BYTES(maxlength);
|
||||
bind->array.element_lengths = safe_emalloc(max_table_length, sizeof(ub2), 0);
|
||||
memset(bind->array.element_lengths, 0, max_table_length * sizeof(ub2));
|
||||
|
||||
bind->array.indicators = safe_emalloc(max_table_length, sizeof(sb2), 0);
|
||||
memset(bind->array.indicators, 0, max_table_length*sizeof(sb2));
|
||||
|
||||
zend_hash_internal_pointer_reset(hash);
|
||||
|
||||
for (i = 0; i < bind->array.current_length; i++) {
|
||||
if (zend_hash_get_current_data(hash, (void **) &entry) != FAILURE) {
|
||||
convert_to_text_ex(entry);
|
||||
bind->array.element_lengths[i] = TEXT_BYTES(Z_UNILEN_PP(entry));
|
||||
if (Z_UNILEN_PP(entry) == 0) {
|
||||
bind->array.indicators[i] = -1;
|
||||
}
|
||||
zend_hash_move_forward(hash);
|
||||
} else {
|
||||
break;
|
||||
@ -1447,6 +1452,7 @@ php_oci_bind *php_oci_bind_array_helper_number(zval* var, long max_table_length
|
||||
bind->array.max_length = sizeof(ub4);
|
||||
bind->array.element_lengths = safe_emalloc(max_table_length, sizeof(ub2), 0);
|
||||
memset(bind->array.element_lengths, 0, max_table_length * sizeof(ub2));
|
||||
bind->array.indicators = NULL;
|
||||
|
||||
zend_hash_internal_pointer_reset(hash);
|
||||
for (i = 0; i < max_table_length; i++) {
|
||||
@ -1484,6 +1490,7 @@ php_oci_bind *php_oci_bind_array_helper_double(zval* var, long max_table_length
|
||||
bind->array.max_length = sizeof(double);
|
||||
bind->array.element_lengths = safe_emalloc(max_table_length, sizeof(ub2), 0);
|
||||
memset(bind->array.element_lengths, 0, max_table_length * sizeof(ub2));
|
||||
bind->array.indicators = NULL;
|
||||
|
||||
zend_hash_internal_pointer_reset(hash);
|
||||
for (i = 0; i < max_table_length; i++) {
|
||||
@ -1521,6 +1528,7 @@ php_oci_bind *php_oci_bind_array_helper_date(zval* var, long max_table_length, p
|
||||
bind->array.max_length = sizeof(OCIDate);
|
||||
bind->array.element_lengths = safe_emalloc(max_table_length, sizeof(ub2), 0);
|
||||
memset(bind->array.element_lengths, 0, max_table_length * sizeof(ub2));
|
||||
bind->array.indicators = NULL;
|
||||
|
||||
zend_hash_internal_pointer_reset(hash);
|
||||
for (i = 0; i < max_table_length; i++) {
|
||||
|
@ -188,7 +188,7 @@ typedef struct { /* php_oci_bind {{{ */
|
||||
php_oci_statement *parent_statement; /* pointer to the parent statement */
|
||||
struct {
|
||||
void *elements;
|
||||
/* ub2 *indicators; */
|
||||
sb2 *indicators;
|
||||
ub2 *element_lengths;
|
||||
/* ub2 *retcodes; */
|
||||
ub4 current_length;
|
||||
|
69
ext/oci8/tests/bug40078.phpt
Normal file
69
ext/oci8/tests/bug40078.phpt
Normal file
@ -0,0 +1,69 @@
|
||||
--TEST--
|
||||
Bug #40078 (ORA-01405 when fetching NULL values using oci_bind_array_by_name())
|
||||
--SKIPIF--
|
||||
<?php if (!extension_loaded('oci8')) die("skip no oci8 extension"); ?>
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
require dirname(__FILE__).'/connect.inc';
|
||||
|
||||
$create_pkg = "
|
||||
CREATE OR REPLACE PACKAGE ARRAYBINDPKG1 AS
|
||||
TYPE ARRTYPE IS TABLE OF VARCHAR(20) INDEX BY BINARY_INTEGER;
|
||||
PROCEDURE nullbind(c1 OUT ARRTYPE);
|
||||
END ARRAYBINDPKG1;";
|
||||
$statement = oci_parse($c, $create_pkg);
|
||||
oci_execute($statement);
|
||||
|
||||
$create_pkg_body = "
|
||||
CREATE OR REPLACE PACKAGE BODY ARRAYBINDPKG1 AS
|
||||
PROCEDURE nullbind(c1 OUT ARRTYPE) IS
|
||||
BEGIN
|
||||
c1(1) := 'one';
|
||||
c1(2) := 'two';
|
||||
c1(3) := '';
|
||||
c1(4) := 'four';
|
||||
c1(5) := 'five';
|
||||
END nullbind;
|
||||
END ARRAYBINDPKG1;";
|
||||
$statement = oci_parse($c, $create_pkg_body);
|
||||
oci_execute($statement);
|
||||
|
||||
$statement = oci_parse($c, "BEGIN ARRAYBINDPKG1.nullbind(:c1); END;");
|
||||
|
||||
oci_bind_array_by_name($statement, ":c1", $array, 5, 20, SQLT_CHR);
|
||||
|
||||
oci_execute($statement);
|
||||
|
||||
var_dump($array);
|
||||
|
||||
echo "Done\n";
|
||||
?>
|
||||
--EXPECTF--
|
||||
array(5) {
|
||||
[0]=>
|
||||
string(3) "one"
|
||||
[1]=>
|
||||
string(3) "two"
|
||||
[2]=>
|
||||
string(0) ""
|
||||
[3]=>
|
||||
string(4) "four"
|
||||
[4]=>
|
||||
string(4) "five"
|
||||
}
|
||||
Done
|
||||
--UEXPECTF--
|
||||
array(5) {
|
||||
[0]=>
|
||||
unicode(3) "one"
|
||||
[1]=>
|
||||
unicode(3) "two"
|
||||
[2]=>
|
||||
unicode(0) ""
|
||||
[3]=>
|
||||
unicode(4) "four"
|
||||
[4]=>
|
||||
unicode(4) "five"
|
||||
}
|
||||
Done
|
Loading…
Reference in New Issue
Block a user