summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorunknown <mattiasj@witty.>2008-03-27 16:24:11 +0100
committerunknown <mattiasj@witty.>2008-03-27 16:24:11 +0100
commitda9db4ed353411d1bfd013dfed7cc15633e2e1f8 (patch)
treebafe4ca3b0f182f8eb24f168e72d007ef9a790d0 /sql
parent5ad505dda2d8ae019f6abfbf6eb9091cea1a5c55 (diff)
parentfb27979e6538e0f7c263b3d9f7400190f762e2fd (diff)
downloadmariadb-git-da9db4ed353411d1bfd013dfed7cc15633e2e1f8.tar.gz
Merge witty.:/Users/mattiasj/Public/shared-vms/bug21413-41-engines
into witty.:/Users/mattiasj/clones/bug21413-50-engines sql/sql_insert.cc: Manual merge
Diffstat (limited to 'sql')
-rw-r--r--sql/sql_insert.cc28
1 files changed, 21 insertions, 7 deletions
diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc
index 1d324872409..746a04e03f3 100644
--- a/sql/sql_insert.cc
+++ b/sql/sql_insert.cc
@@ -709,8 +709,6 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list,
error=0;
id=0;
thd->proc_info="update";
- if (duplic != DUP_ERROR || ignore)
- table->file->extra(HA_EXTRA_IGNORE_DUP_KEY);
if (duplic == DUP_REPLACE)
{
if (!table->triggers || !table->triggers->has_delete_triggers())
@@ -736,8 +734,15 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list,
values_list.elements, and - if nothing else - to initialize
the code to make the call of end_bulk_insert() below safe.
*/
- if (lock_type != TL_WRITE_DELAYED && !thd->prelocked_mode)
- table->file->start_bulk_insert(values_list.elements);
+#ifndef EMBEDDED_LIBRARY
+ if (lock_type != TL_WRITE_DELAYED)
+#endif /* EMBEDDED_LIBRARY */
+ {
+ if (duplic != DUP_ERROR || ignore)
+ table->file->extra(HA_EXTRA_IGNORE_DUP_KEY);
+ if (!thd->prelocked_mode)
+ table->file->start_bulk_insert(values_list.elements);
+ }
thd->abort_on_warning= (!ignore && (thd->variables.sql_mode &
(MODE_STRICT_TRANS_TABLES |
@@ -863,6 +868,9 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list,
else if (table->next_number_field && info.copied)
id=table->next_number_field->val_int(); // Return auto_increment value
+ if (duplic != DUP_ERROR || ignore)
+ table->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
+
transactional_table= table->file->has_transactions();
if ((changed= (info.copied || info.deleted || info.updated)))
@@ -942,8 +950,6 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list,
thd->count_cuted_fields= CHECK_FIELD_IGNORE;
thd->next_insert_id=0; // Reset this if wrongly used
table->auto_increment_field_not_null= FALSE;
- if (duplic != DUP_ERROR || ignore)
- table->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
if (duplic == DUP_REPLACE &&
(!table->triggers || !table->triggers->has_delete_triggers()))
table->file->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
@@ -1283,7 +1289,12 @@ bool mysql_prepare_insert(THD *thd, TABLE_LIST *table_list,
select_lex->fix_prepare_information(thd, &fake_conds, &fake_conds);
select_lex->first_execution= 0;
}
- if (duplic == DUP_UPDATE || duplic == DUP_REPLACE)
+ /*
+ Only call extra() handler method if we are not performing a DELAYED
+ operation. It will instead be executed by delayed insert thread.
+ */
+ if ((duplic == DUP_UPDATE || duplic == DUP_REPLACE) &&
+ (table->reginfo.lock_type != TL_WRITE_DELAYED))
table->file->extra(HA_EXTRA_RETRIEVE_PRIMARY_KEY);
DBUG_RETURN(FALSE);
}
@@ -2453,6 +2464,9 @@ bool Delayed_insert::handle_inserts(void)
info.ignore= row->ignore;
info.handle_duplicates= row->dup;
+ if (info.handle_duplicates == DUP_UPDATE ||
+ info.handle_duplicates == DUP_REPLACE)
+ table->file->extra(HA_EXTRA_RETRIEVE_PRIMARY_KEY);
if (info.ignore ||
info.handle_duplicates != DUP_ERROR)
{