Details
Description
Initially reported at Maria-discuss (https://lists.launchpad.net/maria-discuss/msg00986.html)
Paul J Stevens wrote:
MariaDB appears to
mess up the server cursor when a blob is in the result.I'm attaching a test-case and with a schema and data for you to use.
libzdb uses mysql_stmt_fetch to move the server cursor forward. This has
worked flawlessly until now for MySQL, SQLite, PostgreSQL and Oracle.
With MariaDB we seem to hit a problem as soon as a blob column is in the columns.
The original test case by Paul can be found in the mailing list.
Here is a testcase without libzdb. It uses the same dataset and query, only simplified ones.
#include <my_global.h>
|
#include <mysql.h>
|
|
int main(int argc, char **argv)
|
{
|
MYSQL *con = mysql_init(NULL);
|
MYSQL_STMT *stmt = mysql_stmt_init(con);
|
MYSQL_BIND bind[2];
|
unsigned long length[2];
|
int int_data;
|
my_bool is_null[2];
|
my_bool error[2];
|
char str_data[2048];
|
|
if (con == NULL)
|
{
|
fprintf(stderr, "%s\n", mysql_error(con));
|
exit(1);
|
}
|
|
if (mysql_real_connect(con, "127.0.0.1", "root", "",
|
"test", 0, NULL, 0) == NULL)
|
{
|
fprintf(stderr, "%s\n", mysql_error(con));
|
mysql_close(con);
|
exit(1);
|
}
|
|
if (mysql_query(con,
|
"DROP TABLE IF EXISTS dbmail_mimeparts"))
|
{
|
fprintf(stderr, "%s\n", mysql_error(con));
|
mysql_close(con);
|
exit(1);
|
}
|
|
if (mysql_query(con,
|
"CREATE TABLE dbmail_mimeparts ( "
|
"id bigint(20), "
|
"data longblob NOT NULL "
|
") ENGINE=InnoDB"))
|
{
|
fprintf(stderr, "%s\n", mysql_error(con));
|
mysql_close(con);
|
exit(1);
|
}
|
|
if (mysql_query(con,
|
"INSERT INTO `dbmail_mimeparts` VALUES "
|
"(62,REPEAT('b',89)),"
|
"(63,REPEAT('c',1251)),"
|
"(64,REPEAT('d',1355)),"
|
"(69,REPEAT('f',907)),"
|
"(72,REPEAT('h',1355))"))
|
{
|
fprintf(stderr, "%s\n", mysql_error(con));
|
mysql_close(con);
|
exit(1);
|
}
|
|
if (mysql_query(con,
|
"DROP TABLE IF EXISTS dbmail_partlists"))
|
{
|
fprintf(stderr, "%s\n", mysql_error(con));
|
mysql_close(con);
|
exit(1);
|
}
|
|
if (mysql_query(con,
|
"CREATE TABLE dbmail_partlists ("
|
"part smallint(6), "
|
"part_id bigint(20) "
|
") ENGINE=InnoDB"))
|
{
|
fprintf(stderr, "%s\n", mysql_error(con));
|
mysql_close(con);
|
exit(1);
|
}
|
|
if (mysql_query(con,
|
"INSERT INTO dbmail_partlists VALUES "
|
"(4,63),(5,64),(9,69),(11,64),(12,72),(15,62)"))
|
{
|
fprintf(stderr, "%s\n", mysql_error(con));
|
mysql_close(con);
|
exit(1);
|
}
|
|
if (mysql_stmt_prepare(stmt,
|
"SELECT l.part,p.data "
|
"from dbmail_mimeparts p "
|
"join dbmail_partlists l on p.id=l.part_id "
|
"order by l.part", 102))
|
{
|
fprintf(stderr, "%s\n", mysql_error(con));
|
mysql_close(con);
|
exit(1);
|
}
|
|
unsigned long cursor = CURSOR_TYPE_READ_ONLY;
|
mysql_stmt_attr_set(stmt, STMT_ATTR_CURSOR_TYPE, &cursor);
|
|
if (mysql_stmt_execute(stmt))
|
{
|
fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
|
exit(1);
|
}
|
|
bind[0].buffer_type= MYSQL_TYPE_LONG;
|
bind[0].buffer= (char *)&int_data;
|
bind[0].buffer_length= 64;
|
bind[0].is_null= &is_null[0];
|
bind[0].length= &length[0];
|
bind[0].error= &error[0];
|
|
bind[1].buffer_type= MYSQL_TYPE_STRING;
|
bind[1].buffer= (char *)str_data;
|
bind[1].buffer_length= 2048;
|
bind[1].is_null= &is_null[1];
|
bind[1].length= &length[1];
|
bind[1].error= &error[1];
|
|
if (mysql_stmt_bind_result(stmt, bind))
|
{
|
fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
|
exit(1);
|
}
|
|
while (!mysql_stmt_fetch(stmt))
|
{
|
fprintf(stdout, " part: %d\n", int_data);
|
if (mysql_stmt_bind_result(stmt, bind))
|
{
|
fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
|
exit(1);
|
}
|
}
|
|
mysql_close(con);
|
exit(0);
|
}
|
|
It returns
part: 4
|
part: 5
|
part: 9
|
part: 11
|
part: 15
|
part: 12
|
which is obviously a wrong order.
Attachments
Issue Links
- relates to
-
MDEV-5007 wrong order by moving from mysql to mariadb
- Closed
- links to