1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-30 16:24:05 +03:00

Fix the client_test failure (due to failing cursors tests after the merge).

This commit is contained in:
konstantin@mysql.com
2004-11-05 22:39:19 +03:00
parent fe5889dee5
commit 97a5fe8e65
2 changed files with 33 additions and 53 deletions

View File

@ -1898,7 +1898,7 @@ void mysql_stmt_execute(THD *thd, char *packet, uint packet_length)
{ {
if (stmt->cursor->is_open()) if (stmt->cursor->is_open())
stmt->cursor->init_from_thd(thd); stmt->cursor->init_from_thd(thd);
thd->set_item_arena(&thd->stmt_backup); stmt->cursor->state= stmt->state;
} }
else else
{ {
@ -2044,6 +2044,7 @@ void mysql_stmt_fetch(THD *thd, char *packet, uint packet_length)
DBUG_ENTER("mysql_stmt_fetch"); DBUG_ENTER("mysql_stmt_fetch");
thd->current_arena= stmt;
if (!(stmt= thd->stmt_map.find(stmt_id)) || if (!(stmt= thd->stmt_map.find(stmt_id)) ||
!stmt->cursor || !stmt->cursor ||
!stmt->cursor->is_open()) !stmt->cursor->is_open())
@ -2053,9 +2054,7 @@ void mysql_stmt_fetch(THD *thd, char *packet, uint packet_length)
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
thd->stmt_backup.set_statement(thd); thd->set_n_backup_statement(stmt, &thd->stmt_backup);
thd->stmt_backup.set_item_arena(thd);
thd->set_statement(stmt);
stmt->cursor->init_thd(thd); stmt->cursor->init_thd(thd);
if (!(specialflag & SPECIAL_NO_PRIOR)) if (!(specialflag & SPECIAL_NO_PRIOR))
@ -2070,11 +2069,8 @@ void mysql_stmt_fetch(THD *thd, char *packet, uint packet_length)
/* Restore THD state */ /* Restore THD state */
stmt->cursor->reset_thd(thd); stmt->cursor->reset_thd(thd);
thd->set_statement(&thd->stmt_backup); thd->restore_backup_statement(stmt, &thd->stmt_backup);
thd->set_item_arena(&thd->stmt_backup); thd->current_arena= thd;
if (error && error != -4)
send_error(thd, ER_OUT_OF_RESOURCES);
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
@ -2085,7 +2081,7 @@ void mysql_stmt_fetch(THD *thd, char *packet, uint packet_length)
SYNOPSIS SYNOPSIS
mysql_stmt_reset() mysql_stmt_reset()
thd Thread handle thd Thread handle
packet Packet with stmt id packet Packet with stmt id
DESCRIPTION DESCRIPTION
This function resets statement to the state it was right after prepare. This function resets statement to the state it was right after prepare.

View File

@ -1683,8 +1683,6 @@ Cursor::init_from_thd(THD *thd)
void void
Cursor::init_thd(THD *thd) Cursor::init_thd(THD *thd)
{ {
thd->mem_root= mem_root;
DBUG_ASSERT(thd->derived_tables == 0); DBUG_ASSERT(thd->derived_tables == 0);
thd->derived_tables= derived_tables; thd->derived_tables= derived_tables;
@ -1694,7 +1692,6 @@ Cursor::init_thd(THD *thd)
DBUG_ASSERT(thd->lock== 0); DBUG_ASSERT(thd->lock== 0);
thd->lock= lock; thd->lock= lock;
thd->query_id= query_id; thd->query_id= query_id;
thd->free_list= free_list;
} }
@ -1779,6 +1776,8 @@ Cursor::fetch(ulong num_rows)
int error= 0; int error= 0;
/* save references to memory, allocated during fetch */
thd->set_n_backup_item_arena(this, &thd->stmt_backup);
join->fetch_limit+= num_rows; join->fetch_limit+= num_rows;
/* /*
@ -1842,54 +1841,37 @@ Cursor::fetch(ulong num_rows)
if (thd->net.report_error) if (thd->net.report_error)
error= -1; error= -1;
if (error == -3) /* LIMIT clause worked */
error= 0;
switch (error) { #ifdef USING_TRANSACTIONS
/* Fetch limit worked, possibly more rows are there */
case -4:
if (thd->transaction.all.innobase_tid) if (thd->transaction.all.innobase_tid)
ha_release_temporary_latches(thd); ha_release_temporary_latches(thd);
#endif
thd->restore_backup_item_arena(this, &thd->stmt_backup);
if (error == -4)
{
/* Fetch limit worked, possibly more rows are there */
thd->server_status|= SERVER_STATUS_CURSOR_EXISTS; thd->server_status|= SERVER_STATUS_CURSOR_EXISTS;
::send_eof(thd); ::send_eof(thd);
thd->server_status&= ~SERVER_STATUS_CURSOR_EXISTS; thd->server_status&= ~SERVER_STATUS_CURSOR_EXISTS;
/* save references to memory, allocated during fetch */ }
mem_root= thd->mem_root; else
free_list= thd->free_list; {
break;
/* Limit clause worked: this is the same as 'no more rows' */
case -3: /* LIMIT clause worked */
error= 0;
/* fallthrough */
case 0: /* No more rows */
if (thd->transaction.all.innobase_tid)
ha_release_temporary_latches(thd);
close(); close();
thd->server_status|= SERVER_STATUS_LAST_ROW_SENT; if (error == 0)
::send_eof(thd); {
thd->server_status&= ~SERVER_STATUS_LAST_ROW_SENT; thd->server_status|= SERVER_STATUS_LAST_ROW_SENT;
join= 0; ::send_eof(thd);
unit= 0; thd->server_status&= ~SERVER_STATUS_LAST_ROW_SENT;
free_items(thd->free_list); }
thd->free_list= free_list= 0; else
/* send_error(thd, ER_OUT_OF_RESOURCES);
Must be last, as some memory might be allocated for free purposes, /* free cursor memory */
like in free_tmp_table() (TODO: fix this issue) free_items(free_list);
*/ free_list= 0;
mem_root= thd->mem_root;
free_root(&mem_root, MYF(0)); free_root(&mem_root, MYF(0));
break;
default:
close();
join= 0;
unit= 0;
free_items(thd->free_list);
thd->free_list= free_list= 0;
/*
Must be last, as some memory might be allocated for free purposes,
like in free_tmp_table() (TODO: fix this issue)
*/
mem_root= thd->mem_root;
free_root(&mem_root, MYF(0));
break;
} }
return error; return error;
} }
@ -1927,6 +1909,8 @@ Cursor::close()
thd->derived_tables= tmp_derived_tables; thd->derived_tables= tmp_derived_tables;
thd->lock= tmp_lock; thd->lock= tmp_lock;
} }
join= 0;
unit= 0;
} }