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