]> granicus.if.org Git - php/commitdiff
MFH Fix bug #41069 (db link crash). Also allow SQLT_AFC (aka CHAR datatype) in oci_b...
authorChristopher Jones <sixd@php.net>
Tue, 4 Mar 2008 21:46:24 +0000 (21:46 +0000)
committerChristopher Jones <sixd@php.net>
Tue, 4 Mar 2008 21:46:24 +0000 (21:46 +0000)
ext/oci8/oci8_statement.c
ext/oci8/tests/bind_char_1.phpt [new file with mode: 0644]
ext/oci8/tests/bind_char_2.phpt [new file with mode: 0644]
ext/oci8/tests/bind_char_3.phpt [new file with mode: 0644]
ext/oci8/tests/bind_char_4.phpt [new file with mode: 0644]
ext/oci8/tests/bug41069.phpt [new file with mode: 0644]

index a07937a9a413c1d806904f65d1205ce18121333b..d95456f15f51fc26d5c99665652ad37895143acd 100644 (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);
                        }
diff --git a/ext/oci8/tests/bind_char_1.phpt b/ext/oci8/tests/bind_char_1.phpt
new file mode 100644 (file)
index 0000000..fd76e60
--- /dev/null
@@ -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
diff --git a/ext/oci8/tests/bind_char_2.phpt b/ext/oci8/tests/bind_char_2.phpt
new file mode 100644 (file)
index 0000000..ccf7b58
--- /dev/null
@@ -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
diff --git a/ext/oci8/tests/bind_char_3.phpt b/ext/oci8/tests/bind_char_3.phpt
new file mode 100644 (file)
index 0000000..a339aa9
--- /dev/null
@@ -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
diff --git a/ext/oci8/tests/bind_char_4.phpt b/ext/oci8/tests/bind_char_4.phpt
new file mode 100644 (file)
index 0000000..2357163
--- /dev/null
@@ -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
diff --git a/ext/oci8/tests/bug41069.phpt b/ext/oci8/tests/bug41069.phpt
new file mode 100644 (file)
index 0000000..b3a1b99
--- /dev/null
@@ -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