Commit 80c07fba authored by Alexey Botchkov's avatar Alexey Botchkov

mysql_prepare_insert run in prelocking.

parent 9ca355a5
...@@ -703,30 +703,46 @@ Field **TABLE::field_to_fill() ...@@ -703,30 +703,46 @@ Field **TABLE::field_to_fill()
class Insert_prelocking_strategy : public DML_prelocking_strategy class Insert_prelocking_strategy : public DML_prelocking_strategy
{ {
bool m_done; bool m_done;
bool m_retval;
TABLE_LIST *m_table_list; TABLE_LIST *m_table_list;
enum_duplicates m_duplic; enum_duplicates m_duplic;
bool m_ignore;
List<Item> *m_fields; List<Item> *m_fields;
List<List_item> *m_values_list;
List<Item> *m_update_fields; List<Item> *m_update_fields;
List<List_item> *m_values; List<Item> *m_update_values;
// bool has_prelocking_list; // bool has_prelocking_list;
public: public:
Insert_prelocking_strategy(TABLE_LIST *table_list, Insert_prelocking_strategy(TABLE_LIST *table_list,
List<Item> *fields, List<Item> *update_fields, List<Item> *fields, List<List_item> *values_list,
List<List_item> *values, enum_duplicates duplic) : List<Item> *update_fields,
DML_prelocking_strategy(), m_table_list(table_list), m_duplic(duplic), List<Item> *update_values,
m_fields(fields), m_update_fields(update_fields), m_values(values) enum_duplicates duplic, bool ignore) :
DML_prelocking_strategy(), m_retval(TRUE), m_table_list(table_list),
m_duplic(duplic), m_ignore(ignore), m_fields(fields),
m_values_list(values_list), m_update_fields(update_fields),
m_update_values(update_values)
{} {}
void reset(THD *thd); void reset(THD *thd);
bool handle_end(THD *thd); bool handle_end(THD *thd);
bool retval() const { return m_retval; }
}; };
void Insert_prelocking_strategy::reset(THD *thd) void Insert_prelocking_strategy::reset(THD *thd)
{ {
m_done= false; m_done= false;
} }
#ifdef WITH_PARTITION_STORAGE_ENGINE
#include "partition_info.h"
#ifdef VER0
/** /**
Allocates and initializes a MY_BITMAP bitmap, containing one bit per column Allocates and initializes a MY_BITMAP bitmap, containing one bit per column
in the table. The table THD's MEM_ROOT is used to allocate memory. in the table. The table THD's MEM_ROOT is used to allocate memory.
...@@ -816,8 +832,6 @@ static MY_BITMAP *get_function_default_columns(TABLE *table, ...@@ -816,8 +832,6 @@ static MY_BITMAP *get_function_default_columns(TABLE *table,
end: end:
DBUG_RETURN(function_default_columns); DBUG_RETURN(function_default_columns);
} }
static MY_BITMAP *add_function_default_columns(TABLE *table, MY_BITMAP *columns, static MY_BITMAP *add_function_default_columns(TABLE *table, MY_BITMAP *columns,
List<Item> *changed_columns, List<Item> *changed_columns2) List<Item> *changed_columns, List<Item> *changed_columns2)
{ {
...@@ -830,10 +844,6 @@ static MY_BITMAP *add_function_default_columns(TABLE *table, MY_BITMAP *columns, ...@@ -830,10 +844,6 @@ static MY_BITMAP *add_function_default_columns(TABLE *table, MY_BITMAP *columns,
return function_default_columns; return function_default_columns;
} }
#ifdef WITH_PARTITION_STORAGE_ENGINE
#include "partition_info.h"
/** /**
Check if fields are in the partitioning expression. Check if fields are in the partitioning expression.
...@@ -926,6 +936,8 @@ static void set_function_defaults(MY_BITMAP *default_columns, TABLE *table) ...@@ -926,6 +936,8 @@ static void set_function_defaults(MY_BITMAP *default_columns, TABLE *table)
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
#endif /*VER0*/
enum enum_can_prune { PRUNE_NO= 0, PRUNE_DEFAULTS, PRUNE_YES }; enum enum_can_prune { PRUNE_NO= 0, PRUNE_DEFAULTS, PRUNE_YES };
...@@ -950,6 +962,7 @@ is initialized and cleared ...@@ -950,6 +962,7 @@ is initialized and cleared
@retval true Failure @retval true Failure
*/ */
#ifdef VER0
static bool can_prune_insert(partition_info *part_info, static bool can_prune_insert(partition_info *part_info,
THD* thd, enum_duplicates duplic, THD* thd, enum_duplicates duplic,
const MY_BITMAP *update_function_default_columns, const MY_BITMAP *update_function_default_columns,
...@@ -1182,8 +1195,43 @@ static bool set_used_partition(partition_info *part_info, ...@@ -1182,8 +1195,43 @@ static bool set_used_partition(partition_info *part_info,
thd->pop_internal_handler(); thd->pop_internal_handler();
DBUG_RETURN(ret); DBUG_RETURN(ret);
} }
#endif /*VER0*/
bool Insert_prelocking_strategy::handle_end(THD *thd)
{
Item *unused_conds= 0;
int res;
List_iterator_fast<List_item> its(*m_values_list);
List_item *values;
thd->lex->used_tables=0;
values= its++;
if (bulk_parameters_set(thd))
return 1;
if ((res= mysql_prepare_insert(thd, m_table_list, *m_fields, values,
*m_update_fields, *m_update_values, m_duplic,
m_ignore, &unused_conds, FALSE)))
{
m_retval= thd->is_error();
if (res < 0)
{
/*
Insert should be ignored but we have to log the query in statement
format in the binary log
*/
if (thd->binlog_current_query_unfiltered())
m_retval= 1;
}
return 1;
}
return 0;
}
#ifdef VER0
bool Insert_prelocking_strategy::handle_end(THD *thd) bool Insert_prelocking_strategy::handle_end(THD *thd)
{ {
MY_BITMAP *function_default_columns; MY_BITMAP *function_default_columns;
...@@ -1222,12 +1270,12 @@ bool Insert_prelocking_strategy::handle_end(THD *thd) ...@@ -1222,12 +1270,12 @@ bool Insert_prelocking_strategy::handle_end(THD *thd)
/* Must be done before can_prune_insert, due to internal initialization. */ /* Must be done before can_prune_insert, due to internal initialization. */
if ((function_default_columns= if ((function_default_columns=
add_function_default_columns(table, table->write_set, add_function_default_columns(table, table->write_set,
m_fields, NULL))) m_fields, NULL)) == NULL)
goto abort; goto abort;
if (m_duplic == DUP_UPDATE && if (m_duplic == DUP_UPDATE &&
(upd_function_default_columns= (upd_function_default_columns=
add_function_default_columns(table, table->write_set, add_function_default_columns(table, table->write_set,
m_update_fields, NULL))) m_update_fields, NULL)) == NULL)
goto abort; goto abort;
...@@ -1268,6 +1316,8 @@ bool Insert_prelocking_strategy::handle_end(THD *thd) ...@@ -1268,6 +1316,8 @@ bool Insert_prelocking_strategy::handle_end(THD *thd)
abort: abort:
DBUG_RETURN(1); DBUG_RETURN(1);
} }
#endif /*VER0*/
#endif /*WITH_PARTITION_STORAGE_ENGINE*/ #endif /*WITH_PARTITION_STORAGE_ENGINE*/
/** /**
...@@ -1317,7 +1367,6 @@ bool mysql_insert(THD *thd, TABLE_LIST *table_list, ...@@ -1317,7 +1367,6 @@ bool mysql_insert(THD *thd, TABLE_LIST *table_list,
bool log_on= (thd->variables.option_bits & OPTION_BIN_LOG); bool log_on= (thd->variables.option_bits & OPTION_BIN_LOG);
#endif #endif
thr_lock_type lock_type; thr_lock_type lock_type;
Item *unused_conds= 0;
DBUG_ENTER("mysql_insert"); DBUG_ENTER("mysql_insert");
bzero((char*) &info,sizeof(info)); bzero((char*) &info,sizeof(info));
...@@ -1350,22 +1399,21 @@ bool mysql_insert(THD *thd, TABLE_LIST *table_list, ...@@ -1350,22 +1399,21 @@ bool mysql_insert(THD *thd, TABLE_LIST *table_list,
else else
{ {
Insert_prelocking_strategy Insert_prelocking_strategy
prelocking_strategy(table_list, &fields, &update_fields, prelocking_strategy(table_list, &fields, &values_list,
&values_list, duplic); &update_fields, &update_values, duplic, ignore);
if (open_and_lock_tables(thd, thd->lex->create_info, table_list, if (open_and_lock_tables(thd, thd->lex->create_info, table_list,
TRUE, 0, &prelocking_strategy)) TRUE, 0, &prelocking_strategy))
DBUG_RETURN(TRUE); DBUG_RETURN(prelocking_strategy.retval());
} }
THD_STAGE_INFO(thd, stage_init_update); THD_STAGE_INFO(thd, stage_init_update);
lock_type= table_list->lock_type; lock_type= table_list->lock_type;
thd->lex->used_tables=0;
values= its++; values= its++;
if (bulk_parameters_set(thd))
DBUG_RETURN(TRUE);
value_count= values->elements; value_count= values->elements;
#ifdef VER0
if ((res= mysql_prepare_insert(thd, table_list, fields, values, if ((res= mysql_prepare_insert(thd, table_list, fields, values,
update_fields, update_values, duplic, ignore, update_fields, update_values, duplic, ignore,
&unused_conds, FALSE))) &unused_conds, FALSE)))
...@@ -1382,6 +1430,7 @@ bool mysql_insert(THD *thd, TABLE_LIST *table_list, ...@@ -1382,6 +1430,7 @@ bool mysql_insert(THD *thd, TABLE_LIST *table_list,
} }
goto abort; goto abort;
} }
#endif /*VER0*/
/* mysql_prepare_insert sets table_list->table if it was not set */ /* mysql_prepare_insert sets table_list->table if it was not set */
table= table_list->table; table= table_list->table;
......
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