Commit 1e106724 authored by unknown's avatar unknown

bug#24667 After ALTER TABLE operation ndb_dd table becomes regular ndb: copy...

bug#24667  After ALTER TABLE operation ndb_dd table becomes regular ndb: copy tablespace from old table in copying alter table


parent 17472067
...@@ -282,7 +282,13 @@ a1 ...@@ -282,7 +282,13 @@ a1
18 18
19 19
20 20
SELECT * FROM information_schema.partitions WHERE table_name= 't1' AND partition_name = 'p0';
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME PARTITION_NAME SUBPARTITION_NAME PARTITION_ORDINAL_POSITION SUBPARTITION_ORDINAL_POSITION PARTITION_METHOD SUBPARTITION_METHOD PARTITION_EXPRESSION SUBPARTITION_EXPRESSION PARTITION_DESCRIPTION TABLE_ROWS AVG_ROW_LENGTH DATA_LENGTH MAX_DATA_LENGTH INDEX_LENGTH DATA_FREE CREATE_TIME UPDATE_TIME CHECK_TIME CHECKSUM PARTITION_COMMENT NODEGROUP TABLESPACE_NAME
NULL test t1 p0 NULL 1 NULL KEY NULL NULL NULL 0 0 0 NULL 0 0 NULL NULL NULL NULL default default ts
ALTER TABLE test.t1 ADD a2 FLOAT, ADD a3 DOUBLE; ALTER TABLE test.t1 ADD a2 FLOAT, ADD a3 DOUBLE;
SELECT * FROM information_schema.partitions WHERE table_name= 't1' AND partition_name = 'p0';
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME PARTITION_NAME SUBPARTITION_NAME PARTITION_ORDINAL_POSITION SUBPARTITION_ORDINAL_POSITION PARTITION_METHOD SUBPARTITION_METHOD PARTITION_EXPRESSION SUBPARTITION_EXPRESSION PARTITION_DESCRIPTION TABLE_ROWS AVG_ROW_LENGTH DATA_LENGTH MAX_DATA_LENGTH INDEX_LENGTH DATA_FREE CREATE_TIME UPDATE_TIME CHECK_TIME CHECKSUM PARTITION_COMMENT NODEGROUP TABLESPACE_NAME
NULL test t1 p0 NULL 1 NULL KEY NULL NULL NULL 0 0 0 NULL 0 0 NULL NULL NULL NULL default default ts
SELECT * FROM test.t1 ORDER BY a1; SELECT * FROM test.t1 ORDER BY a1;
a1 a2 a3 a1 a2 a3
1 2.2345 20000001 1 2.2345 20000001
...@@ -369,7 +375,7 @@ t1 CREATE TABLE `t1` ( ...@@ -369,7 +375,7 @@ t1 CREATE TABLE `t1` (
`a13` text, `a13` text,
`a14` blob, `a14` blob,
PRIMARY KEY (`a1`) PRIMARY KEY (`a1`)
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 ) /*!50100 TABLESPACE ts STORAGE DISK */ ENGINE=ndbcluster DEFAULT CHARSET=latin1
ALTER TABLE test.t1 ADD INDEX a2_i (a2), ADD INDEX a3_i (a3); ALTER TABLE test.t1 ADD INDEX a2_i (a2), ADD INDEX a3_i (a3);
SHOW CREATE TABLE test.t1; SHOW CREATE TABLE test.t1;
Table Create Table Table Create Table
...@@ -391,7 +397,7 @@ t1 CREATE TABLE `t1` ( ...@@ -391,7 +397,7 @@ t1 CREATE TABLE `t1` (
PRIMARY KEY (`a1`), PRIMARY KEY (`a1`),
KEY `a2_i` (`a2`), KEY `a2_i` (`a2`),
KEY `a3_i` (`a3`) KEY `a3_i` (`a3`)
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 ) /*!50100 TABLESPACE ts STORAGE DISK */ ENGINE=ndbcluster DEFAULT CHARSET=latin1
ALTER TABLE test.t1 DROP INDEX a2_i; ALTER TABLE test.t1 DROP INDEX a2_i;
SHOW CREATE TABLE test.t1; SHOW CREATE TABLE test.t1;
Table Create Table Table Create Table
...@@ -412,7 +418,7 @@ t1 CREATE TABLE `t1` ( ...@@ -412,7 +418,7 @@ t1 CREATE TABLE `t1` (
`a14` blob, `a14` blob,
PRIMARY KEY (`a1`), PRIMARY KEY (`a1`),
KEY `a3_i` (`a3`) KEY `a3_i` (`a3`)
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 ) /*!50100 TABLESPACE ts STORAGE DISK */ ENGINE=ndbcluster DEFAULT CHARSET=latin1
ALTER TABLE test.t1 DROP a14; ALTER TABLE test.t1 DROP a14;
ALTER TABLE test.t1 DROP a13; ALTER TABLE test.t1 DROP a13;
ALTER TABLE test.t1 DROP a12; ALTER TABLE test.t1 DROP a12;
...@@ -432,7 +438,7 @@ t1 CREATE TABLE `t1` ( ...@@ -432,7 +438,7 @@ t1 CREATE TABLE `t1` (
`a4` bit(1) DEFAULT NULL, `a4` bit(1) DEFAULT NULL,
`a5` tinyint(4) DEFAULT NULL, `a5` tinyint(4) DEFAULT NULL,
KEY `a3_i` (`a3`) KEY `a3_i` (`a3`)
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 ) /*!50100 TABLESPACE ts STORAGE DISK */ ENGINE=ndbcluster DEFAULT CHARSET=latin1
DROP TABLE test.t1; DROP TABLE test.t1;
ALTER TABLESPACE ts ALTER TABLESPACE ts
DROP DATAFILE './table_space/datafile.dat' DROP DATAFILE './table_space/datafile.dat'
......
...@@ -156,8 +156,12 @@ enable_query_log; ...@@ -156,8 +156,12 @@ enable_query_log;
SELECT * FROM test.t1 ORDER BY a1; SELECT * FROM test.t1 ORDER BY a1;
SELECT * FROM information_schema.partitions WHERE table_name= 't1' AND partition_name = 'p0';
ALTER TABLE test.t1 ADD a2 FLOAT, ADD a3 DOUBLE; ALTER TABLE test.t1 ADD a2 FLOAT, ADD a3 DOUBLE;
SELECT * FROM information_schema.partitions WHERE table_name= 't1' AND partition_name = 'p0';
let $1=20; let $1=20;
disable_query_log; disable_query_log;
while ($1) while ($1)
......
...@@ -9949,7 +9949,7 @@ int ha_ndbcluster::generate_scan_filter_from_key(NdbScanOperation *op, ...@@ -9949,7 +9949,7 @@ int ha_ndbcluster::generate_scan_filter_from_key(NdbScanOperation *op,
/* /*
get table space info for SHOW CREATE TABLE get table space info for SHOW CREATE TABLE
*/ */
char* ha_ndbcluster::get_tablespace_name(THD *thd) char* ha_ndbcluster::get_tablespace_name(THD *thd, char* name)
{ {
Ndb *ndb= check_ndb_in_thd(thd); Ndb *ndb= check_ndb_in_thd(thd);
NDBDICT *ndbdict= ndb->getDictionary(); NDBDICT *ndbdict= ndb->getDictionary();
...@@ -9967,7 +9967,13 @@ char* ha_ndbcluster::get_tablespace_name(THD *thd) ...@@ -9967,7 +9967,13 @@ char* ha_ndbcluster::get_tablespace_name(THD *thd)
ndberr= ndbdict->getNdbError(); ndberr= ndbdict->getNdbError();
if(ndberr.classification != NdbError::NoError) if(ndberr.classification != NdbError::NoError)
goto err; goto err;
return (my_strdup(ts.getName(), MYF(0))); if (name)
{
strxnmov(name, FN_LEN, ts.getName(), NullS);
return name;
}
else
return (my_strdup(ts.getName(), MYF(0)));
} }
err: err:
if (ndberr.status == NdbError::TemporaryError) if (ndberr.status == NdbError::TemporaryError)
......
...@@ -824,7 +824,7 @@ private: ...@@ -824,7 +824,7 @@ private:
uint set_up_partition_info(partition_info *part_info, uint set_up_partition_info(partition_info *part_info,
TABLE *table, TABLE *table,
void *tab); void *tab);
char* get_tablespace_name(THD *thd); char* get_tablespace_name(THD *thd, char *name);
int set_range_data(void *tab, partition_info* part_info); int set_range_data(void *tab, partition_info* part_info);
int set_list_data(void *tab, partition_info* part_info); int set_list_data(void *tab, partition_info* part_info);
int complemented_read(const byte *old_data, byte *new_data, int complemented_read(const byte *old_data, byte *new_data,
......
...@@ -1410,7 +1410,7 @@ public: ...@@ -1410,7 +1410,7 @@ public:
{ return FALSE; } { return FALSE; }
virtual char* get_foreign_key_create_info() virtual char* get_foreign_key_create_info()
{ return(NULL);} /* gets foreign key create string from InnoDB */ { return(NULL);} /* gets foreign key create string from InnoDB */
virtual char* get_tablespace_name(THD *thd) virtual char* get_tablespace_name(THD *thd, char *name)
{ return(NULL);} /* gets tablespace name from handler */ { return(NULL);} /* gets tablespace name from handler */
/* used in ALTER TABLE; 1 if changing storage engine is allowed */ /* used in ALTER TABLE; 1 if changing storage engine is allowed */
virtual bool can_switch_engines() { return 1; } virtual bool can_switch_engines() { return 1; }
......
...@@ -1267,7 +1267,7 @@ int store_create_info(THD *thd, TABLE_LIST *table_list, String *packet, ...@@ -1267,7 +1267,7 @@ int store_create_info(THD *thd, TABLE_LIST *table_list, String *packet,
to the CREATE TABLE statement to the CREATE TABLE statement
*/ */
if ((for_str= file->get_tablespace_name(thd))) if ((for_str= file->get_tablespace_name(thd,0)))
{ {
packet->append(STRING_WITH_LEN(" /*!50100 TABLESPACE ")); packet->append(STRING_WITH_LEN(" /*!50100 TABLESPACE "));
packet->append(for_str, strlen(for_str)); packet->append(for_str, strlen(for_str));
...@@ -3974,7 +3974,7 @@ static void store_schema_partitions_record(THD *thd, TABLE *schema_table, ...@@ -3974,7 +3974,7 @@ static void store_schema_partitions_record(THD *thd, TABLE *schema_table,
strlen(part_elem->tablespace_name), cs); strlen(part_elem->tablespace_name), cs);
else else
{ {
char *ts= showing_table->file->get_tablespace_name(thd); char *ts= showing_table->file->get_tablespace_name(thd,0);
if(ts) if(ts)
{ {
table->field[24]->store(ts, strlen(ts), cs); table->field[24]->store(ts, strlen(ts), cs);
......
...@@ -5307,7 +5307,7 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name, ...@@ -5307,7 +5307,7 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
int error; int error;
char tmp_name[80],old_name[32],new_name_buff[FN_REFLEN]; char tmp_name[80],old_name[32],new_name_buff[FN_REFLEN];
char new_alias_buff[FN_REFLEN], *table_name, *db, *new_alias, *alias; char new_alias_buff[FN_REFLEN], *table_name, *db, *new_alias, *alias;
char index_file[FN_REFLEN], data_file[FN_REFLEN]; char index_file[FN_REFLEN], data_file[FN_REFLEN], tablespace[FN_LEN];
char path[FN_REFLEN]; char path[FN_REFLEN];
char reg_path[FN_REFLEN+1]; char reg_path[FN_REFLEN+1];
ha_rows copied,deleted; ha_rows copied,deleted;
...@@ -5630,6 +5630,15 @@ view_err: ...@@ -5630,6 +5630,15 @@ view_err:
if (!(used_fields & HA_CREATE_USED_KEY_BLOCK_SIZE)) if (!(used_fields & HA_CREATE_USED_KEY_BLOCK_SIZE))
create_info->key_block_size= table->s->key_block_size; create_info->key_block_size= table->s->key_block_size;
if (!create_info->tablespace)
{
/*
Regular alter table of disk stored table (no tablespace change)
Copy tablespace name
*/
if (table->file->get_tablespace_name(thd, (char *) &tablespace))
create_info->tablespace= (char *) &tablespace;
}
restore_record(table, s->default_values); // Empty record for DEFAULT restore_record(table, s->default_values); // Empty record for DEFAULT
List_iterator<Alter_drop> drop_it(alter_info->drop_list); List_iterator<Alter_drop> drop_it(alter_info->drop_list);
List_iterator<create_field> def_it(fields); List_iterator<create_field> def_it(fields);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment