mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
BUG#19010: Fix issues with that ALTER TABLE from auto-partitioned NDB table doesn't work unless primary key exists on table.
This commit is contained in:

parent
4ba1a4b3cd
commit
56b97747de
@ -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++)
|
||||
|
Reference in New Issue
Block a user