summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorunknown <mikael@c-870ae253.1238-1-64736c10.cust.bredbandsbolaget.se>2006-04-21 09:22:13 -0400
committerunknown <mikael@c-870ae253.1238-1-64736c10.cust.bredbandsbolaget.se>2006-04-21 09:22:13 -0400
commit10f571384d491cc5a11554a5eed37f1b0c591114 (patch)
tree6a955e4563e02f5f6fe38ebc6841fe37d514acdb /sql
parent17e3ee35531d0003de31093570e64f604bd8c4fa (diff)
parent661537c744232bb2e110bf9e8973deb962d2a72b (diff)
downloadmariadb-git-10f571384d491cc5a11554a5eed37f1b0c591114.tar.gz
Merge mronstrom@bk-internal.mysql.com:/home/bk/bugs/bug19067
into c-870ae253.1238-1-64736c10.cust.bredbandsbolaget.se:/home/pappa/bug19067
Diffstat (limited to 'sql')
-rw-r--r--sql/partition_element.h16
-rw-r--r--sql/partition_info.cc68
-rw-r--r--sql/partition_info.h2
-rw-r--r--sql/sql_partition.cc23
-rw-r--r--sql/sql_partition.h3
-rw-r--r--sql/sql_show.cc2
-rw-r--r--sql/sql_table.cc4
7 files changed, 83 insertions, 35 deletions
diff --git a/sql/partition_element.h b/sql/partition_element.h
index d20715d2408..51a54771ee3 100644
--- a/sql/partition_element.h
+++ b/sql/partition_element.h
@@ -63,5 +63,21 @@ public:
subpartitions.empty();
list_val_list.empty();
}
+ partition_element(partition_element *part_elem)
+ : partition_name(NULL), range_value(0), has_null_value(FALSE)
+ {
+ subpartitions.empty();
+ list_val_list.empty();
+
+ part_max_rows= part_elem->part_max_rows;
+ part_min_rows= part_elem->part_min_rows;
+ tablespace_name= part_elem->tablespace_name;
+ part_comment= part_elem->part_comment;
+ data_file_name= part_elem->data_file_name;
+ index_file_name= part_elem->index_file_name;
+ engine_type= part_elem->engine_type;
+ part_state= part_elem->part_state;
+ nodegroup_id= part_elem->nodegroup_id;
+ }
~partition_element() {}
};
diff --git a/sql/partition_info.cc b/sql/partition_info.cc
index e2bf37d6ef3..01fe5aaf500 100644
--- a/sql/partition_info.cc
+++ b/sql/partition_info.cc
@@ -91,7 +91,7 @@ partition_info *partition_info::get_clone()
#define MAX_PART_NAME_SIZE 16
char *partition_info::create_default_partition_names(uint part_no, uint no_parts,
- uint start_no, bool is_subpart)
+ uint start_no)
{
char *ptr= sql_calloc(no_parts*MAX_PART_NAME_SIZE);
char *move_ptr= ptr;
@@ -102,10 +102,7 @@ char *partition_info::create_default_partition_names(uint part_no, uint no_parts
{
do
{
- if (is_subpart)
- my_sprintf(move_ptr, (move_ptr,"p%usp%u", part_no, (start_no + i)));
- else
- my_sprintf(move_ptr, (move_ptr,"p%u", (start_no + i)));
+ my_sprintf(move_ptr, (move_ptr,"p%u", (start_no + i)));
move_ptr+=MAX_PART_NAME_SIZE;
} while (++i < no_parts);
}
@@ -118,6 +115,35 @@ char *partition_info::create_default_partition_names(uint part_no, uint no_parts
/*
+ Create a unique name for the subpartition as part_name'sp''subpart_no'
+ SYNOPSIS
+ create_subpartition_name()
+ subpart_no Number of subpartition
+ part_name Name of partition
+ RETURN VALUES
+ >0 A reference to the created name string
+ 0 Memory allocation error
+*/
+
+char *create_subpartition_name(uint subpart_no, const char *part_name)
+{
+ uint size_alloc= strlen(part_name) + MAX_PART_NAME_SIZE;
+ char *ptr= sql_calloc(size_alloc);
+ DBUG_ENTER("create_subpartition_name");
+
+ if (likely(ptr != NULL))
+ {
+ my_sprintf(ptr, (ptr, "%ssp%u", part_name, subpart_no));
+ }
+ else
+ {
+ mem_alloc_error(size_alloc);
+ }
+ DBUG_RETURN(ptr);
+}
+
+
+/*
Set up all the default partitions not set-up by the user in the SQL
statement. Also perform a number of checks that the user hasn't tried
to use default values where no defaults exists.
@@ -167,8 +193,7 @@ bool partition_info::set_up_default_partitions(handler *file, ulonglong max_rows
goto end;
}
if (unlikely((!(default_name= create_default_partition_names(0, no_parts,
- start_no,
- FALSE)))))
+ start_no)))))
goto end;
i= 0;
do
@@ -238,18 +263,17 @@ bool partition_info::set_up_default_subpartitions(handler *file,
{
part_elem= part_it++;
j= 0;
- name_ptr= create_default_partition_names(i, no_subparts, (uint)0, TRUE);
- if (unlikely(!name_ptr))
- goto end;
do
{
- partition_element *subpart_elem= new partition_element();
+ partition_element *subpart_elem= new partition_element(part_elem);
if (likely(subpart_elem != 0 &&
(!part_elem->subpartitions.push_back(subpart_elem))))
{
+ char *ptr= create_subpartition_name(j, part_elem->partition_name);
+ if (!ptr)
+ goto end;
subpart_elem->engine_type= default_engine_type;
- subpart_elem->partition_name= name_ptr;
- name_ptr+= MAX_PART_NAME_SIZE;
+ subpart_elem->partition_name= ptr;
}
else
{
@@ -694,6 +718,8 @@ bool partition_info::check_partition_info(handlerton **eng_type,
do
{
partition_element *part_elem= part_it++;
+ if (part_elem->engine_type == NULL)
+ part_elem->engine_type= default_engine_type;
if (!is_sub_partitioned())
{
if (check_table_name(part_elem->partition_name,
@@ -702,8 +728,6 @@ bool partition_info::check_partition_info(handlerton **eng_type,
my_error(ER_WRONG_PARTITION_NAME, MYF(0));
goto end;
}
- if (part_elem->engine_type == NULL)
- part_elem->engine_type= default_engine_type;
DBUG_PRINT("info", ("engine = %d",
ha_legacy_type(part_elem->engine_type)));
engine_array[part_count++]= part_elem->engine_type;
@@ -714,18 +738,18 @@ bool partition_info::check_partition_info(handlerton **eng_type,
List_iterator<partition_element> sub_it(part_elem->subpartitions);
do
{
- part_elem= sub_it++;
- if (check_table_name(part_elem->partition_name,
- strlen(part_elem->partition_name)))
+ partition_element *sub_elem= sub_it++;
+ if (check_table_name(sub_elem->partition_name,
+ strlen(sub_elem->partition_name)))
{
my_error(ER_WRONG_PARTITION_NAME, MYF(0));
goto end;
}
- if (part_elem->engine_type == NULL)
- part_elem->engine_type= default_engine_type;
+ if (sub_elem->engine_type == NULL)
+ sub_elem->engine_type= default_engine_type;
DBUG_PRINT("info", ("engine = %u",
- ha_legacy_type(part_elem->engine_type)));
- engine_array[part_count++]= part_elem->engine_type;
+ ha_legacy_type(sub_elem->engine_type)));
+ engine_array[part_count++]= sub_elem->engine_type;
} while (++j < no_subparts);
}
} while (++i < no_parts);
diff --git a/sql/partition_info.h b/sql/partition_info.h
index 664c8834b0b..ecba048c486 100644
--- a/sql/partition_info.h
+++ b/sql/partition_info.h
@@ -256,7 +256,7 @@ private:
uint start_no);
bool set_up_default_subpartitions(handler *file, ulonglong max_rows);
char *create_default_partition_names(uint part_no, uint no_parts,
- uint start_no, bool is_subpart);
+ uint start_no);
bool has_unique_name(partition_element *element);
};
diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc
index aae80f07b71..a657e22616e 100644
--- a/sql/sql_partition.cc
+++ b/sql/sql_partition.cc
@@ -1754,7 +1754,6 @@ end:
buf_length A pointer to the returned buffer length
use_sql_alloc Allocate buffer from sql_alloc if true
otherwise use my_malloc
- write_all Write everything, also default values
RETURN VALUES
NULL error
@@ -1782,8 +1781,7 @@ end:
char *generate_partition_syntax(partition_info *part_info,
uint *buf_length,
- bool use_sql_alloc,
- bool write_all)
+ bool use_sql_alloc)
{
uint i,j, tot_no_parts, no_subparts, no_parts;
partition_element *part_elem;
@@ -1869,7 +1867,7 @@ char *generate_partition_syntax(partition_info *part_info,
tot_no_parts= no_parts + no_temp_parts;
no_subparts= part_info->no_subparts;
- if (write_all || (!part_info->use_default_partitions))
+ if (!part_info->use_default_partitions)
{
err+= add_begin_parenthesis(fptr);
i= 0;
@@ -1930,10 +1928,11 @@ char *generate_partition_syntax(partition_info *part_info,
err+= add_name_string(fptr, part_elem->partition_name);
err+= add_space(fptr);
err+= add_partition_values(fptr, part_info, part_elem);
- if (!part_info->is_sub_partitioned())
+ if (!part_info->is_sub_partitioned() ||
+ part_info->use_default_subpartitions)
err+= add_partition_options(fptr, part_elem);
if (part_info->is_sub_partitioned() &&
- (write_all || (!part_info->use_default_subpartitions)))
+ (!part_info->use_default_subpartitions))
{
err+= add_space(fptr);
err+= add_begin_parenthesis(fptr);
@@ -3949,6 +3948,7 @@ uint prep_alter_part_table(THD *thd, TABLE *table, ALTER_INFO *alter_info,
DBUG_RETURN(TRUE);
}
alt_part_info->part_type= tab_part_info->part_type;
+ alt_part_info->subpart_type= tab_part_info->subpart_type;
if (alt_part_info->set_up_defaults_for_partitioning(table->file,
ULL(0),
tab_part_info->no_parts))
@@ -4377,6 +4377,15 @@ state of p1.
my_error(ER_TOO_MANY_PARTITIONS_ERROR, MYF(0));
DBUG_RETURN(TRUE);
}
+ alt_part_info->part_type= tab_part_info->part_type;
+ alt_part_info->subpart_type= tab_part_info->subpart_type;
+ DBUG_ASSERT(!alt_part_info->use_default_partitions);
+ if (alt_part_info->set_up_defaults_for_partitioning(table->file,
+ ULL(0),
+ 0))
+ {
+ DBUG_RETURN(TRUE);
+ }
/*
Online handling:
REORGANIZE PARTITION:
@@ -4513,7 +4522,7 @@ the generated partition syntax in a correct manner.
tab_part_info->use_default_no_subpartitions= FALSE;
}
if (tab_part_info->check_partition_info((handlerton**)NULL,
- table->file, ULL(0)))
+ table->file, ULL(0)))
{
DBUG_RETURN(TRUE);
}
diff --git a/sql/sql_partition.h b/sql/sql_partition.h
index fd2c474236f..87f9a751ca3 100644
--- a/sql/sql_partition.h
+++ b/sql/sql_partition.h
@@ -69,8 +69,7 @@ bool check_partition_info(partition_info *part_info,handlerton **eng_type,
bool fix_partition_func(THD *thd, const char *name, TABLE *table,
bool create_table_ind);
char *generate_partition_syntax(partition_info *part_info,
- uint *buf_length, bool use_sql_alloc,
- bool write_all);
+ uint *buf_length, bool use_sql_alloc);
bool partition_key_modified(TABLE *table, List<Item> &fields);
void get_partition_set(const TABLE *table, byte *buf, const uint index,
const key_range *key_spec,
diff --git a/sql/sql_show.cc b/sql/sql_show.cc
index 95433828a1e..f26deb6eba9 100644
--- a/sql/sql_show.cc
+++ b/sql/sql_show.cc
@@ -1276,7 +1276,7 @@ store_create_info(THD *thd, TABLE_LIST *table_list, String *packet,
if (table->part_info &&
((part_syntax= generate_partition_syntax(table->part_info,
&part_syntax_len,
- FALSE,FALSE))))
+ FALSE))))
{
packet->append(part_syntax, part_syntax_len);
my_free(part_syntax, MYF(0));
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index 6cc2ad266e5..f23b664126e 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -323,7 +323,7 @@ bool mysql_write_frm(ALTER_PARTITION_PARAM_TYPE *lpt, uint flags)
part_info->part_state_len= 0;
if (!(part_syntax_buf= generate_partition_syntax(part_info,
&syntax_len,
- TRUE, FALSE)))
+ TRUE)))
{
DBUG_RETURN(TRUE);
}
@@ -2159,7 +2159,7 @@ bool mysql_create_table_internal(THD *thd,
*/
if (!(part_syntax_buf= generate_partition_syntax(part_info,
&syntax_len,
- TRUE, FALSE)))
+ TRUE)))
goto err;
part_info->part_info_string= part_syntax_buf;
part_info->part_info_len= syntax_len;