} else if (Z_TYPE_P(var) == IS_STRING) {
value_sz = (sb4) Z_STRLEN_P(var);
} else {
- value_sz = PHP_OCI_PIECE_SIZE;
+ /* Bug-72524: revert value_sz from PHP_OCI_PIECE_SIZE to 0. This restores PHP 5.6 behavior */
+ value_sz = 0;
}
} else {
value_sz = (sb4) maxlength;
bindp = zend_hash_update_ptr(statement->binds, zvtmp, bindp);
zend_string_release(zvtmp);
}
+ /* Make sure the minimum of value_sz is 1 to avoid ORA-3149
+ * when both in/out parameters are bound with empty strings
+ */
+ if (value_sz == 0)
+ value_sz = 1;
bindp->descriptor = oci_desc;
bindp->statement = oci_stmt;
<active>no</active>
</lead>
- <date>2016-08-04</date>
+ <date>2016-08-07</date>
<time>12:00:00</time>
<version>
<notes>
This version is for PHP 7 only.
Fixed invalid handle error with Implicit Result Sets
+Fixed bug #72524 (Binding null values triggers ORA-24816 error)
</notes>
<contents>
<dir name="/">
<file name="bug68298.phpt" role="test" />
<file name="bug71422.phpt" role="test" />
<file name="bug71600.phpt" role="test" />
+ <file name="bug72524.phpt" role="test" />
<file name="clientversion.phpt" role="test" />
<file name="close.phpt" role="test" />
<file name="coll_001.phpt" role="test" />
--- /dev/null
+--TEST--\r
+Bug #72524 (Binding null values triggers ORA-24816 error)\r
+--SKIPIF--\r
+<?php\r
+$target_dbs = array('oracledb' => true, 'timesten' => true); // test runs on these DBs\r
+require(dirname(__FILE__).'/skipif.inc');\r
+?>\r
+--FILE--\r
+\r
+<?php\r
+\r
+require(dirname(__FILE__).'/connect.inc');\r
+\r
+// Initialize\r
+\r
+$stmtarray = array(\r
+ "CREATE TABLE mytable (clob_col CLOB DEFAULT NULL, varchar2_col VARCHAR2(255) DEFAULT NULL)"\r
+);\r
+\r
+oci8_test_sql_execute($c, $stmtarray);\r
+\r
+// Run test\r
+\r
+$sql = "INSERT INTO mytable VALUES (:clob_col, :varchar2_col)";\r
+\r
+echo "Test 1 - P1 Value: NULL P1 Length: Default P1 Type: Default P2 Value: NULL P2 Length: Default P2 Type: Default\n";\r
+$stmt = oci_parse($c, $sql);\r
+\r
+$clob = NULL;\r
+$varchar2 = NULL;\r
+oci_bind_by_name($stmt, ':clob_col', $clob);\r
+oci_bind_by_name($stmt, ':varchar2_col', $varchar2);\r
+\r
+var_dump(oci_execute($stmt));\r
+\r
+echo "Test 2 - P1 Value: '' P1 Length: Default P1 Type: Default P2 Value: '' P2 Length: Default P2 Type: Default\n";\r
+\r
+$clob = '';\r
+$varchar2 = '';\r
+oci_bind_by_name($stmt, ':clob_col', $clob);\r
+oci_bind_by_name($stmt, ':varchar2_col', $varchar2);\r
+\r
+var_dump(oci_execute($stmt));\r
+\r
+echo "Test 3 - P1 Value: 'abc' P1 Length: 0 P1 Type: Default P2 Value: '' P2 Length: 0 P2 Type: Default\n";\r
+$clob = 'abc';\r
+$varchar2 = 'abc';\r
+oci_bind_by_name($stmt, ':clob_col', $clob, 0);\r
+oci_bind_by_name($stmt, ':varchar2_col', $varchar2, 0);\r
+\r
+var_dump(oci_execute($stmt));\r
+\r
+echo "Test 4 - P1 Value: NULL P1 Length: -1 P1 Type: SQLT_LNG P2 Value: NULL P2 Length: -1 P2 Type:Default\n";\r
+$clob = NULL;\r
+$varchar2 = NULL;\r
+oci_bind_by_name($stmt, ':clob_col', $clob, -1, SQLT_LNG);\r
+oci_bind_by_name($stmt, ':varchar2_col', $varchar2, -1, SQLT_LNG);\r
+\r
+var_dump(oci_execute($stmt));\r
+\r
+echo "Test 5 - P1 Value: NULL P1 Length: 0 P1 Type: SQLT_LNG P2 Value: NULL P2 Length: 0 P2 Type:Default\n";\r
+$clob = NULL;\r
+$varchar2 = NULL;\r
+oci_bind_by_name($stmt, ':clob_col', $clob, 0, SQLT_LNG);\r
+oci_bind_by_name($stmt, ':varchar2_col', $varchar2, 0, SQLT_LNG);\r
+\r
+\r
+var_dump(oci_execute($stmt));\r
+\r
+// Cleanup\r
+\r
+$stmtarray = array(\r
+ "DROP TABLE mytable"\r
+);\r
+\r
+oci8_test_sql_execute($c, $stmtarray);\r
+\r
+?>\r
+===DONE===\r
+<?php exit(0); ?>\r
+--EXPECTF--\r
+Test 1 - P1 Value: NULL P1 Length: Default P1 Type: Default P2 Value: NULL P2 Length: Default P2 Type: Default\r
+bool(true)\r
+Test 2 - P1 Value: '' P1 Length: Default P1 Type: Default P2 Value: '' P2 Length: Default P2 Type: Default\r
+bool(true)\r
+Test 3 - P1 Value: 'abc' P1 Length: 0 P1 Type: Default P2 Value: '' P2 Length: 0 P2 Type: Default\r
+bool(true)\r
+Test 4 - P1 Value: NULL P1 Length: -1 P1 Type: SQLT_LNG P2 Value: NULL P2 Length: -1 P2 Type:Default\r
+\r
+Warning: oci_execute(): ORA-24816: %s in %s on line %d\r
+bool(false)\r
+Test 5 - P1 Value: NULL P1 Length: 0 P1 Type: SQLT_LNG P2 Value: NULL P2 Length: 0 P2 Type:Default\r
+\r
+Warning: oci_execute(): ORA-24816: %s in %s on line %d\r
+bool(false)\r
+===DONE===\r