1
0
mirror of https://github.com/php/php-src.git synced 2026-04-28 18:53:33 +02:00

MFH Fix bug #41069 (db link crash). Also allow SQLT_AFC (aka CHAR datatype) in oci_bind_by_name

This commit is contained in:
Christopher Jones
2008-03-04 21:46:24 +00:00
parent 96f8501ccd
commit af6734c1ff
6 changed files with 1354 additions and 12 deletions
+3 -12
View File
@@ -125,22 +125,13 @@ php_oci_statement *php_oci_statement_create (php_oci_connection *connection, cha
Set prefetch buffer size for the statement (we're assuming that one row is ~1K sized) */
int php_oci_statement_set_prefetch(php_oci_statement *statement, long size TSRMLS_DC)
{
ub4 prefetch = size * 1024;
ub4 prefetch = size;
if (size < 1) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Number of rows has to be greater than or equal to 1");
return 1;
}
PHP_OCI_CALL_RETURN(statement->errcode, OCIAttrSet, (statement->stmt, OCI_HTYPE_STMT, &prefetch, 0, OCI_ATTR_PREFETCH_MEMORY, statement->err));
if (statement->errcode != OCI_SUCCESS) {
php_oci_error(statement->err, statement->errcode TSRMLS_CC);
PHP_OCI_HANDLE_ERROR(statement->connection, statement->errcode);
return 1;
}
prefetch = size;
PHP_OCI_CALL_RETURN(statement->errcode, OCIAttrSet, (statement->stmt, OCI_HTYPE_STMT, &prefetch, 0, OCI_ATTR_PREFETCH_ROWS, statement->err));
if (statement->errcode != OCI_SUCCESS) {
@@ -975,8 +966,8 @@ int php_oci_bind_by_name(php_oci_statement *statement, char *name, int name_len,
case SQLT_LBI:
case SQLT_BIN:
case SQLT_LNG:
case SQLT_CHR:
/* this is the default case when type was not specified */
case SQLT_AFC:
case SQLT_CHR: /* SQLT_CHR is the default value when type was not specified */
if (Z_TYPE_P(var) != IS_NULL) {
convert_to_string(var);
}
+287
View File
@@ -0,0 +1,287 @@
--TEST--
SELECT oci_bind_by_name with SQLT_AFC aka CHAR
--SKIPIF--
<?php if (!extension_loaded('oci8')) die ("skip no oci8 extension"); ?>
--FILE--
<?php
require(dirname(__FILE__).'/connect.inc');
// Initialization
$stmtarray = array(
"drop table bind_char_tab",
"create table bind_char_tab (id number, c1 char(10), c2 varchar2(10))",
"insert into bind_char_tab values (1, 'abc', NULL)",
"insert into bind_char_tab values (2, NULL, 'abc')",
"insert into bind_char_tab values (3, NULL, 'abc ')"
);
foreach ($stmtarray as $stmt) {
$s = oci_parse($c, $stmt);
@oci_execute($s);
}
// Run Test
echo "*** Non-null Data Tests against CHAR***\n";
$bv1 = 'abc';
echo "Test 1.1: Type: default. Length: default\n";
$s = oci_parse($c, "select * from bind_char_tab where c1 = :bv");
$r = oci_bind_by_name($s, ":bv", $bv1);
if ($r)
do_e_q($s);
echo "Test 1.2: Type: AFC. Length: default\n";
$r = oci_bind_by_name($s, ":bv", $bv1, -1, SQLT_AFC);
if ($r)
do_e_q($s);
echo "Test 1.3: Type: AFC: Length: 0\n";
$r = oci_bind_by_name($s, ":bv", $bv1, 0, SQLT_AFC);
if ($r)
do_e_q($s);
echo "Test 1.4: Type: AFC: Length: strlen\n";
$r = oci_bind_by_name($s, ":bv", $bv1, strlen($bv1), SQLT_AFC);
if ($r)
do_e_q($s);
echo "Test 1.5: Type: AFC. Length: strlen-1\n";
$r = oci_bind_by_name($s, ":bv", $bv1, strlen($bv1)-1, SQLT_AFC);
if ($r)
do_e_q($s);
echo "Test 1.6: Type: AFC. Length: strlen+1\n";
$r = oci_bind_by_name($s, ":bv", $bv1, strlen($bv1)+1, SQLT_AFC);
if ($r)
do_e_q($s);
echo "\n\n*** NULL data tests against CHAR ***\n";
$bv1 = null;
echo "Test 2.1: Type: default. Length: default\n";
$s = oci_parse($c, "select * from bind_char_tab where c1 = :bv");
$r = oci_bind_by_name($s, ":bv", $bv1);
if ($r)
do_e_q($s);
echo "Test 2.2: Type: AFC. Length: default\n";
$r = oci_bind_by_name($s, ":bv", $bv1, -1, SQLT_AFC);
if ($r)
do_e_q($s);
echo "Test 2.3: Type: AFC: Length: 0\n";
$r = oci_bind_by_name($s, ":bv", $bv1, 0, SQLT_AFC);
if ($r)
do_e_q($s);
echo "Test 2.4: Type: AFC: Length: strlen\n";
$r = oci_bind_by_name($s, ":bv", $bv1, strlen($bv1), SQLT_AFC);
if ($r)
do_e_q($s);
echo "Test 2.5: Type: AFC. Length: strlen-1\n";
$r = oci_bind_by_name($s, ":bv", $bv1, strlen($bv1)-1, SQLT_AFC);
if ($r)
do_e_q($s);
echo "Test 2.6: Type: AFC. Length: strlen+1\n";
$r = oci_bind_by_name($s, ":bv", $bv1, strlen($bv1)+1, SQLT_AFC);
if ($r)
do_e_q($s);
echo "\n\n*** Non-null Data Tests against VARCHAR2***\n";
$bv1 = 'abc';
echo "Test 3.1: Type: default. Length: default\n";
$s = oci_parse($c, "select * from bind_char_tab where c2 = :bv");
$r = oci_bind_by_name($s, ":bv", $bv1);
if ($r)
do_e_q($s);
echo "Test 3.2: Type: AFC. Length: default\n";
$r = oci_bind_by_name($s, ":bv", $bv1, -1, SQLT_AFC);
if ($r)
do_e_q($s);
echo "Test 3.3: Type: AFC: Length: 0\n";
$r = oci_bind_by_name($s, ":bv", $bv1, 0, SQLT_AFC);
if ($r)
do_e_q($s);
echo "Test 3.4: Type: AFC: Length: strlen\n";
$r = oci_bind_by_name($s, ":bv", $bv1, strlen($bv1), SQLT_AFC);
if ($r)
do_e_q($s);
echo "Test 3.5: Type: AFC. Length: strlen-1\n";
$r = oci_bind_by_name($s, ":bv", $bv1, strlen($bv1)-1, SQLT_AFC);
if ($r)
do_e_q($s);
echo "Test 3.6: Type: AFC. Length: strlen+1\n";
$r = oci_bind_by_name($s, ":bv", $bv1, strlen($bv1)+1, SQLT_AFC);
if ($r)
do_e_q($s);
echo "\n\n*** NULL data tests against VARCHAR2 ***\n";
$bv1 = null;
echo "Test 4.1: Type: default. Length: default\n";
$s = oci_parse($c, "select * from bind_char_tab where c2 = :bv");
$r = oci_bind_by_name($s, ":bv", $bv1);
if ($r)
do_e_q($s);
echo "Test 4.2: Type: AFC. Length: default\n";
$r = oci_bind_by_name($s, ":bv", $bv1, -1, SQLT_AFC);
if ($r)
do_e_q($s);
echo "Test 4.3: Type: AFC: Length: 0\n";
$r = oci_bind_by_name($s, ":bv", $bv1, 0, SQLT_AFC);
if ($r)
do_e_q($s);
echo "Test 4.4: Type: AFC: Length: strlen\n";
$r = oci_bind_by_name($s, ":bv", $bv1, strlen($bv1), SQLT_AFC);
if ($r)
do_e_q($s);
echo "Test 4.5: Type: AFC. Length: strlen-1\n";
$r = oci_bind_by_name($s, ":bv", $bv1, strlen($bv1)-1, SQLT_AFC);
if ($r)
do_e_q($s);
echo "Test 4.6: Type: AFC. Length: strlen+1\n";
$r = oci_bind_by_name($s, ":bv", $bv1, strlen($bv1)+1, SQLT_AFC);
if ($r)
do_e_q($s);
function do_e_q($s)
{
echo " Querying:\n";
$r = @oci_execute($s);
if (!$r) {
$m = oci_error($s);
echo " Oci_execute error ORA-".$m['code']." Exiting Query\n";
return;
}
while ($row = oci_fetch_array($s, OCI_ASSOC+OCI_RETURN_NULLS)) {
foreach ($row as $item) {
echo " :" . $item . ":\n";
}
}
}
// Cleanup
$stmtarray = array(
"drop table bind_char_tab"
);
foreach ($stmtarray as $stmt) {
$s = oci_parse($c, $stmt);
oci_execute($s);
}
oci_close($c);
echo "Done\n";
?>
--EXPECT--
*** Non-null Data Tests against CHAR***
Test 1.1: Type: default. Length: default
Querying:
Test 1.2: Type: AFC. Length: default
Querying:
:1:
:abc :
::
Test 1.3: Type: AFC: Length: 0
Querying:
Oci_execute error ORA-1460 Exiting Query
Test 1.4: Type: AFC: Length: strlen
Querying:
:1:
:abc :
::
Test 1.5: Type: AFC. Length: strlen-1
Querying:
Oci_execute error ORA-1460 Exiting Query
Test 1.6: Type: AFC. Length: strlen+1
Querying:
:1:
:abc :
::
*** NULL data tests against CHAR ***
Test 2.1: Type: default. Length: default
Querying:
Test 2.2: Type: AFC. Length: default
Querying:
Test 2.3: Type: AFC: Length: 0
Querying:
Test 2.4: Type: AFC: Length: strlen
Querying:
Test 2.5: Type: AFC. Length: strlen-1
Querying:
Test 2.6: Type: AFC. Length: strlen+1
Querying:
*** Non-null Data Tests against VARCHAR2***
Test 3.1: Type: default. Length: default
Querying:
:2:
::
:abc:
Test 3.2: Type: AFC. Length: default
Querying:
:2:
::
:abc:
Test 3.3: Type: AFC: Length: 0
Querying:
Oci_execute error ORA-1460 Exiting Query
Test 3.4: Type: AFC: Length: strlen
Querying:
:2:
::
:abc:
Test 3.5: Type: AFC. Length: strlen-1
Querying:
Oci_execute error ORA-1460 Exiting Query
Test 3.6: Type: AFC. Length: strlen+1
Querying:
:2:
::
:abc:
*** NULL data tests against VARCHAR2 ***
Test 4.1: Type: default. Length: default
Querying:
Test 4.2: Type: AFC. Length: default
Querying:
Test 4.3: Type: AFC: Length: 0
Querying:
Test 4.4: Type: AFC: Length: strlen
Querying:
Test 4.5: Type: AFC. Length: strlen-1
Querying:
Test 4.6: Type: AFC. Length: strlen+1
Querying:
Done
+115
View File
@@ -0,0 +1,115 @@
--TEST--
SELECT oci_bind_by_name with SQLT_AFC aka CHAR and dates
--SKIPIF--
<?php if (!extension_loaded('oci8')) die ("skip no oci8 extension"); ?>
--FILE--
<?php
require(dirname(__FILE__).'/connect.inc');
// Initialization
$stmtarray = array(
"alter session set nls_date_format='YYYY-MM-DD'",
"drop table bind_char_tab",
"create table bind_char_tab (id number, c1 date)",
"insert into bind_char_tab values (1, '2008-04-20')",
);
foreach ($stmtarray as $stmt) {
$s = oci_parse($c, $stmt);
@oci_execute($s);
}
// Run Test
$bv1 = '2008-04-20';
echo "Test 1.1: Type: default. Length: default\n";
$s = oci_parse($c, "select * from bind_char_tab where c1 = :bv");
$r = oci_bind_by_name($s, ":bv", $bv1);
if ($r)
do_e_q($s);
echo "Test 1.2: Type: AFC. Length: default\n";
$r = oci_bind_by_name($s, ":bv", $bv1, -1, SQLT_AFC);
if ($r)
do_e_q($s);
echo "Test 1.3: Type: AFC: Length: 0\n";
$r = oci_bind_by_name($s, ":bv", $bv1, 0, SQLT_AFC);
if ($r)
do_e_q($s);
echo "Test 1.4: Type: AFC: Length: strlen\n";
$r = oci_bind_by_name($s, ":bv", $bv1, strlen($bv1), SQLT_AFC);
if ($r)
do_e_q($s);
echo "Test 1.5: Type: AFC. Length: strlen-1\n";
$r = oci_bind_by_name($s, ":bv", $bv1, strlen($bv1)-1, SQLT_AFC);
if ($r)
do_e_q($s);
echo "Test 1.6: Type: AFC. Length: strlen+1\n";
$r = oci_bind_by_name($s, ":bv", $bv1, strlen($bv1)+1, SQLT_AFC);
if ($r)
do_e_q($s);
function do_e_q($s)
{
echo " Querying:\n";
$r = @oci_execute($s);
if (!$r) {
$m = oci_error($s);
echo " Oci_execute error ORA-".$m['code']." Exiting Query\n";
return;
}
while ($row = oci_fetch_array($s, OCI_ASSOC+OCI_RETURN_NULLS)) {
foreach ($row as $item) {
echo " :" . $item . ":\n";
}
}
}
// Cleanup
$stmtarray = array(
"drop table bind_char_tab"
);
foreach ($stmtarray as $stmt) {
$s = oci_parse($c, $stmt);
oci_execute($s);
}
oci_close($c);
echo "Done\n";
?>
--EXPECT--
Test 1.1: Type: default. Length: default
Querying:
:1:
:2008-04-20:
Test 1.2: Type: AFC. Length: default
Querying:
:1:
:2008-04-20:
Test 1.3: Type: AFC: Length: 0
Querying:
Oci_execute error ORA-1460 Exiting Query
Test 1.4: Type: AFC: Length: strlen
Querying:
:1:
:2008-04-20:
Test 1.5: Type: AFC. Length: strlen-1
Querying:
Oci_execute error ORA-1460 Exiting Query
Test 1.6: Type: AFC. Length: strlen+1
Querying:
:1:
:2008-04-20:
Done
+336
View File
@@ -0,0 +1,336 @@
--TEST--
PL/SQL oci_bind_by_name with SQLT_AFC aka CHAR to CHAR parameter
--SKIPIF--
<?php if (!extension_loaded('oci8')) die ("skip no oci8 extension"); ?>
--FILE--
<?php
require(dirname(__FILE__).'/connect.inc');
// Initialization
$stmtarray = array(
"create or replace function bind_char_3_fn(p1 char) return char as begin return p1; end;",
);
foreach ($stmtarray as $stmt) {
$s = oci_parse($c, $stmt);
@oci_execute($s);
}
// Run Test
echo "Test 1.1 In Length: default. In Type: default. Out Length: default. Out Type: default\n";
$s = oci_parse($c, "begin :bv2 := bind_char_3_fn(:bv1); end;");
$bv1 = 'abc';
$r = oci_bind_by_name($s, ':bv1', $bv1) && oci_bind_by_name($s, ':bv2', $bv2);
if ($r)
do_e($s);
var_dump($bv1, $bv2);
echo "Test 1.2 In Length: default. In Type: default. Out Length: 10. Out Type: default\n";
$bv1 = 'abc';
$r = oci_bind_by_name($s, ':bv1', $bv1) && oci_bind_by_name($s, ':bv2', $bv2, 10);
if ($r)
do_e($s);
var_dump($bv1, $bv2);
echo "Test 1.3 In Length: -1. In Type: AFC. Out Length: 10. Out Type: default\n";
$bv1 = 'abc';
$r = oci_bind_by_name($s, ':bv1', $bv1, -1, SQLT_AFC) && oci_bind_by_name($s, ':bv2', $bv2, 10);
if ($r)
do_e($s);
var_dump($bv1, $bv2);
echo "Test 1.4 In Length: -1. In Type: AFC. Out Length: 10. Out Type: AFC\n";
$bv1 = 'abc';
$r = oci_bind_by_name($s, ':bv1', $bv1, -1, SQLT_AFC) && oci_bind_by_name($s, ':bv2', $bv2, 10, SQLT_AFC);
if ($r)
do_e($s);
var_dump($bv1, $bv2);
echo "Test 1.5 In Length: strlen. In Type: AFC. Out Length: strlen(input). Out Type: AFC\n";
$bv1 = 'abc';
$r = oci_bind_by_name($s, ':bv1', $bv1, strlen($bv1), SQLT_AFC) && oci_bind_by_name($s, ':bv2', $bv2, strlen($bv1), SQLT_AFC);
if ($r)
do_e($s);
var_dump($bv1, $bv2);
echo "Test 1.6 In Length: strlen. In Type: AFC. Out Length: strlen(input)-1. Out Type: AFC\n";
$bv1 = 'abc';
$r = oci_bind_by_name($s, ':bv1', $bv1, strlen($bv1), SQLT_AFC) && oci_bind_by_name($s, ':bv2', $bv2, strlen($bv1)-1, SQLT_AFC);
if ($r)
do_e($s);
var_dump($bv1, $bv2);
echo "Test 1.7 In Length: strlen. In Type: AFC. Out Length: strlen(input)+1. Out Type: AFC\n";
$bv1 = 'abc';
$r = oci_bind_by_name($s, ':bv1', $bv1, strlen($bv1), SQLT_AFC) && oci_bind_by_name($s, ':bv2', $bv2, strlen($bv1)+1, SQLT_AFC);
if ($r)
do_e($s);
var_dump($bv1, $bv2);
echo "\n\nTests with ''\n\n";
echo "Test 2.1 In Length: -1. In Type: AFC. Out Length: 10. Out Type: AFC\n";
$bv1 = '';
$r = oci_bind_by_name($s, ':bv1', $bv1, -1, SQLT_AFC) && oci_bind_by_name($s, ':bv2', $bv2, 10, SQLT_AFC);
if ($r)
do_e($s);
var_dump($bv1, $bv2);
echo "Test 2.2 In Length: default. In Type: default. Out Length: 10. Out Type: default\n";
$r = oci_bind_by_name($s, ':bv1', $bv1) && oci_bind_by_name($s, ':bv2', $bv2, 10);
if ($r)
do_e($s);
var_dump($bv1, $bv2);
echo "Test 2.3 In Length: -1. In Type: AFC. Out Length: 10. Out Type: default\n";
$bv1 = '';
$r = oci_bind_by_name($s, ':bv1', $bv1, -1, SQLT_AFC) && oci_bind_by_name($s, ':bv2', $bv2, 10);
if ($r)
do_e($s);
var_dump($bv1, $bv2);
echo "Test 2.4 In Length: -1. In Type: AFC. Out Length: 10. Out Type: AFC\n";
$bv1 = '';
$r = oci_bind_by_name($s, ':bv1', $bv1, -1, SQLT_AFC) && oci_bind_by_name($s, ':bv2', $bv2, 10, SQLT_AFC);
if ($r)
do_e($s);
var_dump($bv1, $bv2);
echo "Test 2.5 In Length: -1. In Type: AFC. Out Length: 0. Out Type: AFC\n";
$bv1 = '';
$r = oci_bind_by_name($s, ':bv1', $bv1, -1, SQLT_AFC) && oci_bind_by_name($s, ':bv2', $bv2, 0, SQLT_AFC);
if ($r)
do_e($s);
var_dump($bv1, $bv2);
echo "Test 2.6 In Length: 0. In Type: AFC. Out Length: 0. Out Type: AFC\n";
$bv1 = '';
$r = oci_bind_by_name($s, ':bv1', $bv1, 0, SQLT_AFC) && oci_bind_by_name($s, ':bv2', $bv2, 0, SQLT_AFC);
if ($r)
do_e($s);
var_dump($bv1, $bv2);
echo "Test 2.7 In Length: 1. In Type: AFC. Out Length: 1. Out Type: AFC\n";
$bv1 = '';
$r = oci_bind_by_name($s, ':bv1', $bv1, 1, SQLT_AFC) && oci_bind_by_name($s, ':bv2', $bv2, 1, SQLT_AFC);
if ($r)
do_e($s);
var_dump($bv1, $bv2);
echo "\n\nTests with NULL\n";
echo "Test 3.1 In Length: -1. In Type: AFC. Out Length: 10. Out Type: AFC\n";
$bv1 = null;
$r = oci_bind_by_name($s, ':bv1', $bv1, -1, SQLT_AFC) && oci_bind_by_name($s, ':bv2', $bv2, 10, SQLT_AFC);
if ($r)
do_e($s);
var_dump($bv1, $bv2);
echo "Test 3.2 In Length: default. In Type: default. Out Length: 10. Out Type: default\n";
$bv1 = null;
$r = oci_bind_by_name($s, ':bv1', $bv1) && oci_bind_by_name($s, ':bv2', $bv2, 10);
if ($r)
do_e($s);
var_dump($bv1, $bv2);
echo "Test 3.3 In Length: -1. In Type: AFC. Out Length: 10. Out Type: default\n";
$bv1 = null;
$r = oci_bind_by_name($s, ':bv1', $bv1, -1, SQLT_AFC) && oci_bind_by_name($s, ':bv2', $bv2, 10);
if ($r)
do_e($s);
var_dump($bv1, $bv2);
echo "Test 3.4 In Length: -1. In Type: AFC. Out Length: 10. Out Type: AFC\n";
$bv1 = null;
$r = oci_bind_by_name($s, ':bv1', $bv1, -1, SQLT_AFC) && oci_bind_by_name($s, ':bv2', $bv2, 10, SQLT_AFC);
if ($r)
do_e($s);
var_dump($bv1, $bv2);
echo "Test 3.5 In Length: -1. In Type: AFC. Out Length: 0. Out Type: AFC\n";
$bv1 = null;
$r = oci_bind_by_name($s, ':bv1', $bv1, -1, SQLT_AFC) && oci_bind_by_name($s, ':bv2', $bv2, 0, SQLT_AFC);
if ($r)
do_e($s);
var_dump($bv1, $bv2);
echo "Test 3.6 In Length: -1. In Type: AFC. Out Length: 1. Out Type: AFC\n";
$bv1 = null;
$r = oci_bind_by_name($s, ':bv1', $bv1, -1, SQLT_AFC) && oci_bind_by_name($s, ':bv2', $bv2, 1, SQLT_AFC);
if ($r)
do_e($s);
var_dump($bv1, $bv2);
function do_e($s)
{
echo " Executing:\n";
$r = @oci_execute($s);
if (!$r) {
$m = oci_error($s);
echo " Oci_execute error ORA-".$m['code']."\n";
return;
}
}
// Cleanup
//require(dirname(__FILE__).'/drop_table.inc');
$stmtarray = array(
"drop function bind_char_3_fn"
);
foreach ($stmtarray as $stmt) {
$s = oci_parse($c, $stmt);
oci_execute($s);
}
oci_close($c);
echo "Done\n";
?>
--EXPECTF--
Test 1.1 In Length: default. In Type: default. Out Length: default. Out Type: default
Executing:
Oci_execute error ORA-6502
string(3) "abc"
NULL
Test 1.2 In Length: default. In Type: default. Out Length: 10. Out Type: default
Executing:
string(3) "abc"
string(3) "abc"
Test 1.3 In Length: -1. In Type: AFC. Out Length: 10. Out Type: default
Executing:
string(3) "abc"
string(3) "abc"
Test 1.4 In Length: -1. In Type: AFC. Out Length: 10. Out Type: AFC
Executing:
string(3) "abc"
string(10) "abc "
Test 1.5 In Length: strlen. In Type: AFC. Out Length: strlen(input). Out Type: AFC
Executing:
string(3) "abc"
string(3) "abc"
Test 1.6 In Length: strlen. In Type: AFC. Out Length: strlen(input)-1. Out Type: AFC
Executing:
Oci_execute error ORA-6502
string(3) "abc"
string(3) "abc"
Test 1.7 In Length: strlen. In Type: AFC. Out Length: strlen(input)+1. Out Type: AFC
Executing:
string(3) "abc"
string(4) "abc "
Tests with ''
Test 2.1 In Length: -1. In Type: AFC. Out Length: 10. Out Type: AFC
Executing:
string(0) ""
NULL
Test 2.2 In Length: default. In Type: default. Out Length: 10. Out Type: default
Executing:
string(0) ""
NULL
Test 2.3 In Length: -1. In Type: AFC. Out Length: 10. Out Type: default
Executing:
string(0) ""
NULL
Test 2.4 In Length: -1. In Type: AFC. Out Length: 10. Out Type: AFC
Executing:
string(0) ""
NULL
Test 2.5 In Length: -1. In Type: AFC. Out Length: 0. Out Type: AFC
Executing:
string(0) ""
NULL
Test 2.6 In Length: 0. In Type: AFC. Out Length: 0. Out Type: AFC
Executing:
string(0) ""
NULL
Test 2.7 In Length: 1. In Type: AFC. Out Length: 1. Out Type: AFC
Executing:
string(0) ""
NULL
Tests with NULL
Test 3.1 In Length: -1. In Type: AFC. Out Length: 10. Out Type: AFC
Executing:
NULL
NULL
Test 3.2 In Length: default. In Type: default. Out Length: 10. Out Type: default
Executing:
NULL
NULL
Test 3.3 In Length: -1. In Type: AFC. Out Length: 10. Out Type: default
Executing:
NULL
NULL
Test 3.4 In Length: -1. In Type: AFC. Out Length: 10. Out Type: AFC
Executing:
NULL
NULL
Test 3.5 In Length: -1. In Type: AFC. Out Length: 0. Out Type: AFC
Executing:
NULL
NULL
Test 3.6 In Length: -1. In Type: AFC. Out Length: 1. Out Type: AFC
Executing:
NULL
NULL
Done
+338
View File
@@ -0,0 +1,338 @@
--TEST--
PL/SQL oci_bind_by_name with SQLT_AFC aka CHAR to VARCHAR2 parameter
--SKIPIF--
<?php if (!extension_loaded('oci8')) die ("skip no oci8 extension"); ?>
--FILE--
<?php
// Same test as bind_char_3 but the PL/SQL function uses VARCHAR2 instead of CHAR
require(dirname(__FILE__).'/connect.inc');
// Initialization
$stmtarray = array(
"create or replace function bind_char_3_fn(p1 varchar2) return varchar2 as begin return p1; end;",
);
foreach ($stmtarray as $stmt) {
$s = oci_parse($c, $stmt);
@oci_execute($s);
}
// Run Test
echo "Test 1.1 In Length: default. In Type: default. Out Length: default. Out Type: default\n";
$s = oci_parse($c, "begin :bv2 := bind_char_3_fn(:bv1); end;");
$bv1 = 'abc';
$r = oci_bind_by_name($s, ':bv1', $bv1) && oci_bind_by_name($s, ':bv2', $bv2);
if ($r)
do_e($s);
var_dump($bv1, $bv2);
echo "Test 1.2 In Length: default. In Type: default. Out Length: 10. Out Type: default\n";
$bv1 = 'abc';
$r = oci_bind_by_name($s, ':bv1', $bv1) && oci_bind_by_name($s, ':bv2', $bv2, 10);
if ($r)
do_e($s);
var_dump($bv1, $bv2);
echo "Test 1.3 In Length: -1. In Type: AFC. Out Length: 10. Out Type: default\n";
$bv1 = 'abc';
$r = oci_bind_by_name($s, ':bv1', $bv1, -1, SQLT_AFC) && oci_bind_by_name($s, ':bv2', $bv2, 10);
if ($r)
do_e($s);
var_dump($bv1, $bv2);
echo "Test 1.4 In Length: -1. In Type: AFC. Out Length: 10. Out Type: AFC\n";
$bv1 = 'abc';
$r = oci_bind_by_name($s, ':bv1', $bv1, -1, SQLT_AFC) && oci_bind_by_name($s, ':bv2', $bv2, 10, SQLT_AFC);
if ($r)
do_e($s);
var_dump($bv1, $bv2);
echo "Test 1.5 In Length: strlen. In Type: AFC. Out Length: strlen(input). Out Type: AFC\n";
$bv1 = 'abc';
$r = oci_bind_by_name($s, ':bv1', $bv1, strlen($bv1), SQLT_AFC) && oci_bind_by_name($s, ':bv2', $bv2, strlen($bv1), SQLT_AFC);
if ($r)
do_e($s);
var_dump($bv1, $bv2);
echo "Test 1.6 In Length: strlen. In Type: AFC. Out Length: strlen(input)-1. Out Type: AFC\n";
$bv1 = 'abc';
$r = oci_bind_by_name($s, ':bv1', $bv1, strlen($bv1), SQLT_AFC) && oci_bind_by_name($s, ':bv2', $bv2, strlen($bv1)-1, SQLT_AFC);
if ($r)
do_e($s);
var_dump($bv1, $bv2);
echo "Test 1.7 In Length: strlen. In Type: AFC. Out Length: strlen(input)+1. Out Type: AFC\n";
$bv1 = 'abc';
$r = oci_bind_by_name($s, ':bv1', $bv1, strlen($bv1), SQLT_AFC) && oci_bind_by_name($s, ':bv2', $bv2, strlen($bv1)+1, SQLT_AFC);
if ($r)
do_e($s);
var_dump($bv1, $bv2);
echo "\n\nTests with ''\n\n";
echo "Test 2.1 In Length: -1. In Type: AFC. Out Length: 10. Out Type: AFC\n";
$bv1 = '';
$r = oci_bind_by_name($s, ':bv1', $bv1, -1, SQLT_AFC) && oci_bind_by_name($s, ':bv2', $bv2, 10, SQLT_AFC);
if ($r)
do_e($s);
var_dump($bv1, $bv2);
echo "Test 2.2 In Length: default. In Type: default. Out Length: 10. Out Type: default\n";
$r = oci_bind_by_name($s, ':bv1', $bv1) && oci_bind_by_name($s, ':bv2', $bv2, 10);
if ($r)
do_e($s);
var_dump($bv1, $bv2);
echo "Test 2.3 In Length: -1. In Type: AFC. Out Length: 10. Out Type: default\n";
$bv1 = '';
$r = oci_bind_by_name($s, ':bv1', $bv1, -1, SQLT_AFC) && oci_bind_by_name($s, ':bv2', $bv2, 10);
if ($r)
do_e($s);
var_dump($bv1, $bv2);
echo "Test 2.4 In Length: -1. In Type: AFC. Out Length: 10. Out Type: AFC\n";
$bv1 = '';
$r = oci_bind_by_name($s, ':bv1', $bv1, -1, SQLT_AFC) && oci_bind_by_name($s, ':bv2', $bv2, 10, SQLT_AFC);
if ($r)
do_e($s);
var_dump($bv1, $bv2);
echo "Test 2.5 In Length: -1. In Type: AFC. Out Length: 0. Out Type: AFC\n";
$bv1 = '';
$r = oci_bind_by_name($s, ':bv1', $bv1, -1, SQLT_AFC) && oci_bind_by_name($s, ':bv2', $bv2, 0, SQLT_AFC);
if ($r)
do_e($s);
var_dump($bv1, $bv2);
echo "Test 2.6 In Length: 0. In Type: AFC. Out Length: 0. Out Type: AFC\n";
$bv1 = '';
$r = oci_bind_by_name($s, ':bv1', $bv1, 0, SQLT_AFC) && oci_bind_by_name($s, ':bv2', $bv2, 0, SQLT_AFC);
if ($r)
do_e($s);
var_dump($bv1, $bv2);
echo "Test 2.7 In Length: 1. In Type: AFC. Out Length: 1. Out Type: AFC\n";
$bv1 = '';
$r = oci_bind_by_name($s, ':bv1', $bv1, 1, SQLT_AFC) && oci_bind_by_name($s, ':bv2', $bv2, 1, SQLT_AFC);
if ($r)
do_e($s);
var_dump($bv1, $bv2);
echo "\n\nTests with NULL\n";
echo "Test 3.1 In Length: -1. In Type: AFC. Out Length: 10. Out Type: AFC\n";
$bv1 = null;
$r = oci_bind_by_name($s, ':bv1', $bv1, -1, SQLT_AFC) && oci_bind_by_name($s, ':bv2', $bv2, 10, SQLT_AFC);
if ($r)
do_e($s);
var_dump($bv1, $bv2);
echo "Test 3.2 In Length: default. In Type: default. Out Length: 10. Out Type: default\n";
$bv1 = null;
$r = oci_bind_by_name($s, ':bv1', $bv1) && oci_bind_by_name($s, ':bv2', $bv2, 10);
if ($r)
do_e($s);
var_dump($bv1, $bv2);
echo "Test 3.3 In Length: -1. In Type: AFC. Out Length: 10. Out Type: default\n";
$bv1 = null;
$r = oci_bind_by_name($s, ':bv1', $bv1, -1, SQLT_AFC) && oci_bind_by_name($s, ':bv2', $bv2, 10);
if ($r)
do_e($s);
var_dump($bv1, $bv2);
echo "Test 3.4 In Length: -1. In Type: AFC. Out Length: 10. Out Type: AFC\n";
$bv1 = null;
$r = oci_bind_by_name($s, ':bv1', $bv1, -1, SQLT_AFC) && oci_bind_by_name($s, ':bv2', $bv2, 10, SQLT_AFC);
if ($r)
do_e($s);
var_dump($bv1, $bv2);
echo "Test 3.5 In Length: -1. In Type: AFC. Out Length: 0. Out Type: AFC\n";
$bv1 = null;
$r = oci_bind_by_name($s, ':bv1', $bv1, -1, SQLT_AFC) && oci_bind_by_name($s, ':bv2', $bv2, 0, SQLT_AFC);
if ($r)
do_e($s);
var_dump($bv1, $bv2);
echo "Test 3.6 In Length: -1. In Type: AFC. Out Length: 1. Out Type: AFC\n";
$bv1 = null;
$r = oci_bind_by_name($s, ':bv1', $bv1, -1, SQLT_AFC) && oci_bind_by_name($s, ':bv2', $bv2, 1, SQLT_AFC);
if ($r)
do_e($s);
var_dump($bv1, $bv2);
function do_e($s)
{
echo " Executing:\n";
$r = @oci_execute($s);
if (!$r) {
$m = oci_error($s);
echo " Oci_execute error ORA-".$m['code']."\n";
return;
}
}
// Cleanup
//require(dirname(__FILE__).'/drop_table.inc');
$stmtarray = array(
"drop function bind_char_3_fn"
);
foreach ($stmtarray as $stmt) {
$s = oci_parse($c, $stmt);
oci_execute($s);
}
oci_close($c);
echo "Done\n";
?>
--EXPECTF--
Test 1.1 In Length: default. In Type: default. Out Length: default. Out Type: default
Executing:
Oci_execute error ORA-6502
string(3) "abc"
NULL
Test 1.2 In Length: default. In Type: default. Out Length: 10. Out Type: default
Executing:
string(3) "abc"
string(3) "abc"
Test 1.3 In Length: -1. In Type: AFC. Out Length: 10. Out Type: default
Executing:
string(3) "abc"
string(3) "abc"
Test 1.4 In Length: -1. In Type: AFC. Out Length: 10. Out Type: AFC
Executing:
string(3) "abc"
string(10) "abc "
Test 1.5 In Length: strlen. In Type: AFC. Out Length: strlen(input). Out Type: AFC
Executing:
string(3) "abc"
string(3) "abc"
Test 1.6 In Length: strlen. In Type: AFC. Out Length: strlen(input)-1. Out Type: AFC
Executing:
Oci_execute error ORA-6502
string(3) "abc"
string(3) "abc"
Test 1.7 In Length: strlen. In Type: AFC. Out Length: strlen(input)+1. Out Type: AFC
Executing:
string(3) "abc"
string(4) "abc "
Tests with ''
Test 2.1 In Length: -1. In Type: AFC. Out Length: 10. Out Type: AFC
Executing:
string(0) ""
NULL
Test 2.2 In Length: default. In Type: default. Out Length: 10. Out Type: default
Executing:
string(0) ""
NULL
Test 2.3 In Length: -1. In Type: AFC. Out Length: 10. Out Type: default
Executing:
string(0) ""
NULL
Test 2.4 In Length: -1. In Type: AFC. Out Length: 10. Out Type: AFC
Executing:
string(0) ""
NULL
Test 2.5 In Length: -1. In Type: AFC. Out Length: 0. Out Type: AFC
Executing:
string(0) ""
NULL
Test 2.6 In Length: 0. In Type: AFC. Out Length: 0. Out Type: AFC
Executing:
string(0) ""
NULL
Test 2.7 In Length: 1. In Type: AFC. Out Length: 1. Out Type: AFC
Executing:
string(0) ""
NULL
Tests with NULL
Test 3.1 In Length: -1. In Type: AFC. Out Length: 10. Out Type: AFC
Executing:
NULL
NULL
Test 3.2 In Length: default. In Type: default. Out Length: 10. Out Type: default
Executing:
NULL
NULL
Test 3.3 In Length: -1. In Type: AFC. Out Length: 10. Out Type: default
Executing:
NULL
NULL
Test 3.4 In Length: -1. In Type: AFC. Out Length: 10. Out Type: AFC
Executing:
NULL
NULL
Test 3.5 In Length: -1. In Type: AFC. Out Length: 0. Out Type: AFC
Executing:
NULL
NULL
Test 3.6 In Length: -1. In Type: AFC. Out Length: 1. Out Type: AFC
Executing:
NULL
NULL
Done
+275
View File
@@ -0,0 +1,275 @@
--TEST--
Bug #41069 (Oracle crash with certain data over a DB-link when prefetch memory limit used - Oracle bug 6039623)
--SKIPIF--
<?php
if (!extension_loaded('oci8')) die ("skip no oci8 extension");
require(dirname(__FILE__).'/details.inc');
if (empty($dbase)) die ("skip requires network connection alias for DB link loopback");
if ($test_drcp) die("skip DRCP does not support shared database links");
?>
--INI--
oci8.default_prefetch=5
--FILE--
<?php
require(dirname(__FILE__).'/connect.inc');
// Initialization
$stmtarray = array(
"alter session set nls_date_format = 'MM/DD/YYYY'",
"drop database link bug41069_dblink",
"drop table bug41069_tab",
"create shared database link bug41069_dblink authenticated by $user identified by $password using '$dbase'",
"create table bug41069_tab
(
c1 number(20),
c2 varchar2(60 byte),
c3 varchar2(1000 byte),
c4 varchar2(255 byte),
c5 varchar2(2 byte),
c6 varchar2(1 byte),
c7 varchar2(255 byte),
c8 varchar2(50 byte),
c9 date,
c10 date,
c12 number(20),
c13 varchar2(20 byte),
c15 varchar2(50 byte)
)",
"insert into bug41069_tab (c1, c2, c5, c6, c9, c10, c12, c15) values
(111, 'aaaaaaa', 'b', 'c', '01/17/2008', '01/07/2017', 2222, 'zzzzzzzzzz')",
"insert into bug41069_tab (c1, c2, c3, c4, c5, c6, c7, c9, c10, c12, c13, c15) values
(112, 'aaaaaaa', 'bbbbbbbb', 'ccccccc', 'd', 'e', 'rrrrrrr', '04/16/2007', '04/16/2007', 2223, 'xxxxxxxx', 'zzzzzzzz')",
"insert into bug41069_tab (c1, c2, c3, c4, c5, c6, c7, c9, c10, c12, c15) values
(113, 'aaaaaaa', 'bbbbbbbbbb', 'cccccc', 'e', 'f', 'dddd', '12/04/2006', '12/04/2006', 2224, 'zzzzzzz')"
);
foreach ($stmtarray as $stmt) {
$s = oci_parse($c, $stmt);
@oci_execute($s);
}
// Run Tests
echo "Test 1: non-DB link case that always worked\n";
$stid = oci_parse($c, 'select * from bug41069_tab order by c1');
oci_execute($stid, OCI_DEFAULT);
oci_fetch_all($stid, $results, 0, -1, OCI_ASSOC+OCI_FETCHSTATEMENT_BY_ROW);
var_dump($results);
echo "Test 2: Should not crash\n";
$stid = oci_parse($c, 'select * from bug41069_tab@bug41069_dblink order by c1');
oci_execute($stid, OCI_DEFAULT);
oci_fetch_all($stid, $results, 0, -1, OCI_ASSOC+OCI_FETCHSTATEMENT_BY_ROW);
var_dump($results);
// Cleanup
$c = oci_new_connect($user, $password, $dbase);
$stmtarray = array(
"drop database link bug41069_dblink",
"drop table bug41069_tab"
);
foreach ($stmtarray as $stmt) {
$s = oci_parse($c, $stmt);
oci_execute($s);
}
oci_close($c);
echo "Done\n";
?>
--EXPECT--
Test 1: non-DB link case that always worked
array(3) {
[0]=>
array(13) {
["C1"]=>
string(3) "111"
["C2"]=>
string(7) "aaaaaaa"
["C3"]=>
NULL
["C4"]=>
NULL
["C5"]=>
string(1) "b"
["C6"]=>
string(1) "c"
["C7"]=>
NULL
["C8"]=>
NULL
["C9"]=>
string(10) "01/17/2008"
["C10"]=>
string(10) "01/07/2017"
["C12"]=>
string(4) "2222"
["C13"]=>
NULL
["C15"]=>
string(10) "zzzzzzzzzz"
}
[1]=>
array(13) {
["C1"]=>
string(3) "112"
["C2"]=>
string(7) "aaaaaaa"
["C3"]=>
string(8) "bbbbbbbb"
["C4"]=>
string(7) "ccccccc"
["C5"]=>
string(1) "d"
["C6"]=>
string(1) "e"
["C7"]=>
string(7) "rrrrrrr"
["C8"]=>
NULL
["C9"]=>
string(10) "04/16/2007"
["C10"]=>
string(10) "04/16/2007"
["C12"]=>
string(4) "2223"
["C13"]=>
string(8) "xxxxxxxx"
["C15"]=>
string(8) "zzzzzzzz"
}
[2]=>
array(13) {
["C1"]=>
string(3) "113"
["C2"]=>
string(7) "aaaaaaa"
["C3"]=>
string(10) "bbbbbbbbbb"
["C4"]=>
string(6) "cccccc"
["C5"]=>
string(1) "e"
["C6"]=>
string(1) "f"
["C7"]=>
string(4) "dddd"
["C8"]=>
NULL
["C9"]=>
string(10) "12/04/2006"
["C10"]=>
string(10) "12/04/2006"
["C12"]=>
string(4) "2224"
["C13"]=>
NULL
["C15"]=>
string(7) "zzzzzzz"
}
}
Test 2: Should not crash
array(3) {
[0]=>
array(13) {
["C1"]=>
string(3) "111"
["C2"]=>
string(7) "aaaaaaa"
["C3"]=>
NULL
["C4"]=>
NULL
["C5"]=>
string(1) "b"
["C6"]=>
string(1) "c"
["C7"]=>
NULL
["C8"]=>
NULL
["C9"]=>
string(10) "01/17/2008"
["C10"]=>
string(10) "01/07/2017"
["C12"]=>
string(4) "2222"
["C13"]=>
NULL
["C15"]=>
string(10) "zzzzzzzzzz"
}
[1]=>
array(13) {
["C1"]=>
string(3) "112"
["C2"]=>
string(7) "aaaaaaa"
["C3"]=>
string(8) "bbbbbbbb"
["C4"]=>
string(7) "ccccccc"
["C5"]=>
string(1) "d"
["C6"]=>
string(1) "e"
["C7"]=>
string(7) "rrrrrrr"
["C8"]=>
NULL
["C9"]=>
string(10) "04/16/2007"
["C10"]=>
string(10) "04/16/2007"
["C12"]=>
string(4) "2223"
["C13"]=>
string(8) "xxxxxxxx"
["C15"]=>
string(8) "zzzzzzzz"
}
[2]=>
array(13) {
["C1"]=>
string(3) "113"
["C2"]=>
string(7) "aaaaaaa"
["C3"]=>
string(10) "bbbbbbbbbb"
["C4"]=>
string(6) "cccccc"
["C5"]=>
string(1) "e"
["C6"]=>
string(1) "f"
["C7"]=>
string(4) "dddd"
["C8"]=>
NULL
["C9"]=>
string(10) "12/04/2006"
["C10"]=>
string(10) "12/04/2006"
["C12"]=>
string(4) "2224"
["C13"]=>
NULL
["C15"]=>
string(7) "zzzzzzz"
}
}
Done