summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/partition_info.cc22
-rw-r--r--sql/partition_info.h4
-rw-r--r--sql/sql_parse.cc4
-rw-r--r--sql/sql_partition.cc4
4 files changed, 27 insertions, 7 deletions
diff --git a/sql/partition_info.cc b/sql/partition_info.cc
index 336010cc7dd..a0d09557b81 100644
--- a/sql/partition_info.cc
+++ b/sql/partition_info.cc
@@ -31,7 +31,7 @@
#include "ha_partition.h"
-partition_info *partition_info::get_clone()
+partition_info *partition_info::get_clone(bool reset /* = false */)
{
if (!this)
return 0;
@@ -57,6 +57,26 @@ partition_info *partition_info::get_clone()
return NULL;
}
memcpy(part_clone, part, sizeof(partition_element));
+
+ /*
+ Mark that RANGE and LIST values needs to be fixed so that we don't
+ use old values. fix_column_value_functions would evaluate the values
+ from Item expression.
+ */
+ if (reset)
+ {
+ clone->defined_max_value = false;
+ List_iterator<part_elem_value> list_it(part_clone->list_val_list);
+ while (part_elem_value *list_value= list_it++)
+ {
+ part_column_list_val *col_val= list_value->col_val_array;
+ for (uint i= 0; i < num_columns; col_val++, i++)
+ {
+ col_val->fixed= 0;
+ }
+ }
+ }
+
part_clone->subpartitions.empty();
while ((subpart= (subpart_it++)))
{
diff --git a/sql/partition_info.h b/sql/partition_info.h
index 806b15da1ea..7bfbf8a1b1a 100644
--- a/sql/partition_info.h
+++ b/sql/partition_info.h
@@ -1,7 +1,7 @@
#ifndef PARTITION_INFO_INCLUDED
#define PARTITION_INFO_INCLUDED
-/* Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
+/* Copyright (c) 2006, 2015, Oracle and/or its affiliates. All rights reserved.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -265,7 +265,7 @@ public:
}
~partition_info() {}
- partition_info *get_clone();
+ partition_info *get_clone(bool reset = false);
/* Answers the question if subpartitioning is used for a certain table */
bool is_sub_partitioned()
{
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index f52f56447f4..e1fc26775a4 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -1,4 +1,4 @@
-/* Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
+/* Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -2428,7 +2428,7 @@ case SQLCOM_PREPARE:
#ifdef WITH_PARTITION_STORAGE_ENGINE
{
partition_info *part_info= thd->lex->part_info;
- if (part_info && !(part_info= thd->lex->part_info->get_clone()))
+ if (part_info && !(part_info= thd->lex->part_info->get_clone(true)))
{
res= -1;
goto end_with_restore_list;
diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc
index c615ee96d03..5358535e9f9 100644
--- a/sql/sql_partition.cc
+++ b/sql/sql_partition.cc
@@ -1,4 +1,4 @@
-/* Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
+/* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -4718,7 +4718,7 @@ uint prep_alter_part_table(THD *thd, TABLE *table, Alter_info *alter_info,
thd->work_part_info= thd->lex->part_info;
if (thd->work_part_info &&
- !(thd->work_part_info= thd->lex->part_info->get_clone()))
+ !(thd->work_part_info= thd->lex->part_info->get_clone(true)))
DBUG_RETURN(TRUE);
/* ALTER_ADMIN_PARTITION is handled in mysql_admin_table */