aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--odb/mssql/statement.cxx68
-rw-r--r--odb/mssql/statement.hxx1
-rw-r--r--odb/mssql/version.hxx6
-rw-r--r--odb/mssql/view-statements.hxx4
-rw-r--r--version2
5 files changed, 63 insertions, 18 deletions
diff --git a/odb/mssql/statement.cxx b/odb/mssql/statement.cxx
index 695d97a..6136cf3 100644
--- a/odb/mssql/statement.cxx
+++ b/odb/mssql/statement.cxx
@@ -999,23 +999,58 @@ namespace odb
{
SQLRETURN r (statement::execute ());
- if (!SQL_SUCCEEDED (r))
- translate_error (r, conn_, stmt_);
+ // Skip empty result sets that seem to be added as a result of
+ // executing DML statements in stored procedures (e.g., INSERT
+ // INTO EXEC).
+ //
+ if (r == SQL_NO_DATA)
+ {
+ r = SQLMoreResults (stmt_);
-#ifndef NDEBUG
- SQLSMALLINT cols;
- r = SQLNumResultCols (stmt_, &cols);
+ if (r == SQL_NO_DATA)
+ {
+ throw database_exception (
+ 0,
+ "?????",
+ "another result set expected after SQL_NO_DATA");
+ }
+ }
if (!SQL_SUCCEEDED (r))
translate_error (r, conn_, stmt_);
+ // Skip result sets that have no columns. These seem to be added
+ // by DML statements that don't produce any result (e.g., EXEC).
+ //
+ for (columns_ = 0; columns_ == 0;)
+ {
+ {
+ SQLSMALLINT c;
+ r = SQLNumResultCols (stmt_, &c);
+
+ if (!SQL_SUCCEEDED (r))
+ translate_error (r, conn_, stmt_);
+
+ columns_ = static_cast<SQLUSMALLINT> (c);
+ }
+
+ if (columns_ == 0)
+ {
+ r = SQLMoreResults (stmt_);
+
+ if (r == SQL_NO_DATA)
+ break;
+ else if (!SQL_SUCCEEDED (r))
+ translate_error (r, conn_, stmt_);
+ }
+ }
+
// Make sure that the number of columns in the result returned by
// the database matches the number that we expect. A common cause
// of this assertion is a native view with a number of data members
// not matching the number of columns in the SELECT-list.
//
- assert (static_cast<SQLUSMALLINT> (cols) == result_count_ + long_count_);
-#endif
+ assert (columns_ == result_count_ + long_count_);
}
select_statement::result select_statement::
@@ -1026,15 +1061,22 @@ namespace odb
if (cc != 0 && cc->callback != 0)
(cc->callback) (cc->context);
- SQLRETURN r (SQLFetch (stmt_));
-
- if (r == SQL_NO_DATA)
+ // Don't bother calling SQLFetch() if there are no columns.
+ //
+ if (columns_ == 0)
return no_data;
+ else
+ {
+ SQLRETURN r (SQLFetch (stmt_));
- if (!SQL_SUCCEEDED (r))
- translate_error (r, conn_, stmt_);
+ if (r == SQL_NO_DATA)
+ return no_data;
- return success;
+ if (!SQL_SUCCEEDED (r))
+ translate_error (r, conn_, stmt_);
+
+ return success;
+ }
}
void select_statement::
diff --git a/odb/mssql/statement.hxx b/odb/mssql/statement.hxx
index 516baed..4ed279d 100644
--- a/odb/mssql/statement.hxx
+++ b/odb/mssql/statement.hxx
@@ -258,6 +258,7 @@ namespace odb
binding& result_;
SQLUSMALLINT result_count_; // Actual number of columns bound.
SQLUSMALLINT long_count_; // Number of long data columns.
+ SQLUSMALLINT columns_; // Number of columns in result set.
};
struct LIBODB_MSSQL_EXPORT auto_result
diff --git a/odb/mssql/version.hxx b/odb/mssql/version.hxx
index 1ff4ab8..4c9b71b 100644
--- a/odb/mssql/version.hxx
+++ b/odb/mssql/version.hxx
@@ -29,15 +29,15 @@
// Check that we have compatible ODB version.
//
-#if ODB_VERSION != 20303
+#if ODB_VERSION != 20304
# error incompatible odb interface version detected
#endif
// libodb-mssql version: odb interface version plus the bugfix
// version.
//
-#define LIBODB_MSSQL_VERSION 2039903
-#define LIBODB_MSSQL_VERSION_STR "2.4.0.a3"
+#define LIBODB_MSSQL_VERSION 2039904
+#define LIBODB_MSSQL_VERSION_STR "2.4.0.a4"
#include <odb/post.hxx>
diff --git a/odb/mssql/view-statements.hxx b/odb/mssql/view-statements.hxx
index beb8d62..7a315a9 100644
--- a/odb/mssql/view-statements.hxx
+++ b/odb/mssql/view-statements.hxx
@@ -70,7 +70,9 @@ namespace odb
image_type image_;
std::size_t image_version_;
binding image_binding_;
- bind image_bind_[view_traits::column_count];
+ bind image_bind_[view_traits::column_count != 0
+ ? view_traits::column_count
+ : 1];
};
}
}
diff --git a/version b/version
index 26d9ac3..42645da 100644
--- a/version
+++ b/version
@@ -1 +1 @@
-2.4.0.a3
+2.4.0.a4