summaryrefslogtreecommitdiff
path: root/ext/oci8
diff options
context:
space:
mode:
authorChristopher Jones <sixd@php.net>2010-03-24 22:08:55 +0000
committerChristopher Jones <sixd@php.net>2010-03-24 22:08:55 +0000
commit1a6f4efbad32114933fd16dbc03f0cfa9fc37967 (patch)
tree5ba7fc8d079cc308b369efa7cdb6b9ccfef3f8bc /ext/oci8
parentabd893a2ae654b263145a3717b1bed3616ebf2fe (diff)
downloadphp-git-1a6f4efbad32114933fd16dbc03f0cfa9fc37967.tar.gz
Fixed bug #51291 (oci_error doesn't report last error when called two times)
Diffstat (limited to 'ext/oci8')
-rw-r--r--ext/oci8/oci8.c14
-rw-r--r--ext/oci8/package.xml29
-rw-r--r--ext/oci8/php_oci8.h2
-rw-r--r--ext/oci8/tests/bug51291.phpt434
-rw-r--r--ext/oci8/tests/pecl_bug6109.phpt (renamed from ext/oci8/tests/bug6109.phpt)14
5 files changed, 469 insertions, 24 deletions
diff --git a/ext/oci8/oci8.c b/ext/oci8/oci8.c
index 0211f4ada7..74a3e00f1f 100644
--- a/ext/oci8/oci8.c
+++ b/ext/oci8/oci8.c
@@ -1549,6 +1549,7 @@ void php_oci_connection_descriptors_free(php_oci_connection *connection TSRMLS_D
/* {{{ php_oci_error()
*
* Fetch & print out error message if we get an error
+ * Returns an Oracle error number
*/
sb4 php_oci_error(OCIError *err_p, sword status TSRMLS_DC)
{
@@ -1639,19 +1640,20 @@ int php_oci_fetch_sqltext_offset(php_oci_statement *statement, text **sqltext, u
{
*sqltext = NULL;
*error_offset = 0;
+ sword errstatus;
- PHP_OCI_CALL_RETURN(statement->errcode, OCIAttrGet, ((dvoid *)statement->stmt, OCI_HTYPE_STMT, (dvoid *) sqltext, (ub4 *)0, OCI_ATTR_STATEMENT, statement->err));
+ PHP_OCI_CALL_RETURN(errstatus, OCIAttrGet, ((dvoid *)statement->stmt, OCI_HTYPE_STMT, (dvoid *) sqltext, (ub4 *)0, OCI_ATTR_STATEMENT, statement->err));
- if (statement->errcode != OCI_SUCCESS) {
- statement->errcode = php_oci_error(statement->err, statement->errcode TSRMLS_CC);
+ if (errstatus != OCI_SUCCESS) {
+ statement->errcode = php_oci_error(statement->err, errstatus TSRMLS_CC);
PHP_OCI_HANDLE_ERROR(statement->connection, statement->errcode);
return 1;
}
- PHP_OCI_CALL_RETURN(statement->errcode, OCIAttrGet, ((dvoid *)statement->stmt, OCI_HTYPE_STMT, (ub2 *)error_offset, (ub4 *)0, OCI_ATTR_PARSE_ERROR_OFFSET, statement->err));
+ PHP_OCI_CALL_RETURN(errstatus, OCIAttrGet, ((dvoid *)statement->stmt, OCI_HTYPE_STMT, (ub2 *)error_offset, (ub4 *)0, OCI_ATTR_PARSE_ERROR_OFFSET, statement->err));
- if (statement->errcode != OCI_SUCCESS) {
- statement->errcode = php_oci_error(statement->err, statement->errcode TSRMLS_CC);
+ if (errstatus != OCI_SUCCESS) {
+ statement->errcode = php_oci_error(statement->err, errstatus TSRMLS_CC);
PHP_OCI_HANDLE_ERROR(statement->connection, statement->errcode);
return 1;
}
diff --git a/ext/oci8/package.xml b/ext/oci8/package.xml
index 2fee0fcaff..cc526ca028 100644
--- a/ext/oci8/package.xml
+++ b/ext/oci8/package.xml
@@ -6,7 +6,7 @@ http://pear.php.net/dtd/package-2.0.xsd">
<name>oci8</name>
<channel>pecl.php.net</channel>
<summary>Extension for Oracle Database</summary>
- <description>This extension allows you to access Oracle databases using the Oracle Call Interface (OCI8). It can be built with PHP 4.3.9 to 5.x. It can be linked with Oracle 9.2, 10.2, 11.1, or 11.2 client libraries.
+ <description>This extension allows you to access Oracle databases. It can be built with PHP 4.3.9 to 5.x. It can be linked with Oracle 9.2, 10.2, 11.1, or 11.2 client libraries.
</description>
<lead>
<name>Christopher Jones</name>
@@ -37,17 +37,16 @@ http://pear.php.net/dtd/package-2.0.xsd">
<time>15:00:00</time>
<version>
- <release>1.4.1</release>
- <api>1.4.1</api>
+ <release>1.4.2</release>
+ <api>1.4.2</api>
</version>
<stability>
- <release>stable</release>
- <api>stable</api>
+ <release>development</release>
+ <api>development</api>
</stability>
<license uri="http://www.php.net/license">PHP</license>
<notes>
-Fixed bug #49560 (Using LOBs causes slow PHP shutdown)
-Fixed bug #47281 ($php_errormsg is limited in size of characters)
+ Fixed bug #51291 (oci_error doesn't report last error when called two times)
</notes>
<contents>
<dir name="/">
@@ -369,6 +368,22 @@ Fixed bug #47281 ($php_errormsg is limited in size of characters)
<release>
<version>
+ <release>1.4.1</release>
+ <api>1.4.1</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="http://www.php.net/license">PHP</license>
+ <notes>
+ Fixed bug #49560 (Using LOBs causes slow PHP shutdown)
+ Fixed bug #47281 ($php_errormsg is limited in size of characters)
+ </notes>
+</release>
+
+<release>
+ <version>
<release>1.4.0</release>
<api>1.4.0</api>
</version>
diff --git a/ext/oci8/php_oci8.h b/ext/oci8/php_oci8.h
index 7ccce856af..a2aac090d1 100644
--- a/ext/oci8/php_oci8.h
+++ b/ext/oci8/php_oci8.h
@@ -46,7 +46,7 @@
*/
#undef PHP_OCI8_VERSION
#endif
-#define PHP_OCI8_VERSION "1.4.1"
+#define PHP_OCI8_VERSION "1.4.2-development"
extern zend_module_entry oci8_module_entry;
#define phpext_oci8_ptr &oci8_module_entry
diff --git a/ext/oci8/tests/bug51291.phpt b/ext/oci8/tests/bug51291.phpt
new file mode 100644
index 0000000000..75851d63b1
--- /dev/null
+++ b/ext/oci8/tests/bug51291.phpt
@@ -0,0 +1,434 @@
+--TEST--
+Bug #51291 (oci_error() doesn't report last error when called two times)
+--SKIPIF--
+<?php if (!extension_loaded('oci8')) die ("skip no oci8 extension"); ?>
+--FILE--
+<?php
+
+require(dirname(__FILE__).'/connect.inc');
+
+echo "Test 1 - Parse\n";
+
+$s = @oci_parse($c, "select ' from dual");
+if (!$s) {
+ var_dump(oci_error($c));
+ echo "2nd call\n";
+ var_dump(oci_error($c));
+}
+
+echo "\nTest 2 - Parse\n";
+
+$s = @oci_parse($c, "select ' from dual");
+if (!$s) {
+ var_dump(oci_error(), oci_error($c), oci_error($s));
+ echo "2nd call\n";
+ var_dump(oci_error(), oci_error($c), oci_error($s));
+}
+
+echo "\nTest 3 - Execute\n";
+
+$s = @oci_parse($c, 'select doesnotexist from dual');
+$r = @oci_execute($s, OCI_DEFAULT);
+if (!$r) {
+ var_dump(oci_error($s));
+ echo "2nd call\n";
+ var_dump(oci_error($s));
+}
+
+echo "\nTest 4 - Execute - consecutive oci_error calls of different kinds\n";
+
+$s = @oci_parse($c, 'select doesnotexist from dual');
+$r = @oci_execute($s, OCI_DEFAULT);
+if (!$r) {
+ var_dump(oci_error(), oci_error($c), oci_error($s));
+ echo "2nd call\n";
+ var_dump(oci_error(), oci_error($c), oci_error($s));
+}
+
+
+echo "\nTest 5 - Execute - after oci_rollback\n";
+
+$s = @oci_parse($c, 'select doesnotexist from dual');
+$r = @oci_execute($s, OCI_DEFAULT);
+if (!$r) {
+ var_dump(oci_error(), oci_error($c), oci_error($s));
+ $r = oci_rollback($c);
+ echo "Rollback status is ";
+ if (is_null($r)) echo "null";
+ else if ($r === false) echo "false";
+ else if ($r === true) echo "true";
+ else echo $r;
+ echo "\n";
+ echo "2nd call after oci_rollback\n";
+ var_dump(oci_error(), oci_error($c), oci_error($s));
+}
+
+
+echo "\nTest 6 - Execute - after successful 2nd query with new handle\n";
+
+$s = @oci_parse($c, 'select doesnotexist from dual');
+$r = @oci_execute($s, OCI_DEFAULT);
+if (!$r) {
+ var_dump(oci_error(), oci_error($c), oci_error($s));
+ $s2 = oci_parse($c, 'select 1 from dual');
+ $r = oci_execute($s2, OCI_DEFAULT);
+ echo "Execute status is ";
+ if (is_null($r)) echo "null";
+ else if ($r === false) echo "false";
+ else if ($r === true) echo "true";
+ else echo $r;
+ echo "\n";
+ echo "2nd call after successful execute\n";
+ var_dump(oci_error(), oci_error($c), oci_error($s), oci_error($s2));
+}
+
+
+echo "\nTest 7 - Execute - after successful 2nd query with same handle\n";
+
+$s = @oci_parse($c, 'select doesnotexist from dual');
+$r = @oci_execute($s, OCI_DEFAULT);
+if (!$r) {
+ var_dump(oci_error(), oci_error($c), oci_error($s));
+ $s = oci_parse($c, 'select 1 from dual');
+ $r = oci_execute($s, OCI_DEFAULT);
+ echo "Execute status is ";
+ if (is_null($r)) echo "null";
+ else if ($r === false) echo "false";
+ else if ($r === true) echo "true";
+ else echo $r;
+ echo "\n";
+ echo "2nd call after successful execute\n";
+ var_dump(oci_error(), oci_error($c), oci_error($s));
+}
+
+
+echo "\nTest 8 - Execute - after unsuccessful 2nd query with new handle\n";
+
+$s = @oci_parse($c, 'select doesnotexist from dual');
+$r = @oci_execute($s, OCI_DEFAULT);
+if (!$r) {
+ var_dump(oci_error(), oci_error($c), oci_error($s));
+ $s2 = oci_parse($c, 'select reallynothere from dual');
+ $r = oci_execute($s2, OCI_DEFAULT);
+ echo "Execute status is ";
+ if (is_null($r)) echo "null";
+ else if ($r === false) echo "false";
+ else if ($r === true) echo "true";
+ else echo $r;
+ echo "\n";
+ echo "2nd call after unsuccessful execute\n";
+ var_dump(oci_error(), oci_error($c), oci_error($s), oci_error($s2));
+}
+
+echo "\nTest 9 - Execute - after unsuccessful 2nd query with same handle\n";
+
+$s = @oci_parse($c, 'select doesnotexist from dual');
+$r = @oci_execute($s, OCI_DEFAULT);
+if (!$r) {
+ var_dump(oci_error(), oci_error($c), oci_error($s));
+ $s = oci_parse($c, 'select reallynothere from dual');
+ $r = oci_execute($s, OCI_DEFAULT);
+ echo "Execute status is ";
+ if (is_null($r)) echo "null";
+ else if ($r === false) echo "false";
+ else if ($r === true) echo "true";
+ else echo $r;
+ echo "\n";
+ echo "2nd call after unsuccessful execute\n";
+ var_dump(oci_error(), oci_error($c), oci_error($s));
+}
+
+echo "\nTest 10 - Execute - after successful 2nd query with same statement\n";
+
+$s = oci_parse($c, "declare e exception; begin if :bv = 1 then raise e; end if; end;");
+$bv = 1;
+oci_bind_by_name($s, ":bv", $bv);
+$r = @oci_execute($s, OCI_DEFAULT);
+if (!$r) {
+ var_dump(oci_error(), oci_error($c), oci_error($s));
+ $bv = 0;
+ $r = oci_execute($s, OCI_DEFAULT);
+ echo "Execute status is ";
+ if (is_null($r)) echo "null";
+ else if ($r === false) echo "false";
+ else if ($r === true) echo "true";
+ else echo $r;
+ echo "\n";
+ echo "2nd call after successful execute\n";
+ var_dump(oci_error(), oci_error($c), oci_error($s));
+}
+
+?>
+===DONE===
+<?php exit(0); ?>
+--EXPECTF--
+Test 1 - Parse
+array(4) {
+ ["code"]=>
+ int(1756)
+ ["message"]=>
+ string(48) "ORA-01756: %s"
+ ["offset"]=>
+ int(0)
+ ["sqltext"]=>
+ string(0) ""
+}
+2nd call
+array(4) {
+ ["code"]=>
+ int(1756)
+ ["message"]=>
+ string(48) "ORA-01756: %s"
+ ["offset"]=>
+ int(0)
+ ["sqltext"]=>
+ string(0) ""
+}
+
+Test 2 - Parse
+
+Warning: oci_error() expects parameter 1 to be resource, boolean given in %sbug51291.php on line %d
+bool(false)
+array(4) {
+ ["code"]=>
+ int(1756)
+ ["message"]=>
+ string(48) "ORA-01756: %s"
+ ["offset"]=>
+ int(0)
+ ["sqltext"]=>
+ string(0) ""
+}
+NULL
+2nd call
+
+Warning: oci_error() expects parameter 1 to be resource, boolean given in %sbug51291.php on line %d
+bool(false)
+array(4) {
+ ["code"]=>
+ int(1756)
+ ["message"]=>
+ string(48) "ORA-01756: %s"
+ ["offset"]=>
+ int(0)
+ ["sqltext"]=>
+ string(0) ""
+}
+NULL
+
+Test 3 - Execute
+array(4) {
+ ["code"]=>
+ int(904)
+ ["message"]=>
+ string(45) "ORA-00904: "DOESNOTEXIST": %s"
+ ["offset"]=>
+ int(7)
+ ["sqltext"]=>
+ string(29) "select doesnotexist from dual"
+}
+2nd call
+array(4) {
+ ["code"]=>
+ int(904)
+ ["message"]=>
+ string(45) "ORA-00904: "DOESNOTEXIST": %s"
+ ["offset"]=>
+ int(7)
+ ["sqltext"]=>
+ string(29) "select doesnotexist from dual"
+}
+
+Test 4 - Execute - consecutive oci_error calls of different kinds
+bool(false)
+bool(false)
+array(4) {
+ ["code"]=>
+ int(904)
+ ["message"]=>
+ string(45) "ORA-00904: "DOESNOTEXIST": %s"
+ ["offset"]=>
+ int(7)
+ ["sqltext"]=>
+ string(29) "select doesnotexist from dual"
+}
+2nd call
+bool(false)
+bool(false)
+array(4) {
+ ["code"]=>
+ int(904)
+ ["message"]=>
+ string(45) "ORA-00904: "DOESNOTEXIST": %s"
+ ["offset"]=>
+ int(7)
+ ["sqltext"]=>
+ string(29) "select doesnotexist from dual"
+}
+
+Test 5 - Execute - after oci_rollback
+bool(false)
+bool(false)
+array(4) {
+ ["code"]=>
+ int(904)
+ ["message"]=>
+ string(45) "ORA-00904: "DOESNOTEXIST": %s"
+ ["offset"]=>
+ int(7)
+ ["sqltext"]=>
+ string(29) "select doesnotexist from dual"
+}
+Rollback status is true
+2nd call after oci_rollback
+bool(false)
+bool(false)
+array(4) {
+ ["code"]=>
+ int(904)
+ ["message"]=>
+ string(45) "ORA-00904: "DOESNOTEXIST": %s"
+ ["offset"]=>
+ int(7)
+ ["sqltext"]=>
+ string(29) "select doesnotexist from dual"
+}
+
+Test 6 - Execute - after successful 2nd query with new handle
+bool(false)
+bool(false)
+array(4) {
+ ["code"]=>
+ int(904)
+ ["message"]=>
+ string(45) "ORA-00904: "DOESNOTEXIST": %s"
+ ["offset"]=>
+ int(7)
+ ["sqltext"]=>
+ string(29) "select doesnotexist from dual"
+}
+Execute status is true
+2nd call after successful execute
+bool(false)
+bool(false)
+array(4) {
+ ["code"]=>
+ int(904)
+ ["message"]=>
+ string(45) "ORA-00904: "DOESNOTEXIST": %s"
+ ["offset"]=>
+ int(7)
+ ["sqltext"]=>
+ string(29) "select doesnotexist from dual"
+}
+bool(false)
+
+Test 7 - Execute - after successful 2nd query with same handle
+bool(false)
+bool(false)
+array(4) {
+ ["code"]=>
+ int(904)
+ ["message"]=>
+ string(45) "ORA-00904: "DOESNOTEXIST": %s"
+ ["offset"]=>
+ int(7)
+ ["sqltext"]=>
+ string(29) "select doesnotexist from dual"
+}
+Execute status is true
+2nd call after successful execute
+bool(false)
+bool(false)
+bool(false)
+
+Test 8 - Execute - after unsuccessful 2nd query with new handle
+bool(false)
+bool(false)
+array(4) {
+ ["code"]=>
+ int(904)
+ ["message"]=>
+ string(45) "ORA-00904: "DOESNOTEXIST": %s"
+ ["offset"]=>
+ int(7)
+ ["sqltext"]=>
+ string(29) "select doesnotexist from dual"
+}
+
+Warning: oci_execute(): ORA-00904: "REALLYNOTHERE": %s in %sbug51291.php on line %d
+Execute status is false
+2nd call after unsuccessful execute
+bool(false)
+bool(false)
+array(4) {
+ ["code"]=>
+ int(904)
+ ["message"]=>
+ string(45) "ORA-00904: "DOESNOTEXIST": %s"
+ ["offset"]=>
+ int(7)
+ ["sqltext"]=>
+ string(29) "select doesnotexist from dual"
+}
+array(4) {
+ ["code"]=>
+ int(904)
+ ["message"]=>
+ string(46) "ORA-00904: "REALLYNOTHERE": %s"
+ ["offset"]=>
+ int(7)
+ ["sqltext"]=>
+ string(30) "select reallynothere from dual"
+}
+
+Test 9 - Execute - after unsuccessful 2nd query with same handle
+bool(false)
+bool(false)
+array(4) {
+ ["code"]=>
+ int(904)
+ ["message"]=>
+ string(45) "ORA-00904: "DOESNOTEXIST": %s"
+ ["offset"]=>
+ int(7)
+ ["sqltext"]=>
+ string(29) "select doesnotexist from dual"
+}
+
+Warning: oci_execute(): ORA-00904: "REALLYNOTHERE": %s in %sbug51291.php on line %d
+Execute status is false
+2nd call after unsuccessful execute
+bool(false)
+bool(false)
+array(4) {
+ ["code"]=>
+ int(904)
+ ["message"]=>
+ string(46) "ORA-00904: "REALLYNOTHERE": %s"
+ ["offset"]=>
+ int(7)
+ ["sqltext"]=>
+ string(30) "select reallynothere from dual"
+}
+
+Test 10 - Execute - after successful 2nd query with same statement
+bool(false)
+bool(false)
+array(4) {
+ ["code"]=>
+ int(6510)
+ ["message"]=>
+ string(72) "ORA-06510: PL/SQL: %s
+ORA-06512: %s"
+ ["offset"]=>
+ int(0)
+ ["sqltext"]=>
+ string(64) "declare e exception; begin if :bv = 1 then raise e; end if; end;"
+}
+Execute status is true
+2nd call after successful execute
+bool(false)
+bool(false)
+bool(false)
+===DONE===
diff --git a/ext/oci8/tests/bug6109.phpt b/ext/oci8/tests/pecl_bug6109.phpt
index 029c5dddb8..d0762fa883 100644
--- a/ext/oci8/tests/bug6109.phpt
+++ b/ext/oci8/tests/pecl_bug6109.phpt
@@ -11,10 +11,6 @@ require(dirname(__FILE__).'/connect.inc');
echo "Test 1\n";
-echo "Once Oracle has popped the message from its stack, the message is\n";
-echo "no longer available.\n";
-
-
$s = oci_parse($c, 'delete from table_does_not_exist');
$r = @oci_execute($s);
@@ -36,11 +32,9 @@ echo "Done\n";
?>
--EXPECTF--
Test 1
-Once Oracle has popped the message from its stack, the message is
-no longer available.
0 -> ORA-00942: %s
-1 ->
-2 ->
-3 ->
-4 ->
+1 -> ORA-00942: %s
+2 -> ORA-00942: %s
+3 -> ORA-00942: %s
+4 -> ORA-00942: %s
Done