BUG#19010: Fix issues with that ALTER TABLE from auto-partitioned NDB table doesn't work unless primary key exists on table.
mysql-test/r/ndb_bitfield.result: Test cases changes now that auto-partitioning is remembered in frm file mysql-test/r/ndb_dd_basic.result: Test cases changes now that auto-partitioning is remembered in frm file mysql-test/r/ndb_dd_disk2memory.result: Test cases changes now that auto-partitioning is remembered in frm file mysql-test/r/ndb_gis.result: Test cases changes now that auto-partitioning is remembered in frm file mysql-test/r/ndb_partition_key.result: New test cases for auto-partitioning change that was made to fix bug mysql-test/r/rpl_ndb_UUID.result: Test cases changes now that auto-partitioning is remembered in frm file mysql-test/r/rpl_ndb_dd_advance.result: Test cases changes now that auto-partitioning is remembered in frm file mysql-test/t/ndb_partition_key.test: New test cases for auto-partitioning change that was made to fix bug sql/partition_info.h: New boolean to keep track of auto partitioned or not sql/sql_partition.cc: Ensure that auto-partitiong flag is reset when partitions are dropped, added, reorganised or coalesced. Ensure that auto-partitioned tables are altered into non-partitioned table when ALTER TABLE t1 engine=X is performed. sql/sql_show.cc: Only print partition info for non-auto-partitioned tables sql/sql_table.cc: Set auto partition flag when auto partitions are generated in create table sql/table.cc: Fix reading of frm file where new auto-partition flag is introduced. sql/table.h: New flag for auto partition on share object sql/unireg.cc: Fix code for writing frm to also write autopartition flag at end of partition info, fix some length issues at the same time that was in this part that caused no problems since partition info always was the last info in the file.
This commit is contained in:
parent
3065eeb3f8
commit
4e3f4e970f
@ -9,7 +9,7 @@ t1 CREATE TABLE `t1` (
|
||||
`pk1` int(11) NOT NULL,
|
||||
`b` bit(64) DEFAULT NULL,
|
||||
PRIMARY KEY (`pk1`)
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 PARTITION BY KEY ()
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1
|
||||
insert into t1 values
|
||||
(0,b'1111111111111111111111111111111111111111111111111111111111111111'),
|
||||
(1,b'1000000000000000000000000000000000000000000000000000000000000000'),
|
||||
|
@ -49,7 +49,7 @@ t1 CREATE TABLE `t1` (
|
||||
`b` int(11) NOT NULL,
|
||||
`c` int(11) NOT NULL,
|
||||
PRIMARY KEY (`pk1`)
|
||||
) TABLESPACE ts1 STORAGE DISK ENGINE=ndbcluster DEFAULT CHARSET=latin1 PARTITION BY KEY ()
|
||||
) TABLESPACE ts1 STORAGE DISK ENGINE=ndbcluster DEFAULT CHARSET=latin1
|
||||
INSERT INTO t1 VALUES (0, 0, 0);
|
||||
SELECT * FROM t1;
|
||||
pk1 b c
|
||||
|
@ -218,7 +218,7 @@ t2 CREATE TABLE `t2` (
|
||||
`b2` int(11) NOT NULL,
|
||||
`c2` int(11) NOT NULL,
|
||||
PRIMARY KEY (`pk2`)
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 PARTITION BY KEY ()
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1
|
||||
SHOW CREATE TABLE test.t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
@ -226,7 +226,7 @@ t1 CREATE TABLE `t1` (
|
||||
`b` int(11) NOT NULL,
|
||||
`c` int(11) NOT NULL,
|
||||
PRIMARY KEY (`pk1`)
|
||||
) TABLESPACE table_space1 STORAGE DISK ENGINE=ndbcluster DEFAULT CHARSET=latin1 PARTITION BY KEY ()
|
||||
) TABLESPACE table_space1 STORAGE DISK ENGINE=ndbcluster DEFAULT CHARSET=latin1
|
||||
ALTER TABLE test.t2 TABLESPACE table_space1 STORAGE DISK
|
||||
ENGINE=NDB;
|
||||
SHOW CREATE TABLE test.t2;
|
||||
@ -236,7 +236,7 @@ t2 CREATE TABLE `t2` (
|
||||
`b2` int(11) NOT NULL,
|
||||
`c2` int(11) NOT NULL,
|
||||
PRIMARY KEY (`pk2`)
|
||||
) TABLESPACE table_space1 STORAGE DISK ENGINE=ndbcluster DEFAULT CHARSET=latin1 PARTITION BY KEY ()
|
||||
) TABLESPACE table_space1 STORAGE DISK ENGINE=ndbcluster DEFAULT CHARSET=latin1
|
||||
ALTER TABLE test.t1 ENGINE=NDBCLUSTER;
|
||||
SHOW CREATE TABLE test.t1;
|
||||
Table Create Table
|
||||
@ -245,7 +245,7 @@ t1 CREATE TABLE `t1` (
|
||||
`b` int(11) NOT NULL,
|
||||
`c` int(11) NOT NULL,
|
||||
PRIMARY KEY (`pk1`)
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 PARTITION BY KEY ()
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1
|
||||
|
||||
DROP TABLE test.t1;
|
||||
DROP TABLE test.t2;
|
||||
|
@ -14,7 +14,7 @@ gis_point CREATE TABLE `gis_point` (
|
||||
`fid` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`g` point DEFAULT NULL,
|
||||
PRIMARY KEY (`fid`)
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 PARTITION BY KEY ()
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1
|
||||
SHOW FIELDS FROM gis_point;
|
||||
Field Type Null Key Default Extra
|
||||
fid int(11) NO PRI NULL auto_increment
|
||||
@ -476,7 +476,7 @@ gis_point CREATE TABLE `gis_point` (
|
||||
`fid` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`g` point DEFAULT NULL,
|
||||
PRIMARY KEY (`fid`)
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 PARTITION BY KEY ()
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1
|
||||
SHOW FIELDS FROM gis_point;
|
||||
Field Type Null Key Default Extra
|
||||
fid int(11) NO PRI NULL auto_increment
|
||||
|
@ -137,7 +137,7 @@ show create table t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` int(11) DEFAULT NULL
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 PARTITION BY KEY ()
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1
|
||||
alter table t1
|
||||
partition by key(a)
|
||||
(partition p0 engine=ndb, partition p1);
|
||||
@ -197,3 +197,40 @@ ENGINE=NDB
|
||||
PARTITION BY KEY(c3);
|
||||
ALTER TABLE t1 ADD COLUMN c4 INT AFTER c1;
|
||||
DROP TABLE t1;
|
||||
create table t1 (a int) engine = ndb;
|
||||
show create table t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` int(11) DEFAULT NULL
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1
|
||||
alter table t1 add column b int;
|
||||
show create table t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` int(11) DEFAULT NULL,
|
||||
`b` int(11) DEFAULT NULL
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1
|
||||
alter table t1 engine = myisam;
|
||||
alter table t1 engine = ndb;
|
||||
show create table t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` int(11) DEFAULT NULL,
|
||||
`b` int(11) DEFAULT NULL
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1
|
||||
alter table t1 coalesce partition 1;
|
||||
show create table t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` int(11) DEFAULT NULL,
|
||||
`b` int(11) DEFAULT NULL
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 PARTITION BY KEY () PARTITIONS 1
|
||||
drop table t1 ;
|
||||
create table t1 (a int) engine = ndb;
|
||||
alter table t1 add partition partitions 1;
|
||||
show create table t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` int(11) DEFAULT NULL
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 PARTITION BY KEY () PARTITIONS 3
|
||||
drop table t1;
|
||||
|
@ -33,7 +33,7 @@ t1 CREATE TABLE `t1` (
|
||||
`blob_column` longblob,
|
||||
`vchar_column` varchar(100) DEFAULT NULL,
|
||||
PRIMARY KEY (`a`)
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 PARTITION BY KEY ()
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1
|
||||
DROP PROCEDURE test.p1;
|
||||
DROP FUNCTION test.fn1;
|
||||
DROP TABLE test.t1;
|
||||
|
@ -69,7 +69,7 @@ t1 CREATE TABLE `t1` (
|
||||
PRIMARY KEY (`c1`),
|
||||
KEY `t1_i` (`c2`,`c3`),
|
||||
KEY `c5` (`c5`)
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 PARTITION BY KEY ()
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1
|
||||
**** Show first set of ALTERs on SLAVE ****
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
@ -82,7 +82,7 @@ t1 CREATE TABLE `t1` (
|
||||
PRIMARY KEY (`c1`),
|
||||
KEY `t1_i` (`c2`,`c3`),
|
||||
KEY `c5` (`c5`)
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 PARTITION BY KEY ()
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1
|
||||
**** Second set of alters test 1 ****
|
||||
ALTER TABLE t1 RENAME t2;
|
||||
ALTER TABLE t2 DROP INDEX c5;
|
||||
@ -101,7 +101,7 @@ t1 CREATE TABLE `t1` (
|
||||
`c5` double DEFAULT NULL,
|
||||
PRIMARY KEY (`c1`),
|
||||
KEY `t1_i` (`c2`,`c3`)
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 PARTITION BY KEY ()
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1
|
||||
**** Show second set of ALTERs on SLAVE ****
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
@ -113,7 +113,7 @@ t1 CREATE TABLE `t1` (
|
||||
`c5` double DEFAULT NULL,
|
||||
PRIMARY KEY (`c1`),
|
||||
KEY `t1_i` (`c2`,`c3`)
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 PARTITION BY KEY ()
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1
|
||||
**** Third and last set of alters for test1 ****
|
||||
ALTER TABLE t1 CHANGE c1 c1 DOUBLE;
|
||||
ALTER TABLE t1 CHANGE c2 c2 DECIMAL(10,2);
|
||||
@ -135,7 +135,7 @@ t1 CREATE TABLE `t1` (
|
||||
`c5` double DEFAULT NULL,
|
||||
PRIMARY KEY (`c1`),
|
||||
KEY `t1_i` (`c2`)
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 PARTITION BY KEY ()
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1
|
||||
SELECT * FROM t1 ORDER BY c1 LIMIT 5;
|
||||
c1 c2 c3 c5
|
||||
1 2.00 b1b1b1b1b1b1b1b1b1b1 NULL
|
||||
@ -153,7 +153,7 @@ t1 CREATE TABLE `t1` (
|
||||
`c5` double DEFAULT NULL,
|
||||
PRIMARY KEY (`c1`),
|
||||
KEY `t1_i` (`c2`)
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 PARTITION BY KEY ()
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1
|
||||
SELECT * FROM t1 where c1 = 1;
|
||||
c1 c2 c3 c5
|
||||
1 2.00 b1b1b1b1b1b1b1b1b1b1 NULL
|
||||
|
@ -196,3 +196,23 @@ CREATE TABLE t1 (
|
||||
|
||||
ALTER TABLE t1 ADD COLUMN c4 INT AFTER c1;
|
||||
DROP TABLE t1;
|
||||
|
||||
#
|
||||
# BUG 19010: ALTER TABLE from NDB to other engine without primary key
|
||||
# doesn't work.
|
||||
#
|
||||
create table t1 (a int) engine = ndb;
|
||||
show create table t1;
|
||||
alter table t1 add column b int;
|
||||
show create table t1;
|
||||
alter table t1 engine = myisam;
|
||||
alter table t1 engine = ndb;
|
||||
show create table t1;
|
||||
alter table t1 coalesce partition 1;
|
||||
show create table t1;
|
||||
drop table t1 ;
|
||||
create table t1 (a int) engine = ndb;
|
||||
alter table t1 add partition partitions 1;
|
||||
show create table t1;
|
||||
drop table t1;
|
||||
|
||||
|
@ -184,6 +184,7 @@ public:
|
||||
bool list_of_subpart_fields;
|
||||
bool linear_hash_ind;
|
||||
bool fixed;
|
||||
bool is_auto_partitioned;
|
||||
bool from_openfrm;
|
||||
bool has_null_value;
|
||||
uint has_null_part_id;
|
||||
@ -219,6 +220,7 @@ public:
|
||||
list_of_part_fields(FALSE), list_of_subpart_fields(FALSE),
|
||||
linear_hash_ind(FALSE),
|
||||
fixed(FALSE),
|
||||
is_auto_partitioned(FALSE),
|
||||
from_openfrm(FALSE),
|
||||
has_null_value(FALSE),
|
||||
has_null_part_id(0)
|
||||
|
@ -4075,6 +4075,7 @@ that are reorganised.
|
||||
tab_part_info->use_default_partitions= FALSE;
|
||||
}
|
||||
tab_part_info->use_default_no_partitions= FALSE;
|
||||
tab_part_info->is_auto_partitioned= FALSE;
|
||||
}
|
||||
}
|
||||
else if (alter_info->flags == ALTER_DROP_PARTITION)
|
||||
@ -4090,6 +4091,8 @@ that are reorganised.
|
||||
uint no_parts_dropped= alter_info->partition_names.elements;
|
||||
uint no_parts_found= 0;
|
||||
List_iterator<partition_element> part_it(tab_part_info->partitions);
|
||||
|
||||
tab_part_info->is_auto_partitioned= FALSE;
|
||||
if (!(tab_part_info->part_type == RANGE_PARTITION ||
|
||||
tab_part_info->part_type == LIST_PARTITION))
|
||||
{
|
||||
@ -4274,7 +4277,10 @@ state of p1.
|
||||
tab_part_info->no_parts= no_parts_remain;
|
||||
}
|
||||
if (!(alter_info->flags & ALTER_TABLE_REORG))
|
||||
{
|
||||
tab_part_info->use_default_no_partitions= FALSE;
|
||||
tab_part_info->is_auto_partitioned= FALSE;
|
||||
}
|
||||
}
|
||||
else if (alter_info->flags == ALTER_REORGANIZE_PARTITION)
|
||||
{
|
||||
@ -4293,6 +4299,8 @@ state of p1.
|
||||
uint no_parts_new= thd->work_part_info->partitions.elements;
|
||||
partition_info *alt_part_info= thd->work_part_info;
|
||||
uint check_total_partitions;
|
||||
|
||||
tab_part_info->is_auto_partitioned= FALSE;
|
||||
if (no_parts_reorged > tab_part_info->no_parts)
|
||||
{
|
||||
my_error(ER_REORG_PARTITION_NOT_EXIST, MYF(0));
|
||||
@ -4533,7 +4541,22 @@ the generated partition syntax in a correct manner.
|
||||
Make sure change of engine happens to all partitions.
|
||||
*/
|
||||
DBUG_PRINT("info", ("partition changed"));
|
||||
set_engine_all_partitions(thd->work_part_info, create_info->db_type);
|
||||
if (table->part_info->is_auto_partitioned)
|
||||
{
|
||||
/*
|
||||
If the user originally didn't specify partitioning to be
|
||||
used we can remove it now.
|
||||
*/
|
||||
thd->work_part_info= NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
Ensure that all partitions have the proper engine set-up
|
||||
*/
|
||||
set_engine_all_partitions(thd->work_part_info,
|
||||
create_info->db_type);
|
||||
}
|
||||
*partition_changed= TRUE;
|
||||
}
|
||||
}
|
||||
|
@ -1274,6 +1274,7 @@ store_create_info(THD *thd, TABLE_LIST *table_list, String *packet,
|
||||
uint part_syntax_len;
|
||||
char *part_syntax;
|
||||
if (table->part_info &&
|
||||
(!table->part_info->is_auto_partitioned) &&
|
||||
((part_syntax= generate_partition_syntax(table->part_info,
|
||||
&part_syntax_len,
|
||||
FALSE,FALSE))))
|
||||
|
@ -3045,6 +3045,7 @@ bool mysql_create_table_internal(THD *thd,
|
||||
}
|
||||
file->set_auto_partitions(part_info);
|
||||
part_info->default_engine_type= create_info->db_type;
|
||||
part_info->is_auto_partitioned= TRUE;
|
||||
}
|
||||
if (part_info)
|
||||
{
|
||||
|
11
sql/table.cc
11
sql/table.cc
@ -655,7 +655,6 @@ static int open_binary_frm(THD *thd, TABLE_SHARE *share, uchar *head,
|
||||
my_free(buff, MYF(0));
|
||||
goto err;
|
||||
}
|
||||
next_chunk++;
|
||||
}
|
||||
#else
|
||||
if (partition_info_len)
|
||||
@ -679,7 +678,15 @@ static int open_binary_frm(THD *thd, TABLE_SHARE *share, uchar *head,
|
||||
*/
|
||||
next_chunk+= 4;
|
||||
}
|
||||
else if (share->mysql_version >= 50110)
|
||||
#endif
|
||||
{
|
||||
/* New auto_partitioned indicator introduced in 5.1.11 */
|
||||
#ifdef WITH_PARTITION_STORAGE_ENGINE
|
||||
share->auto_partitioned= *next_chunk;
|
||||
#endif
|
||||
next_chunk++;
|
||||
}
|
||||
keyinfo= share->key_info;
|
||||
for (i= 0; i < keys; i++, keyinfo++)
|
||||
{
|
||||
@ -1469,6 +1476,8 @@ int open_table_from_share(THD *thd, TABLE_SHARE *share, const char *alias,
|
||||
Fix the partition functions and ensure they are not constant
|
||||
functions
|
||||
*/
|
||||
outparam->part_info->is_auto_partitioned= share->auto_partitioned;
|
||||
DBUG_PRINT("info", ("autopartitioned = %u", share->auto_partitioned));
|
||||
if (fix_partition_func(thd, share->normalized_path.str, outparam,
|
||||
is_create_table))
|
||||
goto err;
|
||||
|
@ -213,6 +213,7 @@ typedef struct st_table_share
|
||||
*/
|
||||
bool log_table;
|
||||
#ifdef WITH_PARTITION_STORAGE_ENGINE
|
||||
bool auto_partitioned;
|
||||
const uchar *partition_info;
|
||||
uint partition_info_len;
|
||||
const uchar *part_state;
|
||||
|
@ -130,8 +130,14 @@ bool mysql_create_frm(THD *thd, const char *file_name,
|
||||
/* str_db_type */
|
||||
create_info->extra_size= (2 + str_db_type.length +
|
||||
2 + create_info->connect_string.length);
|
||||
/* Partition */
|
||||
create_info->extra_size+= 9;
|
||||
/*
|
||||
Partition:
|
||||
Length of partition info = 4 byte
|
||||
Potential NULL byte at end of partition info string = 1 byte
|
||||
Indicator if auto-partitioned table = 1 byte
|
||||
=> Total 6 byte
|
||||
*/
|
||||
create_info->extra_size+= 6;
|
||||
#ifdef WITH_PARTITION_STORAGE_ENGINE
|
||||
if (part_info)
|
||||
{
|
||||
@ -203,17 +209,19 @@ bool mysql_create_frm(THD *thd, const char *file_name,
|
||||
#ifdef WITH_PARTITION_STORAGE_ENGINE
|
||||
if (part_info)
|
||||
{
|
||||
char auto_partitioned= part_info->is_auto_partitioned ? 1 : 0;
|
||||
int4store(buff, part_info->part_info_len);
|
||||
if (my_write(file, (const byte*)buff, 4, MYF_RW) ||
|
||||
my_write(file, (const byte*)part_info->part_info_string,
|
||||
part_info->part_info_len + 1, MYF_RW))
|
||||
part_info->part_info_len + 1, MYF_RW) ||
|
||||
my_write(file, (const byte*)&auto_partitioned, 1, MYF_RW))
|
||||
goto err;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
bzero(buff, 9);
|
||||
if (my_write(file, (byte*) buff, 9, MYF_RW))
|
||||
bzero(buff, 6);
|
||||
if (my_write(file, (byte*) buff, 6, MYF_RW))
|
||||
goto err;
|
||||
}
|
||||
for (i= 0; i < keys; i++)
|
||||
|
Loading…
x
Reference in New Issue
Block a user