Index: driver/results.c
===================================================================
--- driver/results.c	(Revision 498)
+++ driver/results.c	(Arbeitskopie)
@@ -1154,6 +1154,12 @@
 
     CLEAR_STMT_ERROR( pStmt );
 
+    if (!mysql_more_results(&pStmt->dbc->mysql))
+    {
+      nReturn= SQL_NO_DATA;
+      goto exitSQLMoreResults;
+    }
+
     /* SQLExecute or SQLExecDirect need to be called first */
     if ( pStmt->state != ST_EXECUTED )
     {
@@ -1192,7 +1198,7 @@
     }
 
     /* cleanup existing resultset */
-    nReturn = my_SQLFreeStmt( (SQLHSTMT)pStmt, SQL_CLOSE );
+    nReturn = my_SQLFreeStmtExtended((SQLHSTMT)pStmt,SQL_CLOSE,0);
     if ( !SQL_SUCCEEDED( nReturn ) )
         goto exitSQLMoreResults;
 
@@ -1217,7 +1223,6 @@
         nReturn = set_stmt_error( pStmt, "HY000", mysql_error( &pStmt->dbc->mysql ), mysql_errno( &pStmt->dbc->mysql ) );
         goto exitSQLMoreResults;
     }
-
     MYODBCDbgInfo( "result set columns: %d", pStmt->result->field_count );
     MYODBCDbgInfo( "result set rows: %lld", pStmt->result->row_count );
     fix_result_types( pStmt );
Index: driver/myutil.h
===================================================================
--- driver/myutil.h	(Revision 496)
+++ driver/myutil.h	(Arbeitskopie)
@@ -71,6 +71,8 @@
 SQLRETURN my_SQLPrepare(SQLHSTMT hstmt,SQLCHAR FAR *szSqlStr,
 			SQLINTEGER cbSqlStr);
 SQLRETURN SQL_API my_SQLFreeStmt(SQLHSTMT hstmt,SQLUSMALLINT fOption);
+SQLRETURN SQL_API my_SQLFreeStmtExtended(SQLHSTMT hstmt,
+                    SQLUSMALLINT fOption, uint clearAllResults);
 SQLRETURN SQL_API my_SQLAllocStmt(SQLHDBC hdbc,SQLHSTMT FAR *phstmt);
 SQLRETURN do_query(STMT FAR *stmt,char *query);
 char *insert_params(STMT FAR *stmt);
Index: driver/handle.c
===================================================================
--- driver/handle.c	(Revision 496)
+++ driver/handle.c	(Arbeitskopie)
@@ -391,6 +391,20 @@
 
 SQLRETURN SQL_API my_SQLFreeStmt(SQLHSTMT hstmt,SQLUSMALLINT fOption)
 {
+  MYODBCDbgReturnReturn(my_SQLFreeStmtExtended(hstmt,fOption,1));
+}
+
+/*
+  @type    : myodbc3 internal
+  @purpose : stops processing associated with a specific statement,
+       closes any open cursors associated with the statement,
+       discards pending results, or, optionally, frees all
+       resources associated with the statement handle
+*/
+
+SQLRETURN SQL_API my_SQLFreeStmtExtended(SQLHSTMT hstmt,SQLUSMALLINT fOption,
+                                         uint clearAllResults)
+{
     STMT FAR *stmt= (STMT FAR*) hstmt;
     uint i;
 
@@ -427,12 +441,15 @@
     {
       mysql_free_result(stmt->result);
       /* check if there are more resultsets */
-      while (mysql_more_results(&stmt->dbc->mysql))
+      if (clearAllResults)
       {
-        if (mysql_next_result(&stmt->dbc->mysql) == -1)
+        while (mysql_more_results(&stmt->dbc->mysql))
         {
-          stmt->result= mysql_store_result(&stmt->dbc->mysql);
-          mysql_free_result(stmt->result);
+          if (!mysql_next_result(&stmt->dbc->mysql))
+          {
+            stmt->result= mysql_store_result(&stmt->dbc->mysql);
+            mysql_free_result(stmt->result);
+          }
         }
       }
     }
Index: test/my_result.c
===================================================================
--- test/my_result.c	(Revision 498)
+++ test/my_result.c	(Arbeitskopie)
@@ -1784,6 +1784,38 @@
 }
 
 
+/**
+Bug #16817: ODBC doesn't return multiple resultsets
+*/
+DECLARE_TEST(t_bug16817)
+{
+  SQLCHAR name[30];
+  SQLSMALLINT len;
+  SQLSMALLINT ncol;
+
+  ok_sql(hstmt, "DROP PROCEDURE IF EXISTS p_bug16817");
+  ok_sql(hstmt, "CREATE PROCEDURE p_bug16817 () "
+                "BEGIN "
+                "  SELECT 'Marten' FROM DUAL; "
+                "  SELECT 'Zack' FROM DUAL; "
+               "END");
+
+  ok_sql(hstmt, "CALL p_bug16817()");
+
+  ok_stmt(hstmt, SQLFetch(hstmt));
+  my_assert(!strcmp((const char *)"Marten", my_fetch_str(hstmt,name,1)));
+  ok_stmt(hstmt, SQLMoreResults(hstmt));
+
+  ok_stmt(hstmt, SQLFetch(hstmt));
+  my_assert(!strcmp((const char *)"Zack", my_fetch_str(hstmt,name,1)));
+  ok_stmt(hstmt, SQLMoreResults(hstmt));
+
+  ok_stmt(hstmt, SQLNumResultCols(hstmt,&ncol));
+  my_assert(ncol==0);
+  ok_sql(hstmt, "DROP PROCEDURE p_bug16817");
+}
+
+
 BEGIN_TESTS
   ADD_TEST(my_resultset)
   ADD_TEST(t_convert_type)
@@ -1803,6 +1835,7 @@
   ADD_TEST(tmysql_rowstatus)
   ADD_TEST(t_true_length)
   ADD_TEST(t_bug27544)
+  ADD_TEST(t_bug16817)
   ADD_TEST(bug6157)
 END_TESTS