Commit 44472d42 authored by gni@dev3-221.dev.cn.tlan's avatar gni@dev3-221.dev.cn.tlan
Browse files

BUG#29851 TRUNCATE causes error 4350 from cluster in INSERT... ON DUPLICATE KEY UPDATE

parent 2093858f
Loading
Loading
Loading
Loading
+19 −0
Original line number Diff line number Diff line
@@ -40,3 +40,22 @@ a b c
select * from t1;
a	b	c
drop table t1;
DROP TABLE IF EXISTS truncate_test;
CREATE TABLE truncate_test (
i INT PRIMARY KEY,
a INT,
b VARCHAR(11),
UNIQUE KEY (a) 
) ENGINE = NDB;
INSERT INTO truncate_test VALUES (1, 1, 'test') ON DUPLICATE KEY UPDATE b = 'new';
INSERT INTO truncate_test VALUES (1, 1, 'test') ON DUPLICATE KEY UPDATE b = 'new';
TRUNCATE truncate_test;
INSERT INTO truncate_test VALUES (1, 1, 'test') ON DUPLICATE KEY UPDATE b = 'new';
SELECT * FROM truncate_test;
i	a	b
1	1	test
INSERT INTO truncate_test VALUES (1, 1, 'test') ON DUPLICATE KEY UPDATE b = 'new';
SELECT * FROM truncate_test;
i	a	b
1	1	new
DROP TABLE truncate_test;
+31 −0
Original line number Diff line number Diff line
@@ -81,3 +81,34 @@ select * from t1;
select * from t1;

drop table t1;

#For BUG#29851 TRUNCATE causes error 4350 from cluster in INSERT... ON DUPLICATE KEY UPDATE

connection con1;

--disable_warnings
DROP TABLE IF EXISTS truncate_test;
--enable_warnings

CREATE TABLE truncate_test (
  i INT PRIMARY KEY,
  a INT,
  b VARCHAR(11),
  UNIQUE KEY (a) 
) ENGINE = NDB;

INSERT INTO truncate_test VALUES (1, 1, 'test') ON DUPLICATE KEY UPDATE b = 'new';
INSERT INTO truncate_test VALUES (1, 1, 'test') ON DUPLICATE KEY UPDATE b = 'new';

connection con2;
TRUNCATE truncate_test;

connection con1;
INSERT INTO truncate_test VALUES (1, 1, 'test') ON DUPLICATE KEY UPDATE b = 'new';
SELECT * FROM truncate_test;

connection con2;
INSERT INTO truncate_test VALUES (1, 1, 'test') ON DUPLICATE KEY UPDATE b = 'new';
SELECT * FROM truncate_test;

DROP TABLE truncate_test;
+9 −1
Original line number Diff line number Diff line
@@ -439,7 +439,8 @@ void ha_ndbcluster::no_uncommitted_rows_reset(THD *thd)

void ha_ndbcluster::invalidate_dictionary_cache(bool global)
{
  NDBDICT *dict= get_ndb()->getDictionary();
  Ndb * ndb= get_ndb();
  NDBDICT *dict= ndb->getDictionary();
  DBUG_ENTER("invalidate_dictionary_cache");
  DBUG_PRINT("info", ("invalidating %s", m_tabname));

@@ -459,6 +460,7 @@ void ha_ndbcluster::invalidate_dictionary_cache(bool global)
  }
  else
    dict->removeCachedTable(m_tabname);
  build_index_list(ndb, table, ILBP_OPEN);
  table->s->version=0L;			/* Free when thread is ready */
  /* Invalidate indexes */
  for (uint i= 0; i < table->s->keys; i++)
@@ -470,17 +472,23 @@ void ha_ndbcluster::invalidate_dictionary_cache(bool global)
    switch (idx_type) {
    case PRIMARY_KEY_ORDERED_INDEX:
    case ORDERED_INDEX:
      if (!index)
        break;
      if (global)
        dict->invalidateIndex(index->getName(), m_tabname);
      else
        dict->removeCachedIndex(index->getName(), m_tabname);
      break;
    case UNIQUE_ORDERED_INDEX:
      if (!index)
        break;
      if (global)
        dict->invalidateIndex(index->getName(), m_tabname);
      else
        dict->removeCachedIndex(index->getName(), m_tabname);
    case UNIQUE_INDEX:
      if (!unique_index)
        break;
      if (global)
        dict->invalidateIndex(unique_index->getName(), m_tabname);
      else