Skip to content

Commit

Permalink
Fix GH-282: Mysql's fetch_row() is broken
Browse files Browse the repository at this point in the history
Fix both MySQL and PostgreSQL drivers to return an error when
fetch_row() is called after retrieving all rows in the result set.
  • Loading branch information
akopytov committed Dec 16, 2018
1 parent bb8c3b0 commit b017a99
Show file tree
Hide file tree
Showing 5 changed files with 56 additions and 2 deletions.
4 changes: 3 additions & 1 deletion src/drivers/mysql/drv_mysql.c
Original file line number Diff line number Diff line change
Expand Up @@ -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++)
{
Expand Down
2 changes: 1 addition & 1 deletion src/drivers/pgsql/drv_pgsql.c
Original file line number Diff line number Diff line change
Expand Up @@ -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++)
{
Expand Down
24 changes: 24 additions & 0 deletions tests/include/api_sql_common.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand All @@ -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)")
Expand All @@ -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)")
Expand All @@ -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
14 changes: 14 additions & 0 deletions tests/t/api_sql_mysql.t
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
14 changes: 14 additions & 0 deletions tests/t/api_sql_pgsql.t
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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

0 comments on commit b017a99

Please sign in to comment.