summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <mskold@mysql.com>2005-03-07 10:21:38 +0100
committerunknown <mskold@mysql.com>2005-03-07 10:21:38 +0100
commit8e8dfe43db45875306d06d5c1d882c86a68b6b3a (patch)
treeb06b6684ff4122901b911545b8f54f0d438e308e
parentae81d53048643da4b110c936eaec0a895af06219 (diff)
downloadmariadb-git-8e8dfe43db45875306d06d5c1d882c86a68b6b3a.tar.gz
Fix for Bug #8753 Invalid schema object version after dropping index
-rw-r--r--mysql-test/include/have_multi_ndb.inc28
-rw-r--r--mysql-test/r/ndb_alter_table.result14
-rw-r--r--mysql-test/r/ndb_multi.result49
-rw-r--r--mysql-test/t/ndb_alter_table.test16
-rw-r--r--mysql-test/t/ndb_multi.test44
-rw-r--r--sql/ha_ndbcluster.cc38
-rw-r--r--sql/ha_ndbcluster.h1
7 files changed, 184 insertions, 6 deletions
diff --git a/mysql-test/include/have_multi_ndb.inc b/mysql-test/include/have_multi_ndb.inc
new file mode 100644
index 00000000000..ec1a93311fb
--- /dev/null
+++ b/mysql-test/include/have_multi_ndb.inc
@@ -0,0 +1,28 @@
+# Setup connections to both MySQL Servers connected to the cluster
+connect (server1,127.0.0.1,root,,test,$MASTER_MYPORT,);
+connect (server2,127.0.0.1,root,,test,$MASTER_MYPORT1,);
+
+# Check that server1 has NDB support
+connection server1;
+disable_query_log;
+--disable_warnings
+drop table if exists t1, t2;
+--enable_warnings
+flush tables;
+@r/have_ndb.require show variables like "have_ndbcluster";
+# @r/server_id.require show variables like "server_id";
+enable_query_log;
+
+# Check that server2 has NDB support
+connection server2;
+disable_query_log;
+--disable_warnings
+drop table if exists t1, t2;
+--enable_warnings
+flush tables;
+@r/have_ndb.require show variables like "have_ndbcluster";
+# @r/server_id1.require show variables like "server_id";
+enable_query_log;
+
+# Set the default connection to 'server1'
+connection server1;
diff --git a/mysql-test/r/ndb_alter_table.result b/mysql-test/r/ndb_alter_table.result
index f899d254243..88ac04db111 100644
--- a/mysql-test/r/ndb_alter_table.result
+++ b/mysql-test/r/ndb_alter_table.result
@@ -170,3 +170,17 @@ c
4
5
drop table t1;
+create table t1 ( a int primary key, b varchar(10), c varchar(10), index (b) )
+engine=ndb;
+insert into t1 values (1,'one','one'), (2,'two','two'), (3,'three','three');
+create index c on t1(c);
+select * from t1 where b = 'two';
+a b c
+2 two two
+alter table t1 drop index c;
+select * from t1 where b = 'two';
+ERROR 42S02: Table 'test.t1' doesn't exist
+select * from t1 where b = 'two';
+a b c
+2 two two
+drop table t1;
diff --git a/mysql-test/r/ndb_multi.result b/mysql-test/r/ndb_multi.result
new file mode 100644
index 00000000000..4a2389cd1ff
--- /dev/null
+++ b/mysql-test/r/ndb_multi.result
@@ -0,0 +1,49 @@
+drop table if exists t1, t2, t3, t4;
+flush status;
+create table t1 (a int) engine=ndbcluster;
+create table t2 (a int) engine=ndbcluster;
+insert into t1 value (2);
+insert into t2 value (3);
+select * from t1;
+a
+2
+select * from t2;
+a
+3
+show status like 'handler_discover%';
+Variable_name Value
+Handler_discover 0
+flush status;
+select * from t1;
+a
+2
+update t1 set a=3 where a=2;
+show status like 'handler_discover%';
+Variable_name Value
+Handler_discover 1
+create table t3 (a int not null primary key, b varchar(22),
+c int, last_col text) engine=ndb;
+insert into t3 values(1, 'Hi!', 89, 'Longtext column');
+create table t4 (pk int primary key, b int) engine=ndb;
+select * from t1;
+a
+3
+select * from t3;
+a b c last_col
+1 Hi! 89 Longtext column
+show status like 'handler_discover%';
+Variable_name Value
+Handler_discover 1
+show tables like 't4';
+Tables_in_test (t4)
+t4
+show status like 'handler_discover%';
+Variable_name Value
+Handler_discover 2
+show tables;
+Tables_in_test
+t1
+t2
+t3
+t4
+drop table t1, t2, t3, t4;
diff --git a/mysql-test/t/ndb_alter_table.test b/mysql-test/t/ndb_alter_table.test
index 892443a1407..f39edc0ee65 100644
--- a/mysql-test/t/ndb_alter_table.test
+++ b/mysql-test/t/ndb_alter_table.test
@@ -1,4 +1,5 @@
-- source include/have_ndb.inc
+-- source include/have_multi_ndb.inc
--disable_warnings
DROP TABLE IF EXISTS t1;
@@ -133,6 +134,21 @@ INSERT INTO t1 VALUES (1,2,0),(18,19,4),(20,21,0);
select c from t1 order by c;
drop table t1;
+create table t1 ( a int primary key, b varchar(10), c varchar(10), index (b) )
+engine=ndb;
+insert into t1 values (1,'one','one'), (2,'two','two'), (3,'three','three');
+create index c on t1(c);
+connection server2;
+select * from t1 where b = 'two';
+connection server1;
+alter table t1 drop index c;
+connection server2;
+--error 1146
+select * from t1 where b = 'two';
+select * from t1 where b = 'two';
+connection server1;
+drop table t1;
+
#--disable_warnings
#DROP TABLE IF EXISTS t2;
#--enable_warnings
diff --git a/mysql-test/t/ndb_multi.test b/mysql-test/t/ndb_multi.test
new file mode 100644
index 00000000000..9286721b677
--- /dev/null
+++ b/mysql-test/t/ndb_multi.test
@@ -0,0 +1,44 @@
+-- source include/have_ndb.inc
+-- source include/have_multi_ndb.inc
+
+
+--disable_warnings
+drop table if exists t1, t2, t3, t4;
+--enable_warnings
+
+flush status;
+
+# Create test tables on server1
+create table t1 (a int) engine=ndbcluster;
+create table t2 (a int) engine=ndbcluster;
+insert into t1 value (2);
+insert into t2 value (3);
+select * from t1;
+select * from t2;
+show status like 'handler_discover%';
+
+# Connect to server2 and use the tables from there
+connection server2;
+flush status;
+select * from t1;
+update t1 set a=3 where a=2;
+show status like 'handler_discover%';
+
+# Create a new table on server2
+create table t3 (a int not null primary key, b varchar(22),
+c int, last_col text) engine=ndb;
+insert into t3 values(1, 'Hi!', 89, 'Longtext column');
+create table t4 (pk int primary key, b int) engine=ndb;
+
+# Check that the tables are accessible from server1
+connection server1;
+select * from t1;
+select * from t3;
+show status like 'handler_discover%';
+show tables like 't4';
+show status like 'handler_discover%';
+show tables;
+
+drop table t1, t2, t3, t4;
+
+
diff --git a/sql/ha_ndbcluster.cc b/sql/ha_ndbcluster.cc
index 3e2fc5b2855..70b86ca08d1 100644
--- a/sql/ha_ndbcluster.cc
+++ b/sql/ha_ndbcluster.cc
@@ -328,6 +328,36 @@ void ha_ndbcluster::no_uncommitted_rows_reset(THD *thd)
# The mapped error code
*/
+void ha_ndbcluster::invalidateCache()
+{
+ NDBDICT *dict= get_ndb()->getDictionary();
+ DBUG_PRINT("info", ("invalidating %s", m_tabname));
+ dict->invalidateTable(m_tabname);
+ table->version=0L; /* Free when thread is ready */
+ /* Invalidate indexes */
+ for (uint i= 0; i < table->keys; i++)
+ {
+ NDBINDEX *index = (NDBINDEX *) m_index[i].index;
+ NDBINDEX *unique_index = (NDBINDEX *) m_index[i].unique_index;
+ NDB_INDEX_TYPE idx_type= m_index[i].type;
+
+
+ switch(m_index[i].type) {
+ case(PRIMARY_KEY_ORDERED_INDEX):
+ case(ORDERED_INDEX):
+ dict->invalidateIndex(index->getName(), m_tabname);
+ break;
+ case(UNIQUE_ORDERED_INDEX):
+ dict->invalidateIndex(index->getName(), m_tabname);
+ case(UNIQUE_INDEX):
+ dict->invalidateIndex(unique_index->getName(), m_tabname);
+ break;
+ case(PRIMARY_KEY_INDEX):
+ case(UNDEFINED_INDEX):
+ break;
+ }
+ }
+}
int ha_ndbcluster::ndb_err(NdbConnection *trans)
{
@@ -339,11 +369,7 @@ int ha_ndbcluster::ndb_err(NdbConnection *trans)
switch (err.classification) {
case NdbError::SchemaError:
{
- Ndb *ndb= get_ndb();
- NDBDICT *dict= ndb->getDictionary();
- DBUG_PRINT("info", ("invalidateTable %s", m_tabname));
- dict->invalidateTable(m_tabname);
- table->version=0L; /* Free when thread is ready */
+ invalidateCache();
break;
}
default:
@@ -733,7 +759,7 @@ int ha_ndbcluster::get_metadata(const char *path)
if (!invalidating_ndb_table)
{
DBUG_PRINT("info", ("Invalidating table"));
- dict->invalidateTable(m_tabname);
+ invalidateCache();
invalidating_ndb_table= TRUE;
}
else
diff --git a/sql/ha_ndbcluster.h b/sql/ha_ndbcluster.h
index 07b305bad3e..149276c8356 100644
--- a/sql/ha_ndbcluster.h
+++ b/sql/ha_ndbcluster.h
@@ -201,6 +201,7 @@ class ha_ndbcluster: public handler
void print_results();
longlong get_auto_increment();
+ void invalidateCache();
int ndb_err(NdbConnection*);
bool uses_blob_value(bool all_fields);