25
25
#include <drizzled/server_includes.h>
26
26
#include <drizzled/sql_select.h>
27
#include <drizzled/show.h>
28
#include <drizzled/error.h>
29
#include <drizzled/name_resolution_context_state.h>
30
#include <drizzled/probes.h>
31
#include <drizzled/sql_base.h>
32
#include <drizzled/sql_load.h>
33
#include <drizzled/field/timestamp.h>
34
#include <drizzled/lock.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)
58
static int check_insert_fields(Session *session, TableList *table_list,
64
static int check_insert_fields(THD *thd, TableList *table_list,
59
65
List<Item> &fields, List<Item> &values,
67
table_map *map __attribute__((unused)))
63
69
Table *table= table_list->table;
102
108
table_list->next_local= 0;
103
109
context->resolve_in_table_list_only(table_list);
104
res= setup_fields(session, 0, fields, MARK_COLUMNS_WRITE, 0, 0);
110
res= setup_fields(thd, 0, fields, MARK_COLUMNS_WRITE, 0, 0);
106
112
/* Restore the current context. */
107
113
ctx_state.restore_state(context, table_list);
157
static int check_update_fields(Session *session, TableList *insert_table_list,
160
static int check_update_fields(THD *thd, TableList *insert_table_list,
158
161
List<Item> &update_fields,
162
table_map *map __attribute__((unused)))
161
164
Table *table= insert_table_list->table;
162
165
bool timestamp_mark= false;
174
177
/* Check the fields we are going to modify */
175
if (setup_fields(session, 0, update_fields, MARK_COLUMNS_WRITE, 0, 0))
178
if (setup_fields(thd, 0, update_fields, MARK_COLUMNS_WRITE, 0, 0))
178
181
if (table->timestamp_field)
243
247
Name_resolution_context_state ctx_state;
244
248
thr_lock_type lock_type;
245
249
Item *unused_conds= 0;
249
253
Upgrade lock type if the requested lock is incompatible with
250
254
the current connection mode or table operation.
252
upgrade_lock_type(session, &table_list->lock_type, duplic,
256
upgrade_lock_type(thd, &table_list->lock_type, duplic,
253
257
values_list.elements > 1);
255
if (open_and_lock_tables(session, table_list))
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))
268
my_error(ER_DELAYED_INSERT_TABLE_LOCKED, MYF(0),
269
table_list->table_name);
274
if (open_and_lock_tables(thd, table_list))
258
277
lock_type= table_list->lock_type;
260
session->set_proc_info("init");
261
session->used_tables=0;
279
thd_proc_info(thd, "init");
263
282
value_count= values->elements;
265
if (mysql_prepare_insert(session, table_list, table, fields, values,
284
if (mysql_prepare_insert(thd, table_list, table, fields, values,
266
285
update_fields, update_values, duplic, &unused_conds,
268
287
(fields.elements || !value_count ||
300
319
my_error(ER_WRONG_VALUE_COUNT_ON_ROW, MYF(0), counter);
303
if (setup_fields(session, 0, *values, MARK_COLUMNS_READ, 0, 0))
322
if (setup_fields(thd, 0, *values, MARK_COLUMNS_READ, 0, 0))
308
327
/* Restore the current context. */
309
328
ctx_state.restore_state(context, table_list);
322
341
For single line insert, generate an error if try to set a NOT NULL field
325
session->count_cuted_fields= ((values_list.elements == 1 &&
344
thd->count_cuted_fields= ((values_list.elements == 1 &&
327
346
CHECK_FIELD_ERROR_FOR_NULL :
328
347
CHECK_FIELD_WARN);
329
session->cuted_fields = 0L;
348
thd->cuted_fields = 0L;
330
349
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))
333
session->set_proc_info("update");
358
thd_proc_info(thd, "update");
334
359
if (duplic == DUP_REPLACE)
335
360
table->file->extra(HA_EXTRA_WRITE_CAN_REPLACE);
336
361
if (duplic == DUP_UPDATE)
351
376
if (fields.elements || !value_count)
353
378
restore_record(table,s->default_values); // Get empty record
354
if (fill_record(session, fields, *values, 0))
379
if (fill_record(thd, fields, *values, 0))
356
if (values_list.elements != 1 && ! session->is_error())
381
if (values_list.elements != 1 && ! thd->is_error())
362
TODO: set session->abort_on_warning if values_list.elements == 1
387
TODO: set thd->abort_on_warning if values_list.elements == 1
363
388
and check that all items return warning in case of problem with
381
406
table->record[0][0]= table->s->default_values[0];
383
if (fill_record(session, table->field, *values, 0))
408
if (fill_record(thd, table->field, *values, 0))
385
if (values_list.elements != 1 && ! session->is_error())
410
if (values_list.elements != 1 && ! thd->is_error())
395
// Release latches in case bulk insert takes a long time
396
ha_release_temporary_latches(session);
398
error=write_record(session, table ,&info);
420
error=write_record(thd, table ,&info);
401
session->row_count++;
404
free_underlaid_joins(session, &session->lex->select_lex);
426
free_underlaid_joins(thd, &thd->lex->select_lex);
405
427
joins_freed= true;
425
447
transactional_table= table->file->has_transactions();
427
changed= (info.copied || info.deleted || info.updated);
428
if ((changed && error <= 0) || session->transaction.stmt.modified_non_trans_table)
430
if (session->transaction.stmt.modified_non_trans_table)
431
session->transaction.all.modified_non_trans_table= true;
433
assert(transactional_table || !changed || session->transaction.stmt.modified_non_trans_table);
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);
436
session->set_proc_info("end");
504
thd_proc_info(thd, "end");
438
506
We'll report to the client this id:
439
507
- if the table contains an autoincrement column and we successfully
444
512
inserted, the id of the last "inserted" row (if IGNORE, that value may not
445
513
have been really inserted but ignored).
447
id= (session->first_successful_insert_id_in_cur_stmt > 0) ?
448
session->first_successful_insert_id_in_cur_stmt :
449
(session->arg_of_last_insert_id_function ?
450
session->first_successful_insert_id_in_prev_stmt :
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 :
451
519
((table->next_number_field && info.copied) ?
452
520
table->next_number_field->val_int() : 0));
453
521
table->next_number_field=0;
454
session->count_cuted_fields= CHECK_FIELD_IGNORE;
522
thd->count_cuted_fields= CHECK_FIELD_IGNORE;
455
523
table->auto_increment_field_not_null= false;
456
524
if (duplic == DUP_REPLACE)
457
525
table->file->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
461
if (values_list.elements == 1 && (!(session->options & OPTION_WARNINGS) ||
462
!session->cuted_fields))
529
if (values_list.elements == 1 && (!(thd->options & OPTION_WARNINGS) ||
464
session->row_count_func= info.copied + info.deleted +
465
((session->client_capabilities & CLIENT_FOUND_ROWS) ?
532
thd->row_count_func= info.copied + info.deleted +
533
((thd->client_capabilities & CLIENT_FOUND_ROWS) ?
466
534
info.touched : info.updated);
467
session->my_ok((ulong) session->row_count_func, id);
535
my_ok(thd, (ulong) thd->row_count_func, id);
472
ha_rows updated=((session->client_capabilities & CLIENT_FOUND_ROWS) ?
540
ha_rows updated=((thd->client_capabilities & CLIENT_FOUND_ROWS) ?
473
541
info.touched : info.updated);
475
543
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
476
(ulong) (info.records - info.copied), (ulong) session->cuted_fields);
544
(ulong) (info.records - info.copied), (ulong) thd->cuted_fields);
478
546
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
479
(ulong) (info.deleted + updated), (ulong) session->cuted_fields);
480
session->row_count_func= info.copied + info.deleted + updated;
481
session->my_ok((ulong) session->row_count_func, id, buff);
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);
483
session->abort_on_warning= 0;
551
thd->abort_on_warning= 0;
484
552
DRIZZLE_INSERT_END();
527
if (setup_tables_and_check_access(session, &session->lex->select_lex.context,
528
&session->lex->select_lex.top_join_list,
595
if (setup_tables_and_check_access(thd, &thd->lex->select_lex.context,
596
&thd->lex->select_lex.top_join_list,
530
&session->lex->select_lex.leaf_tables,
598
&thd->lex->select_lex.leaf_tables,
542
610
mysql_prepare_insert()
543
session Thread handler
544
612
table_list Global/local table list
545
613
table Table to insert into (can be NULL if table should
546
be taken from table_list->table)
614
be taken from table_list->table)
547
615
where Where clause (for insert ... select)
548
616
select_insert true if INSERT ... SELECT statement
549
check_fields true if need to check that all INSERT fields are
617
check_fields true if need to check that all INSERT fields are
551
abort_on_warning whether to report if some INSERT field is not
619
abort_on_warning whether to report if some INSERT field is not
552
620
assigned as an error (true) or as a warning (false).
554
622
TODO (in far future)
561
629
You MUST set table->insert_values to 0 after calling this function
562
630
before releasing the table object.
569
bool mysql_prepare_insert(Session *session, TableList *table_list,
637
bool mysql_prepare_insert(THD *thd, TableList *table_list,
570
638
Table *table, List<Item> &fields, List_item *values,
571
639
List<Item> &update_fields, List<Item> &update_values,
572
640
enum_duplicates duplic,
641
COND **where __attribute__((unused)),
574
642
bool select_insert,
575
643
bool check_fields, bool abort_on_warning)
577
Select_Lex *select_lex= &session->lex->select_lex;
645
SELECT_LEX *select_lex= &thd->lex->select_lex;
578
646
Name_resolution_context *context= &select_lex->context;
579
647
Name_resolution_context_state ctx_state;
580
648
bool insert_into_view= (0 != 0);
582
650
table_map map= 0;
584
652
/* INSERT should have a SELECT or VALUES clause */
585
653
assert (!select_insert || !values);
588
656
For subqueries in VALUES() we should not see the table in which we are
589
657
inserting (for INSERT ... SELECT this is done by changing table_list,
590
because INSERT ... SELECT share Select_Lex it with SELECT.
658
because INSERT ... SELECT share SELECT_LEX it with SELECT.
592
660
if (!select_insert)
594
for (Select_Lex_Unit *un= select_lex->first_inner_unit();
662
for (SELECT_LEX_UNIT *un= select_lex->first_inner_unit();
596
664
un= un->next_unit())
598
for (Select_Lex *sl= un->first_select();
666
for (SELECT_LEX *sl= un->first_select();
600
668
sl= sl->next_select())
607
675
if (duplic == DUP_UPDATE)
609
677
/* it should be allocated before Item::fix_fields() */
610
if (table_list->set_insert_values(session->mem_root))
678
if (table_list->set_insert_values(thd->mem_root))
614
if (mysql_prepare_insert_check_table(session, table_list, fields, select_insert))
682
if (mysql_prepare_insert_check_table(thd, table_list, fields, select_insert))
631
699
table_list->next_local= 0;
632
700
context->resolve_in_table_list_only(table_list);
634
res= check_insert_fields(session, context->table_list, fields, *values,
702
res= check_insert_fields(thd, context->table_list, fields, *values,
635
703
!insert_into_view, &map) ||
636
setup_fields(session, 0, *values, MARK_COLUMNS_READ, 0, 0);
704
setup_fields(thd, 0, *values, MARK_COLUMNS_READ, 0, 0);
638
706
if (!res && check_fields)
640
bool saved_abort_on_warning= session->abort_on_warning;
641
session->abort_on_warning= abort_on_warning;
642
res= check_that_all_fields_are_given_values(session,
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,
644
712
context->table_list->table,
645
713
context->table_list);
646
session->abort_on_warning= saved_abort_on_warning;
714
thd->abort_on_warning= saved_abort_on_warning;
649
717
if (!res && duplic == DUP_UPDATE)
651
res= check_update_fields(session, context->table_list, update_fields, &map);
719
res= check_update_fields(thd, context->table_list, update_fields, &map);
654
722
/* Restore the current context. */
655
723
ctx_state.restore_state(context, table_list);
658
res= setup_fields(session, 0, update_values, MARK_COLUMNS_READ, 0, 0);
726
res= setup_fields(thd, 0, update_values, MARK_COLUMNS_READ, 0, 0);
720
int write_record(Session *session, Table *table,COPY_INFO *info)
788
int write_record(THD *thd, Table *table,COPY_INFO *info)
724
792
MY_BITMAP *save_read_set, *save_write_set;
725
793
uint64_t prev_insert_id= table->file->next_insert_id;
726
794
uint64_t insert_id_for_cur_row= 0;
730
798
save_read_set= table->read_set;
731
799
save_write_set= table->write_set;
733
if (info->handle_duplicates == DUP_REPLACE || info->handle_duplicates == DUP_UPDATE)
801
if (info->handle_duplicates == DUP_REPLACE ||
802
info->handle_duplicates == DUP_UPDATE)
735
804
while ((error=table->file->ha_write_row(table->record[0])))
872
942
an INSERT or DELETE(s) + INSERT; FOREIGN KEY checks in
873
943
InnoDB do not function in the defined way if we allow MySQL
874
944
to convert the latter operation internally to an UPDATE.
875
We also should not perform this conversion if we have
945
We also should not perform this conversion if we have
876
946
timestamp field with ON UPDATE which is different from DEFAULT.
877
947
Another case when conversion should not be performed is when
878
948
we have ON DELETE trigger on table so user may notice that
933
1003
after_n_copied_inc:
935
session->record_first_successful_insert_id_in_cur_stmt(table->file->insert_id_for_cur_row);
1005
thd->record_first_successful_insert_id_in_cur_stmt(table->file->insert_id_for_cur_row);
937
1007
gok_or_after_err:
1009
my_safe_afree(key,table->s->max_unique_length,MAX_KEY_LENGTH);
940
1010
if (!table->file->has_transactions())
941
session->transaction.stmt.modified_non_trans_table= true;
1011
thd->transaction.stmt.modified_non_trans_table= true;
945
1015
info->last_errno= error;
946
1016
/* current_select is NULL if this is a delayed insert */
947
if (session->lex->current_select)
948
session->lex->current_select->no_error= 0; // Give error
1017
if (thd->lex->current_select)
1018
thd->lex->current_select->no_error= 0; // Give error
949
1019
table->file->print_error(error,MYF(0));
952
1022
table->file->restore_auto_increment(prev_insert_id);
1024
my_safe_afree(key, table->s->max_unique_length, MAX_KEY_LENGTH);
955
1025
table->column_bitmaps_set(save_read_set, save_write_set);
961
1031
Check that all fields with arn't null_fields are used
962
1032
******************************************************************************/
964
int check_that_all_fields_are_given_values(Session *session, Table *entry,
1034
int check_that_all_fields_are_given_values(THD *thd, Table *entry,
1035
TableList *table_list)
968
1038
MY_BITMAP *write_set= entry->write_set;
970
1040
for (Field **field=entry->field ; *field ; field++)
972
if (!bitmap_is_set(write_set, (*field)->field_index))
975
* If the field doesn't have any default value
976
* and there is no actual value specified in the
977
* INSERT statement, throw error ER_NO_DEFAULT_FOR_FIELD.
979
if (((*field)->flags & NO_DEFAULT_VALUE_FLAG) &&
1042
if (!bitmap_is_set(write_set, (*field)->field_index) &&
1043
((*field)->flags & NO_DEFAULT_VALUE_FLAG) &&
980
1044
((*field)->real_type() != DRIZZLE_TYPE_ENUM))
982
my_error(ER_NO_DEFAULT_FOR_FIELD, MYF(0), (*field)->field_name);
989
* However, if an actual NULL value was specified
990
* for the field and the field is a NOT NULL field,
991
* throw ER_BAD_NULL_ERROR.
993
* Per the SQL standard, inserting NULL into a NOT NULL
994
* field requires an error to be thrown.
996
if (((*field)->flags & NOT_NULL_FLAG) &&
999
my_error(ER_BAD_NULL_ERROR, 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);
1004
return session->abort_on_warning ? err : 0;
1061
return thd->abort_on_warning ? err : 0;
1007
1064
/***************************************************************************
1016
1073
mysql_insert_select_prepare()
1017
session thread handler
1024
bool mysql_insert_select_prepare(Session *session)
1081
bool mysql_insert_select_prepare(THD *thd)
1026
LEX *lex= session->lex;
1027
Select_Lex *select_lex= &lex->select_lex;
1030
Select_Lex do not belong to INSERT statement, so we can't add WHERE
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
1031
1102
clause if table is VIEW
1034
if (mysql_prepare_insert(session, lex->query_tables,
1105
if (mysql_prepare_insert(thd, lex->query_tables,
1035
1106
lex->query_tables->table, lex->field_list, 0,
1036
1107
lex->update_list, lex->value_list,
1037
1108
lex->duplicates,
1085
1156
we are fixing fields from insert list.
1087
1158
lex->current_select= &lex->select_lex;
1088
res= check_insert_fields(session, table_list, *fields, values,
1159
res= check_insert_fields(thd, table_list, *fields, values,
1089
1160
!insert_into_view, &map) ||
1090
setup_fields(session, 0, values, MARK_COLUMNS_READ, 0, 0);
1161
setup_fields(thd, 0, values, MARK_COLUMNS_READ, 0, 0);
1092
1163
if (!res && fields->elements)
1094
bool saved_abort_on_warning= session->abort_on_warning;
1095
session->abort_on_warning= !info.ignore;
1096
res= check_that_all_fields_are_given_values(session, table_list->table,
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,
1098
session->abort_on_warning= saved_abort_on_warning;
1169
thd->abort_on_warning= saved_abort_on_warning;
1101
1172
if (info.handle_duplicates == DUP_UPDATE && !res)
1110
1181
table_list->next_local= 0;
1111
1182
context->resolve_in_table_list_only(table_list);
1113
res= res || check_update_fields(session, context->table_list,
1184
res= res || check_update_fields(thd, context->table_list,
1114
1185
*info.update_fields, &map);
1116
When we are not using GROUP BY and there are no ungrouped aggregate functions
1187
When we are not using GROUP BY and there are no ungrouped aggregate functions
1117
1188
we can refer to other tables in the ON DUPLICATE KEY part.
1118
1189
We use next_name_resolution_table descructively, so check it first (views?)
1124
1195
We must make a single context out of the two separate name resolution contexts :
1125
1196
the INSERT table and the tables in the SELECT part of INSERT ... SELECT.
1126
1197
To do that we must concatenate the two lists
1128
table_list->next_name_resolution_table=
1199
table_list->next_name_resolution_table=
1129
1200
ctx_state.get_first_name_resolution_table();
1131
res= res || setup_fields(session, 0, *info.update_values,
1202
res= res || setup_fields(thd, 0, *info.update_values,
1132
1203
MARK_COLUMNS_READ, 0, 0);
1165
1236
Is table which we are changing used somewhere in other parts of
1168
if (unique_table(session, table_list, table_list->next_global, 0))
1239
if (unique_table(thd, table_list, table_list->next_global, 0))
1170
1241
/* Using same table for INSERT and SELECT */
1171
1242
lex->current_select->options|= OPTION_BUFFER_RESULT;
1174
1245
else if (!(lex->current_select->options & OPTION_BUFFER_RESULT))
1177
We must not yet prepare the result table if it is the same as one of the
1178
source tables (INSERT SELECT). The preparation may disable
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
1179
1250
indexes on the result table, which may be used during the select, if it
1180
1251
is the same table (Bug #6034). Do the preparation after the select phase
1181
1252
in select_insert::prepare2().
1187
1258
restore_record(table,s->default_values); // Get empty record
1188
1259
table->next_number_field=table->found_next_number_field;
1190
session->cuted_fields=0;
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;
1191
1268
if (info.ignore || info.handle_duplicates != DUP_ERROR)
1192
1269
table->file->extra(HA_EXTRA_IGNORE_DUP_KEY);
1193
1270
if (info.handle_duplicates == DUP_REPLACE)
1194
1271
table->file->extra(HA_EXTRA_WRITE_CAN_REPLACE);
1195
1272
if (info.handle_duplicates == DUP_UPDATE)
1196
1273
table->file->extra(HA_EXTRA_INSERT_WITH_UPDATE);
1197
session->abort_on_warning= !info.ignore;
1274
thd->abort_on_warning= !info.ignore;
1198
1275
table->mark_columns_needed_for_insert();
1213
1290
If the result table is the same as one of the source tables (INSERT SELECT),
1214
1291
the result table is not finally prepared at the join prepair phase.
1215
1292
Do the final preparation now.
1221
1298
int select_insert::prepare2(void)
1224
if (session->lex->current_select->options & OPTION_BUFFER_RESULT)
1301
if (thd->lex->current_select->options & OPTION_BUFFER_RESULT)
1225
1302
table->file->ha_start_bulk_insert((ha_rows) 0);
1236
1313
select_insert::~select_insert()
1241
1318
table->next_number_field=0;
1242
1319
table->auto_increment_field_not_null= false;
1243
1320
table->file->ha_reset();
1245
session->count_cuted_fields= CHECK_FIELD_IGNORE;
1246
session->abort_on_warning= 0;
1322
thd->count_cuted_fields= CHECK_FIELD_IGNORE;
1323
thd->abort_on_warning= 0;
1251
1328
bool select_insert::send_data(List<Item> &values)
1256
1333
if (unit->offset_limit_cnt)
1262
session->count_cuted_fields= CHECK_FIELD_WARN; // Calculate cuted fields
1339
thd->count_cuted_fields= CHECK_FIELD_WARN; // Calculate cuted fields
1263
1340
store_values(values);
1264
session->count_cuted_fields= CHECK_FIELD_IGNORE;
1265
if (session->is_error())
1341
thd->count_cuted_fields= CHECK_FIELD_IGNORE;
1342
if (thd->is_error())
1268
error= write_record(session, table, &info);
1345
error= write_record(thd, table, &info);
1272
1349
if (info.handle_duplicates == DUP_UPDATE)
1287
1364
If no value has been autogenerated so far, we need to remember the
1288
1365
value we just saw, we may need to send it to client in the end.
1290
if (session->first_successful_insert_id_in_cur_stmt == 0) // optimization
1291
autoinc_value_of_last_inserted_row=
1367
if (thd->first_successful_insert_id_in_cur_stmt == 0) // optimization
1368
autoinc_value_of_last_inserted_row=
1292
1369
table->next_number_field->val_int();
1294
1371
Clear auto-increment field for the next record, if triggers are used
1304
1381
void select_insert::store_values(List<Item> &values)
1306
1383
if (fields->elements)
1307
fill_record(session, *fields, values, 1);
1384
fill_record(thd, *fields, values, 1);
1309
fill_record(session, table->field, values, 1);
1386
fill_record(thd, table->field, values, 1);
1312
1389
void select_insert::send_error(uint32_t errcode,const char *err)
1316
1393
my_message(errcode, err, MYF(0));
1336
1414
We must invalidate the table in the query cache before binlog writing
1337
1415
and ha_autocommit_or_rollback.
1339
if (session->transaction.stmt.modified_non_trans_table)
1340
session->transaction.all.modified_non_trans_table= true;
1417
if (thd->transaction.stmt.modified_non_trans_table)
1418
thd->transaction.all.modified_non_trans_table= true;
1342
assert(trans_table || !changed ||
1343
session->transaction.stmt.modified_non_trans_table);
1420
assert(trans_table || !changed ||
1421
thd->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);
1345
1437
table->file->ha_release_auto_increment();
1352
1444
char buff[160];
1353
1445
if (info.ignore)
1354
1446
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
1355
(ulong) (info.records - info.copied), (ulong) session->cuted_fields);
1447
(ulong) (info.records - info.copied), (ulong) thd->cuted_fields);
1357
1449
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
1358
(ulong) (info.deleted+info.updated), (ulong) session->cuted_fields);
1359
session->row_count_func= info.copied + info.deleted +
1360
((session->client_capabilities & CLIENT_FOUND_ROWS) ?
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) ?
1361
1453
info.touched : info.updated);
1363
id= (session->first_successful_insert_id_in_cur_stmt > 0) ?
1364
session->first_successful_insert_id_in_cur_stmt :
1365
(session->arg_of_last_insert_id_function ?
1366
session->first_successful_insert_id_in_prev_stmt :
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 :
1367
1459
(info.copied ? autoinc_value_of_last_inserted_row : 0));
1368
session->my_ok((ulong) session->row_count_func, id, buff);
1460
::my_ok(thd, (ulong) thd->row_count_func, id, buff);
1372
1464
void select_insert::abort() {
1376
1468
If the creation of the table failed (due to a syntax error, for
1377
1469
example), no table will have been opened and therefore 'table'
1401
1493
changed= (info.copied || info.deleted || info.updated);
1402
1494
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;
1403
1503
assert(transactional_table || !changed ||
1404
session->transaction.stmt.modified_non_trans_table);
1504
thd->transaction.stmt.modified_non_trans_table);
1405
1505
table->file->ha_release_auto_increment();
1478
1579
if (create_info->options & HA_LEX_CREATE_IF_NOT_EXISTS)
1480
1581
create_info->table_existed= 1; // Mark that table existed
1481
push_warning_printf(session, DRIZZLE_ERROR::WARN_LEVEL_NOTE,
1582
push_warning_printf(thd, DRIZZLE_ERROR::WARN_LEVEL_NOTE,
1482
1583
ER_TABLE_EXISTS_ERROR, ER(ER_TABLE_EXISTS_ERROR),
1483
1584
create_table->table_name);
1484
1585
return(create_table->table);
1491
1592
tmp_table.alias= 0;
1492
1593
tmp_table.timestamp_field= 0;
1493
1594
tmp_table.s= &share;
1494
init_tmp_table_share(session, &share, "", 0, "", "");
1595
init_tmp_table_share(thd, &share, "", 0, "", "");
1496
1597
tmp_table.s->db_create_options=0;
1497
1598
tmp_table.s->blob_ptr_size= portable_sizeof_char_ptr;
1498
tmp_table.s->db_low_byte_first=
1599
tmp_table.s->db_low_byte_first=
1499
1600
test(create_info->db_type == myisam_hton ||
1500
1601
create_info->db_type == heap_hton);
1501
1602
tmp_table.null_row= false;
1512
1613
field= item->tmp_table_field_from_field_type(&tmp_table, 0);
1514
field= create_tmp_field(session, &tmp_table, item, item->type(),
1615
field= create_tmp_field(thd, &tmp_table, item, item->type(),
1515
1616
(Item ***) 0, &tmp_field, &def_field, 0, 0, 0, 0,
1544
if (!mysql_create_table_no_lock(session, create_table->db,
1645
tmp_disable_binlog(thd);
1646
if (!mysql_create_table_no_lock(thd, create_table->db,
1545
1647
create_table->table_name,
1546
1648
create_info, alter_info, 0,
1547
select_field_count, true))
1649
select_field_count))
1549
1651
if (create_info->table_existed &&
1550
1652
!(create_info->options & HA_LEX_CREATE_TMP_TABLE))
1561
1663
if (!(create_info->options & HA_LEX_CREATE_TMP_TABLE))
1563
1665
pthread_mutex_lock(&LOCK_open);
1564
if (reopen_name_locked_table(session, create_table, false))
1666
if (reopen_name_locked_table(thd, create_table, false))
1566
1668
quick_rm_table(create_info->db_type, create_table->db,
1567
1669
table_case_name(create_info, create_table->table_name),
1582
1684
it preparable for open. But let us do close_temporary_table() here
1585
drop_temporary_table(session, create_table);
1687
drop_temporary_table(thd, create_table);
1691
reenable_binlog(thd);
1589
1692
if (!table) // open failed
1593
1696
table->reginfo.lock_type=TL_WRITE;
1594
if (! ((*lock)= mysql_lock_tables(session, &table, 1,
1595
DRIZZLE_LOCK_IGNORE_FLUSH, ¬_used)))
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))
1599
mysql_unlock_tables(session, *lock);
1704
mysql_unlock_tables(thd, *lock);
1603
1708
if (!create_info->table_existed)
1604
drop_open_table(session, table, create_table->db, create_table->table_name);
1709
drop_open_table(thd, table, create_table->db, create_table->table_name);
1630
1738
slave. Hence, we have to hold on to the CREATE part of the
1631
1739
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);
1638
1778
row-based replication for the statement. If we are creating a
1639
1779
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();
1642
if (!(table= create_table_from_items(session, create_info, create_table,
1787
if (!(table= create_table_from_items(thd, create_info, create_table,
1643
1788
alter_info, &values,
1789
&extra_lock, hook_ptr)))
1645
1790
return(-1); // abort() deletes table
1647
1792
if (extra_lock)
1682
1827
if (info.handle_duplicates == DUP_UPDATE)
1683
1828
table->file->extra(HA_EXTRA_INSERT_WITH_UPDATE);
1684
1829
table->file->ha_start_bulk_insert((ha_rows) 0);
1685
session->abort_on_warning= !info.ignore;
1686
if (check_that_all_fields_are_given_values(session, table, table_list))
1830
thd->abort_on_warning= !info.ignore;
1831
if (check_that_all_fields_are_given_values(thd, table, table_list))
1688
1833
table->mark_columns_needed_for_insert();
1689
1834
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);
1693
1879
void select_create::store_values(List<Item> &values)
1695
fill_record(session, field, values, 1);
1881
fill_record(thd, field, values, 1);
1699
1885
void select_create::send_error(uint32_t errcode,const char *err)
1704
1890
This will execute any rollbacks that are necessary before writing
1732
1920
if (!table->s->tmp_table)
1734
ha_autocommit_or_rollback(session, 0);
1735
(void) session->endActiveTransaction();
1922
ha_autocommit_or_rollback(thd, 0);
1923
end_active_trans(thd);
1738
1926
table->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
1739
1927
table->file->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
1742
mysql_unlock_tables(session, *m_plock);
1930
mysql_unlock_tables(thd, *m_plock);
1743
1931
*m_plock= NULL;
1783
1973
table->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
1784
1974
table->file->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
1785
1975
if (!create_info->table_existed)
1786
drop_open_table(session, table, create_table->db, create_table->table_name);
1976
drop_open_table(thd, table, create_table->db, create_table->table_name);
1787
1977
table=0; // Safety