Fix GH-282: Mysql's fetch_row() is broken

Fix both MySQL and PostgreSQL drivers to return an error when
fetch_row() is called after retrieving all rows in the result set.
This commit is contained in:
Alexey Kopytov
2018-12-16 17:21:39 +03:00
parent bb8c3b04c5
commit b017a998ef
5 changed files with 56 additions and 2 deletions

View File

@ -969,8 +969,10 @@ int mysql_drv_fetch_row(db_result_t *rs, db_row_t *row)
DEBUG("mysql_fetch_row(%p) = %p", rs->ptr, my_row);
unsigned long *lengths = mysql_fetch_lengths(rs->ptr);
DEBUG("mysql_fetch_lengths(%p) = %p", rs->ptr, lengths);
if (lengths == NULL)
return DB_ERROR_NONE;
return DB_ERROR_IGNORABLE;
for (size_t i = 0; i < rs->nfields; i++)
{

View File

@ -721,7 +721,7 @@ int pgsql_drv_fetch_row(db_result_t *rs, db_row_t *row)
*/
rownum = (intptr_t) row->ptr;
if (rownum >= (int) rs->nrows)
return DB_ERROR_NONE;
return DB_ERROR_IGNORABLE;
for (i = 0; i < (int) rs->nfields; i++)
{

View File

@ -181,9 +181,11 @@ EOF
sysbench $SB_ARGS run
cat <<EOF
########################################################################
# Multiple connections test
########################################################################
EOF
cat >$CRAMTMP/api_sql.lua <<EOF
function thread_init()
drv = sysbench.sql.driver()
@ -209,9 +211,11 @@ EOF
sysbench $SB_ARGS run
cat <<EOF
########################################################################
# Incorrect bulk API usage
########################################################################
EOF
cat >$CRAMTMP/api_sql.lua <<EOF
c = sysbench.sql.driver():connect()
c:query("CREATE TABLE t1(a INT)")
@ -226,9 +230,11 @@ EOF
sysbench $SB_ARGS
cat <<EOF
########################################################################
# query_row() with an empty result set
########################################################################
EOF
cat >$CRAMTMP/api_sql.lua <<EOF
c = sysbench.sql.driver():connect()
c:query("CREATE TABLE t1(a INT)")
@ -237,3 +243,21 @@ c:query("DROP TABLE t1")
EOF
sysbench $SB_ARGS
cat <<EOF
########################################################################
# GH-282: Mysql's fetch_row() is broken
########################################################################
EOF
cat >$CRAMTMP/api_sql.lua <<EOF
connection = sysbench.sql.driver():connect()
rows = connection:query("select 1 union select 2")
r = rows:fetch_row();
while ( r ) do
print( r[ 1 ] )
r = rows:fetch_row()
end
EOF
sysbench $SB_ARGS

View File

@ -102,6 +102,9 @@ SQL Lua API + MySQL tests
}
*/api_sql.lua:*: SQL error, errno = 1051, state = '42S02': Unknown table '*t' (glob)
--
########################################################################
# Multiple connections test
########################################################################
1
2
3
@ -112,6 +115,17 @@ SQL Lua API + MySQL tests
8
9
10
########################################################################
# Incorrect bulk API usage
########################################################################
ALERT: attempt to call bulk_insert_next() before bulk_insert_init()
*/api_sql.lua:*: db_bulk_insert_next() failed (glob)
########################################################################
# query_row() with an empty result set
########################################################################
nil
########################################################################
# GH-282: Mysql's fetch_row() is broken
########################################################################
1
2

View File

@ -108,6 +108,9 @@ SQL Lua API + PostgreSQL tests
}
*/api_sql.lua:*: SQL error, errno = 0, state = '42P01': table "t" does not exist (glob)
--
########################################################################
# Multiple connections test
########################################################################
1
2
3
@ -118,6 +121,17 @@ SQL Lua API + PostgreSQL tests
8
9
10
########################################################################
# Incorrect bulk API usage
########################################################################
ALERT: attempt to call bulk_insert_next() before bulk_insert_init()
*/api_sql.lua:*: db_bulk_insert_next() failed (glob)
########################################################################
# query_row() with an empty result set
########################################################################
nil
########################################################################
# GH-282: Mysql's fetch_row() is broken
########################################################################
1
2