summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
Diffstat (limited to 'sql')
-rw-r--r--sql/item.cc2
-rw-r--r--sql/item.h6
-rw-r--r--sql/item_cmpfunc.cc43
-rw-r--r--sql/item_cmpfunc.h6
-rw-r--r--sql/key.cc6
-rw-r--r--sql/mysqld.cc2
-rw-r--r--sql/sql_class.cc8
-rw-r--r--sql/sql_class.h4
-rw-r--r--sql/sql_derived.cc20
-rw-r--r--sql/sql_partition.cc59
-rw-r--r--sql/sql_select.cc3
11 files changed, 151 insertions, 8 deletions
diff --git a/sql/item.cc b/sql/item.cc
index f26e8e1b654..5f8cf6c80f7 100644
--- a/sql/item.cc
+++ b/sql/item.cc
@@ -10004,7 +10004,7 @@ const char *dbug_print_item(Item *item)
if (!item)
return "(Item*)NULL";
item->print(&str ,QT_ORDINARY);
- if (str.c_ptr() == buf)
+ if (str.c_ptr_safe() == buf)
return buf;
else
return "Couldn't fit into buffer";
diff --git a/sql/item.h b/sql/item.h
index 75575737539..7856328a33b 100644
--- a/sql/item.h
+++ b/sql/item.h
@@ -49,6 +49,12 @@ bool trace_unsupported_by_check_vcol_func_processor(const char *where)
return trace_unsupported_func(where, "check_vcol_func_processor");
}
+#ifdef DBUG_OFF
+static inline const char *dbug_print_item(Item *item) { return NULL; }
+#else
+extern const char *dbug_print_item(Item *item);
+#endif
+
class Protocol;
struct TABLE_LIST;
void item_init(void); /* Init item functions */
diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc
index 1df19e75d65..f30adda167e 100644
--- a/sql/item_cmpfunc.cc
+++ b/sql/item_cmpfunc.cc
@@ -1445,6 +1445,7 @@ bool Item_in_optimizer::is_top_level_item()
void Item_in_optimizer::fix_after_pullout(st_select_lex *new_parent,
Item **ref, bool merge)
{
+ DBUG_ASSERT(fixed);
/* This will re-calculate attributes of our Item_in_subselect: */
Item_bool_func::fix_after_pullout(new_parent, ref, merge);
@@ -1468,7 +1469,38 @@ bool Item_in_optimizer::eval_not_null_tables(uchar *opt_arg)
}
+<<<<<<< HEAD
bool Item_in_optimizer::fix_left(THD *thd)
+=======
+void Item_in_optimizer::print(String *str, enum_query_type query_type)
+{
+ restore_first_argumet();
+ Item_func::print(str, query_type);
+}
+
+
+/**
+ "Restore" first argument before fix_fields() call (after it is harmless).
+
+ @Note: Main pointer to left part of IN/ALL/ANY subselect is subselect's
+ lest_expr (see Item_in_optimizer::fix_left) so changes made during
+ fix_fields will be rolled back there which can make
+ Item_in_optimizer::args[0] unusable on second execution before fix_left()
+ call. This call fix the pointer.
+*/
+
+void Item_in_optimizer::restore_first_argumet()
+{
+ if (args[1]->type() == Item::SUBSELECT_ITEM &&
+ ((Item_subselect *)args[1])->is_in_predicate())
+ {
+ args[0]= ((Item_in_subselect *)args[1])->left_expr;
+ }
+}
+
+
+bool Item_in_optimizer::fix_left(THD *thd, Item **ref)
+>>>>>>> origin/5.5
{
DBUG_ENTER("Item_in_optimizer::fix_left");
/*
@@ -1645,9 +1677,16 @@ Item *Item_in_optimizer::expr_cache_insert_transformer(uchar *thd_arg)
{
THD *thd= (THD*) thd_arg;
DBUG_ENTER("Item_in_optimizer::expr_cache_insert_transformer");
+<<<<<<< HEAD
if (invisible_mode())
DBUG_RETURN(this);
+=======
+ DBUG_ASSERT(fixed);
+
+ if (args[1]->type() != Item::SUBSELECT_ITEM)
+ DBUG_RETURN(this); // MAX/MIN transformed => do nothing
+>>>>>>> origin/5.5
if (expr_cache)
DBUG_RETURN(expr_cache);
@@ -1669,6 +1708,7 @@ Item *Item_in_optimizer::expr_cache_insert_transformer(uchar *thd_arg)
void Item_in_optimizer::get_cache_parameters(List<Item> &parameters)
{
+ DBUG_ASSERT(fixed);
/* Add left expression to the list of the parameters of the subquery */
if (!invisible_mode())
{
@@ -1906,6 +1946,7 @@ Item *Item_in_optimizer::transform(Item_transformer transformer,
{
Item *new_item;
+ DBUG_ASSERT(fixed);
DBUG_ASSERT(!current_thd->stmt_arena->is_stmt_prepare());
DBUG_ASSERT(arg_count == 2);
@@ -1957,6 +1998,7 @@ Item *Item_in_optimizer::transform(Item_transformer transformer,
bool Item_in_optimizer::is_expensive_processor(uchar *arg)
{
+ DBUG_ASSERT(fixed);
return args[0]->is_expensive_processor(arg) ||
args[1]->is_expensive_processor(arg);
}
@@ -1964,6 +2006,7 @@ bool Item_in_optimizer::is_expensive_processor(uchar *arg)
bool Item_in_optimizer::is_expensive()
{
+ DBUG_ASSERT(fixed);
return args[0]->is_expensive() || args[1]->is_expensive();
}
diff --git a/sql/item_cmpfunc.h b/sql/item_cmpfunc.h
index fc906fd63d8..56332c792de 100644
--- a/sql/item_cmpfunc.h
+++ b/sql/item_cmpfunc.h
@@ -272,9 +272,15 @@ public:
virtual void get_cache_parameters(List<Item> &parameters);
bool is_top_level_item();
bool eval_not_null_tables(uchar *opt_arg);
+<<<<<<< HEAD
void fix_after_pullout(st_select_lex *new_parent, Item **ref, bool merge);
bool invisible_mode();
void reset_cache() { cache= NULL; }
+=======
+ void fix_after_pullout(st_select_lex *new_parent, Item **ref);
+ virtual void print(String *str, enum_query_type query_type);
+ void restore_first_argumet();
+>>>>>>> origin/5.5
};
class Comp_creator
diff --git a/sql/key.cc b/sql/key.cc
index aaaea9391c6..414c3392cff 100644
--- a/sql/key.cc
+++ b/sql/key.cc
@@ -65,7 +65,8 @@ int find_ref_key(KEY *key, uint key_count, uchar *record, Field *field,
i < (int) key_count ;
i++, key_info++)
{
- if (key_info->key_part[0].offset == fieldpos)
+ if (key_info->key_part[0].offset == fieldpos &&
+ key_info->key_part[0].field->type() != MYSQL_TYPE_BIT)
{ /* Found key. Calc keylength */
*key_length= *keypart= 0;
return i; /* Use this key */
@@ -84,7 +85,8 @@ int find_ref_key(KEY *key, uint key_count, uchar *record, Field *field,
j < key_info->user_defined_key_parts ;
j++, key_part++)
{
- if (key_part->offset == fieldpos)
+ if (key_part->offset == fieldpos &&
+ key_part->field->type() != MYSQL_TYPE_BIT)
{
*keypart= j;
return i; /* Use this key */
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index d9320fa3bcf..435fb07279f 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -3913,7 +3913,7 @@ static int init_common_variables()
/* TODO: remove this when my_time_t is 64 bit compatible */
if (!IS_TIME_T_VALID_FOR_TIMESTAMP(server_start_time))
{
- sql_print_error("This MySQL server doesn't support dates later then 2038");
+ sql_print_error("This MySQL server doesn't support dates later than 2038");
return 1;
}
diff --git a/sql/sql_class.cc b/sql/sql_class.cc
index 1f5c465a37a..c20f9054c2b 100644
--- a/sql/sql_class.cc
+++ b/sql/sql_class.cc
@@ -2436,6 +2436,9 @@ void THD::check_and_register_item_tree_change(Item **place, Item **new_value,
MEM_ROOT *runtime_memroot)
{
Item_change_record *change;
+ DBUG_ENTER("THD::check_and_register_item_tree_change");
+ DBUG_PRINT("enter", ("Register: %p (%p) <- %p (%p)",
+ *place, place, *new_value, new_value));
I_List_iterator<Item_change_record> it(change_list);
while ((change= it++))
{
@@ -2445,6 +2448,7 @@ void THD::check_and_register_item_tree_change(Item **place, Item **new_value,
if (change)
nocheck_register_item_tree_change(place, change->old_value,
runtime_memroot);
+ DBUG_VOID_RETURN;
}
@@ -2452,17 +2456,13 @@ void THD::rollback_item_tree_changes()
{
I_List_iterator<Item_change_record> it(change_list);
Item_change_record *change;
- DBUG_ENTER("rollback_item_tree_changes");
while ((change= it++))
{
- DBUG_PRINT("info", ("revert %p -> %p",
- change->old_value, (*change->place)));
*change->place= change->old_value;
}
/* We can forget about changes memory: it's allocated in runtime memroot */
change_list.empty();
- DBUG_VOID_RETURN;
}
diff --git a/sql/sql_class.h b/sql/sql_class.h
index 925260badc5..518e88fcd1c 100644
--- a/sql/sql_class.h
+++ b/sql/sql_class.h
@@ -3265,10 +3265,14 @@ public:
void change_item_tree(Item **place, Item *new_value)
{
+ DBUG_ENTER("THD::change_item_tree");
+ DBUG_PRINT("enter", ("Register: %p (%p) <- %p",
+ *place, place, new_value));
/* TODO: check for OOM condition here */
if (!stmt_arena->is_conventional())
nocheck_register_item_tree_change(place, *place, mem_root);
*place= new_value;
+ DBUG_VOID_RETURN;
}
/**
Make change in item tree after checking whether it needs registering
diff --git a/sql/sql_derived.cc b/sql/sql_derived.cc
index e9928572142..7ad0b4b4c69 100644
--- a/sql/sql_derived.cc
+++ b/sql/sql_derived.cc
@@ -367,7 +367,11 @@ bool mysql_derived_merge(THD *thd, LEX *lex, TABLE_LIST *derived)
derived->get_unit()));
if (derived->merged)
+ {
+
+ DBUG_PRINT("info", ("Irreversibly merged: exit"));
DBUG_RETURN(FALSE);
+ }
if (dt_select->uncacheable & UNCACHEABLE_RAND)
{
@@ -678,6 +682,17 @@ bool mysql_derived_prepare(THD *thd, LEX *lex, TABLE_LIST *derived)
unit->derived= derived;
+ /*
+ Above cascade call of prepare is important for PS protocol, but after it
+ is called we can check if we really need prepare for this derived
+ */
+ if (derived->merged)
+ {
+ DBUG_PRINT("info", ("Irreversibly merged: exit"));
+ DBUG_RETURN(FALSE);
+ }
+
+
derived->fill_me= FALSE;
if (!(derived->derived_result= new select_union))
@@ -807,6 +822,11 @@ bool mysql_derived_optimize(THD *thd, LEX *lex, TABLE_LIST *derived)
DBUG_PRINT("enter", ("Alias: '%s' Unit: %p",
(derived->alias ? derived->alias : "<NULL>"),
derived->get_unit()));
+ if (derived->merged)
+ {
+ DBUG_PRINT("info", ("Irreversibly merged: exit"));
+ DBUG_RETURN(FALSE);
+ }
if (unit->optimized)
DBUG_RETURN(FALSE);
diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc
index dd1f60ec078..6bd107b08d9 100644
--- a/sql/sql_partition.cc
+++ b/sql/sql_partition.cc
@@ -283,7 +283,66 @@ bool partition_default_handling(TABLE *table, partition_info *part_info,
}
}
part_info->set_up_defaults_for_partitioning(table->file,
+<<<<<<< HEAD
NULL, 0U);
+=======
+ NULL, (uint)0);
+ DBUG_RETURN(FALSE);
+}
+
+
+/*
+ Check that the reorganized table will not have duplicate partitions.
+
+ SYNOPSIS
+ check_reorganise_list()
+ new_part_info New partition info
+ old_part_info Old partition info
+ list_part_names The list of partition names that will go away and
+ can be reused in the new table.
+
+ RETURN VALUES
+ TRUE Inacceptable name conflict detected.
+ FALSE New names are OK.
+
+ DESCRIPTION
+ Can handle that the 'new_part_info' and 'old_part_info' the same
+ in which case it checks that the list of names in the partitions
+ doesn't contain any duplicated names.
+*/
+
+bool check_reorganise_list(partition_info *new_part_info,
+ partition_info *old_part_info,
+ List<char> list_part_names)
+{
+ uint new_count, old_count;
+ uint num_new_parts= new_part_info->partitions.elements;
+ uint num_old_parts= old_part_info->partitions.elements;
+ List_iterator<partition_element> new_parts_it(new_part_info->partitions);
+ bool same_part_info= (new_part_info == old_part_info);
+ DBUG_ENTER("check_reorganise_list");
+
+ new_count= 0;
+ do
+ {
+ List_iterator<partition_element> old_parts_it(old_part_info->partitions);
+ char *new_name= (new_parts_it++)->partition_name;
+ new_count++;
+ old_count= 0;
+ do
+ {
+ char *old_name= (old_parts_it++)->partition_name;
+ old_count++;
+ if (same_part_info && old_count == new_count)
+ break;
+ if (!(my_strcasecmp(system_charset_info, old_name, new_name)))
+ {
+ if (!is_name_in_list(old_name, list_part_names))
+ DBUG_RETURN(TRUE);
+ }
+ } while (old_count < num_old_parts);
+ } while (new_count < num_new_parts);
+>>>>>>> origin/5.5
DBUG_RETURN(FALSE);
}
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index 6a0362f9652..fd8ff6eb016 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -701,6 +701,9 @@ JOIN::prepare(Item ***rref_pointer_array,
join_list= &select_lex->top_join_list;
union_part= unit_arg->is_union();
+ // simple check that we got usable conds
+ dbug_print_item(conds);
+
if (select_lex->handle_derived(thd->lex, DT_PREPARE))
DBUG_RETURN(1);