A fix and a test case for Bug#24179 "select b into $var" fails with
--cursor_protocol": fix a misleading error message in case of SELECT .. INTO. sql/sql_class.cc: Implement select_result::check_simple_select hierarchy to support correct error messages in case of SELECT .. INTO and C API cursors. sql/sql_class.h: Set the error message inside the function that checks for the error condition (simple_select, renamed to check_simple_select). sql/sql_prepare.cc: Use a new method that now sets the error. tests/mysql_client_test.c: Add a test case for Bug#24179 "select b into $var" fails with --cursor_protocol" (check for the right error message and error code).
This commit is contained in:
parent
4ec847218d
commit
fe84b016e1
@ -885,6 +885,13 @@ void select_result::cleanup()
|
|||||||
/* do nothing */
|
/* do nothing */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool select_result::check_simple_select() const
|
||||||
|
{
|
||||||
|
my_error(ER_SP_BAD_CURSOR_QUERY, MYF(0));
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static String default_line_term("\n",default_charset_info);
|
static String default_line_term("\n",default_charset_info);
|
||||||
static String default_escaped("\\",default_charset_info);
|
static String default_escaped("\\",default_charset_info);
|
||||||
static String default_field_term("\t",default_charset_info);
|
static String default_field_term("\t",default_charset_info);
|
||||||
@ -1553,6 +1560,13 @@ int select_dumpvar::prepare(List<Item> &list, SELECT_LEX_UNIT *u)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool select_dumpvar::check_simple_select() const
|
||||||
|
{
|
||||||
|
my_error(ER_SP_BAD_CURSOR_SELECT, MYF(0));
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void select_dumpvar::cleanup()
|
void select_dumpvar::cleanup()
|
||||||
{
|
{
|
||||||
vars.empty();
|
vars.empty();
|
||||||
|
@ -1724,7 +1724,14 @@ public:
|
|||||||
virtual bool initialize_tables (JOIN *join=0) { return 0; }
|
virtual bool initialize_tables (JOIN *join=0) { return 0; }
|
||||||
virtual void send_error(uint errcode,const char *err);
|
virtual void send_error(uint errcode,const char *err);
|
||||||
virtual bool send_eof()=0;
|
virtual bool send_eof()=0;
|
||||||
virtual bool simple_select() { return 0; }
|
/**
|
||||||
|
Check if this query returns a result set and therefore is allowed in
|
||||||
|
cursors and set an error message if it is not the case.
|
||||||
|
|
||||||
|
@retval FALSE success
|
||||||
|
@retval TRUE error, an error message is set
|
||||||
|
*/
|
||||||
|
virtual bool check_simple_select() const;
|
||||||
virtual void abort() {}
|
virtual void abort() {}
|
||||||
/*
|
/*
|
||||||
Cleanup instance of this class for next execution of a prepared
|
Cleanup instance of this class for next execution of a prepared
|
||||||
@ -1762,7 +1769,7 @@ public:
|
|||||||
bool send_fields(List<Item> &list, uint flags);
|
bool send_fields(List<Item> &list, uint flags);
|
||||||
bool send_data(List<Item> &items);
|
bool send_data(List<Item> &items);
|
||||||
bool send_eof();
|
bool send_eof();
|
||||||
bool simple_select() { return 1; }
|
virtual bool check_simple_select() const { return FALSE; }
|
||||||
void abort();
|
void abort();
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -2202,6 +2209,7 @@ public:
|
|||||||
int prepare(List<Item> &list, SELECT_LEX_UNIT *u);
|
int prepare(List<Item> &list, SELECT_LEX_UNIT *u);
|
||||||
bool send_data(List<Item> &items);
|
bool send_data(List<Item> &items);
|
||||||
bool send_eof();
|
bool send_eof();
|
||||||
|
virtual bool check_simple_select() const;
|
||||||
void cleanup();
|
void cleanup();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -2906,10 +2906,9 @@ bool Prepared_statement::execute(String *expanded_query, bool open_cursor)
|
|||||||
in INSERT ... SELECT and similar commands.
|
in INSERT ... SELECT and similar commands.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (open_cursor && lex->result && !lex->result->simple_select())
|
if (open_cursor && lex->result && lex->result->check_simple_select())
|
||||||
{
|
{
|
||||||
DBUG_PRINT("info",("Cursor asked for not SELECT stmt"));
|
DBUG_PRINT("info",("Cursor asked for not SELECT stmt"));
|
||||||
my_error(ER_SP_BAD_CURSOR_QUERY, MYF(0));
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15456,6 +15456,33 @@ static void test_bug21635()
|
|||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Bug#24179 "select b into $var" fails with --cursor_protocol"
|
||||||
|
The failure is correct, check that the returned message is meaningful.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void test_bug24179()
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
MYSQL_STMT *stmt;
|
||||||
|
|
||||||
|
DBUG_ENTER("test_bug24179");
|
||||||
|
myheader("test_bug24179");
|
||||||
|
|
||||||
|
stmt= open_cursor("select 1 into @a");
|
||||||
|
rc= mysql_stmt_execute(stmt);
|
||||||
|
DIE_UNLESS(rc);
|
||||||
|
if (!opt_silent)
|
||||||
|
{
|
||||||
|
printf("Got error (as expected): %d %s\n",
|
||||||
|
mysql_stmt_errno(stmt),
|
||||||
|
mysql_stmt_error(stmt));
|
||||||
|
}
|
||||||
|
DIE_UNLESS(mysql_stmt_errno(stmt) == 1323);
|
||||||
|
|
||||||
|
DBUG_VOID_RETURN;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Read and parse arguments and MySQL options from my.cnf
|
Read and parse arguments and MySQL options from my.cnf
|
||||||
@ -15735,6 +15762,7 @@ static struct my_tests_st my_tests[]= {
|
|||||||
{ "test_bug21726", test_bug21726 },
|
{ "test_bug21726", test_bug21726 },
|
||||||
{ "test_bug23383", test_bug23383 },
|
{ "test_bug23383", test_bug23383 },
|
||||||
{ "test_bug21635", test_bug21635 },
|
{ "test_bug21635", test_bug21635 },
|
||||||
|
{ "test_bug24179", test_bug24179 },
|
||||||
{ 0, 0 }
|
{ 0, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user