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