BUG#4818 DELETE FROM tab LIMIT

Check if there are any operations pending that needs to be taken over to the updating/deleting transaction before closing the scan 
parent 9d987304
DROP TABLE IF EXISTS t2;
CREATE TABLE t2 (
a bigint unsigned NOT NULL PRIMARY KEY,
b int unsigned not null,
c int unsigned
) engine=ndbcluster;
select count(*) from t2;
count(*)
10000
delete from t2 limit 1;
select count(*) from t2;
count(*)
9999
delete from t2 limit 100;
select count(*) from t2;
count(*)
9899
delete from t2 limit 1000;
select count(*) from t2;
count(*)
8899
update t2 set c=12345678 limit 100;
select count(*) from t2 where c=12345678;
count(*)
100
select count(*) from t2 where c=12345678 limit 1000;
count(*)
100
select * from t2 limit 0;
a b c
drop table t2;
-- source include/have_ndb.inc
--disable_warnings
DROP TABLE IF EXISTS t2;
--enable_warnings
CREATE TABLE t2 (
a bigint unsigned NOT NULL PRIMARY KEY,
b int unsigned not null,
c int unsigned
) engine=ndbcluster;
#
# insert records into table
#
let $1=1000;
disable_query_log;
while ($1)
{
eval insert into t2 values($1*10, $1+9, 5*$1), ($1*10+1, $1+10, 7),($1*10+2, $1+10, 7*$1), ($1*10+3, $1+10, 10+$1), ($1*10+4, $1+10, 70*$1), ($1*10+5, $1+10, 7), ($1*10+6, $1+10, 9), ($1*10+7, $1+299, 899), ($1*10+8, $1+10, 12), ($1*10+9, $1+10, 14*$1);
dec $1;
}
enable_query_log;
select count(*) from t2;
delete from t2 limit 1;
select count(*) from t2;
delete from t2 limit 100;
select count(*) from t2;
delete from t2 limit 1000;
select count(*) from t2;
update t2 set c=12345678 limit 100;
select count(*) from t2 where c=12345678;
select count(*) from t2 where c=12345678 limit 1000;
select * from t2 limit 0;
drop table t2;
...@@ -1937,11 +1937,25 @@ int ha_ndbcluster::rnd_init(bool scan) ...@@ -1937,11 +1937,25 @@ int ha_ndbcluster::rnd_init(bool scan)
int ha_ndbcluster::close_scan() int ha_ndbcluster::close_scan()
{ {
NdbResultSet *cursor= m_active_cursor; NdbResultSet *cursor= m_active_cursor;
NdbConnection *trans= m_active_trans;
DBUG_ENTER("close_scan"); DBUG_ENTER("close_scan");
if (!cursor) if (!cursor)
DBUG_RETURN(1); DBUG_RETURN(1);
if (ops_pending)
{
/*
Take over any pending transactions to the
deleteing/updating transaction before closing the scan
*/
DBUG_PRINT("info", ("ops_pending: %d", ops_pending));
if (trans->execute(NoCommit) != 0)
DBUG_RETURN(ndb_err(trans));
ops_pending= 0;
}
cursor->close(); cursor->close();
m_active_cursor= NULL; m_active_cursor= NULL;
DBUG_RETURN(0); DBUG_RETURN(0);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment