This adds a new attribute PDO::DBLIB_ATTR_SKIP_EMPTY_ROWSETS to enable automatic
skipping of empty rowsets.
This happens with some SQL commands (like PRINT or SET): a rowset with 0 columns
is returned by the driver.
With this option enabled, 0 columns rowsets are automatically skipped, mirroring
the behavior of the deprecated mssql extension.
Credits go to MiRacLe-RPZ for developping and promoting this patch.
. Removed support for ODBCRouter. (Kalle)
. Removed support for Birdstep. (Kalle)
+- PDO_DBlib:
+ . Implemented request #69592 (allow 0-column rowsets to be skipped
+ automatically). (fandrieu)
+
- PDO_OCI:
. Fixed bug #74631 (PDO_PCO with PHP-FPM: OCI environment initialized
before PHP-FPM sets it up). (Ingmar Runge)
case PDO_DBLIB_ATTR_STRINGIFY_UNIQUEIDENTIFIER:
H->stringify_uniqueidentifier = zval_get_long(val);
return 1;
+ case PDO_DBLIB_ATTR_SKIP_EMPTY_ROWSETS:
+ H->skip_empty_rowsets = zval_is_true(val);
+ return 1;
default:
return 0;
}
ZVAL_STRING(return_value, dbversion());
break;
+ case PDO_DBLIB_ATTR_SKIP_EMPTY_ROWSETS:
+ ZVAL_BOOL(return_value, H->skip_empty_rowsets);
+ break;
+
default:
return 0;
}
H->err.sqlstate = dbh->error_code;
H->assume_national_character_set_strings = 0;
H->stringify_uniqueidentifier = 0;
+ H->skip_empty_rowsets = 0;
if (!H->login) {
goto cleanup;
H->assume_national_character_set_strings = pdo_attr_lval(driver_options, PDO_ATTR_DEFAULT_STR_PARAM, 0) == PDO_PARAM_STR_NATL ? 1 : 0;
H->stringify_uniqueidentifier = pdo_attr_lval(driver_options, PDO_DBLIB_ATTR_STRINGIFY_UNIQUEIDENTIFIER, 0);
+ H->skip_empty_rowsets = pdo_attr_lval(driver_options, PDO_DBLIB_ATTR_SKIP_EMPTY_ROWSETS, 0);
}
DBERRHANDLE(H->login, (EHANDLEFUNC) pdo_dblib_error_handler);
pdo_dblib_stmt *S = (pdo_dblib_stmt*)stmt->driver_data;
pdo_dblib_db_handle *H = S->H;
RETCODE ret;
+ int num_fields;
+
+ do {
+ ret = dbresults(H->link);
+ num_fields = dbnumcols(H->link);
+ } while (H->skip_empty_rowsets && num_fields <= 0 && ret == SUCCEED);
- ret = dbresults(H->link);
if (FAIL == ret) {
pdo_raise_impl_error(stmt->dbh, stmt, "HY000", "PDO_DBLIB: dbresults() returned FAIL");
return 0;
}
- if(NO_MORE_RESULTS == ret) {
+ if (NO_MORE_RESULTS == ret) {
+ return 0;
+ }
+
+ if (H->skip_empty_rowsets && num_fields <= 0) {
return 0;
}
stmt->row_count = DBCOUNT(H->link);
- stmt->column_count = dbnumcols(H->link);
+ stmt->column_count = num_fields;
return 1;
}
REGISTER_PDO_CLASS_CONST_LONG("DBLIB_ATTR_QUERY_TIMEOUT", (long) PDO_DBLIB_ATTR_QUERY_TIMEOUT);
REGISTER_PDO_CLASS_CONST_LONG("DBLIB_ATTR_STRINGIFY_UNIQUEIDENTIFIER", (long) PDO_DBLIB_ATTR_STRINGIFY_UNIQUEIDENTIFIER);
REGISTER_PDO_CLASS_CONST_LONG("DBLIB_ATTR_VERSION", (long) PDO_DBLIB_ATTR_VERSION);
+ REGISTER_PDO_CLASS_CONST_LONG("DBLIB_ATTR_SKIP_EMPTY_ROWSETS", (long) PDO_DBLIB_ATTR_SKIP_EMPTY_ROWSETS);
if (FAIL == dbinit()) {
return FAILURE;
pdo_dblib_err err;
unsigned assume_national_character_set_strings:1;
unsigned stringify_uniqueidentifier:1;
+ unsigned skip_empty_rowsets:1;
} pdo_dblib_db_handle;
typedef struct {
PDO_DBLIB_ATTR_QUERY_TIMEOUT,
PDO_DBLIB_ATTR_STRINGIFY_UNIQUEIDENTIFIER,
PDO_DBLIB_ATTR_VERSION,
+ PDO_DBLIB_ATTR_SKIP_EMPTY_ROWSETS,
};
#endif
--- /dev/null
+--TEST--
+PDO_DBLIB: PDO::DBLIB_ATTR_SKIP_EMPTY_ROWSETS for skip junk resultsets on SET NOCOUNT expression
+--SKIPIF--
+<?php
+if (!extension_loaded('pdo_dblib')) die('skip not loaded');
+require dirname(__FILE__) . '/config.inc';
+?>
+--FILE--
+<?php
+require dirname(__FILE__) . '/config.inc';
+
+$sql = '
+ SET NOCOUNT ON
+ SELECT 0 AS [result]
+';
+
+var_dump($db->getAttribute(PDO::DBLIB_ATTR_SKIP_EMPTY_ROWSETS));
+
+$stmt = $db->query($sql);
+var_dump($stmt->fetchAll(PDO::FETCH_ASSOC));
+var_dump($stmt->nextRowset());
+var_dump($stmt->fetchAll(PDO::FETCH_ASSOC));
+$stmt->closeCursor();
+
+
+$db->setAttribute(PDO::DBLIB_ATTR_SKIP_EMPTY_ROWSETS, true);
+var_dump($db->getAttribute(PDO::DBLIB_ATTR_SKIP_EMPTY_ROWSETS));
+
+$stmt = $db->query($sql);
+var_dump($stmt->fetchAll(PDO::FETCH_ASSOC));
+var_dump($stmt->nextRowset());
+var_dump($stmt->fetchAll(PDO::FETCH_ASSOC));
+$stmt->closeCursor();
+var_dump($db->getAttribute(PDO::DBLIB_ATTR_SKIP_EMPTY_ROWSETS));
+
+?>
+--EXPECT--
+bool(false)
+array(0) {
+}
+bool(true)
+array(1) {
+ [0]=>
+ array(1) {
+ ["result"]=>
+ int(0)
+ }
+}
+bool(true)
+array(1) {
+ [0]=>
+ array(1) {
+ ["result"]=>
+ int(0)
+ }
+}
+bool(false)
+array(0) {
+}
+bool(true)