summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <magnus@neptunus.(none)>2004-08-04 10:54:42 +0200
committerunknown <magnus@neptunus.(none)>2004-08-04 10:54:42 +0200
commit92498f81dbc94cd9327b431f4456e17fc8dddb8f (patch)
tree5df3da7132ed30e1f6dd66ff986f3e4e151a8e62
parent0eb016bb9b7a547457cc207f22bd398080018d0e (diff)
downloadmariadb-git-92498f81dbc94cd9327b431f4456e17fc8dddb8f.tar.gz
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 sql/ha_ndbcluster.cc: Check ops_pending if there are operations to take over before closing the scan
-rw-r--r--mysql-test/r/ndb_limit.result31
-rw-r--r--mysql-test/t/ndb_limit.test44
-rw-r--r--sql/ha_ndbcluster.cc14
3 files changed, 89 insertions, 0 deletions
diff --git a/mysql-test/r/ndb_limit.result b/mysql-test/r/ndb_limit.result
new file mode 100644
index 00000000000..6574aa0bb1a
--- /dev/null
+++ b/mysql-test/r/ndb_limit.result
@@ -0,0 +1,31 @@
+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;
diff --git a/mysql-test/t/ndb_limit.test b/mysql-test/t/ndb_limit.test
new file mode 100644
index 00000000000..b0b6f3c4f17
--- /dev/null
+++ b/mysql-test/t/ndb_limit.test
@@ -0,0 +1,44 @@
+-- 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;
diff --git a/sql/ha_ndbcluster.cc b/sql/ha_ndbcluster.cc
index 2c966aab73a..f9dca1b36bb 100644
--- a/sql/ha_ndbcluster.cc
+++ b/sql/ha_ndbcluster.cc
@@ -1937,11 +1937,25 @@ int ha_ndbcluster::rnd_init(bool scan)
int ha_ndbcluster::close_scan()
{
NdbResultSet *cursor= m_active_cursor;
+ NdbConnection *trans= m_active_trans;
DBUG_ENTER("close_scan");
if (!cursor)
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();
m_active_cursor= NULL;
DBUG_RETURN(0);