17
17
/* Insert of records */
22
Drizzle has a different form of DELAYED then MySQL. DELAYED is just
23
a hint to the the sorage engine (which can then do whatever it likes.
25
19
#include <drizzled/server_includes.h>
26
20
#include <drizzled/sql_select.h>
27
#include <drizzled/sql_show.h>
29
#include <drizzled/drizzled_error_messages.h>
31
/* Define to force use of my_malloc() if the allocated memory block is big */
34
#define my_safe_alloca(size, min_length) my_alloca(size)
35
#define my_safe_afree(ptr, size, min_length) my_afree(ptr)
37
#define my_safe_alloca(size, min_length) ((size <= min_length) ? my_alloca(size) : malloc(size))
38
#define my_safe_afree(ptr, size, min_length) if (size > min_length) free(ptr)
21
#include <drizzled/show.h>
22
#include <drizzled/error.h>
23
#include <drizzled/name_resolution_context_state.h>
24
#include <drizzled/probes.h>
25
#include <drizzled/sql_base.h>
26
#include <drizzled/sql_load.h>
27
#include <drizzled/field/timestamp.h>
28
#include <drizzled/lock.h>
30
using namespace drizzled;
44
33
Check if insert fields are correct.
47
36
check_insert_fields()
48
thd The current thread.
37
session The current thread.
49
38
table The table for insert.
50
39
fields The insert fields.
51
40
values The insert values.
108
97
table_list->next_local= 0;
109
98
context->resolve_in_table_list_only(table_list);
110
res= setup_fields(thd, 0, fields, MARK_COLUMNS_WRITE, 0, 0);
99
res= setup_fields(session, 0, fields, MARK_COLUMNS_WRITE, 0, 0);
112
101
/* Restore the current context. */
113
102
ctx_state.restore_state(context, table_list);
118
if (check_unique && thd->dup_field)
107
if (check_unique && session->dup_field)
120
my_error(ER_FIELD_SPECIFIED_TWICE, MYF(0), thd->dup_field->field_name);
109
my_error(ER_FIELD_SPECIFIED_TWICE, MYF(0), session->dup_field->field_name);
123
112
if (table->timestamp_field) // Don't automaticly set timestamp if used
125
if (bitmap_is_set(table->write_set,
126
table->timestamp_field->field_index))
114
if (table->timestamp_field->isWriteSet())
127
115
clear_timestamp_auto_bits(table->timestamp_field_type,
128
116
TIMESTAMP_AUTO_SET_ON_INSERT);
131
bitmap_set_bit(table->write_set,
132
table->timestamp_field->field_index);
119
table->setWriteSet(table->timestamp_field->field_index);
170
157
Unmark the timestamp field so that we can check if this is modified
173
timestamp_mark= bitmap_test_and_clear(table->write_set,
174
table->timestamp_field->field_index);
160
timestamp_mark= table->write_set->testAndClear(table->timestamp_field->field_index);
177
163
/* Check the fields we are going to modify */
178
if (setup_fields(thd, 0, update_fields, MARK_COLUMNS_WRITE, 0, 0))
164
if (setup_fields(session, 0, update_fields, MARK_COLUMNS_WRITE, 0, 0))
181
167
if (table->timestamp_field)
183
169
/* Don't set timestamp column if this is modified. */
184
if (bitmap_is_set(table->write_set,
185
table->timestamp_field->field_index))
170
if (table->timestamp_field->isWriteSet())
186
171
clear_timestamp_auto_bits(table->timestamp_field_type,
187
172
TIMESTAMP_AUTO_SET_ON_UPDATE);
188
173
if (timestamp_mark)
189
bitmap_set_bit(table->write_set,
190
table->timestamp_field->field_index);
174
table->setWriteSet(table->timestamp_field->field_index);
247
230
Name_resolution_context_state ctx_state;
248
231
thr_lock_type lock_type;
249
232
Item *unused_conds= 0;
253
236
Upgrade lock type if the requested lock is incompatible with
254
237
the current connection mode or table operation.
256
upgrade_lock_type(thd, &table_list->lock_type, duplic,
239
upgrade_lock_type(session, &table_list->lock_type, duplic,
257
240
values_list.elements > 1);
260
We can't write-delayed into a table locked with LOCK TABLES:
261
this will lead to a deadlock, since the delayed thread will
262
never be able to get a lock on the table. QQQ: why not
263
upgrade the lock here instead?
265
if (table_list->lock_type == TL_WRITE_DELAYED && thd->locked_tables &&
266
find_locked_table(thd, table_list->db, table_list->table_name))
242
if (session->openTablesLock(table_list))
268
my_error(ER_DELAYED_INSERT_TABLE_LOCKED, MYF(0),
269
table_list->table_name);
244
DRIZZLE_INSERT_DONE(1, 0);
274
if (open_and_lock_tables(thd, table_list))
277
248
lock_type= table_list->lock_type;
279
thd_proc_info(thd, "init");
250
session->set_proc_info("init");
251
session->used_tables=0;
282
253
value_count= values->elements;
284
if (mysql_prepare_insert(thd, table_list, table, fields, values,
255
if (mysql_prepare_insert(session, table_list, table, fields, values,
285
256
update_fields, update_values, duplic, &unused_conds,
287
258
(fields.elements || !value_count ||
319
290
my_error(ER_WRONG_VALUE_COUNT_ON_ROW, MYF(0), counter);
322
if (setup_fields(thd, 0, *values, MARK_COLUMNS_READ, 0, 0))
293
if (setup_fields(session, 0, *values, MARK_COLUMNS_READ, 0, 0))
327
298
/* Restore the current context. */
328
299
ctx_state.restore_state(context, table_list);
341
312
For single line insert, generate an error if try to set a NOT NULL field
344
thd->count_cuted_fields= ((values_list.elements == 1 &&
315
session->count_cuted_fields= ((values_list.elements == 1 &&
346
317
CHECK_FIELD_ERROR_FOR_NULL :
347
318
CHECK_FIELD_WARN);
348
thd->cuted_fields = 0L;
319
session->cuted_fields = 0L;
349
320
table->next_number_field=table->found_next_number_field;
351
if (thd->slave_thread &&
352
(info.handle_duplicates == DUP_UPDATE) &&
353
(table->next_number_field != NULL) &&
354
rpl_master_has_bug(&active_mi->rli, 24432))
358
thd_proc_info(thd, "update");
323
session->set_proc_info("update");
359
324
if (duplic == DUP_REPLACE)
360
325
table->file->extra(HA_EXTRA_WRITE_CAN_REPLACE);
361
326
if (duplic == DUP_UPDATE)
376
341
if (fields.elements || !value_count)
378
restore_record(table,s->default_values); // Get empty record
379
if (fill_record(thd, fields, *values, 0))
343
table->restoreRecordAsDefault(); // Get empty record
344
if (fill_record(session, fields, *values, 0))
381
if (values_list.elements != 1 && ! thd->is_error())
346
if (values_list.elements != 1 && ! session->is_error())
387
TODO: set thd->abort_on_warning if values_list.elements == 1
352
TODO: set session->abort_on_warning if values_list.elements == 1
388
353
and check that all items return warning in case of problem with
447
415
transactional_table= table->file->has_transactions();
449
if ((changed= (info.copied || info.deleted || info.updated)))
452
Invalidate the table in the query cache if something changed.
453
For the transactional algorithm to work the invalidation must be
454
before binlog writing and ha_autocommit_or_rollback
457
if ((changed && error <= 0) || thd->transaction.stmt.modified_non_trans_table || was_insert_delayed)
459
if (mysql_bin_log.is_open())
464
[Guilhem wrote] Temporary errors may have filled
465
thd->net.last_error/errno. For example if there has
466
been a disk full error when writing the row, and it was
467
MyISAM, then thd->net.last_error/errno will be set to
468
"disk full"... and the my_pwrite() will wait until free
469
space appears, and so when it finishes then the
470
write_row() was entirely successful
472
/* todo: consider removing */
477
A query which per-row-loop can not be interrupted with
478
KILLED, like INSERT, and that does not invoke stored
479
routines can be binlogged with neglecting the KILLED error.
481
If there was no error (error == zero) until after the end of
482
inserting loop the KILLED flag that appeared later can be
483
disregarded since previously possible invocation of stored
484
routines did not result in any error due to the KILLED. In
485
such case the flag is ignored for constructing binlog event.
487
assert(thd->killed != THD::KILL_BAD_DATA || error > 0);
488
if (thd->binlog_query(THD::ROW_QUERY_TYPE,
489
thd->query, thd->query_length,
490
transactional_table, false,
491
(error>0) ? thd->killed : THD::NOT_KILLED) &&
497
if (thd->transaction.stmt.modified_non_trans_table)
498
thd->transaction.all.modified_non_trans_table= true;
500
assert(transactional_table || !changed ||
501
thd->transaction.stmt.modified_non_trans_table);
417
changed= (info.copied || info.deleted || info.updated);
418
if ((changed && error <= 0) || session->transaction.stmt.modified_non_trans_table)
420
if (session->transaction.stmt.modified_non_trans_table)
421
session->transaction.all.modified_non_trans_table= true;
423
assert(transactional_table || !changed || session->transaction.stmt.modified_non_trans_table);
504
thd_proc_info(thd, "end");
426
session->set_proc_info("end");
506
428
We'll report to the client this id:
507
429
- if the table contains an autoincrement column and we successfully
512
434
inserted, the id of the last "inserted" row (if IGNORE, that value may not
513
435
have been really inserted but ignored).
515
id= (thd->first_successful_insert_id_in_cur_stmt > 0) ?
516
thd->first_successful_insert_id_in_cur_stmt :
517
(thd->arg_of_last_insert_id_function ?
518
thd->first_successful_insert_id_in_prev_stmt :
437
id= (session->first_successful_insert_id_in_cur_stmt > 0) ?
438
session->first_successful_insert_id_in_cur_stmt :
439
(session->arg_of_last_insert_id_function ?
440
session->first_successful_insert_id_in_prev_stmt :
519
441
((table->next_number_field && info.copied) ?
520
442
table->next_number_field->val_int() : 0));
521
443
table->next_number_field=0;
522
thd->count_cuted_fields= CHECK_FIELD_IGNORE;
444
session->count_cuted_fields= CHECK_FIELD_IGNORE;
523
445
table->auto_increment_field_not_null= false;
524
446
if (duplic == DUP_REPLACE)
525
447
table->file->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
529
if (values_list.elements == 1 && (!(thd->options & OPTION_WARNINGS) ||
451
if (values_list.elements == 1 && (!(session->options & OPTION_WARNINGS) ||
452
!session->cuted_fields))
532
thd->row_count_func= info.copied + info.deleted +
533
((thd->client_capabilities & CLIENT_FOUND_ROWS) ?
534
info.touched : info.updated);
535
my_ok(thd, (ulong) thd->row_count_func, id);
454
session->row_count_func= info.copied + info.deleted + info.updated;
455
session->my_ok((ulong) session->row_count_func,
456
info.copied + info.deleted + info.touched, id);
540
ha_rows updated=((thd->client_capabilities & CLIENT_FOUND_ROWS) ?
541
info.touched : info.updated);
543
462
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
544
(ulong) (info.records - info.copied), (ulong) thd->cuted_fields);
463
(ulong) (info.records - info.copied), (ulong) session->cuted_fields);
546
465
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
547
(ulong) (info.deleted + updated), (ulong) thd->cuted_fields);
548
thd->row_count_func= info.copied + info.deleted + updated;
549
::my_ok(thd, (ulong) thd->row_count_func, id, buff);
466
(ulong) (info.deleted + info.updated), (ulong) session->cuted_fields);
467
session->row_count_func= info.copied + info.deleted + info.updated;
468
session->my_ok((ulong) session->row_count_func,
469
info.copied + info.deleted + info.touched, id, buff);
551
thd->abort_on_warning= 0;
552
DRIZZLE_INSERT_END();
471
session->abort_on_warning= 0;
472
DRIZZLE_INSERT_DONE(0, session->row_count_func);
556
476
if (table != NULL)
557
477
table->file->ha_release_auto_increment();
558
478
if (!joins_freed)
559
free_underlaid_joins(thd, &thd->lex->select_lex);
560
thd->abort_on_warning= 0;
561
DRIZZLE_INSERT_END();
479
free_underlaid_joins(session, &session->lex->select_lex);
480
session->abort_on_warning= 0;
481
DRIZZLE_INSERT_DONE(1, 0);
595
if (setup_tables_and_check_access(thd, &thd->lex->select_lex.context,
596
&thd->lex->select_lex.top_join_list,
515
if (setup_tables_and_check_access(session, &session->lex->select_lex.context,
516
&session->lex->select_lex.top_join_list,
598
&thd->lex->select_lex.leaf_tables,
518
&session->lex->select_lex.leaf_tables,
610
530
mysql_prepare_insert()
531
session Thread handler
612
532
table_list Global/local table list
613
533
table Table to insert into (can be NULL if table should
614
be taken from table_list->table)
534
be taken from table_list->table)
615
535
where Where clause (for insert ... select)
616
536
select_insert true if INSERT ... SELECT statement
617
check_fields true if need to check that all INSERT fields are
537
check_fields true if need to check that all INSERT fields are
619
abort_on_warning whether to report if some INSERT field is not
539
abort_on_warning whether to report if some INSERT field is not
620
540
assigned as an error (true) or as a warning (false).
622
542
TODO (in far future)
629
549
You MUST set table->insert_values to 0 after calling this function
630
550
before releasing the table object.
637
bool mysql_prepare_insert(THD *thd, TableList *table_list,
557
bool mysql_prepare_insert(Session *session, TableList *table_list,
638
558
Table *table, List<Item> &fields, List_item *values,
639
559
List<Item> &update_fields, List<Item> &update_values,
640
560
enum_duplicates duplic,
641
COND **where __attribute__((unused)),
642
562
bool select_insert,
643
563
bool check_fields, bool abort_on_warning)
645
SELECT_LEX *select_lex= &thd->lex->select_lex;
565
Select_Lex *select_lex= &session->lex->select_lex;
646
566
Name_resolution_context *context= &select_lex->context;
647
567
Name_resolution_context_state ctx_state;
648
568
bool insert_into_view= (0 != 0);
650
570
table_map map= 0;
652
572
/* INSERT should have a SELECT or VALUES clause */
653
573
assert (!select_insert || !values);
656
576
For subqueries in VALUES() we should not see the table in which we are
657
577
inserting (for INSERT ... SELECT this is done by changing table_list,
658
because INSERT ... SELECT share SELECT_LEX it with SELECT.
578
because INSERT ... SELECT share Select_Lex it with SELECT.
660
580
if (!select_insert)
662
for (SELECT_LEX_UNIT *un= select_lex->first_inner_unit();
582
for (Select_Lex_Unit *un= select_lex->first_inner_unit();
664
584
un= un->next_unit())
666
for (SELECT_LEX *sl= un->first_select();
586
for (Select_Lex *sl= un->first_select();
668
588
sl= sl->next_select())
699
619
table_list->next_local= 0;
700
620
context->resolve_in_table_list_only(table_list);
702
res= check_insert_fields(thd, context->table_list, fields, *values,
622
res= check_insert_fields(session, context->table_list, fields, *values,
703
623
!insert_into_view, &map) ||
704
setup_fields(thd, 0, *values, MARK_COLUMNS_READ, 0, 0);
624
setup_fields(session, 0, *values, MARK_COLUMNS_READ, 0, 0);
706
626
if (!res && check_fields)
708
bool saved_abort_on_warning= thd->abort_on_warning;
709
thd->abort_on_warning= abort_on_warning;
710
res= check_that_all_fields_are_given_values(thd,
628
bool saved_abort_on_warning= session->abort_on_warning;
629
session->abort_on_warning= abort_on_warning;
630
res= check_that_all_fields_are_given_values(session,
712
632
context->table_list->table,
713
633
context->table_list);
714
thd->abort_on_warning= saved_abort_on_warning;
634
session->abort_on_warning= saved_abort_on_warning;
717
637
if (!res && duplic == DUP_UPDATE)
719
res= check_update_fields(thd, context->table_list, update_fields, &map);
639
res= check_update_fields(session, context->table_list, update_fields, &map);
722
642
/* Restore the current context. */
723
643
ctx_state.restore_state(context, table_list);
726
res= setup_fields(thd, 0, update_values, MARK_COLUMNS_READ, 0, 0);
646
res= setup_fields(session, 0, update_values, MARK_COLUMNS_READ, 0, 0);
735
655
if (!select_insert)
737
657
TableList *duplicate;
738
if ((duplicate= unique_table(thd, table_list, table_list->next_global, 1)))
658
if ((duplicate= unique_table(session, table_list, table_list->next_global, 1)))
740
update_non_unique_table_error(table_list, "INSERT", duplicate);
660
my_error(ER_UPDATE_TABLE_USED, MYF(0), table_list->alias);
744
665
if (duplic == DUP_UPDATE || duplic == DUP_REPLACE)
745
666
table->prepare_for_position();
788
int write_record(THD *thd, Table *table,COPY_INFO *info)
710
int write_record(Session *session, Table *table,COPY_INFO *info)
792
MY_BITMAP *save_read_set, *save_write_set;
714
MyBitmap *save_read_set, *save_write_set;
793
715
uint64_t prev_insert_id= table->file->next_insert_id;
794
716
uint64_t insert_id_for_cur_row= 0;
798
720
save_read_set= table->read_set;
799
721
save_write_set= table->write_set;
801
if (info->handle_duplicates == DUP_REPLACE ||
802
info->handle_duplicates == DUP_UPDATE)
723
if (info->handle_duplicates == DUP_REPLACE || info->handle_duplicates == DUP_UPDATE)
804
725
while ((error=table->file->ha_write_row(table->record[0])))
883
803
an error is returned
885
805
assert(table->insert_values != NULL);
886
store_record(table,insert_values);
887
restore_record(table,record[1]);
806
table->storeRecordAsInsert();
807
table->restoreRecord();
888
808
assert(info->update_fields->elements ==
889
809
info->update_values->elements);
890
if (fill_record(thd, *info->update_fields,
810
if (fill_record(session, *info->update_fields,
891
811
*info->update_values,
1003
923
after_n_copied_inc:
1005
thd->record_first_successful_insert_id_in_cur_stmt(table->file->insert_id_for_cur_row);
925
session->record_first_successful_insert_id_in_cur_stmt(table->file->insert_id_for_cur_row);
1007
927
gok_or_after_err:
1009
my_safe_afree(key,table->s->max_unique_length,MAX_KEY_LENGTH);
1010
930
if (!table->file->has_transactions())
1011
thd->transaction.stmt.modified_non_trans_table= true;
931
session->transaction.stmt.modified_non_trans_table= true;
1015
935
info->last_errno= error;
1016
936
/* current_select is NULL if this is a delayed insert */
1017
if (thd->lex->current_select)
1018
thd->lex->current_select->no_error= 0; // Give error
937
if (session->lex->current_select)
938
session->lex->current_select->no_error= 0; // Give error
1019
939
table->file->print_error(error,MYF(0));
1022
942
table->file->restore_auto_increment(prev_insert_id);
1024
my_safe_afree(key, table->s->max_unique_length, MAX_KEY_LENGTH);
1025
945
table->column_bitmaps_set(save_read_set, save_write_set);
1031
951
Check that all fields with arn't null_fields are used
1032
952
******************************************************************************/
1034
int check_that_all_fields_are_given_values(THD *thd, Table *entry,
1035
TableList *table_list)
954
int check_that_all_fields_are_given_values(Session *session, Table *entry,
1038
MY_BITMAP *write_set= entry->write_set;
1040
959
for (Field **field=entry->field ; *field ; field++)
1042
if (!bitmap_is_set(write_set, (*field)->field_index) &&
1043
((*field)->flags & NO_DEFAULT_VALUE_FLAG) &&
961
if (((*field)->isWriteSet()) == false)
964
* If the field doesn't have any default value
965
* and there is no actual value specified in the
966
* INSERT statement, throw error ER_NO_DEFAULT_FOR_FIELD.
968
if (((*field)->flags & NO_DEFAULT_VALUE_FLAG) &&
1044
969
((*field)->real_type() != DRIZZLE_TYPE_ENUM))
971
my_error(ER_NO_DEFAULT_FOR_FIELD, MYF(0), (*field)->field_name);
1049
table_list= table_list->top_table();
1053
push_warning_printf(thd, DRIZZLE_ERROR::WARN_LEVEL_WARN,
1054
ER_NO_DEFAULT_FOR_FIELD,
1055
ER(ER_NO_DEFAULT_FOR_FIELD),
1056
(*field)->field_name);
978
* However, if an actual NULL value was specified
979
* for the field and the field is a NOT NULL field,
980
* throw ER_BAD_NULL_ERROR.
982
* Per the SQL standard, inserting NULL into a NOT NULL
983
* field requires an error to be thrown.
985
if (((*field)->flags & NOT_NULL_FLAG) &&
988
my_error(ER_BAD_NULL_ERROR, MYF(0), (*field)->field_name);
1061
return thd->abort_on_warning ? err : 0;
993
return session->abort_on_warning ? err : 0;
1064
996
/***************************************************************************
1073
1005
mysql_insert_select_prepare()
1006
session thread handler
1081
bool mysql_insert_select_prepare(THD *thd)
1013
bool mysql_insert_select_prepare(Session *session)
1084
SELECT_LEX *select_lex= &lex->select_lex;
1088
Statement-based replication of INSERT ... SELECT ... LIMIT is not safe
1089
as order of rows is not defined, so in mixed mode we go to row-based.
1091
Note that we may consider a statement as safe if ORDER BY primary_key
1092
is present or we SELECT a constant. However it may confuse users to
1093
see very similiar statements replicated differently.
1095
if (lex->current_select->select_limit)
1097
lex->set_stmt_unsafe();
1098
thd->set_current_stmt_binlog_row_based_if_mixed();
1101
SELECT_LEX do not belong to INSERT statement, so we can't add WHERE
1015
LEX *lex= session->lex;
1016
Select_Lex *select_lex= &lex->select_lex;
1019
Select_Lex do not belong to INSERT statement, so we can't add WHERE
1102
1020
clause if table is VIEW
1105
if (mysql_prepare_insert(thd, lex->query_tables,
1023
if (mysql_prepare_insert(session, lex->query_tables,
1106
1024
lex->query_tables->table, lex->field_list, 0,
1107
1025
lex->update_list, lex->value_list,
1108
1026
lex->duplicates,
1156
1074
we are fixing fields from insert list.
1158
1076
lex->current_select= &lex->select_lex;
1159
res= check_insert_fields(thd, table_list, *fields, values,
1077
res= check_insert_fields(session, table_list, *fields, values,
1160
1078
!insert_into_view, &map) ||
1161
setup_fields(thd, 0, values, MARK_COLUMNS_READ, 0, 0);
1079
setup_fields(session, 0, values, MARK_COLUMNS_READ, 0, 0);
1163
1081
if (!res && fields->elements)
1165
bool saved_abort_on_warning= thd->abort_on_warning;
1166
thd->abort_on_warning= !info.ignore;
1167
res= check_that_all_fields_are_given_values(thd, table_list->table,
1083
bool saved_abort_on_warning= session->abort_on_warning;
1084
session->abort_on_warning= !info.ignore;
1085
res= check_that_all_fields_are_given_values(session, table_list->table,
1169
thd->abort_on_warning= saved_abort_on_warning;
1087
session->abort_on_warning= saved_abort_on_warning;
1172
1090
if (info.handle_duplicates == DUP_UPDATE && !res)
1181
1099
table_list->next_local= 0;
1182
1100
context->resolve_in_table_list_only(table_list);
1184
res= res || check_update_fields(thd, context->table_list,
1102
res= res || check_update_fields(session, context->table_list,
1185
1103
*info.update_fields, &map);
1187
When we are not using GROUP BY and there are no ungrouped aggregate functions
1105
When we are not using GROUP BY and there are no ungrouped aggregate functions
1188
1106
we can refer to other tables in the ON DUPLICATE KEY part.
1189
1107
We use next_name_resolution_table descructively, so check it first (views?)
1195
1113
We must make a single context out of the two separate name resolution contexts :
1196
1114
the INSERT table and the tables in the SELECT part of INSERT ... SELECT.
1197
1115
To do that we must concatenate the two lists
1199
table_list->next_name_resolution_table=
1117
table_list->next_name_resolution_table=
1200
1118
ctx_state.get_first_name_resolution_table();
1202
res= res || setup_fields(thd, 0, *info.update_values,
1120
res= res || setup_fields(session, 0, *info.update_values,
1203
1121
MARK_COLUMNS_READ, 0, 0);
1245
1163
else if (!(lex->current_select->options & OPTION_BUFFER_RESULT))
1248
We must not yet prepare the result table if it is the same as one of the
1249
source tables (INSERT SELECT). The preparation may disable
1166
We must not yet prepare the result table if it is the same as one of the
1167
source tables (INSERT SELECT). The preparation may disable
1250
1168
indexes on the result table, which may be used during the select, if it
1251
1169
is the same table (Bug #6034). Do the preparation after the select phase
1252
1170
in select_insert::prepare2().
1256
1174
table->file->ha_start_bulk_insert((ha_rows) 0);
1258
restore_record(table,s->default_values); // Get empty record
1176
table->restoreRecordAsDefault(); // Get empty record
1259
1177
table->next_number_field=table->found_next_number_field;
1261
if (thd->slave_thread &&
1262
(info.handle_duplicates == DUP_UPDATE) &&
1263
(table->next_number_field != NULL) &&
1264
rpl_master_has_bug(&active_mi->rli, 24432))
1267
thd->cuted_fields=0;
1179
session->cuted_fields=0;
1268
1180
if (info.ignore || info.handle_duplicates != DUP_ERROR)
1269
1181
table->file->extra(HA_EXTRA_IGNORE_DUP_KEY);
1270
1182
if (info.handle_duplicates == DUP_REPLACE)
1271
1183
table->file->extra(HA_EXTRA_WRITE_CAN_REPLACE);
1272
1184
if (info.handle_duplicates == DUP_UPDATE)
1273
1185
table->file->extra(HA_EXTRA_INSERT_WITH_UPDATE);
1274
thd->abort_on_warning= !info.ignore;
1186
session->abort_on_warning= !info.ignore;
1275
1187
table->mark_columns_needed_for_insert();
1339
thd->count_cuted_fields= CHECK_FIELD_WARN; // Calculate cuted fields
1251
session->count_cuted_fields= CHECK_FIELD_WARN; // Calculate cuted fields
1340
1252
store_values(values);
1341
thd->count_cuted_fields= CHECK_FIELD_IGNORE;
1342
if (thd->is_error())
1253
session->count_cuted_fields= CHECK_FIELD_IGNORE;
1254
if (session->is_error())
1345
error= write_record(thd, table, &info);
1257
// Release latches in case bulk insert takes a long time
1258
ha_release_temporary_latches(session);
1260
error= write_record(session, table, &info);
1349
1264
if (info.handle_duplicates == DUP_UPDATE)
1352
1267
Restore fields of the record since it is possible that they were
1353
1268
changed by ON DUPLICATE KEY UPDATE clause.
1355
1270
If triggers exist then whey can modify some fields which were not
1356
1271
originally touched by INSERT ... SELECT, so we have to restore
1357
1272
their original values for the next row.
1359
restore_record(table, s->default_values);
1274
table->restoreRecordAsDefault();
1361
1276
if (table->next_number_field)
1364
1279
If no value has been autogenerated so far, we need to remember the
1365
1280
value we just saw, we may need to send it to client in the end.
1367
if (thd->first_successful_insert_id_in_cur_stmt == 0) // optimization
1368
autoinc_value_of_last_inserted_row=
1282
if (session->first_successful_insert_id_in_cur_stmt == 0) // optimization
1283
autoinc_value_of_last_inserted_row=
1369
1284
table->next_number_field->val_int();
1371
1286
Clear auto-increment field for the next record, if triggers are used
1381
1296
void select_insert::store_values(List<Item> &values)
1383
1298
if (fields->elements)
1384
fill_record(thd, *fields, values, 1);
1299
fill_record(session, *fields, values, 1);
1386
fill_record(thd, table->field, values, 1);
1301
fill_record(session, table->field, values, 1);
1389
1304
void select_insert::send_error(uint32_t errcode,const char *err)
1393
1308
my_message(errcode, err, MYF(0));
1414
1328
We must invalidate the table in the query cache before binlog writing
1415
1329
and ha_autocommit_or_rollback.
1417
if (thd->transaction.stmt.modified_non_trans_table)
1418
thd->transaction.all.modified_non_trans_table= true;
1331
if (session->transaction.stmt.modified_non_trans_table)
1332
session->transaction.all.modified_non_trans_table= true;
1420
assert(trans_table || !changed ||
1421
thd->transaction.stmt.modified_non_trans_table);
1334
assert(trans_table || !changed ||
1335
session->transaction.stmt.modified_non_trans_table);
1424
Write to binlog before commiting transaction. No statement will
1425
be written by the binlog_query() below in RBR mode. All the
1426
events are in the transaction cache and will be written when
1427
ha_autocommit_or_rollback() is issued below.
1429
if (mysql_bin_log.is_open())
1433
thd->binlog_query(THD::ROW_QUERY_TYPE,
1434
thd->query, thd->query_length,
1435
trans_table, false, killed_status);
1437
1337
table->file->ha_release_auto_increment();
1441
1341
table->file->print_error(error,MYF(0));
1342
DRIZZLE_INSERT_SELECT_DONE(error, 0);
1444
1345
char buff[160];
1445
1346
if (info.ignore)
1446
1347
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
1447
(ulong) (info.records - info.copied), (ulong) thd->cuted_fields);
1348
(ulong) (info.records - info.copied), (ulong) session->cuted_fields);
1449
1350
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
1450
(ulong) (info.deleted+info.updated), (ulong) thd->cuted_fields);
1451
thd->row_count_func= info.copied + info.deleted +
1452
((thd->client_capabilities & CLIENT_FOUND_ROWS) ?
1453
info.touched : info.updated);
1351
(ulong) (info.deleted+info.updated), (ulong) session->cuted_fields);
1352
session->row_count_func= info.copied + info.deleted + info.updated;
1455
id= (thd->first_successful_insert_id_in_cur_stmt > 0) ?
1456
thd->first_successful_insert_id_in_cur_stmt :
1457
(thd->arg_of_last_insert_id_function ?
1458
thd->first_successful_insert_id_in_prev_stmt :
1354
id= (session->first_successful_insert_id_in_cur_stmt > 0) ?
1355
session->first_successful_insert_id_in_cur_stmt :
1356
(session->arg_of_last_insert_id_function ?
1357
session->first_successful_insert_id_in_prev_stmt :
1459
1358
(info.copied ? autoinc_value_of_last_inserted_row : 0));
1460
::my_ok(thd, (ulong) thd->row_count_func, id, buff);
1359
session->my_ok((ulong) session->row_count_func,
1360
info.copied + info.deleted + info.touched, id, buff);
1361
DRIZZLE_INSERT_SELECT_DONE(0, session->row_count_func);
1464
1365
void select_insert::abort() {
1468
1369
If the creation of the table failed (due to a syntax error, for
1469
1370
example), no table will have been opened and therefore 'table'
1493
1394
changed= (info.copied || info.deleted || info.updated);
1494
1395
transactional_table= table->file->has_transactions();
1495
if (thd->transaction.stmt.modified_non_trans_table)
1497
if (mysql_bin_log.is_open())
1498
thd->binlog_query(THD::ROW_QUERY_TYPE, thd->query, thd->query_length,
1499
transactional_table, false);
1500
if (!thd->current_stmt_binlog_row_based && !can_rollback_data())
1501
thd->transaction.all.modified_non_trans_table= true;
1503
1396
assert(transactional_table || !changed ||
1504
thd->transaction.stmt.modified_non_trans_table);
1397
session->transaction.stmt.modified_non_trans_table);
1505
1398
table->file->ha_release_auto_increment();
1401
if (DRIZZLE_INSERT_SELECT_DONE_ENABLED())
1403
DRIZZLE_INSERT_SELECT_DONE(0, info.copied + info.deleted + info.updated);
1532
1430
lock out Pointer to the DRIZZLE_LOCK object for table created
1533
1431
(or open temporary table) will be returned in this
1534
1432
parameter. Since this table is not included in
1535
THD::lock caller is responsible for explicitly
1433
Session::lock caller is responsible for explicitly
1536
1434
unlocking this table.
1540
1438
This function behaves differently for base and temporary tables:
1541
1439
- For base table we assume that either table exists and was pre-opened
1542
and locked at open_and_lock_tables() stage (and in this case we just
1440
and locked at openTablesLock() stage (and in this case we just
1543
1441
emit error or warning and return pre-opened Table object) or special
1544
1442
placeholder was put in table cache that guarantees that this table
1545
1443
won't be created or opened until the placeholder will be removed
1558
static Table *create_table_from_items(THD *thd, HA_CREATE_INFO *create_info,
1456
static Table *create_table_from_items(Session *session, HA_CREATE_INFO *create_info,
1559
1457
TableList *create_table,
1560
Alter_info *alter_info,
1458
message::Table *table_proto,
1459
AlterInfo *alter_info,
1561
1460
List<Item> *items,
1562
DRIZZLE_LOCK **lock,
1563
TABLEOP_HOOKS *hooks)
1461
DRIZZLE_LOCK **lock)
1565
Table tmp_table; // Used during 'Create_field()'
1463
Table tmp_table; // Used during 'CreateField()'
1567
1465
Table *table= 0;
1568
1466
uint32_t select_field_count= items->elements;
1569
1467
/* Add selected items to field list */
1575
1473
if (!(create_info->options & HA_LEX_CREATE_TMP_TABLE) &&
1576
1474
create_table->table->db_stat)
1578
/* Table already exists and was open at open_and_lock_tables() stage. */
1476
/* Table already exists and was open at openTablesLock() stage. */
1579
1477
if (create_info->options & HA_LEX_CREATE_IF_NOT_EXISTS)
1581
1479
create_info->table_existed= 1; // Mark that table existed
1582
push_warning_printf(thd, DRIZZLE_ERROR::WARN_LEVEL_NOTE,
1480
push_warning_printf(session, DRIZZLE_ERROR::WARN_LEVEL_NOTE,
1583
1481
ER_TABLE_EXISTS_ERROR, ER(ER_TABLE_EXISTS_ERROR),
1584
1482
create_table->table_name);
1585
return(create_table->table);
1483
return create_table->table;
1588
1486
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), create_table->table_name);
1592
1490
tmp_table.alias= 0;
1593
1491
tmp_table.timestamp_field= 0;
1594
1492
tmp_table.s= &share;
1595
init_tmp_table_share(thd, &share, "", 0, "", "");
1597
1494
tmp_table.s->db_create_options=0;
1598
1495
tmp_table.s->blob_ptr_size= portable_sizeof_char_ptr;
1599
tmp_table.s->db_low_byte_first=
1600
test(create_info->db_type == myisam_hton ||
1601
create_info->db_type == heap_hton);
1496
tmp_table.s->db_low_byte_first=
1497
test(create_info->db_type == myisam_engine ||
1498
create_info->db_type == heap_engine);
1602
1499
tmp_table.null_row= false;
1603
1500
tmp_table.maybe_null= false;
1605
1502
while ((item=it++))
1607
Create_field *cr_field;
1504
CreateField *cr_field;
1608
1505
Field *field, *def_field;
1609
1506
if (item->type() == Item::FUNC_ITEM)
1610
1507
if (item->result_type() != STRING_RESULT)
1613
1510
field= item->tmp_table_field_from_field_type(&tmp_table, 0);
1615
field= create_tmp_field(thd, &tmp_table, item, item->type(),
1512
field= create_tmp_field(session, &tmp_table, item, item->type(),
1616
1513
(Item ***) 0, &tmp_field, &def_field, 0, 0, 0, 0,
1619
!(cr_field=new Create_field(field,(item->type() == Item::FIELD_ITEM ?
1516
!(cr_field=new CreateField(field,(item->type() == Item::FIELD_ITEM ?
1620
1517
((Item_field *)item)->field :
1623
1520
if (item->maybe_null)
1624
1521
cr_field->flags &= ~NOT_NULL_FLAG;
1625
1522
alter_info->create_list.push_back(cr_field);
1631
1528
Note that we either creating (or opening existing) temporary table or
1632
1529
creating base table on which name we have exclusive lock. So code below
1633
1530
should not cause deadlocks or races.
1635
We don't log the statement, it will be logged later.
1637
If this is a HEAP table, the automatic DELETE FROM which is written to the
1638
binlog when a HEAP table is opened for the first time since startup, must
1639
not be written: 1) it would be wrong (imagine we're in CREATE SELECT: we
1640
don't want to delete from it) 2) it would be written before the CREATE
1641
Table, which is a wrong order. So we keep binary logging disabled when we
1645
tmp_disable_binlog(thd);
1646
if (!mysql_create_table_no_lock(thd, create_table->db,
1533
if (!mysql_create_table_no_lock(session, create_table->db,
1647
1534
create_table->table_name,
1648
create_info, alter_info, 0,
1649
1538
select_field_count))
1651
1540
if (create_info->table_existed &&
1657
1546
cluster. We don't have much options but throw an error.
1659
1548
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), create_table->table_name);
1663
1552
if (!(create_info->options & HA_LEX_CREATE_TMP_TABLE))
1665
pthread_mutex_lock(&LOCK_open);
1666
if (reopen_name_locked_table(thd, create_table, false))
1554
pthread_mutex_lock(&LOCK_open); /* CREATE TABLE... has found that the table already exists for insert and is adapting to use it */
1555
if (session->reopen_name_locked_table(create_table, false))
1668
1557
quick_rm_table(create_info->db_type, create_table->db,
1669
table_case_name(create_info, create_table->table_name),
1558
create_table->table_name, false);
1673
1561
table= create_table->table;
1684
1572
it preparable for open. But let us do close_temporary_table() here
1687
drop_temporary_table(thd, create_table);
1575
session->drop_temporary_table(create_table);
1691
reenable_binlog(thd);
1692
1579
if (!table) // open failed
1696
1583
table->reginfo.lock_type=TL_WRITE;
1697
hooks->prelock(&table, 1); // Call prelock hooks
1698
if (! ((*lock)= mysql_lock_tables(thd, &table, 1,
1699
DRIZZLE_LOCK_IGNORE_FLUSH, ¬_used)) ||
1700
hooks->postlock(&table, 1))
1584
if (! ((*lock)= mysql_lock_tables(session, &table, 1,
1585
DRIZZLE_LOCK_IGNORE_FLUSH, ¬_used)))
1704
mysql_unlock_tables(thd, *lock);
1589
mysql_unlock_tables(session, *lock);
1708
1593
if (!create_info->table_existed)
1709
drop_open_table(thd, table, create_table->db, create_table->table_name);
1594
session->drop_open_table(table, create_table->db, create_table->table_name);
1717
select_create::prepare(List<Item> &values, SELECT_LEX_UNIT *u)
1603
select_create::prepare(List<Item> &values, Select_Lex_Unit *u)
1719
1605
DRIZZLE_LOCK *extra_lock= NULL;
1722
TABLEOP_HOOKS *hook_ptr= NULL;
1724
1607
For row-based replication, the CREATE-SELECT statement is written
1725
1608
in two pieces: the first one contain the CREATE TABLE statement
1738
1621
slave. Hence, we have to hold on to the CREATE part of the
1739
1622
statement until the statement has finished.
1741
class MY_HOOKS : public TABLEOP_HOOKS {
1743
MY_HOOKS(select_create *x, TableList *create_table,
1744
TableList *select_tables)
1745
: ptr(x), all_tables(*create_table)
1747
all_tables.next_global= select_tables;
1751
virtual int do_postlock(Table **tables, uint32_t count)
1753
THD *thd= const_cast<THD*>(ptr->get_thd());
1754
if (int error= decide_logging_format(thd, &all_tables))
1757
Table const *const table = *tables;
1758
if (thd->current_stmt_binlog_row_based &&
1759
!table->s->tmp_table &&
1760
!ptr->get_create_info()->table_existed)
1762
ptr->binlog_show_create_table(tables, count);
1768
TableList all_tables;
1771
MY_HOOKS hooks(this, create_table, select_tables);
1778
1629
row-based replication for the statement. If we are creating a
1779
1630
temporary table, we need to start a statement transaction.
1781
if ((thd->lex->create_info.options & HA_LEX_CREATE_TMP_TABLE) == 0 &&
1782
thd->current_stmt_binlog_row_based)
1784
thd->binlog_start_trans_and_stmt();
1787
if (!(table= create_table_from_items(thd, create_info, create_table,
1633
if (!(table= create_table_from_items(session, create_info, create_table,
1788
1635
alter_info, &values,
1789
&extra_lock, hook_ptr)))
1790
1637
return(-1); // abort() deletes table
1792
1639
if (extra_lock)
1813
1660
/* Mark all fields that are given values */
1814
1661
for (Field **f= field ; *f ; f++)
1815
bitmap_set_bit(table->write_set, (*f)->field_index);
1662
table->setWriteSet((*f)->field_index);
1817
1664
/* Don't set timestamp if used */
1818
1665
table->timestamp_field_type= TIMESTAMP_NO_AUTO_SET;
1819
1666
table->next_number_field=table->found_next_number_field;
1821
restore_record(table,s->default_values); // Get empty record
1822
thd->cuted_fields=0;
1668
table->restoreRecordAsDefault(); // Get empty record
1669
session->cuted_fields=0;
1823
1670
if (info.ignore || info.handle_duplicates != DUP_ERROR)
1824
1671
table->file->extra(HA_EXTRA_IGNORE_DUP_KEY);
1825
1672
if (info.handle_duplicates == DUP_REPLACE)
1827
1674
if (info.handle_duplicates == DUP_UPDATE)
1828
1675
table->file->extra(HA_EXTRA_INSERT_WITH_UPDATE);
1829
1676
table->file->ha_start_bulk_insert((ha_rows) 0);
1830
thd->abort_on_warning= !info.ignore;
1831
if (check_that_all_fields_are_given_values(thd, table, table_list))
1677
session->abort_on_warning= !info.ignore;
1678
if (check_that_all_fields_are_given_values(session, table, table_list))
1833
1680
table->mark_columns_needed_for_insert();
1834
1681
table->file->extra(HA_EXTRA_WRITE_CACHE);
1839
select_create::binlog_show_create_table(Table **tables, uint32_t count)
1842
Note 1: In RBR mode, we generate a CREATE TABLE statement for the
1843
created table by calling store_create_info() (behaves as SHOW
1844
CREATE TABLE). In the event of an error, nothing should be
1845
written to the binary log, even if the table is non-transactional;
1846
therefore we pretend that the generated CREATE TABLE statement is
1847
for a transactional table. The event will then be put in the
1848
transaction cache, and any subsequent events (e.g., table-map
1849
events and binrow events) will also be put there. We can then use
1850
ha_autocommit_or_rollback() to either throw away the entire
1851
kaboodle of events, or write them to the binary log.
1853
We write the CREATE TABLE statement here and not in prepare()
1854
since there potentially are sub-selects or accesses to information
1855
schema that will do a close_thread_tables(), destroying the
1856
statement transaction cache.
1858
assert(thd->current_stmt_binlog_row_based);
1859
assert(tables && *tables && count > 0);
1862
String query(buf, sizeof(buf), system_charset_info);
1864
TableList tmp_table_list;
1866
memset(&tmp_table_list, 0, sizeof(tmp_table_list));
1867
tmp_table_list.table = *tables;
1868
query.length(0); // Have to zero it since constructor doesn't
1870
result= store_create_info(thd, &tmp_table_list, &query, create_info);
1871
assert(result == 0); /* store_create_info() always return 0 */
1873
thd->binlog_query(THD::STMT_QUERY_TYPE,
1874
query.ptr(), query.length(),
1875
/* is_trans */ true,
1876
/* suppress_use */ false);
1879
1685
void select_create::store_values(List<Item> &values)
1881
fill_record(thd, field, values, 1);
1687
fill_record(session, field, values, 1);
1885
1691
void select_create::send_error(uint32_t errcode,const char *err)
1890
1696
This will execute any rollbacks that are necessary before writing
1920
1724
if (!table->s->tmp_table)
1922
ha_autocommit_or_rollback(thd, 0);
1923
end_active_trans(thd);
1726
ha_autocommit_or_rollback(session, 0);
1727
(void) session->endActiveTransaction();
1926
1730
table->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
1927
1731
table->file->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
1930
mysql_unlock_tables(thd, *m_plock);
1734
mysql_unlock_tables(session, *m_plock);
1931
1735
*m_plock= NULL;