From bfc43d57456bd57a8612ea68ffa5b2a00a614523 Mon Sep 17 00:00:00 2001
From: "tomas@poseidon.ndb.mysql.com" <>
Date: Mon, 27 Feb 2006 17:04:49 +0100
Subject: [PATCH] Bug #17499  	Alter table of ndb partitioned tables causes
 mysqld to core

---
 mysql-test/t/ndb_partition_range.test | 104 ++++++++++++++++++++++++++
 sql/sql_table.cc                      |   2 +
 2 files changed, 106 insertions(+)

diff --git a/mysql-test/t/ndb_partition_range.test b/mysql-test/t/ndb_partition_range.test
index 2eb324ccdc..b7f3a42322 100644
--- a/mysql-test/t/ndb_partition_range.test
+++ b/mysql-test/t/ndb_partition_range.test
@@ -93,3 +93,107 @@ show create table t1;
 
 drop table t1;
 
+#
+# Bug #17499, #17687
+#  Alter partitioned NDB table causes mysqld to core
+#
+
+CREATE TABLE t1
+       (id MEDIUMINT NOT NULL,
+        b1 BIT(8),
+        vc VARCHAR(255),
+        bc CHAR(255),
+        d DECIMAL(10,4) DEFAULT 0,
+        f FLOAT DEFAULT 0,
+        total BIGINT UNSIGNED,
+        y YEAR,
+        t DATE) ENGINE=NDB
+   PARTITION BY RANGE (YEAR(t))
+       (PARTITION p0 VALUES LESS THAN (1901),
+        PARTITION p1 VALUES LESS THAN (1946),
+        PARTITION p2 VALUES LESS THAN (1966),
+        PARTITION p3 VALUES LESS THAN (1986),
+        PARTITION p4 VALUES LESS THAN (2005),
+        PARTITION p5 VALUES LESS THAN MAXVALUE);
+
+INSERT INTO t1 VALUES (0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
+SELECT * FROM t1;
+ALTER TABLE t1 ENGINE=MYISAM;
+SELECT * FROM t1;
+DROP TABLE t1;
+
+CREATE LOGFILE GROUP lg1
+  ADD UNDOFILE 'undofile.dat'
+  INITIAL_SIZE 16M
+  UNDO_BUFFER_SIZE=1M
+  ENGINE=NDB;
+
+CREATE TABLESPACE ts1
+  ADD DATAFILE 'datafile.dat'
+  USE LOGFILE GROUP lg1
+  INITIAL_SIZE 12M
+  ENGINE NDB;
+
+CREATE TABLE test.t1 (
+  a1 INT,
+  a2 TEXT NOT NULL,
+  a3 BIT NOT NULL,
+  a4 DECIMAL(8,3),
+  a5 INT NOT NULL,
+  a6 VARCHAR(255),
+  PRIMARY KEY(a1))
+  TABLESPACE ts1 STORAGE DISK ENGINE=NDB
+  PARTITION BY LIST (a1)
+ (PARTITION p0 VALUES IN (1,2,3,4,5),
+  PARTITION p1 VALUES IN (6,7,8,9, 10),
+  PARTITION p2 VALUES IN (11, 12, 13, 14, 15));
+
+let $j= 15;
+--disable_query_log
+while ($j)
+{
+eval INSERT INTO test.t1 VALUES ($j, "Tested Remotely from Texas, USA",
+b'1',$j.00,$j+1,"By NIK $j");
+dec $j;
+}
+--enable_query_log
+SELECT COUNT(*) FROM test.t1;
+
+ALTER TABLE test.t1 DROP COLUMN a4;
+SELECT COUNT(*) FROM test.t1;
+
+DROP TABLE t1;
+
+CREATE TABLE test.t1 (
+  a1 INT,
+  a2 TEXT NOT NULL,
+  a3 BIT NOT NULL,
+  a4 DECIMAL(8,3),
+  a5 INT NOT NULL,
+  a6 VARCHAR(255),
+  PRIMARY KEY(a1))
+  TABLESPACE ts1 STORAGE DISK ENGINE=NDB
+  PARTITION BY HASH(a1)
+  PARTITIONS 4;
+
+let $j= 15;
+--disable_query_log
+while ($j)
+{
+eval INSERT INTO test.t1 VALUES ($j, "Tested Remotely from Texas, USA",
+b'1',$j.00,$j+1,"By NIK $j");
+dec $j;
+}
+--enable_query_log
+SELECT COUNT(*) FROM test.t1;
+
+ALTER TABLE test.t1 DROP COLUMN a4;
+SELECT COUNT(*) FROM test.t1;
+
+DROP TABLE t1;
+
+ALTER TABLESPACE ts1 
+  DROP DATAFILE 'datafile.dat' 
+  ENGINE=NDB;
+DROP TABLESPACE ts1 ENGINE=NDB;
+DROP LOGFILE GROUP lg1 ENGINE=NDB;
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index 17482c4a46..2bfa2d0a7b 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -5183,6 +5183,8 @@ copy_data_between_tables(TABLE *from,TABLE *to,
   */
   to->file->ha_set_all_bits_in_write_set();
   from->file->ha_retrieve_all_cols();
+  if (from->part_info)
+    bitmap_set_all(&(from->part_info->used_partitions));
   init_read_record(&info, thd, from, (SQL_SELECT *) 0, 1,1);
   if (ignore ||
       handle_duplicates == DUP_REPLACE)
-- 
2.30.9