mirror of
https://github.com/MariaDB/server.git
synced 2026-01-06 05:22:24 +03:00
Merge bk-internal.mysql.com:/home/bk/mysql-5.1-runtime
into mockturtle.local:/home/dlenev/src/mysql-5.1-bg20670 mysql-test/r/trigger.result: Auto merged mysql-test/t/trigger.test: Auto merged sql/mysql_priv.h: Auto merged sql/opt_range.cc: Auto merged sql/opt_range.h: Auto merged sql/sql_partition.cc: Auto merged sql/sql_update.cc: Auto merged
This commit is contained in:
@@ -25,7 +25,7 @@
|
||||
#include "sp_head.h"
|
||||
#include "sql_trigger.h"
|
||||
|
||||
static bool safe_update_on_fly(JOIN_TAB *join_tab, List<Item> *fields);
|
||||
static bool safe_update_on_fly(JOIN_TAB *join_tab);
|
||||
|
||||
/* Return 0 if row hasn't changed */
|
||||
|
||||
@@ -271,13 +271,16 @@ int mysql_update(THD *thd,
|
||||
}
|
||||
}
|
||||
init_ftfuncs(thd, select_lex, 1);
|
||||
|
||||
table->mark_columns_needed_for_update();
|
||||
|
||||
/* Check if we are modifying a key that we are used to search with */
|
||||
|
||||
if (select && select->quick)
|
||||
{
|
||||
used_index= select->quick->index;
|
||||
used_key_is_modified= (!select->quick->unique_key_range() &&
|
||||
select->quick->check_if_keys_used(&fields));
|
||||
select->quick->is_keys_used(table->write_set));
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -285,12 +288,13 @@ int mysql_update(THD *thd,
|
||||
if (used_index == MAX_KEY) // no index for sort order
|
||||
used_index= table->file->key_used_on_scan;
|
||||
if (used_index != MAX_KEY)
|
||||
used_key_is_modified= check_if_key_used(table, used_index, fields);
|
||||
used_key_is_modified= is_key_used(table, used_index, table->write_set);
|
||||
}
|
||||
|
||||
|
||||
#ifdef WITH_PARTITION_STORAGE_ENGINE
|
||||
if (used_key_is_modified || order ||
|
||||
partition_key_modified(table, fields))
|
||||
partition_key_modified(table, table->write_set))
|
||||
#else
|
||||
if (used_key_is_modified || order)
|
||||
#endif
|
||||
@@ -449,8 +453,6 @@ int mysql_update(THD *thd,
|
||||
MODE_STRICT_ALL_TABLES)));
|
||||
will_batch= !table->file->start_bulk_update();
|
||||
|
||||
table->mark_columns_needed_for_update();
|
||||
|
||||
/*
|
||||
We can use compare_record() to optimize away updates if
|
||||
the table handler is returning all columns OR if
|
||||
@@ -1217,7 +1219,7 @@ multi_update::initialize_tables(JOIN *join)
|
||||
table->mark_columns_needed_for_update();
|
||||
if (table == main_table) // First table in join
|
||||
{
|
||||
if (safe_update_on_fly(join->join_tab, &temp_fields))
|
||||
if (safe_update_on_fly(join->join_tab))
|
||||
{
|
||||
table_to_update= main_table; // Update table on the fly
|
||||
continue;
|
||||
@@ -1275,7 +1277,6 @@ multi_update::initialize_tables(JOIN *join)
|
||||
SYNOPSIS
|
||||
safe_update_on_fly
|
||||
join_tab How table is used in join
|
||||
fields Fields that are updated
|
||||
|
||||
NOTES
|
||||
We can update the first table in join on the fly if we know that
|
||||
@@ -1288,9 +1289,8 @@ multi_update::initialize_tables(JOIN *join)
|
||||
- We are doing a range scan and we don't update the scan key or
|
||||
the primary key for a clustered table handler.
|
||||
|
||||
When checking for above cases we also should take into account that
|
||||
BEFORE UPDATE trigger potentially may change value of any field in row
|
||||
being updated.
|
||||
This function gets information about fields to be updated from
|
||||
the TABLE::write_set bitmap.
|
||||
|
||||
WARNING
|
||||
This code is a bit dependent of how make_join_readinfo() works.
|
||||
@@ -1300,7 +1300,7 @@ multi_update::initialize_tables(JOIN *join)
|
||||
1 Safe to update
|
||||
*/
|
||||
|
||||
static bool safe_update_on_fly(JOIN_TAB *join_tab, List<Item> *fields)
|
||||
static bool safe_update_on_fly(JOIN_TAB *join_tab)
|
||||
{
|
||||
TABLE *table= join_tab->table;
|
||||
switch (join_tab->type) {
|
||||
@@ -1310,21 +1310,15 @@ static bool safe_update_on_fly(JOIN_TAB *join_tab, List<Item> *fields)
|
||||
return TRUE; // At most one matching row
|
||||
case JT_REF:
|
||||
case JT_REF_OR_NULL:
|
||||
return !check_if_key_used(table, join_tab->ref.key, *fields) &&
|
||||
!(table->triggers &&
|
||||
table->triggers->has_before_update_triggers());
|
||||
return !is_key_used(table, join_tab->ref.key, table->write_set);
|
||||
case JT_ALL:
|
||||
/* If range search on index */
|
||||
if (join_tab->quick)
|
||||
return !join_tab->quick->check_if_keys_used(fields) &&
|
||||
!(table->triggers &&
|
||||
table->triggers->has_before_update_triggers());
|
||||
return !join_tab->quick->is_keys_used(table->write_set);
|
||||
/* If scanning in clustered key */
|
||||
if ((table->file->ha_table_flags() & HA_PRIMARY_KEY_IN_READ_INDEX) &&
|
||||
table->s->primary_key < MAX_KEY)
|
||||
return !check_if_key_used(table, table->s->primary_key, *fields) &&
|
||||
!(table->triggers &&
|
||||
table->triggers->has_before_update_triggers());
|
||||
return !is_key_used(table, table->s->primary_key, table->write_set);
|
||||
return TRUE;
|
||||
default:
|
||||
break; // Avoid compler warning
|
||||
|
||||
Reference in New Issue
Block a user