]> granicus.if.org Git - php/commitdiff
Initial PHP OCI8 2.0.0-dev commit.
authorChristopher Jones <sixd@php.net>
Wed, 24 Jul 2013 22:33:22 +0000 (15:33 -0700)
committerChristopher Jones <sixd@php.net>
Wed, 24 Jul 2013 22:33:22 +0000 (15:33 -0700)
Includes Oracle Database 12c Implicit Result Set support, DTrace
support, and various code cleanups.

See package.xml for details.

102 files changed:
ext/oci8/README
ext/oci8/config.m4
ext/oci8/oci8.c
ext/oci8/oci8_collection.c
ext/oci8/oci8_dtrace.d [new file with mode: 0644]
ext/oci8/oci8_interface.c
ext/oci8/oci8_lob.c
ext/oci8/oci8_statement.c
ext/oci8/package.xml
ext/oci8/php_oci8.h
ext/oci8/php_oci8_int.h
ext/oci8/tests/bind_char_1.phpt
ext/oci8/tests/bind_char_1_11gR1.phpt
ext/oci8/tests/bind_char_2.phpt
ext/oci8/tests/bind_char_2_11gR1.phpt
ext/oci8/tests/bind_char_3.phpt
ext/oci8/tests/bind_char_3_11gR1.phpt
ext/oci8/tests/bind_char_4.phpt
ext/oci8/tests/bind_char_4_11gR1.phpt
ext/oci8/tests/bind_unsupported_2.phpt
ext/oci8/tests/bug27303_1.phpt
ext/oci8/tests/bug27303_1_11gR1.phpt
ext/oci8/tests/bug27303_2.phpt
ext/oci8/tests/bug27303_2_11gR1.phpt
ext/oci8/tests/bug27303_4.phpt
ext/oci8/tests/bug27303_4_11gR1.phpt
ext/oci8/tests/bug36403.phpt
ext/oci8/tests/bug43497.phpt
ext/oci8/tests/bug47281.phpt
ext/oci8/tests/commit_001.phpt
ext/oci8/tests/conn_attr.inc
ext/oci8/tests/conn_attr_1.phpt
ext/oci8/tests/conn_attr_2.phpt
ext/oci8/tests/conn_attr_3.phpt
ext/oci8/tests/conn_attr_4.phpt
ext/oci8/tests/conn_attr_5.phpt
ext/oci8/tests/connect_without_oracle_home.phpt
ext/oci8/tests/connect_without_oracle_home_11.phpt
ext/oci8/tests/connect_without_oracle_home_old_11.phpt
ext/oci8/tests/cursors_old.phpt
ext/oci8/tests/debug.phpt
ext/oci8/tests/define.phpt
ext/oci8/tests/define1.phpt
ext/oci8/tests/define4.phpt
ext/oci8/tests/define5.phpt
ext/oci8/tests/define_old.phpt
ext/oci8/tests/details.inc
ext/oci8/tests/edition_1.phpt
ext/oci8/tests/edition_2.phpt
ext/oci8/tests/extauth_01.phpt
ext/oci8/tests/extauth_02.phpt
ext/oci8/tests/extauth_03.phpt
ext/oci8/tests/fetch.phpt
ext/oci8/tests/fetch_all.phpt
ext/oci8/tests/fetch_all1.phpt
ext/oci8/tests/fetch_all3.phpt
ext/oci8/tests/fetch_all4.phpt
ext/oci8/tests/fetch_all5.phpt
ext/oci8/tests/fetch_into.phpt
ext/oci8/tests/fetch_object.phpt
ext/oci8/tests/fetch_row.phpt
ext/oci8/tests/field_funcs1.phpt
ext/oci8/tests/imp_res_1.phpt [new file with mode: 0644]
ext/oci8/tests/imp_res_2.phpt [new file with mode: 0644]
ext/oci8/tests/imp_res_3.phpt [new file with mode: 0644]
ext/oci8/tests/imp_res_4.phpt [new file with mode: 0644]
ext/oci8/tests/imp_res_5.phpt [new file with mode: 0644]
ext/oci8/tests/imp_res_6.phpt [new file with mode: 0644]
ext/oci8/tests/imp_res_7.phpt [new file with mode: 0644]
ext/oci8/tests/imp_res_call_error.phpt [new file with mode: 0644]
ext/oci8/tests/imp_res_cancel.phpt [new file with mode: 0644]
ext/oci8/tests/imp_res_close.phpt [new file with mode: 0644]
ext/oci8/tests/imp_res_cursor.phpt [new file with mode: 0644]
ext/oci8/tests/imp_res_dbmsoutput.phpt [new file with mode: 0644]
ext/oci8/tests/imp_res_field.phpt [new file with mode: 0644]
ext/oci8/tests/imp_res_func_error.phpt [new file with mode: 0644]
ext/oci8/tests/imp_res_get_1.phpt [new file with mode: 0644]
ext/oci8/tests/imp_res_get_2.phpt [new file with mode: 0644]
ext/oci8/tests/imp_res_get_3.phpt [new file with mode: 0644]
ext/oci8/tests/imp_res_get_4.phpt [new file with mode: 0644]
ext/oci8/tests/imp_res_get_5.phpt [new file with mode: 0644]
ext/oci8/tests/imp_res_get_all.phpt [new file with mode: 0644]
ext/oci8/tests/imp_res_get_cancel.phpt [new file with mode: 0644]
ext/oci8/tests/imp_res_get_close_1.phpt [new file with mode: 0644]
ext/oci8/tests/imp_res_get_close_2.phpt [new file with mode: 0644]
ext/oci8/tests/imp_res_get_close_3.phpt [new file with mode: 0644]
ext/oci8/tests/imp_res_get_cursor.phpt [new file with mode: 0644]
ext/oci8/tests/imp_res_get_dbmsoutput.phpt [new file with mode: 0644]
ext/oci8/tests/imp_res_get_exec.phpt [new file with mode: 0644]
ext/oci8/tests/imp_res_get_none.phpt [new file with mode: 0644]
ext/oci8/tests/imp_res_insert.phpt [new file with mode: 0644]
ext/oci8/tests/imp_res_lob.phpt [new file with mode: 0644]
ext/oci8/tests/imp_res_prefetch.phpt [new file with mode: 0644]
ext/oci8/tests/lob_015.phpt
ext/oci8/tests/lob_temp2.phpt [new file with mode: 0644]
ext/oci8/tests/minfo.phpt
ext/oci8/tests/password.phpt
ext/oci8/tests/password_2.phpt
ext/oci8/tests/password_new.phpt
ext/oci8/tests/password_old.phpt
ext/oci8/tests/refcur_prefetch_3.phpt
ext/oci8/tests/reflection1.phpt

index 420d5dac58e417fda691a956fd5fa61e46d76f0b..af5beeb5c07450c4b25a85cee3c2cd951a8e2847 100644 (file)
@@ -6,8 +6,8 @@ Use the OCI8 extension to access Oracle Database.
 Documentation is at http://php.net/oci8
 
 The extension can be built with PHP versions 4.3.9 to 5.x using Oracle
-9.2, 10, or 11 client libraries.  Oracle's standard cross-version
-connectivity applies.  For example PHP linked with Oracle 11.2 client
-libraries can connect to Oracle Database 9.2 onwards.  See Oracle's
-note "Oracle Client / Server Interoperability Support" (ID 207303.1)
-for details.
+Database 9.2, 10, 11 or 12 client libraries.  Oracle's standard
+cross-version connectivity applies.  For example PHP linked with
+Oracle 11.2 client libraries can connect to Oracle Database 9.2
+onwards.  See Oracle's note "Oracle Client / Server Interoperability
+Support" (ID 207303.1) for details.
index 34ae76c44b02141f186ca173e2b84156c4b641e9..eee4b4ec8015d40679d90088d5fd1b3fd7095a6c 100644 (file)
@@ -140,12 +140,29 @@ if test "$PHP_OCI8" != "no"; then
 
   if test "$oci8_php_version" -lt "4003009"; then
     AC_MSG_ERROR([You need at least PHP 4.3.9 to be able to use this version of OCI8. PHP $php_version found])
-  elif test "$oci8_php_version" -ge "6000000"; then
-    AC_MSG_ERROR([This version of OCI8 is not compatible with PHP 6 or higher])
   else
     AC_MSG_RESULT([$php_version, ok])
   fi
 
+  dnl conditionally define PHP_INIT_DTRACE. 
+  dnl This prevents 'configure' failing for PECL installs on older PHP versions.
+  dnl Note DTrace support can't be enabled on older PHP versions.
+ AC_PROVIDE_IFELSE([PHP_INIT_DTRACE], [], [AC_DEFUN([PHP_INIT_DTRACE], )])
+
+  if test "$PHP_DTRACE" = "yes"; then
+    if test "$oci8_php_version" -lt "5004000"; then
+      AC_MSG_ERROR([You need at least PHP 5.4 to be able to use DTrace with PHP OCI8])
+    else
+      AC_CHECK_HEADERS([sys/sdt.h], [
+        PHP_INIT_DTRACE([ext/oci8/oci8_dtrace.d],[ext/oci8/oci8_dtrace_gen.h],[ext/oci8/oci8.c \
+                       ext/oci8/oci8_interface.c ext/oci8/oci8_collection.c ext/oci8/oci8_lob.c ext/oci8/oci8_statement.c])
+       ], [
+        AC_MSG_ERROR(
+          [Cannot find sys/sdt.h which is required for DTrace support])
+       ])
+    fi
+  fi
+
   dnl Set some port specific directory components for use later
 
   AC_CHECK_SIZEOF(long int, 4)
index 44bfa713983a99b3e59477f6532e5fb51b6dee94..c3bb49c2df114b542428bab7440f6a8288ad14bc 100644 (file)
 #include "php_oci8_int.h"
 #include "zend_hash.h"
 
-#if defined(HAVE_STDINT_H) || defined(PHP_WIN32)
-#define OCI8_INT_TO_PTR(I)  ((void *)(intptr_t)(I))
+#if defined(__PTRDIFF_TYPE__)
+# define OCI8_INT_TO_PTR(I)  ((void*)(__PTRDIFF_TYPE__)(I))
+# define OCI8_PTR_TO_INT(P)  ((int)(__PTRDIFF_TYPE__)(P))
+#elif !defined(__GNUC__)
+#define OCI8_INT_TO_PTR(I)  ((void*)&((char*)0)[I])
+#define OCI8_PTR_TO_INT(P)  ((int)(((char*)P)-(char*)0))
+#elif defined(HAVE_STDINT_H)
+#define OCI8_INT_TO_PTR(I)  ((void*)(intptr_t)(I))
 #define OCI8_PTR_TO_INT(P)  ((int)(intptr_t)(P))
 #else
-#define OCI8_INT_TO_PTR(I)  ((void *)(I))
+#define OCI8_INT_TO_PTR(I)  ((void*)(I))
 #define OCI8_PTR_TO_INT(P)  ((int)(P))
 #endif
 
@@ -128,7 +134,7 @@ zend_class_entry *oci_coll_class_entry_ptr;
 #define PHP_OCI_INIT_MODE (OCI_DEFAULT | OCI_OBJECT)
 #endif
 
-/* static protos {{{ */
+/* {{{ static protos */
 static void php_oci_connection_list_dtor (zend_rsrc_list_entry * TSRMLS_DC);
 static void php_oci_pconnection_list_dtor (zend_rsrc_list_entry * TSRMLS_DC);
 static void php_oci_pconnection_list_np_dtor (zend_rsrc_list_entry * TSRMLS_DC);
@@ -425,6 +431,10 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_oci_parse, 0, 0, 2)
        ZEND_ARG_INFO(0, sql_text)
 ZEND_END_ARG_INFO()
 
+ZEND_BEGIN_ARG_INFO_EX(arginfo_oci_get_implicit_resultset, 0, 0, 1)
+ZEND_ARG_INFO(0, statement_resource)
+ZEND_END_ARG_INFO()
+
 ZEND_BEGIN_ARG_INFO_EX(arginfo_oci_set_prefetch, 0, 0, 2)
        ZEND_ARG_INFO(0, statement_resource)
        ZEND_ARG_INFO(0, number_of_rows)
@@ -698,6 +708,7 @@ static unsigned char arginfo_oci_bind_array_by_name[] = { 3, BYREF_NONE, BYREF_N
 #define arginfo_oci_error                                                              NULL
 #define arginfo_oci_num_fields                                                 NULL
 #define arginfo_oci_parse                                                              NULL
+#define arginfo_oci_get_implicit_resultset                             NULL
 #define arginfo_oci_set_prefetch                                               NULL
 #define arginfo_oci_set_client_identifier                              NULL
 #define arginfo_oci_set_edition                                                        NULL
@@ -786,6 +797,7 @@ PHP_FUNCTION(oci_rollback);
 PHP_FUNCTION(oci_new_descriptor);
 PHP_FUNCTION(oci_num_fields);
 PHP_FUNCTION(oci_parse);
+PHP_FUNCTION(oci_get_implicit_resultset);
 PHP_FUNCTION(oci_new_cursor);
 PHP_FUNCTION(oci_result);
 PHP_FUNCTION(oci_client_version);
@@ -862,6 +874,7 @@ zend_function_entry php_oci_functions[] = {
        PHP_FE(oci_internal_debug,                      arginfo_oci_internal_debug)
        PHP_FE(oci_num_fields,                          arginfo_oci_num_fields)
        PHP_FE(oci_parse,                                       arginfo_oci_parse)
+       PHP_FE(oci_get_implicit_resultset,      arginfo_oci_get_implicit_resultset)
        PHP_FE(oci_new_cursor,                          arginfo_oci_new_cursor)
        PHP_FE(oci_result,                                      arginfo_oci_result)
        PHP_FE(oci_client_version,                      arginfo_oci_client_version)
@@ -1055,8 +1068,12 @@ PHP_INI_BEGIN()
        STD_PHP_INI_ENTRY(      "oci8.statement_cache_size",    "20",   PHP_INI_SYSTEM, ONUPDATELONGFUNC,       statement_cache_size,   zend_oci_globals,       oci_globals)
        STD_PHP_INI_ENTRY(      "oci8.default_prefetch",                "100",  PHP_INI_SYSTEM, ONUPDATELONGFUNC,       default_prefetch,               zend_oci_globals,       oci_globals)
        STD_PHP_INI_BOOLEAN("oci8.old_oci_close_semantics",     "0",    PHP_INI_SYSTEM, OnUpdateBool,           old_oci_close_semantics,zend_oci_globals,       oci_globals)
+#if (OCI_MAJOR_VERSION >= 11)
        STD_PHP_INI_ENTRY(      "oci8.connection_class",                "",             PHP_INI_ALL,    OnUpdateString,         connection_class,               zend_oci_globals,       oci_globals)
+#endif
+#if ((OCI_MAJOR_VERSION > 10) || ((OCI_MAJOR_VERSION == 10) && (OCI_MINOR_VERSION >= 2)))
        STD_PHP_INI_BOOLEAN("oci8.events",                                      "0",    PHP_INI_SYSTEM, OnUpdateBool,           events,                                 zend_oci_globals,       oci_globals)
+#endif
 PHP_INI_END()
 /* }}} */
 
@@ -1105,10 +1122,10 @@ static void php_oci_init_global_handles(TSRMLS_D)
                 */
                OCICPool *cpoolh;
                ub4 cpoolmode = 0x80000000;     /* Pass invalid mode to OCIConnectionPoolCreate */
-               PHP_OCI_CALL(OCIHandleAlloc, (OCI_G(env), (dvoid **) &cpoolh, OCI_HTYPE_CPOOL, (size_t) 0, (dvoid **) 0));
-               PHP_OCI_CALL(OCIConnectionPoolCreate, (OCI_G(env), OCI_G(err), cpoolh, NULL, 0, NULL, 0, 0, 0, 0, NULL, 0, NULL, 0, cpoolmode));
-               PHP_OCI_CALL(OCIConnectionPoolDestroy, (cpoolh, OCI_G(err), OCI_DEFAULT));
-               PHP_OCI_CALL(OCIHandleFree, (cpoolh, OCI_HTYPE_CPOOL));
+               PHP_OCI_CALL(OCIHANDLEALLOC, OCIHandleAlloc, (OCI_G(env), (dvoid **) &cpoolh, OCI_HTYPE_CPOOL, (size_t) 0, (dvoid **) 0));
+               PHP_OCI_CALL(OCICONNECTIONPOOLCREATE, OCIConnectionPoolCreate, (OCI_G(env), OCI_G(err), cpoolh, NULL, 0, NULL, 0, 0, 0, 0, NULL, 0, NULL, 0, cpoolmode));
+               PHP_OCI_CALL(OCICONNECTIONPOOLDESTROY, OCIConnectionPoolDestroy, (cpoolh, OCI_G(err), OCI_DEFAULT));
+               PHP_OCI_CALL(OCIHANDLEFREE, OCIHandleFree, (cpoolh, OCI_HTYPE_CPOOL));
 #endif
        } else {
                OCIErrorGet(OCI_G(env), (ub4)1, NULL, &ora_error_code, tmp_buf, (ub4)OCI_ERROR_MAXMSG_SIZE, (ub4)OCI_HTYPE_ERROR);
@@ -1132,7 +1149,8 @@ static void php_oci_init_global_handles(TSRMLS_D)
                        }
                }
        }
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_cleanup_global_handles()
  *
@@ -1141,15 +1159,16 @@ static void php_oci_init_global_handles(TSRMLS_D)
 static void php_oci_cleanup_global_handles(TSRMLS_D)
 {
        if (OCI_G(err)) {
-               PHP_OCI_CALL(OCIHandleFree, ((dvoid *) OCI_G(err), OCI_HTYPE_ERROR));
+               PHP_OCI_CALL(OCIHANDLEFREE, OCIHandleFree, ((dvoid *) OCI_G(err), OCI_HTYPE_ERROR));
                OCI_G(err) = NULL;
        }
 
        if (OCI_G(env)) {
-               PHP_OCI_CALL(OCIHandleFree, ((dvoid *) OCI_G(env), OCI_HTYPE_ENV));
+               PHP_OCI_CALL(OCIHANDLEFREE, OCIHandleFree, ((dvoid *) OCI_G(env), OCI_HTYPE_ENV));
                OCI_G(env) = NULL;
        }
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ PHP_GINIT_FUNCTION
  *
@@ -1336,18 +1355,15 @@ PHP_RSHUTDOWN_FUNCTION(oci)
 PHP_MINFO_FUNCTION(oci)
 {
        char buf[32];
+#if ((OCI_MAJOR_VERSION > 10) || ((OCI_MAJOR_VERSION == 10) && (OCI_MINOR_VERSION >= 2)))
        char *ver;
+#endif
 
        php_info_print_table_start();
        php_info_print_table_row(2, "OCI8 Support", "enabled");
-       php_info_print_table_row(2, "Version", PHP_OCI8_VERSION);
+       php_info_print_table_row(2, "OCI8 Version", PHP_OCI8_VERSION);
        php_info_print_table_row(2, "Revision", "$Id$");
 
-       snprintf(buf, sizeof(buf), "%ld", OCI_G(num_persistent));
-       php_info_print_table_row(2, "Active Persistent Connections", buf);
-       snprintf(buf, sizeof(buf), "%ld", OCI_G(num_links));
-       php_info_print_table_row(2, "Active Connections", buf);
-
 #if ((OCI_MAJOR_VERSION > 10) || ((OCI_MAJOR_VERSION == 10) && (OCI_MINOR_VERSION >= 2)))
        php_oci_client_get_version(&ver TSRMLS_CC);
        php_info_print_table_row(2, "Oracle Run-time Client Library Version", ver);
@@ -1361,9 +1377,9 @@ PHP_MINFO_FUNCTION(oci)
        snprintf(buf, sizeof(buf), "Unknown");
 #endif
 #if defined(HAVE_OCI_INSTANT_CLIENT)
-       php_info_print_table_row(2, "Oracle Instant Client Version", buf);
+       php_info_print_table_row(2, "Oracle Compile-time Instant Client Version", buf);
 #else
-       php_info_print_table_row(2, "Oracle Version", buf);
+       php_info_print_table_row(2, "Oracle Compile-time Version", buf);
 #endif
 
 #if !defined(PHP_WIN32) && !defined(HAVE_OCI_INSTANT_CLIENT)
@@ -1375,14 +1391,21 @@ PHP_MINFO_FUNCTION(oci)
 #endif
 #endif
 
-       php_info_print_table_row(2, "Temporary Lob support", "enabled");
-       php_info_print_table_row(2, "Collections support", "enabled");
        php_info_print_table_end();
+
        DISPLAY_INI_ENTRIES();
+
+       php_info_print_table_start();
+       php_info_print_table_header(2, "Statistics", "");
+       snprintf(buf, sizeof(buf), "%ld", OCI_G(num_persistent));
+       php_info_print_table_row(2, "Active Persistent Connections", buf);
+       snprintf(buf, sizeof(buf), "%ld", OCI_G(num_links));
+       php_info_print_table_row(2, "Active Connections", buf);
+       php_info_print_table_end();
 }
 /* }}} */
 
-/* list destructors {{{ */
+/* {{{ list destructors */
 
 /* {{{ php_oci_connection_list_dtor()
  *
@@ -1396,7 +1419,8 @@ static void php_oci_connection_list_dtor(zend_rsrc_list_entry *entry TSRMLS_DC)
                php_oci_connection_close(connection TSRMLS_CC);
                OCI_G(num_links)--;
        }
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_pconnection_list_dtor()
  *
@@ -1411,7 +1435,8 @@ static void php_oci_pconnection_list_dtor(zend_rsrc_list_entry *entry TSRMLS_DC)
                OCI_G(num_persistent)--;
                OCI_G(num_links)--;
        }
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_pconnection_list_np_dtor()
  *
@@ -1449,11 +1474,12 @@ static void php_oci_pconnection_list_np_dtor(zend_rsrc_list_entry *entry TSRMLS_
                        OCI_G(num_persistent)--;
                }
 
-               if (OCI_G(debug_mode)) {
-                       php_printf ("OCI8 DEBUG L1: np_dtor cleaning up: (%p) at (%s:%d) \n", connection, __FILE__, __LINE__);
+#ifdef HAVE_DTRACE
+               if (DTRACE_OCI8_CONNECT_P_DTOR_CLOSE_ENABLED()) {
+                       DTRACE_OCI8_CONNECT_P_DTOR_CLOSE(connection);
                }
-       }
-       else {
+#endif /* HAVE_DTRACE */
+       else {
                /*
                 * Release the connection to underlying pool.  We do this unconditionally so that
                 * out-of-scope pconnects are now consistent with oci_close and out-of-scope new connect
@@ -1465,11 +1491,14 @@ static void php_oci_pconnection_list_np_dtor(zend_rsrc_list_entry *entry TSRMLS_
                 */
                php_oci_connection_release(connection TSRMLS_CC);
 
-               if (OCI_G(debug_mode)) {
-                       php_printf ("OCI8 DEBUG L1: np_dtor releasing: (%p) at (%s:%d) \n", connection, __FILE__, __LINE__);
+#ifdef HAVE_DTRACE
+               if (DTRACE_OCI8_CONNECT_P_DTOR_RELEASE_ENABLED()) {
+                       DTRACE_OCI8_CONNECT_P_DTOR_RELEASE(connection);
                }
+#endif /* HAVE_DTRACE */
        }
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_statement_list_dtor()
  *
@@ -1479,7 +1508,8 @@ static void php_oci_statement_list_dtor(zend_rsrc_list_entry *entry TSRMLS_DC)
 {
        php_oci_statement *statement = (php_oci_statement *)entry->ptr;
        php_oci_statement_free(statement TSRMLS_CC);
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_descriptor_list_dtor()
  *
@@ -1489,7 +1519,8 @@ static void php_oci_descriptor_list_dtor(zend_rsrc_list_entry *entry TSRMLS_DC)
 {
        php_oci_descriptor *descriptor = (php_oci_descriptor *)entry->ptr;
        php_oci_lob_free(descriptor TSRMLS_CC);
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_collection_list_dtor()
  *
@@ -1499,11 +1530,12 @@ static void php_oci_collection_list_dtor(zend_rsrc_list_entry *entry TSRMLS_DC)
 {
        php_oci_collection *collection = (php_oci_collection *)entry->ptr;
        php_oci_collection_close(collection TSRMLS_CC);
-} /* }}} */
+}
+/* }}} */
 
 /* }}} */
 
-/* Hash Destructors {{{ */
+/* {{{ Hash Destructors */
 
 /* {{{ php_oci_define_hash_dtor()
  *
@@ -1605,7 +1637,6 @@ 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
@@ -1662,6 +1693,13 @@ sb4 php_oci_error(OCIError *err_p, sword status TSRMLS_DC)
                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown OCI error code: %d", status);
                        break;
        }
+
+#ifdef HAVE_DTRACE
+       if (DTRACE_OCI8_ERROR_ENABLED()) {
+               DTRACE_OCI8_ERROR(status, errcode);
+       }
+#endif /* HAVE_DTRACE */
+
        return errcode;
 }
 /* }}} */
@@ -1676,7 +1714,7 @@ sb4 php_oci_fetch_errmsg(OCIError *error_handle, text **error_buf TSRMLS_DC)
        text err_buf[PHP_OCI_ERRBUF_LEN];
 
        memset(err_buf, 0, sizeof(err_buf));
-       PHP_OCI_CALL(OCIErrorGet, (error_handle, (ub4)1, NULL, &error_code, err_buf, (ub4)PHP_OCI_ERRBUF_LEN, (ub4)OCI_HTYPE_ERROR));
+       PHP_OCI_CALL(OCIERRORGET, OCIErrorGet, (error_handle, (ub4)1, NULL, &error_code, err_buf, (ub4)PHP_OCI_ERRBUF_LEN, (ub4)OCI_HTYPE_ERROR));
 
        if (error_code) {
                int err_buf_len = strlen((char *)err_buf);
@@ -1690,7 +1728,8 @@ sb4 php_oci_fetch_errmsg(OCIError *error_handle, text **error_buf TSRMLS_DC)
                }
        }
        return error_code;
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_fetch_sqltext_offset()
  *
@@ -1702,7 +1741,7 @@ int php_oci_fetch_sqltext_offset(php_oci_statement *statement, text **sqltext, u
 
        *sqltext = NULL;
        *error_offset = 0;
-       PHP_OCI_CALL_RETURN(errstatus, OCIAttrGet, ((dvoid *)statement->stmt, OCI_HTYPE_STMT, (dvoid *) sqltext, (ub4 *)0, OCI_ATTR_STATEMENT, statement->err));
+       PHP_OCI_CALL_RETURN(OCIATTRGET, errstatus, OCIAttrGet, ((dvoid *)statement->stmt, OCI_HTYPE_STMT, (dvoid *) sqltext, (ub4 *)0, OCI_ATTR_STATEMENT, statement->err));
 
        if (errstatus != OCI_SUCCESS) {
                statement->errcode = php_oci_error(statement->err, errstatus TSRMLS_CC);
@@ -1710,7 +1749,7 @@ int php_oci_fetch_sqltext_offset(php_oci_statement *statement, text **sqltext, u
                return 1;
        }
 
-       PHP_OCI_CALL_RETURN(errstatus, OCIAttrGet, ((dvoid *)statement->stmt, OCI_HTYPE_STMT, (ub2 *)error_offset, (ub4 *)0, OCI_ATTR_PARSE_ERROR_OFFSET, statement->err));
+       PHP_OCI_CALL_RETURN(OCIATTRGET, errstatus, OCIAttrGet, ((dvoid *)statement->stmt, OCI_HTYPE_STMT, (ub2 *)error_offset, (ub4 *)0, OCI_ATTR_PARSE_ERROR_OFFSET, statement->err));
 
        if (errstatus != OCI_SUCCESS) {
                statement->errcode = php_oci_error(statement->err, errstatus TSRMLS_CC);
@@ -1718,7 +1757,8 @@ int php_oci_fetch_sqltext_offset(php_oci_statement *statement, text **sqltext, u
                return 1;
        }
        return 0;
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_do_connect()
  *
@@ -1738,18 +1778,32 @@ void php_oci_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent, int exclus
                return;
        }
 
+#ifdef HAVE_DTRACE
+       if (DTRACE_OCI8_CONNECT_START_ENABLED()) {
+               DTRACE_OCI8_CONNECT_START(username, dbname, charset, session_mode, persistent, exclusive);
+       }
+#endif /* HAVE_DTRACE */
+
        if (!charset_len) {
                charset = NULL;
        }
 
        connection = php_oci_do_connect_ex(username, username_len, password, password_len, NULL, 0, dbname, dbname_len, charset, session_mode, persistent, exclusive TSRMLS_CC);
 
+#ifdef HAVE_DTRACE
+       if (DTRACE_OCI8_CONNECT_DONE_ENABLED()) {
+               DTRACE_OCI8_CONNECT_DONE();
+       }
+#endif /* HAVE_DTRACE */
+
+
        if (!connection) {
                RETURN_FALSE;
        }
-       RETURN_RESOURCE(connection->rsrc_id);
+       RETURN_RESOURCE(connection->id);
 
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_do_connect_ex()
  *
@@ -1857,7 +1911,7 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char
        smart_str_appendl_ex(&hashed_details, "**", sizeof("**") - 1, 0);
 
        if (charset && *charset) {
-               PHP_OCI_CALL_RETURN(charsetid, OCINlsCharSetNameToId, (OCI_G(env), (CONST oratext *)charset));
+               PHP_OCI_CALL_RETURN(OCINLSCHARSETNAMETOID, charsetid, OCINlsCharSetNameToId, (OCI_G(env), (CONST oratext *)charset));
                if (!charsetid) {
                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid character set name: %s", charset);
                } else {
@@ -1870,7 +1924,7 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char
                size_t rsize = 0;
                sword result;
 
-               PHP_OCI_CALL_RETURN(result, OCINlsEnvironmentVariableGet, (&charsetid_nls_lang, 0, OCI_NLS_CHARSET_ID, 0, &rsize));
+               PHP_OCI_CALL_RETURN(OCINLSENVIRONMENTVARIABLEGET, result, OCINlsEnvironmentVariableGet, (&charsetid_nls_lang, 0, OCI_NLS_CHARSET_ID, 0, &rsize));
                if (result != OCI_SUCCESS) {
                        charsetid_nls_lang = 0;
                }
@@ -1908,16 +1962,11 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char
                        }
                }
 
-               /* Debug statements {{{ */
-               if (OCI_G(debug_mode)) {
-                       if (connection && connection->is_stub) {
-                               php_printf ("OCI8 DEBUG L1: Got a cached stub: (%p) at (%s:%d) \n", connection, __FILE__, __LINE__);
-                       } else if (connection) {
-                               php_printf ("OCI8 DEBUG L1: Got a cached connection: (%p) at (%s:%d) \n", connection, __FILE__, __LINE__);
-                       } else {
-                               php_printf ("OCI8 DEBUG L1: Got NO cached connection at (%s:%d) \n", __FILE__, __LINE__);
-                       }
-               } /* }}} */
+#ifdef HAVE_DTRACE
+               if (DTRACE_OCI8_CONNECT_LOOKUP_ENABLED()) {
+                       DTRACE_OCI8_CONNECT_LOOKUP(connection, connection && connection->is_stub ? 1 : 0);
+               }
+#endif /* HAVE_DTRACE */
 
                /* If we got a pconnection stub, then 'load'(OCISessionGet) the real connection from its
                 * private spool A connection is a stub if it is only a cached structure and the real
@@ -1963,24 +2012,20 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char
 
                                                        /* okay, the connection is open and the server is still alive */
                                                        connection->used_this_request = 1;
-                                                       tmp = (php_oci_connection *)zend_list_find(connection->rsrc_id, &rsrc_type);
+                                                       tmp = (php_oci_connection *)zend_list_find(connection->id, &rsrc_type);
 
                                                        if (tmp != NULL && rsrc_type == le_pconnection && strlen(tmp->hash_key) == hashed_details.len &&
-                                                               memcmp(tmp->hash_key, hashed_details.c, hashed_details.len) == 0 && zend_list_addref(connection->rsrc_id) == SUCCESS) {
+                                                               memcmp(tmp->hash_key, hashed_details.c, hashed_details.len) == 0 && zend_list_addref(connection->id) == SUCCESS) {
                                                                /* do nothing */
                                                        } else {
-#if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 3) || (PHP_MAJOR_VERSION > 5)
-                                                               connection->rsrc_id = zend_list_insert(connection, le_pconnection TSRMLS_CC);
-#else
-                                                               connection->rsrc_id = zend_list_insert(connection, le_pconnection);
-#endif
+                                                               PHP_OCI_REGISTER_RESOURCE(connection, le_pconnection);
                                                                /* Persistent connections: For old close semantics we artificially
                                                                 * bump up the refcount to prevent the non-persistent destructor
                                                                 * from getting called until request shutdown. The refcount is
                                                                 * decremented in the persistent helper
                                                                 */
                                                                if (OCI_G(old_oci_close_semantics)) {
-                                                                       zend_list_addref(connection->rsrc_id);
+                                                                       zend_list_addref(connection->id);
                                                                }
                                                        }
                                                        smart_str_free_ex(&hashed_details, 0);
@@ -1991,7 +2036,7 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char
                                } else {
                                        /* we do not ping non-persistent connections */
                                        smart_str_free_ex(&hashed_details, 0);
-                                       zend_list_addref(connection->rsrc_id);
+                                       zend_list_addref(connection->id);
                                        return connection;
                                }
                        } /* is_open is true? */
@@ -2008,7 +2053,7 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char
                                /* We have to do a hash_del but need to preserve the resource if there is a positive
                                 * refcount. Set the data pointer in the list entry to NULL
                                 */
-                               if (connection == zend_list_find(connection->rsrc_id, &rsrc_type) && rsrc_type == le_pconnection) {
+                               if (connection == zend_list_find(connection->id, &rsrc_type) && rsrc_type == le_pconnection) {
                                        le->ptr = NULL;
                                }
 
@@ -2085,7 +2130,8 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char
                        smart_str_free_ex(&hashed_details, 0);
                        return NULL;
                }
-       } /* }}} */
+       }
+       /* }}} */
 
        connection->idle_expiry = (OCI_G(persistent_timeout) > 0) ? (timestamp + OCI_G(persistent_timeout)) : 0;
 
@@ -2124,50 +2170,34 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char
                new_le.ptr = connection;
                new_le.type = le_pconnection;
                connection->used_this_request = 1;
-#if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 3) || (PHP_MAJOR_VERSION > 5)
-               connection->rsrc_id = zend_list_insert(connection, le_pconnection TSRMLS_CC);
-#else
-               connection->rsrc_id = zend_list_insert(connection, le_pconnection);
-#endif
+               PHP_OCI_REGISTER_RESOURCE(connection, le_pconnection);
 
                /* Persistent connections: For old close semantics we artificially bump up the refcount to
                 * prevent the non-persistent destructor from getting called until request shutdown. The
                 * refcount is decremented in the persistent helper
                 */
                if (OCI_G(old_oci_close_semantics)) {
-                       zend_list_addref(connection->rsrc_id);
+                       zend_list_addref(connection->id);
                }
                zend_hash_update(&EG(persistent_list), connection->hash_key, strlen(connection->hash_key)+1, (void *)&new_le, sizeof(zend_rsrc_list_entry), NULL);
                OCI_G(num_persistent)++;
                OCI_G(num_links)++;
        } else if (!exclusive) {
-#if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 3) || (PHP_MAJOR_VERSION > 5)
-               connection->rsrc_id = zend_list_insert(connection, le_connection TSRMLS_CC);
-#else
-               connection->rsrc_id = zend_list_insert(connection, le_connection);
-#endif
-               new_le.ptr = OCI8_INT_TO_PTR(connection->rsrc_id);
+               PHP_OCI_REGISTER_RESOURCE(connection, le_connection);
+               new_le.ptr = OCI8_INT_TO_PTR(connection->id);
                new_le.type = le_index_ptr;
                zend_hash_update(&EG(regular_list), connection->hash_key, strlen(connection->hash_key)+1, (void *)&new_le, sizeof(zend_rsrc_list_entry), NULL);
                OCI_G(num_links)++;
        } else {
-#if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 3) || (PHP_MAJOR_VERSION > 5)
-               connection->rsrc_id = zend_list_insert(connection, le_connection TSRMLS_CC);
-#else
-               connection->rsrc_id = zend_list_insert(connection, le_connection);
-#endif
+               PHP_OCI_REGISTER_RESOURCE(connection, le_connection);
                OCI_G(num_links)++;
        }
 
-       /* Debug statements {{{ */
-       if (OCI_G(debug_mode)) {
-               if (connection->is_persistent) {
-                       php_printf ("OCI8 DEBUG L1: New Persistent Connection address: (%p) at (%s:%d) \n", connection, __FILE__, __LINE__);
-               } else {
-                       php_printf ("OCI8 DEBUG L1: New Non-Persistent Connection address: (%p) at (%s:%d) \n", connection, __FILE__, __LINE__);
-               }
-               php_printf ("OCI8 DEBUG L1: num_persistent=(%ld), num_links=(%ld) at (%s:%d) \n", OCI_G(num_persistent), OCI_G(num_links), __FILE__, __LINE__);
-       } /* }}} */
+#ifdef HAVE_DTRACE
+       if (DTRACE_OCI8_CONNECT_TYPE_ENABLED()) {
+               DTRACE_OCI8_CONNECT_TYPE(connection->is_persistent ? 1 : 0, exclusive ? 1 : 0, connection, OCI_G(num_persistent), OCI_G(num_links));
+       }
+#endif /* HAVE_DTRACE */
 
        return connection;
 }
@@ -2185,11 +2215,11 @@ static int php_oci_connection_ping(php_oci_connection *connection TSRMLS_DC)
         * Pre-10.2 clients
         */
 #if ((OCI_MAJOR_VERSION > 10) || ((OCI_MAJOR_VERSION == 10) && (OCI_MINOR_VERSION >= 2)))      /* OCIPing available 10.2 onwards */
-       PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIPing, (connection->svc, OCI_G(err), OCI_DEFAULT));
+       PHP_OCI_CALL_RETURN(OCIPING, OCI_G(errcode), OCIPing, (connection->svc, OCI_G(err), OCI_DEFAULT));
 #else
        char version[256];
        /* use good old OCIServerVersion() */
-       PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIServerVersion, (connection->svc, OCI_G(err), (text *)version, sizeof(version), OCI_HTYPE_SVCCTX));
+       PHP_OCI_CALL_RETURN(OCISERVERVERSION, OCI_G(errcode), OCIServerVersion, (connection->svc, OCI_G(err), (text *)version, sizeof(version), OCI_HTYPE_SVCCTX));
 #endif
 
        if (OCI_G(errcode) == OCI_SUCCESS) {
@@ -2220,7 +2250,7 @@ static int php_oci_connection_status(php_oci_connection *connection TSRMLS_DC)
        ub4 ss = 0;
 
        /* get OCI_ATTR_SERVER_STATUS */
-       PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrGet, ((dvoid *)connection->server, OCI_HTYPE_SERVER, (dvoid *)&ss, (ub4 *)0, OCI_ATTR_SERVER_STATUS, OCI_G(err)));
+       PHP_OCI_CALL_RETURN(OCIATTRGET, OCI_G(errcode), OCIAttrGet, ((dvoid *)connection->server, OCI_HTYPE_SERVER, (dvoid *)&ss, (ub4 *)0, OCI_ATTR_SERVER_STATUS, OCI_G(err)));
 
        if (OCI_G(errcode) == OCI_SUCCESS && ss == OCI_SERVER_NORMAL) {
                return 1;
@@ -2238,8 +2268,8 @@ static int php_oci_connection_status(php_oci_connection *connection TSRMLS_DC)
  */
 int php_oci_connection_rollback(php_oci_connection *connection TSRMLS_DC)
 {
-       PHP_OCI_CALL_RETURN(connection->errcode, OCITransRollback, (connection->svc, connection->err, (ub4) 0));
-       connection->needs_commit = 0;
+       PHP_OCI_CALL_RETURN(OCITRANSROLLBACK, connection->errcode, OCITransRollback, (connection->svc, connection->err, (ub4) 0));
+       connection->rb_on_disconnect = 0;
 
        if (connection->errcode != OCI_SUCCESS) {
                connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
@@ -2247,7 +2277,8 @@ int php_oci_connection_rollback(php_oci_connection *connection TSRMLS_DC)
                return 1;
        }
        return 0;
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_connection_commit()
  *
@@ -2255,8 +2286,8 @@ int php_oci_connection_rollback(php_oci_connection *connection TSRMLS_DC)
  */
 int php_oci_connection_commit(php_oci_connection *connection TSRMLS_DC)
 {
-       PHP_OCI_CALL_RETURN(connection->errcode, OCITransCommit, (connection->svc, connection->err, (ub4) 0));
-       connection->needs_commit = 0;
+       PHP_OCI_CALL_RETURN(OCITRANSCOMMIT, connection->errcode, OCITransCommit, (connection->svc, connection->err, (ub4) 0));
+       connection->rb_on_disconnect = 0;
 
        if (connection->errcode != OCI_SUCCESS) {
                connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
@@ -2264,7 +2295,8 @@ int php_oci_connection_commit(php_oci_connection *connection TSRMLS_DC)
                return 1;
        }
        return 0;
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_connection_close()
  *
@@ -2281,36 +2313,36 @@ static int php_oci_connection_close(php_oci_connection *connection TSRMLS_DC)
        }
 
        if (!connection->using_spool && connection->svc) {
-                       PHP_OCI_CALL(OCISessionEnd, (connection->svc, connection->err, connection->session, (ub4) 0));
+               PHP_OCI_CALL(OCISESSIONEND, OCISessionEnd, (connection->svc, connection->err, connection->session, (ub4) 0));
        }
 
        if (connection->err) {
-               PHP_OCI_CALL(OCIHandleFree, ((dvoid *) connection->err, (ub4) OCI_HTYPE_ERROR));
+               PHP_OCI_CALL(OCIHANDLEFREE, OCIHandleFree, ((dvoid *) connection->err, (ub4) OCI_HTYPE_ERROR));
        }
        if (connection->authinfo) {
-               PHP_OCI_CALL(OCIHandleFree, ((dvoid *) connection->authinfo, (ub4) OCI_HTYPE_AUTHINFO));
+               PHP_OCI_CALL(OCIHANDLEFREE, OCIHandleFree, ((dvoid *) connection->authinfo, (ub4) OCI_HTYPE_AUTHINFO));
        }
 
        /* No Handlefrees for session pool connections */
        if (!connection->using_spool) {
                if (connection->session) {
-                       PHP_OCI_CALL(OCIHandleFree, ((dvoid *) connection->session, OCI_HTYPE_SESSION));
+                       PHP_OCI_CALL(OCIHANDLEFREE, OCIHandleFree, ((dvoid *) connection->session, OCI_HTYPE_SESSION));
                }
 
                if (connection->is_attached) {
-                       PHP_OCI_CALL(OCIServerDetach, (connection->server, OCI_G(err), OCI_DEFAULT));
+                       PHP_OCI_CALL(OCISERVERDETACH, OCIServerDetach, (connection->server, OCI_G(err), OCI_DEFAULT));
                }
 
                if (connection->svc) {
-                       PHP_OCI_CALL(OCIHandleFree, ((dvoid *) connection->svc, (ub4) OCI_HTYPE_SVCCTX));
+                       PHP_OCI_CALL(OCIHANDLEFREE, OCIHandleFree, ((dvoid *) connection->svc,  (ub4) OCI_HTYPE_SVCCTX));
                }
 
                if (connection->server) {
-                       PHP_OCI_CALL(OCIHandleFree, ((dvoid *) connection->server, (ub4) OCI_HTYPE_SERVER));
+                       PHP_OCI_CALL(OCIHANDLEFREE, OCIHandleFree, ((dvoid *) connection->server, (ub4) OCI_HTYPE_SERVER));
                }
 
                if (connection->env) {
-                       PHP_OCI_CALL(OCIHandleFree, ((dvoid *) connection->env, OCI_HTYPE_ENV));
+                       PHP_OCI_CALL(OCIHANDLEFREE, OCIHandleFree, ((dvoid *) connection->env, OCI_HTYPE_ENV));
                }
        } else if (connection->private_spool) {
        /* Keep this as the last member to be freed, as there are dependencies
@@ -2333,7 +2365,8 @@ static int php_oci_connection_close(php_oci_connection *connection TSRMLS_DC)
        connection = NULL;
        OCI_G(in_call) = in_call_save;
        return result;
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_connection_release()
  *
@@ -2357,7 +2390,7 @@ int php_oci_connection_release(php_oci_connection *connection TSRMLS_DC)
 
        if (connection->svc) {
                /* rollback outstanding transactions */
-               if (connection->needs_commit) {
+               if (connection->rb_on_disconnect) {
                        if (php_oci_connection_rollback(connection TSRMLS_CC)) {
                                /* rollback failed */
                                result = 1;
@@ -2398,7 +2431,7 @@ int php_oci_connection_release(php_oci_connection *connection TSRMLS_DC)
 #endif
 
                if (connection->svc) {
-                       PHP_OCI_CALL(OCISessionRelease, (connection->svc, connection->err, NULL,
+                       PHP_OCI_CALL(OCISESSIONRELEASE, OCISessionRelease, (connection->svc, connection->err, NULL,
                                                                                 0, rlsMode));
                }
                /* It no longer has relation with the database session. However authinfo and env are
@@ -2408,7 +2441,7 @@ int php_oci_connection_release(php_oci_connection *connection TSRMLS_DC)
                connection->server = NULL;
                connection->session = NULL;
 
-               connection->is_attached = connection->is_open = connection->needs_commit = connection->used_this_request = 0;
+               connection->is_attached = connection->is_open = connection->rb_on_disconnect = connection->used_this_request = 0;
                connection->is_stub = 1;
 
                /* Cut the link between the connection structure and the time_t structure allocated within
@@ -2419,7 +2452,8 @@ int php_oci_connection_release(php_oci_connection *connection TSRMLS_DC)
 
        OCI_G(in_call) = in_call_save;
        return result;
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_password_change()
  *
@@ -2427,7 +2461,7 @@ int php_oci_connection_release(php_oci_connection *connection TSRMLS_DC)
  */
 int php_oci_password_change(php_oci_connection *connection, char *user, int user_len, char *pass_old, int pass_old_len, char *pass_new, int pass_new_len TSRMLS_DC)
 {
-       PHP_OCI_CALL_RETURN(connection->errcode, OCIPasswordChange, (connection->svc, connection->err, (text *)user, user_len, (text *)pass_old, pass_old_len, (text *)pass_new, pass_new_len, OCI_DEFAULT));
+       PHP_OCI_CALL_RETURN(OCIPASSWORDCHANGE, connection->errcode, OCIPasswordChange, (connection->svc, connection->err, (text *)user, user_len, (text *)pass_old, pass_old_len, (text *)pass_new, pass_new_len, OCI_DEFAULT));
 
        if (connection->errcode != OCI_SUCCESS) {
                connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
@@ -2436,8 +2470,8 @@ int php_oci_password_change(php_oci_connection *connection, char *user, int user
        }
        connection->passwd_changed = 1;
        return 0;
-} /* }}} */
-
+}
+/* }}} */
 
 /* {{{ php_oci_client_get_version()
  *
@@ -2446,21 +2480,21 @@ int php_oci_password_change(php_oci_connection *connection, char *user, int user
 void php_oci_client_get_version(char **version TSRMLS_DC)
 {
        char  version_buff[256];
+#if ((OCI_MAJOR_VERSION > 10) || ((OCI_MAJOR_VERSION == 10) && (OCI_MINOR_VERSION >= 2)))      /* OCIClientVersion only available 10.2 onwards */
        sword major_version = 0;
        sword minor_version = 0; 
        sword update_num = 0;
        sword patch_num = 0;
        sword port_update_num = 0;
 
-#if ((OCI_MAJOR_VERSION > 10) || ((OCI_MAJOR_VERSION == 10) && (OCI_MINOR_VERSION >= 2)))      /* OCIClientVersion only available 10.2 onwards */
-       PHP_OCI_CALL(OCIClientVersion, (&major_version, &minor_version, &update_num, &patch_num, &port_update_num));
+       PHP_OCI_CALL(OCICLIENTVERSION, OCIClientVersion, (&major_version, &minor_version, &update_num, &patch_num, &port_update_num));
        snprintf(version_buff, sizeof(version_buff), "%d.%d.%d.%d.%d", major_version, minor_version, update_num, patch_num, port_update_num);
 #else
        memcpy(version_buff, "Unknown", sizeof("Unknown"));
 #endif
        *version = estrdup(version_buff);
-} /* }}} */
-
+}
+/* }}} */
 
 /* {{{ php_oci_server_get_version()
  *
@@ -2470,7 +2504,7 @@ int php_oci_server_get_version(php_oci_connection *connection, char **version TS
 {
        char version_buff[256];
 
-       PHP_OCI_CALL_RETURN(connection->errcode, OCIServerVersion, (connection->svc, connection->err, (text *)version_buff, sizeof(version_buff), OCI_HTYPE_SVCCTX));
+       PHP_OCI_CALL_RETURN(OCISERVERVERSION, connection->errcode, OCIServerVersion, (connection->svc, connection->err, (text *)version_buff, sizeof(version_buff), OCI_HTYPE_SVCCTX));
 
        if (connection->errcode != OCI_SUCCESS) {
                connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
@@ -2480,7 +2514,8 @@ int php_oci_server_get_version(php_oci_connection *connection, char **version TS
 
        *version = estrdup(version_buff);
        return 0;
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_column_to_zval()
  *
@@ -2564,14 +2599,19 @@ int php_oci_column_to_zval(php_oci_out_column *column, zval *value, int mode TSR
 }
 /* }}} */
 
+
 /* {{{ php_oci_fetch_row()
  *
  * Fetch the next row from the given statement
+ * Has logic for Oracle 12c Implicit Result Sets
  */
 void php_oci_fetch_row (INTERNAL_FUNCTION_PARAMETERS, int mode, int expected_args)
 {
        zval *z_statement, *array;
-       php_oci_statement *statement;
+       php_oci_statement *statement;             /* statement that will be fetched from */
+#if (OCI_MAJOR_VERSION >= 12)
+       php_oci_statement *invokedstatement;  /* statement this function was invoked with */
+#endif /* OCI_MAJOR_VERSION */
        php_oci_out_column *column;
        ub4 nrows = 1;
        int i;
@@ -2617,11 +2657,65 @@ void php_oci_fetch_row (INTERNAL_FUNCTION_PARAMETERS, int mode, int expected_arg
                }
        }
 
+#if (OCI_MAJOR_VERSION < 12)
        PHP_OCI_ZVAL_TO_STATEMENT(z_statement, statement);
 
        if (php_oci_statement_fetch(statement, nrows TSRMLS_CC)) {
-               RETURN_FALSE;
+               RETURN_FALSE;                   /* end of fetch */
        }
+#else /* OCI_MAJOR_VERSION */
+       PHP_OCI_ZVAL_TO_STATEMENT(z_statement, invokedstatement);
+
+       if (invokedstatement->impres_flag == PHP_OCI_IMPRES_NO_CHILDREN) {
+               /* Already know there are no Implicit Result Sets */
+           statement = invokedstatement; 
+       } else if (invokedstatement->impres_flag == PHP_OCI_IMPRES_HAS_CHILDREN) {
+               /* Previously saw an Implicit Result Set in an earlier invocation of php_oci_fetch_row */
+               statement = (php_oci_statement *)invokedstatement->impres_child_stmt;
+       } else {
+               sword errstatus;
+               
+               /* Check for an Implicit Result Set on this statement handle */
+               PHP_OCI_CALL_RETURN(OCIATTRGET, errstatus, OCIAttrGet, ((dvoid *)invokedstatement->stmt, OCI_HTYPE_STMT, 
+                                                   (dvoid *) &invokedstatement->impres_count, 
+                                                   (ub4 *)NULL, OCI_ATTR_IMPLICIT_RESULT_COUNT, invokedstatement->err));
+               if (errstatus) {
+                       RETURN_FALSE;
+               }
+               if (invokedstatement->impres_count > 0) {
+                       /* Make it so the fetch occurs on the first Implicit Result Set */
+                       statement = php_oci_get_implicit_resultset(invokedstatement);
+                       if (!statement)
+                               RETURN_FALSE;
+                       invokedstatement->impres_count--;
+                       invokedstatement->impres_child_stmt = (struct php_oci_statement *)statement;
+                       invokedstatement->impres_flag = PHP_OCI_IMPRES_HAS_CHILDREN;
+                       php_oci_statement_execute(statement, (ub4)OCI_DEFAULT TSRMLS_CC);
+               } else {
+                       statement = invokedstatement; /* didn't find Implicit Result Sets */
+                       invokedstatement->impres_flag = PHP_OCI_IMPRES_NO_CHILDREN;  /* Don't bother checking again */
+               }
+       }
+
+       if (php_oci_statement_fetch(statement, nrows TSRMLS_CC)) {
+               /* End of fetch */
+               if (invokedstatement->impres_count > 0) {
+                       /* Check next Implicit Result Set */
+               statement = php_oci_get_implicit_resultset(invokedstatement);
+                       if (!statement)
+                               RETURN_FALSE;
+               invokedstatement->impres_count--;
+                       invokedstatement->impres_child_stmt = (struct php_oci_statement *)statement;
+                       php_oci_statement_execute(statement, (ub4)OCI_DEFAULT TSRMLS_CC);
+                       if (php_oci_statement_fetch(statement, nrows TSRMLS_CC)) {
+                               /* End of all fetches */
+                   RETURN_FALSE;
+                       }
+               } else {
+                       RETURN_FALSE;
+               }
+    }
+#endif /* OCI_MAJOR_VERSION */
 
        array_init(return_value);
 
@@ -2688,9 +2782,11 @@ static int php_oci_persistent_helper(zend_rsrc_list_entry *le TSRMLS_DC)
                connection = (php_oci_connection *)le->ptr;
 
                if (!connection->used_this_request && OCI_G(persistent_timeout) != -1) {
-                       if (OCI_G(debug_mode)) {
-                               php_printf ("OCI8 DEBUG L1: persistent_helper processing for timeout: (%p stub=%d) at (%s:%d) \n", connection, connection->is_stub, __FILE__, __LINE__);
+#ifdef HAVE_DTRACE
+                       if (DTRACE_OCI8_CONNECT_EXPIRY_ENABLED()) {
+                               DTRACE_OCI8_CONNECT_EXPIRY(connection, connection->is_stub ? 1 : 0, connection->idle_expiry, timestamp);
                        }
+#endif /* HAVE_DTRACE */
                        if (connection->idle_expiry < timestamp) {
                                /* connection has timed out */
                                return ZEND_HASH_APPLY_REMOVE;
@@ -2698,7 +2794,8 @@ static int php_oci_persistent_helper(zend_rsrc_list_entry *le TSRMLS_DC)
                }
        }
        return ZEND_HASH_APPLY_KEEP;
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_create_spool()
  *
@@ -2734,7 +2831,7 @@ static php_oci_spool *php_oci_create_spool(char *username, int username_len, cha
        }
 
        /* Allocate the pool handle */
-       PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIHandleAlloc, (session_pool->env, (dvoid **) &session_pool->poolh, OCI_HTYPE_SPOOL, (size_t) 0, (dvoid **) 0));
+       PHP_OCI_CALL_RETURN(OCIHANDLEALLOC, OCI_G(errcode), OCIHandleAlloc, (session_pool->env, (dvoid **) &session_pool->poolh, OCI_HTYPE_SPOOL, (size_t) 0, (dvoid **) 0));
 
        if (OCI_G(errcode) != OCI_SUCCESS) {
                php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC);
@@ -2746,7 +2843,7 @@ static php_oci_spool *php_oci_create_spool(char *username, int username_len, cha
         * generic bug which can free up the OCI_G(err) variable before destroying connections. We
         * cannot use this for other roundtrip calls as there is no way the user can access this error
         */
-       PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIHandleAlloc, ((dvoid *) session_pool->env, (dvoid **)&(session_pool->err), (ub4) OCI_HTYPE_ERROR,(size_t) 0, (dvoid **) 0));
+       PHP_OCI_CALL_RETURN(OCIHANDLEALLOC, OCI_G(errcode), OCIHandleAlloc, ((dvoid *) session_pool->env, (dvoid **)&(session_pool->err), (ub4) OCI_HTYPE_ERROR,(size_t) 0, (dvoid **) 0));
 
        if (OCI_G(errcode) != OCI_SUCCESS) {
                php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC);
@@ -2762,49 +2859,53 @@ static php_oci_spool *php_oci_create_spool(char *username, int username_len, cha
 #endif
 
 #if ((OCI_MAJOR_VERSION > 11) || ((OCI_MAJOR_VERSION == 11) && (OCI_MINOR_VERSION >= 2)))
-       /* Allocate auth handle for session pool {{{ */
-       PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIHandleAlloc, (session_pool->env, (dvoid **)&(spoolAuth), OCI_HTYPE_AUTHINFO, 0, NULL));
+       /* {{{ Allocate auth handle for session pool */
+       PHP_OCI_CALL_RETURN(OCIHANDLEALLOC, OCI_G(errcode), OCIHandleAlloc, (session_pool->env, (dvoid **)&(spoolAuth), OCI_HTYPE_AUTHINFO, 0, NULL));
 
        if (OCI_G(errcode) != OCI_SUCCESS) {
                php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC);
                iserror = 1;
                goto exit_create_spool;
-       } /* }}} */
+       }
+       /* }}} */
 
-       /* Set the edition attribute on the auth handle {{{ */
+       /* {{{ Set the edition attribute on the auth handle */
        if (OCI_G(edition)) {
-               PHP_OCI_CALL_RETURN(OCI_G(errcode),OCIAttrSet, ((dvoid *) spoolAuth, (ub4) OCI_HTYPE_AUTHINFO, (dvoid *) OCI_G(edition), (ub4)(strlen(OCI_G(edition))), (ub4)OCI_ATTR_EDITION, OCI_G(err)));
+               PHP_OCI_CALL_RETURN(OCIATTRSET, OCI_G(errcode),OCIAttrSet, ((dvoid *) spoolAuth, (ub4) OCI_HTYPE_AUTHINFO, (dvoid *) OCI_G(edition), (ub4)(strlen(OCI_G(edition))), (ub4)OCI_ATTR_EDITION, OCI_G(err)));
 
                if (OCI_G(errcode) != OCI_SUCCESS) {
                        php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC);
                        iserror = 1;
                        goto exit_create_spool;
                }
-       } /* }}} */
+       }
+       /* }}} */
 
-       /* Set the driver name attribute on the auth handle {{{ */
-       PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrSet, ((dvoid *) spoolAuth, (ub4) OCI_HTYPE_AUTHINFO, (dvoid *) PHP_OCI8_DRIVER_NAME, (ub4) sizeof(PHP_OCI8_DRIVER_NAME)-1, (ub4) OCI_ATTR_DRIVER_NAME, OCI_G(err)));
+       /* {{{ Set the driver name attribute on the auth handle */
+       PHP_OCI_CALL_RETURN(OCIATTRSET, OCI_G(errcode), OCIAttrSet, ((dvoid *) spoolAuth, (ub4) OCI_HTYPE_AUTHINFO, (dvoid *) PHP_OCI8_DRIVER_NAME, (ub4) sizeof(PHP_OCI8_DRIVER_NAME)-1, (ub4) OCI_ATTR_DRIVER_NAME, OCI_G(err)));
 
        if (OCI_G(errcode) != OCI_SUCCESS) {
                php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC);
                iserror = 1;
                goto exit_create_spool;
-       } /* }}} */
+       }
+       /* }}} */
 
-       /* Set the auth handle on the session pool {{{ */
-       PHP_OCI_CALL_RETURN(OCI_G(errcode),OCIAttrSet, ((dvoid *) (session_pool->poolh),(ub4) OCI_HTYPE_SPOOL, (dvoid *) spoolAuth, (ub4)0, (ub4)OCI_ATTR_SPOOL_AUTH, OCI_G(err)));
+       /* {{{ Set the auth handle on the session pool */
+       PHP_OCI_CALL_RETURN(OCIATTRSET, OCI_G(errcode),OCIAttrSet, ((dvoid *) (session_pool->poolh),(ub4) OCI_HTYPE_SPOOL, (dvoid *) spoolAuth, (ub4)0, (ub4)OCI_ATTR_SPOOL_AUTH, OCI_G(err)));
 
        if (OCI_G(errcode) != OCI_SUCCESS) {
                php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC);
                iserror = 1;
                goto exit_create_spool;
-       } /* }}} */
+       }
+       /* }}} */
 #endif
 
        /* Create the homogeneous session pool - We have different session pools for every different
         * username, password, charset and dbname.
         */
-       PHP_OCI_CALL_RETURN(OCI_G(errcode), OCISessionPoolCreate,(session_pool->env, OCI_G(err), session_pool->poolh, (OraText **)&session_pool->poolname, &session_pool->poolname_len, (OraText *)dbname, (ub4)dbname_len, 0, UB4MAXVAL, 1,(OraText *)username, (ub4)username_len, (OraText *)password,(ub4)password_len, poolmode));
+       PHP_OCI_CALL_RETURN(OCISESSIONPOOLCREATE, OCI_G(errcode), OCISessionPoolCreate,(session_pool->env, OCI_G(err), session_pool->poolh, (OraText **)&session_pool->poolname, &session_pool->poolname_len, (OraText *)dbname, (ub4)dbname_len, 0, UB4MAXVAL, 1,(OraText *)username, (ub4)username_len, (OraText *)password,(ub4)password_len, poolmode));
 
        if (OCI_G(errcode) != OCI_SUCCESS) {
                php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC);
@@ -2818,15 +2919,18 @@ exit_create_spool:
        }
 
        if (spoolAuth) {
-               PHP_OCI_CALL(OCIHandleFree, ((dvoid *) spoolAuth, (ub4) OCI_HTYPE_AUTHINFO));
+               PHP_OCI_CALL(OCIHANDLEFREE, OCIHandleFree, ((dvoid *) spoolAuth, (ub4) OCI_HTYPE_AUTHINFO));
        }
 
-       if (OCI_G(debug_mode)) {
-               php_printf ("OCI8 DEBUG L1: create_spool: (%p) at (%s:%d) \n", session_pool, __FILE__, __LINE__);
+#ifdef HAVE_DTRACE
+       if (DTRACE_OCI8_SESSPOOL_CREATE_ENABLED()) {
+               DTRACE_OCI8_SESSPOOL_CREATE(session_pool);
        }
+#endif /* HAVE_DTRACE */
 
        return session_pool;
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_get_spool()
  *
@@ -2841,7 +2945,7 @@ static php_oci_spool *php_oci_get_spool(char *username, int username_len, char *
        zend_rsrc_list_entry *spool_out_le = NULL;
        zend_bool iserror = 0;
 
-       /* Create the spool hash key {{{ */
+       /* {{{ Create the spool hash key */
        smart_str_appendl_ex(&spool_hashed_details, "oci8spool***", sizeof("oci8spool***") - 1, 0);
        smart_str_appendl_ex(&spool_hashed_details, username, username_len, 0);
        smart_str_appendl_ex(&spool_hashed_details, "**", sizeof("**") - 1, 0);
@@ -2880,11 +2984,7 @@ static php_oci_spool *php_oci_get_spool(char *username, int username_len, char *
                }
                spool_le.ptr  = session_pool;
                spool_le.type = le_psessionpool;
-#if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 3) || (PHP_MAJOR_VERSION > 5)
-               zend_list_insert(session_pool, le_psessionpool TSRMLS_CC);
-#else
-               zend_list_insert(session_pool, le_psessionpool);
-#endif
+               PHP_OCI_REGISTER_RESOURCE(session_pool, le_psessionpool);
                zend_hash_update(&EG(persistent_list), session_pool->spool_hash_key, strlen(session_pool->spool_hash_key)+1,(void *)&spool_le, sizeof(zend_rsrc_list_entry),NULL);
        } else if (spool_out_le->type == le_psessionpool &&
                strlen(((php_oci_spool *)(spool_out_le->ptr))->spool_hash_key) == spool_hashed_details.len &&
@@ -2902,7 +3002,8 @@ exit_get_spool:
 
        return session_pool;
 
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_create_env()
  *
@@ -2913,7 +3014,7 @@ static OCIEnv *php_oci_create_env(ub2 charsetid TSRMLS_DC)
        OCIEnv *retenv = NULL;
 
        /* create an environment using the character set id */
-       PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIEnvNlsCreate, (&retenv, OCI_G(events) ? PHP_OCI_INIT_MODE | OCI_EVENTS : PHP_OCI_INIT_MODE, 0, NULL, NULL, NULL, 0, NULL, charsetid, charsetid));
+       PHP_OCI_CALL_RETURN(OCIENVNLSCREATE, OCI_G(errcode), OCIEnvNlsCreate, (&retenv, OCI_G(events) ? PHP_OCI_INIT_MODE | OCI_EVENTS : PHP_OCI_INIT_MODE, 0, NULL, NULL, NULL, 0, NULL, charsetid, charsetid));
 
        if (OCI_G(errcode) != OCI_SUCCESS) {
                sb4   ora_error_code = 0;
@@ -2933,7 +3034,8 @@ static OCIEnv *php_oci_create_env(ub2 charsetid TSRMLS_DC)
                return NULL;
        }
        return retenv;
-}/* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_old_create_session()
  *
@@ -2944,131 +3046,139 @@ static int php_oci_old_create_session(php_oci_connection *connection, char *dbna
 {
        ub4 statement_cache_size = (OCI_G(statement_cache_size) > 0) ? OCI_G(statement_cache_size) : 0;
 
-       if (OCI_G(debug_mode)) {
-               php_printf ("OCI8 DEBUG: Bypassing client-side session pool for session create at (%s:%d) \n", __FILE__, __LINE__);
-       }
-
        /* Create the OCI environment separate for each connection */
        if (!(connection->env = php_oci_create_env(connection->charset TSRMLS_CC))) {
                return 1;
        }
 
-       /* Allocate our server handle {{{ */
-       PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIHandleAlloc, (connection->env, (dvoid **)&(connection->server), OCI_HTYPE_SERVER, 0, NULL));
+       /* {{{ Allocate our server handle */
+       PHP_OCI_CALL_RETURN(OCIHANDLEALLOC, OCI_G(errcode), OCIHandleAlloc, (connection->env, (dvoid **)&(connection->server), OCI_HTYPE_SERVER, 0, NULL));
 
        if (OCI_G(errcode) != OCI_SUCCESS) {
                php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC);
                return 1;
-       } /* }}} */
+       }
+       /* }}} */
 
-       /* Attach to the server {{{ */
-       PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIServerAttach, (connection->server, OCI_G(err), (text *)dbname, dbname_len, (ub4) OCI_DEFAULT));
+       /* {{{ Attach to the server */
+       PHP_OCI_CALL_RETURN(OCISERVERATTACH, OCI_G(errcode), OCIServerAttach, (connection->server, OCI_G(err), (text *)dbname, dbname_len, (ub4) OCI_DEFAULT));
 
        if (OCI_G(errcode) != OCI_SUCCESS) {
                php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC);
                return 1;
-       } /* }}} */
+       }
+       /* }}} */
        connection->is_attached = 1;
 
-       /* Allocate our session handle {{{ */
-       PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIHandleAlloc, (connection->env, (dvoid **)&(connection->session), OCI_HTYPE_SESSION, 0, NULL));
+       /* {{{ Allocate our session handle */
+       PHP_OCI_CALL_RETURN(OCIHANDLEALLOC, OCI_G(errcode), OCIHandleAlloc, (connection->env, (dvoid **)&(connection->session), OCI_HTYPE_SESSION, 0, NULL));
 
        if (OCI_G(errcode) != OCI_SUCCESS) {
                php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC);
                return 1;
-       } /* }}} */
+       }
+       /* }}} */
 
-       /* Allocate our private error-handle {{{ */
-       PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIHandleAlloc, (connection->env, (dvoid **)&(connection->err), OCI_HTYPE_ERROR, 0, NULL));
+       /* {{{ Allocate our private error-handle */
+       PHP_OCI_CALL_RETURN(OCIHANDLEALLOC, OCI_G(errcode), OCIHandleAlloc, (connection->env, (dvoid **)&(connection->err), OCI_HTYPE_ERROR, 0, NULL));
 
        if (OCI_G(errcode) != OCI_SUCCESS) {
                php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC);
                return 1;
-       } /* }}} */
+       }
+       /* }}} */
 
-       /* Allocate our service-context {{{ */
-       PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIHandleAlloc, (connection->env, (dvoid **)&(connection->svc), OCI_HTYPE_SVCCTX, 0, NULL));
+       /* {{{ Allocate our service-context */
+       PHP_OCI_CALL_RETURN(OCIHANDLEALLOC, OCI_G(errcode), OCIHandleAlloc, (connection->env, (dvoid **)&(connection->svc), OCI_HTYPE_SVCCTX, 0, NULL));
 
        if (OCI_G(errcode) != OCI_SUCCESS) {
                php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC);
                return 1;
-       } /* }}} */
+       }
+       /* }}} */
 
-       /* Set the username {{{ */
+       /* {{{ Set the username */
        if (username) {
-               PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->session, (ub4) OCI_HTYPE_SESSION, (dvoid *) username, (ub4) username_len, (ub4) OCI_ATTR_USERNAME, OCI_G(err)));
+               PHP_OCI_CALL_RETURN(OCIATTRSET, OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->session, (ub4) OCI_HTYPE_SESSION, (dvoid *) username, (ub4) username_len, (ub4) OCI_ATTR_USERNAME, OCI_G(err)));
 
                if (OCI_G(errcode) != OCI_SUCCESS) {
                        php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC);
                        return 1;
                }
-       }/* }}} */
+       }
+       /* }}} */
 
-       /* Set the password {{{ */
+       /* {{{ Set the password */
        if (password) {
-               PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->session, (ub4) OCI_HTYPE_SESSION, (dvoid *) password, (ub4) password_len, (ub4) OCI_ATTR_PASSWORD, OCI_G(err)));
+               PHP_OCI_CALL_RETURN(OCIATTRSET, OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->session, (ub4) OCI_HTYPE_SESSION, (dvoid *) password, (ub4) password_len, (ub4) OCI_ATTR_PASSWORD, OCI_G(err)));
 
                if (OCI_G(errcode) != OCI_SUCCESS) {
                        php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC);
                        return 1;
                }
-       }/* }}} */
+       }
+       /* }}} */
 
-       /* Set the edition attribute on the session handle {{{ */
+       /* {{{ Set the edition attribute on the session handle */
 #if ((OCI_MAJOR_VERSION > 11) || ((OCI_MAJOR_VERSION == 11) && (OCI_MINOR_VERSION >= 2)))
        if (OCI_G(edition)) {
-               PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->session, (ub4) OCI_HTYPE_SESSION, (dvoid *) OCI_G(edition), (ub4) (strlen(OCI_G(edition))), (ub4) OCI_ATTR_EDITION, OCI_G(err)));
+               PHP_OCI_CALL_RETURN(OCIATTRSET, OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->session, (ub4) OCI_HTYPE_SESSION, (dvoid *) OCI_G(edition), (ub4) (strlen(OCI_G(edition))), (ub4) OCI_ATTR_EDITION, OCI_G(err)));
 
                if (OCI_G(errcode) != OCI_SUCCESS) {
                        php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC);
                        return 1;
                }
        }
-#endif /* }}} */
+#endif
+/* }}} */
 
-       /* Set the driver name attribute on the session handle {{{ */
+       /* {{{ Set the driver name attribute on the session handle */
 #if (OCI_MAJOR_VERSION >= 11)
-       PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->session, (ub4) OCI_HTYPE_SESSION, (dvoid *) PHP_OCI8_DRIVER_NAME, (ub4) sizeof(PHP_OCI8_DRIVER_NAME)-1, (ub4) OCI_ATTR_DRIVER_NAME, OCI_G(err)));
+       PHP_OCI_CALL_RETURN(OCIATTRSET, OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->session, (ub4) OCI_HTYPE_SESSION, (dvoid *) PHP_OCI8_DRIVER_NAME, (ub4) sizeof(PHP_OCI8_DRIVER_NAME)-1, (ub4) OCI_ATTR_DRIVER_NAME, OCI_G(err)));
 
        if (OCI_G(errcode) != OCI_SUCCESS) {
                php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC);
                return 1;
        }
-#endif /* }}} */
+#endif
+/* }}} */
 
-       /* Set the server handle in the service handle {{{ */
-       PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrSet, (connection->svc, OCI_HTYPE_SVCCTX, connection->server, 0, OCI_ATTR_SERVER, OCI_G(err)));
+       /* {{{ Set the server handle in the service handle */
+       PHP_OCI_CALL_RETURN(OCIATTRSET, OCI_G(errcode), OCIAttrSet, (connection->svc, OCI_HTYPE_SVCCTX, connection->server, 0, OCI_ATTR_SERVER, OCI_G(err)));
 
        if (OCI_G(errcode) != OCI_SUCCESS) {
                php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC);
                return 1;
-       } /* }}} */
+       }
+       /* }}} */
 
-       /* Set the authentication handle in the service handle {{{ */
-       PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrSet, (connection->svc, OCI_HTYPE_SVCCTX, connection->session, 0, OCI_ATTR_SESSION, OCI_G(err)));
+       /* {{{ Set the authentication handle in the service handle */
+       PHP_OCI_CALL_RETURN(OCIATTRSET, OCI_G(errcode), OCIAttrSet, (connection->svc, OCI_HTYPE_SVCCTX, connection->session, 0, OCI_ATTR_SESSION, OCI_G(err)));
 
        if (OCI_G(errcode) != OCI_SUCCESS) {
                php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC);
                return 1;
-       } /* }}} */
+       }
+       /* }}} */
 
        if (new_password) {
-               /* Try to change password if new one was provided {{{ */
-               PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIPasswordChange, (connection->svc, OCI_G(err), (text *)username, username_len, (text *)password, password_len, (text *)new_password, new_password_len, OCI_AUTH));
+               /* {{{ Try to change password if new one was provided */
+               PHP_OCI_CALL_RETURN(OCIPASSWORDCHANGE, OCI_G(errcode), OCIPasswordChange, (connection->svc, OCI_G(err), (text *)username, username_len, (text *)password, password_len, (text *)new_password, new_password_len, OCI_AUTH));
 
                if (OCI_G(errcode) != OCI_SUCCESS) {
                        php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC);
                        return 1;
                }
 
-               PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrGet, ((dvoid *)connection->svc, OCI_HTYPE_SVCCTX, (dvoid *)&(connection->session), (ub4 *)0, OCI_ATTR_SESSION, OCI_G(err)));
+               PHP_OCI_CALL_RETURN(OCIATTRGET, OCI_G(errcode), OCIAttrGet, ((dvoid *)connection->svc, OCI_HTYPE_SVCCTX, (dvoid *)&(connection->session), (ub4 *)0, OCI_ATTR_SESSION, OCI_G(err)));
 
                if (OCI_G(errcode) != OCI_SUCCESS) {
                        php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC);
                        return 1;
-               } /* }}} */
+               }
+               /* }}} */
        } else {
-               /* start the session {{{ */
+               /* {{{ start the session */
                ub4 cred_type = OCI_CRED_RDBMS;
 
                /* Extract the overloaded session_mode parameter into valid Oracle credential and session mode values */
@@ -3079,7 +3189,7 @@ static int php_oci_old_create_session(php_oci_connection *connection, char *dbna
 
                session_mode |= OCI_STMT_CACHE;
 
-               PHP_OCI_CALL_RETURN(OCI_G(errcode), OCISessionBegin, (connection->svc, OCI_G(err), connection->session, (ub4) cred_type, (ub4) session_mode));
+               PHP_OCI_CALL_RETURN(OCISESSIONBEGIN, OCI_G(errcode), OCISessionBegin, (connection->svc, OCI_G(err), connection->session, (ub4) cred_type, (ub4) session_mode));
 
                if (OCI_G(errcode) != OCI_SUCCESS) {
                        php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC);
@@ -3089,7 +3199,8 @@ static int php_oci_old_create_session(php_oci_connection *connection, char *dbna
                        if (OCI_G(errcode) != OCI_SUCCESS_WITH_INFO) {
                                return 1;
                        }
-               } /* }}} */
+               }
+               /* }}} */
        }
 
        /* Brand new connection: Init and update the next_ping in the connection */
@@ -3098,7 +3209,7 @@ static int php_oci_old_create_session(php_oci_connection *connection, char *dbna
                return 1;
        }
 
-       PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->svc, (ub4) OCI_HTYPE_SVCCTX, (ub4 *) &statement_cache_size, 0, (ub4) OCI_ATTR_STMTCACHESIZE, OCI_G(err)));
+       PHP_OCI_CALL_RETURN(OCIATTRSET, OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->svc, (ub4) OCI_HTYPE_SVCCTX, (ub4 *) &statement_cache_size, 0, (ub4) OCI_ATTR_STMTCACHESIZE, OCI_G(err)));
 
        if (OCI_G(errcode) != OCI_SUCCESS) {
                php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC);
@@ -3107,7 +3218,8 @@ static int php_oci_old_create_session(php_oci_connection *connection, char *dbna
 
        /* Successfully created session */
        return 0;
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_create_session()
  *
@@ -3138,20 +3250,18 @@ static int php_oci_create_session(php_oci_connection *connection, php_oci_spool
                connection->using_spool = 1;
        }
 
-       if (OCI_G(debug_mode)) {
-               if (session_pool) {
-                       php_printf ("OCI8 DEBUG L1: using shared pool: (%p) at (%s:%d) \n", session_pool, __FILE__, __LINE__);
-               } else {
-                       php_printf ("OCI8 DEBUG L1: using private pool: (%p) at (%s:%d) \n", connection->private_spool, __FILE__, __LINE__);
-               }
+#ifdef HAVE_DTRACE
+       if (DTRACE_OCI8_SESSPOOL_TYPE_ENABLED()) {
+               DTRACE_OCI8_SESSPOOL_TYPE(session_pool ? 1 : 0, session_pool ? session_pool : connection->private_spool);
        }
+#endif /* HAVE_DTRACE */
 
        /* The passed in "connection" can be a cached stub from plist or freshly created. In the former
         * case, we do not have to allocate any handles
         */
 
        if (!connection->err) {
-               PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIHandleAlloc, (connection->env, (dvoid **)&(connection->err), OCI_HTYPE_ERROR, 0, NULL));
+               PHP_OCI_CALL_RETURN(OCIHANDLEALLOC, OCI_G(errcode), OCIHandleAlloc, (connection->env, (dvoid **)&(connection->err), OCI_HTYPE_ERROR, 0, NULL));
 
                if (OCI_G(errcode) != OCI_SUCCESS) {
                        php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC);
@@ -3161,7 +3271,7 @@ static int php_oci_create_session(php_oci_connection *connection, php_oci_spool
 
        /* {{{ Allocate and initialize the connection-private authinfo handle if not allocated yet */
        if (!connection->authinfo) {
-               PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIHandleAlloc, (connection->env, (dvoid **)&(connection->authinfo), OCI_HTYPE_AUTHINFO, 0, NULL));
+               PHP_OCI_CALL_RETURN(OCIHANDLEALLOC, OCI_G(errcode), OCIHandleAlloc, (connection->env, (dvoid **)&(connection->authinfo), OCI_HTYPE_AUTHINFO, 0, NULL));
 
                if (OCI_G(errcode) != OCI_SUCCESS) {
                        php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC);
@@ -3170,7 +3280,7 @@ static int php_oci_create_session(php_oci_connection *connection, php_oci_spool
 
                /* Set the Connection class and purity if OCI client version >= 11g */
 #if (OCI_MAJOR_VERSION > 10)
-               PHP_OCI_CALL_RETURN(OCI_G(errcode),OCIAttrSet, ((dvoid *) connection->authinfo,(ub4) OCI_HTYPE_SESSION, (dvoid *) OCI_G(connection_class), (ub4)(strlen(OCI_G(connection_class))), (ub4)OCI_ATTR_CONNECTION_CLASS, OCI_G(err)));
+               PHP_OCI_CALL_RETURN(OCIATTRSET, OCI_G(errcode),OCIAttrSet, ((dvoid *) connection->authinfo,(ub4) OCI_HTYPE_SESSION, (dvoid *) OCI_G(connection_class), (ub4)(strlen(OCI_G(connection_class))), (ub4)OCI_ATTR_CONNECTION_CLASS, OCI_G(err)));
 
                if (OCI_G(errcode) != OCI_SUCCESS) {
                        php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC);
@@ -3182,23 +3292,27 @@ static int php_oci_create_session(php_oci_connection *connection, php_oci_spool
                else
                        purity = OCI_ATTR_PURITY_NEW;
 
-               PHP_OCI_CALL_RETURN(OCI_G(errcode),OCIAttrSet, ((dvoid *) connection->authinfo,(ub4) OCI_HTYPE_AUTHINFO, (dvoid *) &purity, (ub4)0, (ub4)OCI_ATTR_PURITY, OCI_G(err)));
+               PHP_OCI_CALL_RETURN(OCIATTRSET, OCI_G(errcode),OCIAttrSet, ((dvoid *) connection->authinfo,(ub4) OCI_HTYPE_AUTHINFO, (dvoid *) &purity, (ub4)0, (ub4)OCI_ATTR_PURITY, OCI_G(err)));
 
                if (OCI_G(errcode) != OCI_SUCCESS) {
                        php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC);
                        return 1;
                }
 #endif
-       } /* }}} */
+       }
+       /* }}} */
 
-       /* Debug statements {{{ */
-       if (OCI_G(debug_mode)) {
+       /* {{{ Debug statements */
+#ifdef HAVE_DTRACE
+       if (DTRACE_OCI8_SESSPOOL_STATS_ENABLED()) {
                ub4 numfree = 0, numbusy = 0, numopen = 0;
-               PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrGet, ((dvoid *)actual_spool->poolh, OCI_HTYPE_SPOOL, (dvoid *)&numopen, (ub4 *)0, OCI_ATTR_SPOOL_OPEN_COUNT, OCI_G(err)));
-               PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrGet, ((dvoid *)actual_spool->poolh, OCI_HTYPE_SPOOL, (dvoid *)&numbusy, (ub4 *)0, OCI_ATTR_SPOOL_BUSY_COUNT, OCI_G(err)));
+               PHP_OCI_CALL_RETURN(OCIATTRGET, OCI_G(errcode), OCIAttrGet, ((dvoid *)actual_spool->poolh, OCI_HTYPE_SPOOL, (dvoid *)&numopen, (ub4 *)0, OCI_ATTR_SPOOL_OPEN_COUNT, OCI_G(err)));
+               PHP_OCI_CALL_RETURN(OCIATTRGET, OCI_G(errcode), OCIAttrGet, ((dvoid *)actual_spool->poolh, OCI_HTYPE_SPOOL, (dvoid *)&numbusy, (ub4 *)0, OCI_ATTR_SPOOL_BUSY_COUNT, OCI_G(err)));
                numfree = numopen - numbusy;    /* number of free connections in the pool */
-               php_printf ("OCI8 DEBUG L1: (numopen=%d)(numbusy=%d)(numfree=%d) at (%s:%d) \n", numopen, numbusy, numfree, __FILE__, __LINE__);
-       } /* }}} */
+               DTRACE_OCI8_SESSPOOL_STATS(numfree, numbusy, numopen);
+       }
+#endif /* HAVE_DTRACE */
+       /* }}} */
 
                /* Ping loop: Ping and loop till we get a good connection. When a database instance goes
                 * down, it can leave several bad connections that need to be flushed out before getting a
@@ -3208,7 +3322,7 @@ static int php_oci_create_session(php_oci_connection *connection, php_oci_spool
                 */
        do {
                /* Continue to use the global error handle as the connection is closed when an error occurs */
-               PHP_OCI_CALL_RETURN(OCI_G(errcode),OCISessionGet, (connection->env, OCI_G(err), &(connection->svc), (OCIAuthInfo *)connection->authinfo, (OraText *)actual_spool->poolname, (ub4)actual_spool->poolname_len, NULL, 0, NULL, NULL, NULL, OCI_SESSGET_SPOOL));
+               PHP_OCI_CALL_RETURN(OCISESSIONGET, OCI_G(errcode),OCISessionGet, (connection->env, OCI_G(err), &(connection->svc), (OCIAuthInfo *)connection->authinfo, (OraText *)actual_spool->poolname, (ub4)actual_spool->poolname_len, NULL, 0, NULL, NULL, NULL, OCI_SESSGET_SPOOL));
 
                if (OCI_G(errcode) != OCI_SUCCESS) {
                        php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC);
@@ -3223,11 +3337,12 @@ static int php_oci_create_session(php_oci_connection *connection, php_oci_spool
                }
 
                /* {{{ Populate the session and server fields of the connection */
-               PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrGet, ((dvoid *)connection->svc, OCI_HTYPE_SVCCTX, (dvoid *)&(connection->server), (ub4 *)0, OCI_ATTR_SERVER, OCI_G(err)));
+               PHP_OCI_CALL_RETURN(OCIATTRGET, OCI_G(errcode), OCIAttrGet, ((dvoid *)connection->svc, OCI_HTYPE_SVCCTX, (dvoid *)&(connection->server), (ub4 *)0, OCI_ATTR_SERVER, OCI_G(err)));
 
-               PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrGet, ((dvoid *)connection->svc, OCI_HTYPE_SVCCTX, (dvoid *)&(connection->session), (ub4 *)0, OCI_ATTR_SESSION, OCI_G(err))); /* }}} */
+               PHP_OCI_CALL_RETURN(OCIATTRGET, OCI_G(errcode), OCIAttrGet, ((dvoid *)connection->svc, OCI_HTYPE_SVCCTX, (dvoid *)&(connection->session), (ub4 *)0, OCI_ATTR_SESSION, OCI_G(err))); 
+               /* }}} */
 
-               PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIContextGetValue, (connection->session, OCI_G(err), (ub1 *)"NEXT_PING", (ub1)sizeof("NEXT_PING"), (void **)&(connection->next_pingp)));
+               PHP_OCI_CALL_RETURN(OCICONTEXTGETVALUE, OCI_G(errcode), OCIContextGetValue, (connection->session, OCI_G(err), (ub1 *)"NEXT_PING", (ub1)sizeof("NEXT_PING"), (void **)&(connection->next_pingp)));
                if (OCI_G(errcode) != OCI_SUCCESS) {
                        php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC);
                        return 1;
@@ -3245,7 +3360,7 @@ static int php_oci_create_session(php_oci_connection *connection, php_oci_spool
                                *(connection->next_pingp) = timestamp + OCI_G(ping_interval);
                        } else {
                                /* Bad connection - remove from pool */
-                               PHP_OCI_CALL(OCISessionRelease, (connection->svc, connection->err, NULL,0, (ub4) OCI_SESSRLS_DROPSESS));
+                               PHP_OCI_CALL(OCISESSIONRELEASE, OCISessionRelease, (connection->svc, connection->err, NULL,0, (ub4) OCI_SESSRLS_DROPSESS));
                                connection->svc = NULL;
                                connection->server = NULL;
                                connection->session = NULL;
@@ -3253,7 +3368,7 @@ static int php_oci_create_session(php_oci_connection *connection, php_oci_spool
                }       /* If ping applicable */
        } while (!(connection->svc));
 
-       PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->svc, (ub4) OCI_HTYPE_SVCCTX, (ub4 *) &statement_cache_size, 0, (ub4) OCI_ATTR_STMTCACHESIZE, OCI_G(err)));
+       PHP_OCI_CALL_RETURN(OCIATTRSET, OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->svc, (ub4) OCI_HTYPE_SVCCTX, (ub4 *) &statement_cache_size, 0, (ub4) OCI_ATTR_STMTCACHESIZE, OCI_G(err)));
 
        if (OCI_G(errcode) != OCI_SUCCESS) {
                php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC);
@@ -3265,7 +3380,8 @@ static int php_oci_create_session(php_oci_connection *connection, php_oci_spool
        connection->is_attached = connection->is_open = 1;
 
        return 0;
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_spool_list_dtor()
  *
@@ -3280,7 +3396,8 @@ static void php_oci_spool_list_dtor(zend_rsrc_list_entry *entry TSRMLS_DC)
        }
 
        return;
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_spool_close()
  *
@@ -3289,20 +3406,20 @@ static void php_oci_spool_list_dtor(zend_rsrc_list_entry *entry TSRMLS_DC)
 static void php_oci_spool_close(php_oci_spool *session_pool TSRMLS_DC)
 {
        if (session_pool->poolname_len) {
-               PHP_OCI_CALL(OCISessionPoolDestroy, ((dvoid *) session_pool->poolh,
+               PHP_OCI_CALL(OCISESSIONPOOLDESTROY, OCISessionPoolDestroy, ((dvoid *) session_pool->poolh,
                        (dvoid *) session_pool->err, OCI_SPD_FORCE));
        }
 
        if (session_pool->poolh) {
-               PHP_OCI_CALL(OCIHandleFree, ((dvoid *) session_pool->poolh, OCI_HTYPE_SPOOL));
+               PHP_OCI_CALL(OCIHANDLEFREE, OCIHandleFree, ((dvoid *) session_pool->poolh, OCI_HTYPE_SPOOL));
        }
 
        if (session_pool->err) {
-               PHP_OCI_CALL(OCIHandleFree, ((dvoid *) session_pool->err, OCI_HTYPE_ERROR));
+               PHP_OCI_CALL(OCIHANDLEFREE, OCIHandleFree, ((dvoid *) session_pool->err, OCI_HTYPE_ERROR));
        }
 
        if (session_pool->env) {
-               PHP_OCI_CALL(OCIHandleFree, ((dvoid *) session_pool->env, OCI_HTYPE_ENV));
+               PHP_OCI_CALL(OCIHANDLEFREE, OCIHandleFree, ((dvoid *) session_pool->env, OCI_HTYPE_ENV));
        }
 
        if (session_pool->spool_hash_key) {
@@ -3310,7 +3427,8 @@ static void php_oci_spool_close(php_oci_spool *session_pool TSRMLS_DC)
        }
 
        free(session_pool);
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_ping_init()
  *
@@ -3322,14 +3440,14 @@ static sword php_oci_ping_init(php_oci_connection *connection, OCIError *errh TS
 {
        time_t *next_pingp = NULL;
 
-       PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIContextGetValue, (connection->session, errh, (ub1 *)"NEXT_PING", (ub1)sizeof("NEXT_PING"), (void **)&next_pingp));
+       PHP_OCI_CALL_RETURN(OCICONTEXTGETVALUE, OCI_G(errcode), OCIContextGetValue, (connection->session, errh, (ub1 *)"NEXT_PING", (ub1)sizeof("NEXT_PING"), (void **)&next_pingp));
        if (OCI_G(errcode) != OCI_SUCCESS) {
                return OCI_G(errcode);
        }
 
        /* This must be a brand-new connection. Allocate memory for the ping */
        if (!next_pingp) {
-               PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIMemoryAlloc, (connection->session, errh, (void **)&next_pingp, OCI_DURATION_SESSION, sizeof(time_t), OCI_MEMORY_CLEARED));
+               PHP_OCI_CALL_RETURN(OCIMEMORYALLOC, OCI_G(errcode), OCIMemoryAlloc, (connection->session, errh, (void **)&next_pingp, OCI_DURATION_SESSION, sizeof(time_t), OCI_MEMORY_CLEARED));
                if (OCI_G(errcode) != OCI_SUCCESS) {
                        return OCI_G(errcode);
                }
@@ -3343,7 +3461,7 @@ static sword php_oci_ping_init(php_oci_connection *connection, OCIError *errh TS
        }
 
        /* Set the new ping value into the connection */
-       PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIContextSetValue, (connection->session, errh, OCI_DURATION_SESSION, (ub1 *)"NEXT_PING", (ub1)sizeof("NEXT_PING"), next_pingp));
+       PHP_OCI_CALL_RETURN(OCICONTEXTSETVALUE, OCI_G(errcode), OCIContextSetValue, (connection->session, errh, OCI_DURATION_SESSION, (ub1 *)"NEXT_PING", (ub1)sizeof("NEXT_PING"), next_pingp));
        if (OCI_G(errcode) != OCI_SUCCESS) {
                OCIMemoryFree(connection->session, errh, next_pingp);
                return OCI_G(errcode);
@@ -3353,7 +3471,8 @@ static sword php_oci_ping_init(php_oci_connection *connection, OCIError *errh TS
        connection->next_pingp = next_pingp;
 
        return OCI_SUCCESS;
-} /* }}} */
+}
+/* }}} */
 
 #endif /* HAVE_OCI8 */
 
index 763e12e9249d76c69f1fbaee7d69ccb3f2b77530..27430e8823801a287319fef182aa66dc43773803 100644 (file)
@@ -55,10 +55,10 @@ php_oci_collection * php_oci_collection_create(php_oci_connection *connection, c
 
        collection->connection = connection;
        collection->collection = NULL;
-       zend_list_addref(collection->connection->rsrc_id);
+       zend_list_addref(collection->connection->id);
 
        /* get type handle by name */
-       PHP_OCI_CALL_RETURN(connection->errcode, OCITypeByName,
+       PHP_OCI_CALL_RETURN(OCITYPEBYNAME, connection->errcode, OCITypeByName,
                        (
                         connection->env,
                         connection->err,
@@ -80,14 +80,14 @@ php_oci_collection * php_oci_collection_create(php_oci_connection *connection, c
        }
 
        /* allocate describe handle */
-       PHP_OCI_CALL_RETURN(connection->errcode, OCIHandleAlloc, (connection->env, (dvoid **) &dschp1, (ub4) OCI_HTYPE_DESCRIBE, (size_t) 0, (dvoid **) 0));
+       PHP_OCI_CALL_RETURN(OCIHANDLEALLOC, connection->errcode, OCIHandleAlloc, (connection->env, (dvoid **) &dschp1, (ub4) OCI_HTYPE_DESCRIBE, (size_t) 0, (dvoid **) 0));
 
        if (connection->errcode != OCI_SUCCESS) {
                goto CLEANUP;
        }
 
        /* describe TDO */
-       PHP_OCI_CALL_RETURN(connection->errcode, OCIDescribeAny,
+       PHP_OCI_CALL_RETURN(OCIDESCRIBEANY, connection->errcode, OCIDescribeAny,
                        (
                         connection->svc,
                         connection->err,
@@ -105,14 +105,14 @@ php_oci_collection * php_oci_collection_create(php_oci_connection *connection, c
        }
 
        /* get first parameter handle */
-       PHP_OCI_CALL_RETURN(connection->errcode, OCIAttrGet, ((dvoid *) dschp1, (ub4) OCI_HTYPE_DESCRIBE, (dvoid *)&parmp1, (ub4 *)0, (ub4)OCI_ATTR_PARAM,      connection->err));
+       PHP_OCI_CALL_RETURN(OCIATTRGET, connection->errcode, OCIAttrGet, ((dvoid *) dschp1, (ub4) OCI_HTYPE_DESCRIBE, (dvoid *)&parmp1, (ub4 *)0, (ub4)OCI_ATTR_PARAM,  connection->err));
 
        if (connection->errcode != OCI_SUCCESS) {
                goto CLEANUP;
        }
 
        /* get the collection type code of the attribute */
-       PHP_OCI_CALL_RETURN(connection->errcode, OCIAttrGet,
+       PHP_OCI_CALL_RETURN(OCIATTRGET, connection->errcode, OCIAttrGet,
                        (
                         (dvoid*) parmp1,
                         (ub4) OCI_DTYPE_PARAM,
@@ -131,7 +131,7 @@ php_oci_collection * php_oci_collection_create(php_oci_connection *connection, c
                case OCI_TYPECODE_TABLE:
                case OCI_TYPECODE_VARRAY:
                        /* get collection element handle */
-                       PHP_OCI_CALL_RETURN(connection->errcode, OCIAttrGet,
+                       PHP_OCI_CALL_RETURN(OCIATTRGET, connection->errcode, OCIAttrGet,
                                        (
                                         (dvoid*) parmp1,
                                         (ub4) OCI_DTYPE_PARAM,
@@ -147,7 +147,7 @@ php_oci_collection * php_oci_collection_create(php_oci_connection *connection, c
                        }
 
                        /* get REF of the TDO for the type */
-                       PHP_OCI_CALL_RETURN(connection->errcode, OCIAttrGet,
+                       PHP_OCI_CALL_RETURN(OCIATTRGET, connection->errcode, OCIAttrGet,
                                        (
                                         (dvoid*) parmp2,
                                         (ub4) OCI_DTYPE_PARAM,
@@ -163,7 +163,7 @@ php_oci_collection * php_oci_collection_create(php_oci_connection *connection, c
                        }
 
                        /* get the TDO (only header) */
-                       PHP_OCI_CALL_RETURN(connection->errcode, OCITypeByRef,
+                       PHP_OCI_CALL_RETURN(OCITYPEBYREF, connection->errcode, OCITypeByRef,
                                        (
                                         connection->env,
                                         connection->err,
@@ -179,7 +179,7 @@ php_oci_collection * php_oci_collection_create(php_oci_connection *connection, c
                        }
 
                        /* get typecode */
-                       PHP_OCI_CALL_RETURN(connection->errcode, OCIAttrGet,
+                       PHP_OCI_CALL_RETURN(OCIATTRGET, connection->errcode, OCIAttrGet,
                                        (
                                         (dvoid*) parmp2,
                                         (ub4) OCI_DTYPE_PARAM,
@@ -201,7 +201,7 @@ php_oci_collection * php_oci_collection_create(php_oci_connection *connection, c
        }       
 
        /* Create object to hold return table */
-       PHP_OCI_CALL_RETURN(connection->errcode, OCIObjectNew,
+       PHP_OCI_CALL_RETURN(OCIOBJECTNEW, connection->errcode, OCIObjectNew,
                (
                        connection->env,
                        connection->err,
@@ -220,7 +220,7 @@ php_oci_collection * php_oci_collection_create(php_oci_connection *connection, c
        }
 
        /* free the describe handle (Bug #44113) */
-       PHP_OCI_CALL(OCIHandleFree, ((dvoid *) dschp1, OCI_HTYPE_DESCRIBE));
+       PHP_OCI_CALL(OCIHANDLEFREE, OCIHandleFree, ((dvoid *) dschp1, OCI_HTYPE_DESCRIBE));
        PHP_OCI_REGISTER_RESOURCE(collection, le_collection);
        return collection;
        
@@ -228,13 +228,14 @@ CLEANUP:
 
        if (dschp1) {
                /* free the describe handle (Bug #44113) */
-               PHP_OCI_CALL(OCIHandleFree, ((dvoid *) dschp1, OCI_HTYPE_DESCRIBE));
+               PHP_OCI_CALL(OCIHANDLEFREE, OCIHandleFree, ((dvoid *) dschp1, OCI_HTYPE_DESCRIBE));
        }
        connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
        PHP_OCI_HANDLE_ERROR(connection, connection->errcode);
        php_oci_collection_close(collection TSRMLS_CC); 
        return NULL;
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_collection_size()
  Return size of the collection */
@@ -242,7 +243,7 @@ int php_oci_collection_size(php_oci_collection *collection, sb4 *size TSRMLS_DC)
 {
        php_oci_connection *connection = collection->connection;
        
-       PHP_OCI_CALL_RETURN(connection->errcode, OCICollSize, (connection->env, connection->err, collection->collection, (sb4 *)size));
+       PHP_OCI_CALL_RETURN(OCICOLLSIZE, connection->errcode, OCICollSize, (connection->env, connection->err, collection->collection, (sb4 *)size));
 
        if (connection->errcode != OCI_SUCCESS) {
                connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
@@ -250,7 +251,8 @@ int php_oci_collection_size(php_oci_collection *collection, sb4 *size TSRMLS_DC)
                return 1;
        }
        return 0;
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_collection_max()
  Return max number of elements in the collection */
@@ -258,11 +260,12 @@ int php_oci_collection_max(php_oci_collection *collection, long *max TSRMLS_DC)
 {
        php_oci_connection *connection = collection->connection;
        
-       PHP_OCI_CALL_RETURN(*max, OCICollMax, (connection->env, collection->collection));
+       PHP_OCI_CALL_RETURN(OCICOLLMAX, *max, OCICollMax, (connection->env, collection->collection));
 
        /* error handling is not necessary here? */
        return 0;
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_collection_trim()
  Trim collection to the given number of elements */
@@ -270,7 +273,7 @@ int php_oci_collection_trim(php_oci_collection *collection, long trim_size TSRML
 {
        php_oci_connection *connection = collection->connection;
        
-       PHP_OCI_CALL_RETURN(connection->errcode, OCICollTrim, (connection->env, connection->err, trim_size, collection->collection));
+       PHP_OCI_CALL_RETURN(OCICOLLTRIM, connection->errcode, OCICollTrim, (connection->env, connection->err, trim_size, collection->collection));
 
        if (connection->errcode != OCI_SUCCESS) {
                connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
@@ -278,7 +281,8 @@ int php_oci_collection_trim(php_oci_collection *collection, long trim_size TSRML
                return 1;
        }
        return 0;
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_collection_append_null()
  Append NULL element to the end of the collection */
@@ -288,7 +292,7 @@ int php_oci_collection_append_null(php_oci_collection *collection TSRMLS_DC)
        php_oci_connection *connection = collection->connection;
 
        /* append NULL element */
-       PHP_OCI_CALL_RETURN(connection->errcode, OCICollAppend, (connection->env, connection->err, (dvoid *)0, &null_index, collection->collection));
+       PHP_OCI_CALL_RETURN(OCICOLLAPPEND, connection->errcode, OCICollAppend, (connection->env, connection->err, (dvoid *)0, &null_index, collection->collection));
        
        if (connection->errcode != OCI_SUCCESS) {
                connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
@@ -296,7 +300,8 @@ int php_oci_collection_append_null(php_oci_collection *collection TSRMLS_DC)
                return 1;
        }
        return 0;
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_collection_append_date()
  Append DATE element to the end of the collection (use "DD-MON-YY" format) */
@@ -307,7 +312,7 @@ int php_oci_collection_append_date(php_oci_collection *collection, char *date, i
        php_oci_connection *connection = collection->connection;
 
        /* format and language are NULLs, so format is "DD-MON-YY" and language is the default language of the session */
-       PHP_OCI_CALL_RETURN(connection->errcode, OCIDateFromText, (connection->err, (CONST text *)date, date_len, NULL, 0, NULL, 0, &oci_date));
+       PHP_OCI_CALL_RETURN(OCIDATEFROMTEXT, connection->errcode, OCIDateFromText, (connection->err, (CONST text *)date, date_len, NULL, 0, NULL, 0, &oci_date));
 
        if (connection->errcode != OCI_SUCCESS) {
                /* failed to convert string to date */
@@ -316,7 +321,7 @@ int php_oci_collection_append_date(php_oci_collection *collection, char *date, i
                return 1;
        }
 
-       PHP_OCI_CALL_RETURN(connection->errcode, OCICollAppend,
+       PHP_OCI_CALL_RETURN(OCICOLLAPPEND, connection->errcode, OCICollAppend,
                        (
                         connection->env,
                         connection->err,
@@ -333,7 +338,8 @@ int php_oci_collection_append_date(php_oci_collection *collection, char *date, i
        }
                        
        return 0;
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_collection_append_number()
  Append NUMBER to the end of the collection */
@@ -352,7 +358,7 @@ int php_oci_collection_append_number(php_oci_collection *collection, char *numbe
        element_double = zend_strtod(number, NULL);
 #endif
                        
-       PHP_OCI_CALL_RETURN(connection->errcode, OCINumberFromReal, (connection->err, &element_double, sizeof(double), &oci_number));
+       PHP_OCI_CALL_RETURN(OCINUMBERFROMREAL, connection->errcode, OCINumberFromReal, (connection->err, &element_double, sizeof(double), &oci_number));
 
        if (connection->errcode != OCI_SUCCESS) {
                connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
@@ -360,7 +366,7 @@ int php_oci_collection_append_number(php_oci_collection *collection, char *numbe
                return 1;
        }
 
-       PHP_OCI_CALL_RETURN(connection->errcode, OCICollAppend,
+       PHP_OCI_CALL_RETURN(OCICOLLAPPEND, connection->errcode, OCICollAppend,
                        (
                         connection->env,
                         connection->err,
@@ -377,7 +383,8 @@ int php_oci_collection_append_number(php_oci_collection *collection, char *numbe
        }
 
        return 0;
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_collection_append_string()
  Append STRING to the end of the collection */
@@ -387,7 +394,7 @@ int php_oci_collection_append_string(php_oci_collection *collection, char *eleme
        OCIString *ocistr = (OCIString *)0;
        php_oci_connection *connection = collection->connection;
                        
-       PHP_OCI_CALL_RETURN(connection->errcode, OCIStringAssignText, (connection->env, connection->err, (CONST oratext *)element, element_len, &ocistr));
+       PHP_OCI_CALL_RETURN(OCISTRINGASSIGNTEXT, connection->errcode, OCIStringAssignText, (connection->env, connection->err, (CONST oratext *)element, element_len, &ocistr));
 
        if (connection->errcode != OCI_SUCCESS) {
                connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
@@ -395,7 +402,7 @@ int php_oci_collection_append_string(php_oci_collection *collection, char *eleme
                return 1;
        }
 
-       PHP_OCI_CALL_RETURN(connection->errcode, OCICollAppend,
+       PHP_OCI_CALL_RETURN(OCICOLLAPPEND, connection->errcode, OCICollAppend,
                        (
                         connection->env,
                         connection->err,
@@ -412,7 +419,8 @@ int php_oci_collection_append_string(php_oci_collection *collection, char *eleme
        }
 
        return 0;
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_collection_append()
  Append wrapper. Appends any supported element to the end of the collection */
@@ -452,7 +460,8 @@ int php_oci_collection_append(php_oci_collection *collection, char *element, int
        }
        /* never reached */
        return 1;
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_collection_element_get()
  Get the element with the given index */
@@ -468,7 +477,7 @@ int php_oci_collection_element_get(php_oci_collection *collection, long index, z
        MAKE_STD_ZVAL(*result_element);
        ZVAL_NULL(*result_element);
 
-       PHP_OCI_CALL_RETURN(connection->errcode, OCICollGetElem,
+       PHP_OCI_CALL_RETURN(OCICOLLGETELEM, connection->errcode, OCICollGetElem,
                        (
                         connection->env,
                         connection->err,
@@ -500,7 +509,7 @@ int php_oci_collection_element_get(php_oci_collection *collection, long index, z
 
        switch (collection->element_typecode) {
                case OCI_TYPECODE_DATE:
-                       PHP_OCI_CALL_RETURN(connection->errcode, OCIDateToText, (connection->err, element, 0, 0, 0, 0, &buff_len, buff));
+                       PHP_OCI_CALL_RETURN(OCIDATETOTEXT, connection->errcode, OCIDateToText, (connection->err, element, 0, 0, 0, 0, &buff_len, buff));
        
                        if (connection->errcode != OCI_SUCCESS) {
                                connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
@@ -520,7 +529,7 @@ int php_oci_collection_element_get(php_oci_collection *collection, long index, z
                        OCIString *oci_string = *(OCIString **)element;
                        text *str;
                        
-                       PHP_OCI_CALL_RETURN(str, OCIStringPtr, (connection->env, oci_string));
+                       PHP_OCI_CALL_RETURN(OCISTRINGPTR, str, OCIStringPtr, (connection->env, oci_string));
                        
                        if (str) {
                                ZVAL_STRING(*result_element, (char *)str, 1);
@@ -543,7 +552,7 @@ int php_oci_collection_element_get(php_oci_collection *collection, long index, z
                {
                        double double_number;
                        
-                       PHP_OCI_CALL_RETURN(connection->errcode, OCINumberToReal, (connection->err, (CONST OCINumber *) element, (uword) sizeof(double), (dvoid *) &double_number));
+                       PHP_OCI_CALL_RETURN(OCINUMBERTOREAL, connection->errcode, OCINumberToReal, (connection->err, (CONST OCINumber *) element, (uword) sizeof(double), (dvoid *) &double_number));
 
                        if (connection->errcode != OCI_SUCCESS) {
                                connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
@@ -565,7 +574,8 @@ int php_oci_collection_element_get(php_oci_collection *collection, long index, z
        }
        /* never reached */
        return 1;
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_collection_element_set_null()
  Set the element with the given index to NULL */
@@ -575,7 +585,7 @@ int php_oci_collection_element_set_null(php_oci_collection *collection, long ind
        php_oci_connection *connection = collection->connection;
 
        /* set NULL element */
-       PHP_OCI_CALL_RETURN(connection->errcode, OCICollAssignElem, (connection->env, connection->err, (ub4) index, (dvoid *)"", &null_index, collection->collection));
+       PHP_OCI_CALL_RETURN(OCICOLLASSIGNELEM, connection->errcode, OCICollAssignElem, (connection->env, connection->err, (ub4) index, (dvoid *)"", &null_index, collection->collection));
        
        if (connection->errcode != OCI_SUCCESS) {
                connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
@@ -583,7 +593,8 @@ int php_oci_collection_element_set_null(php_oci_collection *collection, long ind
                return 1;
        }
        return 0;
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_collection_element_set_date()
  Change element's value to the given DATE */
@@ -594,7 +605,7 @@ int php_oci_collection_element_set_date(php_oci_collection *collection, long ind
        php_oci_connection *connection = collection->connection;
 
        /* format and language are NULLs, so format is "DD-MON-YY" and language is the default language of the session */
-       PHP_OCI_CALL_RETURN(connection->errcode, OCIDateFromText, (connection->err, (CONST text *)date, date_len, NULL, 0, NULL, 0, &oci_date));
+       PHP_OCI_CALL_RETURN(OCIDATEFROMTEXT, connection->errcode, OCIDateFromText, (connection->err, (CONST text *)date, date_len, NULL, 0, NULL, 0, &oci_date));
 
        if (connection->errcode != OCI_SUCCESS) {
                /* failed to convert string to date */
@@ -603,7 +614,7 @@ int php_oci_collection_element_set_date(php_oci_collection *collection, long ind
                return 1;
        }
 
-       PHP_OCI_CALL_RETURN(connection->errcode, OCICollAssignElem,
+       PHP_OCI_CALL_RETURN(OCICOLLASSIGNELEM, connection->errcode, OCICollAssignElem,
                        (
                         connection->env,
                         connection->err,
@@ -621,7 +632,8 @@ int php_oci_collection_element_set_date(php_oci_collection *collection, long ind
        }
                        
        return 0;
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_collection_element_set_number()
  Change element's value to the given NUMBER */
@@ -640,7 +652,7 @@ int php_oci_collection_element_set_number(php_oci_collection *collection, long i
        element_double = zend_strtod(number, NULL);
 #endif
                        
-       PHP_OCI_CALL_RETURN(connection->errcode, OCINumberFromReal, (connection->err, &element_double, sizeof(double), &oci_number));
+       PHP_OCI_CALL_RETURN(OCINUMBERFROMREAL, connection->errcode, OCINumberFromReal, (connection->err, &element_double, sizeof(double), &oci_number));
 
        if (connection->errcode != OCI_SUCCESS) {
                connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
@@ -648,7 +660,7 @@ int php_oci_collection_element_set_number(php_oci_collection *collection, long i
                return 1;
        }
 
-       PHP_OCI_CALL_RETURN(connection->errcode, OCICollAssignElem,
+       PHP_OCI_CALL_RETURN(OCICOLLASSIGNELEM, connection->errcode, OCICollAssignElem,
                        (
                         connection->env,
                         connection->err,
@@ -666,7 +678,8 @@ int php_oci_collection_element_set_number(php_oci_collection *collection, long i
        }
 
        return 0;
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_collection_element_set_string()
  Change element's value to the given string */
@@ -676,7 +689,7 @@ int php_oci_collection_element_set_string(php_oci_collection *collection, long i
        OCIString *ocistr = (OCIString *)0;
        php_oci_connection *connection = collection->connection;
                        
-       PHP_OCI_CALL_RETURN(connection->errcode, OCIStringAssignText, (connection->env, connection->err, (CONST oratext *)element, element_len, &ocistr));
+       PHP_OCI_CALL_RETURN(OCISTRINGASSIGNTEXT, connection->errcode, OCIStringAssignText, (connection->env, connection->err, (CONST oratext *)element, element_len, &ocistr));
 
        if (connection->errcode != OCI_SUCCESS) {
                connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
@@ -684,7 +697,7 @@ int php_oci_collection_element_set_string(php_oci_collection *collection, long i
                return 1;
        }
 
-       PHP_OCI_CALL_RETURN(connection->errcode, OCICollAssignElem,
+       PHP_OCI_CALL_RETURN(OCICOLLASSIGNELEM, connection->errcode, OCICollAssignElem,
                        (
                         connection->env,
                         connection->err,
@@ -702,7 +715,8 @@ int php_oci_collection_element_set_string(php_oci_collection *collection, long i
        }
 
        return 0;
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_collection_element_set()
  Collection element setter */
@@ -742,7 +756,8 @@ int php_oci_collection_element_set(php_oci_collection *collection, long index, c
        }
        /* never reached */
        return 1;
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_collection_assign()
  Assigns a value to the collection from another collection */
@@ -750,7 +765,7 @@ int php_oci_collection_assign(php_oci_collection *collection_dest, php_oci_colle
 {
        php_oci_connection *connection = collection_dest->connection;
        
-       PHP_OCI_CALL_RETURN(connection->errcode, OCICollAssign, (connection->env, connection->err, collection_from->collection, collection_dest->collection));
+       PHP_OCI_CALL_RETURN(OCICOLLASSIGN, connection->errcode, OCICollAssign, (connection->env, connection->err, collection_from->collection, collection_dest->collection));
 
        if (connection->errcode != OCI_SUCCESS) {
                connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
@@ -758,7 +773,8 @@ int php_oci_collection_assign(php_oci_collection *collection_dest, php_oci_colle
                return 1;
        }
        return 0;
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_collection_close()
  Destroy collection and all associated resources */
@@ -767,7 +783,7 @@ void php_oci_collection_close(php_oci_collection *collection TSRMLS_DC)
        php_oci_connection *connection = collection->connection;
 
        if (collection->collection) {
-               PHP_OCI_CALL_RETURN(connection->errcode, OCIObjectFree, (connection->env, connection->err, (dvoid *)collection->collection, (ub2)OCI_OBJECTFREE_FORCE));
+               PHP_OCI_CALL_RETURN(OCIOBJECTFREE, connection->errcode, OCIObjectFree, (connection->env, connection->err, (dvoid *)collection->collection, (ub2)OCI_OBJECTFREE_FORCE));
 
                if (connection->errcode != OCI_SUCCESS) {
                        connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
@@ -775,11 +791,12 @@ void php_oci_collection_close(php_oci_collection *collection TSRMLS_DC)
                }
        }
        
-       zend_list_delete(collection->connection->rsrc_id);
+       zend_list_delete(collection->connection->id);
        
        efree(collection);
        return;
-} /* }}} */
+}
+/* }}} */
 
 #endif /* HAVE_OCI8 */
 
diff --git a/ext/oci8/oci8_dtrace.d b/ext/oci8/oci8_dtrace.d
new file mode 100644 (file)
index 0000000..61f42ae
--- /dev/null
@@ -0,0 +1,195 @@
+/*
+   +----------------------------------------------------------------------+
+   | Zend Engine                                                          |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 2013 Zend Technologies Ltd. (http://www.zend.com)      |
+   +----------------------------------------------------------------------+
+   | This source file is subject to version 3.01 of the Zend license,     |
+   | that is bundled with this package in the file LICENSE, and is        |
+   | available through the world-wide-web at the following url:           |
+   | http://www.zend.com/license/3_01.txt.                                |
+   | If you did not receive a copy of the Zend license and are unable to  |
+   | obtain it through the world-wide-web, please send a note to          |
+   | license@zend.com so we can mail you a copy immediately.              |
+   +----------------------------------------------------------------------+
+   | Author: Christopher Jones <christopher.jones@oracle.com>             |
+   +----------------------------------------------------------------------+
+*/
+
+provider php {
+       probe oci8__connect_start(char *username, char *dbname, char *charset, long session_mode, int persistent, int exclusive);
+       probe oci8__connect_done();
+       probe oci8__sqltext(char *sql);
+       probe oci8__error(int status, long errcode);
+       probe oci8__execute_mode(unsigned int mode);
+
+       probe oci8__connect_p_dtor_close(void *connection);
+       probe oci8__connect_p_dtor_release(void *connection);
+       probe oci8__connect_lookup(void *connection, int is_stub);
+       probe oci8__connect_expiry(void *connection, int is_stub, time_t idle_expiry, time_t timestamp);
+       probe oci8__connect_type(int is_persistent, int exclusive, void *connection, long num_persistent, long num_links);
+       probe oci8__sesspool_create(void *session_pool);
+       probe oci8__sesspool_stats(unsigned long free, unsigned long busy, unsigned long open);
+       probe oci8__sesspool_type(int type, void *session_pool);
+
+       probe oci8__ociattrget_start();
+       probe oci8__ociattrget_done();
+       probe oci8__ociattrset_start();
+       probe oci8__ociattrset_done();
+       probe oci8__ocibindbyname_start();
+       probe oci8__ocibindbyname_done();
+       probe oci8__ocibinddynamic_start();
+       probe oci8__ocibinddynamic_done();
+       probe oci8__ocibindobject_start();
+       probe oci8__ocibindobject_done();
+       probe oci8__ociclientversion_start();
+       probe oci8__ociclientversion_done();
+       probe oci8__ocicollappend_start();
+       probe oci8__ocicollappend_done();
+       probe oci8__ocicollassign_start();
+       probe oci8__ocicollassign_done();
+       probe oci8__ocicollassignelem_start();
+       probe oci8__ocicollassignelem_done();
+       probe oci8__ocicollgetelem_start();
+       probe oci8__ocicollgetelem_done();
+       probe oci8__ocicollmax_start();
+       probe oci8__ocicollmax_done();
+       probe oci8__ocicollsize_start();
+       probe oci8__ocicollsize_done();
+       probe oci8__ocicolltrim_start();
+       probe oci8__ocicolltrim_done();
+       probe oci8__ocicontextgetvalue_start();
+       probe oci8__ocicontextgetvalue_done();
+       probe oci8__ocicontextsetvalue_start();
+       probe oci8__ocicontextsetvalue_done();
+       probe oci8__ocidatefromtext_start();
+       probe oci8__ocidatefromtext_done();
+       probe oci8__ocidatetotext_start();
+       probe oci8__ocidatetotext_done();
+       probe oci8__ocidefinebypos_start();
+       probe oci8__ocidefinebypos_done();
+       probe oci8__ocidefinedynamic_start();
+       probe oci8__ocidefinedynamic_done();
+       probe oci8__ocidescribeany_start();
+       probe oci8__ocidescribeany_done();
+       probe oci8__ocidescriptoralloc_start();
+       probe oci8__ocidescriptoralloc_done();
+       probe oci8__ocidescriptorfree_start();
+       probe oci8__ocidescriptorfree_done();
+       probe oci8__ocienvnlscreate_start();
+       probe oci8__ocienvnlscreate_done();
+       probe oci8__ocierrorget_start();
+       probe oci8__ocierrorget_done();
+       probe oci8__ocihandlealloc_start();
+       probe oci8__ocihandlealloc_done();
+       probe oci8__ocihandlefree_start();
+       probe oci8__ocihandlefree_done();
+       probe oci8__ocilobappend_start();
+       probe oci8__ocilobappend_done();
+       probe oci8__ocilobcharsetid_start();
+       probe oci8__ocilobcharsetid_done();
+       probe oci8__ocilobclose_start();
+       probe oci8__ocilobclose_done();
+       probe oci8__ocilobcopy_start();
+       probe oci8__ocilobcopy_done();
+       probe oci8__ocilobcreatetemporary_start();
+       probe oci8__ocilobcreatetemporary_done();
+       probe oci8__ocilobdisablebuffering_start();
+       probe oci8__ocilobdisablebuffering_done();
+       probe oci8__ocilobenablebuffering_start();
+       probe oci8__ocilobenablebuffering_done();
+       probe oci8__ociloberase_start();
+       probe oci8__ociloberase_done();
+       probe oci8__ocilobfileclose_start();
+       probe oci8__ocilobfileclose_done();
+       probe oci8__ocilobfileopen_start();
+       probe oci8__ocilobfileopen_done();
+       probe oci8__ocilobflushbuffer_start();
+       probe oci8__ocilobflushbuffer_done();
+       probe oci8__ocilobfreetemporary_start();
+       probe oci8__ocilobfreetemporary_done();
+       probe oci8__ocilobgetchunksize_start();
+       probe oci8__ocilobgetchunksize_done();
+       probe oci8__ocilobgetlength_start();
+       probe oci8__ocilobgetlength_done();
+       probe oci8__ocilobisequal_start();
+       probe oci8__ocilobisequal_done();
+       probe oci8__ocilobistemporary_start();
+       probe oci8__ocilobistemporary_done();
+       probe oci8__ocilobopen_start();
+       probe oci8__ocilobopen_done();
+       probe oci8__ocilobread2_start();
+       probe oci8__ocilobread2_done();
+       probe oci8__ocilobtrim_start();
+       probe oci8__ocilobtrim_done();
+       probe oci8__ocilobwrite_start();
+       probe oci8__ocilobwrite_done();
+       probe oci8__ocimemoryalloc_start();
+       probe oci8__ocimemoryalloc_done();
+       probe oci8__ocimemoryfree_start();
+       probe oci8__ocimemoryfree_done();
+       probe oci8__ocinlscharsetnametoid_start();
+       probe oci8__ocinlscharsetnametoid_done();
+       probe oci8__ocinlsenvironmentvariableget_start();
+       probe oci8__ocinlsenvironmentvariableget_done();
+       probe oci8__ocinlsnumericinfoget_start();
+       probe oci8__ocinlsnumericinfoget_done();
+       probe oci8__ocinumberfromreal_start();
+       probe oci8__ocinumberfromreal_done();
+       probe oci8__ocinumbertoreal_start();
+       probe oci8__ocinumbertoreal_done();
+       probe oci8__ociobjectfree_start();
+       probe oci8__ociobjectfree_done();
+       probe oci8__ociobjectnew_start();
+       probe oci8__ociobjectnew_done();
+       probe oci8__ociparamget_start();
+       probe oci8__ociparamget_done();
+       probe oci8__ocipasswordchange_start();
+       probe oci8__ocipasswordchange_done();
+       probe oci8__ociping_start();
+       probe oci8__ociping_done();
+       probe oci8__ociserverattach_start();
+       probe oci8__ociserverattach_done();
+       probe oci8__ociserverdetach_start();
+       probe oci8__ociserverdetach_done();
+       probe oci8__ociserverversion_start();
+       probe oci8__ociserverversion_done();
+       probe oci8__ocisessionbegin_start();
+       probe oci8__ocisessionbegin_done();
+       probe oci8__ocisessionend_start();
+       probe oci8__ocisessionend_done();
+       probe oci8__ocisessionget_start();
+       probe oci8__ocisessionget_done();
+       probe oci8__ocisessionpoolcreate_start();
+       probe oci8__ocisessionpoolcreate_done();
+       probe oci8__ocisessionpooldestroy_start();
+       probe oci8__ocisessionpooldestroy_done();
+       probe oci8__ocisessionrelease_start();
+       probe oci8__ocisessionrelease_done();
+       probe oci8__ocistmtexecute_start();
+       probe oci8__ocistmtexecute_done();
+       probe oci8__ocistmtfetch_start();
+       probe oci8__ocistmtfetch_done();
+       probe oci8__ocistmtgetnextresult_start();
+       probe oci8__ocistmtgetnextresult_done();
+       probe oci8__ocistmtgetpieceinfo_start();
+       probe oci8__ocistmtgetpieceinfo_done();
+       probe oci8__ocistmtprepare2_start();
+       probe oci8__ocistmtprepare2_done();
+       probe oci8__ocistmtrelease_start();
+       probe oci8__ocistmtrelease_done();
+       probe oci8__ocistmtsetpieceinfo_start();
+       probe oci8__ocistmtsetpieceinfo_done();
+       probe oci8__ocistringassigntext_start();
+       probe oci8__ocistringassigntext_done();
+       probe oci8__ocistringptr_start();
+       probe oci8__ocistringptr_done();
+       probe oci8__ocitranscommit_start();
+       probe oci8__ocitranscommit_done();
+       probe oci8__ocitransrollback_start();
+       probe oci8__ocitransrollback_done();
+       probe oci8__ocitypebyname_start();
+       probe oci8__ocitypebyname_done();
+       probe oci8__ocitypebyref_start();
+       probe oci8__ocitypebyref_done();
+};
index e51d3c92f5272b5072f87deb75f8dcb52b5757ea..f93c0c0d451e2f0dcb60d9236f2730dfde4db3b6 100644 (file)
@@ -1583,7 +1583,7 @@ PHP_FUNCTION(oci_close)
        }
 
        PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection);
-       zend_list_delete(connection->rsrc_id);
+       zend_list_delete(connection->id);
 
        ZVAL_NULL(z_connection);
        
@@ -1591,7 +1591,7 @@ PHP_FUNCTION(oci_close)
 }
 /* }}} */
 
-/* {{{ proto resource oci_new_connect(string user, string pass [, string db])
+/* {{{ proto resource oci_new_connect(string user, string pass [, string db, string charset [, int session_mode ]])
    Connect to an Oracle database and log on. Returns a new session. */
 PHP_FUNCTION(oci_new_connect)
 {
@@ -1607,7 +1607,7 @@ PHP_FUNCTION(oci_connect)
 }
 /* }}} */
 
-/* {{{ proto resource oci_pconnect(string user, string pass [, string db [, string charset ]])
+/* {{{ proto resource oci_pconnect(string user, string pass [, string db [, string charset [, int session_mode ]])
    Connect to an Oracle database using a persistent connection and log on. Returns a new session. */
 PHP_FUNCTION(oci_pconnect)
 {
@@ -1766,7 +1766,7 @@ PHP_FUNCTION(oci_set_client_identifier)
 
        PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection);
 
-       PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->session, (ub4) OCI_HTYPE_SESSION, (dvoid *) client_id, (ub4) client_id_len, (ub4) OCI_ATTR_CLIENT_IDENTIFIER, OCI_G(err)));
+       PHP_OCI_CALL_RETURN(OCIATTRSET, OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->session, (ub4) OCI_HTYPE_SESSION, (dvoid *) client_id, (ub4) client_id_len, (ub4) OCI_ATTR_CLIENT_IDENTIFIER, OCI_G(err)));
 
        if (OCI_G(errcode) != OCI_SUCCESS) {
                php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC);
@@ -1809,7 +1809,7 @@ PHP_FUNCTION(oci_set_edition)
 /* }}} */
 
 /* {{{ proto bool oci_set_module_name(resource connection, string value)
-  Sets the module attribute on the connection */
+  Sets the module attribute on the connection for end-to-end tracing */
 PHP_FUNCTION(oci_set_module_name)
 {
 #if (OCI_MAJOR_VERSION >= 10)
@@ -1824,7 +1824,7 @@ PHP_FUNCTION(oci_set_module_name)
 
        PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection);
 
-       PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->session, (ub4) OCI_HTYPE_SESSION, (dvoid *) module, (ub4) module_len, (ub4) OCI_ATTR_MODULE, OCI_G(err)));
+       PHP_OCI_CALL_RETURN(OCIATTRSET, OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->session, (ub4) OCI_HTYPE_SESSION, (dvoid *) module, (ub4) module_len, (ub4) OCI_ATTR_MODULE, OCI_G(err)));
 
        if (OCI_G(errcode) != OCI_SUCCESS) {
                php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC);
@@ -1840,7 +1840,7 @@ PHP_FUNCTION(oci_set_module_name)
 /* }}} */
 
 /* {{{ proto bool oci_set_action(resource connection, string value)
-  Sets the action attribute on the connection */
+  Sets the action attribute on the connection for end-to-end tracing */
 PHP_FUNCTION(oci_set_action)
 {
 #if (OCI_MAJOR_VERSION >= 10)
@@ -1855,7 +1855,7 @@ PHP_FUNCTION(oci_set_action)
 
        PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection);
 
-       PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->session, (ub4) OCI_HTYPE_SESSION, (dvoid *) action, (ub4) action_len, (ub4) OCI_ATTR_ACTION, OCI_G(err)));
+       PHP_OCI_CALL_RETURN(OCIATTRSET, OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->session, (ub4) OCI_HTYPE_SESSION, (dvoid *) action, (ub4) action_len, (ub4) OCI_ATTR_ACTION, OCI_G(err)));
 
        if (OCI_G(errcode) != OCI_SUCCESS) {
                php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC);
@@ -1871,7 +1871,7 @@ PHP_FUNCTION(oci_set_action)
 /* }}} */
 
 /* {{{ proto bool oci_set_client_info(resource connection, string value)
-  Sets the client info attribute on the connection */
+  Sets the client info attribute on the connection  for end-to-end tracing */
 PHP_FUNCTION(oci_set_client_info)
 {
 #if (OCI_MAJOR_VERSION >= 10)
@@ -1886,7 +1886,7 @@ PHP_FUNCTION(oci_set_client_info)
 
        PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection);
 
-       PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->session, (ub4) OCI_HTYPE_SESSION, (dvoid *) client_info, (ub4) client_info_len, (ub4) OCI_ATTR_CLIENT_INFO, OCI_G(err)));
+       PHP_OCI_CALL_RETURN(OCIATTRSET, OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->session, (ub4) OCI_HTYPE_SESSION, (dvoid *) client_info, (ub4) client_info_len, (ub4) OCI_ATTR_CLIENT_INFO, OCI_G(err)));
 
        if (OCI_G(errcode) != OCI_SUCCESS) {
                php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC);
@@ -1957,7 +1957,7 @@ PHP_FUNCTION(oci_password_change)
                if (!connection) {
                        RETURN_FALSE;
                }
-               RETURN_RESOURCE(connection->rsrc_id);
+               RETURN_RESOURCE(connection->id);
        }
        WRONG_PARAM_COUNT;
 }
@@ -2395,6 +2395,32 @@ PHP_FUNCTION(oci_new_collection)
 }
 /* }}} */
 
+/* {{{ proto bool oci_get_implicit(resource stmt)
+   Get the next statement resource from an Oracle 12c PL/SQL Implicit Result Set */
+PHP_FUNCTION(oci_get_implicit_resultset)
+{
+       zval *z_statement;
+       php_oci_statement *statement;
+       php_oci_statement *imp_statement;
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &z_statement) == FAILURE) {
+               return;
+       }
+
+       PHP_OCI_ZVAL_TO_STATEMENT(z_statement, statement);
+
+       imp_statement = php_oci_get_implicit_resultset(statement);
+
+       if (imp_statement) {
+               if (php_oci_statement_execute(imp_statement, (ub4)OCI_DEFAULT TSRMLS_CC))
+                       RETURN_FALSE;
+               RETURN_RESOURCE(imp_statement->id);
+       }
+       RETURN_FALSE;
+}
+
+/* }}} */
+
 #endif /* HAVE_OCI8 */
 
 /*
index d05e05391921719435e203c4c32700101efe2e0c..bd5b7065f431e91c39399462d4a1e51464e390b7 100644 (file)
@@ -70,9 +70,9 @@ php_oci_descriptor *php_oci_lob_create (php_oci_connection *connection, long typ
        descriptor = ecalloc(1, sizeof(php_oci_descriptor));
        descriptor->type = type;
        descriptor->connection = connection;
-       zend_list_addref(descriptor->connection->rsrc_id);
+       zend_list_addref(descriptor->connection->id);
 
-       PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIDescriptorAlloc, (connection->env, (dvoid*)&(descriptor->descriptor), descriptor->type, (size_t) 0, (dvoid **) 0));
+       PHP_OCI_CALL_RETURN(OCIDESCRIPTORALLOC, OCI_G(errcode), OCIDescriptorAlloc, (connection->env, (dvoid*)&(descriptor->descriptor), descriptor->type, (size_t) 0, (dvoid **) 0));
 
        if (OCI_G(errcode) != OCI_SUCCESS) {
                OCI_G(errcode) = php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC);
@@ -109,7 +109,8 @@ php_oci_descriptor *php_oci_lob_create (php_oci_connection *connection, long typ
        }
        return descriptor;
 
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_lob_get_length()
  Get length of the LOB. The length is cached so we don't need to ask Oracle every time */
@@ -124,7 +125,7 @@ int php_oci_lob_get_length (php_oci_descriptor *descriptor, ub4 *length TSRMLS_D
                return 0;
        } else {
                if (descriptor->type == OCI_DTYPE_FILE) {
-                       PHP_OCI_CALL_RETURN(connection->errcode, OCILobFileOpen, (connection->svc, connection->err, descriptor->descriptor, OCI_FILE_READONLY));
+                       PHP_OCI_CALL_RETURN(OCILOBFILEOPEN, connection->errcode, OCILobFileOpen, (connection->svc, connection->err, descriptor->descriptor, OCI_FILE_READONLY));
                        if (connection->errcode != OCI_SUCCESS) {
                                connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
                                PHP_OCI_HANDLE_ERROR(connection, connection->errcode);
@@ -132,7 +133,7 @@ int php_oci_lob_get_length (php_oci_descriptor *descriptor, ub4 *length TSRMLS_D
                        }
                }
                
-               PHP_OCI_CALL_RETURN(connection->errcode, OCILobGetLength, (connection->svc, connection->err, descriptor->descriptor, (ub4 *)length));
+               PHP_OCI_CALL_RETURN(OCILOBGETLENGTH, connection->errcode, OCILobGetLength, (connection->svc, connection->err, descriptor->descriptor, (ub4 *)length));
 
                if (connection->errcode != OCI_SUCCESS) {
                        connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
@@ -143,7 +144,7 @@ int php_oci_lob_get_length (php_oci_descriptor *descriptor, ub4 *length TSRMLS_D
                descriptor->lob_size = *length;
 
                if (descriptor->type == OCI_DTYPE_FILE) {
-                       PHP_OCI_CALL_RETURN(connection->errcode, OCILobFileClose, (connection->svc, connection->err, descriptor->descriptor));
+                       PHP_OCI_CALL_RETURN(OCILOBFILECLOSE, connection->errcode, OCILobFileClose, (connection->svc, connection->err, descriptor->descriptor));
 
                        if (connection->errcode != OCI_SUCCESS) {
                                connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
@@ -153,7 +154,8 @@ int php_oci_lob_get_length (php_oci_descriptor *descriptor, ub4 *length TSRMLS_D
                }
        }
        return 0;       
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_lob_callback()
    Append LOB portion to a memory buffer */
@@ -203,7 +205,8 @@ sb4 php_oci_lob_callback (dvoid *ctxp, CONST dvoid *bufxp, ub4 len, ub1 piece)
 }
 /* }}} */
 
-/* {{{ php_oci_lob_calculate_buffer() */
+/* {{{ php_oci_lob_calculate_buffer() 
+   Work out the size for LOB buffering */
 static inline int php_oci_lob_calculate_buffer(php_oci_descriptor *descriptor, long read_length TSRMLS_DC)
 {
        php_oci_connection *connection = descriptor->connection;
@@ -214,7 +217,7 @@ static inline int php_oci_lob_calculate_buffer(php_oci_descriptor *descriptor, l
        }
 
        if (!descriptor->chunk_size) {
-               PHP_OCI_CALL_RETURN(connection->errcode, OCILobGetChunkSize, (connection->svc, connection->err, descriptor->descriptor, &chunk_size));
+               PHP_OCI_CALL_RETURN(OCILOBGETCHUNKSIZE, connection->errcode, OCILobGetChunkSize, (connection->svc, connection->err, descriptor->descriptor, &chunk_size));
 
                if (connection->errcode != OCI_SUCCESS) {
                        connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
@@ -286,7 +289,7 @@ int php_oci_lob_read (php_oci_descriptor *descriptor, long read_length, long ini
        offset = initial_offset;
 
        if (descriptor->type == OCI_DTYPE_FILE) {
-               PHP_OCI_CALL_RETURN(connection->errcode, OCILobFileOpen, (connection->svc, connection->err, descriptor->descriptor, OCI_FILE_READONLY));
+               PHP_OCI_CALL_RETURN(OCILOBFILEOPEN, connection->errcode, OCILobFileOpen, (connection->svc, connection->err, descriptor->descriptor, OCI_FILE_READONLY));
 
                if (connection->errcode != OCI_SUCCESS) {
                        connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
@@ -296,7 +299,7 @@ int php_oci_lob_read (php_oci_descriptor *descriptor, long read_length, long ini
        } else {
                ub2 charset_id = 0;
 
-               PHP_OCI_CALL_RETURN(connection->errcode, OCILobCharSetId, (connection->env, connection->err, descriptor->descriptor, &charset_id));
+               PHP_OCI_CALL_RETURN(OCILOBCHARSETID, connection->errcode, OCILobCharSetId, (connection->env, connection->err, descriptor->descriptor, &charset_id));
 
                if (connection->errcode != OCI_SUCCESS) {
                        connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
@@ -310,7 +313,7 @@ int php_oci_lob_read (php_oci_descriptor *descriptor, long read_length, long ini
        }
 
        if (is_clob) {
-               PHP_OCI_CALL_RETURN(connection->errcode, OCINlsNumericInfoGet, (connection->env, connection->err, &bytes_per_char, OCI_NLS_CHARSET_MAXBYTESZ));
+               PHP_OCI_CALL_RETURN(OCINLSNUMERICINFOGET, connection->errcode, OCINlsNumericInfoGet, (connection->env, connection->err, &bytes_per_char, OCI_NLS_CHARSET_MAXBYTESZ));
 
                if (connection->errcode != OCI_SUCCESS) {
                        connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
@@ -337,7 +340,7 @@ int php_oci_lob_read (php_oci_descriptor *descriptor, long read_length, long ini
        buffer_size = php_oci_lob_calculate_buffer(descriptor, buffer_size TSRMLS_CC);  /* use chunk size */
 
        bufp = (ub1 *) ecalloc(1, buffer_size);
-       PHP_OCI_CALL_RETURN(connection->errcode, OCILobRead2,
+       PHP_OCI_CALL_RETURN(OCILOBREAD2, connection->errcode, OCILobRead2,
                (
                        connection->svc,
                        connection->err,
@@ -370,7 +373,7 @@ int php_oci_lob_read (php_oci_descriptor *descriptor, long read_length, long ini
        buffer_size = php_oci_lob_calculate_buffer(descriptor, buffer_size TSRMLS_CC);  /* use chunk size */
 
        bufp = (ub1 *) ecalloc(1, buffer_size);
-       PHP_OCI_CALL_RETURN(connection->errcode, OCILobRead,
+       PHP_OCI_CALL_RETURN(OCILOBREAD, connection->errcode, OCILobRead,
                (
                         connection->svc,
                         connection->err,
@@ -405,7 +408,7 @@ int php_oci_lob_read (php_oci_descriptor *descriptor, long read_length, long ini
        descriptor->lob_current_position = (int)offset;
 
        if (descriptor->type == OCI_DTYPE_FILE) {
-               PHP_OCI_CALL_RETURN(connection->errcode, OCILobFileClose, (connection->svc, connection->err, descriptor->descriptor));
+               PHP_OCI_CALL_RETURN(OCILOBFILECLOSE, connection->errcode, OCILobFileClose, (connection->svc, connection->err, descriptor->descriptor));
 
                if (connection->errcode != OCI_SUCCESS) {
                        connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
@@ -420,7 +423,8 @@ int php_oci_lob_read (php_oci_descriptor *descriptor, long read_length, long ini
        }
 
        return 0;
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_lob_write()
  Write data to the LOB */
@@ -447,7 +451,7 @@ int php_oci_lob_write (php_oci_descriptor *descriptor, ub4 offset, char *data, i
                offset = descriptor->lob_current_position;
        }
        
-       PHP_OCI_CALL_RETURN(connection->errcode, OCILobWrite,
+       PHP_OCI_CALL_RETURN(OCILOBWRITE, connection->errcode, OCILobWrite,
                        (
                                connection->svc,
                                connection->err,
@@ -483,7 +487,8 @@ int php_oci_lob_write (php_oci_descriptor *descriptor, ub4 offset, char *data, i
        }
        
        return 0;
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_lob_set_buffering()
  Turn buffering off/onn for this particular LOB */
@@ -502,9 +507,9 @@ int php_oci_lob_set_buffering (php_oci_descriptor *descriptor, int on_off TSRMLS
        }
        
        if (on_off) {
-               PHP_OCI_CALL_RETURN(connection->errcode, OCILobEnableBuffering, (connection->svc, connection->err, descriptor->descriptor));
+               PHP_OCI_CALL_RETURN(OCILOBENABLEBUFFERING, connection->errcode, OCILobEnableBuffering, (connection->svc, connection->err, descriptor->descriptor));
        } else {
-               PHP_OCI_CALL_RETURN(connection->errcode, OCILobDisableBuffering, (connection->svc, connection->err, descriptor->descriptor));
+               PHP_OCI_CALL_RETURN(OCILOBDISABLEBUFFERING, connection->errcode, OCILobDisableBuffering, (connection->svc, connection->err, descriptor->descriptor));
        }
 
        if (connection->errcode != OCI_SUCCESS) {
@@ -514,7 +519,8 @@ int php_oci_lob_set_buffering (php_oci_descriptor *descriptor, int on_off TSRMLS
        }
        descriptor->buffering = on_off ? PHP_OCI_LOB_BUFFER_ENABLED : PHP_OCI_LOB_BUFFER_DISABLED;
        return 0;
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_lob_get_buffering()
  Return current buffering state for the LOB */
@@ -525,7 +531,8 @@ int php_oci_lob_get_buffering (php_oci_descriptor *descriptor)
        } else {
                return 0;
        }
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_lob_copy()
  Copy one LOB (or its part) to another one */
@@ -553,7 +560,7 @@ int php_oci_lob_copy (php_oci_descriptor *descriptor_dest, php_oci_descriptor *d
                return 1;
        }
 
-       PHP_OCI_CALL_RETURN(connection->errcode, OCILobCopy,
+       PHP_OCI_CALL_RETURN(OCILOBCOPY, connection->errcode, OCILobCopy,
                        (
                         connection->svc,
                         connection->err,
@@ -572,7 +579,8 @@ int php_oci_lob_copy (php_oci_descriptor *descriptor_dest, php_oci_descriptor *d
        }
        
        return 0;
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_lob_close()
  Close LOB */
@@ -581,7 +589,7 @@ int php_oci_lob_close (php_oci_descriptor *descriptor TSRMLS_DC)
        php_oci_connection *connection = descriptor->connection;
        
        if (descriptor->is_open) {
-               PHP_OCI_CALL_RETURN(connection->errcode, OCILobClose, (connection->svc, connection->err, descriptor->descriptor));
+               PHP_OCI_CALL_RETURN(OCILOBCLOSE, connection->errcode, OCILobClose, (connection->svc, connection->err, descriptor->descriptor));
        }
 
        if (connection->errcode != OCI_SUCCESS) {
@@ -595,7 +603,8 @@ int php_oci_lob_close (php_oci_descriptor *descriptor TSRMLS_DC)
        }
        
        return 0;
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_temp_lob_close()
    Close Temporary LOB */
@@ -604,7 +613,7 @@ int php_oci_temp_lob_close (php_oci_descriptor *descriptor TSRMLS_DC)
        php_oci_connection *connection = descriptor->connection;
        int is_temporary;
 
-       PHP_OCI_CALL_RETURN(connection->errcode, OCILobIsTemporary, (connection->env,connection->err, descriptor->descriptor, &is_temporary));
+       PHP_OCI_CALL_RETURN(OCILOBISTEMPORARY, connection->errcode, OCILobIsTemporary, (connection->env,connection->err, descriptor->descriptor, &is_temporary));
        
        if (connection->errcode != OCI_SUCCESS) {
                connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
@@ -613,7 +622,7 @@ int php_oci_temp_lob_close (php_oci_descriptor *descriptor TSRMLS_DC)
        }
        
        if (is_temporary) {
-               PHP_OCI_CALL_RETURN(connection->errcode, OCILobFreeTemporary, (connection->svc, connection->err, descriptor->descriptor));
+               PHP_OCI_CALL_RETURN(OCILOBFREETEMPORARY, connection->errcode, OCILobFreeTemporary, (connection->svc, connection->err, descriptor->descriptor));
                
                if (connection->errcode != OCI_SUCCESS) {
                        connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
@@ -622,8 +631,8 @@ int php_oci_temp_lob_close (php_oci_descriptor *descriptor TSRMLS_DC)
                }
        }
        return 0;
-} /* }}} */
-
+}
+/* }}} */
 
 /* {{{ php_oci_lob_flush()
  Flush buffers for the LOB (only if they have been used) */
@@ -654,7 +663,7 @@ int php_oci_lob_flush(php_oci_descriptor *descriptor, long flush_flag TSRMLS_DC)
                return 0;
        }
 
-       PHP_OCI_CALL_RETURN(connection->errcode, OCILobFlushBuffer, (connection->svc, connection->err, lob, flush_flag));
+       PHP_OCI_CALL_RETURN(OCILOBFLUSHBUFFER, connection->errcode, OCILobFlushBuffer, (connection->svc, connection->err, lob, flush_flag));
 
        if (connection->errcode != OCI_SUCCESS) {
                connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
@@ -665,7 +674,8 @@ int php_oci_lob_flush(php_oci_descriptor *descriptor, long flush_flag TSRMLS_DC)
        /* marking buffer as enabled and not used */
        descriptor->buffering = PHP_OCI_LOB_BUFFER_ENABLED;
        return 0;
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_lob_free()
  Close LOB descriptor and free associated resources */
@@ -707,11 +717,12 @@ void php_oci_lob_free (php_oci_descriptor *descriptor TSRMLS_DC)
                php_oci_temp_lob_close(descriptor TSRMLS_CC);
        }
 
-       PHP_OCI_CALL(OCIDescriptorFree, (descriptor->descriptor, descriptor->type));
+       PHP_OCI_CALL(OCIDESCRIPTORFREE, OCIDescriptorFree, (descriptor->descriptor, descriptor->type));
 
-       zend_list_delete(descriptor->connection->rsrc_id);
+       zend_list_delete(descriptor->connection->id);
        efree(descriptor);
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_lob_import()
  Import LOB contents from the given file */
@@ -739,7 +750,7 @@ int php_oci_lob_import (php_oci_descriptor *descriptor, char *filename TSRMLS_DC
        }
 
        while ((loblen = read(fp, &buf, sizeof(buf))) > 0) {    
-               PHP_OCI_CALL_RETURN(connection->errcode,
+               PHP_OCI_CALL_RETURN(OCILOBWRITE, connection->errcode,
                                OCILobWrite,
                                (
                                        connection->svc,
@@ -768,7 +779,8 @@ int php_oci_lob_import (php_oci_descriptor *descriptor, char *filename TSRMLS_DC
        close(fp);
        
        return 0;
-} /* }}} */
+}
+       /* }}} */
 
 /* {{{ php_oci_lob_append()
  Append data to the end of the LOB */
@@ -791,7 +803,7 @@ int php_oci_lob_append (php_oci_descriptor *descriptor_dest, php_oci_descriptor
                return 0;
        }
 
-       PHP_OCI_CALL_RETURN(connection->errcode, OCILobAppend, (connection->svc, connection->err, lob_dest, lob_from));
+       PHP_OCI_CALL_RETURN(OCILOBAPPEND, connection->errcode, OCILobAppend, (connection->svc, connection->err, lob_dest, lob_from));
 
        if (connection->errcode != OCI_SUCCESS) {
                connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
@@ -799,7 +811,8 @@ int php_oci_lob_append (php_oci_descriptor *descriptor_dest, php_oci_descriptor
                return 1;
        }
        return 0;
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_lob_truncate()
  Truncate LOB to the given length */
@@ -827,7 +840,7 @@ int php_oci_lob_truncate (php_oci_descriptor *descriptor, long new_lob_length TS
                return 1;
        }
        
-       PHP_OCI_CALL_RETURN(connection->errcode, OCILobTrim, (connection->svc, connection->err, lob, new_lob_length));
+       PHP_OCI_CALL_RETURN(OCILOBTRIM, connection->errcode, OCILobTrim, (connection->svc, connection->err, lob, new_lob_length));
 
        if (connection->errcode != OCI_SUCCESS) {
                connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
@@ -837,7 +850,8 @@ int php_oci_lob_truncate (php_oci_descriptor *descriptor, long new_lob_length TS
        
        descriptor->lob_size = new_lob_length;
        return 0;
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_lob_erase()
  Erase (or fill with whitespaces, depending on LOB type) the LOB (or its part) */
@@ -861,7 +875,7 @@ int php_oci_lob_erase (php_oci_descriptor *descriptor, long offset, ub4 length,
                length = lob_length;
        }
        
-       PHP_OCI_CALL_RETURN(connection->errcode, OCILobErase, (connection->svc, connection->err, lob, (ub4 *)&length, offset+1));
+       PHP_OCI_CALL_RETURN(OCILOBERASE, connection->errcode, OCILobErase, (connection->svc, connection->err, lob, (ub4 *)&length, offset+1));
 
        if (connection->errcode != OCI_SUCCESS) {
                connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
@@ -871,7 +885,8 @@ int php_oci_lob_erase (php_oci_descriptor *descriptor, long offset, ub4 length,
        
        *bytes_erased = length;
        return 0;
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_lob_is_equal()
  Compare two LOB descriptors and figure out if they are pointing to the same LOB */
@@ -881,7 +896,7 @@ int php_oci_lob_is_equal (php_oci_descriptor *descriptor_first, php_oci_descript
        OCILobLocator *first_lob   = descriptor_first->descriptor;
        OCILobLocator *second_lob  = descriptor_second->descriptor;
 
-       PHP_OCI_CALL_RETURN(connection->errcode, OCILobIsEqual, (connection->env, first_lob, second_lob, result));
+       PHP_OCI_CALL_RETURN(OCILOBISEQUAL, connection->errcode, OCILobIsEqual, (connection->env, first_lob, second_lob, result));
 
        if (connection->errcode) {
                connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
@@ -889,7 +904,8 @@ int php_oci_lob_is_equal (php_oci_descriptor *descriptor_first, php_oci_descript
                return 1;
        }
        return 0;
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_lob_write_tmp()
  Create temporary LOB and write data to it */
@@ -914,7 +930,7 @@ int php_oci_lob_write_tmp (php_oci_descriptor *descriptor, long type, char *data
                return 1;
        }
 
-       PHP_OCI_CALL_RETURN(connection->errcode, OCILobCreateTemporary,
+       PHP_OCI_CALL_RETURN(OCILOBCREATETEMPORARY, connection->errcode, OCILobCreateTemporary,
                        (
                         connection->svc,
                         connection->err,
@@ -933,7 +949,7 @@ int php_oci_lob_write_tmp (php_oci_descriptor *descriptor, long type, char *data
                return 1;
        }
 
-       PHP_OCI_CALL_RETURN(connection->errcode, OCILobOpen, (connection->svc, connection->err, lob, OCI_LOB_READWRITE));
+       PHP_OCI_CALL_RETURN(OCILOBOPEN, connection->errcode, OCILobOpen, (connection->svc, connection->err, lob, OCI_LOB_READWRITE));
 
        if (connection->errcode) {
                connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
@@ -944,7 +960,8 @@ int php_oci_lob_write_tmp (php_oci_descriptor *descriptor, long type, char *data
        descriptor->is_open = 1;
 
        return php_oci_lob_write(descriptor, 0, data, data_len, &bytes_written TSRMLS_CC);
-} /* }}} */
+}
+/* }}} */
 
 #endif /* HAVE_OCI8 */
 
index 89facb07034318f2a59232d181519a40588746d7..266262305f8c5b547857af92ec105652db663613 100644 (file)
@@ -43,7 +43,7 @@
 
 /* {{{ php_oci_statement_create()
  Create statemend handle and allocate necessary resources */
-php_oci_statement *php_oci_statement_create (php_oci_connection *connection, char *query, int query_len TSRMLS_DC)
+php_oci_statement *php_oci_statement_create(php_oci_connection *connection, char *query, int query_len TSRMLS_DC)
 {
        php_oci_statement *statement;
        
@@ -51,13 +51,19 @@ php_oci_statement *php_oci_statement_create (php_oci_connection *connection, cha
 
        if (!query_len) {
                /* do not allocate stmt handle for refcursors, we'll get it from OCIStmtPrepare2() */
-               PHP_OCI_CALL(OCIHandleAlloc, (connection->env, (dvoid **)&(statement->stmt), OCI_HTYPE_STMT, 0, NULL));
+               PHP_OCI_CALL(OCIHANDLEALLOC, OCIHandleAlloc, (connection->env, (dvoid **)&(statement->stmt), OCI_HTYPE_STMT, 0, NULL));
+       } else {
+#ifdef HAVE_DTRACE
+               if (DTRACE_OCI8_SQLTEXT_ENABLED()) {
+                       DTRACE_OCI8_SQLTEXT(query);
+               }
+#endif /* HAVE_DTRACE */
        }
                        
-       PHP_OCI_CALL(OCIHandleAlloc, (connection->env, (dvoid **)&(statement->err), OCI_HTYPE_ERROR, 0, NULL));
+       PHP_OCI_CALL(OCIHANDLEALLOC, OCIHandleAlloc, (connection->env, (dvoid **)&(statement->err), OCI_HTYPE_ERROR, 0, NULL));
        
        if (query_len > 0) {
-               PHP_OCI_CALL_RETURN(connection->errcode, OCIStmtPrepare2,
+               PHP_OCI_CALL_RETURN(OCISTMTPREPARE2, connection->errcode, OCIStmtPrepare2,
                                (
                                 connection->svc,
                                 &(statement->stmt),
@@ -73,8 +79,8 @@ php_oci_statement *php_oci_statement_create (php_oci_connection *connection, cha
                if (connection->errcode != OCI_SUCCESS) {
                        connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
 
-                       PHP_OCI_CALL(OCIStmtRelease, (statement->stmt, statement->err, NULL, 0, statement->errcode ? OCI_STRLS_CACHE_DELETE : OCI_DEFAULT));
-                       PHP_OCI_CALL(OCIHandleFree,(statement->err, OCI_HTYPE_ERROR));
+                       PHP_OCI_CALL(OCISTMTRELEASE, OCIStmtRelease, (statement->stmt, statement->err, NULL, 0, statement->errcode ? OCI_STRLS_CACHE_DELETE : OCI_DEFAULT));
+                       PHP_OCI_CALL(OCIHANDLEFREE, OCIHandleFree,(statement->err, OCI_HTYPE_ERROR));
                        
                        efree(statement);
                        PHP_OCI_HANDLE_ERROR(connection, connection->errcode);
@@ -95,7 +101,10 @@ php_oci_statement *php_oci_statement_create (php_oci_connection *connection, cha
        statement->has_data = 0;
        statement->has_descr = 0;
        statement->parent_stmtid = 0;
-       zend_list_addref(statement->connection->rsrc_id);
+       statement->impres_child_stmt = NULL;
+       statement->impres_count = 0;
+       statement->impres_flag = PHP_OCI_IMPRES_UNKNOWN;  /* may or may not have Implicit Result Set children */
+       zend_list_addref(statement->connection->id);
 
        if (OCI_G(default_prefetch) >= 0) {
                php_oci_statement_set_prefetch(statement, OCI_G(default_prefetch) TSRMLS_CC);
@@ -109,6 +118,66 @@ php_oci_statement *php_oci_statement_create (php_oci_connection *connection, cha
 }
 /* }}} */
 
+/* {{{ php_oci_get_implicit_resultset()
+   Fetch implicit result set statement resource */
+php_oci_statement *php_oci_get_implicit_resultset(php_oci_statement *statement TSRMLS_DC)
+{
+       void    *result;
+       ub4      rtype;
+       php_oci_statement *statement2;  /* implicit result set statement handle */
+
+#if (OCI_MAJOR_VERSION < 12)
+       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Implicit results are available in Oracle Database 12c onwards");
+       return NULL;
+#else
+       PHP_OCI_CALL_RETURN(OCISTMTGETNEXTRESULT, statement->errcode, OCIStmtGetNextResult, (statement->stmt, statement->err, &result, &rtype, OCI_DEFAULT));
+       if (statement->errcode == OCI_NO_DATA) {
+               return NULL;
+       }
+
+       if (rtype != OCI_RESULT_TYPE_SELECT) {
+               /* Only OCI_RESULT_TYPE_SELECT is supported by Oracle DB 12cR1 */
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unexpected implicit result type returned from Oracle Database");
+               return NULL;
+       } else {
+               statement2 = ecalloc(1,sizeof(php_oci_statement));
+
+               PHP_OCI_CALL(OCIHANDLEALLOC, OCIHandleAlloc, (statement->connection->env, (dvoid **)&(statement2->err), OCI_HTYPE_ERROR, 0, NULL));
+               statement2->stmt = (OCIStmt *)result;   
+               statement2->parent_stmtid = statement->id;
+               statement2->impres_child_stmt = NULL;
+               statement2->impres_count = 0;
+               statement2->impres_flag = PHP_OCI_IMPRES_IS_CHILD;
+               statement2->connection = statement->connection;
+               statement2->errcode = 0;
+               statement2->last_query = NULL;
+               statement2->last_query_len = 0;
+               statement2->columns = NULL;
+               statement2->binds = NULL;
+               statement2->defines = NULL;
+               statement2->ncolumns = 0;
+               statement2->executed = 0;
+               statement2->has_data = 0;
+               statement2->has_descr = 0;
+               statement2->stmttype = 0;
+
+               zend_list_addref(statement->id);
+               zend_list_addref(statement2->connection->id);
+
+               if (OCI_G(default_prefetch) >= 0) {
+                       php_oci_statement_set_prefetch(statement2, OCI_G(default_prefetch) TSRMLS_CC);
+               }
+               
+               PHP_OCI_REGISTER_RESOURCE(statement2, le_statement);
+       
+               OCI_G(num_statements)++;
+               
+               return statement2;
+       }
+#endif /* OCI_MAJOR_VERSION < 12 */
+}
+/* }}} */
+
 /* {{{ php_oci_statement_set_prefetch()
  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)
@@ -120,7 +189,7 @@ int php_oci_statement_set_prefetch(php_oci_statement *statement, long size TSRML
                return 1;
        }
        
-       PHP_OCI_CALL_RETURN(statement->errcode, OCIAttrSet, (statement->stmt, OCI_HTYPE_STMT, &prefetch, 0, OCI_ATTR_PREFETCH_ROWS, statement->err));
+       PHP_OCI_CALL_RETURN(OCIATTRSET, statement->errcode, OCIAttrSet, (statement->stmt, OCI_HTYPE_STMT, &prefetch, 0, OCI_ATTR_PREFETCH_ROWS, statement->err));
        
        if (statement->errcode != OCI_SUCCESS) {
                statement->errcode = php_oci_error(statement->err, statement->errcode TSRMLS_CC);
@@ -163,8 +232,8 @@ int php_oci_cleanup_pre_fetch(void *data TSRMLS_DC)
        }
        return ZEND_HASH_APPLY_KEEP;
 
-} /* }}} */
-
+}
+/* }}} */
 
 /* {{{ php_oci_statement_fetch()
  Fetch a row from the statement */
@@ -182,7 +251,7 @@ int php_oci_statement_fetch(php_oci_statement *statement, ub4 nrows TSRMLS_DC)
                zend_hash_apply(statement->columns, (apply_func_t) php_oci_cleanup_pre_fetch TSRMLS_CC);
     }
 
-       PHP_OCI_CALL_RETURN(statement->errcode, OCIStmtFetch, (statement->stmt, statement->err, nrows, OCI_FETCH_NEXT, OCI_DEFAULT));
+       PHP_OCI_CALL_RETURN(OCISTMTFETCH, statement->errcode, OCIStmtFetch, (statement->stmt, statement->err, nrows, OCI_FETCH_NEXT, OCI_DEFAULT));
 
        if ( statement->errcode == OCI_NO_DATA || nrows == 0 ) {
                if (statement->last_query == NULL) {
@@ -209,7 +278,7 @@ int php_oci_statement_fetch(php_oci_statement *statement, ub4 nrows TSRMLS_DC)
        /* reset length for all piecewise columns */
        for (i = 0; i < statement->ncolumns; i++) {
                column = php_oci_statement_get_column(statement, i + 1, NULL, 0 TSRMLS_CC);
-               if (column->piecewise) {
+               if (column && column->piecewise) {
                        column->retlen4 = 0;
                        piecewisecols = 1;
                }
@@ -217,7 +286,7 @@ int php_oci_statement_fetch(php_oci_statement *statement, ub4 nrows TSRMLS_DC)
        
        while (statement->errcode == OCI_NEED_DATA) {
                if (piecewisecols) {
-                       PHP_OCI_CALL_RETURN(statement->errcode,
+                       PHP_OCI_CALL_RETURN(OCISTMTGETPIECEINFO,statement->errcode,
                                OCIStmtGetPieceInfo,
                                   (
                                        statement->stmt,
@@ -234,7 +303,7 @@ int php_oci_statement_fetch(php_oci_statement *statement, ub4 nrows TSRMLS_DC)
                        /* scan through our columns for a piecewise column with a matching handle */
                        for (i = 0; i < statement->ncolumns; i++) {
                                column = php_oci_statement_get_column(statement, i + 1, NULL, 0 TSRMLS_CC);
-                               if (column->piecewise && handlepp == column->oci_define)   {
+                               if (column && column->piecewise && handlepp == column->oci_define)   {
                                        if (!column->data) {
                                                column->data = (text *) ecalloc(1, PHP_OCI_PIECE_SIZE + 1);
                                        } else {
@@ -243,7 +312,7 @@ int php_oci_statement_fetch(php_oci_statement *statement, ub4 nrows TSRMLS_DC)
                                        column->cb_retlen = PHP_OCI_PIECE_SIZE;
 
                                        /* and instruct fetch to fetch waiting piece into our buffer */
-                                       PHP_OCI_CALL(OCIStmtSetPieceInfo,
+                                       PHP_OCI_CALL(OCISTMTSETPIECEINFO, OCIStmtSetPieceInfo,
                                                   (
                                                        (void *) column->oci_define,
                                                        OCI_HTYPE_DEFINE,
@@ -259,7 +328,7 @@ int php_oci_statement_fetch(php_oci_statement *statement, ub4 nrows TSRMLS_DC)
                        }
                }
 
-               PHP_OCI_CALL_RETURN(statement->errcode,  OCIStmtFetch, (statement->stmt, statement->err, nrows, OCI_FETCH_NEXT, OCI_DEFAULT));
+               PHP_OCI_CALL_RETURN(OCISTMTFETCH, statement->errcode, OCIStmtFetch, (statement->stmt, statement->err, nrows, OCI_FETCH_NEXT, OCI_DEFAULT));
 
                if (piecewisecols) {
                        for (i = 0; i < statement->ncolumns; i++) {
@@ -332,7 +401,7 @@ php_oci_out_column *php_oci_statement_get_column(php_oci_statement *statement, l
 }
 /* }}} */
 
-/* php_oci_define_callback() {{{ */
+/* {{{ php_oci_define_callback() */
 sb4 php_oci_define_callback(dvoid *ctx, OCIDefine *define, ub4 iter, dvoid **bufpp, ub4 **alenpp, ub1 *piecep, dvoid **indpp, ub2 **rcpp)
 {
        php_oci_out_column *outcol = (php_oci_out_column *)ctx;
@@ -421,6 +490,11 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC)
                case OCI_DESCRIBE_ONLY:
                case OCI_DEFAULT:
                        /* only these are allowed */
+#ifdef HAVE_DTRACE
+                       if (DTRACE_OCI8_EXECUTE_MODE_ENABLED()) {
+                               DTRACE_OCI8_EXECUTE_MODE(mode);
+                       }
+#endif /* HAVE_DTRACE */
                        break;
                default:
                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid execute mode given: %d", mode);
@@ -430,7 +504,7 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC)
        
        if (!statement->stmttype) {
                /* get statement type */
-               PHP_OCI_CALL_RETURN(statement->errcode, OCIAttrGet, ((dvoid *)statement->stmt, OCI_HTYPE_STMT, (ub2 *)&statement->stmttype, (ub4 *)0,   OCI_ATTR_STMT_TYPE,     statement->err));
+               PHP_OCI_CALL_RETURN(OCIATTRGET, statement->errcode, OCIAttrGet, ((dvoid *)statement->stmt, OCI_HTYPE_STMT, (ub2 *)&statement->stmttype, (ub4 *)0,       OCI_ATTR_STMT_TYPE,     statement->err));
 
                if (statement->errcode != OCI_SUCCESS) {
                        statement->errcode = php_oci_error(statement->err, statement->errcode TSRMLS_CC);
@@ -445,9 +519,7 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC)
                iters = 1;
        }
        
-       if (statement->last_query) {
-               /* if we execute refcursors we don't have a query and
-                  we don't want to execute!!! */
+       if (statement->last_query) { /* Don't execute REFCURSORS or Implicit Result Set handles */
 
                if (statement->binds) {
                        int result = 0;
@@ -458,7 +530,7 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC)
                }
 
                /* execute statement */
-               PHP_OCI_CALL_RETURN(statement->errcode, OCIStmtExecute, (statement->connection->svc,    statement->stmt, statement->err, iters, 0, NULL, NULL, mode));
+               PHP_OCI_CALL_RETURN(OCISTMTEXECUTE, statement->errcode, OCIStmtExecute, (statement->connection->svc,    statement->stmt, statement->err, iters, 0, NULL, NULL, mode));
 
                if (statement->errcode != OCI_SUCCESS) {
                        statement->errcode = php_oci_error(statement->err, statement->errcode TSRMLS_CC);
@@ -471,10 +543,18 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC)
                }
 
                if (mode & OCI_COMMIT_ON_SUCCESS) {
-                       statement->connection->needs_commit = 0;
-               } else {
-                       statement->connection->needs_commit = 1;
+                       /* No need to rollback on disconnect */
+                       statement->connection->rb_on_disconnect = 0;
+               } else if (statement->stmttype != OCI_STMT_SELECT) {
+                       /* Assume some uncommitted DML occurred */
+                       statement->connection->rb_on_disconnect = 1;
                }
+               /* else for SELECT with OCI_NO_AUTO_COMMIT, leave
+                * "rb_on_disconnect" at its previous value.  SELECT can't
+                * initiate uncommitted DML. (An AUTONOMOUS_TRANSACTION in
+                * invoked PL/SQL must explicitly rollback/commit else the
+                * SELECT fails).
+                */
        }
 
        if (statement->stmttype == OCI_STMT_SELECT && statement->executed == 0) {
@@ -487,7 +567,7 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC)
                counter = 1;
 
                /* get number of columns */
-               PHP_OCI_CALL_RETURN(statement->errcode, OCIAttrGet, ((dvoid *)statement->stmt, OCI_HTYPE_STMT, (dvoid *)&colcount, (ub4 *)0, OCI_ATTR_PARAM_COUNT, statement->err));
+               PHP_OCI_CALL_RETURN(OCIATTRGET, statement->errcode, OCIAttrGet, ((dvoid *)statement->stmt, OCI_HTYPE_STMT, (dvoid *)&colcount, (ub4 *)0, OCI_ATTR_PARAM_COUNT, statement->err));
                
                if (statement->errcode != OCI_SUCCESS) {
                        statement->errcode = php_oci_error(statement->err, statement->errcode TSRMLS_CC);
@@ -507,7 +587,7 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC)
                        }
                        
                        /* get column */
-                       PHP_OCI_CALL_RETURN(statement->errcode, OCIParamGet, ((dvoid *)statement->stmt, OCI_HTYPE_STMT, statement->err, (dvoid**)&param, counter));
+                       PHP_OCI_CALL_RETURN(OCIPARAMGET, statement->errcode, OCIParamGet, ((dvoid *)statement->stmt, OCI_HTYPE_STMT, statement->err, (dvoid**)&param, counter));
                        
                        if (statement->errcode != OCI_SUCCESS) {
                                statement->errcode = php_oci_error(statement->err, statement->errcode TSRMLS_CC);
@@ -516,40 +596,40 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC)
                        }
 
                        /* get column datatype */
-                       PHP_OCI_CALL_RETURN(statement->errcode, OCIAttrGet, ((dvoid *)param, OCI_DTYPE_PARAM, (dvoid *)&outcol->data_type, (ub4 *)0, OCI_ATTR_DATA_TYPE, statement->err));
+                       PHP_OCI_CALL_RETURN(OCIATTRGET, statement->errcode, OCIAttrGet, ((dvoid *)param, OCI_DTYPE_PARAM, (dvoid *)&outcol->data_type, (ub4 *)0, OCI_ATTR_DATA_TYPE, statement->err));
 
                        if (statement->errcode != OCI_SUCCESS) {
-                               PHP_OCI_CALL(OCIDescriptorFree, (param, OCI_DTYPE_PARAM));
+                               PHP_OCI_CALL(OCIDESCRIPTORFREE, OCIDescriptorFree, (param, OCI_DTYPE_PARAM));
                                statement->errcode = php_oci_error(statement->err, statement->errcode TSRMLS_CC);
                                PHP_OCI_HANDLE_ERROR(statement->connection, statement->errcode);
                                return 1;
                        }
 
                        /* get character set form  */
-                       PHP_OCI_CALL_RETURN(statement->errcode, OCIAttrGet, ((dvoid *)param, OCI_DTYPE_PARAM, (dvoid *)&outcol->charset_form, (ub4 *)0, OCI_ATTR_CHARSET_FORM, statement->err));
+                       PHP_OCI_CALL_RETURN(OCIATTRGET, statement->errcode, OCIAttrGet, ((dvoid *)param, OCI_DTYPE_PARAM, (dvoid *)&outcol->charset_form, (ub4 *)0, OCI_ATTR_CHARSET_FORM, statement->err));
 
                        if (statement->errcode != OCI_SUCCESS) {
-                               PHP_OCI_CALL(OCIDescriptorFree, (param, OCI_DTYPE_PARAM));
+                               PHP_OCI_CALL(OCIDESCRIPTORFREE, OCIDescriptorFree, (param, OCI_DTYPE_PARAM));
                                statement->errcode = php_oci_error(statement->err, statement->errcode TSRMLS_CC);
                                PHP_OCI_HANDLE_ERROR(statement->connection, statement->errcode);
                                return 1;
                        }
        
                        /* get character set id  */
-                       PHP_OCI_CALL_RETURN(statement->errcode, OCIAttrGet, ((dvoid *)param, OCI_DTYPE_PARAM, (dvoid *)&outcol->charset_id, (ub4 *)0, OCI_ATTR_CHARSET_ID, statement->err));
+                       PHP_OCI_CALL_RETURN(OCIATTRGET, statement->errcode, OCIAttrGet, ((dvoid *)param, OCI_DTYPE_PARAM, (dvoid *)&outcol->charset_id, (ub4 *)0, OCI_ATTR_CHARSET_ID, statement->err));
 
                        if (statement->errcode != OCI_SUCCESS) {
-                               PHP_OCI_CALL(OCIDescriptorFree, (param, OCI_DTYPE_PARAM));
+                               PHP_OCI_CALL(OCIDESCRIPTORFREE, OCIDescriptorFree, (param, OCI_DTYPE_PARAM));
                                statement->errcode = php_oci_error(statement->err, statement->errcode TSRMLS_CC);
                                PHP_OCI_HANDLE_ERROR(statement->connection, statement->errcode);
                                return 1;
                        }
        
                        /* get size of the column */
-                       PHP_OCI_CALL_RETURN(statement->errcode, OCIAttrGet, ((dvoid *)param, OCI_DTYPE_PARAM, (dvoid *)&outcol->data_size, (dvoid *)0, OCI_ATTR_DATA_SIZE, statement->err));
+                       PHP_OCI_CALL_RETURN(OCIATTRGET, statement->errcode, OCIAttrGet, ((dvoid *)param, OCI_DTYPE_PARAM, (dvoid *)&outcol->data_size, (dvoid *)0, OCI_ATTR_DATA_SIZE, statement->err));
                        
                        if (statement->errcode != OCI_SUCCESS) {
-                               PHP_OCI_CALL(OCIDescriptorFree, (param, OCI_DTYPE_PARAM));
+                               PHP_OCI_CALL(OCIDESCRIPTORFREE, OCIDescriptorFree, (param, OCI_DTYPE_PARAM));
                                statement->errcode = php_oci_error(statement->err, statement->errcode TSRMLS_CC);
                                PHP_OCI_HANDLE_ERROR(statement->connection, statement->errcode);
                                return 1;
@@ -559,39 +639,39 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC)
                        outcol->retlen = outcol->data_size;
 
                        /* get scale of the column */
-                       PHP_OCI_CALL_RETURN(statement->errcode, OCIAttrGet, ((dvoid *)param, OCI_DTYPE_PARAM, (dvoid *)&outcol->scale, (dvoid *)0, OCI_ATTR_SCALE, statement->err));
+                       PHP_OCI_CALL_RETURN(OCIATTRGET, statement->errcode, OCIAttrGet, ((dvoid *)param, OCI_DTYPE_PARAM, (dvoid *)&outcol->scale, (dvoid *)0, OCI_ATTR_SCALE, statement->err));
                        
                        if (statement->errcode != OCI_SUCCESS) {
-                               PHP_OCI_CALL(OCIDescriptorFree, (param, OCI_DTYPE_PARAM));
+                               PHP_OCI_CALL(OCIDESCRIPTORFREE, OCIDescriptorFree, (param, OCI_DTYPE_PARAM));
                                statement->errcode = php_oci_error(statement->err, statement->errcode TSRMLS_CC);
                                PHP_OCI_HANDLE_ERROR(statement->connection, statement->errcode);
                                return 1;
                        }
 
                        /* get precision of the column */
-                       PHP_OCI_CALL_RETURN(statement->errcode, OCIAttrGet, ((dvoid *)param, OCI_DTYPE_PARAM, (dvoid *)&outcol->precision, (dvoid *)0, OCI_ATTR_PRECISION, statement->err));
+                       PHP_OCI_CALL_RETURN(OCIATTRGET, statement->errcode, OCIAttrGet, ((dvoid *)param, OCI_DTYPE_PARAM, (dvoid *)&outcol->precision, (dvoid *)0, OCI_ATTR_PRECISION, statement->err));
                        
                        if (statement->errcode != OCI_SUCCESS) {
-                               PHP_OCI_CALL(OCIDescriptorFree, (param, OCI_DTYPE_PARAM));
+                               PHP_OCI_CALL(OCIDESCRIPTORFREE, OCIDescriptorFree, (param, OCI_DTYPE_PARAM));
                                statement->errcode = php_oci_error(statement->err, statement->errcode TSRMLS_CC);
                                PHP_OCI_HANDLE_ERROR(statement->connection, statement->errcode);
                                return 1;
                        }
                        
                        /* get name of the column */
-                       PHP_OCI_CALL_RETURN(statement->errcode, OCIAttrGet, ((dvoid *)param, OCI_DTYPE_PARAM, (dvoid **)&colname, (ub4 *)&outcol->name_len, (ub4)OCI_ATTR_NAME, statement->err));
+                       PHP_OCI_CALL_RETURN(OCIATTRGET, statement->errcode, OCIAttrGet, ((dvoid *)param, OCI_DTYPE_PARAM, (dvoid **)&colname, (ub4 *)&outcol->name_len, (ub4)OCI_ATTR_NAME, statement->err));
                        
                        if (statement->errcode != OCI_SUCCESS) {
-                               PHP_OCI_CALL(OCIDescriptorFree, (param, OCI_DTYPE_PARAM));
+                               PHP_OCI_CALL(OCIDESCRIPTORFREE, OCIDescriptorFree, (param, OCI_DTYPE_PARAM));
                                statement->errcode = php_oci_error(statement->err, statement->errcode TSRMLS_CC);
                                PHP_OCI_HANDLE_ERROR(statement->connection, statement->errcode);
                                return 1;
                        }
-                       PHP_OCI_CALL(OCIDescriptorFree, (param, OCI_DTYPE_PARAM));
+                       PHP_OCI_CALL(OCIDESCRIPTORFREE, OCIDescriptorFree, (param, OCI_DTYPE_PARAM));
 
                        outcol->name = estrndup((char*) colname, outcol->name_len);
 
-                       /* find a user-setted define */
+                       /* find a user-set define */
                        if (statement->defines) {
                                if (zend_hash_find(statement->defines,outcol->name,outcol->name_len,(void **) &outcol->define) == SUCCESS) {
                                        if (outcol->define->type) {
@@ -679,7 +759,7 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC)
                        }
 
                        if (dynamic == OCI_DYNAMIC_FETCH) {
-                               PHP_OCI_CALL_RETURN(statement->errcode,
+                               PHP_OCI_CALL_RETURN(OCIDEFINEBYPOS, statement->errcode,
                                        OCIDefineByPos,
                                        (
                                                statement->stmt,                                                        /* IN/OUT handle to the requested SQL query */
@@ -697,7 +777,7 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC)
                                );
 
                        } else {
-                               PHP_OCI_CALL_RETURN(statement->errcode,
+                               PHP_OCI_CALL_RETURN(OCIDEFINEBYPOS, statement->errcode,
                                        OCIDefineByPos,
                                        (
                                                statement->stmt,                                                        /* IN/OUT handle to the requested SQL query */
@@ -729,7 +809,7 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC)
                                case SQLT_BLOB:
                                case SQLT_CLOB:
                                case SQLT_BFILE:
-                                       PHP_OCI_CALL_RETURN(statement->errcode,
+                                       PHP_OCI_CALL_RETURN(OCIDEFINEDYNAMIC, statement->errcode,
                                                OCIDefineDynamic,
                                                (
                                                        outcol->oci_define,
@@ -752,10 +832,9 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC)
  Cancel statement */
 int php_oci_statement_cancel(php_oci_statement *statement TSRMLS_DC)
 {
-       
        return php_oci_statement_fetch(statement, 0 TSRMLS_CC);
-               
-/* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_statement_free()
  Destroy statement handle and free associated resources */
@@ -763,16 +842,16 @@ void php_oci_statement_free(php_oci_statement *statement TSRMLS_DC)
 {
        if (statement->stmt) {
                if (statement->last_query_len) { /* FIXME: magical */
-                       PHP_OCI_CALL(OCIStmtRelease, (statement->stmt, statement->err, NULL, 0, statement->errcode ? OCI_STRLS_CACHE_DELETE : OCI_DEFAULT));
-               } else {
-                       PHP_OCI_CALL(OCIHandleFree, (statement->stmt, OCI_HTYPE_STMT));
+                       PHP_OCI_CALL(OCISTMTRELEASE, OCIStmtRelease, (statement->stmt, statement->err, NULL, 0, statement->errcode ? OCI_STRLS_CACHE_DELETE : OCI_DEFAULT));
+               } else if (statement->impres_flag != PHP_OCI_IMPRES_IS_CHILD) {  /* Oracle doc says don't free Implicit Result Set handles */
+                       PHP_OCI_CALL(OCIHANDLEFREE, OCIHandleFree, (statement->stmt, OCI_HTYPE_STMT));
                }
-               statement->stmt = 0;
+               statement->stmt = NULL;
        }
 
        if (statement->err) {
-               PHP_OCI_CALL(OCIHandleFree, (statement->err, OCI_HTYPE_ERROR));
-               statement->err = 0;
+               PHP_OCI_CALL(OCIHANDLEFREE, OCIHandleFree, (statement->err, OCI_HTYPE_ERROR));
+               statement->err = NULL;
        }
 
        if (statement->last_query) {
@@ -798,11 +877,12 @@ void php_oci_statement_free(php_oci_statement *statement TSRMLS_DC)
                zend_list_delete(statement->parent_stmtid);
        }
 
-       zend_list_delete(statement->connection->rsrc_id);
+       zend_list_delete(statement->connection->id);
        efree(statement);
        
        OCI_G(num_statements)--;
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_bind_pre_exec()
  Helper function */
@@ -931,7 +1011,7 @@ int php_oci_bind_post_exec(void *data TSRMLS_DC)
                                        memset((void*)buff,0,sizeof(buff));
                                                        
                                        if ((i < bind->array.old_length) && (zend_hash_get_current_data(hash, (void **) &entry) != FAILURE)) {
-                                               PHP_OCI_CALL_RETURN(connection->errcode, OCIDateToText, (connection->err, &(((OCIDate *)(bind->array.elements))[i]), 0, 0, 0, 0, &buff_len, buff));
+                                               PHP_OCI_CALL_RETURN(OCIDATETOTEXT, connection->errcode, OCIDateToText, (connection->err, &(((OCIDate *)(bind->array.elements))[i]), 0, 0, 0, 0, &buff_len, buff));
                                                zval_dtor(*entry);
 
                                                if (connection->errcode != OCI_SUCCESS) {
@@ -943,7 +1023,7 @@ int php_oci_bind_post_exec(void *data TSRMLS_DC)
                                                }
                                                zend_hash_move_forward(hash);
                                        } else {
-                                               PHP_OCI_CALL_RETURN(connection->errcode, OCIDateToText, (connection->err, &(((OCIDate *)(bind->array.elements))[i]), 0, 0, 0, 0, &buff_len, buff));
+                                               PHP_OCI_CALL_RETURN(OCIDATETOTEXT, connection->errcode, OCIDateToText, (connection->err, &(((OCIDate *)(bind->array.elements))[i]), 0, 0, 0, 0, &buff_len, buff));
                                                if (connection->errcode != OCI_SUCCESS) {
                                                        connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
                                                        PHP_OCI_HANDLE_ERROR(connection, connection->errcode);
@@ -982,7 +1062,7 @@ int php_oci_bind_post_exec(void *data TSRMLS_DC)
 
 /* {{{ php_oci_bind_by_name()
  Bind zval to the given placeholder */
-int php_oci_bind_by_name(php_oci_statement *statement, char *name, int name_len, zvalvar, long maxlength, ub2 type TSRMLS_DC)
+int php_oci_bind_by_name(php_oci_statement *statement, char *name, int name_len, zval *var, long maxlength, ub2 type TSRMLS_DC)
 {
        php_oci_collection *bind_collection = NULL;
        php_oci_descriptor *bind_descriptor = NULL;
@@ -1117,7 +1197,7 @@ int php_oci_bind_by_name(php_oci_statement *statement, char *name, int name_len,
        bindp->type = type;
        zval_add_ref(&var);
        
-       PHP_OCI_CALL_RETURN(statement->errcode,
+       PHP_OCI_CALL_RETURN(OCIBINDBYNAME, statement->errcode,
                OCIBindByName,
                (
                        statement->stmt,                                 /* statement handle */
@@ -1144,7 +1224,7 @@ int php_oci_bind_by_name(php_oci_statement *statement, char *name, int name_len,
        }
 
        if (mode == OCI_DATA_AT_EXEC) {
-               PHP_OCI_CALL_RETURN(statement->errcode, OCIBindDynamic,
+               PHP_OCI_CALL_RETURN(OCIBINDDYNAMIC, statement->errcode, OCIBindDynamic,
                                (
                                 bindp->bind,
                                 statement->err,
@@ -1164,7 +1244,7 @@ int php_oci_bind_by_name(php_oci_statement *statement, char *name, int name_len,
 
        if (type == SQLT_NTY) {
                /* Bind object */
-               PHP_OCI_CALL_RETURN(statement->errcode, OCIBindObject,
+               PHP_OCI_CALL_RETURN(OCIBINDOBJECT, statement->errcode, OCIBindObject,
                                (
                                 bindp->bind,
                                 statement->err,
@@ -1184,7 +1264,8 @@ int php_oci_bind_by_name(php_oci_statement *statement, char *name, int name_len,
        }
        
        return 0;
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_bind_in_callback()
  Callback used when binding LOBs and VARCHARs */
@@ -1235,7 +1316,8 @@ sb4 php_oci_bind_in_callback(
        *piecep = OCI_ONE_PIECE; /* pass all data in one go */
 
        return OCI_CONTINUE;
-}/* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_bind_out_callback()
  Callback used when binding LOBs and VARCHARs */
@@ -1358,7 +1440,8 @@ php_oci_out_column *php_oci_statement_get_column_helper(INTERNAL_FUNCTION_PARAME
                zval_dtor(&tmp);
        }
        return column;
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_statement_get_type()
  Return type of the statement */
@@ -1368,7 +1451,7 @@ int php_oci_statement_get_type(php_oci_statement *statement, ub2 *type TSRMLS_DC
        
        *type = 0;
        
-       PHP_OCI_CALL_RETURN(statement->errcode, OCIAttrGet, ((dvoid *)statement->stmt, OCI_HTYPE_STMT, (ub2 *)&statement_type, (ub4 *)0, OCI_ATTR_STMT_TYPE, statement->err));
+       PHP_OCI_CALL_RETURN(OCIATTRGET, statement->errcode, OCIAttrGet, ((dvoid *)statement->stmt, OCI_HTYPE_STMT, (ub2 *)&statement_type, (ub4 *)0, OCI_ATTR_STMT_TYPE, statement->err));
 
        if (statement->errcode != OCI_SUCCESS) {
                statement->errcode = php_oci_error(statement->err, statement->errcode TSRMLS_CC);
@@ -1379,7 +1462,8 @@ int php_oci_statement_get_type(php_oci_statement *statement, ub2 *type TSRMLS_DC
        *type = statement_type;
 
        return 0;
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_statement_get_numrows()
  Get the number of rows fetched to the clientside (NOT the number of rows in the result set) */
@@ -1389,7 +1473,7 @@ int php_oci_statement_get_numrows(php_oci_statement *statement, ub4 *numrows TSR
        
        *numrows = 0;
        
-       PHP_OCI_CALL_RETURN(statement->errcode, OCIAttrGet, ((dvoid *)statement->stmt, OCI_HTYPE_STMT, (ub4 *)&statement_numrows, (ub4 *)0, OCI_ATTR_ROW_COUNT, statement->err));
+       PHP_OCI_CALL_RETURN(OCIATTRGET, statement->errcode, OCIAttrGet, ((dvoid *)statement->stmt, OCI_HTYPE_STMT, (ub4 *)&statement_numrows, (ub4 *)0, OCI_ATTR_ROW_COUNT, statement->err));
 
        if (statement->errcode != OCI_SUCCESS) {
                statement->errcode = php_oci_error(statement->err, statement->errcode TSRMLS_CC);
@@ -1400,11 +1484,12 @@ int php_oci_statement_get_numrows(php_oci_statement *statement, ub4 *numrows TSR
        *numrows = statement_numrows;
 
        return 0;
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_bind_array_by_name()
  Bind arrays to PL/SQL types */
-int php_oci_bind_array_by_name(php_oci_statement *statement, char *name, int name_len, zvalvar, long max_table_length, long maxlength, long type TSRMLS_DC)
+int php_oci_bind_array_by_name(php_oci_statement *statement, char *name, int name_len, zval *var, long max_table_length, long maxlength, long type TSRMLS_DC)
 {
        php_oci_bind *bind, *bindp;
 
@@ -1470,7 +1555,7 @@ int php_oci_bind_array_by_name(php_oci_statement *statement, char *name, int nam
 
        zval_add_ref(&var);
 
-       PHP_OCI_CALL_RETURN(statement->errcode,
+       PHP_OCI_CALL_RETURN(OCIBINDBYNAME, statement->errcode,
                                                        OCIBindByName,
                                                        (
                                                                statement->stmt,
@@ -1499,11 +1584,12 @@ int php_oci_bind_array_by_name(php_oci_statement *statement, char *name, int nam
        }
        efree(bind);
        return 0;
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_bind_array_helper_string()
  Bind arrays to PL/SQL types */
-php_oci_bind *php_oci_bind_array_helper_string(zvalvar, long max_table_length, long maxlength TSRMLS_DC)
+php_oci_bind *php_oci_bind_array_helper_string(zval *var, long max_table_length, long maxlength TSRMLS_DC)
 {
        php_oci_bind *bind;
        ub4 i;
@@ -1568,11 +1654,12 @@ php_oci_bind *php_oci_bind_array_helper_string(zval* var, long max_table_length,
        zend_hash_internal_pointer_reset(hash);
 
        return bind;
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_bind_array_helper_number()
  Bind arrays to PL/SQL types */
-php_oci_bind *php_oci_bind_array_helper_number(zvalvar, long max_table_length TSRMLS_DC)
+php_oci_bind *php_oci_bind_array_helper_number(zval *var, long max_table_length TSRMLS_DC)
 {
        php_oci_bind *bind;
        ub4 i;
@@ -1606,11 +1693,12 @@ php_oci_bind *php_oci_bind_array_helper_number(zval* var, long max_table_length
        zend_hash_internal_pointer_reset(hash);
 
        return bind;
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_bind_array_helper_double()
  Bind arrays to PL/SQL types */
-php_oci_bind *php_oci_bind_array_helper_double(zvalvar, long max_table_length TSRMLS_DC)
+php_oci_bind *php_oci_bind_array_helper_double(zval *var, long max_table_length TSRMLS_DC)
 {
        php_oci_bind *bind;
        ub4 i;
@@ -1644,11 +1732,12 @@ php_oci_bind *php_oci_bind_array_helper_double(zval* var, long max_table_length
        zend_hash_internal_pointer_reset(hash);
 
        return bind;
-} /* }}} */
+}
+/* }}} */
 
 /* {{{ php_oci_bind_array_helper_date()
  Bind arrays to PL/SQL types */
-php_oci_bind *php_oci_bind_array_helper_date(zvalvar, long max_table_length, php_oci_connection *connection TSRMLS_DC)
+php_oci_bind *php_oci_bind_array_helper_date(zval *var, long max_table_length, php_oci_connection *connection TSRMLS_DC)
 {
        php_oci_bind *bind;
        ub4 i;
@@ -1675,7 +1764,7 @@ php_oci_bind *php_oci_bind_array_helper_date(zval* var, long max_table_length, p
                if ((i < bind->array.current_length) && (zend_hash_get_current_data(hash, (void **) &entry) != FAILURE)) {
                        
                        convert_to_string_ex(entry);
-                       PHP_OCI_CALL_RETURN(connection->errcode, OCIDateFromText, (connection->err, (CONST text *)Z_STRVAL_PP(entry), Z_STRLEN_PP(entry), NULL, 0, NULL, 0, &oci_date));
+                       PHP_OCI_CALL_RETURN(OCIDATEFROMTEXT, connection->errcode, OCIDateFromText, (connection->err, (CONST text *)Z_STRVAL_PP(entry), Z_STRLEN_PP(entry), NULL, 0, NULL, 0, &oci_date));
 
                        if (connection->errcode != OCI_SUCCESS) {
                                /* failed to convert string to date */
@@ -1690,7 +1779,7 @@ php_oci_bind *php_oci_bind_array_helper_date(zval* var, long max_table_length, p
                        ((OCIDate *)bind->array.elements)[i] = oci_date;
                        zend_hash_move_forward(hash);
                } else {
-                       PHP_OCI_CALL_RETURN(connection->errcode, OCIDateFromText, (connection->err, (CONST text *)"01-JAN-00", sizeof("01-JAN-00")-1, NULL, 0, NULL, 0, &oci_date));
+                       PHP_OCI_CALL_RETURN(OCIDATEFROMTEXT, connection->errcode, OCIDateFromText, (connection->err, (CONST text *)"01-JAN-00", sizeof("01-JAN-00")-1, NULL, 0, NULL, 0, &oci_date));
 
                        if (connection->errcode != OCI_SUCCESS) {
                                /* failed to convert string to date */
@@ -1708,7 +1797,8 @@ php_oci_bind *php_oci_bind_array_helper_date(zval* var, long max_table_length, p
        zend_hash_internal_pointer_reset(hash);
 
        return bind;
-} /* }}} */
+}
+/* }}} */
 
 #endif /* HAVE_OCI8 */
 
index feadf1907b6a09c1dcd16769df43fda8ebb4d386..38bb5d4b4e22828206ccf0e6f02b72bc844d5a98 100644 (file)
@@ -6,7 +6,14 @@ 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. It can be built with PHP 4.3.9 to 5.x.  It can be linked with Oracle 9.2, 10, 11, or 12.1 client libraries.
+
+ <description>
+   This extension allows you to access Oracle Database. OCI8 2.0 can be
+   built with PHP 5.4 onwards. (OCI8 1.4 can be built with PHP 4.3.9
+   onwards). OCI8 can be linked with Oracle Database 9.2, 10, 11, or
+   12.1 client libraries.  Oracle's standard cross-version connectivity
+   applies.  For example PHP linked with Oracle Database 11.2 client
+   libraries can connect to Oracle Database 9.2 onwards.
  </description>
  <lead>
   <name>Christopher Jones</name>
@@ -18,7 +25,7 @@ http://pear.php.net/dtd/package-2.0.xsd">
   <name>Antony Dovgal</name>
   <user>tony2001</user>
   <email>tony2001@php.net</email>
-  <active>yes</active>
+  <active>no</active>
  </lead>
  <lead>
   <name>Wez Furlong</name>
@@ -33,21 +40,83 @@ http://pear.php.net/dtd/package-2.0.xsd">
   <active>no</active>
  </lead>
 
- <date>2013-07-08</date>
+ <date>2013-07-24</date>
  <time>12:00:00</time>
 
- <version>
-  <release>1.4.10</release>
-  <api>1.4.10</api>
- </version>
- <stability>
-  <release>stable</release>
-  <api>stable</api>
- </stability>
- <license uri="http://www.php.net/license">PHP</license>
- <notes>
-   Bump PECL package info version check to allow PECL installs with PHP 5.5+
- </notes>
+  <version>
+   <release>2.0.0</release>
+   <api>2.0.0</api>
+  </version>
+  <stability>
+   <release>devel</release>
+   <api>devel</api>
+  </stability>
+  <license uri="http://www.php.net/license">PHP</license>
+  <notes> 
+    - NEW FUNCTIONALITY:
+      - Added Implicit Result Set support for Oracle Database 12c.
+       Streaming of all IRS's returned from a PL/SQL block is available
+       via oci_fetch_array, oci_fetch_assoc, oci_fetch_object and
+       oci_fetch_row (but not oci_fetch or oci_fetch_all).
+       Alternatively individual IRS statement resources can be obtained
+       with the new function 'oci_get_implicit_resultset' and passed to
+       any oci_fetch_* function.
+
+      - Added DTrace probes enabled with PHP's generic --enable-dtrace
+
+    - IMPROVED FUNCTIONALITY:
+      - Using 'oci_execute($s, OCI_NO_AUTO_COMMIT)' for a SELECT no
+       longer unnecessarily initiates an internal ROLLBACK during
+       connection close.  This can improve overall scalability by
+       reducing "round trips" between PHP and the database.
+    - CHANGED FUNCTIONALITY:
+      - PHPINFO() CHANGES:
+        - The oci8.event and oci8.connection_class values are now shown
+          only when the Oracle client libraries support the respective
+          functionality.
+        - Connection statistics are now in a separate phpinfo() table.
+        - Temporary LOB and Collection support status lines in
+          phpinfo() were removed.  These features have always been
+          enabled since 2007.
+      - OCI_INTERNAL_DEBUG() CHANGES:
+        - The oci_internal_debug() function is now a no-op.  Use PHP's
+          --enable-dtrace functionality with DTrace or SystemTap instead.
+    - INTERNAL CHANGES:
+      - Fixed a potential NULL pointer dereference flagged by Parfait
+        static code analyis.
+      - Extended testing of existing OCI8 functionality.
+      - Improved test output portability when using the PHP development
+        web server to run tests.
+      - Removed no-longer necessary unicode patterns from tests
+        (vestiges of PHP's previous PHP 6 project)
+        
+      - Improved build portability by removing compilation type cast
+        warnings with some compilers.
+      - Fixed compilation warnings when building with Oracle 9.2
+        client libraries.
+      - Updated code to use internal macro PHP_OCI_REGISTER_RESOURCE.
+      - Regularized code prototypes and fixed some in-line documenation
+        prototypes.
+      - Fixed code folding. 
+   </notes>
  <contents>
   <dir name="/">
    <dir name="tests">
@@ -94,6 +163,7 @@ http://pear.php.net/dtd/package-2.0.xsd">
     <file name="bind_misccoltypes.phpt" role="test" />
     <file name="bind_number.phpt" role="test" />
     <file name="bind_query.phpt" role="test" />
+    <file name="bind_raw_2.phpt" role="test" />
     <file name="bind_raw.phpt" role="test" />
     <file name="bind_rowid.phpt" role="test" />
     <file name="bind_sqltafc.phpt" role="test" />
@@ -287,6 +357,38 @@ http://pear.php.net/dtd/package-2.0.xsd">
     <file name="field_funcs_old.phpt" role="test" />
     <file name="field_funcs.phpt" role="test" />
     <file name="function_aliases.phpt" role="test" />
+    <file name="imp_res_1.phpt" role="test" />
+    <file name="imp_res_2.phpt" role="test" />
+    <file name="imp_res_3.phpt" role="test" />
+    <file name="imp_res_4.phpt" role="test" />
+    <file name="imp_res_5.phpt" role="test" />
+    <file name="imp_res_6.phpt" role="test" />
+    <file name="imp_res_7.phpt" role="test" />
+    <file name="imp_res_call_error.phpt" role="test" />
+    <file name="imp_res_cancel.phpt" role="test" />
+    <file name="imp_res_close.phpt" role="test" />
+    <file name="imp_res_cursor.phpt" role="test" />
+    <file name="imp_res_dbmsoutput.phpt" role="test" />
+    <file name="imp_res_field.phpt" role="test" />
+    <file name="imp_res_func_error.phpt" role="test" />
+    <file name="imp_res_get_1.phpt" role="test" />
+    <file name="imp_res_get_2.phpt" role="test" />
+    <file name="imp_res_get_3.phpt" role="test" />
+    <file name="imp_res_get_4.phpt" role="test" />
+    <file name="imp_res_get_5.phpt" role="test" />
+    <file name="imp_res_get_all.phpt" role="test" />
+    <file name="imp_res_get_cancel.phpt" role="test" />
+    <file name="imp_res_get_close_1.phpt" role="test" />
+    <file name="imp_res_get_close_2.phpt" role="test" />
+    <file name="imp_res_get_close_3.phpt" role="test" />
+    <file name="imp_res_get_cursor.phpt" role="test" />
+    <file name="imp_res_get_dbmsoutput.phpt" role="test" />
+    <file name="imp_res_get_exec.phpt" role="test" />
+    <file name="imp_res_get_none.phpt" role="test" />
+    <file name="imp_res_insert.phpt" role="test" />
+    <file name="imp_res_lob.phpt" role="test" />
+    <file name="imp_res_prefetch.phpt" role="test" />
+    <file name="ini_1.phpt" role="test" />
     <file name="lob_001.phpt" role="test" />
     <file name="lob_002.phpt" role="test" />
     <file name="lob_003.phpt" role="test" />
@@ -335,6 +437,7 @@ http://pear.php.net/dtd/package-2.0.xsd">
     <file name="lob_aliases.phpt" role="test" />
     <file name="lob_null.phpt" role="test" />
     <file name="lob_temp1.phpt" role="test" />
+    <file name="lob_temp2.phpt" role="test" />
     <file name="lob_temp.phpt" role="test" />
     <file name="minfo.phpt" role="test" />
     <file name="null_byte_1.phpt" role="test" />
@@ -383,13 +486,14 @@ http://pear.php.net/dtd/package-2.0.xsd">
    <file name="config.w32" role="src" />
    <file name="CREDITS" role="doc" />
    <file name="oci8.c" role="src" />
-   <file name="oci8.dsp" role="src" />
+   <file name="oci8_dtrace.d" role="src" />
    <file name="oci8_collection.c" role="src" />
    <file name="oci8_interface.c" role="src" />
    <file name="oci8_lob.c" role="src" />
    <file name="oci8_statement.c" role="src" />
    <file name="php_oci8.h" role="src" />
    <file name="php_oci8_int.h" role="src" />
+   <file name="oci8.dsp" role="src" />
    <file name="README" role="doc" />
   </dir> <!-- / -->
  </contents>
@@ -410,6 +514,21 @@ http://pear.php.net/dtd/package-2.0.xsd">
  </extsrcrelease>
  <changelog>
 
+<release>
+ <version>
+  <release>1.4.10</release>
+  <api>1.4.10</api>
+ </version>
+ <stability>
+  <release>stable</release>
+  <api>stable</api>
+ </stability>
+ <license uri="http://www.php.net/license">PHP</license>
+ <notes>
+   Bump PECL package info version check to allow PECL installs with PHP 5.5+
+ </notes>
+</release>
+
 <release>
  <version>
   <release>1.4.9</release>
@@ -457,7 +576,7 @@ http://pear.php.net/dtd/package-2.0.xsd">
   Fixed OCI8 part of bug #55748 (CVE-2011-4153: multiple NULL pointer dereferences with zend_strndup)
   Fixed OCI8 part of bug #55301 (multiple null pointer dereferences with calloc)
   Increased maximum Oracle error message buffer length for new Oracle 11.2.0.3 size
-  Improve internal initalization failure error messages
+  Improve internal initialization failure error messages
  </notes>
 </release>
 
@@ -472,7 +591,7 @@ http://pear.php.net/dtd/package-2.0.xsd">
  </stability>
  <license uri="http://www.php.net/license">PHP</license>
  <notes>
-   Added oci_client_version() returning the runtime Oracle client library version
+   Added oci_client_version() returning the run time Oracle client library version
    Made OCI8 extension buildable with PHP 5.4-development code
  </notes>
 </release>
@@ -846,7 +965,7 @@ Fixed bug #36820 (Privileged connection with an Oracle password file fails)
    <date>2006-03-16</date>
    <license uri="http://www.php.net/license">PHP</license>
    <notes>Changed OCI8 code to use OCIServerVersion() instead of OCIPing(), which may crash Oracle server of version &lt; 10.2
-Fixed bug #36235 (ocicolumnname returns false before a successfull fetch)
+Fixed bug #36235 (ocicolumnname returns false before a successful fetch)
 Fixed bug #36096 (oci_result() returns garbage after oci_fetch() failed)
 Fixed bug #36055 (possible OCI8 crash in multithreaded environment)
 Fixed bug #36010 (Segfault when re-creating and re-executing statements with bound parameters)
index f1079526f66f1cfaa241390035bcdd5517b85f9c..d1fe0877924e02aa457964733d586d9485e1bc69 100644 (file)
@@ -46,7 +46,7 @@
  */
 #undef PHP_OCI8_VERSION
 #endif
-#define PHP_OCI8_VERSION "1.4.10"
+#define PHP_OCI8_VERSION "2.0.0-dev"
 
 extern zend_module_entry oci8_module_entry;
 #define phpext_oci8_ptr &oci8_module_entry
index 155e57d2cd1a0b5f5fcdf81c666cd2534192afd4..98c236893e661a30647a048af2569e418e9511a8 100644 (file)
@@ -31,7 +31,7 @@
 # ifndef PHP_OCI8_INT_H
 #  define PHP_OCI8_INT_H
 
-/* misc defines {{{ */
+/* {{{ misc defines */
 # if (defined(__osf__) && defined(__alpha))
 #  ifndef A_OSF
 #      define A_OSF
 #  endif
 # endif /* osf alpha */
 
+#ifdef HAVE_DTRACE
+#include "oci8_dtrace_gen.h"
+#endif
+
 #if defined(min)
 #undef min
 #endif
@@ -66,7 +70,7 @@ extern int le_session;
 extern zend_class_entry *oci_lob_class_entry_ptr;
 extern zend_class_entry *oci_coll_class_entry_ptr;
 
-/* constants {{{ */
+/* {{{ constants */
 #define PHP_OCI_SEEK_SET 0
 #define PHP_OCI_SEEK_CUR 1
 #define PHP_OCI_SEEK_END 2
@@ -101,6 +105,11 @@ extern zend_class_entry *oci_coll_class_entry_ptr;
 #error Invalid value for PHP_OCI_CRED_EXT
 #endif
 
+#define PHP_OCI_IMPRES_UNKNOWN                 0
+#define PHP_OCI_IMPRES_NO_CHILDREN             1
+#define PHP_OCI_IMPRES_HAS_CHILDREN            2
+#define PHP_OCI_IMPRES_IS_CHILD                        3
+
 /*
  * Name passed to Oracle for tracing.  Note some DB views only show
  * the first nine characters of the driver name.
@@ -109,16 +118,21 @@ extern zend_class_entry *oci_coll_class_entry_ptr;
 
 /* }}} */
 
-typedef struct { /* php_oci_spool {{{ */
-       OCIEnv           *env;                                  /*env of this session pool */
+/* {{{ php_oci_spool */
+typedef struct {
+       int                       id;                                   /* resource id */
+       OCIEnv           *env;                                  /* env of this session pool */
        OCIError         *err;                                  /* pool's error handle  */
        OCISPool         *poolh;                                /* pool handle */
        void             *poolname;                             /* session pool name */
        unsigned int  poolname_len;                     /* length of session pool name */
        char             *spool_hash_key;               /* Hash key for session pool in plist */
-} php_oci_spool; /* }}} */
+} php_oci_spool;
+/* }}} */
 
-typedef struct { /* php_oci_connection {{{ */
+/* {{{ php_oci_connection */
+typedef struct { 
+       int                             id;                                                     /* resource ID */
        OCIEnv             *env;                                                /* private env handle */
        ub2                             charset;                                        /* charset ID */
        OCIServer          *server;                                             /* private server handle */
@@ -135,17 +149,18 @@ typedef struct { /* php_oci_connection {{{ */
        unsigned                is_attached:1;                          /* hels to determine if we should detach from the server when closing/freeing the connection */
        unsigned                is_persistent:1;                        /* self-descriptive */
        unsigned                used_this_request:1;            /* helps to determine if we should reset connection's next ping time and check its timeout */
-       unsigned                needs_commit:1;                         /* helps to determine if we should rollback this connection on close/shutdown */
+       unsigned                rb_on_disconnect:1;                     /* helps to determine if we should rollback this connection on close/shutdown */
        unsigned                passwd_changed:1;                       /* helps determine if a persistent connection hash should be invalidated after a password change */
        unsigned                is_stub:1;                                      /* flag to keep track whether the connection structure has a real OCI connection associated */
        unsigned                using_spool:1;                          /* Is this connection from session pool? */
-       int                             rsrc_id;                                        /* resource ID */
        time_t                  idle_expiry;                            /* time when the connection will be considered as expired */
        time_t             *next_pingp;                                 /* (pointer to) time of the next ping */
        char               *hash_key;                                   /* hashed details of the connection */
-} php_oci_connection; /* }}} */
+} php_oci_connection;
+/* }}} */
 
-typedef struct { /* php_oci_descriptor {{{ */
+/* {{{ php_oci_descriptor */
+typedef struct { 
        int                                      id;
        ulong                            index;                     /* descriptors hash table index */
        php_oci_connection      *connection;                    /* parent connection handle */
@@ -158,15 +173,19 @@ typedef struct { /* php_oci_descriptor {{{ */
        ub1                                      charset_form;                  /* charset form, required for NCLOBs */
        ub2                                      charset_id;                    /* charset ID */
        unsigned                         is_open:1;                             /* helps to determine if lob is open or not */
-} php_oci_descriptor; /* }}} */
+} php_oci_descriptor;
+/* }}} */
 
-typedef struct { /* php_oci_lob_ctx {{{ */
+/* {{{ php_oci_lob_ctx */
+typedef struct { 
        char                       **lob_data;                          /* address of pointer to LOB data */
        ub4                                     *lob_len;                               /* address of LOB length variable (bytes) */
        ub4                                      alloc_len;
-} php_oci_lob_ctx; /* }}} */
+} php_oci_lob_ctx;
+/* }}} */
 
-typedef struct { /* php_oci_collection {{{ */
+/* {{{ php_oci_collection */
+typedef struct { 
        int                                      id;
        php_oci_connection      *connection;                    /* parent connection handle */
        OCIType                         *tdo;                                   /* collection's type handle */
@@ -175,23 +194,30 @@ typedef struct { /* php_oci_collection {{{ */
        OCIType                         *element_type;                  /* element's type handle */
        OCITypeCode                      element_typecode;              /* element's typecode handle */
        OCIColl                         *collection;                    /* collection handle */
-} php_oci_collection; /* }}} */
+} php_oci_collection;
+/* }}} */
 
-typedef struct { /* php_oci_define {{{ */
+/* {{{ php_oci_define */
+typedef struct { 
        zval            *zval;                  /* zval used in define */
        text            *name;                  /* placeholder's name */
        ub4                      name_len;              /* placeholder's name length */
        ub4                      type;                  /* define type */
-} php_oci_define; /* }}} */
+} php_oci_define;
+/* }}} */
 
-typedef struct { /* php_oci_statement {{{ */
+/* {{{ php_oci_statement */
+typedef struct { 
        int                                      id;
        int                                      parent_stmtid;                 /* parent statement id */
+       struct php_oci_statement *impres_child_stmt; /* child of current Implicit Result Set statement handle */
+       ub4                  impres_count;          /* count of remaining Implicit Result children on parent statement handle */
        php_oci_connection      *connection;                    /* parent connection handle */
        sword                            errcode;                               /* last errcode*/
        OCIError                        *err;                                   /* private error handle */
        OCIStmt                         *stmt;                                  /* statement handle */
-       char                            *last_query;                    /* last query issued. also used to determine if this is a statement or a refcursor received from Oracle */
+       char                            *last_query;                    /* last query issued. also used to determine if this is a statement or a refcursor recieved from Oracle */
+       char                 impres_flag;           /* PHP_OCI_IMPRES_*_ */
        long                             last_query_len;                /* last query length */
        HashTable                       *columns;                               /* hash containing all the result columns */
        HashTable                       *binds;                                 /* binds hash */
@@ -201,9 +227,11 @@ typedef struct { /* php_oci_statement {{{ */
        unsigned                         has_data:1;                    /* statement has more data flag */
        unsigned                         has_descr:1;                   /* statement has at least one descriptor or cursor column */
        ub2                                      stmttype;                              /* statement type */
-} php_oci_statement; /* }}} */
+} php_oci_statement;
+/* }}} */
 
-typedef struct { /* php_oci_bind {{{ */
+/* {{{ php_oci_bind */
+typedef struct { 
        OCIBind                         *bind;                                  /* bind handle */
        zval                            *zval;                                  /* value */
        dvoid                           *descriptor;                    /* used for binding of LOBS etc */
@@ -222,9 +250,11 @@ typedef struct { /* php_oci_bind {{{ */
        sb2                                      indicator;                             /* -1 means NULL */
        ub2                                      retcode;
        ub4                                      dummy_len;                             /* a dummy var to store alenpp value in bind OUT callback */
-} php_oci_bind; /* }}} */
+} php_oci_bind;
+/* }}} */
 
-typedef struct { /* php_oci_out_column {{{ */
+/* {{{ php_oci_out_column */
+typedef struct { 
        php_oci_statement       *statement;                             /* statement handle. used when fetching REFCURSORS */
        php_oci_statement       *nested_statement;              /* statement handle. used when fetching REFCURSORS */
        OCIDefine                       *oci_define;                    /* define handle */
@@ -249,29 +279,54 @@ typedef struct { /* php_oci_out_column {{{ */
        sb2                                      precision;                             /* column precision */
        ub1                                      charset_form;                  /* charset form, required for NCLOBs */
        ub2                                      charset_id;                    /* charset ID */
-} php_oci_out_column; /* }}} */
+} php_oci_out_column;
+/* }}} */
 
 /* {{{ macros */
 
-#define PHP_OCI_CALL(func, params) \
-       do { \
-               if (OCI_G(debug_mode)) { \
-                       php_printf ("OCI8 DEBUG: " #func " at (%s:%d) \n", __FILE__, __LINE__); \
-               } \
-               OCI_G(in_call) = 1; \
-               func params; \
-               OCI_G(in_call) = 0; \
+#ifdef HAVE_DTRACE
+#define PHP_OCI_CALL(func_uc, func, params)                                                            \
+       do {                                                                                                                            \
+               if (DTRACE_OCI8_ ## func_uc ## _START_ENABLED()) {                              \
+                       DTRACE_OCI8_ ## func_uc ## _START();                                            \
+               }                                                                                                                               \
+               OCI_G(in_call) = 1;                                                                                             \
+               func params;                                                                                                    \
+               OCI_G(in_call) = 0;                                                                                             \
+               if (DTRACE_OCI8_ ## func_uc ## _DONE_ENABLED()) {                               \
+                       DTRACE_OCI8_ ## func_uc ## _DONE();                                                     \
+               }                                                                                                                               \
        } while (0)
-
-#define PHP_OCI_CALL_RETURN(__retval, func, params) \
-       do { \
-               if (OCI_G(debug_mode)) { \
-                       php_printf ("OCI8 DEBUG: " #func " at (%s:%d) \n", __FILE__, __LINE__); \
-               } \
-               OCI_G(in_call) = 1; \
-               __retval = func params; \
-               OCI_G(in_call) = 0; \
+#else /* HAVE_DTRACE */
+#define PHP_OCI_CALL(func_uc, func, params)                                                            \
+       do {                                                                                                                            \
+               OCI_G(in_call) = 1;                                                                                             \
+               func params;                                                                                                    \
+               OCI_G(in_call) = 0;                                                                                             \
        } while (0)
+#endif /* HAVE_DTRACE */
+
+#ifdef HAVE_DTRACE
+#define PHP_OCI_CALL_RETURN(func_uc, __retval, func, params)                   \
+       do {                                                                                                                            \
+               if (DTRACE_OCI8_ ## func_uc ## _START_ENABLED()) {                              \
+                       DTRACE_OCI8_ ## func_uc ## _START();                                            \
+               }                                                                                                                               \
+               OCI_G(in_call) = 1;                                                                                             \
+               __retval = func params;                                                                                 \
+               OCI_G(in_call) = 0;                                                                                             \
+               if (DTRACE_OCI8_ ## func_uc ## _DONE_ENABLED()) {                               \
+                       DTRACE_OCI8_ ## func_uc ## _DONE();                                                     \
+               }                                                                                                                               \
+       } while (0)
+#else /* HAVE_DTRACE */
+#define PHP_OCI_CALL_RETURN(func_uc, __retval, func, params)                   \
+       do {                                                                                                                            \
+               OCI_G(in_call) = 1;                                                                                             \
+               __retval = func params;                                                                                 \
+               OCI_G(in_call) = 0;                                                                                             \
+       } while (0)
+#endif /* HAVE_DTRACE */
 
 /* Check for errors that indicate the connection to the DB is no
  * longer valid.  If it isn't, then the PHP connection is marked to be
@@ -314,7 +369,7 @@ typedef struct { /* php_oci_out_column {{{ */
                        default:                                                                                \
                        {                                                                                               \
                                ub4 serverStatus = OCI_SERVER_NORMAL;           \
-                               PHP_OCI_CALL(OCIAttrGet, ((dvoid *)(connection)->server, OCI_HTYPE_SERVER, (dvoid *)&serverStatus, \
+                               PHP_OCI_CALL(OCIATTRGET, OCIAttrGet, ((dvoid *)(connection)->server, OCI_HTYPE_SERVER, (dvoid *)&serverStatus, \
                                                                                  (ub4 *)0, OCI_ATTR_SERVER_STATUS, (connection)->err)); \
                                if (serverStatus != OCI_SERVER_NORMAL) {        \
                                        (connection)->is_open = 0;                              \
@@ -365,112 +420,106 @@ typedef struct { /* php_oci_out_column {{{ */
 
 /* PROTOS */
 
-/* main prototypes {{{ */
-
-void php_oci_column_hash_dtor (void *data);
-void php_oci_define_hash_dtor (void *data);
-void php_oci_bind_hash_dtor (void *data);
-void php_oci_descriptor_flush_hash_dtor (void *data);
+/* {{{ main prototypes */
 
+void php_oci_column_hash_dtor(void *data);
+void php_oci_define_hash_dtor(void *data);
+void php_oci_bind_hash_dtor(void *data);
+void php_oci_descriptor_flush_hash_dtor(void *data);
 void php_oci_connection_descriptors_free(php_oci_connection *connection TSRMLS_DC);
-
-sb4 php_oci_error (OCIError *, sword TSRMLS_DC);
-sb4 php_oci_fetch_errmsg(OCIError *, text ** TSRMLS_DC);
-int php_oci_fetch_sqltext_offset(php_oci_statement *, text **, ub2 * TSRMLS_DC);
-
-void php_oci_do_connect (INTERNAL_FUNCTION_PARAMETERS, int , int);
+sb4 php_oci_error(OCIError *err_p, sword status TSRMLS_DC);
+sb4 php_oci_fetch_errmsg(OCIError *error_handle, text **error_buf TSRMLS_DC);
+int php_oci_fetch_sqltext_offset(php_oci_statement *statement, text **sqltext, ub2 *error_offset TSRMLS_DC);
+void php_oci_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent, int exclusive);
 php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char *password, int password_len, char *new_password, int new_password_len, char *dbname, int dbname_len, char *charset, long session_mode, int persistent, int exclusive TSRMLS_DC);
-
-int php_oci_connection_rollback(php_oci_connection * TSRMLS_DC);
-int php_oci_connection_commit(php_oci_connection * TSRMLS_DC);
+int php_oci_connection_rollback(php_oci_connection *connection TSRMLS_DC);
+int php_oci_connection_commit(php_oci_connection *connection TSRMLS_DC);
 int php_oci_connection_release(php_oci_connection *connection TSRMLS_DC);
-
-int php_oci_password_change(php_oci_connection *, char *, int, char *, int, char *, int TSRMLS_DC);
-void php_oci_client_get_version(char ** TSRMLS_DC);
-int php_oci_server_get_version(php_oci_connection *, char ** TSRMLS_DC);
-
-void php_oci_fetch_row(INTERNAL_FUNCTION_PARAMETERS, int, int);
-int php_oci_column_to_zval(php_oci_out_column *, zval *, int TSRMLS_DC);
+int php_oci_password_change(php_oci_connection *connection, char *user, int user_len, char *pass_old, int pass_old_len, char *pass_new, int pass_new_len TSRMLS_DC);
+void php_oci_client_get_version(char **version TSRMLS_DC);
+int php_oci_server_get_version(php_oci_connection *connection, char **version TSRMLS_DC);
+void php_oci_fetch_row(INTERNAL_FUNCTION_PARAMETERS, int mode, int expected_args);
+int php_oci_column_to_zval(php_oci_out_column *column, zval *value, int mode TSRMLS_DC);
 
 /* }}} */
 
-/* lob related prototypes {{{ */
-
-php_oci_descriptor * php_oci_lob_create (php_oci_connection *, long TSRMLS_DC);
-int php_oci_lob_get_length (php_oci_descriptor *, ub4 * TSRMLS_DC);
-int php_oci_lob_read (php_oci_descriptor *, long, long, char **, ub4 * TSRMLS_DC);
-int php_oci_lob_write (php_oci_descriptor *, ub4, char *, int, ub4 * TSRMLS_DC);
-int php_oci_lob_flush (php_oci_descriptor *, long TSRMLS_DC);
-int php_oci_lob_set_buffering (php_oci_descriptor *, int TSRMLS_DC);
-int php_oci_lob_get_buffering (php_oci_descriptor *);
-int php_oci_lob_copy (php_oci_descriptor *, php_oci_descriptor *, long TSRMLS_DC);
-int php_oci_lob_close (php_oci_descriptor * TSRMLS_DC);
-int php_oci_temp_lob_close (php_oci_descriptor * TSRMLS_DC);
-int php_oci_lob_write_tmp (php_oci_descriptor *, long, char *, int TSRMLS_DC);
-void php_oci_lob_free(php_oci_descriptor * TSRMLS_DC);
-int php_oci_lob_import(php_oci_descriptor *descriptor, char * TSRMLS_DC);
-int php_oci_lob_append (php_oci_descriptor *, php_oci_descriptor * TSRMLS_DC);
-int php_oci_lob_truncate (php_oci_descriptor *, long TSRMLS_DC);
-int php_oci_lob_erase (php_oci_descriptor *, long, ub4, ub4 * TSRMLS_DC);
-int php_oci_lob_is_equal (php_oci_descriptor *, php_oci_descriptor *, boolean * TSRMLS_DC);
+/* {{{ lob related prototypes */
+
+php_oci_descriptor *php_oci_lob_create(php_oci_connection *connection, long type TSRMLS_DC);
+int php_oci_lob_get_length(php_oci_descriptor *descriptor, ub4 *length TSRMLS_DC);
+int php_oci_lob_read(php_oci_descriptor *descriptor, long read_length, long inital_offset, char **data, ub4 *data_len TSRMLS_DC);
+int php_oci_lob_write(php_oci_descriptor *descriptor, ub4 offset, char *data, int data_len, ub4 *bytes_written TSRMLS_DC);
+int php_oci_lob_flush(php_oci_descriptor *descriptor, long flush_flag TSRMLS_DC);
+int php_oci_lob_set_buffering(php_oci_descriptor *descriptor, int on_off TSRMLS_DC);
+int php_oci_lob_get_buffering(php_oci_descriptor *descriptor);
+int php_oci_lob_copy(php_oci_descriptor *descriptor, php_oci_descriptor *descriptor_from, long length TSRMLS_DC);
+int php_oci_lob_close(php_oci_descriptor *descriptor TSRMLS_DC);
+int php_oci_temp_lob_close(php_oci_descriptor *descriptor TSRMLS_DC);
+int php_oci_lob_write_tmp(php_oci_descriptor *descriptor, long type, char *data, int data_len TSRMLS_DC);
+void php_oci_lob_free(php_oci_descriptor *descriptor TSRMLS_DC);
+int php_oci_lob_import(php_oci_descriptor *descriptor, char *filename TSRMLS_DC);
+int php_oci_lob_append(php_oci_descriptor *descriptor_dest, php_oci_descriptor *descriptor_from TSRMLS_DC);
+int php_oci_lob_truncate(php_oci_descriptor *descriptor, long new_lob_length TSRMLS_DC);
+int php_oci_lob_erase(php_oci_descriptor *descriptor, long offset, ub4 length, ub4 *bytes_erased TSRMLS_DC);
+int php_oci_lob_is_equal(php_oci_descriptor *descriptor_first, php_oci_descriptor *descriptor_second, boolean *result TSRMLS_DC);
 #if defined(HAVE_OCI_LOB_READ2)
-sb4 php_oci_lob_callback (dvoid *ctxp, CONST dvoid *bufxp, oraub8 len, ub1 piece, dvoid **changed_bufpp, oraub8 *changed_lenp);
+sb4 php_oci_lob_callback(dvoid *ctxp, CONST dvoid *bufxp, oraub8 len, ub1 piece, dvoid **changed_bufpp, oraub8 *changed_lenp);
 #else
-sb4 php_oci_lob_callback (dvoid *ctxp, CONST dvoid *bufxp, ub4 len, ub1 piece);
+sb4 php_oci_lob_callback(dvoid *ctxp, CONST dvoid *bufxp, ub4 len, ub1 piece);
 #endif
 /* }}} */
 
-/* collection related prototypes {{{ */
-
-php_oci_collection * php_oci_collection_create(php_oci_connection *, char *, int, char *, int TSRMLS_DC);
-int php_oci_collection_size(php_oci_collection *, sb4 * TSRMLS_DC);
-int php_oci_collection_max(php_oci_collection *, long * TSRMLS_DC);
-int php_oci_collection_trim(php_oci_collection *, long TSRMLS_DC);
-int php_oci_collection_append(php_oci_collection *, char *, int TSRMLS_DC);
-int php_oci_collection_element_get(php_oci_collection *, long, zval** TSRMLS_DC);
-int php_oci_collection_element_set(php_oci_collection *, long, char *, int TSRMLS_DC);
-int php_oci_collection_element_set_null(php_oci_collection *, long TSRMLS_DC);
-int php_oci_collection_element_set_date(php_oci_collection *, long, char *, int TSRMLS_DC);
-int php_oci_collection_element_set_number(php_oci_collection *, long, char *, int TSRMLS_DC);
-int php_oci_collection_element_set_string(php_oci_collection *, long, char *, int TSRMLS_DC);
-int php_oci_collection_assign(php_oci_collection *, php_oci_collection * TSRMLS_DC);
-void php_oci_collection_close(php_oci_collection * TSRMLS_DC);
-int php_oci_collection_append_null(php_oci_collection * TSRMLS_DC);
-int php_oci_collection_append_date(php_oci_collection *, char *, int TSRMLS_DC);
-int php_oci_collection_append_number(php_oci_collection *, char *, int TSRMLS_DC);
-int php_oci_collection_append_string(php_oci_collection *, char *, int TSRMLS_DC);
+/* {{{ collection related prototypes */
+
+php_oci_collection *php_oci_collection_create(php_oci_connection *connection, char *tdo, int tdo_len, char *schema, int schema_len TSRMLS_DC);
+int php_oci_collection_size(php_oci_collection *collection, sb4 *size TSRMLS_DC);
+int php_oci_collection_max(php_oci_collection *collection, long *max TSRMLS_DC);
+int php_oci_collection_trim(php_oci_collection *collection, long trim_size TSRMLS_DC);
+int php_oci_collection_append(php_oci_collection *collection, char *element, int element_len TSRMLS_DC);
+int php_oci_collection_element_get(php_oci_collection *collection, long index, zval **result_element TSRMLS_DC);
+int php_oci_collection_element_set(php_oci_collection *collection, long index, char *value, int value_len TSRMLS_DC);
+int php_oci_collection_element_set_null(php_oci_collection *collection, long index TSRMLS_DC);
+int php_oci_collection_element_set_date(php_oci_collection *collection, long index, char *date, int date_len TSRMLS_DC);
+int php_oci_collection_element_set_number(php_oci_collection *collection, long index, char *number, int number_len TSRMLS_DC);
+int php_oci_collection_element_set_string(php_oci_collection *collection, long index, char *element, int element_len TSRMLS_DC);
+int php_oci_collection_assign(php_oci_collection *collection_dest, php_oci_collection *collection_from TSRMLS_DC);
+void php_oci_collection_close(php_oci_collection *collection TSRMLS_DC);
+int php_oci_collection_append_null(php_oci_collection *collection TSRMLS_DC);
+int php_oci_collection_append_date(php_oci_collection *collection, char *date, int date_len TSRMLS_DC);
+int php_oci_collection_append_number(php_oci_collection *collection, char *number, int number_len TSRMLS_DC);
+int php_oci_collection_append_string(php_oci_collection *collection, char *element, int element_len TSRMLS_DC);
 
 
 /* }}} */
 
-/* statement related prototypes {{{ */
+/* {{{ statement related prototypes */
 
-php_oci_statement * php_oci_statement_create (php_oci_connection *, char *, int TSRMLS_DC);
-int php_oci_statement_set_prefetch (php_oci_statement *, long TSRMLS_DC);
-int php_oci_statement_fetch (php_oci_statement *, ub4 TSRMLS_DC);
-php_oci_out_column * php_oci_statement_get_column (php_oci_statement *, long, char *, int TSRMLS_DC);
-int php_oci_statement_execute (php_oci_statement *, ub4 TSRMLS_DC);
-int php_oci_statement_cancel (php_oci_statement * TSRMLS_DC);
-void php_oci_statement_free (php_oci_statement * TSRMLS_DC);
+php_oci_statement *php_oci_statement_create(php_oci_connection *connection, char *query, int query_len TSRMLS_DC);
+php_oci_statement *php_oci_get_implicit_resultset(php_oci_statement *statement TSRMLS_DC);
+int php_oci_statement_set_prefetch(php_oci_statement *statement, long size TSRMLS_DC);
+int php_oci_statement_fetch(php_oci_statement *statement, ub4 nrows TSRMLS_DC);
+php_oci_out_column *php_oci_statement_get_column(php_oci_statement *statement, long column_index, char *column_name, int column_name_len TSRMLS_DC);
+int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC);
+int php_oci_statement_cancel(php_oci_statement *statement TSRMLS_DC);
+void php_oci_statement_free(php_oci_statement *statement TSRMLS_DC);
 int php_oci_bind_pre_exec(void *data, void *result TSRMLS_DC);
 int php_oci_bind_post_exec(void *data TSRMLS_DC);
-int php_oci_bind_by_name(php_oci_statement *, char *, int, zval*, long, ub2 TSRMLS_DC);
-sb4 php_oci_bind_in_callback(dvoid *, OCIBind *, ub4, ub4, dvoid **, ub4 *, ub1 *, dvoid **);
-sb4 php_oci_bind_out_callback(dvoid *, OCIBind *, ub4, ub4, dvoid **, ub4 **, ub1 *, dvoid **, ub2 **);
+int php_oci_bind_by_name(php_oci_statement *statement, char *name, int name_len, zval *var, long maxlength, ub2 type TSRMLS_DC);
+sb4 php_oci_bind_in_callback(dvoid *ictxp, OCIBind *bindp, ub4 iter, ub4 index, dvoid **bufpp, ub4 *alenp, ub1 *piecep, dvoid **indpp);
+sb4 php_oci_bind_out_callback(dvoid *octxp, OCIBind *bindp, ub4 iter, ub4 index, dvoid **bufpp, ub4 **alenpp, ub1 *piecep, dvoid **indpp, ub2 **rcodepp);
 php_oci_out_column *php_oci_statement_get_column_helper(INTERNAL_FUNCTION_PARAMETERS, int need_data);
 int php_oci_cleanup_pre_fetch(void *data TSRMLS_DC);
-
-int php_oci_statement_get_type(php_oci_statement *, ub2 * TSRMLS_DC);
-int php_oci_statement_get_numrows(php_oci_statement *, ub4 * TSRMLS_DC);
-int php_oci_bind_array_by_name(php_oci_statement *statement, char *name, int name_len, zval* var, long max_table_length, long maxlength, long type TSRMLS_DC);
-php_oci_bind *php_oci_bind_array_helper_number(zval* var, long max_table_length TSRMLS_DC);
-php_oci_bind *php_oci_bind_array_helper_double(zval* var, long max_table_length TSRMLS_DC);
-php_oci_bind *php_oci_bind_array_helper_string(zval* var, long max_table_length, long maxlength TSRMLS_DC);
-php_oci_bind *php_oci_bind_array_helper_date(zval* var, long max_table_length, php_oci_connection *connection TSRMLS_DC);
+int php_oci_statement_get_type(php_oci_statement *statement, ub2 *type TSRMLS_DC);
+int php_oci_statement_get_numrows(php_oci_statement *statement, ub4 *numrows TSRMLS_DC);
+int php_oci_bind_array_by_name(php_oci_statement *statement, char *name, int name_len, zval *var, long max_table_length, long maxlength, long type TSRMLS_DC);
+php_oci_bind *php_oci_bind_array_helper_number(zval *var, long max_table_length TSRMLS_DC);
+php_oci_bind *php_oci_bind_array_helper_double(zval *var, long max_table_length TSRMLS_DC);
+php_oci_bind *php_oci_bind_array_helper_string(zval *var, long max_table_length, long maxlength TSRMLS_DC);
+php_oci_bind *php_oci_bind_array_helper_date(zval *var, long max_table_length, php_oci_connection *connection TSRMLS_DC);
 
 /* }}} */
 
-ZEND_BEGIN_MODULE_GLOBALS(oci) /* {{{ */
+ZEND_BEGIN_MODULE_GLOBALS(oci) /* {{{ Module globals */
        sword            errcode;                                               /* global last error code (used when connect fails, for example) */
        OCIError        *err;                                                   /* global error handle */
 
index 91fa4b75b76b206829f6f9b9e41a1a626837fea5..d68991a7f2bafffe8856c07fdc7282e5b5b9bdcf 100644 (file)
@@ -5,12 +5,15 @@ SELECT oci_bind_by_name with SQLT_AFC aka CHAR
 if (!extension_loaded('oci8')) die ("skip no oci8 extension");
 require(dirname(__FILE__)."/connect.inc");
 // The bind buffer size edge cases seem to change each DB version.
-if (preg_match('/Release 10\.2\./', oci_server_version($c), $matches) !== 1) {
-    if (preg_match('/Release 11\.2\.0\.2/', oci_server_version($c), $matches) !== 2) {
-        die("skip expected output only valid when using Oracle 10gR2 or 11.2.0.2 databases");
-    }
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
+if (!(isset($matches[0]) && 
+           (($matches[1] == 10 && $matches[2] >= 2) || 
+            ($matches[1] == 11 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 2)
+            ))) {
+    die("skip expected output only valid when using Oracle 10gR2 or 11.2.0.2 databases");
 }
-if (preg_match('/^11\./', oci_client_version()) != 1) {
+preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
+if (isset($matches[0]) && $matches[0] < 11) {
     die("skip test expected to work only with Oracle 11g or greater version of client");
 }
 ?>
index a7feff9f6a8793fb3cfabe2cffbddd18d65fbb22..2a7c713aa7f15a02b6a7ab28ed35401b3585e6af 100644 (file)
@@ -5,10 +5,12 @@ SELECT oci_bind_by_name with SQLT_AFC aka CHAR
 if (!extension_loaded('oci8')) die ("skip no oci8 extension");
 require(dirname(__FILE__)."/connect.inc");
 // The bind buffer size edge cases seem to change each DB version.
-if (preg_match('/Release 11\.1\./', oci_server_version($c), $matches) !== 1) {
-    if (preg_match('/Release 11\.2\.0\.3/', oci_server_version($c), $matches) !== 1) {
-        die("skip expected output only valid when using Oracle 11gR1 or 11.2.0.3 databases");
-    }
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
+if (!(isset($matches[0]) && 
+      (($matches[1] == 11 && $matches[2] == 1) || 
+       ($matches[1] == 11 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 3)
+       ))) {
+    die("skip expected output only valid when using Oracle 11gR1 or 11.2.0.3 databases");
 }
 ?>
 --ENV--
index 43661a065da493c1aa78ae1c62dbaf144c61ecd7..3695c8585490499dff1c4f9031fd89858492ef9f 100644 (file)
@@ -5,12 +5,15 @@ SELECT oci_bind_by_name with SQLT_AFC aka CHAR and dates
 if (!extension_loaded('oci8')) die ("skip no oci8 extension");
 require(dirname(__FILE__)."/connect.inc");
 // The bind buffer size edge cases seem to change each DB version.
-if (preg_match('/Release 10\.2\./', oci_server_version($c), $matches) !== 1) {
-    if (preg_match('/Release 11\.2\.0\.2/', oci_server_version($c), $matches) !== 2) {
-        die("skip expected output only valid when using Oracle 10gR2 or 11.2.0.2 databases");
-    }
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
+if (!(isset($matches[0]) && 
+            (($matches[1] == 10 && $matches[2] >= 2) || 
+             ($matches[1] == 11 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 2)
+             ))) {
+    die("skip expected output only valid when using Oracle 10gR2 or 11.2.0.2 databases");
 }
-if (preg_match('/^11\./', oci_client_version()) != 1) {
+preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
+if (isset($matches[0]) && $matches[0] < 11) {
     die("skip test expected to work only with Oracle 11g or greater version of client");
 }
 ?>
index edb2a12ff0a29f6b0944834d1d5f03a025e65263..b9afd6940bccad8b9cdf315510753efa955d54e6 100644 (file)
@@ -5,10 +5,12 @@ SELECT oci_bind_by_name with SQLT_AFC aka CHAR and dates
 if (!extension_loaded('oci8')) die ("skip no oci8 extension");
 require(dirname(__FILE__)."/connect.inc");
 // The bind buffer size edge cases seem to change each DB version.
-if (preg_match('/Release 11\.1\./', oci_server_version($c), $matches) !== 1) {
-    if (preg_match('/Release 11\.2\.0\.3/', oci_server_version($c), $matches) !== 1) {
-        die("skip expected output only valid when using Oracle 11gR1 or 11.2.0.3 databases");
-    }
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
+if (!(isset($matches[0]) && 
+      (($matches[1] == 11 && $matches[2] == 1) || 
+       ($matches[1] == 11 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 3)
+       ))) {
+    die("skip expected output only valid when using Oracle 11gR1 or 11.2.0.3 databases");
 }
 ?>
 --ENV--
index 25115836dfcb786fdad927511290dbc5587db291..009e60a542b6ab06e5e6e0860d2545992ebb6b44 100644 (file)
@@ -5,12 +5,15 @@ PL/SQL oci_bind_by_name with SQLT_AFC aka CHAR to CHAR parameter
 if (!extension_loaded('oci8')) die ("skip no oci8 extension");
 require(dirname(__FILE__)."/connect.inc");
 // The bind buffer size edge cases seem to change each DB version.
-if (preg_match('/Release 10\.2\./', oci_server_version($c), $matches) !== 1) {
-    if (preg_match('/Release 11\.2\.0\.2/', oci_server_version($c), $matches) !== 2) {
-        die("skip expected output only valid when using Oracle 10gR2 or 11.2.0.2 databases");
-    }
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
+if (!(isset($matches[0]) && 
+           (($matches[1] == 10 && $matches[2] >= 2) || 
+            ($matches[1] == 11 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 2)
+           ))) {
+    die("skip expected output only valid when using Oracle 10gR2 or 11.2.0.2 databases");
 }
-if (preg_match('/^11\./', oci_client_version()) != 1) {
+preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
+if (isset($matches[0]) && $matches[0] < 11) {
     die("skip test expected to work only with Oracle 11g or greater version of client");
 }
 ?>
index fea77754d1760c1f2b036709bd204953b88ab2ab..a894de00c075fd5ed5cc1b5353b55cedb7847da6 100644 (file)
@@ -5,10 +5,12 @@ PL/SQL oci_bind_by_name with SQLT_AFC aka CHAR to CHAR parameter
 if (!extension_loaded('oci8')) die ("skip no oci8 extension");
 require(dirname(__FILE__)."/connect.inc");
 // The bind buffer size edge cases seem to change each DB version.
-if (preg_match('/Release 11\.1\./', oci_server_version($c), $matches) !== 1) {
-    if (preg_match('/Release 11\.2\.0\.3/', oci_server_version($c), $matches) !== 1) {
-        die("skip expected output only valid when using Oracle 11gR1 or 11.2.0.3 databases");
-    }
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
+if (!(isset($matches[0]) && 
+           (($matches[1] == 11 && $matches[2] == 1) || 
+            ($matches[1] == 11 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 3)
+           ))) {
+    die("skip expected output only valid when using Oracle 11gR1 or 11.2.0.3 databases");
 }
 ?>
 --ENV--
index 36765f813744322d8c59c180c70601e09e72bbce..0ac60e503de870a242fe7e5ff76cd7b42934af85 100644 (file)
@@ -5,12 +5,15 @@ PL/SQL oci_bind_by_name with SQLT_AFC aka CHAR to VARCHAR2 parameter
 if (!extension_loaded('oci8')) die ("skip no oci8 extension");
 require(dirname(__FILE__)."/connect.inc");
 // The bind buffer size edge cases seem to change each DB version.
-if (preg_match('/Release 10\.2\./', oci_server_version($c), $matches) !== 1) {
-    if (preg_match('/Release 11\.2\.0\.2/', oci_server_version($c), $matches) !== 2) {
-        die("skip expected output only valid when using Oracle 10gR2 or 11.2.0.2 databases");
-    }
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
+if (!(isset($matches[0]) && 
+           (($matches[1] == 10 && $matches[2] >= 2) || 
+            ($matches[1] == 11 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 2)
+           ))) {
+    die("skip expected output only valid when using Oracle 10gR2 or 11.2.0.2 databases");
 }
-if (preg_match('/^11\./', oci_client_version()) != 1) {
+preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
+if (isset($matches[0]) && $matches[0] < 11) {
     die("skip test expected to work only with Oracle 11g or greater version of client");
 }
 ?>
index 2bc2f1424634dbb644ea31e512bf4ddf525c8d3a..d5ce116afb65a5a1a68180640e7fcc1f02b16d3a 100644 (file)
@@ -5,10 +5,12 @@ PL/SQL oci_bind_by_name with SQLT_AFC aka CHAR to VARCHAR2 parameter
 if (!extension_loaded('oci8')) die ("skip no oci8 extension");
 require(dirname(__FILE__)."/connect.inc");
 // The bind buffer size edge cases seem to change each DB version.
-if (preg_match('/Release 11\.1\./', oci_server_version($c), $matches) !== 1) {
-    if (preg_match('/Release 11\.2\.0\.3/', oci_server_version($c), $matches) !== 1) {
-        die("skip expected output only valid when using Oracle 11gR1 or 11.2.0.3 databases");
-    }
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
+if (!(isset($matches[0]) && 
+           (($matches[1] == 11 && $matches[2] == 1) || 
+            ($matches[1] == 11 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 3)
+            ))) {
+    die("skip expected output only valid when using Oracle 11gR1 or 11.2.0.3 databases");
 }
 ?>
 --ENV--
index d3e5375df6c4a5adcc5aeabce587f80653d60a76..a2bf9de5a6b6053eb66f507d7b627b43245a56a1 100644 (file)
@@ -3,7 +3,8 @@ Bind with various unsupported 10g+ bind types
 --SKIPIF--
 <?php 
 if (!extension_loaded('oci8')) die("skip no oci8 extension"); 
-if (preg_match('/^1[01]\./', oci_client_version()) !== 1) {
+preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
+if (isset($matches[0]) && $matches[0] < 10) {
        die ("skip expected output only valid for Oracle 10g+ clients");
 }
 ?>
index 40ab4ebed247216ac4c40ac9931e59279aadb414..0ef47f13ddeef4d0646a075afa1ada137d5f67fb 100644 (file)
@@ -5,12 +5,15 @@ Bug #27303 (OCIBindByName binds numeric PHP values as characters)
 if (!extension_loaded('oci8')) die ("skip no oci8 extension");
 require(dirname(__FILE__)."/connect.inc");
 // The bind buffer size edge cases seem to change each DB version.
-if (preg_match('/Release 10\.2\.0\.2/', oci_server_version($c), $matches) !== 1 &&
-    preg_match('/Release 11\.2\.0\.2/', oci_server_version($c), $matches) !== 1) {
-        die("skip expected output only valid when using Oracle 10.2.0.2 or 11.2.0.2 databases");
-        // Other point releases may also work
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
+if (!(isset($matches[0]) && 
+           (($matches[1] == 10 && $matches[2] >= 2) || 
+            ($matches[1] == 11 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 2)
+           ))) {
+    die("skip expected output only valid when using Oracle 10gR2 or 11.2.0.2 databases");
 }
-if (preg_match('/^11\./', oci_client_version()) != 1) {
+preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
+if (isset($matches[0]) && $matches[0] < 11) {
     die("skip test expected to work only with Oracle 11g or greater version of client");
 }
 ?>
index 6de9b9937855397f0bbdefcdb9ded9f706054629..7b4c158561959027e62619c7ea70dff676fb08ed 100644 (file)
@@ -5,12 +5,13 @@ Bug #27303 (OCIBindByName binds numeric PHP values as characters)
 if (!extension_loaded('oci8')) die ("skip no oci8 extension");
 require(dirname(__FILE__)."/connect.inc");
 // The bind buffer size edge cases seem to change each DB version.
-if (preg_match('/Release 10\.2\.0\.3/', oci_server_version($c), $matches) !== 1) {
-    if (preg_match('/Release 11\.1\.0\.6/', oci_server_version($c), $matches) !== 1) {
-        if (preg_match('/Release 11\.2\.0\.3/', oci_server_version($c), $matches) !== 1) {
-            die("skip expected output only valid when using specific Oracle database versions");
-        }
-    }
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
+if (!(isset($matches[0]) && 
+      (($matches[1] == 10 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 3) || 
+       ($matches[1] == 11 && $matches[2] == 1 && $matches[3] == 0 && $matches[4] == 6) ||
+       ($matches[1] == 11 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 3)
+       ))) {
+    die("skip expected output only valid when using Oracle 10gR2 or 11.2.0.2 databases");
 }
 ?>
 --FILE--
index 1fb2b316827198749c7b0b4b8f85295511d2e3fd..72d4e5a7ddbcf2a63bc84937b5b47329f1cc1878 100644 (file)
@@ -5,12 +5,15 @@ Bug #27303 (OCIBindByName binds numeric PHP values as characters)
 if (!extension_loaded('oci8')) die ("skip no oci8 extension");
 require(dirname(__FILE__)."/connect.inc");
 // The bind buffer size edge cases seem to change each DB version.
-if (preg_match('/Release 10\.2\.0\.2/', oci_server_version($c), $matches) !== 1 &&
-    preg_match('/Release 11\.2\.0\.2/', oci_server_version($c), $matches) !== 1) {
-        die("skip expected output only valid when using Oracle 10.2.0.2 or 11.2.0.2 databases");
-        // Other point releases may also work
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
+if (!(isset($matches[0]) && 
+      (($matches[1] == 10 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 2) || 
+       ($matches[1] == 11 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 2)
+       ))) {
+    die("skip expected output only valid when using Oracle 10.2.0.2 or 11.2.0.2 databases");
 }
-if (preg_match('/^11\./', oci_client_version()) != 1) {
+preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
+if (isset($matches[0]) && $matches[0] < 11) {
     die("skip test expected to work only with Oracle 11g or greater version of client");
 }
 ?>
index 1e3e3105ad6653cbe26f972f2783ffc9b4aa003d..27d8a585bd452a16e63fd80cf2d5144f151925b5 100644 (file)
@@ -5,12 +5,13 @@ Bug #27303 (OCIBindByName binds numeric PHP values as characters)
 if (!extension_loaded('oci8')) die ("skip no oci8 extension");
 require(dirname(__FILE__)."/connect.inc");
 // The bind buffer size edge cases seem to change each DB version.
-if (preg_match('/Release 10\.2\.0\.3/', oci_server_version($c), $matches) !== 1) {
-    if (preg_match('/Release 11\.1\.0\.6/', oci_server_version($c), $matches) !== 1) {
-        if (preg_match('/Release 11\.2\.0\.3/', oci_server_version($c), $matches) !== 1) {
-            die("skip expected output only valid when using specific Oracle database versions");
-        }
-    }
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
+if (!(isset($matches[0]) && 
+      (($matches[1] == 10 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 3) || 
+       ($matches[1] == 11 && $matches[2] == 1 && $matches[3] == 0 && $matches[4] == 6) || 
+       ($matches[1] == 11 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 3)
+       ))) {
+    die("skip expected output only valid when using specific Oracle database versions");
 }
 ?>
 --FILE--
index 3137db865919198621a22378643d130b4932e3cf..a24ae705aba57332e0df6ad9156b594ab8499bb7 100644 (file)
@@ -5,12 +5,16 @@ Bug #27303 (OCIBindByName binds numeric PHP values as characters)
 if (!extension_loaded('oci8')) die ("skip no oci8 extension");
 require(dirname(__FILE__)."/connect.inc");
 // The bind buffer size edge cases seem to change each DB version.
-if (preg_match('/Release 10\.2\.0\.2/', oci_server_version($c), $matches) !== 1 &&
-    preg_match('/Release 11\.2\.0\.2/', oci_server_version($c), $matches) !== 1) {
-        die("skip expected output only valid when using Oracle 10.2.0.2 or 11.2.0.2 databases");
-        // Other point releases may also work
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
+if (!(isset($matches[0]) && 
+           (($matches[1] == 10 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 2) ||
+            ($matches[1] == 11 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 2)
+           ))) {
+    die("skip expected output only valid when using Oracle 10.2.0.2 or 11.2.0.2 databases");
+    // Other point releases may also work
 }
-if (preg_match('/^11\./', oci_client_version()) != 1) {
+preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
+if (isset($matches[0]) && $matches[0] < 11) {
     die("skip test expected to work only with Oracle 11g or greater version of client");
 }
 ?>
index f9bc2da8a25ad04e836151b189e64c16daed1bd7..01db1dc5a0bef25e14cd533b0e5bccff183460e8 100644 (file)
@@ -5,12 +5,13 @@ Bug #27303 (OCIBindByName binds numeric PHP values as characters)
 if (!extension_loaded('oci8')) die ("skip no oci8 extension");
 require(dirname(__FILE__)."/connect.inc");
 // The bind buffer size edge cases seem to change each DB version.
-if (preg_match('/Release 10\.2\.0\.3/', oci_server_version($c), $matches) !== 1) {
-    if (preg_match('/Release 11\.1\.0\.6/', oci_server_version($c), $matches) !== 1) {
-        if (preg_match('/Release 11\.2\.0\.3/', oci_server_version($c), $matches) !== 1) {
-            die("skip expected output only valid when using specific Oracle database versions");
-        }
-    }
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
+if (!(isset($matches[0]) && 
+      (($matches[1] == 10 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 3) || 
+       ($matches[1] == 11 && $matches[2] == 1 && $matches[3] == 0 && $matches[4] == 6) || 
+       ($matches[1] == 11 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 3)
+       ))) {
+    die("skip expected output only valid when using specific Oracle database versions");
 }
 ?>
 --FILE--
index 53dae694ec8bf74f0fbd64f8c744e0efd4dbafcd..4ac32c4b069a567fa38a20a904246ea5fbd5f336 100644 (file)
@@ -3,8 +3,9 @@ Bug #36403 (oci_execute no longer supports OCI_DESCRIBE_ONLY)
 --SKIPIF--
 <?php
 if (!extension_loaded('oci8')) die ("skip no oci8 extension"); 
-if (preg_match('/^1[01]\./', oci_client_version()) != 1) {
-    die("skip expected output only valid with Oracle 10g or greater version of client");
+preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
+if (isset($matches[0]) && $matches[0] < 10) {
+    die("skip test expected to work only with Oracle 10g or greater version of client");
 }
 ?>
 --FILE--
index 8c57fabeeff4ab34a8b7293f97a5c1212c1a00d4..05798889c4320c358cce80a048fb2fcafdb48e13 100644 (file)
@@ -5,8 +5,9 @@ Bug #43497 (OCI8 XML/getClobVal aka temporary LOBs leak UGA memory)
 $target_dbs = array('oracledb' => true, 'timesten' => false);  // test runs on these DBs
 require(dirname(__FILE__).'/skipif.inc');
 if (getenv('SKIP_SLOW_TESTS')) die('skip slow tests excluded by request');
-if (preg_match('/^1[01]\./', oci_client_version()) != 1) {
-    die("skip expected output only valid with Oracle 10g or greater version of client");
+preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
+if (isset($matches[0]) && $matches[0] < 10) {
+    die("skip test expected to work only with Oracle 10g or greater version of client");
 }
 ?>
 --FILE--
index d0e00235374c985fab48377a513ef0cd2c1a887d..0098ec5ebb7727871c701a509f92933557934c03 100644 (file)
@@ -6,11 +6,12 @@ $target_dbs = array('oracledb' => true, 'timesten' => false);  // test runs on t
 require(dirname(__FILE__).'/skipif.inc');
 // error3.phpt obsoletes this test for newer Oracle client versions
 // Assume runtime client version is >= compile time client version
-$cv = explode('.', oci_client_version());
-if ($cv[0] > 11 || ($cv[0] == 11 && $cv[1] > 2) || ($cv[0] == 11 && $cv[1] == 2 && $cv[3] >= 3)) {
+preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
+if (!isset($matches[0]) ||
+    ($matches[0] > 11 || ($matches[0] == 11 && $matches[1] > 2) || ($matches[0] == 11 && $matches[1] == 2 && $matches[3] >= 3)
+     )) {
     die("skip test works only with Oracle 11.2.0.2 or earlier Oracle client libraries");
 }
-
 ?> 
 --ENV--
 NLS_LANG=.AL32UTF8
index 806fb193a0e7c6cc98a80c5cea1beb392749b2d6..ef4018118e31aa84cfcf2700709eb3a04906f671 100644 (file)
@@ -81,48 +81,48 @@ echo "Done\n";
 bool(true)
 int(0)
 array(5) {
-  [%u|b%"ID"]=>
+  ["ID"]=>
   array(0) {
   }
-  [%u|b%"VALUE"]=>
+  ["VALUE"]=>
   array(0) {
   }
-  [%u|b%"BLOB"]=>
+  ["BLOB"]=>
   array(0) {
   }
-  [%u|b%"CLOB"]=>
+  ["CLOB"]=>
   array(0) {
   }
-  [%u|b%"STRING"]=>
+  ["STRING"]=>
   array(0) {
   }
 }
 bool(true)
 int(4)
 array(5) {
-  [%u|b%"ID"]=>
+  ["ID"]=>
   array(4) {
     [0]=>
-    %string|unicode%(1) "1"
+    string(1) "1"
     [1]=>
-    %string|unicode%(1) "1"
+    string(1) "1"
     [2]=>
-    %string|unicode%(1) "1"
+    string(1) "1"
     [3]=>
-    %string|unicode%(1) "1"
+    string(1) "1"
   }
-  [%u|b%"VALUE"]=>
+  ["VALUE"]=>
   array(4) {
     [0]=>
-    %string|unicode%(1) "1"
+    string(1) "1"
     [1]=>
-    %string|unicode%(1) "1"
+    string(1) "1"
     [2]=>
-    %string|unicode%(1) "1"
+    string(1) "1"
     [3]=>
-    %string|unicode%(1) "1"
+    string(1) "1"
   }
-  [%u|b%"BLOB"]=>
+  ["BLOB"]=>
   array(4) {
     [0]=>
     NULL
@@ -133,7 +133,7 @@ array(5) {
     [3]=>
     NULL
   }
-  [%u|b%"CLOB"]=>
+  ["CLOB"]=>
   array(4) {
     [0]=>
     NULL
@@ -144,7 +144,7 @@ array(5) {
     [3]=>
     NULL
   }
-  [%u|b%"STRING"]=>
+  ["STRING"]=>
   array(4) {
     [0]=>
     NULL
index 220e6882106b6f6586e14e4da81aa69b4ba704ed..2edc1c95528dba65ea1108c15c9241001243e395 100644 (file)
@@ -2,30 +2,28 @@
 
 require(dirname(__FILE__)."/connect.inc");
 
-$sv = oci_server_version($c);
-$sv = preg_match('/Release (11\.2|12)\./', $sv, $matches);
-if ($sv == 1) {
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
+if ((isset($matches[1]) && $matches[1] >= 11)) {
     // Server is Oracle 11.2+
     $stmtarray = array(
-        "drop user testuser cascade",
-        "create user testuser identified by testuser",
-        "grant connect,resource,dba to testuser",
-        "alter user testuser enable editions",
-        "drop edition myedition1",
-        "drop edition myedition",
-        "grant create any edition to testuser",
+        "drop user $testuser cascade",
+        "create user $testuser identified by $testpassword",  // $testuser should be set by the file that includes conn_attr.inc
+        "grant connect,resource,dba to $testuser",
+        "alter user $testuser enable editions",
+        "drop edition myedition1 cascade",
+        "drop edition myedition cascade",
+        "grant create any edition to $testuser",
         "create edition myedition",
         "create edition myedition1 as child of myedition",
-        "grant use on edition myedition to testuser",
-        "grant use on edition myedition1 to testuser",
+        "grant use on edition myedition to $testuser",
+        "grant use on edition myedition1 to $testuser",
     );
-}
-else {
+} else {
     // Server is Pre 11.2 
     $stmtarray = array(
-        "drop user testuser cascade",
-        "create user testuser identified by testuser",
-        "grant connect,resource,dba to testuser",
+        "drop user $testuser cascade",
+        "create user $testuser identified by $testpassword",
+        "grant connect,resource,dba to $testuser",
     );
 }
 
@@ -68,8 +66,8 @@ function get_attr($conn,$attr)
 
 function get_conn($conn_type)
 {
-       $user = 'testuser';
-       $password = 'testuser';
+       $user = $GLOBALS['testuser'];
+       $password = $GLOBALS['testpassword'];
        $dbase = $GLOBALS['dbase'];
        switch($conn_type) {
         case 1:
@@ -139,9 +137,9 @@ function get_sys_attr($conn,$attr)
 
 function clean_up($c) {
        $stmtarray = array(
-        "drop user testuser cascade",
-        "drop edition myedition1",
-        "drop edition myedition",
+        "drop edition myedition1 cascade",
+        "drop edition myedition cascade",
+        "drop user " . $GLOBALS['testuser'] . " cascade",
        );
     
        foreach ($stmtarray as $stmt) {
index ad508a2ed2a4fd2206e682315e9826f9c87d30c2..631bc19c1d4169b9e282c2f3ba87151c29ef5607 100644 (file)
@@ -9,15 +9,21 @@ if (strcasecmp($user, "system") && strcasecmp($user, "sys"))
     die("skip needs to be run as a DBA user");
 if ($test_drcp) die("skip output might vary with DRCP");
 
-if (preg_match('/Release 1[01]\./', oci_server_version($c), $matches) !== 1) {
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
+if (!(isset($matches[0]) && $matches[1] >= 10)) {
        die("skip expected output only valid when using Oracle 10g or greater database server");
-} else if (preg_match('/^1[01]\./', oci_client_version()) != 1) {
+}
+preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
+if (isset($matches[0]) && $matches[0] < 10) {
     die("skip test expected to work only with Oracle 10g or greater version of client");
 }
-
 ?>
 --FILE--
 <?php
+
+$testuser     = 'testuser_attr_1';  // Used in conn_attr.inc
+$testpassword = 'testuser'; 
+
 require(dirname(__FILE__)."/conn_attr.inc");
 
 $attr_array = array('MODULE','ACTION','CLIENT_INFO','CLIENT_IDENTIFIER');
index 1072503529d380ec50e941788721fb608161dd33..432a3cff0494e818b006733652dd1c6a89e07b39 100644 (file)
@@ -8,40 +8,45 @@ require(dirname(__FILE__).'/skipif.inc');
 if (strcasecmp($user, "system") && strcasecmp($user, "sys")) die("skip needs to be run as a DBA user");
 if ($test_drcp) die("skip output might vary with DRCP");
 
-if (preg_match('/Release 1[01]\./', oci_server_version($c), $matches) !== 1) {
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
+if (!(isset($matches[0]) && $matches[1] >= 10)) {
        die("skip expected output only valid when using Oracle 10g or greater database server");
-} else if (preg_match('/^1[01]\./', oci_client_version()) != 1) {
+}
+preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
+if (isset($matches[0]) && $matches[0] < 10) {
     die("skip test expected to work only with Oracle 10g or greater version of client");
 }
-
 ?>
 --INI--
 oci8.privileged_connect = On
 --FILE--
 
 <?php
+
+$testuser     = 'testuser_attr_2';  // Used in conn_attr.inc
+$testpassword = 'testuser'; 
+
 require(dirname(__FILE__)."/conn_attr.inc");
-$user='testuser';
-$password='testuser';
+
 $attr_array = array('MODULE','ACTION','CLIENT_INFO','CLIENT_IDENTIFIER');
 
 echo"**Set values using pconnect-1**\n";
 
-var_dump($pc1 = oci_pconnect($user,$password,$dbase));
+var_dump($pc1 = oci_pconnect($testuser,$testpassword,$dbase));
 foreach($attr_array as $attr) {
        set_attr($pc1,$attr,100);
 }
 
 //  using pc1 again
 echo"\n**Get values using pconnect-2**\n";
-var_dump($pc3 = oci_pconnect($user,$password,$dbase));
+var_dump($pc3 = oci_pconnect($testuser,$testpassword,$dbase));
 foreach($attr_array as $attr) {
        get_attr($pc3,$attr);
 }
 
 // Get with different pconnect
 echo"\n**Get values using pconnect-3**\n";
-var_dump($pc2 = oci_pconnect($user,$password,$dbase,'UTF8'));
+var_dump($pc2 = oci_pconnect($testuser,$testpassword,$dbase,'UTF8'));
 foreach($attr_array as $attr) {
        get_attr($pc2,$attr);
 }
@@ -52,15 +57,22 @@ oci_close($pc3);
 
 // Re-open a persistent connection and check for the attr values.
 echo "\n**Re-open a pconnect()**\n";
-var_dump($pc4 = oci_pconnect($user,$password,$dbase));
+var_dump($pc4 = oci_pconnect($testuser,$testpassword,$dbase));
 foreach($attr_array as $attr) {
        get_attr($pc4,$attr);
 }
 oci_close($pc4);
 
 // Test with SYSDBA connection.
-var_dump($sys_c1 = oci_pconnect($user,$password,$dbase,false,OCI_SYSDBA));
-if ($sys_c1) {
+echo "\n**Test with SYSDBA connection**\n";
+$sys_c1 = @oci_pconnect($testuser,$testpassword,$dbase,false,OCI_SYSDBA);
+var_dump($sys_c1);
+if (!$sys_c1) {
+    $e = oci_error();
+    if ($e['code'] != 1031 && $e['code'] != 1017) {
+        var_dump($e);
+    }
+} else {
        set_attr($sys_c1,'ACTION',10);
        get_sys_attr($sys_c1,'ACTION');
        get_attr($pc2,'ACTION');
@@ -100,6 +112,6 @@ The value of ACTION is TASK100
 The value of CLIENT_INFO is INFO1100
 The value of CLIENT_IDENTIFIER is ID00100
 
-Warning: oci_pconnect(): ORA-01031: %s on line %d
+**Test with SYSDBA connection**
 bool(false)
 Done
index be8d3306de129eb61466a27bbf732e2e0d1c455e..921487c9a00e1ee1ef4a48d83f20055de44c036f 100644 (file)
@@ -8,14 +8,21 @@ require(dirname(__FILE__).'/skipif.inc');
 if (strcasecmp($user, "system") && strcasecmp($user, "sys")) die("skip needs to be run as a DBA user");
 if ($test_drcp) die("skip output might vary with DRCP");
 
-if (preg_match('/Release 1[01]\./', oci_server_version($c), $matches) !== 1) {
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
+if (!(isset($matches[0]) && $matches[1] >= 10)) {
        die("skip expected output only valid when using Oracle 10g or greater database server");
-} else if (preg_match('/^1[01]\./', oci_client_version()) != 1) {
+}
+preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
+if (isset($matches[0]) && $matches[0] < 10) {
     die("skip test expected to work only with Oracle 10g or greater version of client");
 }
 ?>
 --FILE--
 <?php
+
+$testuser     = 'testuser_attr_3';  // Used in conn_attr.inc
+$testpassword = 'testuser'; 
+
 require(dirname(__FILE__)."/conn_attr.inc");
 
 echo"**Test Set and get values for  the attributes with oci_close() ************\n";
index 4885f80b717a9f798dd9e9d7a95e966212baee98..f32f9876d532d2761a0b00b8b2aedcafb718e08e 100644 (file)
@@ -9,21 +9,27 @@ if (getenv('SKIP_SLOW_TESTS')) die('skip slow tests excluded by request');
 if (strcasecmp($user, "system") && strcasecmp($user, "sys")) die("skip needs to be run as a DBA user");
 if ($test_drcp) die("skip output might vary with DRCP");
 
-if (preg_match('/Release (11\.2|12)\./', oci_server_version($c), $matches) !== 1) {
-    // Bug fixed in 11.2 prevents client_info being rest
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
+if (!(isset($matches[0]) && 
+      (($matches[1] == 11 && $matches[2] >= 2) ||
+       ($matches[1] >= 12)
+       ))) {
+    // Bug fixed in 11.2 prevents client_info being reset
        die("skip expected output only valid when using Oracle 11gR2 or greater database server");
-} else if (preg_match('/^1[01]\./', oci_client_version()) != 1) {
+}
+preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
+if (isset($matches[0]) && $matches[0] < 10) {
     die("skip test expected to work only with Oracle 10g or greater version of client");
 }
 ?>
 --FILE--
 <?php
 
+$testuser     = 'testuser_attr_4';  // Used in conn_attr.inc
+$testpassword = 'testuser'; 
 
 require(dirname(__FILE__)."/conn_attr.inc");
 
-$user='testuser';
-$password='testuser';
 $attr_array = array('MODULE','ACTION','CLIENT_INFO','CLIENT_IDENTIFIER');
 
 echo"**Test  Negative cases************\n";
@@ -40,7 +46,7 @@ var_dump(oci_set_client_info($str1,$str1));
 
 // Setting an Invalid value.
 echo "\nInvalid Value \n";
-$c1=oci_connect($user,$password,$dbase);
+$c1=oci_connect($testuser,$testpassword,$dbase);
 var_dump(oci_set_action($c1,$c1));
 
 // Setting values multiple times.
index d694ec06a5bdc267433c78f95dda152d2432b4e9..77f233b4e21e4f110d43b76b6ba352558f6f47dc 100644 (file)
@@ -8,14 +8,21 @@ require(dirname(__FILE__).'/skipif.inc');
 if (strcasecmp($user, "system") && strcasecmp($user, "sys")) die("skip needs to be run as a DBA user");
 if ($test_drcp) die("skip output might vary with DRCP");
 
-if (preg_match('/Release 1[01]\./', oci_server_version($c), $matches) !== 1) {
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
+if (!(isset($matches[0]) && $matches[1] >= 10)) {
        die("skip expected output only valid when using Oracle 10g or greater database server");
-} else if (preg_match('/^1[01]\./', oci_client_version()) != 1) {
+}
+preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
+if (isset($matches[0]) && $matches[0] < 10) {
     die("skip test expected to work only with Oracle 10g or greater version of client");
 }
 ?>
 --FILE--
 <?php
+
+$testuser     = 'testuser_attr_5';  // Used in conn_attr.inc
+$testpassword = 'testuser'; 
+
 require(dirname(__FILE__)."/conn_attr.inc");
 
 echo"**Test - Set and get values for the attributes with scope end ************\n";
index e14fb93695eb4c4356d8b85dbcc4e87e1086b065..0acd2bc33a76f5b601354dd5e2f7e3cc76be03fc 100644 (file)
@@ -10,8 +10,8 @@ $ov = preg_match('/Compile-time ORACLE_HOME/', $phpinfo);
 if ($ov !== 1) {
        die ("skip Test only valid when OCI8 is built with an ORACLE_HOME");
 }
-$iv = preg_match('/Oracle .*Version => (10\.2)/', $phpinfo);
-if ($iv != 1) {
+preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
+if (!isset($matches[0]) || !($matches[0] == 10 && $matches[0] == 2)) {
     die ("skip tests a feature that works only with Oracle 10gR2");
 }
 ?>
index 1620803dbb738d5f781a8db931f357f9f4a0775c..40dc5a98fc7e3df562be719faa995f366f840f9e 100644 (file)
@@ -10,7 +10,11 @@ $ov = preg_match('/Compile-time ORACLE_HOME/', $phpinfo);
 if ($ov != 1) {
        die ("skip Test only valid when OCI8 is built with an ORACLE_HOME");
 }
-if (preg_match('/^11\.2|12\./', oci_client_version()) != 1) {
+preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
+if (!(isset($matches[0]) &&
+    (($matches[0] == 11 && $matches[1] >= 2) ||
+     ($matches[0] >= 12)
+     ))) {
     die("skip test expected to work only with Oracle 11gR2 or greater version of client");
 }
 ?>
index c7cfecf396119eb8fa197be802f9ba9d4a9cae20..e04016f41a766e4fcf1bb389ec2476f4de86f460 100644 (file)
@@ -10,7 +10,11 @@ $ov = preg_match('/Compile-time ORACLE_HOME/', $phpinfo);
 if ($ov !== 1) {
        die ("skip Test only valid when OCI8 is built with an ORACLE_HOME");
 }
-if (preg_match('/^11\.2|12\./', oci_client_version()) != 1) {
+preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
+if (!(isset($matches[0]) &&
+      (($matches[0] == 11 && $matches[1] >= 2) ||
+       ($matches[0] >= 12)
+       ))) {
     die("skip test expected to work only with Oracle 11gR2 or greater version of client");
 }
 ?>
index d60e2ff1ea43000b14f63b9fa4f5b48f1f0199c7..aa25937570e59f9257d278e274acfb408ae48cc8 100644 (file)
@@ -52,19 +52,19 @@ echo "Done\n";
 ?>
 --EXPECTF--
 array(2) {
-  [%u|b%"ID"]=>
-  %unicode|string%(1) "1"
-  [%u|b%"VALUE"]=>
-  %unicode|string%(1) "1"
+  ["ID"]=>
+  string(1) "1"
+  ["VALUE"]=>
+  string(1) "1"
 }
 bool(true)
 
 Warning: ocifetchinto():%sORA-01002: %s in %scursors_old.php on line %d
 array(2) {
-  [%u|b%"ID"]=>
-  %unicode|string%(1) "1"
-  [%u|b%"VALUE"]=>
-  %unicode|string%(1) "1"
+  ["ID"]=>
+  string(1) "1"
+  ["VALUE"]=>
+  string(1) "1"
 }
 bool(true)
 Done
index fe96e6e87ec44442c26ed8b41b29f2d19ef89969..66ab0f0d005f0a8699d4e9c4e11350ed2d316394 100644 (file)
@@ -16,10 +16,9 @@ else {
        oci_connect($user, $password);
 }
        
-echo "Done\n";
-
 oci_internal_debug(false);
 
 ?>
---EXPECTREGEX--
-^OCI8 DEBUG: .*Done$
+===DONE===
+--EXPECT--
+===DONE===
index c6ce7bd9b30481af689e21452308c9f814f8346f..b78f698e7c38ec8a49a091daf0ebbcde2b96ad05 100644 (file)
@@ -44,5 +44,5 @@ echo "Done\n";
 
 ?>
 --EXPECTF--
-%unicode|string%(%d) "some"
+string(%d) "some"
 Done
index 6e4b74e3bacb553e64b94cccfa17552fe6496ab1..be16271d5bb163a36375e8319efd566e0a0546f3 100644 (file)
@@ -55,5 +55,5 @@ bool(false)
 
 Warning: oci_define_by_name() expects at least 3 parameters, 2 given in %s on line %d
 NULL
-%unicode|string%(4) "some"
+string(4) "some"
 Done
index 266fd7edd70fe2cd365c54f4e48e7110de5b1bdb..3114a7393769637393ab13fa8f0d87c75d79b0f0 100644 (file)
@@ -58,15 +58,15 @@ echo "Done\n";
 Test 1
 bool(true)
 Test 2
-%unicode|string%(4) "1234"
-%unicode|string%(4) "some"
-%unicode|string%(4) "some"
-%unicode|string%(4) "some"
-%unicode|string%(4) "1234"
-%unicode|string%(4) "some"
+string(4) "1234"
+string(4) "some"
+string(4) "some"
+string(4) "some"
+string(4) "1234"
+string(4) "some"
 Test 3
 bool(true)
-%unicode|string%(4) "some"
+string(4) "some"
 
 Warning: oci_result(): %d is not a valid oci8 statement resource in %s on line %d
 bool(false)
index 68fa01d09aa872298a3584567aee38af3820b231..978d66b26074582ec5e7633f0e848c602f0358e4 100644 (file)
@@ -61,12 +61,12 @@ echo "Done\n";
 Test 1 - must do define before execute
 bool(true)
 NULL
-%unicode|string%(4) "some"
+string(4) "some"
 Test 2 - normal define order
 bool(true)
-%unicode|string%(4) "some"
+string(4) "some"
 Test 3 - no new define done
-%unicode|string%(4) "some"
-%unicode|string%(5) "thing"
+string(4) "some"
+string(5) "thing"
 Done
 
index f65e6b80809b45d2331ebc9e4dcae487542d19f7..cc07e2ea94fb8cd7f89dcce8c249a364370a84da 100644 (file)
@@ -44,5 +44,5 @@ echo "Done\n";
 
 ?>
 --EXPECTF--
-%unicode|string%(4) "some"
+string(4) "some"
 Done
index 9a86c468684789e6c399765539e7b72c424f1989..e54ea84abdb47ef4cf3b4bdad9c6647b8d14aa76 100644 (file)
@@ -52,7 +52,7 @@ if (!function_exists('oci8_test_sql_execute')) {
             $s = oci_parse($c, $stmt);
             if (!$s) {
                 $m = oci_error($c);
-                echo $stmt . PHP_EOL . $m['message'] . PHP_EOL;
+                echo "oci8_test_sql_execute() error:". PHP_EOL . $stmt . PHP_EOL . $m['message'] . PHP_EOL;
             }
             else {
                 $r = @oci_execute($s);
@@ -66,7 +66,7 @@ if (!function_exists('oci8_test_sql_execute')) {
                                 ,  4080 // trigger does not exist
                                 , 38802 // edition does not exist
                             ))) {
-                        echo $stmt . PHP_EOL . $m['message'] . PHP_EOL;
+                       echo "oci8_test_sql_execute() error:". PHP_EOL . $stmt . PHP_EOL . $m['message'] . PHP_EOL;
                     }
                 }
             }
index b9c8fd817ef879dc95ee58cf50f1ee0731de3b82..d8ca53cddf0616163587cee4b76773329a208e63 100644 (file)
@@ -24,6 +24,9 @@ if (preg_match('/Release (1[1]\.2|12)\./', oci_server_version($c), $matches) !==
  * already 
  */
 
+$testuser     = 'testuser_attr_1';  // Used in conn_attr.inc
+$testpassword = 'testuser'; 
+
 require(dirname(__FILE__)."/conn_attr.inc");
 
 function select_fn($conn) {
@@ -39,7 +42,7 @@ function select_fn($conn) {
    select from both the editions and verify the contents. */
 
 set_edit_attr('MYEDITION');
-$conn = oci_connect('testuser','testuser',$dbase); 
+$conn = oci_connect($testuser,$testpassword,$dbase); 
 if ($conn === false) {
     $m = oci_error();
     die("Error:" . $m['message']);
@@ -61,7 +64,7 @@ select_fn($conn);
 
 // Create a different version of view_ed in MYEDITION1.
 set_edit_attr('MYEDITION1');
-$conn2 = oci_new_connect('testuser','testuser',$dbase); 
+$conn2 = oci_new_connect($testuser,$testpassword,$dbase); 
 $stmt = "create or replace editioning view view_ed as select name,age,job,salary from edit_tab";
 $s = oci_parse($conn2, $stmt);
 oci_execute($s);
@@ -87,58 +90,58 @@ The value of edition has been successfully set
 The value of current EDITION is MYEDITION
 array(3) {
   [0]=>
-  %unicode|string%(%d) "mike"
+  string(%d) "mike"
   [1]=>
-  %unicode|string%(%d) "30"
+  string(%d) "30"
   [2]=>
-  %unicode|string%(%d) "Senior engineer"
+  string(%d) "Senior engineer"
 }
 array(3) {
   [0]=>
-  %unicode|string%(%d) "juan"
+  string(%d) "juan"
   [1]=>
-  %unicode|string%(%d) "25"
+  string(%d) "25"
   [2]=>
-  %unicode|string%(%d) "engineer"
+  string(%d) "engineer"
 }
  The value of edition has been successfully set
 The value of current EDITION is MYEDITION1
 array(4) {
   [0]=>
-  %unicode|string%(%d) "mike"
+  string(%d) "mike"
   [1]=>
-  %unicode|string%(%d) "30"
+  string(%d) "30"
   [2]=>
-  %unicode|string%(%d) "Senior engineer"
+  string(%d) "Senior engineer"
   [3]=>
-  %unicode|string%(%d) "200"
+  string(%d) "200"
 }
 array(4) {
   [0]=>
-  %unicode|string%(%d) "juan"
+  string(%d) "juan"
   [1]=>
-  %unicode|string%(%d) "25"
+  string(%d) "25"
   [2]=>
-  %unicode|string%(%d) "engineer"
+  string(%d) "engineer"
   [3]=>
-  %unicode|string%(%d) "100"
+  string(%d) "100"
 }
 version of view_ed in MYEDITION 
 The value of current EDITION is MYEDITION
 array(3) {
   [0]=>
-  %unicode|string%(%d) "mike"
+  string(%d) "mike"
   [1]=>
-  %unicode|string%(%d) "30"
+  string(%d) "30"
   [2]=>
-  %unicode|string%(%d) "Senior engineer"
+  string(%d) "Senior engineer"
 }
 array(3) {
   [0]=>
-  %unicode|string%(%d) "juan"
+  string(%d) "juan"
   [1]=>
-  %unicode|string%(%d) "25"
+  string(%d) "25"
   [2]=>
-  %unicode|string%(%d) "engineer"
+  string(%d) "engineer"
 }
 Done
index 030e6a673c85950741ac9c0b50a6d465efe86257..0ffb62dc32633370df3b04162c0fe9127939ae19 100644 (file)
@@ -24,10 +24,10 @@ if (preg_match('/Release (1[1]\.2|12)\./', oci_server_version($c), $matches) !==
  * already
  */
 
-require(dirname(__FILE__)."/conn_attr.inc");
+$testuser     = 'testuser_ed_2';  // Used in conn_attr.inc
+$testpassword = 'testuser'; 
 
-$user = 'testuser';
-$password = 'testuser';
+require(dirname(__FILE__)."/conn_attr.inc");
 
 echo"**Test 1.1 - Default value for  the attribute **************\n";
 get_edit_attr($c);
@@ -50,7 +50,7 @@ get_edit_attr($conn3);
 oci_close($conn1);
 
 // With a oci_pconnect with a different charset.
-$pc1 = oci_pconnect($user,$password,$dbase,"utf8");
+$pc1 = oci_pconnect($testuser,$testpassword,$dbase,"utf8");
 get_edit_attr($pc1);
 oci_close($pc1);
 
@@ -145,7 +145,7 @@ function set_scope() {
 }
 
 function get_scope() {
-    $sc1 = oci_connect($GLOBALS['user'],$GLOBALS['password'],$GLOBALS['dbase']);
+    $sc1 = oci_connect($GLOBALS['testuser'],$GLOBALS['testpassword'],$GLOBALS['dbase']);
     if ($sc1 === false) {
         $m = oci_error();
         die("Error:" . $m['message']);
index 37f8f3834d8039efc7f6b946ef49d3caa7daabe8..1194ae180dd20a07ab1b98b616ce9750afe8f7dd 100644 (file)
@@ -143,56 +143,56 @@ Test 7
 
 Warning: oci_connect(): ORA-12154: %s in %s on line %d
 array(4) {
-  [%u|b%"code"]=>
+  ["code"]=>
   int(12154)
-  [%u|b%"message"]=>
-  %unicode|string%(%d) "ORA-12154: %s"
-  [%u|b%"offset"]=>
+  ["message"]=>
+  string(%d) "ORA-12154: %s"
+  ["offset"]=>
   int(0)
-  [%u|b%"sqltext"]=>
-  %unicode|string%(0) ""
+  ["sqltext"]=>
+  string(0) ""
 }
 bool(false)
 Test 8
 
 Warning: oci_connect(): ORA-12154: %s in %s on line %d
 array(4) {
-  [%u|b%"code"]=>
+  ["code"]=>
   int(12154)
-  [%u|b%"message"]=>
-  %unicode|string%(%d) "ORA-12154: %s"
-  [%u|b%"offset"]=>
+  ["message"]=>
+  string(%d) "ORA-12154: %s"
+  ["offset"]=>
   int(0)
-  [%u|b%"sqltext"]=>
-  %unicode|string%(0) ""
+  ["sqltext"]=>
+  string(0) ""
 }
 bool(false)
 Test 9
 
 Warning: oci_connect(): ORA-%d: TNS:%s in %s on line %d
 array(4) {
-  [%u|b%"code"]=>
+  ["code"]=>
   int(%d)
-  [%u|b%"message"]=>
-  %unicode|string%(%d) "ORA-%d: %s"
-  [%u|b%"offset"]=>
+  ["message"]=>
+  string(%d) "ORA-%d: %s"
+  ["offset"]=>
   int(0)
-  [%u|b%"sqltext"]=>
-  %unicode|string%(0) ""
+  ["sqltext"]=>
+  string(0) ""
 }
 bool(false)
 Test 10
 
 Warning: oci_connect(): ORA-%d: TNS:%s in %s on line %d
 array(4) {
-  [%u|b%"code"]=>
+  ["code"]=>
   int(%d)
-  [%u|b%"message"]=>
-  %unicode|string%(%d) "ORA-%d: %s"
-  [%u|b%"offset"]=>
+  ["message"]=>
+  string(%d) "ORA-%d: %s"
+  ["offset"]=>
   int(0)
-  [%u|b%"sqltext"]=>
-  %unicode|string%(0) ""
+  ["sqltext"]=>
+  string(0) ""
 }
 bool(false)
 ===DONE===
index f3b517f730af44268aec445602209cb4f9d05031..0a3227019ce4128c6076d5c68ebc1da217724009 100644 (file)
@@ -142,56 +142,56 @@ Test 7
 
 Warning: oci_new_connect(): ORA-12154: %s in %s on line %d
 array(4) {
-  [%u|b%"code"]=>
+  ["code"]=>
   int(12154)
-  [%u|b%"message"]=>
-  %unicode|string%(%d) "ORA-12154: %s"
-  [%u|b%"offset"]=>
+  ["message"]=>
+  string(%d) "ORA-12154: %s"
+  ["offset"]=>
   int(0)
-  [%u|b%"sqltext"]=>
-  %unicode|string%(0) ""
+  ["sqltext"]=>
+  string(0) ""
 }
 bool(false)
 Test 8
 
 Warning: oci_new_connect(): ORA-12154: %s in %s on line %d
 array(4) {
-  [%u|b%"code"]=>
+  ["code"]=>
   int(12154)
-  [%u|b%"message"]=>
-  %unicode|string%(%d) "ORA-12154: %s"
-  [%u|b%"offset"]=>
+  ["message"]=>
+  string(%d) "ORA-12154: %s"
+  ["offset"]=>
   int(0)
-  [%u|b%"sqltext"]=>
-  %unicode|string%(0) ""
+  ["sqltext"]=>
+  string(0) ""
 }
 bool(false)
 Test 9
 
 Warning: oci_new_connect(): ORA-%d: TNS:%s %s on line %d
 array(4) {
-  [%u|b%"code"]=>
+  ["code"]=>
   int(%d)
-  [%u|b%"message"]=>
-  %unicode|string%(%d) "ORA-%d: %s"
-  [%u|b%"offset"]=>
+  ["message"]=>
+  string(%d) "ORA-%d: %s"
+  ["offset"]=>
   int(0)
-  [%u|b%"sqltext"]=>
-  %unicode|string%(0) ""
+  ["sqltext"]=>
+  string(0) ""
 }
 bool(false)
 Test 10
 
 Warning: oci_new_connect(): ORA-%d: TNS:%s %s on line %d
 array(4) {
-  [%u|b%"code"]=>
+  ["code"]=>
   int(%d)
-  [%u|b%"message"]=>
-  %unicode|string%(%d) "ORA-%d: %s"
-  [%u|b%"offset"]=>
+  ["message"]=>
+  string(%d) "ORA-%d: %s"
+  ["offset"]=>
   int(0)
-  [%u|b%"sqltext"]=>
-  %unicode|string%(0) ""
+  ["sqltext"]=>
+  string(0) ""
 }
 bool(false)
 ===DONE===
index e6685eb1769bae3c43b6e7f0bf79663f055988d8..d7884ce6b48f68409251459b1d3bf1d735c3b053 100644 (file)
@@ -142,56 +142,56 @@ Test 7
 
 Warning: oci_pconnect(): ORA-12154: %s in %s on line %d
 array(4) {
-  [%u|b%"code"]=>
+  ["code"]=>
   int(12154)
-  [%u|b%"message"]=>
-  %unicode|string%(%d) "ORA-12154: %s"
-  [%u|b%"offset"]=>
+  ["message"]=>
+  string(%d) "ORA-12154: %s"
+  ["offset"]=>
   int(0)
-  [%u|b%"sqltext"]=>
-  %unicode|string%(0) ""
+  ["sqltext"]=>
+  string(0) ""
 }
 bool(false)
 Test 8
 
 Warning: oci_pconnect(): ORA-12154: %s in %s on line %d
 array(4) {
-  [%u|b%"code"]=>
+  ["code"]=>
   int(12154)
-  [%u|b%"message"]=>
-  %unicode|string%(%d) "ORA-12154: %s"
-  [%u|b%"offset"]=>
+  ["message"]=>
+  string(%d) "ORA-12154: %s"
+  ["offset"]=>
   int(0)
-  [%u|b%"sqltext"]=>
-  %unicode|string%(0) ""
+  ["sqltext"]=>
+  string(0) ""
 }
 bool(false)
 Test 9
 
 Warning: oci_pconnect(): ORA-%d: TNS:%s in %s on line %d
 array(4) {
-  [%u|b%"code"]=>
+  ["code"]=>
   int(%d)
-  [%u|b%"message"]=>
-  %unicode|string%(%d) "ORA-%d: %s"
-  [%u|b%"offset"]=>
+  ["message"]=>
+  string(%d) "ORA-%d: %s"
+  ["offset"]=>
   int(0)
-  [%u|b%"sqltext"]=>
-  %unicode|string%(0) ""
+  ["sqltext"]=>
+  string(0) ""
 }
 bool(false)
 Test 10
 
 Warning: oci_pconnect(): ORA-%d: TNS:%s in %s on line %d
 array(4) {
-  [%u|b%"code"]=>
+  ["code"]=>
   int(%d)
-  [%u|b%"message"]=>
-  %unicode|string%(%d) "ORA-%d: %s"
-  [%u|b%"offset"]=>
+  ["message"]=>
+  string(%d) "ORA-%d: %s"
+  ["offset"]=>
   int(0)
-  [%u|b%"sqltext"]=>
-  %unicode|string%(0) ""
+  ["sqltext"]=>
+  string(0) ""
 }
 bool(false)
 ===DONE===
index e48aeefd87b6140bec50bdec87c74bdaa2466988..b968ae4bf6ea19ff4536c91e21db44a00302e363 100644 (file)
@@ -47,10 +47,10 @@ oci8_test_sql_execute($c, $stmtarray);
 echo "Done\n";
 ?>
 --EXPECTF--
-%unicode|string%(1) "1"
-%unicode|string%(1) "1"
-%unicode|string%(1) "1"
-%unicode|string%(1) "1"
-%unicode|string%(1) "1"
-%unicode|string%(1) "1"
+string(1) "1"
+string(1) "1"
+string(1) "1"
+string(1) "1"
+string(1) "1"
+string(1) "1"
 Done
index 4fc41daad482fb2efb3a312eb8b112e8e09f5ec0..b8155b170b0aa8a787fb0d98d6cea7120c182c8e 100644 (file)
@@ -51,44 +51,44 @@ echo "Done\n";
 --EXPECTF--
 int(3)
 array(2) {
-  [%u|b%"ID"]=>
+  ["ID"]=>
   array(3) {
     [0]=>
-    %unicode|string%(1) "1"
+    string(1) "1"
     [1]=>
-    %unicode|string%(1) "1"
+    string(1) "1"
     [2]=>
-    %unicode|string%(1) "1"
+    string(1) "1"
   }
-  [%u|b%"VALUE"]=>
+  ["VALUE"]=>
   array(3) {
     [0]=>
-    %unicode|string%(1) "1"
+    string(1) "1"
     [1]=>
-    %unicode|string%(1) "1"
+    string(1) "1"
     [2]=>
-    %unicode|string%(1) "1"
+    string(1) "1"
   }
 }
 int(3)
 array(2) {
-  [%u|b%"ID"]=>
+  ["ID"]=>
   array(3) {
     [0]=>
-    %unicode|string%(1) "1"
+    string(1) "1"
     [1]=>
-    %unicode|string%(1) "1"
+    string(1) "1"
     [2]=>
-    %unicode|string%(1) "1"
+    string(1) "1"
   }
-  [%u|b%"VALUE"]=>
+  ["VALUE"]=>
   array(3) {
     [0]=>
-    %unicode|string%(1) "1"
+    string(1) "1"
     [1]=>
-    %unicode|string%(1) "1"
+    string(1) "1"
     [2]=>
-    %unicode|string%(1) "1"
+    string(1) "1"
   }
 }
 Done
index 4fc41daad482fb2efb3a312eb8b112e8e09f5ec0..b8155b170b0aa8a787fb0d98d6cea7120c182c8e 100644 (file)
@@ -51,44 +51,44 @@ echo "Done\n";
 --EXPECTF--
 int(3)
 array(2) {
-  [%u|b%"ID"]=>
+  ["ID"]=>
   array(3) {
     [0]=>
-    %unicode|string%(1) "1"
+    string(1) "1"
     [1]=>
-    %unicode|string%(1) "1"
+    string(1) "1"
     [2]=>
-    %unicode|string%(1) "1"
+    string(1) "1"
   }
-  [%u|b%"VALUE"]=>
+  ["VALUE"]=>
   array(3) {
     [0]=>
-    %unicode|string%(1) "1"
+    string(1) "1"
     [1]=>
-    %unicode|string%(1) "1"
+    string(1) "1"
     [2]=>
-    %unicode|string%(1) "1"
+    string(1) "1"
   }
 }
 int(3)
 array(2) {
-  [%u|b%"ID"]=>
+  ["ID"]=>
   array(3) {
     [0]=>
-    %unicode|string%(1) "1"
+    string(1) "1"
     [1]=>
-    %unicode|string%(1) "1"
+    string(1) "1"
     [2]=>
-    %unicode|string%(1) "1"
+    string(1) "1"
   }
-  [%u|b%"VALUE"]=>
+  ["VALUE"]=>
   array(3) {
     [0]=>
-    %unicode|string%(1) "1"
+    string(1) "1"
     [1]=>
-    %unicode|string%(1) "1"
+    string(1) "1"
     [2]=>
-    %unicode|string%(1) "1"
+    string(1) "1"
   }
 }
 Done
index 1748ea5658eb3c80cf8b887f53a3840620b848b3..4c0be1cc079b15a6f3be7b518574a8221e909ddf 100644 (file)
@@ -129,105 +129,105 @@ echo "Done\n";
 None
 int(4)
 array(2) {
-  [%u|b%"ID"]=>
+  ["ID"]=>
   array(4) {
     [0]=>
-    %unicode|string%(1) "1"
+    string(1) "1"
     [1]=>
-    %unicode|string%(1) "2"
+    string(1) "2"
     [2]=>
-    %unicode|string%(1) "3"
+    string(1) "3"
     [3]=>
-    %unicode|string%(1) "4"
+    string(1) "4"
   }
-  [%u|b%"VALUE"]=>
+  ["VALUE"]=>
   array(4) {
     [0]=>
-    %unicode|string%(2) "-1"
+    string(2) "-1"
     [1]=>
-    %unicode|string%(2) "-2"
+    string(2) "-2"
     [2]=>
-    %unicode|string%(2) "-3"
+    string(2) "-3"
     [3]=>
-    %unicode|string%(2) "-4"
+    string(2) "-4"
   }
 }
 OCI_ASSOC
 int(4)
 array(2) {
-  [%u|b%"ID"]=>
+  ["ID"]=>
   array(4) {
     [0]=>
-    %unicode|string%(1) "1"
+    string(1) "1"
     [1]=>
-    %unicode|string%(1) "2"
+    string(1) "2"
     [2]=>
-    %unicode|string%(1) "3"
+    string(1) "3"
     [3]=>
-    %unicode|string%(1) "4"
+    string(1) "4"
   }
-  [%u|b%"VALUE"]=>
+  ["VALUE"]=>
   array(4) {
     [0]=>
-    %unicode|string%(2) "-1"
+    string(2) "-1"
     [1]=>
-    %unicode|string%(2) "-2"
+    string(2) "-2"
     [2]=>
-    %unicode|string%(2) "-3"
+    string(2) "-3"
     [3]=>
-    %unicode|string%(2) "-4"
+    string(2) "-4"
   }
 }
 OCI_FETCHSTATEMENT_BY_COLUMN
 int(4)
 array(2) {
-  [%u|b%"ID"]=>
+  ["ID"]=>
   array(4) {
     [0]=>
-    %unicode|string%(1) "1"
+    string(1) "1"
     [1]=>
-    %unicode|string%(1) "2"
+    string(1) "2"
     [2]=>
-    %unicode|string%(1) "3"
+    string(1) "3"
     [3]=>
-    %unicode|string%(1) "4"
+    string(1) "4"
   }
-  [%u|b%"VALUE"]=>
+  ["VALUE"]=>
   array(4) {
     [0]=>
-    %unicode|string%(2) "-1"
+    string(2) "-1"
     [1]=>
-    %unicode|string%(2) "-2"
+    string(2) "-2"
     [2]=>
-    %unicode|string%(2) "-3"
+    string(2) "-3"
     [3]=>
-    %unicode|string%(2) "-4"
+    string(2) "-4"
   }
 }
 OCI_FETCHSTATEMENT_BY_COLUMN|OCI_ASSOC
 int(4)
 array(2) {
-  [%u|b%"ID"]=>
+  ["ID"]=>
   array(4) {
     [0]=>
-    %unicode|string%(1) "1"
+    string(1) "1"
     [1]=>
-    %unicode|string%(1) "2"
+    string(1) "2"
     [2]=>
-    %unicode|string%(1) "3"
+    string(1) "3"
     [3]=>
-    %unicode|string%(1) "4"
+    string(1) "4"
   }
-  [%u|b%"VALUE"]=>
+  ["VALUE"]=>
   array(4) {
     [0]=>
-    %unicode|string%(2) "-1"
+    string(2) "-1"
     [1]=>
-    %unicode|string%(2) "-2"
+    string(2) "-2"
     [2]=>
-    %unicode|string%(2) "-3"
+    string(2) "-3"
     [3]=>
-    %unicode|string%(2) "-4"
+    string(2) "-4"
   }
 }
 OCI_FETCHSTATEMENT_BY_COLUMN|OCI_NUM
@@ -236,24 +236,24 @@ array(2) {
   [0]=>
   array(4) {
     [0]=>
-    %unicode|string%(1) "1"
+    string(1) "1"
     [1]=>
-    %unicode|string%(1) "2"
+    string(1) "2"
     [2]=>
-    %unicode|string%(1) "3"
+    string(1) "3"
     [3]=>
-    %unicode|string%(1) "4"
+    string(1) "4"
   }
   [1]=>
   array(4) {
     [0]=>
-    %unicode|string%(2) "-1"
+    string(2) "-1"
     [1]=>
-    %unicode|string%(2) "-2"
+    string(2) "-2"
     [2]=>
-    %unicode|string%(2) "-3"
+    string(2) "-3"
     [3]=>
-    %unicode|string%(2) "-4"
+    string(2) "-4"
   }
 }
 OCI_FETCHSTATEMENT_BY_COLUMN|OCI_NUM|OCI_ASSOC
@@ -262,24 +262,24 @@ array(2) {
   [0]=>
   array(4) {
     [0]=>
-    %unicode|string%(1) "1"
+    string(1) "1"
     [1]=>
-    %unicode|string%(1) "2"
+    string(1) "2"
     [2]=>
-    %unicode|string%(1) "3"
+    string(1) "3"
     [3]=>
-    %unicode|string%(1) "4"
+    string(1) "4"
   }
   [1]=>
   array(4) {
     [0]=>
-    %unicode|string%(2) "-1"
+    string(2) "-1"
     [1]=>
-    %unicode|string%(2) "-2"
+    string(2) "-2"
     [2]=>
-    %unicode|string%(2) "-3"
+    string(2) "-3"
     [3]=>
-    %unicode|string%(2) "-4"
+    string(2) "-4"
   }
 }
 OCI_FETCHSTATEMENT_BY_ROW
@@ -287,31 +287,31 @@ int(4)
 array(4) {
   [0]=>
   array(2) {
-    [%u|b%"ID"]=>
-    %unicode|string%(1) "1"
-    [%u|b%"VALUE"]=>
-    %unicode|string%(2) "-1"
+    ["ID"]=>
+    string(1) "1"
+    ["VALUE"]=>
+    string(2) "-1"
   }
   [1]=>
   array(2) {
-    [%u|b%"ID"]=>
-    %unicode|string%(1) "2"
-    [%u|b%"VALUE"]=>
-    %unicode|string%(2) "-2"
+    ["ID"]=>
+    string(1) "2"
+    ["VALUE"]=>
+    string(2) "-2"
   }
   [2]=>
   array(2) {
-    [%u|b%"ID"]=>
-    %unicode|string%(1) "3"
-    [%u|b%"VALUE"]=>
-    %unicode|string%(2) "-3"
+    ["ID"]=>
+    string(1) "3"
+    ["VALUE"]=>
+    string(2) "-3"
   }
   [3]=>
   array(2) {
-    [%u|b%"ID"]=>
-    %unicode|string%(1) "4"
-    [%u|b%"VALUE"]=>
-    %unicode|string%(2) "-4"
+    ["ID"]=>
+    string(1) "4"
+    ["VALUE"]=>
+    string(2) "-4"
   }
 }
 OCI_FETCHSTATEMENT_BY_ROW|OCI_ASSOC
@@ -319,31 +319,31 @@ int(4)
 array(4) {
   [0]=>
   array(2) {
-    [%u|b%"ID"]=>
-    %unicode|string%(1) "1"
-    [%u|b%"VALUE"]=>
-    %unicode|string%(2) "-1"
+    ["ID"]=>
+    string(1) "1"
+    ["VALUE"]=>
+    string(2) "-1"
   }
   [1]=>
   array(2) {
-    [%u|b%"ID"]=>
-    %unicode|string%(1) "2"
-    [%u|b%"VALUE"]=>
-    %unicode|string%(2) "-2"
+    ["ID"]=>
+    string(1) "2"
+    ["VALUE"]=>
+    string(2) "-2"
   }
   [2]=>
   array(2) {
-    [%u|b%"ID"]=>
-    %unicode|string%(1) "3"
-    [%u|b%"VALUE"]=>
-    %unicode|string%(2) "-3"
+    ["ID"]=>
+    string(1) "3"
+    ["VALUE"]=>
+    string(2) "-3"
   }
   [3]=>
   array(2) {
-    [%u|b%"ID"]=>
-    %unicode|string%(1) "4"
-    [%u|b%"VALUE"]=>
-    %unicode|string%(2) "-4"
+    ["ID"]=>
+    string(1) "4"
+    ["VALUE"]=>
+    string(2) "-4"
   }
 }
 OCI_FETCHSTATEMENT_BY_ROW|OCI_FETCHSTATEMENT_BY_COLUMN
@@ -351,31 +351,31 @@ int(4)
 array(4) {
   [0]=>
   array(2) {
-    [%u|b%"ID"]=>
-    %unicode|string%(1) "1"
-    [%u|b%"VALUE"]=>
-    %unicode|string%(2) "-1"
+    ["ID"]=>
+    string(1) "1"
+    ["VALUE"]=>
+    string(2) "-1"
   }
   [1]=>
   array(2) {
-    [%u|b%"ID"]=>
-    %unicode|string%(1) "2"
-    [%u|b%"VALUE"]=>
-    %unicode|string%(2) "-2"
+    ["ID"]=>
+    string(1) "2"
+    ["VALUE"]=>
+    string(2) "-2"
   }
   [2]=>
   array(2) {
-    [%u|b%"ID"]=>
-    %unicode|string%(1) "3"
-    [%u|b%"VALUE"]=>
-    %unicode|string%(2) "-3"
+    ["ID"]=>
+    string(1) "3"
+    ["VALUE"]=>
+    string(2) "-3"
   }
   [3]=>
   array(2) {
-    [%u|b%"ID"]=>
-    %unicode|string%(1) "4"
-    [%u|b%"VALUE"]=>
-    %unicode|string%(2) "-4"
+    ["ID"]=>
+    string(1) "4"
+    ["VALUE"]=>
+    string(2) "-4"
   }
 }
 OCI_FETCHSTATEMENT_BY_ROW|OCI_FETCHSTATEMENT_BY_COLUMN|OCI_ASSOC
@@ -383,31 +383,31 @@ int(4)
 array(4) {
   [0]=>
   array(2) {
-    [%u|b%"ID"]=>
-    %unicode|string%(1) "1"
-    [%u|b%"VALUE"]=>
-    %unicode|string%(2) "-1"
+    ["ID"]=>
+    string(1) "1"
+    ["VALUE"]=>
+    string(2) "-1"
   }
   [1]=>
   array(2) {
-    [%u|b%"ID"]=>
-    %unicode|string%(1) "2"
-    [%u|b%"VALUE"]=>
-    %unicode|string%(2) "-2"
+    ["ID"]=>
+    string(1) "2"
+    ["VALUE"]=>
+    string(2) "-2"
   }
   [2]=>
   array(2) {
-    [%u|b%"ID"]=>
-    %unicode|string%(1) "3"
-    [%u|b%"VALUE"]=>
-    %unicode|string%(2) "-3"
+    ["ID"]=>
+    string(1) "3"
+    ["VALUE"]=>
+    string(2) "-3"
   }
   [3]=>
   array(2) {
-    [%u|b%"ID"]=>
-    %unicode|string%(1) "4"
-    [%u|b%"VALUE"]=>
-    %unicode|string%(2) "-4"
+    ["ID"]=>
+    string(1) "4"
+    ["VALUE"]=>
+    string(2) "-4"
   }
 }
 OCI_FETCHSTATEMENT_BY_ROW|OCI_FETCHSTATEMENT_BY_COLUMN|OCI_NUM
@@ -416,30 +416,30 @@ array(4) {
   [0]=>
   array(2) {
     [0]=>
-    %unicode|string%(1) "1"
+    string(1) "1"
     [1]=>
-    %unicode|string%(2) "-1"
+    string(2) "-1"
   }
   [1]=>
   array(2) {
     [0]=>
-    %unicode|string%(1) "2"
+    string(1) "2"
     [1]=>
-    %unicode|string%(2) "-2"
+    string(2) "-2"
   }
   [2]=>
   array(2) {
     [0]=>
-    %unicode|string%(1) "3"
+    string(1) "3"
     [1]=>
-    %unicode|string%(2) "-3"
+    string(2) "-3"
   }
   [3]=>
   array(2) {
     [0]=>
-    %unicode|string%(1) "4"
+    string(1) "4"
     [1]=>
-    %unicode|string%(2) "-4"
+    string(2) "-4"
   }
 }
 OCI_FETCHSTATEMENT_BY_ROW|OCI_FETCHSTATEMENT_BY_COLUMN|OCI_NUM|OCI_ASSOC
@@ -448,30 +448,30 @@ array(4) {
   [0]=>
   array(2) {
     [0]=>
-    %unicode|string%(1) "1"
+    string(1) "1"
     [1]=>
-    %unicode|string%(2) "-1"
+    string(2) "-1"
   }
   [1]=>
   array(2) {
     [0]=>
-    %unicode|string%(1) "2"
+    string(1) "2"
     [1]=>
-    %unicode|string%(2) "-2"
+    string(2) "-2"
   }
   [2]=>
   array(2) {
     [0]=>
-    %unicode|string%(1) "3"
+    string(1) "3"
     [1]=>
-    %unicode|string%(2) "-3"
+    string(2) "-3"
   }
   [3]=>
   array(2) {
     [0]=>
-    %unicode|string%(1) "4"
+    string(1) "4"
     [1]=>
-    %unicode|string%(2) "-4"
+    string(2) "-4"
   }
 }
 OCI_FETCHSTATEMENT_BY_ROW|OCI_NUM
@@ -480,30 +480,30 @@ array(4) {
   [0]=>
   array(2) {
     [0]=>
-    %unicode|string%(1) "1"
+    string(1) "1"
     [1]=>
-    %unicode|string%(2) "-1"
+    string(2) "-1"
   }
   [1]=>
   array(2) {
     [0]=>
-    %unicode|string%(1) "2"
+    string(1) "2"
     [1]=>
-    %unicode|string%(2) "-2"
+    string(2) "-2"
   }
   [2]=>
   array(2) {
     [0]=>
-    %unicode|string%(1) "3"
+    string(1) "3"
     [1]=>
-    %unicode|string%(2) "-3"
+    string(2) "-3"
   }
   [3]=>
   array(2) {
     [0]=>
-    %unicode|string%(1) "4"
+    string(1) "4"
     [1]=>
-    %unicode|string%(2) "-4"
+    string(2) "-4"
   }
 }
 OCI_FETCHSTATEMENT_BY_ROW|OCI_NUM|OCI_ASSOC
@@ -512,30 +512,30 @@ array(4) {
   [0]=>
   array(2) {
     [0]=>
-    %unicode|string%(1) "1"
+    string(1) "1"
     [1]=>
-    %unicode|string%(2) "-1"
+    string(2) "-1"
   }
   [1]=>
   array(2) {
     [0]=>
-    %unicode|string%(1) "2"
+    string(1) "2"
     [1]=>
-    %unicode|string%(2) "-2"
+    string(2) "-2"
   }
   [2]=>
   array(2) {
     [0]=>
-    %unicode|string%(1) "3"
+    string(1) "3"
     [1]=>
-    %unicode|string%(2) "-3"
+    string(2) "-3"
   }
   [3]=>
   array(2) {
     [0]=>
-    %unicode|string%(1) "4"
+    string(1) "4"
     [1]=>
-    %unicode|string%(2) "-4"
+    string(2) "-4"
   }
 }
 OCI_NUM
@@ -544,24 +544,24 @@ array(2) {
   [0]=>
   array(4) {
     [0]=>
-    %unicode|string%(1) "1"
+    string(1) "1"
     [1]=>
-    %unicode|string%(1) "2"
+    string(1) "2"
     [2]=>
-    %unicode|string%(1) "3"
+    string(1) "3"
     [3]=>
-    %unicode|string%(1) "4"
+    string(1) "4"
   }
   [1]=>
   array(4) {
     [0]=>
-    %unicode|string%(2) "-1"
+    string(2) "-1"
     [1]=>
-    %unicode|string%(2) "-2"
+    string(2) "-2"
     [2]=>
-    %unicode|string%(2) "-3"
+    string(2) "-3"
     [3]=>
-    %unicode|string%(2) "-4"
+    string(2) "-4"
   }
 }
 OCI_NUM|OCI_ASSOC
@@ -570,24 +570,24 @@ array(2) {
   [0]=>
   array(4) {
     [0]=>
-    %unicode|string%(1) "1"
+    string(1) "1"
     [1]=>
-    %unicode|string%(1) "2"
+    string(1) "2"
     [2]=>
-    %unicode|string%(1) "3"
+    string(1) "3"
     [3]=>
-    %unicode|string%(1) "4"
+    string(1) "4"
   }
   [1]=>
   array(4) {
     [0]=>
-    %unicode|string%(2) "-1"
+    string(2) "-1"
     [1]=>
-    %unicode|string%(2) "-2"
+    string(2) "-2"
     [2]=>
-    %unicode|string%(2) "-3"
+    string(2) "-3"
     [3]=>
-    %unicode|string%(2) "-4"
+    string(2) "-4"
   }
 }
 Done
index 1d3c9677ee9c61a19e2ebb8454c5d70bdd1a8e58..1d4a8df7b7c117544793e383deb9d2de0ef9e719 100644 (file)
@@ -51,10 +51,10 @@ oci8_test_sql_execute($c, $stmtarray);
 Test 1
 int(0)
 array(2) {
-  [%u|b%"MYCOL1"]=>
+  ["MYCOL1"]=>
   array(0) {
   }
-  [%u|b%"MYCOL2"]=>
+  ["MYCOL2"]=>
   array(0) {
   }
 }
index a6bb3c3f18a0d64955dbd6d41f7b7259eaa4f9db..d82fd30e41cdd2d6c70a2437d87612e9003de10c 100644 (file)
@@ -62,45 +62,45 @@ oci_close($c);
 Test 1
 int(3)
 array(2) {
-  [%u|b%"MYCOL1"]=>
+  ["MYCOL1"]=>
   array(3) {
     [0]=>
-    %unicode|string%(1) "1"
+    string(1) "1"
     [1]=>
-    %unicode|string%(1) "2"
+    string(1) "2"
     [2]=>
-    %unicode|string%(1) "3"
+    string(1) "3"
   }
-  [%u|b%"MYCOL2"]=>
+  ["MYCOL2"]=>
   array(3) {
     [0]=>
-    %unicode|string%(3) "abc"
+    string(3) "abc"
     [1]=>
-    %unicode|string%(3) "def"
+    string(3) "def"
     [2]=>
-    %unicode|string%(3) "ghi"
+    string(3) "ghi"
   }
 }
 Test 1
 int(3)
 array(2) {
-  [%u|b%"MYCOL1"]=>
+  ["MYCOL1"]=>
   array(3) {
     [0]=>
-    %unicode|string%(1) "1"
+    string(1) "1"
     [1]=>
-    %unicode|string%(1) "2"
+    string(1) "2"
     [2]=>
-    %unicode|string%(1) "3"
+    string(1) "3"
   }
-  [%u|b%"MYCOL2"]=>
+  ["MYCOL2"]=>
   array(3) {
     [0]=>
-    %unicode|string%(3) "abc"
+    string(3) "abc"
     [1]=>
-    %unicode|string%(3) "def"
+    string(3) "def"
     [2]=>
-    %unicode|string%(3) "ghi"
+    string(3) "ghi"
   }
 }
 Test 3
index 45a6a8132ed122e5a3708f939d72c2b64cff6c61..d90c4d95dcb26046d699cc145281a21fadc257e6 100644 (file)
@@ -53,19 +53,19 @@ echo "Done\n";
 int(2)
 array(2) {
   [0]=>
-  %unicode|string%(1) "1"
+  string(1) "1"
   [1]=>
-  %unicode|string%(1) "1"
+  string(1) "1"
 }
 int(2)
 array(4) {
   [0]=>
-  %unicode|string%(1) "1"
-  [%u|b%"ID"]=>
-  %unicode|string%(1) "1"
+  string(1) "1"
+  ["ID"]=>
+  string(1) "1"
   [1]=>
-  %unicode|string%(1) "1"
-  [%u|b%"VALUE"]=>
-  %unicode|string%(1) "1"
+  string(1) "1"
+  ["VALUE"]=>
+  string(1) "1"
 }
 Done
index 1c290d5e953dd411342176b585a1fb181cb34974..73711baa1884ed1bf3127313d1d4c4d19764b0b2 100644 (file)
@@ -82,28 +82,28 @@ oci8_test_sql_execute($c, $stmtarray);
 --EXPECTF--
 Test 1
 object(stdClass)#1 (3) {
-  [%u|b%"caseSensitive"]=>
-  %unicode|string%(3) "123"
-  [%u|b%"SECONDCOL"]=>
-  %unicode|string%(19) "1st row col2 string"
-  [%u|b%"ANOTHERCOL"]=>
-  %unicode|string%(15) "1 more text    "
+  ["caseSensitive"]=>
+  string(3) "123"
+  ["SECONDCOL"]=>
+  string(19) "1st row col2 string"
+  ["ANOTHERCOL"]=>
+  string(15) "1 more text    "
 }
 object(stdClass)#2 (3) {
-  [%u|b%"caseSensitive"]=>
-  %unicode|string%(3) "456"
-  [%u|b%"SECONDCOL"]=>
-  %unicode|string%(19) "2nd row col2 string"
-  [%u|b%"ANOTHERCOL"]=>
-  %unicode|string%(15) "2 more text    "
+  ["caseSensitive"]=>
+  string(3) "456"
+  ["SECONDCOL"]=>
+  string(19) "2nd row col2 string"
+  ["ANOTHERCOL"]=>
+  string(15) "2 more text    "
 }
 object(stdClass)#1 (3) {
-  [%u|b%"caseSensitive"]=>
-  %unicode|string%(3) "789"
-  [%u|b%"SECONDCOL"]=>
-  %unicode|string%(19) "3rd row col2 string"
-  [%u|b%"ANOTHERCOL"]=>
-  %unicode|string%(15) "3 more text    "
+  ["caseSensitive"]=>
+  string(3) "789"
+  ["SECONDCOL"]=>
+  string(19) "3rd row col2 string"
+  ["ANOTHERCOL"]=>
+  string(15) "3 more text    "
 }
 Test 2
 123
index 2b28634ab3f01a9284567eaaf619ef5458bce758..40bc4f893cad54cd45faad0d8f3163b2acaa7995 100644 (file)
@@ -46,20 +46,20 @@ echo "Done\n";
 --EXPECTF--
 array(2) {
   [0]=>
-  %unicode|string%(1) "1"
+  string(1) "1"
   [1]=>
-  %unicode|string%(1) "1"
+  string(1) "1"
 }
 array(2) {
   [0]=>
-  %unicode|string%(1) "1"
+  string(1) "1"
   [1]=>
-  %unicode|string%(1) "1"
+  string(1) "1"
 }
 array(2) {
   [0]=>
-  %unicode|string%(1) "1"
+  string(1) "1"
   [1]=>
-  %unicode|string%(1) "1"
+  string(1) "1"
 }
 Done
index c14ee8957e7095066e34f03c92d653e4e1497eab..41d8627ce46cb4896f5b6167cc9b9f8cab00a885 100644 (file)
@@ -85,9 +85,9 @@ echo "Done\n";
 --EXPECTF--
 array(2) {
   [0]=>
-  %unicode|string%(1) "1"
+  string(1) "1"
   [1]=>
-  %unicode|string%(1) "1"
+  string(1) "1"
 }
 Test 1
 
diff --git a/ext/oci8/tests/imp_res_1.phpt b/ext/oci8/tests/imp_res_1.phpt
new file mode 100644 (file)
index 0000000..a36f89f
--- /dev/null
@@ -0,0 +1,630 @@
+--TEST--
+Oracle Database 12c Implicit Result Sets: basic test
+--SKIPIF--
+<?php 
+if (!extension_loaded('oci8')) die ("skip no oci8 extension"); 
+$target_dbs = array('oracledb' => true, 'timesten' => false);  // test runs on these DBs
+require(dirname(__FILE__).'/skipif.inc');
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
+if (!(isset($matches[0]) && $matches[1] >= 12)) {
+    die("skip expected output only valid when using Oracle Database 12c or greater");
+}
+preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
+if (!(isset($matches[0]) && $matches[0] >= 12)) { 
+    die("skip works only with Oracle 12c or greater version of Oracle client libraries");
+}
+?>
+--FILE--
+<?php
+
+require(dirname(__FILE__).'/connect.inc');
+
+// Initialization
+
+$stmtarray = array(
+    "drop table imp_res_1_tab_1",
+    "create table imp_res_1_tab_1 (c1 number, c2 varchar2(10))",
+    "insert into imp_res_1_tab_1 values (1, 'abcde')",
+    "insert into imp_res_1_tab_1 values (2, 'fghij')",
+    "insert into imp_res_1_tab_1 values (3, 'klmno')",
+
+    "drop table imp_res_1_tab_2",
+    "create table imp_res_1_tab_2 (c3 varchar2(1))",
+    "insert into imp_res_1_tab_2 values ('t')",
+    "insert into imp_res_1_tab_2 values ('u')",
+    "insert into imp_res_1_tab_2 values ('v')",
+
+    "create or replace procedure imp_res_1_proc as
+      c1 sys_refcursor;
+    begin
+      open c1 for select * from imp_res_1_tab_1 order by 1;
+      dbms_sql.return_result(c1);
+
+      open c1 for select * from imp_res_1_tab_2 where rownum < 3 order by 1;
+      dbms_sql.return_result(c1);
+
+      open c1 for select 99 from dual;
+      dbms_sql.return_result (c1);
+
+      open c1 for select NULL, 'Z' from dual;
+      dbms_sql.return_result (c1);
+
+      open c1 for select * from imp_res_1_tab_1 order by 1;
+      dbms_sql.return_result(c1);
+    end;"
+);
+
+oci8_test_sql_execute($c, $stmtarray);
+
+// Run Test
+
+echo "Test 1 - oci_fetch_assoc\n";
+$s = oci_parse($c, "begin imp_res_1_proc(); end;");
+oci_execute($s);
+while (($row = oci_fetch_assoc($s)) != false)
+    var_dump($row);
+
+echo "\nTest 2 - oci_fetch_object\n";
+$s = oci_parse($c, "begin imp_res_1_proc(); end;");
+oci_execute($s);
+while (($row = oci_fetch_object($s)) != false)
+    var_dump($row);
+
+echo "\nTest 3 - oci_fetch_row\n";
+$s = oci_parse($c, "begin imp_res_1_proc(); end;");
+oci_execute($s);
+while (($row = oci_fetch_row($s)) != false)
+    var_dump($row);
+
+echo "\nTest 4 - oci_fetch_array(OCI_ASSOC+OCI_RETURN_NULLS)\n";
+$s = oci_parse($c, "begin imp_res_1_proc(); end;");
+oci_execute($s);
+while (($row = oci_fetch_array($s, OCI_ASSOC+OCI_RETURN_NULLS)) != false)
+    var_dump($row);
+
+echo "\nTest 5 - oci_fetch_array(OCI_ASSOC)\n";
+$s = oci_parse($c, "begin imp_res_1_proc(); end;");
+oci_execute($s);
+while (($row = oci_fetch_array($s, OCI_ASSOC)) != false)
+    var_dump($row);
+
+echo "\nTest 6 - oci_fetch_array(OCI_NUM)\n";
+$s = oci_parse($c, "begin imp_res_1_proc(); end;");
+oci_execute($s);
+while (($row = oci_fetch_array($s, OCI_NUM)) != false)
+    var_dump($row);
+
+echo "\nTest 7 - oci_fetch_array(OCI_BOTH)\n";
+$s = oci_parse($c, "begin imp_res_1_proc(); end;");
+oci_execute($s);
+while (($row = oci_fetch_array($s, OCI_BOTH)) != false)
+    var_dump($row);
+
+echo "\nTest 8 - oci_fetch_array(OCI_BOTH+OCI_RETURN_NULLS)\n";
+$s = oci_parse($c, "begin imp_res_1_proc(); end;");
+oci_execute($s);
+while (($row = oci_fetch_array($s, OCI_BOTH+OCI_RETURN_NULLS)) != false)
+    var_dump($row);
+
+// Clean up
+
+$stmtarray = array(
+    "drop procedure imp_res_1_proc",
+    "drop table imp_res_1_tab_1",
+    "drop table imp_res_1_tab_2"
+);
+
+oci8_test_sql_execute($c, $stmtarray);
+
+?>
+===DONE===
+<?php exit(0); ?>
+--EXPECTF--
+Test 1 - oci_fetch_assoc
+array(2) {
+  ["C1"]=>
+  string(1) "1"
+  ["C2"]=>
+  string(5) "abcde"
+}
+array(2) {
+  ["C1"]=>
+  string(1) "2"
+  ["C2"]=>
+  string(5) "fghij"
+}
+array(2) {
+  ["C1"]=>
+  string(1) "3"
+  ["C2"]=>
+  string(5) "klmno"
+}
+array(1) {
+  ["C3"]=>
+  string(1) "t"
+}
+array(1) {
+  ["C3"]=>
+  string(1) "u"
+}
+array(1) {
+  [99]=>
+  string(2) "99"
+}
+array(2) {
+  ["NULL"]=>
+  NULL
+  ["'Z'"]=>
+  string(1) "Z"
+}
+array(2) {
+  ["C1"]=>
+  string(1) "1"
+  ["C2"]=>
+  string(5) "abcde"
+}
+array(2) {
+  ["C1"]=>
+  string(1) "2"
+  ["C2"]=>
+  string(5) "fghij"
+}
+array(2) {
+  ["C1"]=>
+  string(1) "3"
+  ["C2"]=>
+  string(5) "klmno"
+}
+
+Test 2 - oci_fetch_object
+object(stdClass)#%d (2) {
+  ["C1"]=>
+  string(1) "1"
+  ["C2"]=>
+  string(5) "abcde"
+}
+object(stdClass)#%d (2) {
+  ["C1"]=>
+  string(1) "2"
+  ["C2"]=>
+  string(5) "fghij"
+}
+object(stdClass)#%d (2) {
+  ["C1"]=>
+  string(1) "3"
+  ["C2"]=>
+  string(5) "klmno"
+}
+object(stdClass)#%d (1) {
+  ["C3"]=>
+  string(1) "t"
+}
+object(stdClass)#%d (1) {
+  ["C3"]=>
+  string(1) "u"
+}
+object(stdClass)#%d (1) {
+  [99]=>
+  string(2) "99"
+}
+object(stdClass)#%d (2) {
+  ["NULL"]=>
+  NULL
+  ["'Z'"]=>
+  string(1) "Z"
+}
+object(stdClass)#%d (2) {
+  ["C1"]=>
+  string(1) "1"
+  ["C2"]=>
+  string(5) "abcde"
+}
+object(stdClass)#%d (2) {
+  ["C1"]=>
+  string(1) "2"
+  ["C2"]=>
+  string(5) "fghij"
+}
+object(stdClass)#%d (2) {
+  ["C1"]=>
+  string(1) "3"
+  ["C2"]=>
+  string(5) "klmno"
+}
+
+Test 3 - oci_fetch_row
+array(2) {
+  [0]=>
+  string(1) "1"
+  [1]=>
+  string(5) "abcde"
+}
+array(2) {
+  [0]=>
+  string(1) "2"
+  [1]=>
+  string(5) "fghij"
+}
+array(2) {
+  [0]=>
+  string(1) "3"
+  [1]=>
+  string(5) "klmno"
+}
+array(1) {
+  [0]=>
+  string(1) "t"
+}
+array(1) {
+  [0]=>
+  string(1) "u"
+}
+array(1) {
+  [0]=>
+  string(2) "99"
+}
+array(2) {
+  [0]=>
+  NULL
+  [1]=>
+  string(1) "Z"
+}
+array(2) {
+  [0]=>
+  string(1) "1"
+  [1]=>
+  string(5) "abcde"
+}
+array(2) {
+  [0]=>
+  string(1) "2"
+  [1]=>
+  string(5) "fghij"
+}
+array(2) {
+  [0]=>
+  string(1) "3"
+  [1]=>
+  string(5) "klmno"
+}
+
+Test 4 - oci_fetch_array(OCI_ASSOC+OCI_RETURN_NULLS)
+array(2) {
+  ["C1"]=>
+  string(1) "1"
+  ["C2"]=>
+  string(5) "abcde"
+}
+array(2) {
+  ["C1"]=>
+  string(1) "2"
+  ["C2"]=>
+  string(5) "fghij"
+}
+array(2) {
+  ["C1"]=>
+  string(1) "3"
+  ["C2"]=>
+  string(5) "klmno"
+}
+array(1) {
+  ["C3"]=>
+  string(1) "t"
+}
+array(1) {
+  ["C3"]=>
+  string(1) "u"
+}
+array(1) {
+  [99]=>
+  string(2) "99"
+}
+array(2) {
+  ["NULL"]=>
+  NULL
+  ["'Z'"]=>
+  string(1) "Z"
+}
+array(2) {
+  ["C1"]=>
+  string(1) "1"
+  ["C2"]=>
+  string(5) "abcde"
+}
+array(2) {
+  ["C1"]=>
+  string(1) "2"
+  ["C2"]=>
+  string(5) "fghij"
+}
+array(2) {
+  ["C1"]=>
+  string(1) "3"
+  ["C2"]=>
+  string(5) "klmno"
+}
+
+Test 5 - oci_fetch_array(OCI_ASSOC)
+array(2) {
+  ["C1"]=>
+  string(1) "1"
+  ["C2"]=>
+  string(5) "abcde"
+}
+array(2) {
+  ["C1"]=>
+  string(1) "2"
+  ["C2"]=>
+  string(5) "fghij"
+}
+array(2) {
+  ["C1"]=>
+  string(1) "3"
+  ["C2"]=>
+  string(5) "klmno"
+}
+array(1) {
+  ["C3"]=>
+  string(1) "t"
+}
+array(1) {
+  ["C3"]=>
+  string(1) "u"
+}
+array(1) {
+  [99]=>
+  string(2) "99"
+}
+array(1) {
+  ["'Z'"]=>
+  string(1) "Z"
+}
+array(2) {
+  ["C1"]=>
+  string(1) "1"
+  ["C2"]=>
+  string(5) "abcde"
+}
+array(2) {
+  ["C1"]=>
+  string(1) "2"
+  ["C2"]=>
+  string(5) "fghij"
+}
+array(2) {
+  ["C1"]=>
+  string(1) "3"
+  ["C2"]=>
+  string(5) "klmno"
+}
+
+Test 6 - oci_fetch_array(OCI_NUM)
+array(2) {
+  [0]=>
+  string(1) "1"
+  [1]=>
+  string(5) "abcde"
+}
+array(2) {
+  [0]=>
+  string(1) "2"
+  [1]=>
+  string(5) "fghij"
+}
+array(2) {
+  [0]=>
+  string(1) "3"
+  [1]=>
+  string(5) "klmno"
+}
+array(1) {
+  [0]=>
+  string(1) "t"
+}
+array(1) {
+  [0]=>
+  string(1) "u"
+}
+array(1) {
+  [0]=>
+  string(2) "99"
+}
+array(1) {
+  [1]=>
+  string(1) "Z"
+}
+array(2) {
+  [0]=>
+  string(1) "1"
+  [1]=>
+  string(5) "abcde"
+}
+array(2) {
+  [0]=>
+  string(1) "2"
+  [1]=>
+  string(5) "fghij"
+}
+array(2) {
+  [0]=>
+  string(1) "3"
+  [1]=>
+  string(5) "klmno"
+}
+
+Test 7 - oci_fetch_array(OCI_BOTH)
+array(4) {
+  [0]=>
+  string(1) "1"
+  ["C1"]=>
+  string(1) "1"
+  [1]=>
+  string(5) "abcde"
+  ["C2"]=>
+  string(5) "abcde"
+}
+array(4) {
+  [0]=>
+  string(1) "2"
+  ["C1"]=>
+  string(1) "2"
+  [1]=>
+  string(5) "fghij"
+  ["C2"]=>
+  string(5) "fghij"
+}
+array(4) {
+  [0]=>
+  string(1) "3"
+  ["C1"]=>
+  string(1) "3"
+  [1]=>
+  string(5) "klmno"
+  ["C2"]=>
+  string(5) "klmno"
+}
+array(2) {
+  [0]=>
+  string(1) "t"
+  ["C3"]=>
+  string(1) "t"
+}
+array(2) {
+  [0]=>
+  string(1) "u"
+  ["C3"]=>
+  string(1) "u"
+}
+array(2) {
+  [0]=>
+  string(2) "99"
+  [99]=>
+  string(2) "99"
+}
+array(2) {
+  [1]=>
+  string(1) "Z"
+  ["'Z'"]=>
+  string(1) "Z"
+}
+array(4) {
+  [0]=>
+  string(1) "1"
+  ["C1"]=>
+  string(1) "1"
+  [1]=>
+  string(5) "abcde"
+  ["C2"]=>
+  string(5) "abcde"
+}
+array(4) {
+  [0]=>
+  string(1) "2"
+  ["C1"]=>
+  string(1) "2"
+  [1]=>
+  string(5) "fghij"
+  ["C2"]=>
+  string(5) "fghij"
+}
+array(4) {
+  [0]=>
+  string(1) "3"
+  ["C1"]=>
+  string(1) "3"
+  [1]=>
+  string(5) "klmno"
+  ["C2"]=>
+  string(5) "klmno"
+}
+
+Test 8 - oci_fetch_array(OCI_BOTH+OCI_RETURN_NULLS)
+array(4) {
+  [0]=>
+  string(1) "1"
+  ["C1"]=>
+  string(1) "1"
+  [1]=>
+  string(5) "abcde"
+  ["C2"]=>
+  string(5) "abcde"
+}
+array(4) {
+  [0]=>
+  string(1) "2"
+  ["C1"]=>
+  string(1) "2"
+  [1]=>
+  string(5) "fghij"
+  ["C2"]=>
+  string(5) "fghij"
+}
+array(4) {
+  [0]=>
+  string(1) "3"
+  ["C1"]=>
+  string(1) "3"
+  [1]=>
+  string(5) "klmno"
+  ["C2"]=>
+  string(5) "klmno"
+}
+array(2) {
+  [0]=>
+  string(1) "t"
+  ["C3"]=>
+  string(1) "t"
+}
+array(2) {
+  [0]=>
+  string(1) "u"
+  ["C3"]=>
+  string(1) "u"
+}
+array(2) {
+  [0]=>
+  string(2) "99"
+  [99]=>
+  string(2) "99"
+}
+array(4) {
+  [0]=>
+  NULL
+  ["NULL"]=>
+  NULL
+  [1]=>
+  string(1) "Z"
+  ["'Z'"]=>
+  string(1) "Z"
+}
+array(4) {
+  [0]=>
+  string(1) "1"
+  ["C1"]=>
+  string(1) "1"
+  [1]=>
+  string(5) "abcde"
+  ["C2"]=>
+  string(5) "abcde"
+}
+array(4) {
+  [0]=>
+  string(1) "2"
+  ["C1"]=>
+  string(1) "2"
+  [1]=>
+  string(5) "fghij"
+  ["C2"]=>
+  string(5) "fghij"
+}
+array(4) {
+  [0]=>
+  string(1) "3"
+  ["C1"]=>
+  string(1) "3"
+  [1]=>
+  string(5) "klmno"
+  ["C2"]=>
+  string(5) "klmno"
+}
+===DONE===
diff --git a/ext/oci8/tests/imp_res_2.phpt b/ext/oci8/tests/imp_res_2.phpt
new file mode 100644 (file)
index 0000000..860a5fb
--- /dev/null
@@ -0,0 +1,99 @@
+--TEST--
+Oracle Database 12c Implicit Result Sets: Zero Rows
+--SKIPIF--
+<?php 
+if (!extension_loaded('oci8')) die ("skip no oci8 extension"); 
+$target_dbs = array('oracledb' => true, 'timesten' => false);  // test runs on these DBs
+require(dirname(__FILE__).'/skipif.inc');
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
+if (!(isset($matches[0]) && $matches[1] >= 12)) {
+    die("skip expected output only valid when using Oracle Database 12c or greater");
+}
+preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
+if (!(isset($matches[0]) && $matches[0] >= 12)) { 
+    die("skip works only with Oracle 12c or greater version of Oracle client libraries");
+}
+?>
+--FILE--
+<?php
+
+require(dirname(__FILE__).'/connect.inc');
+
+// Initialization
+
+$stmtarray = array(
+    "create or replace procedure imp_res_2_proc_a as
+      c1 sys_refcursor;
+    begin
+      open c1 for select * from dual where 1 = 0;
+      dbms_sql.return_result(c1);
+    end;",
+
+    "create or replace procedure imp_res_2_proc_b as
+      c1 sys_refcursor;
+    begin
+      open c1 for select * from dual;
+      dbms_sql.return_result(c1);
+      open c1 for select * from dual where 1 = 0;
+      dbms_sql.return_result(c1);
+    end;",
+
+    "create or replace procedure imp_res_2_proc_c as
+      c1 sys_refcursor;
+    begin
+      open c1 for select * from dual where 1 = 0;
+      dbms_sql.return_result(c1);
+      open c1 for select * from dual;
+      dbms_sql.return_result(c1);
+    end;"
+
+);
+
+oci8_test_sql_execute($c, $stmtarray);
+
+// Run Test
+
+echo "Test 1\n";
+$s = oci_parse($c, "begin imp_res_2_proc_a(); end;");
+oci_execute($s);
+while (($row = oci_fetch_row($s)) != false)
+    var_dump($row);
+
+echo "Test 2\n";
+$s = oci_parse($c, "begin imp_res_2_proc_b(); end;");
+oci_execute($s);
+while (($row = oci_fetch_row($s)) != false)
+    var_dump($row);
+
+echo "Test 2\n";
+$s = oci_parse($c, "begin imp_res_2_proc_c(); end;");
+oci_execute($s);
+while (($row = oci_fetch_row($s)) != false)
+    var_dump($row);
+
+// Clean up
+
+$stmtarray = array(
+    "drop procedure imp_res_2_proc_a",
+    "drop procedure imp_res_2_proc_b",
+    "drop procedure imp_res_2_proc_c"
+);
+
+oci8_test_sql_execute($c, $stmtarray);
+
+?>
+===DONE===
+<?php exit(0); ?>
+--EXPECTF--
+Test 1
+Test 2
+array(1) {
+  [0]=>
+  string(1) "X"
+}
+Test 2
+array(1) {
+  [0]=>
+  string(1) "X"
+}
+===DONE===
diff --git a/ext/oci8/tests/imp_res_3.phpt b/ext/oci8/tests/imp_res_3.phpt
new file mode 100644 (file)
index 0000000..0fc4815
--- /dev/null
@@ -0,0 +1,1257 @@
+--TEST--
+Oracle Database 12c Implicit Result Sets: bigger data size
+--SKIPIF--
+<?php 
+if (!extension_loaded('oci8')) die ("skip no oci8 extension"); 
+$target_dbs = array('oracledb' => true, 'timesten' => false);  // test runs on these DBs
+require(dirname(__FILE__).'/skipif.inc');
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
+if (!(isset($matches[0]) && $matches[1] >= 12)) {
+    die("skip expected output only valid when using Oracle Database 12c or greater");
+}
+preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
+if (!(isset($matches[0]) && $matches[0] >= 12)) { 
+    die("skip works only with Oracle 12c or greater version of Oracle client libraries");
+}
+?>
+--FILE--
+<?php
+
+require(dirname(__FILE__).'/connect.inc');
+
+// Initialization
+
+$stmtarray = array(
+    "drop table imp_res_3_tab_1",
+    "create table imp_res_3_tab_1 (c1 number, c2 varchar2(10))",
+    "insert into imp_res_3_tab_1 values (1, 'a')",
+    "insert into imp_res_3_tab_1 values (2, 'f')",
+
+    "drop table imp_res_3_tab_2",
+    "create table imp_res_3_tab_2 (c3 varchar2(1))",
+    "insert into imp_res_3_tab_2 values ('t')",
+    "insert into imp_res_3_tab_2 values ('u')",
+    "insert into imp_res_3_tab_2 values ('v')",
+    "insert into imp_res_3_tab_2 values ('w')",
+
+    "create or replace procedure imp_res_3_proc as
+      c1 sys_refcursor;
+      i pls_integer;
+    begin
+      for i in 1..30 loop  -- if this value is too big for Oracle's open_cursors, calling imp_res_3_proc() can fail with ORA-1000
+        open c1 for select t1.*, t2.*, t3.*, t4.*, t5.*
+            from imp_res_3_tab_1 t1, imp_res_3_tab_1 t2, imp_res_3_tab_1 t3,
+                 imp_res_3_tab_1 t4, imp_res_3_tab_1 t5 order by 1,3,5,7,9,2,4,6,8,10;
+        dbms_sql.return_result(c1);
+        open c1 for select c2 from imp_res_3_tab_1 order by 1;
+        dbms_sql.return_result(c1);
+        open c1 for select * from imp_res_3_tab_2 order by 1;
+        dbms_sql.return_result(c1);
+        open c1 for select * from dual;
+        dbms_sql.return_result (c1);
+      end loop;
+    end;"
+);
+
+oci8_test_sql_execute($c, $stmtarray);
+
+// Run Test
+
+echo "Test 1\n";
+
+$s = oci_parse($c, "begin imp_res_3_proc(); end;");
+oci_execute($s);
+
+while (($row = oci_fetch_array($s, OCI_NUM+OCI_RETURN_NULLS)) != false) {
+    foreach ($row as $item) {
+        echo "  ".$item;
+    }
+    echo "\n";
+}
+
+// Clean up
+
+$stmtarray = array(
+    "drop procedure imp_res_3_proc",
+    "drop table imp_res_3_tab_1",
+    "drop table imp_res_3_tab_2"
+);
+
+oci8_test_sql_execute($c, $stmtarray);
+
+?>
+===DONE===
+<?php exit(0); ?>
+--EXPECTF--
+Test 1
+  1  a  1  a  1  a  1  a  1  a
+  1  a  1  a  1  a  1  a  2  f
+  1  a  1  a  1  a  2  f  1  a
+  1  a  1  a  1  a  2  f  2  f
+  1  a  1  a  2  f  1  a  1  a
+  1  a  1  a  2  f  1  a  2  f
+  1  a  1  a  2  f  2  f  1  a
+  1  a  1  a  2  f  2  f  2  f
+  1  a  2  f  1  a  1  a  1  a
+  1  a  2  f  1  a  1  a  2  f
+  1  a  2  f  1  a  2  f  1  a
+  1  a  2  f  1  a  2  f  2  f
+  1  a  2  f  2  f  1  a  1  a
+  1  a  2  f  2  f  1  a  2  f
+  1  a  2  f  2  f  2  f  1  a
+  1  a  2  f  2  f  2  f  2  f
+  2  f  1  a  1  a  1  a  1  a
+  2  f  1  a  1  a  1  a  2  f
+  2  f  1  a  1  a  2  f  1  a
+  2  f  1  a  1  a  2  f  2  f
+  2  f  1  a  2  f  1  a  1  a
+  2  f  1  a  2  f  1  a  2  f
+  2  f  1  a  2  f  2  f  1  a
+  2  f  1  a  2  f  2  f  2  f
+  2  f  2  f  1  a  1  a  1  a
+  2  f  2  f  1  a  1  a  2  f
+  2  f  2  f  1  a  2  f  1  a
+  2  f  2  f  1  a  2  f  2  f
+  2  f  2  f  2  f  1  a  1  a
+  2  f  2  f  2  f  1  a  2  f
+  2  f  2  f  2  f  2  f  1  a
+  2  f  2  f  2  f  2  f  2  f
+  a
+  f
+  t
+  u
+  v
+  w
+  X
+  1  a  1  a  1  a  1  a  1  a
+  1  a  1  a  1  a  1  a  2  f
+  1  a  1  a  1  a  2  f  1  a
+  1  a  1  a  1  a  2  f  2  f
+  1  a  1  a  2  f  1  a  1  a
+  1  a  1  a  2  f  1  a  2  f
+  1  a  1  a  2  f  2  f  1  a
+  1  a  1  a  2  f  2  f  2  f
+  1  a  2  f  1  a  1  a  1  a
+  1  a  2  f  1  a  1  a  2  f
+  1  a  2  f  1  a  2  f  1  a
+  1  a  2  f  1  a  2  f  2  f
+  1  a  2  f  2  f  1  a  1  a
+  1  a  2  f  2  f  1  a  2  f
+  1  a  2  f  2  f  2  f  1  a
+  1  a  2  f  2  f  2  f  2  f
+  2  f  1  a  1  a  1  a  1  a
+  2  f  1  a  1  a  1  a  2  f
+  2  f  1  a  1  a  2  f  1  a
+  2  f  1  a  1  a  2  f  2  f
+  2  f  1  a  2  f  1  a  1  a
+  2  f  1  a  2  f  1  a  2  f
+  2  f  1  a  2  f  2  f  1  a
+  2  f  1  a  2  f  2  f  2  f
+  2  f  2  f  1  a  1  a  1  a
+  2  f  2  f  1  a  1  a  2  f
+  2  f  2  f  1  a  2  f  1  a
+  2  f  2  f  1  a  2  f  2  f
+  2  f  2  f  2  f  1  a  1  a
+  2  f  2  f  2  f  1  a  2  f
+  2  f  2  f  2  f  2  f  1  a
+  2  f  2  f  2  f  2  f  2  f
+  a
+  f
+  t
+  u
+  v
+  w
+  X
+  1  a  1  a  1  a  1  a  1  a
+  1  a  1  a  1  a  1  a  2  f
+  1  a  1  a  1  a  2  f  1  a
+  1  a  1  a  1  a  2  f  2  f
+  1  a  1  a  2  f  1  a  1  a
+  1  a  1  a  2  f  1  a  2  f
+  1  a  1  a  2  f  2  f  1  a
+  1  a  1  a  2  f  2  f  2  f
+  1  a  2  f  1  a  1  a  1  a
+  1  a  2  f  1  a  1  a  2  f
+  1  a  2  f  1  a  2  f  1  a
+  1  a  2  f  1  a  2  f  2  f
+  1  a  2  f  2  f  1  a  1  a
+  1  a  2  f  2  f  1  a  2  f
+  1  a  2  f  2  f  2  f  1  a
+  1  a  2  f  2  f  2  f  2  f
+  2  f  1  a  1  a  1  a  1  a
+  2  f  1  a  1  a  1  a  2  f
+  2  f  1  a  1  a  2  f  1  a
+  2  f  1  a  1  a  2  f  2  f
+  2  f  1  a  2  f  1  a  1  a
+  2  f  1  a  2  f  1  a  2  f
+  2  f  1  a  2  f  2  f  1  a
+  2  f  1  a  2  f  2  f  2  f
+  2  f  2  f  1  a  1  a  1  a
+  2  f  2  f  1  a  1  a  2  f
+  2  f  2  f  1  a  2  f  1  a
+  2  f  2  f  1  a  2  f  2  f
+  2  f  2  f  2  f  1  a  1  a
+  2  f  2  f  2  f  1  a  2  f
+  2  f  2  f  2  f  2  f  1  a
+  2  f  2  f  2  f  2  f  2  f
+  a
+  f
+  t
+  u
+  v
+  w
+  X
+  1  a  1  a  1  a  1  a  1  a
+  1  a  1  a  1  a  1  a  2  f
+  1  a  1  a  1  a  2  f  1  a
+  1  a  1  a  1  a  2  f  2  f
+  1  a  1  a  2  f  1  a  1  a
+  1  a  1  a  2  f  1  a  2  f
+  1  a  1  a  2  f  2  f  1  a
+  1  a  1  a  2  f  2  f  2  f
+  1  a  2  f  1  a  1  a  1  a
+  1  a  2  f  1  a  1  a  2  f
+  1  a  2  f  1  a  2  f  1  a
+  1  a  2  f  1  a  2  f  2  f
+  1  a  2  f  2  f  1  a  1  a
+  1  a  2  f  2  f  1  a  2  f
+  1  a  2  f  2  f  2  f  1  a
+  1  a  2  f  2  f  2  f  2  f
+  2  f  1  a  1  a  1  a  1  a
+  2  f  1  a  1  a  1  a  2  f
+  2  f  1  a  1  a  2  f  1  a
+  2  f  1  a  1  a  2  f  2  f
+  2  f  1  a  2  f  1  a  1  a
+  2  f  1  a  2  f  1  a  2  f
+  2  f  1  a  2  f  2  f  1  a
+  2  f  1  a  2  f  2  f  2  f
+  2  f  2  f  1  a  1  a  1  a
+  2  f  2  f  1  a  1  a  2  f
+  2  f  2  f  1  a  2  f  1  a
+  2  f  2  f  1  a  2  f  2  f
+  2  f  2  f  2  f  1  a  1  a
+  2  f  2  f  2  f  1  a  2  f
+  2  f  2  f  2  f  2  f  1  a
+  2  f  2  f  2  f  2  f  2  f
+  a
+  f
+  t
+  u
+  v
+  w
+  X
+  1  a  1  a  1  a  1  a  1  a
+  1  a  1  a  1  a  1  a  2  f
+  1  a  1  a  1  a  2  f  1  a
+  1  a  1  a  1  a  2  f  2  f
+  1  a  1  a  2  f  1  a  1  a
+  1  a  1  a  2  f  1  a  2  f
+  1  a  1  a  2  f  2  f  1  a
+  1  a  1  a  2  f  2  f  2  f
+  1  a  2  f  1  a  1  a  1  a
+  1  a  2  f  1  a  1  a  2  f
+  1  a  2  f  1  a  2  f  1  a
+  1  a  2  f  1  a  2  f  2  f
+  1  a  2  f  2  f  1  a  1  a
+  1  a  2  f  2  f  1  a  2  f
+  1  a  2  f  2  f  2  f  1  a
+  1  a  2  f  2  f  2  f  2  f
+  2  f  1  a  1  a  1  a  1  a
+  2  f  1  a  1  a  1  a  2  f
+  2  f  1  a  1  a  2  f  1  a
+  2  f  1  a  1  a  2  f  2  f
+  2  f  1  a  2  f  1  a  1  a
+  2  f  1  a  2  f  1  a  2  f
+  2  f  1  a  2  f  2  f  1  a
+  2  f  1  a  2  f  2  f  2  f
+  2  f  2  f  1  a  1  a  1  a
+  2  f  2  f  1  a  1  a  2  f
+  2  f  2  f  1  a  2  f  1  a
+  2  f  2  f  1  a  2  f  2  f
+  2  f  2  f  2  f  1  a  1  a
+  2  f  2  f  2  f  1  a  2  f
+  2  f  2  f  2  f  2  f  1  a
+  2  f  2  f  2  f  2  f  2  f
+  a
+  f
+  t
+  u
+  v
+  w
+  X
+  1  a  1  a  1  a  1  a  1  a
+  1  a  1  a  1  a  1  a  2  f
+  1  a  1  a  1  a  2  f  1  a
+  1  a  1  a  1  a  2  f  2  f
+  1  a  1  a  2  f  1  a  1  a
+  1  a  1  a  2  f  1  a  2  f
+  1  a  1  a  2  f  2  f  1  a
+  1  a  1  a  2  f  2  f  2  f
+  1  a  2  f  1  a  1  a  1  a
+  1  a  2  f  1  a  1  a  2  f
+  1  a  2  f  1  a  2  f  1  a
+  1  a  2  f  1  a  2  f  2  f
+  1  a  2  f  2  f  1  a  1  a
+  1  a  2  f  2  f  1  a  2  f
+  1  a  2  f  2  f  2  f  1  a
+  1  a  2  f  2  f  2  f  2  f
+  2  f  1  a  1  a  1  a  1  a
+  2  f  1  a  1  a  1  a  2  f
+  2  f  1  a  1  a  2  f  1  a
+  2  f  1  a  1  a  2  f  2  f
+  2  f  1  a  2  f  1  a  1  a
+  2  f  1  a  2  f  1  a  2  f
+  2  f  1  a  2  f  2  f  1  a
+  2  f  1  a  2  f  2  f  2  f
+  2  f  2  f  1  a  1  a  1  a
+  2  f  2  f  1  a  1  a  2  f
+  2  f  2  f  1  a  2  f  1  a
+  2  f  2  f  1  a  2  f  2  f
+  2  f  2  f  2  f  1  a  1  a
+  2  f  2  f  2  f  1  a  2  f
+  2  f  2  f  2  f  2  f  1  a
+  2  f  2  f  2  f  2  f  2  f
+  a
+  f
+  t
+  u
+  v
+  w
+  X
+  1  a  1  a  1  a  1  a  1  a
+  1  a  1  a  1  a  1  a  2  f
+  1  a  1  a  1  a  2  f  1  a
+  1  a  1  a  1  a  2  f  2  f
+  1  a  1  a  2  f  1  a  1  a
+  1  a  1  a  2  f  1  a  2  f
+  1  a  1  a  2  f  2  f  1  a
+  1  a  1  a  2  f  2  f  2  f
+  1  a  2  f  1  a  1  a  1  a
+  1  a  2  f  1  a  1  a  2  f
+  1  a  2  f  1  a  2  f  1  a
+  1  a  2  f  1  a  2  f  2  f
+  1  a  2  f  2  f  1  a  1  a
+  1  a  2  f  2  f  1  a  2  f
+  1  a  2  f  2  f  2  f  1  a
+  1  a  2  f  2  f  2  f  2  f
+  2  f  1  a  1  a  1  a  1  a
+  2  f  1  a  1  a  1  a  2  f
+  2  f  1  a  1  a  2  f  1  a
+  2  f  1  a  1  a  2  f  2  f
+  2  f  1  a  2  f  1  a  1  a
+  2  f  1  a  2  f  1  a  2  f
+  2  f  1  a  2  f  2  f  1  a
+  2  f  1  a  2  f  2  f  2  f
+  2  f  2  f  1  a  1  a  1  a
+  2  f  2  f  1  a  1  a  2  f
+  2  f  2  f  1  a  2  f  1  a
+  2  f  2  f  1  a  2  f  2  f
+  2  f  2  f  2  f  1  a  1  a
+  2  f  2  f  2  f  1  a  2  f
+  2  f  2  f  2  f  2  f  1  a
+  2  f  2  f  2  f  2  f  2  f
+  a
+  f
+  t
+  u
+  v
+  w
+  X
+  1  a  1  a  1  a  1  a  1  a
+  1  a  1  a  1  a  1  a  2  f
+  1  a  1  a  1  a  2  f  1  a
+  1  a  1  a  1  a  2  f  2  f
+  1  a  1  a  2  f  1  a  1  a
+  1  a  1  a  2  f  1  a  2  f
+  1  a  1  a  2  f  2  f  1  a
+  1  a  1  a  2  f  2  f  2  f
+  1  a  2  f  1  a  1  a  1  a
+  1  a  2  f  1  a  1  a  2  f
+  1  a  2  f  1  a  2  f  1  a
+  1  a  2  f  1  a  2  f  2  f
+  1  a  2  f  2  f  1  a  1  a
+  1  a  2  f  2  f  1  a  2  f
+  1  a  2  f  2  f  2  f  1  a
+  1  a  2  f  2  f  2  f  2  f
+  2  f  1  a  1  a  1  a  1  a
+  2  f  1  a  1  a  1  a  2  f
+  2  f  1  a  1  a  2  f  1  a
+  2  f  1  a  1  a  2  f  2  f
+  2  f  1  a  2  f  1  a  1  a
+  2  f  1  a  2  f  1  a  2  f
+  2  f  1  a  2  f  2  f  1  a
+  2  f  1  a  2  f  2  f  2  f
+  2  f  2  f  1  a  1  a  1  a
+  2  f  2  f  1  a  1  a  2  f
+  2  f  2  f  1  a  2  f  1  a
+  2  f  2  f  1  a  2  f  2  f
+  2  f  2  f  2  f  1  a  1  a
+  2  f  2  f  2  f  1  a  2  f
+  2  f  2  f  2  f  2  f  1  a
+  2  f  2  f  2  f  2  f  2  f
+  a
+  f
+  t
+  u
+  v
+  w
+  X
+  1  a  1  a  1  a  1  a  1  a
+  1  a  1  a  1  a  1  a  2  f
+  1  a  1  a  1  a  2  f  1  a
+  1  a  1  a  1  a  2  f  2  f
+  1  a  1  a  2  f  1  a  1  a
+  1  a  1  a  2  f  1  a  2  f
+  1  a  1  a  2  f  2  f  1  a
+  1  a  1  a  2  f  2  f  2  f
+  1  a  2  f  1  a  1  a  1  a
+  1  a  2  f  1  a  1  a  2  f
+  1  a  2  f  1  a  2  f  1  a
+  1  a  2  f  1  a  2  f  2  f
+  1  a  2  f  2  f  1  a  1  a
+  1  a  2  f  2  f  1  a  2  f
+  1  a  2  f  2  f  2  f  1  a
+  1  a  2  f  2  f  2  f  2  f
+  2  f  1  a  1  a  1  a  1  a
+  2  f  1  a  1  a  1  a  2  f
+  2  f  1  a  1  a  2  f  1  a
+  2  f  1  a  1  a  2  f  2  f
+  2  f  1  a  2  f  1  a  1  a
+  2  f  1  a  2  f  1  a  2  f
+  2  f  1  a  2  f  2  f  1  a
+  2  f  1  a  2  f  2  f  2  f
+  2  f  2  f  1  a  1  a  1  a
+  2  f  2  f  1  a  1  a  2  f
+  2  f  2  f  1  a  2  f  1  a
+  2  f  2  f  1  a  2  f  2  f
+  2  f  2  f  2  f  1  a  1  a
+  2  f  2  f  2  f  1  a  2  f
+  2  f  2  f  2  f  2  f  1  a
+  2  f  2  f  2  f  2  f  2  f
+  a
+  f
+  t
+  u
+  v
+  w
+  X
+  1  a  1  a  1  a  1  a  1  a
+  1  a  1  a  1  a  1  a  2  f
+  1  a  1  a  1  a  2  f  1  a
+  1  a  1  a  1  a  2  f  2  f
+  1  a  1  a  2  f  1  a  1  a
+  1  a  1  a  2  f  1  a  2  f
+  1  a  1  a  2  f  2  f  1  a
+  1  a  1  a  2  f  2  f  2  f
+  1  a  2  f  1  a  1  a  1  a
+  1  a  2  f  1  a  1  a  2  f
+  1  a  2  f  1  a  2  f  1  a
+  1  a  2  f  1  a  2  f  2  f
+  1  a  2  f  2  f  1  a  1  a
+  1  a  2  f  2  f  1  a  2  f
+  1  a  2  f  2  f  2  f  1  a
+  1  a  2  f  2  f  2  f  2  f
+  2  f  1  a  1  a  1  a  1  a
+  2  f  1  a  1  a  1  a  2  f
+  2  f  1  a  1  a  2  f  1  a
+  2  f  1  a  1  a  2  f  2  f
+  2  f  1  a  2  f  1  a  1  a
+  2  f  1  a  2  f  1  a  2  f
+  2  f  1  a  2  f  2  f  1  a
+  2  f  1  a  2  f  2  f  2  f
+  2  f  2  f  1  a  1  a  1  a
+  2  f  2  f  1  a  1  a  2  f
+  2  f  2  f  1  a  2  f  1  a
+  2  f  2  f  1  a  2  f  2  f
+  2  f  2  f  2  f  1  a  1  a
+  2  f  2  f  2  f  1  a  2  f
+  2  f  2  f  2  f  2  f  1  a
+  2  f  2  f  2  f  2  f  2  f
+  a
+  f
+  t
+  u
+  v
+  w
+  X
+  1  a  1  a  1  a  1  a  1  a
+  1  a  1  a  1  a  1  a  2  f
+  1  a  1  a  1  a  2  f  1  a
+  1  a  1  a  1  a  2  f  2  f
+  1  a  1  a  2  f  1  a  1  a
+  1  a  1  a  2  f  1  a  2  f
+  1  a  1  a  2  f  2  f  1  a
+  1  a  1  a  2  f  2  f  2  f
+  1  a  2  f  1  a  1  a  1  a
+  1  a  2  f  1  a  1  a  2  f
+  1  a  2  f  1  a  2  f  1  a
+  1  a  2  f  1  a  2  f  2  f
+  1  a  2  f  2  f  1  a  1  a
+  1  a  2  f  2  f  1  a  2  f
+  1  a  2  f  2  f  2  f  1  a
+  1  a  2  f  2  f  2  f  2  f
+  2  f  1  a  1  a  1  a  1  a
+  2  f  1  a  1  a  1  a  2  f
+  2  f  1  a  1  a  2  f  1  a
+  2  f  1  a  1  a  2  f  2  f
+  2  f  1  a  2  f  1  a  1  a
+  2  f  1  a  2  f  1  a  2  f
+  2  f  1  a  2  f  2  f  1  a
+  2  f  1  a  2  f  2  f  2  f
+  2  f  2  f  1  a  1  a  1  a
+  2  f  2  f  1  a  1  a  2  f
+  2  f  2  f  1  a  2  f  1  a
+  2  f  2  f  1  a  2  f  2  f
+  2  f  2  f  2  f  1  a  1  a
+  2  f  2  f  2  f  1  a  2  f
+  2  f  2  f  2  f  2  f  1  a
+  2  f  2  f  2  f  2  f  2  f
+  a
+  f
+  t
+  u
+  v
+  w
+  X
+  1  a  1  a  1  a  1  a  1  a
+  1  a  1  a  1  a  1  a  2  f
+  1  a  1  a  1  a  2  f  1  a
+  1  a  1  a  1  a  2  f  2  f
+  1  a  1  a  2  f  1  a  1  a
+  1  a  1  a  2  f  1  a  2  f
+  1  a  1  a  2  f  2  f  1  a
+  1  a  1  a  2  f  2  f  2  f
+  1  a  2  f  1  a  1  a  1  a
+  1  a  2  f  1  a  1  a  2  f
+  1  a  2  f  1  a  2  f  1  a
+  1  a  2  f  1  a  2  f  2  f
+  1  a  2  f  2  f  1  a  1  a
+  1  a  2  f  2  f  1  a  2  f
+  1  a  2  f  2  f  2  f  1  a
+  1  a  2  f  2  f  2  f  2  f
+  2  f  1  a  1  a  1  a  1  a
+  2  f  1  a  1  a  1  a  2  f
+  2  f  1  a  1  a  2  f  1  a
+  2  f  1  a  1  a  2  f  2  f
+  2  f  1  a  2  f  1  a  1  a
+  2  f  1  a  2  f  1  a  2  f
+  2  f  1  a  2  f  2  f  1  a
+  2  f  1  a  2  f  2  f  2  f
+  2  f  2  f  1  a  1  a  1  a
+  2  f  2  f  1  a  1  a  2  f
+  2  f  2  f  1  a  2  f  1  a
+  2  f  2  f  1  a  2  f  2  f
+  2  f  2  f  2  f  1  a  1  a
+  2  f  2  f  2  f  1  a  2  f
+  2  f  2  f  2  f  2  f  1  a
+  2  f  2  f  2  f  2  f  2  f
+  a
+  f
+  t
+  u
+  v
+  w
+  X
+  1  a  1  a  1  a  1  a  1  a
+  1  a  1  a  1  a  1  a  2  f
+  1  a  1  a  1  a  2  f  1  a
+  1  a  1  a  1  a  2  f  2  f
+  1  a  1  a  2  f  1  a  1  a
+  1  a  1  a  2  f  1  a  2  f
+  1  a  1  a  2  f  2  f  1  a
+  1  a  1  a  2  f  2  f  2  f
+  1  a  2  f  1  a  1  a  1  a
+  1  a  2  f  1  a  1  a  2  f
+  1  a  2  f  1  a  2  f  1  a
+  1  a  2  f  1  a  2  f  2  f
+  1  a  2  f  2  f  1  a  1  a
+  1  a  2  f  2  f  1  a  2  f
+  1  a  2  f  2  f  2  f  1  a
+  1  a  2  f  2  f  2  f  2  f
+  2  f  1  a  1  a  1  a  1  a
+  2  f  1  a  1  a  1  a  2  f
+  2  f  1  a  1  a  2  f  1  a
+  2  f  1  a  1  a  2  f  2  f
+  2  f  1  a  2  f  1  a  1  a
+  2  f  1  a  2  f  1  a  2  f
+  2  f  1  a  2  f  2  f  1  a
+  2  f  1  a  2  f  2  f  2  f
+  2  f  2  f  1  a  1  a  1  a
+  2  f  2  f  1  a  1  a  2  f
+  2  f  2  f  1  a  2  f  1  a
+  2  f  2  f  1  a  2  f  2  f
+  2  f  2  f  2  f  1  a  1  a
+  2  f  2  f  2  f  1  a  2  f
+  2  f  2  f  2  f  2  f  1  a
+  2  f  2  f  2  f  2  f  2  f
+  a
+  f
+  t
+  u
+  v
+  w
+  X
+  1  a  1  a  1  a  1  a  1  a
+  1  a  1  a  1  a  1  a  2  f
+  1  a  1  a  1  a  2  f  1  a
+  1  a  1  a  1  a  2  f  2  f
+  1  a  1  a  2  f  1  a  1  a
+  1  a  1  a  2  f  1  a  2  f
+  1  a  1  a  2  f  2  f  1  a
+  1  a  1  a  2  f  2  f  2  f
+  1  a  2  f  1  a  1  a  1  a
+  1  a  2  f  1  a  1  a  2  f
+  1  a  2  f  1  a  2  f  1  a
+  1  a  2  f  1  a  2  f  2  f
+  1  a  2  f  2  f  1  a  1  a
+  1  a  2  f  2  f  1  a  2  f
+  1  a  2  f  2  f  2  f  1  a
+  1  a  2  f  2  f  2  f  2  f
+  2  f  1  a  1  a  1  a  1  a
+  2  f  1  a  1  a  1  a  2  f
+  2  f  1  a  1  a  2  f  1  a
+  2  f  1  a  1  a  2  f  2  f
+  2  f  1  a  2  f  1  a  1  a
+  2  f  1  a  2  f  1  a  2  f
+  2  f  1  a  2  f  2  f  1  a
+  2  f  1  a  2  f  2  f  2  f
+  2  f  2  f  1  a  1  a  1  a
+  2  f  2  f  1  a  1  a  2  f
+  2  f  2  f  1  a  2  f  1  a
+  2  f  2  f  1  a  2  f  2  f
+  2  f  2  f  2  f  1  a  1  a
+  2  f  2  f  2  f  1  a  2  f
+  2  f  2  f  2  f  2  f  1  a
+  2  f  2  f  2  f  2  f  2  f
+  a
+  f
+  t
+  u
+  v
+  w
+  X
+  1  a  1  a  1  a  1  a  1  a
+  1  a  1  a  1  a  1  a  2  f
+  1  a  1  a  1  a  2  f  1  a
+  1  a  1  a  1  a  2  f  2  f
+  1  a  1  a  2  f  1  a  1  a
+  1  a  1  a  2  f  1  a  2  f
+  1  a  1  a  2  f  2  f  1  a
+  1  a  1  a  2  f  2  f  2  f
+  1  a  2  f  1  a  1  a  1  a
+  1  a  2  f  1  a  1  a  2  f
+  1  a  2  f  1  a  2  f  1  a
+  1  a  2  f  1  a  2  f  2  f
+  1  a  2  f  2  f  1  a  1  a
+  1  a  2  f  2  f  1  a  2  f
+  1  a  2  f  2  f  2  f  1  a
+  1  a  2  f  2  f  2  f  2  f
+  2  f  1  a  1  a  1  a  1  a
+  2  f  1  a  1  a  1  a  2  f
+  2  f  1  a  1  a  2  f  1  a
+  2  f  1  a  1  a  2  f  2  f
+  2  f  1  a  2  f  1  a  1  a
+  2  f  1  a  2  f  1  a  2  f
+  2  f  1  a  2  f  2  f  1  a
+  2  f  1  a  2  f  2  f  2  f
+  2  f  2  f  1  a  1  a  1  a
+  2  f  2  f  1  a  1  a  2  f
+  2  f  2  f  1  a  2  f  1  a
+  2  f  2  f  1  a  2  f  2  f
+  2  f  2  f  2  f  1  a  1  a
+  2  f  2  f  2  f  1  a  2  f
+  2  f  2  f  2  f  2  f  1  a
+  2  f  2  f  2  f  2  f  2  f
+  a
+  f
+  t
+  u
+  v
+  w
+  X
+  1  a  1  a  1  a  1  a  1  a
+  1  a  1  a  1  a  1  a  2  f
+  1  a  1  a  1  a  2  f  1  a
+  1  a  1  a  1  a  2  f  2  f
+  1  a  1  a  2  f  1  a  1  a
+  1  a  1  a  2  f  1  a  2  f
+  1  a  1  a  2  f  2  f  1  a
+  1  a  1  a  2  f  2  f  2  f
+  1  a  2  f  1  a  1  a  1  a
+  1  a  2  f  1  a  1  a  2  f
+  1  a  2  f  1  a  2  f  1  a
+  1  a  2  f  1  a  2  f  2  f
+  1  a  2  f  2  f  1  a  1  a
+  1  a  2  f  2  f  1  a  2  f
+  1  a  2  f  2  f  2  f  1  a
+  1  a  2  f  2  f  2  f  2  f
+  2  f  1  a  1  a  1  a  1  a
+  2  f  1  a  1  a  1  a  2  f
+  2  f  1  a  1  a  2  f  1  a
+  2  f  1  a  1  a  2  f  2  f
+  2  f  1  a  2  f  1  a  1  a
+  2  f  1  a  2  f  1  a  2  f
+  2  f  1  a  2  f  2  f  1  a
+  2  f  1  a  2  f  2  f  2  f
+  2  f  2  f  1  a  1  a  1  a
+  2  f  2  f  1  a  1  a  2  f
+  2  f  2  f  1  a  2  f  1  a
+  2  f  2  f  1  a  2  f  2  f
+  2  f  2  f  2  f  1  a  1  a
+  2  f  2  f  2  f  1  a  2  f
+  2  f  2  f  2  f  2  f  1  a
+  2  f  2  f  2  f  2  f  2  f
+  a
+  f
+  t
+  u
+  v
+  w
+  X
+  1  a  1  a  1  a  1  a  1  a
+  1  a  1  a  1  a  1  a  2  f
+  1  a  1  a  1  a  2  f  1  a
+  1  a  1  a  1  a  2  f  2  f
+  1  a  1  a  2  f  1  a  1  a
+  1  a  1  a  2  f  1  a  2  f
+  1  a  1  a  2  f  2  f  1  a
+  1  a  1  a  2  f  2  f  2  f
+  1  a  2  f  1  a  1  a  1  a
+  1  a  2  f  1  a  1  a  2  f
+  1  a  2  f  1  a  2  f  1  a
+  1  a  2  f  1  a  2  f  2  f
+  1  a  2  f  2  f  1  a  1  a
+  1  a  2  f  2  f  1  a  2  f
+  1  a  2  f  2  f  2  f  1  a
+  1  a  2  f  2  f  2  f  2  f
+  2  f  1  a  1  a  1  a  1  a
+  2  f  1  a  1  a  1  a  2  f
+  2  f  1  a  1  a  2  f  1  a
+  2  f  1  a  1  a  2  f  2  f
+  2  f  1  a  2  f  1  a  1  a
+  2  f  1  a  2  f  1  a  2  f
+  2  f  1  a  2  f  2  f  1  a
+  2  f  1  a  2  f  2  f  2  f
+  2  f  2  f  1  a  1  a  1  a
+  2  f  2  f  1  a  1  a  2  f
+  2  f  2  f  1  a  2  f  1  a
+  2  f  2  f  1  a  2  f  2  f
+  2  f  2  f  2  f  1  a  1  a
+  2  f  2  f  2  f  1  a  2  f
+  2  f  2  f  2  f  2  f  1  a
+  2  f  2  f  2  f  2  f  2  f
+  a
+  f
+  t
+  u
+  v
+  w
+  X
+  1  a  1  a  1  a  1  a  1  a
+  1  a  1  a  1  a  1  a  2  f
+  1  a  1  a  1  a  2  f  1  a
+  1  a  1  a  1  a  2  f  2  f
+  1  a  1  a  2  f  1  a  1  a
+  1  a  1  a  2  f  1  a  2  f
+  1  a  1  a  2  f  2  f  1  a
+  1  a  1  a  2  f  2  f  2  f
+  1  a  2  f  1  a  1  a  1  a
+  1  a  2  f  1  a  1  a  2  f
+  1  a  2  f  1  a  2  f  1  a
+  1  a  2  f  1  a  2  f  2  f
+  1  a  2  f  2  f  1  a  1  a
+  1  a  2  f  2  f  1  a  2  f
+  1  a  2  f  2  f  2  f  1  a
+  1  a  2  f  2  f  2  f  2  f
+  2  f  1  a  1  a  1  a  1  a
+  2  f  1  a  1  a  1  a  2  f
+  2  f  1  a  1  a  2  f  1  a
+  2  f  1  a  1  a  2  f  2  f
+  2  f  1  a  2  f  1  a  1  a
+  2  f  1  a  2  f  1  a  2  f
+  2  f  1  a  2  f  2  f  1  a
+  2  f  1  a  2  f  2  f  2  f
+  2  f  2  f  1  a  1  a  1  a
+  2  f  2  f  1  a  1  a  2  f
+  2  f  2  f  1  a  2  f  1  a
+  2  f  2  f  1  a  2  f  2  f
+  2  f  2  f  2  f  1  a  1  a
+  2  f  2  f  2  f  1  a  2  f
+  2  f  2  f  2  f  2  f  1  a
+  2  f  2  f  2  f  2  f  2  f
+  a
+  f
+  t
+  u
+  v
+  w
+  X
+  1  a  1  a  1  a  1  a  1  a
+  1  a  1  a  1  a  1  a  2  f
+  1  a  1  a  1  a  2  f  1  a
+  1  a  1  a  1  a  2  f  2  f
+  1  a  1  a  2  f  1  a  1  a
+  1  a  1  a  2  f  1  a  2  f
+  1  a  1  a  2  f  2  f  1  a
+  1  a  1  a  2  f  2  f  2  f
+  1  a  2  f  1  a  1  a  1  a
+  1  a  2  f  1  a  1  a  2  f
+  1  a  2  f  1  a  2  f  1  a
+  1  a  2  f  1  a  2  f  2  f
+  1  a  2  f  2  f  1  a  1  a
+  1  a  2  f  2  f  1  a  2  f
+  1  a  2  f  2  f  2  f  1  a
+  1  a  2  f  2  f  2  f  2  f
+  2  f  1  a  1  a  1  a  1  a
+  2  f  1  a  1  a  1  a  2  f
+  2  f  1  a  1  a  2  f  1  a
+  2  f  1  a  1  a  2  f  2  f
+  2  f  1  a  2  f  1  a  1  a
+  2  f  1  a  2  f  1  a  2  f
+  2  f  1  a  2  f  2  f  1  a
+  2  f  1  a  2  f  2  f  2  f
+  2  f  2  f  1  a  1  a  1  a
+  2  f  2  f  1  a  1  a  2  f
+  2  f  2  f  1  a  2  f  1  a
+  2  f  2  f  1  a  2  f  2  f
+  2  f  2  f  2  f  1  a  1  a
+  2  f  2  f  2  f  1  a  2  f
+  2  f  2  f  2  f  2  f  1  a
+  2  f  2  f  2  f  2  f  2  f
+  a
+  f
+  t
+  u
+  v
+  w
+  X
+  1  a  1  a  1  a  1  a  1  a
+  1  a  1  a  1  a  1  a  2  f
+  1  a  1  a  1  a  2  f  1  a
+  1  a  1  a  1  a  2  f  2  f
+  1  a  1  a  2  f  1  a  1  a
+  1  a  1  a  2  f  1  a  2  f
+  1  a  1  a  2  f  2  f  1  a
+  1  a  1  a  2  f  2  f  2  f
+  1  a  2  f  1  a  1  a  1  a
+  1  a  2  f  1  a  1  a  2  f
+  1  a  2  f  1  a  2  f  1  a
+  1  a  2  f  1  a  2  f  2  f
+  1  a  2  f  2  f  1  a  1  a
+  1  a  2  f  2  f  1  a  2  f
+  1  a  2  f  2  f  2  f  1  a
+  1  a  2  f  2  f  2  f  2  f
+  2  f  1  a  1  a  1  a  1  a
+  2  f  1  a  1  a  1  a  2  f
+  2  f  1  a  1  a  2  f  1  a
+  2  f  1  a  1  a  2  f  2  f
+  2  f  1  a  2  f  1  a  1  a
+  2  f  1  a  2  f  1  a  2  f
+  2  f  1  a  2  f  2  f  1  a
+  2  f  1  a  2  f  2  f  2  f
+  2  f  2  f  1  a  1  a  1  a
+  2  f  2  f  1  a  1  a  2  f
+  2  f  2  f  1  a  2  f  1  a
+  2  f  2  f  1  a  2  f  2  f
+  2  f  2  f  2  f  1  a  1  a
+  2  f  2  f  2  f  1  a  2  f
+  2  f  2  f  2  f  2  f  1  a
+  2  f  2  f  2  f  2  f  2  f
+  a
+  f
+  t
+  u
+  v
+  w
+  X
+  1  a  1  a  1  a  1  a  1  a
+  1  a  1  a  1  a  1  a  2  f
+  1  a  1  a  1  a  2  f  1  a
+  1  a  1  a  1  a  2  f  2  f
+  1  a  1  a  2  f  1  a  1  a
+  1  a  1  a  2  f  1  a  2  f
+  1  a  1  a  2  f  2  f  1  a
+  1  a  1  a  2  f  2  f  2  f
+  1  a  2  f  1  a  1  a  1  a
+  1  a  2  f  1  a  1  a  2  f
+  1  a  2  f  1  a  2  f  1  a
+  1  a  2  f  1  a  2  f  2  f
+  1  a  2  f  2  f  1  a  1  a
+  1  a  2  f  2  f  1  a  2  f
+  1  a  2  f  2  f  2  f  1  a
+  1  a  2  f  2  f  2  f  2  f
+  2  f  1  a  1  a  1  a  1  a
+  2  f  1  a  1  a  1  a  2  f
+  2  f  1  a  1  a  2  f  1  a
+  2  f  1  a  1  a  2  f  2  f
+  2  f  1  a  2  f  1  a  1  a
+  2  f  1  a  2  f  1  a  2  f
+  2  f  1  a  2  f  2  f  1  a
+  2  f  1  a  2  f  2  f  2  f
+  2  f  2  f  1  a  1  a  1  a
+  2  f  2  f  1  a  1  a  2  f
+  2  f  2  f  1  a  2  f  1  a
+  2  f  2  f  1  a  2  f  2  f
+  2  f  2  f  2  f  1  a  1  a
+  2  f  2  f  2  f  1  a  2  f
+  2  f  2  f  2  f  2  f  1  a
+  2  f  2  f  2  f  2  f  2  f
+  a
+  f
+  t
+  u
+  v
+  w
+  X
+  1  a  1  a  1  a  1  a  1  a
+  1  a  1  a  1  a  1  a  2  f
+  1  a  1  a  1  a  2  f  1  a
+  1  a  1  a  1  a  2  f  2  f
+  1  a  1  a  2  f  1  a  1  a
+  1  a  1  a  2  f  1  a  2  f
+  1  a  1  a  2  f  2  f  1  a
+  1  a  1  a  2  f  2  f  2  f
+  1  a  2  f  1  a  1  a  1  a
+  1  a  2  f  1  a  1  a  2  f
+  1  a  2  f  1  a  2  f  1  a
+  1  a  2  f  1  a  2  f  2  f
+  1  a  2  f  2  f  1  a  1  a
+  1  a  2  f  2  f  1  a  2  f
+  1  a  2  f  2  f  2  f  1  a
+  1  a  2  f  2  f  2  f  2  f
+  2  f  1  a  1  a  1  a  1  a
+  2  f  1  a  1  a  1  a  2  f
+  2  f  1  a  1  a  2  f  1  a
+  2  f  1  a  1  a  2  f  2  f
+  2  f  1  a  2  f  1  a  1  a
+  2  f  1  a  2  f  1  a  2  f
+  2  f  1  a  2  f  2  f  1  a
+  2  f  1  a  2  f  2  f  2  f
+  2  f  2  f  1  a  1  a  1  a
+  2  f  2  f  1  a  1  a  2  f
+  2  f  2  f  1  a  2  f  1  a
+  2  f  2  f  1  a  2  f  2  f
+  2  f  2  f  2  f  1  a  1  a
+  2  f  2  f  2  f  1  a  2  f
+  2  f  2  f  2  f  2  f  1  a
+  2  f  2  f  2  f  2  f  2  f
+  a
+  f
+  t
+  u
+  v
+  w
+  X
+  1  a  1  a  1  a  1  a  1  a
+  1  a  1  a  1  a  1  a  2  f
+  1  a  1  a  1  a  2  f  1  a
+  1  a  1  a  1  a  2  f  2  f
+  1  a  1  a  2  f  1  a  1  a
+  1  a  1  a  2  f  1  a  2  f
+  1  a  1  a  2  f  2  f  1  a
+  1  a  1  a  2  f  2  f  2  f
+  1  a  2  f  1  a  1  a  1  a
+  1  a  2  f  1  a  1  a  2  f
+  1  a  2  f  1  a  2  f  1  a
+  1  a  2  f  1  a  2  f  2  f
+  1  a  2  f  2  f  1  a  1  a
+  1  a  2  f  2  f  1  a  2  f
+  1  a  2  f  2  f  2  f  1  a
+  1  a  2  f  2  f  2  f  2  f
+  2  f  1  a  1  a  1  a  1  a
+  2  f  1  a  1  a  1  a  2  f
+  2  f  1  a  1  a  2  f  1  a
+  2  f  1  a  1  a  2  f  2  f
+  2  f  1  a  2  f  1  a  1  a
+  2  f  1  a  2  f  1  a  2  f
+  2  f  1  a  2  f  2  f  1  a
+  2  f  1  a  2  f  2  f  2  f
+  2  f  2  f  1  a  1  a  1  a
+  2  f  2  f  1  a  1  a  2  f
+  2  f  2  f  1  a  2  f  1  a
+  2  f  2  f  1  a  2  f  2  f
+  2  f  2  f  2  f  1  a  1  a
+  2  f  2  f  2  f  1  a  2  f
+  2  f  2  f  2  f  2  f  1  a
+  2  f  2  f  2  f  2  f  2  f
+  a
+  f
+  t
+  u
+  v
+  w
+  X
+  1  a  1  a  1  a  1  a  1  a
+  1  a  1  a  1  a  1  a  2  f
+  1  a  1  a  1  a  2  f  1  a
+  1  a  1  a  1  a  2  f  2  f
+  1  a  1  a  2  f  1  a  1  a
+  1  a  1  a  2  f  1  a  2  f
+  1  a  1  a  2  f  2  f  1  a
+  1  a  1  a  2  f  2  f  2  f
+  1  a  2  f  1  a  1  a  1  a
+  1  a  2  f  1  a  1  a  2  f
+  1  a  2  f  1  a  2  f  1  a
+  1  a  2  f  1  a  2  f  2  f
+  1  a  2  f  2  f  1  a  1  a
+  1  a  2  f  2  f  1  a  2  f
+  1  a  2  f  2  f  2  f  1  a
+  1  a  2  f  2  f  2  f  2  f
+  2  f  1  a  1  a  1  a  1  a
+  2  f  1  a  1  a  1  a  2  f
+  2  f  1  a  1  a  2  f  1  a
+  2  f  1  a  1  a  2  f  2  f
+  2  f  1  a  2  f  1  a  1  a
+  2  f  1  a  2  f  1  a  2  f
+  2  f  1  a  2  f  2  f  1  a
+  2  f  1  a  2  f  2  f  2  f
+  2  f  2  f  1  a  1  a  1  a
+  2  f  2  f  1  a  1  a  2  f
+  2  f  2  f  1  a  2  f  1  a
+  2  f  2  f  1  a  2  f  2  f
+  2  f  2  f  2  f  1  a  1  a
+  2  f  2  f  2  f  1  a  2  f
+  2  f  2  f  2  f  2  f  1  a
+  2  f  2  f  2  f  2  f  2  f
+  a
+  f
+  t
+  u
+  v
+  w
+  X
+  1  a  1  a  1  a  1  a  1  a
+  1  a  1  a  1  a  1  a  2  f
+  1  a  1  a  1  a  2  f  1  a
+  1  a  1  a  1  a  2  f  2  f
+  1  a  1  a  2  f  1  a  1  a
+  1  a  1  a  2  f  1  a  2  f
+  1  a  1  a  2  f  2  f  1  a
+  1  a  1  a  2  f  2  f  2  f
+  1  a  2  f  1  a  1  a  1  a
+  1  a  2  f  1  a  1  a  2  f
+  1  a  2  f  1  a  2  f  1  a
+  1  a  2  f  1  a  2  f  2  f
+  1  a  2  f  2  f  1  a  1  a
+  1  a  2  f  2  f  1  a  2  f
+  1  a  2  f  2  f  2  f  1  a
+  1  a  2  f  2  f  2  f  2  f
+  2  f  1  a  1  a  1  a  1  a
+  2  f  1  a  1  a  1  a  2  f
+  2  f  1  a  1  a  2  f  1  a
+  2  f  1  a  1  a  2  f  2  f
+  2  f  1  a  2  f  1  a  1  a
+  2  f  1  a  2  f  1  a  2  f
+  2  f  1  a  2  f  2  f  1  a
+  2  f  1  a  2  f  2  f  2  f
+  2  f  2  f  1  a  1  a  1  a
+  2  f  2  f  1  a  1  a  2  f
+  2  f  2  f  1  a  2  f  1  a
+  2  f  2  f  1  a  2  f  2  f
+  2  f  2  f  2  f  1  a  1  a
+  2  f  2  f  2  f  1  a  2  f
+  2  f  2  f  2  f  2  f  1  a
+  2  f  2  f  2  f  2  f  2  f
+  a
+  f
+  t
+  u
+  v
+  w
+  X
+  1  a  1  a  1  a  1  a  1  a
+  1  a  1  a  1  a  1  a  2  f
+  1  a  1  a  1  a  2  f  1  a
+  1  a  1  a  1  a  2  f  2  f
+  1  a  1  a  2  f  1  a  1  a
+  1  a  1  a  2  f  1  a  2  f
+  1  a  1  a  2  f  2  f  1  a
+  1  a  1  a  2  f  2  f  2  f
+  1  a  2  f  1  a  1  a  1  a
+  1  a  2  f  1  a  1  a  2  f
+  1  a  2  f  1  a  2  f  1  a
+  1  a  2  f  1  a  2  f  2  f
+  1  a  2  f  2  f  1  a  1  a
+  1  a  2  f  2  f  1  a  2  f
+  1  a  2  f  2  f  2  f  1  a
+  1  a  2  f  2  f  2  f  2  f
+  2  f  1  a  1  a  1  a  1  a
+  2  f  1  a  1  a  1  a  2  f
+  2  f  1  a  1  a  2  f  1  a
+  2  f  1  a  1  a  2  f  2  f
+  2  f  1  a  2  f  1  a  1  a
+  2  f  1  a  2  f  1  a  2  f
+  2  f  1  a  2  f  2  f  1  a
+  2  f  1  a  2  f  2  f  2  f
+  2  f  2  f  1  a  1  a  1  a
+  2  f  2  f  1  a  1  a  2  f
+  2  f  2  f  1  a  2  f  1  a
+  2  f  2  f  1  a  2  f  2  f
+  2  f  2  f  2  f  1  a  1  a
+  2  f  2  f  2  f  1  a  2  f
+  2  f  2  f  2  f  2  f  1  a
+  2  f  2  f  2  f  2  f  2  f
+  a
+  f
+  t
+  u
+  v
+  w
+  X
+  1  a  1  a  1  a  1  a  1  a
+  1  a  1  a  1  a  1  a  2  f
+  1  a  1  a  1  a  2  f  1  a
+  1  a  1  a  1  a  2  f  2  f
+  1  a  1  a  2  f  1  a  1  a
+  1  a  1  a  2  f  1  a  2  f
+  1  a  1  a  2  f  2  f  1  a
+  1  a  1  a  2  f  2  f  2  f
+  1  a  2  f  1  a  1  a  1  a
+  1  a  2  f  1  a  1  a  2  f
+  1  a  2  f  1  a  2  f  1  a
+  1  a  2  f  1  a  2  f  2  f
+  1  a  2  f  2  f  1  a  1  a
+  1  a  2  f  2  f  1  a  2  f
+  1  a  2  f  2  f  2  f  1  a
+  1  a  2  f  2  f  2  f  2  f
+  2  f  1  a  1  a  1  a  1  a
+  2  f  1  a  1  a  1  a  2  f
+  2  f  1  a  1  a  2  f  1  a
+  2  f  1  a  1  a  2  f  2  f
+  2  f  1  a  2  f  1  a  1  a
+  2  f  1  a  2  f  1  a  2  f
+  2  f  1  a  2  f  2  f  1  a
+  2  f  1  a  2  f  2  f  2  f
+  2  f  2  f  1  a  1  a  1  a
+  2  f  2  f  1  a  1  a  2  f
+  2  f  2  f  1  a  2  f  1  a
+  2  f  2  f  1  a  2  f  2  f
+  2  f  2  f  2  f  1  a  1  a
+  2  f  2  f  2  f  1  a  2  f
+  2  f  2  f  2  f  2  f  1  a
+  2  f  2  f  2  f  2  f  2  f
+  a
+  f
+  t
+  u
+  v
+  w
+  X
+  1  a  1  a  1  a  1  a  1  a
+  1  a  1  a  1  a  1  a  2  f
+  1  a  1  a  1  a  2  f  1  a
+  1  a  1  a  1  a  2  f  2  f
+  1  a  1  a  2  f  1  a  1  a
+  1  a  1  a  2  f  1  a  2  f
+  1  a  1  a  2  f  2  f  1  a
+  1  a  1  a  2  f  2  f  2  f
+  1  a  2  f  1  a  1  a  1  a
+  1  a  2  f  1  a  1  a  2  f
+  1  a  2  f  1  a  2  f  1  a
+  1  a  2  f  1  a  2  f  2  f
+  1  a  2  f  2  f  1  a  1  a
+  1  a  2  f  2  f  1  a  2  f
+  1  a  2  f  2  f  2  f  1  a
+  1  a  2  f  2  f  2  f  2  f
+  2  f  1  a  1  a  1  a  1  a
+  2  f  1  a  1  a  1  a  2  f
+  2  f  1  a  1  a  2  f  1  a
+  2  f  1  a  1  a  2  f  2  f
+  2  f  1  a  2  f  1  a  1  a
+  2  f  1  a  2  f  1  a  2  f
+  2  f  1  a  2  f  2  f  1  a
+  2  f  1  a  2  f  2  f  2  f
+  2  f  2  f  1  a  1  a  1  a
+  2  f  2  f  1  a  1  a  2  f
+  2  f  2  f  1  a  2  f  1  a
+  2  f  2  f  1  a  2  f  2  f
+  2  f  2  f  2  f  1  a  1  a
+  2  f  2  f  2  f  1  a  2  f
+  2  f  2  f  2  f  2  f  1  a
+  2  f  2  f  2  f  2  f  2  f
+  a
+  f
+  t
+  u
+  v
+  w
+  X
+  1  a  1  a  1  a  1  a  1  a
+  1  a  1  a  1  a  1  a  2  f
+  1  a  1  a  1  a  2  f  1  a
+  1  a  1  a  1  a  2  f  2  f
+  1  a  1  a  2  f  1  a  1  a
+  1  a  1  a  2  f  1  a  2  f
+  1  a  1  a  2  f  2  f  1  a
+  1  a  1  a  2  f  2  f  2  f
+  1  a  2  f  1  a  1  a  1  a
+  1  a  2  f  1  a  1  a  2  f
+  1  a  2  f  1  a  2  f  1  a
+  1  a  2  f  1  a  2  f  2  f
+  1  a  2  f  2  f  1  a  1  a
+  1  a  2  f  2  f  1  a  2  f
+  1  a  2  f  2  f  2  f  1  a
+  1  a  2  f  2  f  2  f  2  f
+  2  f  1  a  1  a  1  a  1  a
+  2  f  1  a  1  a  1  a  2  f
+  2  f  1  a  1  a  2  f  1  a
+  2  f  1  a  1  a  2  f  2  f
+  2  f  1  a  2  f  1  a  1  a
+  2  f  1  a  2  f  1  a  2  f
+  2  f  1  a  2  f  2  f  1  a
+  2  f  1  a  2  f  2  f  2  f
+  2  f  2  f  1  a  1  a  1  a
+  2  f  2  f  1  a  1  a  2  f
+  2  f  2  f  1  a  2  f  1  a
+  2  f  2  f  1  a  2  f  2  f
+  2  f  2  f  2  f  1  a  1  a
+  2  f  2  f  2  f  1  a  2  f
+  2  f  2  f  2  f  2  f  1  a
+  2  f  2  f  2  f  2  f  2  f
+  a
+  f
+  t
+  u
+  v
+  w
+  X
+  1  a  1  a  1  a  1  a  1  a
+  1  a  1  a  1  a  1  a  2  f
+  1  a  1  a  1  a  2  f  1  a
+  1  a  1  a  1  a  2  f  2  f
+  1  a  1  a  2  f  1  a  1  a
+  1  a  1  a  2  f  1  a  2  f
+  1  a  1  a  2  f  2  f  1  a
+  1  a  1  a  2  f  2  f  2  f
+  1  a  2  f  1  a  1  a  1  a
+  1  a  2  f  1  a  1  a  2  f
+  1  a  2  f  1  a  2  f  1  a
+  1  a  2  f  1  a  2  f  2  f
+  1  a  2  f  2  f  1  a  1  a
+  1  a  2  f  2  f  1  a  2  f
+  1  a  2  f  2  f  2  f  1  a
+  1  a  2  f  2  f  2  f  2  f
+  2  f  1  a  1  a  1  a  1  a
+  2  f  1  a  1  a  1  a  2  f
+  2  f  1  a  1  a  2  f  1  a
+  2  f  1  a  1  a  2  f  2  f
+  2  f  1  a  2  f  1  a  1  a
+  2  f  1  a  2  f  1  a  2  f
+  2  f  1  a  2  f  2  f  1  a
+  2  f  1  a  2  f  2  f  2  f
+  2  f  2  f  1  a  1  a  1  a
+  2  f  2  f  1  a  1  a  2  f
+  2  f  2  f  1  a  2  f  1  a
+  2  f  2  f  1  a  2  f  2  f
+  2  f  2  f  2  f  1  a  1  a
+  2  f  2  f  2  f  1  a  2  f
+  2  f  2  f  2  f  2  f  1  a
+  2  f  2  f  2  f  2  f  2  f
+  a
+  f
+  t
+  u
+  v
+  w
+  X
+===DONE===
diff --git a/ext/oci8/tests/imp_res_4.phpt b/ext/oci8/tests/imp_res_4.phpt
new file mode 100644 (file)
index 0000000..762ae77
--- /dev/null
@@ -0,0 +1,82 @@
+--TEST--
+Oracle Database 12c Implicit Result Sets: oci_fetch
+--SKIPIF--
+<?php 
+if (!extension_loaded('oci8')) die ("skip no oci8 extension"); 
+$target_dbs = array('oracledb' => true, 'timesten' => false);  // test runs on these DBs
+require(dirname(__FILE__).'/skipif.inc');
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
+if (!(isset($matches[0]) && $matches[1] >= 12)) {
+    die("skip expected output only valid when using Oracle Database 12c or greater");
+}
+preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
+if (!(isset($matches[0]) && $matches[0] >= 12)) { 
+    die("skip works only with Oracle 12c or greater version of Oracle client libraries");
+}
+?>
+--FILE--
+<?php
+
+require(dirname(__FILE__).'/connect.inc');
+
+// Initialization
+
+$stmtarray = array(
+    "create or replace procedure imp_res_4_proc as
+      c1 sys_refcursor;
+    begin
+        open c1 for select 1 from dual union select 2 from dual;
+        dbms_sql.return_result (c1);
+    end;"
+);
+
+oci8_test_sql_execute($c, $stmtarray);
+
+// Run Test
+
+echo "Test 1\n";
+$s = oci_parse($c, "begin imp_res_4_proc(); end;");
+oci_execute($s);
+oci_fetch($s);  // This will fail with ORA-24374
+var_dump(oci_result($s, 1));
+
+echo "\nTest 2\n";
+$s = oci_parse($c, "begin imp_res_4_proc(); end;");
+oci_execute($s);
+$r = oci_fetch_row($s);
+var_dump($r);
+oci_fetch($s);  // This will fail with ORA-24374
+var_dump(oci_result($s, 1));
+$r = oci_fetch_row($s);
+var_dump($r);
+
+// Clean up
+
+$stmtarray = array(
+    "drop procedure imp_res_4_proc",
+);
+
+oci8_test_sql_execute($c, $stmtarray);
+
+?>
+===DONE===
+<?php exit(0); ?>
+--EXPECTF--
+Test 1
+
+Warning: oci_fetch(): ORA-24374: %s in %simp_res_4.php on line %d
+bool(false)
+
+Test 2
+array(1) {
+  [0]=>
+  string(1) "1"
+}
+
+Warning: oci_fetch(): ORA-24374: %s in %simp_res_4.php on line %d
+bool(false)
+array(1) {
+  [0]=>
+  string(1) "2"
+}
+===DONE===
diff --git a/ext/oci8/tests/imp_res_5.phpt b/ext/oci8/tests/imp_res_5.phpt
new file mode 100644 (file)
index 0000000..564a7a3
--- /dev/null
@@ -0,0 +1,84 @@
+--TEST--
+Oracle Database 12c Implicit Result Sets: oci_fetch_all
+--SKIPIF--
+<?php 
+if (!extension_loaded('oci8')) die ("skip no oci8 extension"); 
+$target_dbs = array('oracledb' => true, 'timesten' => false);  // test runs on these DBs
+require(dirname(__FILE__).'/skipif.inc');
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
+if (!(isset($matches[0]) && $matches[1] >= 12)) {
+    die("skip expected output only valid when using Oracle Database 12c or greater");
+}
+preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
+if (!(isset($matches[0]) && $matches[0] >= 12)) { 
+    die("skip works only with Oracle 12c or greater version of Oracle client libraries");
+}
+?>
+--FILE--
+<?php
+
+require(dirname(__FILE__).'/connect.inc');
+
+// Initialization
+
+$stmtarray = array(
+    "create or replace procedure imp_res_5_proc as
+      c1 sys_refcursor;
+    begin
+        open c1 for select 1 from dual union select 2 from dual;
+        dbms_sql.return_result (c1);
+    end;"
+);
+
+oci8_test_sql_execute($c, $stmtarray);
+
+// Run Test
+
+echo "Test 1\n";
+$s = oci_parse($c, "begin imp_res_5_proc(); end;");
+oci_execute($s);
+oci_fetch_all($s,$res);  // This will fail with ORA-24374
+var_dump($res);
+
+echo "\nTest 2\n";
+$s = oci_parse($c, "begin imp_res_5_proc(); end;");
+oci_execute($s);
+$r = oci_fetch_row($s);
+var_dump($r);
+oci_fetch_all($s, $res);  // This will fail with ORA-24374
+var_dump($res);
+$r = oci_fetch_row($s);
+var_dump($r);
+
+// Clean up
+
+$stmtarray = array(
+    "drop procedure imp_res_5_proc",
+);
+
+oci8_test_sql_execute($c, $stmtarray);
+
+?>
+===DONE===
+<?php exit(0); ?>
+--EXPECTF--
+Test 1
+
+Warning: oci_fetch_all(): ORA-24374: %s in %simp_res_5.php on line %d
+array(0) {
+}
+
+Test 2
+array(1) {
+  [0]=>
+  string(1) "1"
+}
+
+Warning: oci_fetch_all(): ORA-24374: %s in %simp_res_5.php on line %d
+array(0) {
+}
+array(1) {
+  [0]=>
+  string(1) "2"
+}
+===DONE===
diff --git a/ext/oci8/tests/imp_res_6.phpt b/ext/oci8/tests/imp_res_6.phpt
new file mode 100644 (file)
index 0000000..f94efe7
--- /dev/null
@@ -0,0 +1,118 @@
+--TEST--
+Oracle Database 12c Implicit Result Sets: alternating oci_fetch_* calls
+--SKIPIF--
+<?php 
+if (!extension_loaded('oci8')) die ("skip no oci8 extension"); 
+$target_dbs = array('oracledb' => true, 'timesten' => false);  // test runs on these DBs
+require(dirname(__FILE__).'/skipif.inc');
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
+if (!(isset($matches[0]) && $matches[1] >= 12)) {
+    die("skip expected output only valid when using Oracle Database 12c or greater");
+}
+preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
+if (!(isset($matches[0]) && $matches[0] >= 12)) { 
+    die("skip works only with Oracle 12c or greater version of Oracle client libraries");
+}
+?>
+--FILE--
+<?php
+
+require(dirname(__FILE__).'/connect.inc');
+
+// Initialization
+
+$stmtarray = array(
+    "drop table imp_res_6_tab",
+    "create table imp_res_6_tab (c1 number, c2 varchar2(10))",
+    "insert into imp_res_6_tab values (1, 'a')",
+    "insert into imp_res_6_tab values (2, 'b')",
+    "insert into imp_res_6_tab values (3, 'c')",
+    "insert into imp_res_6_tab values (4, 'd')",
+    "insert into imp_res_6_tab values (5, 'e')",
+    "insert into imp_res_6_tab values (6, 'f')",
+
+    "create or replace procedure imp_res_6_proc as
+      c1 sys_refcursor;
+    begin
+      open c1 for select * from imp_res_6_tab order by 1;
+      dbms_sql.return_result(c1);
+    end;"
+);
+
+oci8_test_sql_execute($c, $stmtarray);
+
+// Run Test
+
+echo "Test 1\n";
+$s = oci_parse($c, "begin imp_res_6_proc(); end;");
+oci_execute($s);
+
+$row = oci_fetch_assoc($s);
+var_dump($row);
+$row = oci_fetch_row($s);
+var_dump($row);
+$row = oci_fetch_object($s);
+var_dump($row);
+$row = oci_fetch_array($s);
+var_dump($row);
+$row = oci_fetch_array($s, OCI_NUM);
+var_dump($row);
+$row = oci_fetch_array($s, OCI_ASSOC);
+var_dump($row);
+
+
+// Clean up
+
+$stmtarray = array(
+    "drop procedure imp_res_6_proc",
+    "drop table imp_res_6_tab",
+);
+
+oci8_test_sql_execute($c, $stmtarray);
+
+?>
+===DONE===
+<?php exit(0); ?>
+--EXPECTF--
+Test 1
+array(2) {
+  ["C1"]=>
+  string(1) "1"
+  ["C2"]=>
+  string(1) "a"
+}
+array(2) {
+  [0]=>
+  string(1) "2"
+  [1]=>
+  string(1) "b"
+}
+object(stdClass)#%d (2) {
+  ["C1"]=>
+  string(1) "3"
+  ["C2"]=>
+  string(1) "c"
+}
+array(4) {
+  [0]=>
+  string(1) "4"
+  ["C1"]=>
+  string(1) "4"
+  [1]=>
+  string(1) "d"
+  ["C2"]=>
+  string(1) "d"
+}
+array(2) {
+  [0]=>
+  string(1) "5"
+  [1]=>
+  string(1) "e"
+}
+array(2) {
+  ["C1"]=>
+  string(1) "6"
+  ["C2"]=>
+  string(1) "f"
+}
+===DONE===
diff --git a/ext/oci8/tests/imp_res_7.phpt b/ext/oci8/tests/imp_res_7.phpt
new file mode 100644 (file)
index 0000000..05ae5e6
--- /dev/null
@@ -0,0 +1,873 @@
+--TEST--
+Oracle Database 12c Implicit Result Sets: bigger data size
+--SKIPIF--
+<?php 
+if (!extension_loaded('oci8')) die ("skip no oci8 extension"); 
+$target_dbs = array('oracledb' => true, 'timesten' => false);  // test runs on these DBs
+require(dirname(__FILE__).'/skipif.inc');
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
+if (!(isset($matches[0]) && $matches[1] >= 12)) {
+    die("skip expected output only valid when using Oracle Database 12c or greater");
+}
+preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
+if (!(isset($matches[0]) && $matches[0] >= 12)) { 
+    die("skip works only with Oracle 12c or greater version of Oracle client libraries");
+}
+?>
+--FILE--
+<?php
+
+require(dirname(__FILE__).'/connect.inc');
+
+// Initialization
+
+$stmt =
+    "declare
+       c1 sys_refcursor;
+     begin
+       open c1 for select 1 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 2 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 3 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 4 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 5 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 6 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 7 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 8 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 9 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 10 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 11 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 12 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 13 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 14 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 15 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 16 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 17 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 18 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 19 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 20 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 21 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 22 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 23 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 24 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 25 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 26 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 27 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 28 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 29 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 30 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 31 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 32 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 33 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 34 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 35 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 36 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 37 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 38 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 39 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 40 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 41 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 42 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 43 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 44 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 45 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 46 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 47 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 48 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 49 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 50 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 51 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 52 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 53 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 54 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 55 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 56 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 57 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 58 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 59 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 60 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 61 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 62 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 63 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 64 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 65 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 66 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 67 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 68 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 69 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 70 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 71 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 72 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 73 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 74 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 75 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 76 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 77 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 78 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 79 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 80 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 81 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 82 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 83 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 84 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 85 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 86 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 87 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 88 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 89 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 90 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 91 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 92 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 93 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 94 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 95 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 96 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 97 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 98 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 99 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 100 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 101 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 102 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 103 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 104 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 105 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 106 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 107 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 108 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 109 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 110 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 111 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 112 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 113 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 114 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 115 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 116 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 117 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 118 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 119 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 120 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 121 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 122 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 123 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 124 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 125 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 126 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 127 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 128 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 129 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 130 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 131 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 132 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 133 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 134 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 135 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 136 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 137 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 138 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 139 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 140 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 141 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 142 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 143 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 144 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 145 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 146 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 147 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 148 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 149 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 150 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 151 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 152 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 153 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 154 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 155 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 156 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 157 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 158 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 159 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 160 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 161 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 162 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 163 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 164 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 165 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 166 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 167 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 168 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 169 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 170 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 171 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 172 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 173 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 174 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 175 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 176 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 177 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 178 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 179 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 180 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 181 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 182 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 183 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 184 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 185 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 186 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 187 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 188 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 189 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 190 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 191 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 192 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 193 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 194 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 195 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 196 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 197 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 198 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 199 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 200 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 201 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 202 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 203 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 204 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 205 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 206 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 207 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 208 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 209 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 210 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 211 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 212 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 213 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 214 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 215 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 216 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 217 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 218 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 219 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 220 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 221 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 222 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 223 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 224 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 225 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 226 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 227 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 228 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 229 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 230 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 231 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 232 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 233 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 234 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 235 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 236 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 237 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 238 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 239 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 240 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 241 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 242 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 243 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 244 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 245 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 246 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 247 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 248 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 249 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 250 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 251 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 252 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 253 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 254 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 255 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 256 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 257 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 258 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 259 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 260 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 261 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 262 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 263 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 264 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 265 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 266 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 267 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 268 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 269 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 270 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 271 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 272 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 273 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 274 from dual;
+       dbms_sql.return_result(c1);
+       open c1 for select 275 from dual;
+       dbms_sql.return_result(c1);
+     end;";
+
+// Run Test
+
+echo "Test 1\n";
+$s = oci_parse($c, $stmt);
+oci_execute($s);
+
+while (($row = oci_fetch_row($s)) != false) {
+    foreach ($row as $item) {
+        echo "  ".$item;
+    }
+    echo "\n";
+}
+
+?>
+===DONE===
+<?php exit(0); ?>
+--EXPECTF--
+Test 1
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+  10
+  11
+  12
+  13
+  14
+  15
+  16
+  17
+  18
+  19
+  20
+  21
+  22
+  23
+  24
+  25
+  26
+  27
+  28
+  29
+  30
+  31
+  32
+  33
+  34
+  35
+  36
+  37
+  38
+  39
+  40
+  41
+  42
+  43
+  44
+  45
+  46
+  47
+  48
+  49
+  50
+  51
+  52
+  53
+  54
+  55
+  56
+  57
+  58
+  59
+  60
+  61
+  62
+  63
+  64
+  65
+  66
+  67
+  68
+  69
+  70
+  71
+  72
+  73
+  74
+  75
+  76
+  77
+  78
+  79
+  80
+  81
+  82
+  83
+  84
+  85
+  86
+  87
+  88
+  89
+  90
+  91
+  92
+  93
+  94
+  95
+  96
+  97
+  98
+  99
+  100
+  101
+  102
+  103
+  104
+  105
+  106
+  107
+  108
+  109
+  110
+  111
+  112
+  113
+  114
+  115
+  116
+  117
+  118
+  119
+  120
+  121
+  122
+  123
+  124
+  125
+  126
+  127
+  128
+  129
+  130
+  131
+  132
+  133
+  134
+  135
+  136
+  137
+  138
+  139
+  140
+  141
+  142
+  143
+  144
+  145
+  146
+  147
+  148
+  149
+  150
+  151
+  152
+  153
+  154
+  155
+  156
+  157
+  158
+  159
+  160
+  161
+  162
+  163
+  164
+  165
+  166
+  167
+  168
+  169
+  170
+  171
+  172
+  173
+  174
+  175
+  176
+  177
+  178
+  179
+  180
+  181
+  182
+  183
+  184
+  185
+  186
+  187
+  188
+  189
+  190
+  191
+  192
+  193
+  194
+  195
+  196
+  197
+  198
+  199
+  200
+  201
+  202
+  203
+  204
+  205
+  206
+  207
+  208
+  209
+  210
+  211
+  212
+  213
+  214
+  215
+  216
+  217
+  218
+  219
+  220
+  221
+  222
+  223
+  224
+  225
+  226
+  227
+  228
+  229
+  230
+  231
+  232
+  233
+  234
+  235
+  236
+  237
+  238
+  239
+  240
+  241
+  242
+  243
+  244
+  245
+  246
+  247
+  248
+  249
+  250
+  251
+  252
+  253
+  254
+  255
+  256
+  257
+  258
+  259
+  260
+  261
+  262
+  263
+  264
+  265
+  266
+  267
+  268
+  269
+  270
+  271
+  272
+  273
+  274
+  275
+===DONE===
diff --git a/ext/oci8/tests/imp_res_call_error.phpt b/ext/oci8/tests/imp_res_call_error.phpt
new file mode 100644 (file)
index 0000000..8b0fa78
--- /dev/null
@@ -0,0 +1,61 @@
+--TEST--
+Oracle Database 12c Implicit Result Sets: using SQL 'CALL'
+--SKIPIF--
+<?php 
+if (!extension_loaded('oci8')) die ("skip no oci8 extension"); 
+$target_dbs = array('oracledb' => true, 'timesten' => false);  // test runs on these DBs
+require(dirname(__FILE__).'/skipif.inc');
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
+if (!(isset($matches[0]) && $matches[1] >= 12)) {
+    die("skip expected output only valid when using Oracle Database 12c or greater");
+}
+preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
+if (!(isset($matches[0]) && $matches[0] >= 12)) { 
+    die("skip works only with Oracle 12c or greater version of Oracle client libraries");
+}
+?>
+--FILE--
+<?php
+
+require(dirname(__FILE__).'/connect.inc');
+
+// Initialization
+
+$stmtarray = array(
+    "create or replace procedure imp_res_call_err_proc as
+      c1 sys_refcursor;
+    begin
+      open c1 for select * from dual;
+      dbms_sql.return_result(c1);
+      open c1 for select * from dual;
+      dbms_sql.return_result (c1);
+    end;");
+
+oci8_test_sql_execute($c, $stmtarray);
+
+// Run Test
+
+echo "Test 1\n";
+
+$s = oci_parse($c, "call imp_res_call_err_proc()");
+oci_execute($s);
+
+// Clean up
+
+$stmtarray = array(
+    "drop procedure imp_res_call_err_proc"
+);
+
+oci8_test_sql_execute($c, $stmtarray);
+
+?>
+===DONE===
+<?php exit(0); ?>
+--EXPECTF--
+Test 1
+
+Warning: oci_execute(): ORA-29478: %s
+ORA-06512: at "SYS.DBMS_SQL", line %d
+ORA-06512: at "SYS.DBMS_SQL", line %d
+ORA-06512: at "SYSTEM.IMP_RES_CALL_ERR_PROC", line %d in %simp_res_call_error.php on line %d
+===DONE===
diff --git a/ext/oci8/tests/imp_res_cancel.phpt b/ext/oci8/tests/imp_res_cancel.phpt
new file mode 100644 (file)
index 0000000..663d630
--- /dev/null
@@ -0,0 +1,68 @@
+--TEST--
+Oracle Database 12c Implicit Result Sets: oci_cancel
+--SKIPIF--
+<?php 
+if (!extension_loaded('oci8')) die ("skip no oci8 extension"); 
+$target_dbs = array('oracledb' => true, 'timesten' => false);  // test runs on these DBs
+require(dirname(__FILE__).'/skipif.inc');
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
+if (!(isset($matches[0]) && $matches[1] >= 12)) {
+    die("skip expected output only valid when using Oracle Database 12c or greater");
+}
+preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
+if (!(isset($matches[0]) && $matches[0] >= 12)) { 
+    die("skip works only with Oracle 12c or greater version of Oracle client libraries");
+}
+?>
+--FILE--
+<?php
+
+require(dirname(__FILE__).'/connect.inc');
+
+$stmtarray = array(
+    "create or replace procedure imp_res_cancel_proc as
+      c1 sys_refcursor;
+      c2 sys_refcursor;
+    begin
+      open c1 for select 1 from dual union all select 2 from dual;
+      dbms_sql.return_result(c1);
+      open c2 for select 3 from dual;
+      dbms_sql.return_result (c2);
+    end;"
+);
+
+oci8_test_sql_execute($c, $stmtarray);
+
+// Run Test
+
+echo "Test 1\n";
+$s = oci_parse($c, "begin imp_res_cancel_proc(); end;");
+oci_execute($s);
+while (($row = oci_fetch_array($s, OCI_ASSOC+OCI_RETURN_NULLS)) != false) {
+    foreach ($row as $item) {
+        echo "  ".$item;
+    }
+    echo "\n";
+    var_dump(oci_cancel($s));
+}
+
+// Clean up
+
+$stmtarray = array(
+    "drop procedure imp_res_cancel_proc"
+);
+
+oci8_test_sql_execute($c, $stmtarray);
+
+?>
+===DONE===
+<?php exit(0); ?>
+--EXPECTF--
+Test 1
+  1
+bool(true)
+  2
+bool(true)
+  3
+bool(true)
+===DONE===
diff --git a/ext/oci8/tests/imp_res_close.phpt b/ext/oci8/tests/imp_res_close.phpt
new file mode 100644 (file)
index 0000000..01ac2c7
--- /dev/null
@@ -0,0 +1,69 @@
+--TEST--
+Oracle Database 12c Implicit Result Sets: oci_free_statement #1
+--SKIPIF--
+<?php 
+if (!extension_loaded('oci8')) die ("skip no oci8 extension"); 
+$target_dbs = array('oracledb' => true, 'timesten' => false);  // test runs on these DBs
+require(dirname(__FILE__).'/skipif.inc');
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
+if (!(isset($matches[0]) && $matches[1] >= 12)) {
+    die("skip expected output only valid when using Oracle Database 12c or greater");
+}
+preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
+if (!(isset($matches[0]) && $matches[0] >= 12)) { 
+    die("skip works only with Oracle 12c or greater version of Oracle client libraries");
+}
+?>
+--FILE--
+<?php
+
+require(dirname(__FILE__).'/connect.inc');
+
+// Initialization
+
+$stmtarray = array(
+    "create or replace procedure imp_res_close_proc as
+      c1 sys_refcursor;
+    begin
+      open c1 for select 1 from dual union all select 2 from dual order by 1;
+      dbms_sql.return_result(c1);
+      open c1 for select 3 from dual union all select 4 from dual order by 1;
+      dbms_sql.return_result(c1);
+      open c1 for select 5 from dual union all select 6 from dual order by 1;
+      dbms_sql.return_result(c1);
+    end;"
+);
+
+oci8_test_sql_execute($c, $stmtarray);
+
+// Run Test
+
+echo "Test 1\n";
+$s = oci_parse($c, "begin imp_res_close_proc(); end;");
+oci_execute($s);
+while (($row = oci_fetch_array($s, OCI_ASSOC+OCI_RETURN_NULLS)) != false) {
+    foreach ($row as $item) {
+        echo "  ".$item;
+    }
+    echo "\n";
+    oci_free_statement($s);  // Free the implicit result handle
+}
+
+// Clean up
+
+$stmtarray = array(
+    "drop procedure imp_res_close_proc"
+);
+
+oci8_test_sql_execute($c, $stmtarray);
+
+?>
+===DONE===
+<?php exit(0); ?>
+--EXPECTF--
+Test 1
+  1
+  2
+
+Warning: oci_fetch_array(): %d is not a valid oci8 statement resource in %simp_res_close.php on line %d
+===DONE===
diff --git a/ext/oci8/tests/imp_res_cursor.phpt b/ext/oci8/tests/imp_res_cursor.phpt
new file mode 100644 (file)
index 0000000..cac0a5d
--- /dev/null
@@ -0,0 +1,99 @@
+--TEST--
+Oracle Database 12c Implicit Result Sets: nested cursor
+--SKIPIF--
+<?php 
+if (!extension_loaded('oci8')) die ("skip no oci8 extension"); 
+$target_dbs = array('oracledb' => true, 'timesten' => false);  // test runs on these DBs
+require(dirname(__FILE__).'/skipif.inc');
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
+if (!(isset($matches[0]) && $matches[1] >= 12)) {
+    die("skip expected output only valid when using Oracle Database 12c or greater");
+}
+preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
+if (!(isset($matches[0]) && $matches[0] >= 12)) { 
+    die("skip works only with Oracle 12c or greater version of Oracle client libraries");
+}
+?>
+--FILE--
+<?php
+
+require(dirname(__FILE__).'/connect.inc');
+
+// Initialization
+
+$stmtarray = array(
+    "drop table imp_res_cursor_tab_1",
+    "create table imp_res_cursor_tab_1 (c1 number, c2 varchar2(10))",
+    "insert into imp_res_cursor_tab_1 values (1, 'abcde')",
+    "insert into imp_res_cursor_tab_1 values (2, 'fghij')",
+    "insert into imp_res_cursor_tab_1 values (3, 'klmno')",
+
+    "drop table imp_res_cursor_tab_2",
+    "create table imp_res_cursor_tab_2 (c3 varchar2(1))",
+    "insert into imp_res_cursor_tab_2 values ('t')",
+    "insert into imp_res_cursor_tab_2 values ('u')",
+    "insert into imp_res_cursor_tab_2 values ('v')",
+
+    "create or replace procedure imp_res_cursor_proc as
+      c1 sys_refcursor;
+    begin
+      open c1 for select * from dual;
+      dbms_sql.return_result (c1);
+
+      open c1 for select cursor(select c1, c2 from imp_res_cursor_tab_1 order by 1) as curs from dual;
+      dbms_sql.return_result(c1);
+
+      open c1 for select * from imp_res_cursor_tab_2 where rownum < 3 order by 1;
+      dbms_sql.return_result(c1);
+    end;"
+);
+
+oci8_test_sql_execute($c, $stmtarray);
+
+function do_fetch($s)
+{
+    while (($row = oci_fetch_assoc($s)) != false) {
+        foreach ($row as $item) {
+            if (is_resource($item)) {  // Nested cursor
+                oci_execute($item);
+                do_fetch($item);
+            } else {
+                echo "  ".$item;
+            }
+        }
+        echo "\n";
+    }
+}
+
+// Run Test
+
+echo "Test 1\n";
+
+$s = oci_parse($c, "begin imp_res_cursor_proc(); end;");
+oci_execute($s);
+
+do_fetch($s);
+
+// Clean up
+
+$stmtarray = array(
+    "drop procedure imp_res_cursor_proc",
+    "drop table imp_res_cursor_tab_1",
+    "drop table imp_res_cursor_tab_2"
+);
+
+oci8_test_sql_execute($c, $stmtarray);
+
+?>
+===DONE===
+<?php exit(0); ?>
+--EXPECTF--
+Test 1
+  X
+  1  abcde
+  2  fghij
+  3  klmno
+
+  t
+  u
+===DONE===
diff --git a/ext/oci8/tests/imp_res_dbmsoutput.phpt b/ext/oci8/tests/imp_res_dbmsoutput.phpt
new file mode 100644 (file)
index 0000000..8c9808d
--- /dev/null
@@ -0,0 +1,136 @@
+--TEST--
+Oracle Database 12c Implicit Result Sets: interleaved with DBMS_OUTPUT
+--SKIPIF--
+<?php 
+if (!extension_loaded('oci8')) die ("skip no oci8 extension"); 
+$target_dbs = array('oracledb' => true, 'timesten' => false);  // test runs on these DBs
+require(dirname(__FILE__).'/skipif.inc');
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
+if (!(isset($matches[0]) && $matches[1] >= 12)) {
+    die("skip expected output only valid when using Oracle Database 12c or greater");
+}
+preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
+if (!(isset($matches[0]) && $matches[0] >= 12)) { 
+    die("skip works only with Oracle 12c or greater version of Oracle client libraries");
+}
+?>
+--FILE--
+<?php
+
+require(dirname(__FILE__).'/connect.inc');
+
+// Initialization
+
+$stmtarray = array(
+    "drop table imp_res_dbmsoutput_tab_1",
+    "create table imp_res_dbmsoutput_tab_1 (c1 number, c2 varchar2(10))",
+    "insert into imp_res_dbmsoutput_tab_1 values (1, 'abcde')",
+    "insert into imp_res_dbmsoutput_tab_1 values (2, 'fghij')",
+    "insert into imp_res_dbmsoutput_tab_1 values (3, 'klmno')",
+
+    "drop table imp_res_dbmsoutput_tab_2",
+    "create table imp_res_dbmsoutput_tab_2 (c3 varchar2(1))",
+    "insert into imp_res_dbmsoutput_tab_2 values ('t')",
+    "insert into imp_res_dbmsoutput_tab_2 values ('u')",
+    "insert into imp_res_dbmsoutput_tab_2 values ('v')",
+
+    "create or replace procedure imp_res_dbmsoutput_proc as
+      c1 sys_refcursor;
+    begin
+      dbms_output.put_line('dbms_output Line 1');
+      open c1 for select * from imp_res_dbmsoutput_tab_1 order by 1;
+      dbms_sql.return_result(c1);
+      dbms_output.put_line('dbms_output Line 2');
+      open c1 for select * from imp_res_dbmsoutput_tab_2 order by 1;
+      dbms_sql.return_result(c1);
+    end;"
+);
+
+oci8_test_sql_execute($c, $stmtarray);
+
+function setserveroutputon($c)
+{
+    $s = oci_parse($c, "begin dbms_output.enable(null); end;");
+    oci_execute($s);
+}
+
+function getdbmsoutput_do($c)
+{
+    $s = oci_parse($c, "begin dbms_output.get_line(:ln, :st); end;");
+    oci_bind_by_name($s, ":ln", $ln, 100);
+    oci_bind_by_name($s, ":st", $st, -1, SQLT_INT);
+    $res = false;
+    while (($succ = oci_execute($s)) && !$st) {
+        $res[] = $ln;  // append each line to the array
+    }
+    return $res;
+}
+
+setserveroutputon($c);
+
+// Run Test
+
+echo "Test 1\n";
+$s = oci_parse($c, "begin imp_res_dbmsoutput_proc(); end;");
+oci_execute($s);
+var_dump(getdbmsoutput_do($c));
+while (($row = oci_fetch_array($s, OCI_ASSOC+OCI_RETURN_NULLS)) != false) {
+    foreach ($row as $item) {
+        echo "  ".$item;
+    }
+    echo "\n";
+}
+
+echo "\nTest 2\n";
+$s = oci_parse($c, "begin imp_res_dbmsoutput_proc(); end;");
+oci_execute($s);
+while (($row = oci_fetch_array($s, OCI_ASSOC+OCI_RETURN_NULLS)) != false) {
+    foreach ($row as $item) {
+        echo "  ".$item;
+    }
+    echo "\n";
+}
+var_dump(getdbmsoutput_do($c));
+
+// Clean up
+
+$stmtarray = array(
+    "drop procedure imp_res_dbmsoutput_proc",
+    "drop table imp_res_dbmsoutput_tab_1",
+    "drop table imp_res_dbmsoutput_tab_2"
+);
+
+oci8_test_sql_execute($c, $stmtarray);
+
+?>
+===DONE===
+<?php exit(0); ?>
+--EXPECTF--
+Test 1
+array(2) {
+  [0]=>
+  string(18) "dbms_output Line 1"
+  [1]=>
+  string(18) "dbms_output Line 2"
+}
+  1  abcde
+  2  fghij
+  3  klmno
+  t
+  u
+  v
+
+Test 2
+  1  abcde
+  2  fghij
+  3  klmno
+  t
+  u
+  v
+array(2) {
+  [0]=>
+  string(18) "dbms_output Line 1"
+  [1]=>
+  string(18) "dbms_output Line 2"
+}
+===DONE===
diff --git a/ext/oci8/tests/imp_res_field.phpt b/ext/oci8/tests/imp_res_field.phpt
new file mode 100644 (file)
index 0000000..54b8295
--- /dev/null
@@ -0,0 +1,227 @@
+--TEST--
+Oracle Database 12c Implicit Result Sets: field tests
+--SKIPIF--
+<?php 
+if (!extension_loaded('oci8')) die ("skip no oci8 extension"); 
+$target_dbs = array('oracledb' => true, 'timesten' => false);  // test runs on these DBs
+require(dirname(__FILE__).'/skipif.inc');
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
+if (!(isset($matches[0]) && $matches[1] >= 12)) {
+    die("skip expected output only valid when using Oracle Database 12c or greater");
+}
+preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
+if (!(isset($matches[0]) && $matches[0] >= 12)) { 
+    die("skip works only with Oracle 12c or greater version of Oracle client libraries");
+}
+?>
+--FILE--
+<?php
+
+require(dirname(__FILE__).'/connect.inc');
+
+// Initialization
+
+$stmtarray = array(
+    "drop table imp_res_field_tab_1",
+    "create table imp_res_field_tab_1 (c1_number number, c2_varchar210 varchar2(10))",
+    "insert into imp_res_field_tab_1 values (1111, 'abcde')",
+
+    "drop table imp_res_field_tab_2",
+    "create table imp_res_field_tab_2 (c3_varchar21 varchar2(4))",
+    "insert into imp_res_field_tab_2 values ('tttt')",
+
+    "drop table imp_res_field_tab_3",
+    "create table imp_res_field_tab_3 (c4_number52 number(5,2))",
+    "insert into imp_res_field_tab_3 values (33)",
+    "insert into imp_res_field_tab_3 values (NULL)",
+
+    "create or replace procedure imp_res_field_proc as
+      c1 sys_refcursor;
+    begin
+      open c1 for select * from imp_res_field_tab_1 order by 1;
+      dbms_sql.return_result(c1);
+
+      open c1 for select * from imp_res_field_tab_2 order by 1;
+      dbms_sql.return_result(c1);
+
+      open c1 for select * from imp_res_field_tab_3 order by 1;
+      dbms_sql.return_result(c1);
+    end;"
+);
+
+oci8_test_sql_execute($c, $stmtarray);
+
+function print_fields($s)
+{
+    echo "num fields : " . oci_num_fields($s) . "\n";
+    for ($i = 1; $i <= oci_num_fields($s); $i++) {
+        $is_null = oci_field_is_null($s, $i) ? "T" : "F";
+        $name = oci_field_name($s, $i);
+        $precision = oci_field_precision($s, $i);
+        $scale = oci_field_scale($s, $i);
+        $size = oci_field_size($s, $i);
+        $typeraw = oci_field_type_raw($s, $i);
+        $type = oci_field_type($s, $i);
+        echo "$name\t: is_null $is_null, precision $precision, scale $scale, size $size, typeraw $typeraw, type $type\n";
+    }
+}
+
+// Run Test
+
+echo "Test 1 - can't get IRS fields from parent\n";
+$s = oci_parse($c, "begin imp_res_field_proc(); end;");
+oci_execute($s);
+print_fields($s);
+
+echo "\nTest 2 - can't get IRS fields from parent when fetching\n";
+$s = oci_parse($c, "begin imp_res_field_proc(); end;");
+oci_execute($s);
+while (($r = oci_fetch_row($s))) {
+    var_dump($r);
+    print_fields($s);
+}
+
+echo "\nTest 3 - get IRS fields\n";
+$s = oci_parse($c, "begin imp_res_field_proc(); end;");
+oci_execute($s);
+while (($s1 = oci_get_implicit_resultset($s))) {
+    print_fields($s1);
+}
+
+echo "\nTest 4 - get IRS fields before fetching rows\n";
+$s = oci_parse($c, "begin imp_res_field_proc(); end;");
+oci_execute($s);
+$i = 0;
+while (($s1 = oci_get_implicit_resultset($s))) {
+    echo "===> Result set ".++$i."\n";
+    print_fields($s1);
+    while (($r = oci_fetch_row($s1)) !== false) {
+        var_dump($r);
+    }
+}
+
+echo "\nTest 5 - get IRS fields when fetching rows\n";
+$s = oci_parse($c, "begin imp_res_field_proc(); end;");
+oci_execute($s);
+$i = 0;
+while (($s1 = oci_get_implicit_resultset($s))) {
+    echo "===> Result set ".++$i."\n";
+    while (($r = oci_fetch_row($s1)) !== false) {
+        var_dump($r);
+        print_fields($s1);
+    }
+}
+
+// Clean up
+
+$stmtarray = array(
+    "drop procedure imp_res_field_proc",
+    "drop table imp_res_field_tab_1",
+    "drop table imp_res_field_tab_2",
+    "drop table imp_res_field_tab_3"
+);
+
+oci8_test_sql_execute($c, $stmtarray);
+
+?>
+===DONE===
+<?php exit(0); ?>
+--EXPECTF--
+Test 1 - can't get IRS fields from parent
+num fields : 0
+
+Test 2 - can't get IRS fields from parent when fetching
+array(2) {
+  [0]=>
+  string(4) "1111"
+  [1]=>
+  string(5) "abcde"
+}
+num fields : 0
+array(1) {
+  [0]=>
+  string(4) "tttt"
+}
+num fields : 0
+array(1) {
+  [0]=>
+  string(2) "33"
+}
+num fields : 0
+array(1) {
+  [0]=>
+  NULL
+}
+num fields : 0
+
+Test 3 - get IRS fields
+num fields : 2
+C1_NUMBER      : is_null F, precision 0, scale -127, size 22, typeraw 2, type NUMBER
+C2_VARCHAR210  : is_null F, precision 0, scale 0, size 10, typeraw 1, type VARCHAR2
+num fields : 1
+C3_VARCHAR21   : is_null F, precision 0, scale 0, size 4, typeraw 1, type VARCHAR2
+num fields : 1
+C4_NUMBER52    : is_null F, precision 5, scale 2, size 22, typeraw 2, type NUMBER
+
+Test 4 - get IRS fields before fetching rows
+===> Result set 1
+num fields : 2
+C1_NUMBER      : is_null F, precision 0, scale -127, size 22, typeraw 2, type NUMBER
+C2_VARCHAR210  : is_null F, precision 0, scale 0, size 10, typeraw 1, type VARCHAR2
+array(2) {
+  [0]=>
+  string(4) "1111"
+  [1]=>
+  string(5) "abcde"
+}
+===> Result set 2
+num fields : 1
+C3_VARCHAR21   : is_null F, precision 0, scale 0, size 4, typeraw 1, type VARCHAR2
+array(1) {
+  [0]=>
+  string(4) "tttt"
+}
+===> Result set 3
+num fields : 1
+C4_NUMBER52    : is_null F, precision 5, scale 2, size 22, typeraw 2, type NUMBER
+array(1) {
+  [0]=>
+  string(2) "33"
+}
+array(1) {
+  [0]=>
+  NULL
+}
+
+Test 5 - get IRS fields when fetching rows
+===> Result set 1
+array(2) {
+  [0]=>
+  string(4) "1111"
+  [1]=>
+  string(5) "abcde"
+}
+num fields : 2
+C1_NUMBER      : is_null F, precision 0, scale -127, size 22, typeraw 2, type NUMBER
+C2_VARCHAR210  : is_null F, precision 0, scale 0, size 10, typeraw 1, type VARCHAR2
+===> Result set 2
+array(1) {
+  [0]=>
+  string(4) "tttt"
+}
+num fields : 1
+C3_VARCHAR21   : is_null F, precision 0, scale 0, size 4, typeraw 1, type VARCHAR2
+===> Result set 3
+array(1) {
+  [0]=>
+  string(2) "33"
+}
+num fields : 1
+C4_NUMBER52    : is_null F, precision 5, scale 2, size 22, typeraw 2, type NUMBER
+array(1) {
+  [0]=>
+  NULL
+}
+num fields : 1
+C4_NUMBER52    : is_null T, precision 5, scale 2, size 22, typeraw 2, type NUMBER
+===DONE===
diff --git a/ext/oci8/tests/imp_res_func_error.phpt b/ext/oci8/tests/imp_res_func_error.phpt
new file mode 100644 (file)
index 0000000..73c0557
--- /dev/null
@@ -0,0 +1,67 @@
+--TEST--
+Oracle Database 12c Implicit Result Sets: test with a PL/SQL function
+--SKIPIF--
+<?php 
+if (!extension_loaded('oci8')) die ("skip no oci8 extension"); 
+$target_dbs = array('oracledb' => true, 'timesten' => false);  // test runs on these DBs
+require(dirname(__FILE__).'/skipif.inc');
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
+if (!(isset($matches[0]) && $matches[1] >= 12)) {
+    die("skip expected output only valid when using Oracle Database 12c or greater");
+}
+preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
+if (!(isset($matches[0]) && $matches[0] >= 12)) { 
+    die("skip works only with Oracle 12c or greater version of Oracle client libraries");
+}
+?>
+--FILE--
+<?php
+
+require(dirname(__FILE__).'/connect.inc');
+
+// Initialization
+
+$stmtarray = array(
+    "create or replace function imp_res_func_error return number as
+      c1 sys_refcursor;
+    begin
+      open c1 for select * from dual;
+      dbms_sql.return_result(c1);
+      return 1234;
+    end;"
+);
+
+oci8_test_sql_execute($c, $stmtarray);
+
+// Run Test
+
+echo "Test 1\n";
+$s = oci_parse($c, "select imp_res_func_error from dual");
+$r = oci_execute($s);   // This will fail with ORA-29478 in Oracle 12.1
+if ($r) {
+    while (($row = oci_fetch_array($s, OCI_ASSOC+OCI_RETURN_NULLS)) != false) {
+        foreach ($row as $item) {
+            echo "  ".$item;
+        }
+        echo "\n";
+    }
+}
+// Clean up
+
+$stmtarray = array(
+    "drop function imp_res_func_error",
+);
+
+oci8_test_sql_execute($c, $stmtarray);
+
+?>
+===DONE===
+<?php exit(0); ?>
+--EXPECTF--
+Test 1
+
+Warning: oci_execute(): ORA-29478: %s
+ORA-06512: %s
+ORA-06512: %s
+ORA-06512: %s
+===DONE===
diff --git a/ext/oci8/tests/imp_res_get_1.phpt b/ext/oci8/tests/imp_res_get_1.phpt
new file mode 100644 (file)
index 0000000..665f773
--- /dev/null
@@ -0,0 +1,109 @@
+--TEST--
+Oracle Database 12c Implicit Result Sets: oci_get_implicit_resultset: basic test
+--SKIPIF--
+<?php 
+if (!extension_loaded('oci8')) die ("skip no oci8 extension"); 
+$target_dbs = array('oracledb' => true, 'timesten' => false);  // test runs on these DBs
+require(dirname(__FILE__).'/skipif.inc');
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
+if (!(isset($matches[0]) && $matches[1] >= 12)) {
+    die("skip expected output only valid when using Oracle Database 12c or greater");
+}
+preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
+if (!(isset($matches[0]) && $matches[0] >= 12)) { 
+    die("skip works only with Oracle 12c or greater version of Oracle client libraries");
+}
+?>
+--FILE--
+<?php
+
+require(dirname(__FILE__).'/connect.inc');
+
+// Initialization
+
+$stmtarray = array(
+    "drop table imp_res_get_1_tab_1",
+    "create table imp_res_get_1_tab_1 (c1 number, c2 varchar2(10))",
+    "insert into imp_res_get_1_tab_1 values (1, 'abcde')",
+    "insert into imp_res_get_1_tab_1 values (2, 'fghij')",
+    "insert into imp_res_get_1_tab_1 values (3, 'klmno')",
+
+    "drop table imp_res_get_1_tab_2",
+    "create table imp_res_get_1_tab_2 (c3 varchar2(1))",
+    "insert into imp_res_get_1_tab_2 values ('t')",
+    "insert into imp_res_get_1_tab_2 values ('u')",
+    "insert into imp_res_get_1_tab_2 values ('v')",
+
+    "create or replace procedure imp_res_get_1_proc as
+      c1 sys_refcursor;
+    begin
+      open c1 for select * from imp_res_get_1_tab_1 order by 1;
+      dbms_sql.return_result(c1);
+
+      open c1 for select * from imp_res_get_1_tab_2 where rownum < 3 order by 1;
+      dbms_sql.return_result(c1);
+
+      open c1 for select * from dual;
+      dbms_sql.return_result (c1);
+    end;"
+);
+
+oci8_test_sql_execute($c, $stmtarray);
+
+// Run Test
+
+echo "Test 1\n";
+$s = oci_parse($c, "begin imp_res_get_1_proc(); end;");
+oci_execute($s);
+while (($s1 = oci_get_implicit_resultset($s))) {
+    while (($row = oci_fetch_array($s1, OCI_ASSOC+OCI_RETURN_NULLS)) != false) {
+        foreach ($row as $item) {
+            echo "  ".$item;
+        }
+        echo "\n";
+    }
+}
+
+echo "\nTest 2 - with execute\n";
+$s = oci_parse($c, "begin imp_res_get_1_proc(); end;");
+oci_execute($s);
+while (($s1 = oci_get_implicit_resultset($s))) {
+    oci_execute($s1);  // no op
+    while (($row = oci_fetch_array($s1, OCI_ASSOC+OCI_RETURN_NULLS)) != false) {
+        foreach ($row as $item) {
+            echo "  ".$item;
+        }
+        echo "\n";
+    }
+}
+
+// Clean up
+
+$stmtarray = array(
+    "drop procedure imp_res_get_1_proc",
+    "drop table imp_res_get_1_tab_1",
+    "drop table imp_res_get_1_tab_2"
+);
+
+oci8_test_sql_execute($c, $stmtarray);
+
+?>
+===DONE===
+<?php exit(0); ?>
+--EXPECTF--
+Test 1
+  1  abcde
+  2  fghij
+  3  klmno
+  t
+  u
+  X
+
+Test 2 - with execute
+  1  abcde
+  2  fghij
+  3  klmno
+  t
+  u
+  X
+===DONE===
diff --git a/ext/oci8/tests/imp_res_get_2.phpt b/ext/oci8/tests/imp_res_get_2.phpt
new file mode 100644 (file)
index 0000000..b20b8dd
--- /dev/null
@@ -0,0 +1,107 @@
+--TEST--
+Oracle Database 12c Implicit Result Sets: oci_get_implicit_resultset: similar to imp_res_get_1 but with unrolled loop
+--SKIPIF--
+<?php 
+if (!extension_loaded('oci8')) die ("skip no oci8 extension"); 
+$target_dbs = array('oracledb' => true, 'timesten' => false);  // test runs on these DBs
+require(dirname(__FILE__).'/skipif.inc');
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
+if (!(isset($matches[0]) && $matches[1] >= 12)) {
+    die("skip expected output only valid when using Oracle Database 12c or greater");
+}
+preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
+if (!(isset($matches[0]) && $matches[0] >= 12)) { 
+    die("skip works only with Oracle 12c or greater version of Oracle client libraries");
+}
+?>
+--FILE--
+<?php
+
+require(dirname(__FILE__).'/connect.inc');
+
+// Initialization
+
+$stmtarray = array(
+    "drop table imp_res_get_2_tab_1",
+    "create table imp_res_get_2_tab_1 (c1 number, c2 varchar2(10))",
+    "insert into imp_res_get_2_tab_1 values (1, 'abcde')",
+    "insert into imp_res_get_2_tab_1 values (2, 'fghij')",
+    "insert into imp_res_get_2_tab_1 values (3, 'klmno')",
+
+    "drop table imp_res_get_2_tab_2",
+    "create table imp_res_get_2_tab_2 (c3 varchar2(1))",
+    "insert into imp_res_get_2_tab_2 values ('t')",
+    "insert into imp_res_get_2_tab_2 values ('u')",
+    "insert into imp_res_get_2_tab_2 values ('v')",
+
+    "create or replace procedure imp_res_get_2_proc as
+      c1 sys_refcursor;
+    begin
+      open c1 for select * from imp_res_get_2_tab_1 order by 1;
+      dbms_sql.return_result(c1);
+
+      open c1 for select * from imp_res_get_2_tab_2 where rownum < 3 order by 1;
+      dbms_sql.return_result(c1);
+
+      open c1 for select * from dual;
+      dbms_sql.return_result (c1);
+    end;"
+);
+
+oci8_test_sql_execute($c, $stmtarray);
+
+// Run Test
+
+echo "Test 1\n";
+
+$s = oci_parse($c, "begin imp_res_get_2_proc(); end;");
+oci_execute($s);
+
+$s1 = oci_get_implicit_resultset($s);
+while (($row = oci_fetch_array($s1, OCI_ASSOC+OCI_RETURN_NULLS))) {
+    foreach ($row as $item) {
+        echo "  ".$item;
+    }
+    echo "\n";
+}
+
+$s2 = oci_get_implicit_resultset($s);
+while (($row = oci_fetch_array($s2, OCI_ASSOC+OCI_RETURN_NULLS))) {
+    foreach ($row as $item) {
+        echo "  ".$item;
+    }
+    echo "\n";
+}
+oci_free_statement($s2);
+
+$s3 = oci_get_implicit_resultset($s);
+while (($row = oci_fetch_array($s3, OCI_ASSOC+OCI_RETURN_NULLS))) {
+    foreach ($row as $item) {
+        echo "  ".$item;
+    }
+    echo "\n";
+}
+oci_free_statement($s3);
+
+// Clean up
+
+$stmtarray = array(
+    "drop procedure imp_res_get_2_proc",
+    "drop table imp_res_get_2_tab_1",
+    "drop table imp_res_get_2_tab_2"
+);
+
+oci8_test_sql_execute($c, $stmtarray);
+
+?>
+===DONE===
+<?php exit(0); ?>
+--EXPECTF--
+Test 1
+  1  abcde
+  2  fghij
+  3  klmno
+  t
+  u
+  X
+===DONE===
diff --git a/ext/oci8/tests/imp_res_get_3.phpt b/ext/oci8/tests/imp_res_get_3.phpt
new file mode 100644 (file)
index 0000000..15b2efa
--- /dev/null
@@ -0,0 +1,267 @@
+--TEST--
+Oracle Database 12c Implicit Result Sets: oci_get_implicit_resultset: basic test 3
+--SKIPIF--
+<?php 
+if (!extension_loaded('oci8')) die ("skip no oci8 extension"); 
+$target_dbs = array('oracledb' => true, 'timesten' => false);  // test runs on these DBs
+require(dirname(__FILE__).'/skipif.inc');
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
+if (!(isset($matches[0]) && $matches[1] >= 12)) {
+    die("skip expected output only valid when using Oracle Database 12c or greater");
+}
+preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
+if (!(isset($matches[0]) && $matches[0] >= 12)) { 
+    die("skip works only with Oracle 12c or greater version of Oracle client libraries");
+}
+?>
+--INI--
+oci8.statement_cache_size = 0
+--FILE--
+<?php
+
+require(dirname(__FILE__).'/connect.inc');
+
+// Initialization
+
+$stmtarray = array(
+    "drop table imp_res_get_3_tab_1",
+    "create table imp_res_get_3_tab_1 (c1 number, c2 varchar2(10))",
+    "insert into imp_res_get_3_tab_1 values (1, 'abcde')",
+    "insert into imp_res_get_3_tab_1 values (2, 'fghij')",
+    "insert into imp_res_get_3_tab_1 values (3, 'klmno')",
+
+    "drop table imp_res_get_3_tab_2",
+    "create table imp_res_get_3_tab_2 (c3 varchar2(1))",
+    "insert into imp_res_get_3_tab_2 values ('t')",
+    "insert into imp_res_get_3_tab_2 values ('u')",
+    "insert into imp_res_get_3_tab_2 values ('v')",
+
+    "create or replace procedure imp_res_get_3_proc as
+      c1 sys_refcursor;
+      i pls_integer;
+    begin
+      for i in 1..30 loop  -- if this value is too big for Oracle's open_cursors, calling imp_res_get_3_proc() can fail with ORA-1000
+        open c1 for select * from imp_res_get_3_tab_1 order by 1;
+        dbms_sql.return_result(c1);
+        open c1 for select * from imp_res_get_3_tab_2 where rownum < 3 order by 1;
+        dbms_sql.return_result(c1);
+        open c1 for select * from dual;
+        dbms_sql.return_result (c1);
+      end loop;
+    end;"
+);
+
+oci8_test_sql_execute($c, $stmtarray);
+
+// Run Test
+
+echo "Test 1\n";
+
+$s = oci_parse($c, "begin imp_res_get_3_proc(); end;");
+oci_execute($s);
+
+while (($s1 = oci_get_implicit_resultset($s))) {
+    while (($row = oci_fetch_array($s1, OCI_ASSOC+OCI_RETURN_NULLS)) != false) {
+        foreach ($row as $item) {
+            echo "  ".$item;
+        }
+        echo "\n";
+    }
+}
+
+// Clean up
+
+$stmtarray = array(
+    "drop procedure imp_res_get_3_proc",
+    "drop table imp_res_get_3_tab_1",
+    "drop table imp_res_get_3_tab_2"
+);
+
+oci8_test_sql_execute($c, $stmtarray);
+
+?>
+===DONE===
+<?php exit(0); ?>
+--EXPECTF--
+Test 1
+  1  abcde
+  2  fghij
+  3  klmno
+  t
+  u
+  X
+  1  abcde
+  2  fghij
+  3  klmno
+  t
+  u
+  X
+  1  abcde
+  2  fghij
+  3  klmno
+  t
+  u
+  X
+  1  abcde
+  2  fghij
+  3  klmno
+  t
+  u
+  X
+  1  abcde
+  2  fghij
+  3  klmno
+  t
+  u
+  X
+  1  abcde
+  2  fghij
+  3  klmno
+  t
+  u
+  X
+  1  abcde
+  2  fghij
+  3  klmno
+  t
+  u
+  X
+  1  abcde
+  2  fghij
+  3  klmno
+  t
+  u
+  X
+  1  abcde
+  2  fghij
+  3  klmno
+  t
+  u
+  X
+  1  abcde
+  2  fghij
+  3  klmno
+  t
+  u
+  X
+  1  abcde
+  2  fghij
+  3  klmno
+  t
+  u
+  X
+  1  abcde
+  2  fghij
+  3  klmno
+  t
+  u
+  X
+  1  abcde
+  2  fghij
+  3  klmno
+  t
+  u
+  X
+  1  abcde
+  2  fghij
+  3  klmno
+  t
+  u
+  X
+  1  abcde
+  2  fghij
+  3  klmno
+  t
+  u
+  X
+  1  abcde
+  2  fghij
+  3  klmno
+  t
+  u
+  X
+  1  abcde
+  2  fghij
+  3  klmno
+  t
+  u
+  X
+  1  abcde
+  2  fghij
+  3  klmno
+  t
+  u
+  X
+  1  abcde
+  2  fghij
+  3  klmno
+  t
+  u
+  X
+  1  abcde
+  2  fghij
+  3  klmno
+  t
+  u
+  X
+  1  abcde
+  2  fghij
+  3  klmno
+  t
+  u
+  X
+  1  abcde
+  2  fghij
+  3  klmno
+  t
+  u
+  X
+  1  abcde
+  2  fghij
+  3  klmno
+  t
+  u
+  X
+  1  abcde
+  2  fghij
+  3  klmno
+  t
+  u
+  X
+  1  abcde
+  2  fghij
+  3  klmno
+  t
+  u
+  X
+  1  abcde
+  2  fghij
+  3  klmno
+  t
+  u
+  X
+  1  abcde
+  2  fghij
+  3  klmno
+  t
+  u
+  X
+  1  abcde
+  2  fghij
+  3  klmno
+  t
+  u
+  X
+  1  abcde
+  2  fghij
+  3  klmno
+  t
+  u
+  X
+  1  abcde
+  2  fghij
+  3  klmno
+  t
+  u
+  X
+===DONE===
diff --git a/ext/oci8/tests/imp_res_get_4.phpt b/ext/oci8/tests/imp_res_get_4.phpt
new file mode 100644 (file)
index 0000000..ea7fb87
--- /dev/null
@@ -0,0 +1,146 @@
+--TEST--
+Oracle Database 12c Implicit Result Sets: oci_get_implicit_resultset: interleaved fetches
+--SKIPIF--
+<?php 
+if (!extension_loaded('oci8')) die ("skip no oci8 extension"); 
+$target_dbs = array('oracledb' => true, 'timesten' => false);  // test runs on these DBs
+require(dirname(__FILE__).'/skipif.inc');
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
+if (!(isset($matches[0]) && $matches[1] >= 12)) {
+    die("skip expected output only valid when using Oracle Database 12c or greater");
+}
+preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
+if (!(isset($matches[0]) && $matches[0] >= 12)) { 
+    die("skip works only with Oracle 12c or greater version of Oracle client libraries");
+}
+?>
+--FILE--
+<?php
+
+require(dirname(__FILE__).'/connect.inc');
+
+// Initialization
+
+$stmtarray = array(
+    "drop table imp_res_get_4_tab_1",
+    "create table imp_res_get_4_tab_1 (c1 number, c2 varchar2(10))",
+    "insert into imp_res_get_4_tab_1 values (1, 'abcde')",
+    "insert into imp_res_get_4_tab_1 values (2, 'fghij')",
+    "insert into imp_res_get_4_tab_1 values (3, 'klmno')",
+
+    "drop table imp_res_get_4_tab_2",
+    "create table imp_res_get_4_tab_2 (c3 varchar2(1))",
+    "insert into imp_res_get_4_tab_2 values ('t')",
+    "insert into imp_res_get_4_tab_2 values ('u')",
+    "insert into imp_res_get_4_tab_2 values ('v')",
+
+    "create or replace procedure imp_res_get_4_proc as
+      c1 sys_refcursor;
+    begin
+      open c1 for select * from imp_res_get_4_tab_1 order by 1;
+      dbms_sql.return_result(c1);
+
+      open c1 for select * from imp_res_get_4_tab_2 order by 1;
+      dbms_sql.return_result(c1);
+    end;"
+);
+
+oci8_test_sql_execute($c, $stmtarray);
+
+function print_row($row)
+{
+    if ($row === false) {
+      print "Return is false\n";
+      return;
+    }
+    foreach ($row as $item) {
+        echo "  ".$item;
+    }
+    echo "\n";
+}
+
+// Run Test
+
+echo "Test 1\n";
+
+$s = oci_parse($c, "begin imp_res_get_4_proc(); end;");
+oci_execute($s);
+$s1 = oci_get_implicit_resultset($s);
+$s2 = oci_get_implicit_resultset($s);
+$row = oci_fetch_array($s1, OCI_ASSOC+OCI_RETURN_NULLS);
+print_row($row);
+$row = oci_fetch_array($s2, OCI_ASSOC+OCI_RETURN_NULLS);
+print_row($row);
+$row = oci_fetch_array($s1, OCI_ASSOC+OCI_RETURN_NULLS);
+print_row($row);
+$row = oci_fetch_array($s2, OCI_ASSOC+OCI_RETURN_NULLS);
+print_row($row);
+$row = oci_fetch_array($s1, OCI_ASSOC+OCI_RETURN_NULLS);
+print_row($row);
+$row = oci_fetch_array($s2, OCI_ASSOC+OCI_RETURN_NULLS);
+print_row($row);
+
+echo "Test 2 - too many fetches\n";
+
+$s = oci_parse($c, "begin imp_res_get_4_proc(); end;");
+oci_execute($s);
+$s1 = oci_get_implicit_resultset($s);
+$s2 = oci_get_implicit_resultset($s);
+$row = oci_fetch_array($s1, OCI_ASSOC+OCI_RETURN_NULLS);
+print_row($row);
+$row = oci_fetch_array($s2, OCI_ASSOC+OCI_RETURN_NULLS);
+print_row($row);
+$row = oci_fetch_array($s1, OCI_ASSOC+OCI_RETURN_NULLS);
+print_row($row);
+$row = oci_fetch_array($s2, OCI_ASSOC+OCI_RETURN_NULLS);
+print_row($row);
+$row = oci_fetch_array($s1, OCI_ASSOC+OCI_RETURN_NULLS);
+print_row($row);
+$row = oci_fetch_array($s2, OCI_ASSOC+OCI_RETURN_NULLS);
+print_row($row);
+$row = oci_fetch_array($s1, OCI_ASSOC+OCI_RETURN_NULLS);
+print_row($row);
+$row = oci_fetch_array($s2, OCI_ASSOC+OCI_RETURN_NULLS);
+print_row($row);
+$row = oci_fetch_array($s1, OCI_ASSOC+OCI_RETURN_NULLS);
+print_row($row);
+$row = oci_fetch_array($s2, OCI_ASSOC+OCI_RETURN_NULLS);
+print_row($row);
+
+// Clean up
+
+$stmtarray = array(
+    "drop procedure imp_res_get_4_proc",
+    "drop table imp_res_get_4_tab_1",
+    "drop table imp_res_get_4_tab_2"
+);
+
+oci8_test_sql_execute($c, $stmtarray);
+
+?>
+===DONE===
+<?php exit(0); ?>
+--EXPECTF--
+Test 1
+  1  abcde
+  t
+  2  fghij
+  u
+  3  klmno
+  v
+Test 2 - too many fetches
+  1  abcde
+  t
+  2  fghij
+  u
+  3  klmno
+  v
+Return is false
+Return is false
+
+Warning: oci_fetch_array(): ORA-01002: %s in %simp_res_get_4.php on line %d
+Return is false
+
+Warning: oci_fetch_array(): ORA-01002: %s in %simp_res_get_4.php on line %d
+Return is false
+===DONE===
diff --git a/ext/oci8/tests/imp_res_get_5.phpt b/ext/oci8/tests/imp_res_get_5.phpt
new file mode 100644 (file)
index 0000000..3cfa096
--- /dev/null
@@ -0,0 +1,124 @@
+--TEST--
+Oracle Database 12c Implicit Result Sets: oci_get_implicit_resultset: get from wrong statement
+--SKIPIF--
+<?php 
+if (!extension_loaded('oci8')) die ("skip no oci8 extension"); 
+$target_dbs = array('oracledb' => true, 'timesten' => false);  // test runs on these DBs
+require(dirname(__FILE__).'/skipif.inc');
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
+if (!(isset($matches[0]) && $matches[1] >= 12)) {
+    die("skip expected output only valid when using Oracle Database 12c or greater");
+}
+preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
+if (!(isset($matches[0]) && $matches[0] >= 12)) { 
+    die("skip works only with Oracle 12c or greater version of Oracle client libraries");
+}
+?>
+--FILE--
+<?php
+
+require(dirname(__FILE__).'/connect.inc');
+
+function print_row($row)
+{
+    foreach ($row as $item) {
+        echo "  ".$item;
+    }
+    echo "\n";
+}
+
+$plsql = 
+    "declare
+      c1 sys_refcursor;
+    begin
+      open c1 for select 1 from dual union all select 2 from dual;
+      dbms_sql.return_result(c1);
+      open c1 for select 3 from dual union all select 4 from dual;
+      dbms_sql.return_result(c1);
+      open c1 for select 5 from dual union all select 6 from dual;
+      dbms_sql.return_result(c1);
+    end;";
+
+// Run Test
+
+echo "Test 1\n";
+// This test effectively discards all the first IRS results
+$s = oci_parse($c, $plsql);
+oci_execute($s);
+while (($s1 = oci_get_implicit_resultset($s))) {  // $s1 is never used again so its results are lost
+    while (($row = oci_fetch_array($s, OCI_ASSOC+OCI_RETURN_NULLS)) != false) {  // use parent $s instead of $s1
+        print_row($row);
+    }
+}
+oci_free_statement($s);
+
+echo "\nTest 2 - fetch first IRS explicitly\n";
+$s = oci_parse($c, $plsql);
+oci_execute($s);
+$s1 = oci_get_implicit_resultset($s);
+while (($row = oci_fetch_row($s1)) != false) {
+    print_row($row);
+}
+while (($row = oci_fetch_row($s)) != false) {
+    print_row($row);
+}
+oci_free_statement($s);
+
+echo "\nTest 3 - fetch part of IRS explicitly\n";
+$s = oci_parse($c, $plsql);
+oci_execute($s);
+$s1 = oci_get_implicit_resultset($s);
+while (($row = oci_fetch_row($s1)) != false) {
+    print_row($row);
+}
+$row = oci_fetch_row($s);
+print_row($row);
+$s1 = oci_get_implicit_resultset($s);
+while (($row = oci_fetch_row($s1)) != false) {
+    print_row($row);
+}
+while (($row = oci_fetch_row($s)) != false) {
+    print_row($row);
+}
+oci_free_statement($s);
+
+echo "\nTest 4 - skip IRSs\n";
+$s = oci_parse($c, $plsql);
+oci_execute($s);
+$s1 = oci_get_implicit_resultset($s);
+$s1 = oci_get_implicit_resultset($s);
+while (($row = oci_fetch_row($s)) != false) { // parent
+    print_row($row);
+}
+oci_free_statement($s);
+
+?>
+===DONE===
+<?php exit(0); ?>
+--EXPECTF--
+Test 1
+  3
+  4
+  5
+  6
+
+Test 2 - fetch first IRS explicitly
+  1
+  2
+  3
+  4
+  5
+  6
+
+Test 3 - fetch part of IRS explicitly
+  1
+  2
+  3
+  5
+  6
+  4
+
+Test 4 - skip IRSs
+  5
+  6
+===DONE===
diff --git a/ext/oci8/tests/imp_res_get_all.phpt b/ext/oci8/tests/imp_res_get_all.phpt
new file mode 100644 (file)
index 0000000..d2dcbea
--- /dev/null
@@ -0,0 +1,120 @@
+--TEST--
+Oracle Database 12c Implicit Result Sets: oci_get_implicit_resultset: oci_fetch_all
+--SKIPIF--
+<?php 
+if (!extension_loaded('oci8')) die ("skip no oci8 extension"); 
+$target_dbs = array('oracledb' => true, 'timesten' => false);  // test runs on these DBs
+require(dirname(__FILE__).'/skipif.inc');
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
+if (!(isset($matches[0]) && $matches[1] >= 12)) {
+    die("skip expected output only valid when using Oracle Database 12c or greater");
+}
+preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
+if (!(isset($matches[0]) && $matches[0] >= 12)) { 
+    die("skip works only with Oracle 12c or greater version of Oracle client libraries");
+}
+?>
+--FILE--
+<?php
+
+require(dirname(__FILE__).'/connect.inc');
+
+$plsql = "declare
+           c1 sys_refcursor;
+          begin
+            open c1 for select 1 from dual union all select 2 from dual;
+            dbms_sql.return_result(c1);
+            open c1 for select 3 from dual union all select 4 from dual;
+            dbms_sql.return_result(c1);
+            open c1 for select 5 from dual union all select 6 from dual;
+            dbms_sql.return_result(c1);
+          end;";
+
+// Run Test
+
+echo "Test 1\n";
+$s = oci_parse($c, $plsql);
+oci_execute($s);
+
+$s1 = oci_get_implicit_resultset($s);
+oci_fetch_all($s1, $res);
+var_dump($res);
+
+$s2 = oci_get_implicit_resultset($s);
+oci_fetch_all($s2, $res);
+var_dump($res);
+
+$s3 = oci_get_implicit_resultset($s);
+oci_fetch_all($s3, $res);
+var_dump($res);
+
+echo "\nTest 2\n";
+$s = oci_parse($c, $plsql);
+oci_execute($s);
+while (($s1 = oci_get_implicit_resultset($s))) {
+    $r = oci_fetch_all($s1, $res);
+    var_dump($res);
+}
+
+?>
+===DONE===
+<?php exit(0); ?>
+--EXPECTF--
+Test 1
+array(1) {
+  [1]=>
+  array(2) {
+    [0]=>
+    string(1) "1"
+    [1]=>
+    string(1) "2"
+  }
+}
+array(1) {
+  [3]=>
+  array(2) {
+    [0]=>
+    string(1) "3"
+    [1]=>
+    string(1) "4"
+  }
+}
+array(1) {
+  [5]=>
+  array(2) {
+    [0]=>
+    string(1) "5"
+    [1]=>
+    string(1) "6"
+  }
+}
+
+Test 2
+array(1) {
+  [1]=>
+  array(2) {
+    [0]=>
+    string(1) "1"
+    [1]=>
+    string(1) "2"
+  }
+}
+array(1) {
+  [3]=>
+  array(2) {
+    [0]=>
+    string(1) "3"
+    [1]=>
+    string(1) "4"
+  }
+}
+array(1) {
+  [5]=>
+  array(2) {
+    [0]=>
+    string(1) "5"
+    [1]=>
+    string(1) "6"
+  }
+}
+===DONE===
diff --git a/ext/oci8/tests/imp_res_get_cancel.phpt b/ext/oci8/tests/imp_res_get_cancel.phpt
new file mode 100644 (file)
index 0000000..7dbcecb
--- /dev/null
@@ -0,0 +1,56 @@
+--TEST--
+Oracle Database 12c Implicit Result Sets: oci_get_implicit_resultset: oci_cancel
+--SKIPIF--
+<?php 
+if (!extension_loaded('oci8')) die ("skip no oci8 extension"); 
+$target_dbs = array('oracledb' => true, 'timesten' => false);  // test runs on these DBs
+require(dirname(__FILE__).'/skipif.inc');
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
+if (!(isset($matches[0]) && $matches[1] >= 12)) {
+    die("skip expected output only valid when using Oracle Database 12c or greater");
+}
+preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
+if (!(isset($matches[0]) && $matches[0] >= 12)) { 
+    die("skip works only with Oracle 12c or greater version of Oracle client libraries");
+}
+?>
+--FILE--
+<?php
+
+require(dirname(__FILE__).'/connect.inc');
+
+$plsql =
+    "declare
+      c1 sys_refcursor;
+      c2 sys_refcursor;
+    begin
+      open c1 for select 1 from dual union all select 2 from dual;
+      dbms_sql.return_result(c1);
+      open c2 for select 3 from dual;
+      dbms_sql.return_result (c2);
+    end;";
+
+// Run Test
+
+echo "Test 1\n";
+$s = oci_parse($c, $plsql);
+oci_execute($s);
+while (($s1 = oci_get_implicit_resultset($s))) {
+    while (($row = oci_fetch_array($s1, OCI_ASSOC+OCI_RETURN_NULLS)) != false) {
+        foreach ($row as $item) {
+            echo "  ".$item;
+        }
+        echo "\n";
+        oci_cancel($s1);
+    }
+}
+
+?>
+===DONE===
+<?php exit(0); ?>
+--EXPECTF--
+Test 1
+  1
+  3
+===DONE===
+    
diff --git a/ext/oci8/tests/imp_res_get_close_1.phpt b/ext/oci8/tests/imp_res_get_close_1.phpt
new file mode 100644 (file)
index 0000000..2edc8bf
--- /dev/null
@@ -0,0 +1,68 @@
+--TEST--
+Oracle Database 12c Implicit Result Sets: oci_get_implicit_resultset: oci_free_statement #1
+--SKIPIF--
+<?php 
+if (!extension_loaded('oci8')) die ("skip no oci8 extension"); 
+$target_dbs = array('oracledb' => true, 'timesten' => false);  // test runs on these DBs
+require(dirname(__FILE__).'/skipif.inc');
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
+if (!(isset($matches[0]) && $matches[1] >= 12)) {
+    die("skip expected output only valid when using Oracle Database 12c or greater");
+}
+preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
+if (!(isset($matches[0]) && $matches[0] >= 12)) { 
+    die("skip works only with Oracle 12c or greater version of Oracle client libraries");
+}
+?>
+--FILE--
+<?php
+
+require(dirname(__FILE__).'/connect.inc');
+
+// Initialization
+
+$plsql = 
+    "declare
+      c1 sys_refcursor;
+    begin
+      open c1 for select 1 from dual union all select 2 from dual;
+      dbms_sql.return_result(c1);
+      open c1 for select 3 from dual union all select 4 from dual;
+      dbms_sql.return_result(c1);
+      open c1 for select 5 from dual union all select 6 from dual;
+      dbms_sql.return_result(c1);
+    end;";
+
+// Run Test
+
+echo "Test 1\n";
+
+$s = oci_parse($c, $plsql);
+oci_execute($s);
+
+while (($s1 = oci_get_implicit_resultset($s))) {
+    while (($row = oci_fetch_array($s1, OCI_ASSOC+OCI_RETURN_NULLS)) != false) {
+        foreach ($row as $item) {
+            echo "  ".$item;
+        }
+        echo "\n";
+        oci_free_statement($s1);  // Free the implicit result handle
+    }
+}
+oci_free_statement($s);
+
+?>
+===DONE===
+<?php exit(0); ?>
+--EXPECTF--
+Test 1
+  1
+
+Warning: oci_fetch_array(): %d is not a valid oci8 statement resource in %s on line %d
+  3
+
+Warning: oci_fetch_array(): %d is not a valid oci8 statement resource in %s on line %d
+  5
+
+Warning: oci_fetch_array(): %d is not a valid oci8 statement resource in %s on line %d
+===DONE===
diff --git a/ext/oci8/tests/imp_res_get_close_2.phpt b/ext/oci8/tests/imp_res_get_close_2.phpt
new file mode 100644 (file)
index 0000000..b315383
--- /dev/null
@@ -0,0 +1,64 @@
+--TEST--
+Oracle Database 12c Implicit Result Sets: oci_get_implicit_resultset: oci_free_statement #2
+--SKIPIF--
+<?php 
+if (!extension_loaded('oci8')) die ("skip no oci8 extension"); 
+$target_dbs = array('oracledb' => true, 'timesten' => false);  // test runs on these DBs
+require(dirname(__FILE__).'/skipif.inc');
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
+if (!(isset($matches[0]) && $matches[1] >= 12)) {
+    die("skip expected output only valid when using Oracle Database 12c or greater");
+}
+preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
+if (!(isset($matches[0]) && $matches[0] >= 12)) { 
+    die("skip works only with Oracle 12c or greater version of Oracle client libraries");
+}
+?>
+--FILE--
+<?php
+
+require(dirname(__FILE__).'/connect.inc');
+
+// Initialization
+
+$plsql =
+    "declare
+      c1 sys_refcursor;
+    begin
+      open c1 for select 1 from dual union all select 2 from dual;
+      dbms_sql.return_result(c1);
+      open c1 for select 3 from dual union all select 4 from dual;
+      dbms_sql.return_result(c1);
+      open c1 for select 5 from dual union all select 6 from dual;
+      dbms_sql.return_result(c1);
+    end;";
+
+// Run Test
+
+echo "Test 1\n";
+
+$s = oci_parse($c, $plsql);
+oci_execute($s);
+
+while (($s1 = oci_get_implicit_resultset($s))) {
+    while (($row = oci_fetch_array($s1, OCI_ASSOC+OCI_RETURN_NULLS)) != false) {
+        foreach ($row as $item) {
+            echo "  ".$item;
+        }
+        echo "\n";
+        oci_free_statement($s);  // close parent
+    }
+}
+
+?>
+===DONE===
+<?php exit(0); ?>
+--EXPECTF--
+Test 1
+  1
+  2
+
+Warning: oci_fetch_array(): OCI_INVALID_HANDLE in %s on line %d
+
+Warning: oci_get_implicit_resultset(): %d is not a valid oci8 statement resource in %s on line %d
+===DONE===
diff --git a/ext/oci8/tests/imp_res_get_close_3.phpt b/ext/oci8/tests/imp_res_get_close_3.phpt
new file mode 100644 (file)
index 0000000..4793a6c
--- /dev/null
@@ -0,0 +1,65 @@
+--TEST--
+Oracle Database 12c Implicit Result Sets: oci_get_implicit_resultset: oci_free_statement #3
+--SKIPIF--
+<?php 
+if (!extension_loaded('oci8')) die ("skip no oci8 extension"); 
+$target_dbs = array('oracledb' => true, 'timesten' => false);  // test runs on these DBs
+require(dirname(__FILE__).'/skipif.inc');
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
+if (!(isset($matches[0]) && $matches[1] >= 12)) {
+    die("skip expected output only valid when using Oracle Database 12c or greater");
+}
+preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
+if (!(isset($matches[0]) && $matches[0] >= 12)) { 
+    die("skip works only with Oracle 12c or greater version of Oracle client libraries");
+}
+?>
+--FILE--
+<?php
+
+require(dirname(__FILE__).'/connect.inc');
+
+// Initialization
+
+$plsql =
+   "declare
+      c1 sys_refcursor;
+    begin
+      open c1 for select 1 from dual union all select 2 from dual;
+      dbms_sql.return_result(c1);
+      open c1 for select 3 from dual union all select 4 from dual;
+      dbms_sql.return_result(c1);
+      open c1 for select 5 from dual union all select 6 from dual;
+      dbms_sql.return_result(c1);
+    end;";
+
+// Run Test
+
+echo "Test 1\n";
+
+$s = oci_parse($c, $plsql);
+oci_execute($s);
+
+while (($s1 = oci_get_implicit_resultset($s))) {
+    while (($row = oci_fetch_array($s1, OCI_ASSOC+OCI_RETURN_NULLS)) != false) {
+        foreach ($row as $item) {
+            echo "  ".$item;
+        }
+        echo "\n";
+    }
+    oci_free_statement($s1);
+}
+oci_free_statement($s);
+
+?>
+===DONE===
+<?php exit(0); ?>
+--EXPECTF--
+Test 1
+  1
+  2
+  3
+  4
+  5
+  6
+===DONE===
diff --git a/ext/oci8/tests/imp_res_get_cursor.phpt b/ext/oci8/tests/imp_res_get_cursor.phpt
new file mode 100644 (file)
index 0000000..ccdb6f5
--- /dev/null
@@ -0,0 +1,101 @@
+--TEST--
+Oracle Database 12c Implicit Result Sets: oci_get_implicit_resultset: nested cursor
+--SKIPIF--
+<?php 
+if (!extension_loaded('oci8')) die ("skip no oci8 extension"); 
+$target_dbs = array('oracledb' => true, 'timesten' => false);  // test runs on these DBs
+require(dirname(__FILE__).'/skipif.inc');
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
+if (!(isset($matches[0]) && $matches[1] >= 12)) {
+    die("skip expected output only valid when using Oracle Database 12c or greater");
+}
+preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
+if (!(isset($matches[0]) && $matches[0] >= 12)) { 
+    die("skip works only with Oracle 12c or greater version of Oracle client libraries");
+}
+?>
+--FILE--
+<?php
+
+require(dirname(__FILE__).'/connect.inc');
+
+// Initialization
+
+$stmtarray = array(
+    "drop table imp_res_get_cursor_tab_1",
+    "create table imp_res_get_cursor_tab_1 (c1 number, c2 varchar2(10))",
+    "insert into imp_res_get_cursor_tab_1 values (1, 'abcde')",
+    "insert into imp_res_get_cursor_tab_1 values (2, 'fghij')",
+    "insert into imp_res_get_cursor_tab_1 values (3, 'klmno')",
+
+    "drop table imp_res_get_cursor_tab_2",
+    "create table imp_res_get_cursor_tab_2 (c3 varchar2(1))",
+    "insert into imp_res_get_cursor_tab_2 values ('t')",
+    "insert into imp_res_get_cursor_tab_2 values ('u')",
+    "insert into imp_res_get_cursor_tab_2 values ('v')",
+
+    "create or replace procedure imp_res_get_cursor_proc as
+      c1 sys_refcursor;
+    begin
+      open c1 for select cursor(select c1, c2 from imp_res_get_cursor_tab_1 order by 1) as curs from dual;
+      dbms_sql.return_result(c1);
+
+      open c1 for select * from imp_res_get_cursor_tab_2 where rownum < 3 order by 1;
+      dbms_sql.return_result(c1);
+
+      open c1 for select * from dual;
+      dbms_sql.return_result (c1);
+    end;"
+);
+
+oci8_test_sql_execute($c, $stmtarray);
+
+function do_fetch($s)
+{
+    while (($row = oci_fetch_assoc($s)) != false) {
+        foreach ($row as $item) {
+            if (is_resource($item)) {  // Nested cursor
+                oci_execute($item);
+                do_fetch($item);
+            } else {
+                echo "  ".$item;
+            }
+        }
+        echo "\n";
+    }
+}
+
+// Run Test
+
+echo "Test 1\n";
+
+$s = oci_parse($c, "begin imp_res_get_cursor_proc(); end;");
+oci_execute($s);
+
+while (($s1 = oci_get_implicit_resultset($s))) {
+    do_fetch($s1);
+}
+
+// Clean up
+
+$stmtarray = array(
+    "drop procedure imp_res_get_cursor_proc",
+    "drop table imp_res_get_cursor_tab_1",
+    "drop table imp_res_get_cursor_tab_2"
+);
+
+oci8_test_sql_execute($c, $stmtarray);
+
+?>
+===DONE===
+<?php exit(0); ?>
+--EXPECTF--
+Test 1
+  1  abcde
+  2  fghij
+  3  klmno
+
+  t
+  u
+  X
+===DONE===
diff --git a/ext/oci8/tests/imp_res_get_dbmsoutput.phpt b/ext/oci8/tests/imp_res_get_dbmsoutput.phpt
new file mode 100644 (file)
index 0000000..cbc2389
--- /dev/null
@@ -0,0 +1,156 @@
+--TEST--
+Oracle Database 12c Implicit Result Sets: oci_get_implicit_resultset: interleaved with DBMS_OUTPUT
+--SKIPIF--
+<?php 
+if (!extension_loaded('oci8')) die ("skip no oci8 extension"); 
+$target_dbs = array('oracledb' => true, 'timesten' => false);  // test runs on these DBs
+require(dirname(__FILE__).'/skipif.inc');
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
+if (!(isset($matches[0]) && $matches[1] >= 12)) {
+    die("skip expected output only valid when using Oracle Database 12c or greater");
+}
+preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
+if (!(isset($matches[0]) && $matches[0] >= 12)) { 
+    die("skip works only with Oracle 12c or greater version of Oracle client libraries");
+}
+?>
+--FILE--
+<?php
+
+require(dirname(__FILE__).'/connect.inc');
+
+// Initialization
+
+$stmtarray = array(
+    "drop table imp_res_get_dbmsoutput_tab_1",
+    "create table imp_res_get_dbmsoutput_tab_1 (c1 number, c2 varchar2(10))",
+    "insert into imp_res_get_dbmsoutput_tab_1 values (1, 'abcde')",
+    "insert into imp_res_get_dbmsoutput_tab_1 values (2, 'fghij')",
+    "insert into imp_res_get_dbmsoutput_tab_1 values (3, 'klmno')",
+
+    "drop table imp_res_get_dbmsoutput_tab_2",
+    "create table imp_res_get_dbmsoutput_tab_2 (c3 varchar2(1))",
+    "insert into imp_res_get_dbmsoutput_tab_2 values ('t')",
+    "insert into imp_res_get_dbmsoutput_tab_2 values ('u')",
+    "insert into imp_res_get_dbmsoutput_tab_2 values ('v')",
+
+    "create or replace procedure imp_res_get_dbmsoutput_proc as
+      c1 sys_refcursor;
+    begin
+      dbms_output.put_line('Line 1');
+      open c1 for select * from imp_res_get_dbmsoutput_tab_1 order by 1;
+      dbms_sql.return_result(c1);
+      dbms_output.put_line('Line 2');
+      open c1 for select * from imp_res_get_dbmsoutput_tab_2 order by 1;
+      dbms_sql.return_result(c1);
+      dbms_output.put_line('Line 3');
+      open c1 for select * from dual;
+      dbms_sql.return_result (c1);
+    end;"
+);
+
+oci8_test_sql_execute($c, $stmtarray);
+
+// Turn DBMS_OUTPUT on
+function setserveroutputon($c)
+{
+    $s = oci_parse($c, "begin dbms_output.enable(null); end;");
+    oci_execute($s);
+}
+
+function getdbmsoutput_do($c)
+{
+    $s = oci_parse($c, "begin dbms_output.get_line(:ln, :st); end;");
+    oci_bind_by_name($s, ":ln", $ln, 100);
+    oci_bind_by_name($s, ":st", $st, -1, SQLT_INT);
+    $res = false;
+    while (($succ = oci_execute($s)) && !$st) {
+        $res[] = $ln;  // append each line to the array
+    }
+    return $res;
+}
+
+setserveroutputon($c);
+
+// Run Test
+
+echo "Test 1\n";
+
+$s = oci_parse($c, "begin imp_res_get_dbmsoutput_proc(); end;");
+oci_execute($s);
+
+var_dump(getdbmsoutput_do($c));
+
+while (($s1 = oci_get_implicit_resultset($s))) {
+    while (($row = oci_fetch_array($s1, OCI_ASSOC+OCI_RETURN_NULLS)) != false) {
+        foreach ($row as $item) {
+            echo "  ".$item;
+        }
+        echo "\n";
+    }
+}
+
+echo "Test 2\n";
+
+$s = oci_parse($c, "begin imp_res_get_dbmsoutput_proc(); end;");
+oci_execute($s);
+
+while (($s1 = oci_get_implicit_resultset($s))) {
+    while (($row = oci_fetch_array($s1, OCI_ASSOC+OCI_RETURN_NULLS)) != false) {
+        foreach ($row as $item) {
+            echo "  ".$item;
+        }
+        echo "\n";
+    }
+}
+
+var_dump(getdbmsoutput_do($c));
+
+// Clean up
+
+$stmtarray = array(
+    "drop procedure imp_res_get_dbmsoutput_proc",
+    "drop table imp_res_get_dbmsoutput_tab_1",
+    "drop table imp_res_get_dbmsoutput_tab_2"
+);
+
+oci8_test_sql_execute($c, $stmtarray);
+
+?>
+===DONE===
+<?php exit(0); ?>
+--EXPECTF--
+Test 1
+array(3) {
+  [0]=>
+  string(6) "Line 1"
+  [1]=>
+  string(6) "Line 2"
+  [2]=>
+  string(6) "Line 3"
+}
+  1  abcde
+  2  fghij
+  3  klmno
+  t
+  u
+  v
+  X
+Test 2
+  1  abcde
+  2  fghij
+  3  klmno
+  t
+  u
+  v
+  X
+array(3) {
+  [0]=>
+  string(6) "Line 1"
+  [1]=>
+  string(6) "Line 2"
+  [2]=>
+  string(6) "Line 3"
+}
+===DONE===
+    
diff --git a/ext/oci8/tests/imp_res_get_exec.phpt b/ext/oci8/tests/imp_res_get_exec.phpt
new file mode 100644 (file)
index 0000000..dbd8f3e
--- /dev/null
@@ -0,0 +1,55 @@
+--TEST--
+Oracle Database 12c Implicit Result Sets: oci_get_implicit_resultset: Execute twice
+--SKIPIF--
+<?php 
+if (!extension_loaded('oci8')) die ("skip no oci8 extension"); 
+$target_dbs = array('oracledb' => true, 'timesten' => false);  // test runs on these DBs
+require(dirname(__FILE__).'/skipif.inc');
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
+if (!(isset($matches[0]) && $matches[1] >= 12)) {
+    die("skip expected output only valid when using Oracle Database 12c or greater");
+}
+preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
+if (!(isset($matches[0]) && $matches[0] >= 12)) { 
+    die("skip works only with Oracle 12c or greater version of Oracle client libraries");
+}
+?>
+--FILE--
+<?php
+
+require(dirname(__FILE__).'/connect.inc');
+
+$plsql = "declare
+      c1 sys_refcursor;
+    begin
+      open c1 for select 1 from dual union all select 2 from dual;
+      dbms_sql.return_result(c1);
+    end;";
+
+// Run Test
+
+echo "Test 1\n";
+
+$s = oci_parse($c, $plsql);
+oci_execute($s);
+
+$s1 = oci_get_implicit_resultset($s);
+oci_execute($s1);
+oci_execute($s1);  // execute twice; should be NOP
+while (($row = oci_fetch_array($s1, OCI_ASSOC+OCI_RETURN_NULLS)) != false) {
+    foreach ($row as $item) {
+        echo "  ".$item;
+    }
+    echo "\n";
+}
+oci_free_statement($s);
+
+
+?>
+===DONE===
+<?php exit(0); ?>
+--EXPECTF--
+Test 1
+  1
+  2
+===DONE===
diff --git a/ext/oci8/tests/imp_res_get_none.phpt b/ext/oci8/tests/imp_res_get_none.phpt
new file mode 100644 (file)
index 0000000..981f494
--- /dev/null
@@ -0,0 +1,46 @@
+--TEST--
+Oracle Database 12c Implicit Result Sets: oci_get_implicit_resultset: no implicit results
+--SKIPIF--
+<?php 
+if (!extension_loaded('oci8')) die ("skip no oci8 extension"); 
+$target_dbs = array('oracledb' => true, 'timesten' => false);  // test runs on these DBs
+require(dirname(__FILE__).'/skipif.inc');
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
+if (!(isset($matches[0]) && $matches[1] >= 12)) {
+    die("skip expected output only valid when using Oracle Database 12c or greater");
+}
+preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
+if (!(isset($matches[0]) && $matches[0] >= 12)) { 
+    die("skip works only with Oracle 12c or greater version of Oracle client libraries");
+}
+?>
+--FILE--
+<?php
+
+require(dirname(__FILE__).'/connect.inc');
+
+// Run Test
+
+echo "Test 1\n";
+
+$s = oci_parse($c, "select * from dual");
+oci_execute($s);
+
+while (($s1 = oci_get_implicit_resultset($s))) {
+    while (($row = oci_fetch_array($s1, OCI_ASSOC+OCI_RETURN_NULLS)) != false) {
+        foreach ($row as $item) {
+            echo "  ".$item;
+        }
+        echo "\n";
+    }
+}
+
+var_dump($s1);
+
+?>
+===DONE===
+<?php exit(0); ?>
+--EXPECTF--
+Test 1
+bool(false)
+===DONE===
diff --git a/ext/oci8/tests/imp_res_insert.phpt b/ext/oci8/tests/imp_res_insert.phpt
new file mode 100644 (file)
index 0000000..d9c0705
--- /dev/null
@@ -0,0 +1,152 @@
+--TEST--
+Oracle Database 12c Implicit Result Sets: Commit modes
+--SKIPIF--
+<?php 
+if (!extension_loaded('oci8')) die ("skip no oci8 extension"); 
+$target_dbs = array('oracledb' => true, 'timesten' => false);  // test runs on these DBs
+require(dirname(__FILE__).'/skipif.inc');
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
+if (!(isset($matches[0]) && $matches[1] >= 12)) {
+    die("skip expected output only valid when using Oracle Database 12c or greater");
+}
+preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
+if (!(isset($matches[0]) && $matches[0] >= 12)) { 
+    die("skip works only with Oracle 12c or greater version of Oracle client libraries");
+}
+?>
+--FILE--
+<?php
+
+require(dirname(__FILE__).'/connect.inc');
+
+// Initialization
+
+$c2 = oci_new_connect($user, $password, $dbase);
+
+$stmtarray = array(
+    "drop table imp_res_insert_tab",
+    "create table imp_res_insert_tab (c1 number)",
+
+    "create or replace procedure imp_res_insert_proc_nc (p1 in number) as
+      c1 sys_refcursor;
+    begin
+      execute immediate 'insert into imp_res_insert_tab values ('||p1||')';
+      open c1 for select * from imp_res_insert_tab order by 1;
+      dbms_sql.return_result(c1);
+    end;",
+
+    "create or replace procedure imp_res_insert_proc_c (p1 in number) as
+      c1 sys_refcursor;
+    begin
+      execute immediate 'insert into imp_res_insert_tab values ('||p1||')';
+      commit;
+      open c1 for select * from imp_res_insert_tab order by 1;
+      dbms_sql.return_result(c1);
+    end;"
+
+);
+
+oci8_test_sql_execute($c, $stmtarray);
+
+// Run Test
+
+echo "Test 1 - No commit in procedure, OCI_COMMIT_ON_SUCCESS mode\n";
+$s = oci_parse($c, "begin imp_res_insert_proc_nc(111); end;");
+oci_execute($s, OCI_COMMIT_ON_SUCCESS);
+while (($row = oci_fetch_row($s)) !== false)
+    echo $row[0], "\n";
+$s2 = oci_parse($c2, "select * from imp_res_insert_tab order by 1");
+oci_execute($s2, OCI_NO_AUTO_COMMIT);
+oci_fetch_all($s2, $res);
+var_dump($res['C1']);
+
+echo "\nTest 2 - No commit in procedure, OCI_NO_AUTO_COMMIT mode\n";
+$s = oci_parse($c, "begin imp_res_insert_proc_nc(222); end;");
+oci_execute($s, OCI_NO_AUTO_COMMIT);
+while (($row = oci_fetch_row($s)) !== false)
+    echo $row[0], "\n";
+// The 2nd connection won't see the newly inserted data
+$s2 = oci_parse($c2, "select * from imp_res_insert_tab order by 1");
+oci_execute($s2, OCI_NO_AUTO_COMMIT);
+oci_fetch_all($s2, $res);
+var_dump($res['C1']);
+
+echo "\nTest 3 - Commit in procedure, OCI_COMMIT_ON_SUCCESS mode\n";
+$s = oci_parse($c, "begin imp_res_insert_proc_c(333); end;");
+oci_execute($s, OCI_COMMIT_ON_SUCCESS);
+// The 2nd connection will now see the previously uncommitted data inserted in the previous test
+while (($row = oci_fetch_row($s)) !== false)
+    echo $row[0], "\n";
+$s2 = oci_parse($c2, "select * from imp_res_insert_tab order by 1");
+oci_execute($s2, OCI_NO_AUTO_COMMIT);
+oci_fetch_all($s2, $res);
+var_dump($res['C1']);
+
+echo "\nTest 4 - Commit in procedure, OCI_NO_AUTO_COMMIT mode\n";
+$s = oci_parse($c, "begin imp_res_insert_proc_c(444); end;");
+oci_execute($s, OCI_NO_AUTO_COMMIT);
+while (($row = oci_fetch_row($s)) !== false)
+    echo $row[0], "\n";
+$s2 = oci_parse($c2, "select * from imp_res_insert_tab order by 1");
+oci_execute($s2, OCI_NO_AUTO_COMMIT);
+oci_fetch_all($s2, $res);
+var_dump($res['C1']);
+
+// Clean up
+
+$stmtarray = array(
+    "drop procedure imp_res_insert_proc_nc",
+    "drop procedure imp_res_insert_proc_c",
+    "drop table imp_res_insert_tab",
+);
+
+oci8_test_sql_execute($c, $stmtarray);
+
+?>
+===DONE===
+<?php exit(0); ?>
+--EXPECTF--
+Test 1 - No commit in procedure, OCI_COMMIT_ON_SUCCESS mode
+111
+array(1) {
+  [0]=>
+  string(3) "111"
+}
+
+Test 2 - No commit in procedure, OCI_NO_AUTO_COMMIT mode
+111
+222
+array(1) {
+  [0]=>
+  string(3) "111"
+}
+
+Test 3 - Commit in procedure, OCI_COMMIT_ON_SUCCESS mode
+111
+222
+333
+array(3) {
+  [0]=>
+  string(3) "111"
+  [1]=>
+  string(3) "222"
+  [2]=>
+  string(3) "333"
+}
+
+Test 4 - Commit in procedure, OCI_NO_AUTO_COMMIT mode
+111
+222
+333
+444
+array(4) {
+  [0]=>
+  string(3) "111"
+  [1]=>
+  string(3) "222"
+  [2]=>
+  string(3) "333"
+  [3]=>
+  string(3) "444"
+}
+===DONE===
diff --git a/ext/oci8/tests/imp_res_lob.phpt b/ext/oci8/tests/imp_res_lob.phpt
new file mode 100644 (file)
index 0000000..2478035
--- /dev/null
@@ -0,0 +1,101 @@
+--TEST--
+Oracle Database 12c Implicit Result Sets: LOBs
+--SKIPIF--
+<?php 
+if (!extension_loaded('oci8')) die ("skip no oci8 extension"); 
+$target_dbs = array('oracledb' => true, 'timesten' => false);  // test runs on these DBs
+require(dirname(__FILE__).'/skipif.inc');
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
+if (!(isset($matches[0]) && $matches[1] >= 12)) {
+    die("skip expected output only valid when using Oracle Database 12c or greater");
+}
+preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
+if (!(isset($matches[0]) && $matches[0] >= 12)) { 
+    die("skip works only with Oracle 12c or greater version of Oracle client libraries");
+}
+?>
+--FILE--
+<?php
+
+require(dirname(__FILE__).'/connect.inc');
+
+// Initialization
+
+$stmtarray = array(
+    "drop table imp_res_lob_tab",
+    "create table imp_res_lob_tab (c1 number, c2 clob, c3 varchar2(10))",
+    "insert into imp_res_lob_tab values (1, 'aaaaa', 'a')",
+    "insert into imp_res_lob_tab values (2, 'bbbbb', 'b')",
+    "insert into imp_res_lob_tab values (3, 'ccccc', 'c')",
+    "insert into imp_res_lob_tab values (4, 'ddddd', 'd')",
+
+    "create or replace procedure imp_res_lob_proc as
+      c1 sys_refcursor;
+    begin
+      open c1 for select * from imp_res_lob_tab order by 1;
+      dbms_sql.return_result(c1);
+      open c1 for select * from dual;
+      dbms_sql.return_result(c1); 
+      open c1 for select c2 from imp_res_lob_tab order by c1;
+      dbms_sql.return_result(c1);
+   end;"
+);
+
+oci8_test_sql_execute($c, $stmtarray);
+
+// Run Test
+
+echo "Test 1\n";
+$s = oci_parse($c, "begin imp_res_lob_proc(); end;");
+oci_execute($s);
+while (($row = oci_fetch_row($s)) != false) {
+    foreach ($row as $item) {
+        if (is_object($item)) {            
+            echo " " . $item->load();
+        } else {
+            echo " " . $item;
+        }
+    }
+    echo "\n";
+}
+
+echo "\nTest 2 - don't fetch all rows\n";
+$s = oci_parse($c, "begin imp_res_lob_proc(); end;");
+oci_execute($s);
+$row = oci_fetch_row($s);
+foreach ($row as $item) {
+    if (is_object($item)) {            
+        echo " " . $item->load();
+    } else {
+        echo " " . $item;
+    }
+}
+echo "\n";
+
+// Clean up
+
+$stmtarray = array(
+    "drop procedure imp_res_lob_proc",
+    "drop table imp_res_lob_tab",
+);
+
+oci8_test_sql_execute($c, $stmtarray);
+
+?>
+===DONE===
+<?php exit(0); ?>
+--EXPECTF--
+Test 1
+ 1 aaaaa a
+ 2 bbbbb b
+ 3 ccccc c
+ 4 ddddd d
+ X
+ aaaaa
+ bbbbb
+ ccccc
+ ddddd
+
+Test 2 - don't fetch all rows
+ 1 aaaaa a
+===DONE===
diff --git a/ext/oci8/tests/imp_res_prefetch.phpt b/ext/oci8/tests/imp_res_prefetch.phpt
new file mode 100644 (file)
index 0000000..5acdd51
--- /dev/null
@@ -0,0 +1,185 @@
+--TEST--
+Oracle Database 12c Implicit Result Sets: basic test
+--SKIPIF--
+<?php 
+if (!extension_loaded('oci8')) die ("skip no oci8 extension"); 
+$target_dbs = array('oracledb' => true, 'timesten' => false);  // test runs on these DBs
+require(dirname(__FILE__).'/skipif.inc');
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
+if (!(isset($matches[0]) && $matches[1] >= 12)) {
+    die("skip expected output only valid when using Oracle Database 12c or greater");
+}
+preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
+if (!(isset($matches[0]) && $matches[0] >= 12)) { 
+    die("skip works only with Oracle 12c or greater version of Oracle client libraries");
+}
+?>
+--FILE--
+<?php
+
+require(dirname(__FILE__).'/connect.inc');
+
+// Initialization
+
+$stmtarray = array(
+    "drop table imp_res_prefetch_tab_1",
+    "create table imp_res_prefetch_tab_1 (c1 number, c2 varchar2(10))",
+    "insert into imp_res_prefetch_tab_1 values (1, 'abcde')",
+    "insert into imp_res_prefetch_tab_1 values (2, 'fghij')",
+    "insert into imp_res_prefetch_tab_1 values (3, 'klmno')",
+
+    "drop table imp_res_prefetch_tab_2",
+    "create table imp_res_prefetch_tab_2 (c3 varchar2(1))",
+    "insert into imp_res_prefetch_tab_2 values ('t')",
+    "insert into imp_res_prefetch_tab_2 values ('u')",
+    "insert into imp_res_prefetch_tab_2 values ('v')",
+
+    "create or replace procedure imp_res_prefetch_proc as
+      c1 sys_refcursor;
+    begin
+      open c1 for select * from imp_res_prefetch_tab_1 order by 1;
+      dbms_sql.return_result(c1);
+
+      open c1 for select * from imp_res_prefetch_tab_2 order by 1;
+      dbms_sql.return_result(c1);
+    end;"
+);
+
+oci8_test_sql_execute($c, $stmtarray);
+
+// Run Test
+
+echo "Test 1 - prefetch 0\n";
+$s = oci_parse($c, "begin imp_res_prefetch_proc(); end;");
+oci_execute($s);
+var_dump(oci_set_prefetch($s, 0));
+while (($row = oci_fetch_row($s)) != false)
+    var_dump($row);
+
+echo "\nTest 1 - prefetch 1\n";
+$s = oci_parse($c, "begin imp_res_prefetch_proc(); end;");
+oci_execute($s);
+var_dump(oci_set_prefetch($s, 1));
+while (($row = oci_fetch_row($s)) != false)
+    var_dump($row);
+
+echo "\nTest 1 - prefetch 2\n";
+$s = oci_parse($c, "begin imp_res_prefetch_proc(); end;");
+oci_execute($s);
+var_dump(oci_set_prefetch($s, 2));
+while (($row = oci_fetch_row($s)) != false)
+    var_dump($row);
+
+// Clean up
+
+$stmtarray = array(
+    "drop procedure imp_res_prefetch_proc",
+    "drop table imp_res_prefetch_tab_1",
+    "drop table imp_res_prefetch_tab_2"
+);
+
+oci8_test_sql_execute($c, $stmtarray);
+
+?>
+===DONE===
+<?php exit(0); ?>
+--EXPECTF--
+Test 1 - prefetch 0
+bool(true)
+array(2) {
+  [0]=>
+  string(1) "1"
+  [1]=>
+  string(5) "abcde"
+}
+array(2) {
+  [0]=>
+  string(1) "2"
+  [1]=>
+  string(5) "fghij"
+}
+array(2) {
+  [0]=>
+  string(1) "3"
+  [1]=>
+  string(5) "klmno"
+}
+array(1) {
+  [0]=>
+  string(1) "t"
+}
+array(1) {
+  [0]=>
+  string(1) "u"
+}
+array(1) {
+  [0]=>
+  string(1) "v"
+}
+
+Test 1 - prefetch 1
+bool(true)
+array(2) {
+  [0]=>
+  string(1) "1"
+  [1]=>
+  string(5) "abcde"
+}
+array(2) {
+  [0]=>
+  string(1) "2"
+  [1]=>
+  string(5) "fghij"
+}
+array(2) {
+  [0]=>
+  string(1) "3"
+  [1]=>
+  string(5) "klmno"
+}
+array(1) {
+  [0]=>
+  string(1) "t"
+}
+array(1) {
+  [0]=>
+  string(1) "u"
+}
+array(1) {
+  [0]=>
+  string(1) "v"
+}
+
+Test 1 - prefetch 2
+bool(true)
+array(2) {
+  [0]=>
+  string(1) "1"
+  [1]=>
+  string(5) "abcde"
+}
+array(2) {
+  [0]=>
+  string(1) "2"
+  [1]=>
+  string(5) "fghij"
+}
+array(2) {
+  [0]=>
+  string(1) "3"
+  [1]=>
+  string(5) "klmno"
+}
+array(1) {
+  [0]=>
+  string(1) "t"
+}
+array(1) {
+  [0]=>
+  string(1) "u"
+}
+array(1) {
+  [0]=>
+  string(1) "v"
+}
+===DONE===
index b4a19684a3950588f742386723575c8224945882..59e8fec42ae3850aac3a5b23abc8c0e6f426e30b 100644 (file)
@@ -48,7 +48,7 @@ Warning: oci_bind_by_name() expects at least 3 parameters, 2 given in %s on line
 
 Warning: oci_bind_by_name() expects at least 3 parameters, 1 given in %s on line %d
 
-Warning: oci_execute(): ORA-00932: %s NUMBER %s BLOB in %s on line %d
+Warning: oci_execute(): ORA-00932: %s on line %d
 object(OCI-Lob)#%d (1) {
   ["descriptor"]=>
   resource(%d) of type (oci8 descriptor)
diff --git a/ext/oci8/tests/lob_temp2.phpt b/ext/oci8/tests/lob_temp2.phpt
new file mode 100644 (file)
index 0000000..d774b4d
--- /dev/null
@@ -0,0 +1,40 @@
+--TEST--
+Writing temporary lob before binding
+--SKIPIF--
+<?php
+if (!extension_loaded('oci8')) die ("skip no oci8 extension");
+$target_dbs = array('oracledb' => true, 'timesten' => false);  // test runs on these DBs
+require(dirname(__FILE__).'/skipif.inc');
+?> 
+--FILE--
+<?php
+
+require(dirname(__FILE__).'/connect.inc');
+require(dirname(__FILE__).'/create_table.inc');
+
+$ora_sql = "INSERT INTO ".$schema.$table_name." (clob) VALUES (:v_clob)";
+
+$clob = oci_new_descriptor($c, OCI_D_LOB);
+var_dump($clob->writeTemporary("test"));
+
+$statement = oci_parse($c, $ora_sql);
+oci_bind_by_name($statement, ":v_clob", $clob, -1, OCI_B_CLOB);
+oci_execute($statement, OCI_DEFAULT);
+
+$s = oci_parse($c, "select clob from ". $schema.$table_name);
+oci_execute($s);
+oci_fetch_all($s, $res);
+var_dump($res);
+
+?>
+===DONE===
+--EXPECTF--
+bool(true)
+array(1) {
+  ["CLOB"]=>
+  array(1) {
+    [0]=>
+    string(4) "test"
+  }
+}
+===DONE===
index f6b95ff296168d3e80925218e6f760c9bb21b688..34a19ca693ea598d0d1fc32420775a0cd90bfadf 100644 (file)
@@ -8,12 +8,12 @@ Code coverage for PHP_MINFO_FUNCTION(oci)
 ob_start();
 phpinfo(INFO_MODULES);
 $v = ob_get_clean();
-$r = strpos($v, 'OCI8 Support => enabled');
-var_dump($r);
+$r = preg_match('/OCI8 Support .* enabled/', $v);
+if ($r !== 1)
+    var_dump($r);
 
 echo "Done\n";
 
 ?>
 --EXPECTF--
-int(%d)
 Done
index 1738702cb66242d6c854b7ee5935e989e971b11f..8ea81d3fc0e0f60c3ae7660b88332794841266fa 100644 (file)
@@ -14,28 +14,28 @@ if ($test_drcp) die("skip password change not supported in DRCP Mode");
 require(dirname(__FILE__)."/connect.inc");
 
 $stmtarray = array(
-       "drop user testuser cascade",
-       "create user testuser identified by testuserpwd",
-    "grant connect, create session to testuser"
+       "drop user testuser_pw cascade",
+       "create user testuser_pw identified by testuserpwd",
+    "grant connect, create session to testuser_pw"
 );
 
 oci8_test_sql_execute($c, $stmtarray);
 
 
 // Connect and change the password
-$c1 = oci_connect("testuser", "testuserpwd", $dbase);
+$c1 = oci_connect("testuser_pw", "testuserpwd", $dbase);
 var_dump($c1);
 $rn1 = (int)$c1;
 
-oci_password_change($c1, "testuser", "testuserpwd", "testuserpwd2");
+oci_password_change($c1, "testuser_pw", "testuserpwd", "testuserpwd2");
 
 // Second connect should return a new resource because the hash string will be different from $c1
-$c2 = oci_connect("testuser", "testuserpwd2", $dbase);
+$c2 = oci_connect("testuser_pw", "testuserpwd2", $dbase);
 var_dump($c2);
 $rn2 = (int)$c2;
 
 // Despite using the old password this connect should succeed and return the original resource
-$c3 = oci_connect("testuser", "testuserpwd", $dbase);  
+$c3 = oci_connect("testuser_pw", "testuserpwd", $dbase);  
 var_dump($c3);
 $rn3 = (int)$c3;
 
@@ -67,7 +67,7 @@ echo "Done\n";
 require(dirname(__FILE__)."/connect.inc");
 
 $stmtarray = array(
-    "drop user testuser cascade"
+    "drop user testuser_pw cascade"
 );
 
 oci8_test_sql_execute($c, $stmtarray);
index ceba0bba80d9c0bf59aae8ee706f520b5fbcaf64..13da9ff7b269f9c3787feed300c6cffa378956f4 100644 (file)
@@ -14,27 +14,27 @@ if ($test_drcp) die("skip password change not supported in DRCP Mode");
 require(dirname(__FILE__)."/connect.inc");
 
 $stmtarray = array(
-       "drop user testuser cascade",
-    "create user testuser identified by testuserpwd",
-    "grant connect, create session to testuser"
+       "drop user testuser_pw2 cascade",
+    "create user testuser_pw2 identified by testuserpwd",
+    "grant connect, create session to testuser_pw2"
 );
 
 oci8_test_sql_execute($c, $stmtarray);
 
 // Connect (persistent) and change the password
-$c1 = oci_pconnect("testuser", "testuserpwd", $dbase);
+$c1 = oci_pconnect("testuser_pw2", "testuserpwd", $dbase);
 var_dump($c1);
 $rn1 = (int)$c1;
 
-oci_password_change($c1, "testuser", "testuserpwd", "testuserpwd2");
+oci_password_change($c1, "testuser_pw2", "testuserpwd", "testuserpwd2");
 
 // Second connect should return a new resource because the hash string will be different from $c1
-$c2 = oci_pconnect("testuser", "testuserpwd2", $dbase);
+$c2 = oci_pconnect("testuser_pw2", "testuserpwd2", $dbase);
 var_dump($c2);
 $rn2 = (int)$c2;
 
 // Despite using the old password this connect should succeed and return the original resource
-$c3 = oci_pconnect("testuser", "testuserpwd", $dbase);  
+$c3 = oci_pconnect("testuser_pw2", "testuserpwd", $dbase);  
 var_dump($c3);
 $rn3 = (int)$c3;
 
@@ -66,7 +66,7 @@ echo "Done\n";
 require(dirname(__FILE__)."/connect.inc");
 
 $stmtarray = array(
-    "drop user testuser cascade"
+    "drop user testuser_pw2 cascade"
 );
 
 oci8_test_sql_execute($c, $stmtarray);
index c218d904fa2daef39504985178405a00b0095b08..2c66dd94ab7dcb2fe608c15e4a754a8bf64bbbb4 100644 (file)
@@ -3,15 +3,27 @@ oci_password_change()
 --SKIPIF--
 <?php
 $target_dbs = array('oracledb' => true, 'timesten' => false);  // test runs on thes
-require(dirname(__FILE__).'/skipif.inc');
+require(dirname(__FILE__).'/connect.inc');
 if (empty($dbase)) die ("skip requires database connection string be set");
 if ($test_drcp) die("skip password change not supported in DRCP Mode");
 
-// This test is known to fail with Oracle 10.2.0.4 client libraries
-// connecting to Oracle Database 11 (Oracle bug 6277160, fixed 10.2.0.5)
-if (preg_match('/Release (11|12)\./', oci_server_version($c), $matches) === 1 &&
-    preg_match('/^10\.2\.0\.[1234]/', oci_client_version()) === 1) {
-    die ("skip test known to fail using Oracle 10.2.0.4 client libs connecting to Oracle 11 (6277160)");
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches_sv);
+if (isset($matches_sv[1]) && $matches_sv[1] >= 11) {
+    preg_match('/([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)/', oci_client_version(), $matches);
+    if (isset($matches[0]) && $matches[1] == 10 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] < 5) { 
+        die ("skip test known to fail using Oracle 10.2.0.4 client libs connecting to Oracle 11 (6277160)");
+    }
+}
+
+// This test in Oracle 12c needs a non-CDB or the root container
+if (isset($matches_sv[1]) && $matches_sv[1] >= 12) {
+    $s = oci_parse($c, "select nvl(sys_context('userenv', 'con_name'), 'notacdb') as dbtype from dual");
+    $r = @oci_execute($s);
+    if (!$r)
+        die('skip could not identify container type');
+    $r = oci_fetch_array($s);
+    if ($r['DBTYPE'] !== 'CDB$ROOT')
+        die('skip cannot run test using a PDB');
 }
 ?>
 --FILE--
index fdbb1f9e892323b783dceccd60a12521c5fbfbee..2e186528e3d9a371fb5ac0887f93caf51ed66c48 100644 (file)
@@ -3,18 +3,28 @@ ocipasswordchange()
 --SKIPIF--
 <?php
 $target_dbs = array('oracledb' => true, 'timesten' => false);  // test runs on thes
-require(dirname(__FILE__).'/skipif.inc');
+require(dirname(__FILE__).'/connect.inc');
 if (empty($dbase)) die ("skip requires database connection string be set");
 if ($test_drcp) die("skip password change not supported in DRCP Mode");
 
-// This test is known to fail with Oracle 10.2.0.4 client libraries
-// connecting to Oracle Database 11 (Oracle bug 6277160, fixed 10.2.0.5)
-if (preg_match('/Release (11|12)\./', oci_server_version($c), $matches) === 1 &&
-    preg_match('/^10\.2\.0\.[1234]/', oci_client_version()) === 1) {
-    die ("skip test known to fail using Oracle 10.2.0.4 client libs connecting to Oracle 11 (6277160)");
+preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches_sv);
+if (isset($matches_sv[1]) && $matches_sv[1] >= 11) {
+    preg_match('/([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)/', oci_client_version(), $matches);
+    if (isset($matches[0]) && $matches[1] == 10 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] < 5) { 
+        die ("skip test known to fail using Oracle 10.2.0.4 client libs connecting to Oracle 11 (6277160)");
+    }
 }
 
-
+// This test in Oracle 12c needs a non-CDB or the root container
+if (isset($matches_sv[1]) && $matches_sv[1] >= 12) {
+    $s = oci_parse($c, "select nvl(sys_context('userenv', 'con_name'), 'notacdb') as dbtype from dual");
+    $r = @oci_execute($s);
+    if (!$r)
+        die('skip could not identify container type');
+    $r = oci_fetch_array($s);
+    if ($r['DBTYPE'] !== 'CDB$ROOT')
+        die('skip cannot run test using a PDB');
+}
 ?>
 --FILE--
 <?php
index 8c0414042b0fca644b27fe99186c01e1884f3551..974864cbd90e74f1b7235adf8005a936cbd6604e 100644 (file)
@@ -86,52 +86,52 @@ Test with Nested Cursors
 Fetch Row using Nested cursor Query
 array(1) {
   [0]=>
-  %unicode|string%(%d) "test0"
+  string(%d) "test0"
 }
 Fetch Row using Nested cursor Query
 array(1) {
   [0]=>
-  %unicode|string%(%d) "test1"
+  string(%d) "test1"
 }
 Fetch Row using Nested cursor Query
 array(1) {
   [0]=>
-  %unicode|string%(%d) "test2"
+  string(%d) "test2"
 }
 Fetch Row using Nested cursor Query
 array(1) {
   [0]=>
-  %unicode|string%(%d) "test3"
+  string(%d) "test3"
 }
 Fetch Row using Nested cursor Query
 array(1) {
   [0]=>
-  %unicode|string%(%d) "test4"
+  string(%d) "test4"
 }
 Fetch Row using Nested cursor Query
 array(1) {
   [0]=>
-  %unicode|string%(%d) "test5"
+  string(%d) "test5"
 }
 Fetch Row using Nested cursor Query
 array(1) {
   [0]=>
-  %unicode|string%(%d) "test6"
+  string(%d) "test6"
 }
 Fetch Row using Nested cursor Query
 array(1) {
   [0]=>
-  %unicode|string%(%d) "test7"
+  string(%d) "test7"
 }
 Fetch Row using Nested cursor Query
 array(1) {
   [0]=>
-  %unicode|string%(%d) "test8"
+  string(%d) "test8"
 }
 Fetch Row using Nested cursor Query
 array(1) {
   [0]=>
-  %unicode|string%(%d) "test9"
+  string(%d) "test9"
 }
 Number of roundtrips made with prefetch count 5 for 10 rows is  3
 Done
index 5f2e73d80bde4f70f15ad3a54a9270c3553a11b2..f76d7261aa78ef10985395eb73e6b95fc5da2c85 100644 (file)
@@ -126,6 +126,7 @@ reflection::export(new reflectionfunction('oci_set_module_name'));
 reflection::export(new reflectionfunction('oci_set_action'));
 reflection::export(new reflectionfunction('oci_set_client_info'));
 reflection::export(new reflectionfunction('oci_set_client_identifier'));
+reflection::export(new reflectionfunction('oci_get_implicit_resultset'));
 
 ?>
 ===DONE===
@@ -1093,4 +1094,11 @@ Function [ <internal%s> function oci_set_client_identifier ] {
   }
 }
 
+Function [ <internal%s> function oci_get_implicit_resultset ] {
+
+  - Parameters [1] {
+    Parameter #0 [ <required> $statement_resource ]
+  }
+}
+
 ===DONE===