summaryrefslogtreecommitdiff
path: root/sql/sql_prepare.cc
diff options
context:
space:
mode:
authorunknown <konstantin@mysql.com>2005-05-12 11:17:38 +0400
committerunknown <konstantin@mysql.com>2005-05-12 11:17:38 +0400
commitc572e469802943af9b30cdf1ab1908dd0d61be5d (patch)
tree08c5712e45f98e250d4ac3ccc9822ec892ce74e3 /sql/sql_prepare.cc
parent623444963e932c13f685eb3296282687cc8f5d20 (diff)
parent2a8556f32deb10ecf2b1f857a1038330b38af53f (diff)
downloadmariadb-git-c572e469802943af9b30cdf1ab1908dd0d61be5d.tar.gz
Merge bk-internal.mysql.com:/home/bk/mysql-5.0
into mysql.com:/media/sda1/mysql/mysql-5.0-9478 sql/sql_prepare.cc: Auto merged sql/sql_select.cc: Auto merged
Diffstat (limited to 'sql/sql_prepare.cc')
-rw-r--r--sql/sql_prepare.cc27
1 files changed, 20 insertions, 7 deletions
diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc
index 022eb272f7c..b36d835a80a 100644
--- a/sql/sql_prepare.cc
+++ b/sql/sql_prepare.cc
@@ -135,7 +135,8 @@ find_prepared_statement(THD *thd, ulong id, const char *where)
if (stmt == 0 || stmt->type() != Item_arena::PREPARED_STATEMENT)
{
char llbuf[22];
- my_error(ER_UNKNOWN_STMT_HANDLER, MYF(0), 22, llstr(id, llbuf), where);
+ my_error(ER_UNKNOWN_STMT_HANDLER, MYF(0), sizeof(llbuf), llstr(id, llbuf),
+ where);
return 0;
}
return (Prepared_statement *) stmt;
@@ -1965,7 +1966,7 @@ void mysql_stmt_execute(THD *thd, char *packet, uint packet_length)
{
ulong stmt_id= uint4korr(packet);
ulong flags= (ulong) ((uchar) packet[4]);
- Cursor *cursor= 0;
+ Cursor *cursor;
/*
Query text for binary log, or empty string if the query is not put into
binary log.
@@ -1991,6 +1992,13 @@ void mysql_stmt_execute(THD *thd, char *packet, uint packet_length)
DBUG_VOID_RETURN;
}
+ cursor= stmt->cursor;
+ if (cursor && cursor->is_open())
+ {
+ my_error(ER_EXEC_STMT_WITH_OPEN_CURSOR, MYF(0));
+ DBUG_VOID_RETURN;
+ }
+
DBUG_ASSERT(thd->free_list == NULL);
mysql_reset_thd_for_next_command(thd);
if (flags & (ulong) CURSOR_TYPE_READ_ONLY)
@@ -2009,7 +2017,7 @@ void mysql_stmt_execute(THD *thd, char *packet, uint packet_length)
else
{
DBUG_PRINT("info",("Using READ_ONLY cursor"));
- if (!stmt->cursor &&
+ if (!cursor &&
!(cursor= stmt->cursor= new (&stmt->main_mem_root) Cursor()))
DBUG_VOID_RETURN;
/* If lex->result is set, mysql_execute_command will use it */
@@ -2204,13 +2212,15 @@ void mysql_stmt_fetch(THD *thd, char *packet, uint packet_length)
Statement *stmt;
DBUG_ENTER("mysql_stmt_fetch");
- if (!(stmt= thd->stmt_map.find(stmt_id)) ||
- !stmt->cursor ||
- !stmt->cursor->is_open())
+ if (!(stmt= find_prepared_statement(thd, stmt_id, "mysql_stmt_fetch")))
+ DBUG_VOID_RETURN;
+
+ if (!stmt->cursor || !stmt->cursor->is_open())
{
- my_error(ER_UNKNOWN_STMT_HANDLER, MYF(0), stmt_id, "fetch");
+ my_error(ER_STMT_HAS_NO_OPEN_CURSOR, MYF(0));
DBUG_VOID_RETURN;
}
+
thd->current_arena= stmt;
thd->set_n_backup_statement(stmt, &thd->stmt_backup);
stmt->cursor->init_thd(thd);
@@ -2262,6 +2272,9 @@ void mysql_stmt_reset(THD *thd, char *packet)
if (!(stmt= find_prepared_statement(thd, stmt_id, "mysql_stmt_reset")))
DBUG_VOID_RETURN;
+ if (stmt->cursor && stmt->cursor->is_open())
+ stmt->cursor->close();
+
stmt->state= Item_arena::PREPARED;
/*