]> granicus.if.org Git - php/commitdiff
Fixed bug #51291 (oci_error doesn't report last error when called two times)
authorChristopher Jones <sixd@php.net>
Wed, 24 Mar 2010 22:08:55 +0000 (22:08 +0000)
committerChristopher Jones <sixd@php.net>
Wed, 24 Mar 2010 22:08:55 +0000 (22:08 +0000)
ext/oci8/oci8.c
ext/oci8/package.xml
ext/oci8/php_oci8.h
ext/oci8/tests/bug51291.phpt [new file with mode: 0644]
ext/oci8/tests/pecl_bug6109.phpt [moved from ext/oci8/tests/bug6109.phpt with 71% similarity]

index 0211f4ada722b858b4dd3728e846c15445090fbc..74a3e00f1f39a2f4bb0697dff3855ba5a02c940f 100644 (file)
@@ -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;
        }
index 2fee0fcaff8eb0df9bd745194d9e53e9544ba5d7..cc526ca02823cc00027cb3d15ce7bfd2737bda27 100644 (file)
@@ -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="/">
@@ -367,6 +366,22 @@ Fixed bug #47281 ($php_errormsg is limited in size of characters)
  </extsrcrelease>
  <changelog>
 
+<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>
index 7ccce856af8ae1776c83c51c153e780a55cd08fc..a2aac090d15491c56b3ca3f6ed26f487f395b644 100644 (file)
@@ -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 (file)
index 0000000..75851d6
--- /dev/null
@@ -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===
similarity index 71%
rename from ext/oci8/tests/bug6109.phpt
rename to ext/oci8/tests/pecl_bug6109.phpt
index 029c5dddb89361b415d4cf0ea0958f709c016ba0..d0762fa883a5f24c562373306475e84ae462a48e 100644 (file)
@@ -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