Skip to content

Commit

Permalink
Fix for CONC-154:
Browse files Browse the repository at this point in the history
  set stmt->state to MYSQL_STMT_FETCH_DONE if
  - result set is empty (nothing to fetch)
  - when madb_stmt_reset was called
  • Loading branch information
9EOR9 committed Jan 25, 2016
1 parent 56b4bde commit 736913d
Show file tree
Hide file tree
Showing 2 changed files with 111 additions and 2 deletions.
9 changes: 7 additions & 2 deletions libmariadb/my_stmt.c
Original file line number Diff line number Diff line change
Expand Up @@ -1377,8 +1377,12 @@ int STDCALL mysql_stmt_store_result(MYSQL_STMT *stmt)

stmt->result_cursor= stmt->result.data;
stmt->fetch_row_func= stmt_buffered_fetch;
stmt->mysql->status= MYSQL_STATUS_READY;
stmt->state= MYSQL_STMT_USE_OR_STORE_CALLED;
stmt->mysql->status= MYSQL_STATUS_READY;

if (!stmt->result.rows)
stmt->state= MYSQL_STMT_FETCH_DONE;
else
stmt->state= MYSQL_STMT_USE_OR_STORE_CALLED;

/* set affected rows: see bug 2247 */
stmt->upsert_status.affected_rows= stmt->result.rows;
Expand Down Expand Up @@ -1643,6 +1647,7 @@ static my_bool madb_reset_stmt(MYSQL_STMT *stmt, unsigned int flags)
stmt->result.rows= 0;
stmt->result_cursor= NULL;
stmt->mysql->status= MYSQL_STATUS_READY;
stmt->state= MYSQL_STMT_FETCH_DONE;
}

/* if there is a pending result set, we will flush it */
Expand Down
104 changes: 104 additions & 0 deletions unittest/libmariadb/ps_bugs.c
Original file line number Diff line number Diff line change
Expand Up @@ -3909,7 +3909,111 @@ static int test_conc141(MYSQL *mysql)
return OK;
}

static int test_conc154(MYSQL *mysql)
{
MYSQL_STMT *stmt;
const char *stmtstr= "SELECT * FROM t1";
int rc;

/* 1st: empty result set without free_result */
rc= mysql_query(mysql, "DROP TABLE IF EXISTS t1");
check_mysql_rc(rc, mysql);
rc= mysql_query(mysql, "CREATE TABLE t1 (a varchar(20))");
check_mysql_rc(rc, mysql);

stmt= mysql_stmt_init(mysql);
rc= mysql_stmt_prepare(stmt, stmtstr, strlen(stmtstr));
check_stmt_rc(rc, stmt);

rc= mysql_stmt_execute(stmt);
check_stmt_rc(rc, stmt);

rc= mysql_stmt_store_result(stmt);
check_stmt_rc(rc, stmt);

rc= mysql_stmt_execute(stmt);
check_stmt_rc(rc, stmt);

rc= mysql_stmt_store_result(stmt);
check_stmt_rc(rc, stmt);

mysql_stmt_close(stmt);

/* 2nd: empty result set with free_result */
stmt= mysql_stmt_init(mysql);
rc= mysql_stmt_prepare(stmt, stmtstr, strlen(stmtstr));
check_stmt_rc(rc, stmt);

rc= mysql_stmt_execute(stmt);
check_stmt_rc(rc, stmt);

rc= mysql_stmt_store_result(stmt);
check_stmt_rc(rc, stmt);

rc= mysql_stmt_free_result(stmt);
check_stmt_rc(rc, stmt);

rc= mysql_stmt_execute(stmt);
check_stmt_rc(rc, stmt);

rc= mysql_stmt_store_result(stmt);
check_stmt_rc(rc, stmt);
rc= mysql_stmt_free_result(stmt);
check_stmt_rc(rc, stmt);

mysql_stmt_close(stmt);

/* 3rd: non empty result without free_result */
rc= mysql_query(mysql, "INSERT INTO t1 VALUES ('test_conc154')");
check_mysql_rc(rc, mysql);

stmt= mysql_stmt_init(mysql);
rc= mysql_stmt_prepare(stmt, stmtstr, strlen(stmtstr));
check_stmt_rc(rc, stmt);

rc= mysql_stmt_execute(stmt);
check_stmt_rc(rc, stmt);

rc= mysql_stmt_store_result(stmt);
check_stmt_rc(rc, stmt);

rc= mysql_stmt_execute(stmt);
check_stmt_rc(rc, stmt);

rc= mysql_stmt_store_result(stmt);
check_stmt_rc(rc, stmt);

mysql_stmt_close(stmt);

/* 4th non empty result set with free_result */
stmt= mysql_stmt_init(mysql);
rc= mysql_stmt_prepare(stmt, stmtstr, strlen(stmtstr));
check_stmt_rc(rc, stmt);

rc= mysql_stmt_execute(stmt);
check_stmt_rc(rc, stmt);

rc= mysql_stmt_store_result(stmt);
check_stmt_rc(rc, stmt);

rc= mysql_stmt_free_result(stmt);
check_stmt_rc(rc, stmt);

rc= mysql_stmt_execute(stmt);
check_stmt_rc(rc, stmt);

rc= mysql_stmt_store_result(stmt);
check_stmt_rc(rc, stmt);
rc= mysql_stmt_free_result(stmt);
check_stmt_rc(rc, stmt);

mysql_stmt_close(stmt);

return OK;
}

struct my_tests_st my_tests[] = {
{"test_conc154", test_conc154, TEST_CONNECTION_DEFAULT, 0, NULL , NULL},
{"test_conc141", test_conc141, TEST_CONNECTION_NEW, 0, NULL , NULL},
{"test_conc67", test_conc67, TEST_CONNECTION_DEFAULT, 0, NULL , NULL},
{"test_conc_5", test_conc_5, TEST_CONNECTION_DEFAULT, 0, NULL , NULL},
Expand Down

0 comments on commit 736913d

Please sign in to comment.