mirror of
https://github.com/php/php-src.git
synced 2026-04-03 22:22:18 +02:00
Improve row fetch changes for PHP7. Update test SKIPIFs. Add test for 11g client (Senthil)
This commit is contained in:
@@ -2634,7 +2634,7 @@ int php_oci_column_to_zval(php_oci_out_column *column, zval *value, int mode)
|
||||
void php_oci_fetch_row (INTERNAL_FUNCTION_PARAMETERS, int mode, int expected_args)
|
||||
{
|
||||
zval *z_statement, *array;
|
||||
zval *placeholder;
|
||||
zval *placeholder = (zval*) NULL;
|
||||
/* zend_array *temp_array = (zend_array *) NULL;*/
|
||||
php_oci_statement *statement; /* statement that will be fetched from */
|
||||
#if (OCI_MAJOR_VERSION >= 12)
|
||||
@@ -2655,6 +2655,12 @@ void php_oci_fetch_row (INTERNAL_FUNCTION_PARAMETERS, int mode, int expected_arg
|
||||
if (ZEND_NUM_ARGS() == 2) {
|
||||
fetch_mode = mode;
|
||||
}
|
||||
|
||||
if (Z_ISREF_P(array))
|
||||
placeholder = Z_REFVAL_P(array);
|
||||
else
|
||||
placeholder = array;
|
||||
|
||||
} else if (expected_args == 2) {
|
||||
/* only for oci_fetch_array() */
|
||||
|
||||
@@ -2743,14 +2749,10 @@ void php_oci_fetch_row (INTERNAL_FUNCTION_PARAMETERS, int mode, int expected_arg
|
||||
}
|
||||
#endif /* OCI_MAJOR_VERSION */
|
||||
|
||||
if (expected_args > 2) {
|
||||
if (Z_ISREF_P(array))
|
||||
placeholder = Z_REFVAL_P(array);
|
||||
else
|
||||
placeholder = array;
|
||||
zval_dtor(placeholder);
|
||||
} else {
|
||||
if (placeholder == NULL) {
|
||||
placeholder = return_value;
|
||||
} else {
|
||||
zval_dtor(placeholder);
|
||||
}
|
||||
|
||||
array_init(placeholder);
|
||||
@@ -2792,20 +2794,6 @@ void php_oci_fetch_row (INTERNAL_FUNCTION_PARAMETERS, int mode, int expected_arg
|
||||
}
|
||||
|
||||
if (expected_args > 2) {
|
||||
/* Only for ocifetchinto BC. In all other cases we return array, not long */
|
||||
#if 0
|
||||
zval *temp_array;
|
||||
if (Z_ISREF_P(array))
|
||||
temp_array = Z_REFVAL_P(array);
|
||||
else /* PHP7 will pass user buffer through 'array' as reference type.
|
||||
* So this part of code may not be reached. */
|
||||
temp_array = array;
|
||||
|
||||
/* copy array content in return_value into user buffer passed through
|
||||
* reference variable 'array' */
|
||||
ZVAL_ARR(temp_array, Z_ARRVAL_P(return_value));
|
||||
zval_ptr_dtor(return_value);
|
||||
#endif
|
||||
RETURN_LONG(statement->ncolumns);
|
||||
}
|
||||
}
|
||||
|
||||
279
ext/oci8/tests/bind_sqltnum_11g.phpt
Normal file
279
ext/oci8/tests/bind_sqltnum_11g.phpt
Normal file
@@ -0,0 +1,279 @@
|
||||
--TEST--
|
||||
Bind with SQLT_NUM
|
||||
--SKIPIF--
|
||||
<?php
|
||||
if (!extension_loaded('oci8')) die("skip no oci8 extension");
|
||||
preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
|
||||
if (!(isset($matches[0]) && $matches[0] <= 11)) {
|
||||
die("skip works only with Oracle 11 or earlier version of Oracle client libraries");
|
||||
}
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
require(dirname(__FILE__).'/connect.inc');
|
||||
|
||||
// Initialization
|
||||
|
||||
$stmtarray = array(
|
||||
"drop table bind_sqltnum_tab",
|
||||
|
||||
"create table bind_sqltnum_tab (
|
||||
id number,
|
||||
varchar2_t10 varchar2(10),
|
||||
number_t number,
|
||||
number_t92 number(9,2))"
|
||||
);
|
||||
|
||||
oci8_test_sql_execute($c, $stmtarray);
|
||||
|
||||
function check_col($c, $colname, $id)
|
||||
{
|
||||
$s = oci_parse($c, "select $colname from bind_sqltnum_tab where id = :id");
|
||||
oci_bind_by_name($s, ":id", $id);
|
||||
oci_execute($s);
|
||||
oci_fetch_all($s, $r);
|
||||
var_dump($r);
|
||||
}
|
||||
|
||||
|
||||
// Run Test
|
||||
|
||||
echo "Test 1 - baseline test\n";
|
||||
|
||||
$s = oci_parse($c, "INSERT INTO bind_sqltnum_tab (id, varchar2_t10) VALUES (100, :c2)");
|
||||
$c2 = "Hood";
|
||||
$r = oci_bind_by_name($s, ":c2", $c2, -1);
|
||||
if (!$r) {
|
||||
$e = oci_error($s);
|
||||
var_dump($e);
|
||||
}
|
||||
$r = oci_execute($s, OCI_DEFAULT);
|
||||
if (!$r) {
|
||||
$e = oci_error($s);
|
||||
var_dump($e);
|
||||
}
|
||||
|
||||
$s = oci_parse($c, "select id, varchar2_t10 from bind_sqltnum_tab");
|
||||
oci_execute($s);
|
||||
oci_fetch_all($s, $data);
|
||||
var_dump($data);
|
||||
|
||||
echo "Test 2 - SQLT_NUM to a VARCHAR2 column\n";
|
||||
|
||||
$s = oci_parse($c, "INSERT INTO bind_sqltnum_tab (id, varchar2_t10) VALUES (100, :c2)");
|
||||
$c2 = "Hood";
|
||||
$r = oci_bind_by_name($s, ":c2", $c2, -1, SQLT_NUM);
|
||||
if (!$r) {
|
||||
$e = oci_error($s);
|
||||
var_dump($e['message']);
|
||||
}
|
||||
$r = oci_execute($s, OCI_DEFAULT);
|
||||
if (!$r) {
|
||||
$e = oci_error($s);
|
||||
var_dump($e['message']);
|
||||
}
|
||||
|
||||
echo "\nTEST41 wrong bind type SQLT_NUM\n";
|
||||
|
||||
$c2 = "Hood41";
|
||||
$s = oci_parse($c, "INSERT INTO bind_sqltnum_tab (id, varchar2_t10) VALUES (41, :c2)");
|
||||
oci_bind_by_name($s, ":c2", $c2, -1, SQLT_NUM);
|
||||
oci_execute($s);
|
||||
|
||||
echo "\nTEST42 insert numbers SQLT_NUM\n";
|
||||
|
||||
$s = oci_parse($c, "INSERT INTO bind_sqltnum_tab (id, number_t) VALUES (42, :n1)");
|
||||
$n1 = 42;
|
||||
oci_bind_by_name($s, ":n1", $n1, -1, SQLT_NUM);
|
||||
oci_execute($s);
|
||||
|
||||
check_col($c, 'number_t', 42);
|
||||
|
||||
echo "\nTEST43 insert numbers SQLT_NUM\n";
|
||||
|
||||
$s = oci_parse($c, "INSERT INTO bind_sqltnum_tab (id, number_t) VALUES (43, :n1)");
|
||||
$n1 = 42.69;
|
||||
oci_bind_by_name($s, ":n1", $n1, -1, SQLT_NUM);
|
||||
oci_execute($s);
|
||||
|
||||
check_col($c, 'number_t', 43);
|
||||
|
||||
echo "\nTEST44\n";
|
||||
|
||||
$s = oci_parse($c, "INSERT INTO bind_sqltnum_tab (id, number_t) VALUES (44, :n1)");
|
||||
$n1 = 0;
|
||||
oci_bind_by_name($s, ":n1", $n1, -1, SQLT_NUM);
|
||||
oci_execute($s);
|
||||
|
||||
check_col($c, 'number_t', 44);
|
||||
|
||||
echo "\nTEST45\n";
|
||||
|
||||
$s = oci_parse($c, "INSERT INTO bind_sqltnum_tab (id, number_t) VALUES (45, :n1)");
|
||||
$n1 = -23;
|
||||
oci_bind_by_name($s, ":n1", $n1, -1, SQLT_NUM);
|
||||
oci_execute($s);
|
||||
|
||||
check_col($c, 'number_t', 45);
|
||||
|
||||
echo "\nTEST46 insert numbers\n";
|
||||
|
||||
$s = oci_parse($c, "INSERT INTO bind_sqltnum_tab (id, number_t) VALUES (46, :n1)");
|
||||
$n1 = "-23";
|
||||
oci_bind_by_name($s, ":n1", $n1, -1, SQLT_NUM);
|
||||
oci_execute($s);
|
||||
|
||||
check_col($c, 'number_t', 46);
|
||||
|
||||
echo "\nTEST47\n";
|
||||
|
||||
$s = oci_parse($c, "INSERT INTO bind_sqltnum_tab (id, number_t) VALUES (47, :n1)");
|
||||
$n1 = "23";
|
||||
oci_bind_by_name($s, ":n1", $n1, -1, SQLT_NUM);
|
||||
oci_execute($s);
|
||||
|
||||
check_col($c, 'number_t', 47);
|
||||
|
||||
echo "\nTEST48\n";
|
||||
|
||||
$s = oci_parse($c, "INSERT INTO bind_sqltnum_tab (id, number_t92) VALUES (48, :n1)");
|
||||
$n1 = 123.56;
|
||||
oci_bind_by_name($s, ":n1", $n1, -1, SQLT_NUM);
|
||||
oci_execute($s);
|
||||
|
||||
check_col($c, 'number_t92', 48);
|
||||
|
||||
echo "\nTEST49\n";
|
||||
|
||||
$s = oci_parse($c, "INSERT INTO bind_sqltnum_tab (id, number_t92) VALUES (49, :n1)");
|
||||
$n1 = "123.56";
|
||||
oci_bind_by_name($s, ":n1", $n1, -1, SQLT_NUM);
|
||||
oci_execute($s);
|
||||
|
||||
check_col($c, 'number_t92', 49);
|
||||
|
||||
echo "\nTEST50\n";
|
||||
|
||||
$s = oci_parse($c, "INSERT INTO bind_sqltnum_tab (id, number_t92) VALUES (50, :n1)");
|
||||
$n1 = "";
|
||||
oci_bind_by_name($s, ":n1", $n1, -1, SQLT_NUM);
|
||||
oci_execute($s);
|
||||
|
||||
check_col($c, 'number_t92', 50);
|
||||
|
||||
// Clean up
|
||||
|
||||
$stmtarray = array(
|
||||
"drop table bind_sqltnum_tab"
|
||||
);
|
||||
|
||||
oci8_test_sql_execute($c, $stmtarray);
|
||||
|
||||
?>
|
||||
===DONE===
|
||||
<?php exit(0); ?>
|
||||
--EXPECTF--
|
||||
Test 1 - baseline test
|
||||
array(2) {
|
||||
["ID"]=>
|
||||
array(1) {
|
||||
[0]=>
|
||||
string(3) "100"
|
||||
}
|
||||
["VARCHAR2_T10"]=>
|
||||
array(1) {
|
||||
[0]=>
|
||||
string(4) "Hood"
|
||||
}
|
||||
}
|
||||
Test 2 - SQLT_NUM to a VARCHAR2 column
|
||||
|
||||
Warning: oci_execute(): ORA-12899: %s (%s: 40, %s: 10) in %sbind_sqltnum_11g.php on line %d
|
||||
string(%d) "ORA-12899: %s"
|
||||
|
||||
TEST41 wrong bind type SQLT_NUM
|
||||
|
||||
Warning: oci_execute(): ORA-12899: %s "%s"."BIND_SQLTNUM_TAB"."VARCHAR2_T10" (%s: 40, %s: 10) in %sbind_sqltnum_11g.php on line %d
|
||||
|
||||
TEST42 insert numbers SQLT_NUM
|
||||
array(1) {
|
||||
["NUMBER_T"]=>
|
||||
array(1) {
|
||||
[0]=>
|
||||
NULL
|
||||
}
|
||||
}
|
||||
|
||||
TEST43 insert numbers SQLT_NUM
|
||||
array(1) {
|
||||
["NUMBER_T"]=>
|
||||
array(1) {
|
||||
[0]=>
|
||||
NULL
|
||||
}
|
||||
}
|
||||
|
||||
TEST44
|
||||
array(1) {
|
||||
["NUMBER_T"]=>
|
||||
array(1) {
|
||||
[0]=>
|
||||
string(127) "-000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
|
||||
}
|
||||
}
|
||||
|
||||
TEST45
|
||||
array(1) {
|
||||
["NUMBER_T"]=>
|
||||
array(1) {
|
||||
[0]=>
|
||||
NULL
|
||||
}
|
||||
}
|
||||
|
||||
TEST46 insert numbers
|
||||
array(1) {
|
||||
["NUMBER_T"]=>
|
||||
array(1) {
|
||||
[0]=>
|
||||
NULL
|
||||
}
|
||||
}
|
||||
|
||||
TEST47
|
||||
array(1) {
|
||||
["NUMBER_T"]=>
|
||||
array(1) {
|
||||
[0]=>
|
||||
NULL
|
||||
}
|
||||
}
|
||||
|
||||
TEST48
|
||||
array(1) {
|
||||
["NUMBER_T92"]=>
|
||||
array(1) {
|
||||
[0]=>
|
||||
string(1) "0"
|
||||
}
|
||||
}
|
||||
|
||||
TEST49
|
||||
array(1) {
|
||||
["NUMBER_T92"]=>
|
||||
array(1) {
|
||||
[0]=>
|
||||
string(1) "0"
|
||||
}
|
||||
}
|
||||
|
||||
TEST50
|
||||
|
||||
Warning: oci_execute(): ORA-01438: %s in %sbind_sqltnum_11g.php on line %d
|
||||
array(1) {
|
||||
["NUMBER_T92"]=>
|
||||
array(0) {
|
||||
}
|
||||
}
|
||||
===DONE===
|
||||
@@ -5,6 +5,9 @@ DRCP: Test setting connection class inline
|
||||
if (!extension_loaded('oci8')) die ("skip no oci8 extension");
|
||||
require(dirname(__FILE__).'/connect.inc');
|
||||
if (!$test_drcp) die("skip testing DRCP connection class only works in DRCP mode");
|
||||
// Looked for :pooled in EZ connect string
|
||||
if (strpos($dbase, "/") !== false && stripos($dbase, ":pooled") === false)
|
||||
die('skip DRCP test requires a DRCP pooled server connection');
|
||||
if (strcasecmp($user, "system") && strcasecmp($user, "sys")) die("skip needs to be run as a DBA user");
|
||||
|
||||
preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches_sv);
|
||||
|
||||
@@ -5,6 +5,9 @@ DRCP: privileged connect
|
||||
if (!extension_loaded('oci8')) die("skip no oci8 extension");
|
||||
require(dirname(__FILE__)."/connect.inc");
|
||||
if (!$test_drcp) die("skip requires DRCP connection");
|
||||
// Looked for :pooled in EZ connect string
|
||||
if (strpos($dbase, "/") !== false && stripos($dbase, ":pooled") === false)
|
||||
die('skip DRCP test requires a DRCP pooled server connection');
|
||||
if (strcasecmp($user, "system") && strcasecmp($user, "sys")) die("skip needs to be run as a DBA user");
|
||||
ob_start();
|
||||
phpinfo(INFO_MODULES);
|
||||
|
||||
@@ -8,8 +8,9 @@ if (strcasecmp($user, "system") && strcasecmp($user, "sys")) die("skip needs to
|
||||
if ($test_drcp) die("skip as Output might vary with DRCP");
|
||||
|
||||
preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
|
||||
if (!(isset($matches[0]) && ($matches[1] == 12 && $matches[2] == 1 && $matches[3] >= 0
|
||||
&& $matches[4] >= 2) || ($matches[1] == 12 && $matches[2] > 1)))
|
||||
if (!(isset($matches[0]) &&
|
||||
($matches[1] == 12 && $matches[2] == 1 && $matches[3] >= 0
|
||||
&& $matches[4] >= 2) || ($matches[1] == 12 && $matches[2] > 1))) {
|
||||
die("skip test expected to work only with Oracle 12.1.0.2 database or its later patchsets");
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user