12
12
You should have received a copy of the GNU General Public License
13
13
along with this program; if not, write to the Free Software
14
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
14
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
17
17
/* Insert of records */
19
#include <drizzled/server_includes.h>
21
20
#include <drizzled/sql_select.h>
22
21
#include <drizzled/show.h>
23
22
#include <drizzled/error.h>
25
24
#include <drizzled/probes.h>
26
25
#include <drizzled/sql_base.h>
27
26
#include <drizzled/sql_load.h>
28
#include <drizzled/field/epoch.h>
27
#include <drizzled/field/timestamp.h>
29
28
#include <drizzled/lock.h>
30
#include "drizzled/sql_table.h"
31
#include "drizzled/pthread_globals.h"
32
#include "drizzled/transaction_services.h"
33
#include "drizzled/plugin/transactional_storage_engine.h"
35
#include "drizzled/table/shell.h"
40
extern plugin::StorageEngine *heap_engine;
41
extern plugin::StorageEngine *myisam_engine;
30
using namespace drizzled;
44
33
Check if insert fields are correct.
272
253
value_count= values->elements;
274
if (prepare_insert(session, table_list, table, fields, values,
255
if (mysql_prepare_insert(session, table_list, table, fields, values,
275
256
update_fields, update_values, duplic, &unused_conds,
277
258
(fields.elements || !value_count ||
278
259
(0) != 0), !ignore))
281
table->cursor->ha_release_auto_increment();
283
free_underlaid_joins(session, &session->lex->select_lex);
284
session->setAbortOnWarning(false);
285
DRIZZLE_INSERT_DONE(1, 0);
289
262
/* mysql_prepare_insert set table_list->table if it was not set */
290
263
table= table_list->table;
315
288
if (values->elements != value_count)
317
290
my_error(ER_WRONG_VALUE_COUNT_ON_ROW, MYF(0), counter);
320
table->cursor->ha_release_auto_increment();
322
free_underlaid_joins(session, &session->lex->select_lex);
323
session->setAbortOnWarning(false);
324
DRIZZLE_INSERT_DONE(1, 0);
328
293
if (setup_fields(session, 0, *values, MARK_COLUMNS_READ, 0, 0))
331
table->cursor->ha_release_auto_increment();
333
free_underlaid_joins(session, &session->lex->select_lex);
334
session->setAbortOnWarning(false);
335
DRIZZLE_INSERT_DONE(1, 0);
354
312
For single line insert, generate an error if try to set a NOT NULL field
357
session->count_cuted_fields= ignore ? CHECK_FIELD_WARN : CHECK_FIELD_ERROR_FOR_NULL;
315
session->count_cuted_fields= ((values_list.elements == 1 &&
317
CHECK_FIELD_ERROR_FOR_NULL :
359
319
session->cuted_fields = 0L;
360
320
table->next_number_field=table->found_next_number_field;
363
323
session->set_proc_info("update");
364
324
if (duplic == DUP_REPLACE)
365
table->cursor->extra(HA_EXTRA_WRITE_CAN_REPLACE);
325
table->file->extra(HA_EXTRA_WRITE_CAN_REPLACE);
366
326
if (duplic == DUP_UPDATE)
367
table->cursor->extra(HA_EXTRA_INSERT_WITH_UPDATE);
327
table->file->extra(HA_EXTRA_INSERT_WITH_UPDATE);
369
329
if (duplic != DUP_ERROR || ignore)
370
table->cursor->extra(HA_EXTRA_IGNORE_DUP_KEY);
371
table->cursor->ha_start_bulk_insert(values_list.elements);
330
table->file->extra(HA_EXTRA_IGNORE_DUP_KEY);
331
table->file->ha_start_bulk_insert(values_list.elements);
375
session->setAbortOnWarning(not ignore);
335
session->abort_on_warning= !ignore;
377
337
table->mark_columns_needed_for_insert();
402
table->restoreRecordAsDefault(); // Get empty record
404
if (fill_record(session, table->getFields(), *values))
362
if (session->used_tables) // Column used in values()
363
table->restoreRecordAsDefault(); // Get empty record
367
Fix delete marker. No need to restore rest of record since it will
368
be overwritten by fill_record() anyway (and fill_record() does not
369
use default values in this case).
371
table->record[0][0]= table->s->default_values[0];
373
if (fill_record(session, table->field, *values, 0))
406
375
if (values_list.elements != 1 && ! session->is_error())
434
403
Do not do this release if this is a delayed insert, it would steal
435
404
auto_inc values from the delayed_insert thread as they share Table.
437
table->cursor->ha_release_auto_increment();
438
if (table->cursor->ha_end_bulk_insert() && !error)
406
table->file->ha_release_auto_increment();
407
if (table->file->ha_end_bulk_insert() && !error)
440
table->print_error(errno,MYF(0));
409
table->file->print_error(my_errno,MYF(0));
443
412
if (duplic != DUP_ERROR || ignore)
444
table->cursor->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
413
table->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
446
transactional_table= table->cursor->has_transactions();
415
transactional_table= table->file->has_transactions();
448
417
changed= (info.copied || info.deleted || info.updated);
449
if ((changed && error <= 0) || session->transaction.stmt.hasModifiedNonTransData())
418
if ((changed && error <= 0) || session->transaction.stmt.modified_non_trans_table)
451
if (session->transaction.stmt.hasModifiedNonTransData())
452
session->transaction.all.markModifiedNonTransData();
420
if (session->transaction.stmt.modified_non_trans_table)
421
session->transaction.all.modified_non_trans_table= true;
454
assert(transactional_table || !changed || session->transaction.stmt.hasModifiedNonTransData());
423
assert(transactional_table || !changed || session->transaction.stmt.modified_non_trans_table);
457
426
session->set_proc_info("end");
475
444
session->count_cuted_fields= CHECK_FIELD_IGNORE;
476
445
table->auto_increment_field_not_null= false;
477
446
if (duplic == DUP_REPLACE)
478
table->cursor->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
447
table->file->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
483
table->cursor->ha_release_auto_increment();
485
free_underlaid_joins(session, &session->lex->select_lex);
486
session->setAbortOnWarning(false);
487
DRIZZLE_INSERT_DONE(1, 0);
491
451
if (values_list.elements == 1 && (!(session->options & OPTION_WARNINGS) ||
492
452
!session->cuted_fields))
494
454
session->row_count_func= info.copied + info.deleted + info.updated;
495
session->my_ok((ulong) session->rowCount(),
455
session->my_ok((ulong) session->row_count_func,
496
456
info.copied + info.deleted + info.touched, id);
502
snprintf(buff, sizeof(buff), ER(ER_INSERT_INFO), (ulong) info.records,
462
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
503
463
(ulong) (info.records - info.copied), (ulong) session->cuted_fields);
505
snprintf(buff, sizeof(buff), ER(ER_INSERT_INFO), (ulong) info.records,
465
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
506
466
(ulong) (info.deleted + info.updated), (ulong) session->cuted_fields);
507
467
session->row_count_func= info.copied + info.deleted + info.updated;
508
session->my_ok((ulong) session->rowCount(),
468
session->my_ok((ulong) session->row_count_func,
509
469
info.copied + info.deleted + info.touched, id, buff);
511
session->status_var.inserted_row_count+= session->rowCount();
512
session->setAbortOnWarning(false);
513
DRIZZLE_INSERT_DONE(0, session->rowCount());
471
session->abort_on_warning= 0;
472
DRIZZLE_INSERT_DONE(0, session->row_count_func);
477
table->file->ha_release_auto_increment();
479
free_underlaid_joins(session, &session->lex->select_lex);
480
session->abort_on_warning= 0;
481
DRIZZLE_INSERT_DONE(1, 0);
676
642
/* Restore the current context. */
677
643
ctx_state.restore_state(context, table_list);
680
646
res= setup_fields(session, 0, update_values, MARK_COLUMNS_READ, 0, 0);
687
653
table= table_list->table;
689
if (not select_insert)
691
657
TableList *duplicate;
692
if ((duplicate= unique_table(table_list, table_list->next_global, true)))
658
if ((duplicate= unique_table(session, table_list, table_list->next_global, 1)))
694
660
my_error(ER_UPDATE_TABLE_USED, MYF(0), table_list->alias);
700
665
if (duplic == DUP_UPDATE || duplic == DUP_REPLACE)
701
666
table->prepare_for_position();
767
732
the autogenerated value to avoid session->insert_id_for_cur_row to become
770
if (table->cursor->insert_id_for_cur_row > 0)
771
insert_id_for_cur_row= table->cursor->insert_id_for_cur_row;
735
if (table->file->insert_id_for_cur_row > 0)
736
insert_id_for_cur_row= table->file->insert_id_for_cur_row;
773
table->cursor->insert_id_for_cur_row= insert_id_for_cur_row;
738
table->file->insert_id_for_cur_row= insert_id_for_cur_row;
774
739
bool is_duplicate_key_error;
775
if (table->cursor->is_fatal_error(error, HA_CHECK_DUP))
740
if (table->file->is_fatal_error(error, HA_CHECK_DUP))
777
is_duplicate_key_error= table->cursor->is_fatal_error(error, 0);
742
is_duplicate_key_error= table->file->is_fatal_error(error, 0);
778
743
if (!is_duplicate_key_error)
801
766
if (info->handle_duplicates == DUP_REPLACE &&
802
767
table->next_number_field &&
803
key_nr == table->getShare()->next_number_index &&
768
key_nr == table->s->next_number_index &&
804
769
(insert_id_for_cur_row > 0))
806
if (table->cursor->getEngine()->check_flag(HTON_BIT_DUPLICATE_POS))
771
if (table->file->ha_table_flags() & HA_DUPLICATE_POS)
808
if (table->cursor->rnd_pos(table->getUpdateRecord(),table->cursor->dup_ref))
773
if (table->file->rnd_pos(table->record[1],table->file->dup_ref))
813
if (table->cursor->extra(HA_EXTRA_FLUSH_CACHE)) /* Not needed with NISAM */
778
if (table->file->extra(HA_EXTRA_FLUSH_CACHE)) /* Not needed with NISAM */
821
key.resize(table->getShare()->max_unique_length);
786
if (!(key=(char*) malloc(table->s->max_unique_length)))
823
key_copy(&key[0], table->getInsertRecord(), table->key_info+key_nr, 0);
824
if ((error=(table->cursor->index_read_idx_map(table->getUpdateRecord(),key_nr,
825
&key[0], HA_WHOLE_KEY,
792
key_copy((unsigned char*) key,table->record[0],table->key_info+key_nr,0);
793
if ((error=(table->file->index_read_idx_map(table->record[1],key_nr,
794
(unsigned char*) key, HA_WHOLE_KEY,
826
795
HA_READ_KEY_EXACT))))
846
table->cursor->restore_auto_increment(prev_insert_id);
815
table->file->restore_auto_increment(prev_insert_id);
847
816
if (table->next_number_field)
848
table->cursor->adjust_next_insert_id_after_explicit_value(
817
table->file->adjust_next_insert_id_after_explicit_value(
849
818
table->next_number_field->val_int());
852
if (! table->records_are_comparable() || table->compare_records())
820
if ((table->file->ha_table_flags() & HA_PARTIAL_COLUMN_READ &&
821
!bitmap_is_subset(table->write_set, table->read_set)) ||
822
table->compare_record())
854
if ((error=table->cursor->updateRecord(table->getUpdateRecord(),
855
table->getInsertRecord())) &&
824
if ((error=table->file->ha_update_row(table->record[1],
825
table->record[0])) &&
856
826
error != HA_ERR_RECORD_IS_THE_SAME)
858
828
if (info->ignore &&
859
!table->cursor->is_fatal_error(error, HA_CHECK_DUP_KEY))
829
!table->file->is_fatal_error(error, HA_CHECK_DUP_KEY))
861
831
goto gok_or_after_err;
871
841
If ON DUP KEY UPDATE updates a row instead of inserting one, it's
872
842
like a regular UPDATE statement: it should not affect the value of a
873
next SELECT LAST_INSERT_ID() or insert_id().
843
next SELECT LAST_INSERT_ID() or mysql_insert_id().
874
844
Except if LAST_INSERT_ID(#) was in the INSERT query, which is
875
845
handled separately by Session::arg_of_last_insert_id_function.
877
insert_id_for_cur_row= table->cursor->insert_id_for_cur_row= 0;
847
insert_id_for_cur_row= table->file->insert_id_for_cur_row= 0;
881
851
if (table->next_number_field)
882
table->cursor->adjust_next_insert_id_after_explicit_value(
852
table->file->adjust_next_insert_id_after_explicit_value(
883
853
table->next_number_field->val_int());
902
872
ON UPDATE triggers.
904
874
if (last_uniq_key(table,key_nr) &&
905
!table->cursor->referenced_by_foreign_key() &&
875
!table->file->referenced_by_foreign_key() &&
906
876
(table->timestamp_field_type == TIMESTAMP_NO_AUTO_SET ||
907
877
table->timestamp_field_type == TIMESTAMP_AUTO_SET_ON_BOTH))
909
if ((error=table->cursor->updateRecord(table->getUpdateRecord(),
910
table->getInsertRecord())) &&
879
if ((error=table->file->ha_update_row(table->record[1],
880
table->record[0])) &&
911
881
error != HA_ERR_RECORD_IS_THE_SAME)
913
883
if (error != HA_ERR_RECORD_IS_THE_SAME)
917
session->record_first_successful_insert_id_in_cur_stmt(table->cursor->insert_id_for_cur_row);
887
session->record_first_successful_insert_id_in_cur_stmt(table->file->insert_id_for_cur_row);
919
889
Since we pretend that we have done insert we should call
920
890
its after triggers.
926
if ((error=table->cursor->deleteRecord(table->getUpdateRecord())))
896
if ((error=table->file->ha_delete_row(table->record[1])))
929
if (!table->cursor->has_transactions())
930
session->transaction.stmt.markModifiedNonTransData();
899
if (!table->file->has_transactions())
900
session->transaction.stmt.modified_non_trans_table= true;
931
901
/* Let us attempt do write_row() once more */
935
session->record_first_successful_insert_id_in_cur_stmt(table->cursor->insert_id_for_cur_row);
905
session->record_first_successful_insert_id_in_cur_stmt(table->file->insert_id_for_cur_row);
937
907
Restore column maps if they where replaced during an duplicate key
940
910
if (table->read_set != save_read_set ||
941
911
table->write_set != save_write_set)
942
table->column_bitmaps_set(*save_read_set, *save_write_set);
912
table->column_bitmaps_set(save_read_set, save_write_set);
944
else if ((error=table->cursor->insertRecord(table->getInsertRecord())))
914
else if ((error=table->file->ha_write_row(table->record[0])))
946
916
if (!info->ignore ||
947
table->cursor->is_fatal_error(error, HA_CHECK_DUP))
917
table->file->is_fatal_error(error, HA_CHECK_DUP))
949
table->cursor->restore_auto_increment(prev_insert_id);
919
table->file->restore_auto_increment(prev_insert_id);
950
920
goto gok_or_after_err;
953
923
after_n_copied_inc:
955
session->record_first_successful_insert_id_in_cur_stmt(table->cursor->insert_id_for_cur_row);
925
session->record_first_successful_insert_id_in_cur_stmt(table->file->insert_id_for_cur_row);
957
927
gok_or_after_err:
958
if (!table->cursor->has_transactions())
959
session->transaction.stmt.markModifiedNonTransData();
930
if (!table->file->has_transactions())
931
session->transaction.stmt.modified_non_trans_table= true;
1070
1044
List<Item> *update_fields,
1071
1045
List<Item> *update_values,
1072
1046
enum_duplicates duplic,
1073
bool ignore_check_option_errors) :
1074
table_list(table_list_par), table(table_par), fields(fields_par),
1075
autoinc_value_of_last_inserted_row(0),
1076
insert_into_view(table_list_par && 0 != 0)
1047
bool ignore_check_option_errors)
1048
:table_list(table_list_par), table(table_par), fields(fields_par),
1049
autoinc_value_of_last_inserted_row(0),
1050
insert_into_view(table_list_par && 0 != 0)
1052
memset(&info, 0, sizeof(info));
1078
1053
info.handle_duplicates= duplic;
1079
1054
info.ignore= ignore_check_option_errors;
1080
1055
info.update_fields= update_fields;
1196
1171
We won't start bulk inserts at all if this statement uses functions or
1197
1172
should invoke triggers since they may access to the same table too.
1199
table->cursor->ha_start_bulk_insert((ha_rows) 0);
1174
table->file->ha_start_bulk_insert((ha_rows) 0);
1201
1176
table->restoreRecordAsDefault(); // Get empty record
1202
1177
table->next_number_field=table->found_next_number_field;
1204
1179
session->cuted_fields=0;
1206
1180
if (info.ignore || info.handle_duplicates != DUP_ERROR)
1207
table->cursor->extra(HA_EXTRA_IGNORE_DUP_KEY);
1181
table->file->extra(HA_EXTRA_IGNORE_DUP_KEY);
1209
1182
if (info.handle_duplicates == DUP_REPLACE)
1210
table->cursor->extra(HA_EXTRA_WRITE_CAN_REPLACE);
1183
table->file->extra(HA_EXTRA_WRITE_CAN_REPLACE);
1212
1184
if (info.handle_duplicates == DUP_UPDATE)
1213
table->cursor->extra(HA_EXTRA_INSERT_WITH_UPDATE);
1215
session->setAbortOnWarning(not info.ignore);
1185
table->file->extra(HA_EXTRA_INSERT_WITH_UPDATE);
1186
session->abort_on_warning= !info.ignore;
1216
1187
table->mark_columns_needed_for_insert();
1326
1296
void select_insert::store_values(List<Item> &values)
1328
1298
if (fields->elements)
1329
fill_record(session, *fields, values, true);
1299
fill_record(session, *fields, values, 1);
1331
fill_record(session, table->getFields(), values, true);
1301
fill_record(session, table->field, values, 1);
1334
void select_insert::send_error(drizzled::error_t errcode,const char *err)
1304
void select_insert::send_error(uint32_t errcode,const char *err)
1336
1308
my_message(errcode, err, MYF(0));
1340
1314
bool select_insert::send_eof()
1343
bool const trans_table= table->cursor->has_transactions();
1317
bool const trans_table= table->file->has_transactions();
1347
error= table->cursor->ha_end_bulk_insert();
1348
table->cursor->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
1349
table->cursor->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
1321
error= table->file->ha_end_bulk_insert();
1322
table->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
1323
table->file->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
1351
1325
if ((changed= (info.copied || info.deleted || info.updated)))
1354
1328
We must invalidate the table in the query cache before binlog writing
1355
and autocommitOrRollback.
1329
and ha_autocommit_or_rollback.
1357
if (session->transaction.stmt.hasModifiedNonTransData())
1358
session->transaction.all.markModifiedNonTransData();
1331
if (session->transaction.stmt.modified_non_trans_table)
1332
session->transaction.all.modified_non_trans_table= true;
1360
1334
assert(trans_table || !changed ||
1361
session->transaction.stmt.hasModifiedNonTransData());
1335
session->transaction.stmt.modified_non_trans_table);
1363
table->cursor->ha_release_auto_increment();
1337
table->file->ha_release_auto_increment();
1367
table->print_error(error,MYF(0));
1341
table->file->print_error(error,MYF(0));
1368
1342
DRIZZLE_INSERT_SELECT_DONE(error, 0);
1371
1345
char buff[160];
1372
1346
if (info.ignore)
1373
snprintf(buff, sizeof(buff), ER(ER_INSERT_INFO), (ulong) info.records,
1347
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
1374
1348
(ulong) (info.records - info.copied), (ulong) session->cuted_fields);
1376
snprintf(buff, sizeof(buff), ER(ER_INSERT_INFO), (ulong) info.records,
1350
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
1377
1351
(ulong) (info.deleted+info.updated), (ulong) session->cuted_fields);
1378
1352
session->row_count_func= info.copied + info.deleted + info.updated;
1382
1356
(session->arg_of_last_insert_id_function ?
1383
1357
session->first_successful_insert_id_in_prev_stmt :
1384
1358
(info.copied ? autoinc_value_of_last_inserted_row : 0));
1385
session->my_ok((ulong) session->rowCount(),
1359
session->my_ok((ulong) session->row_count_func,
1386
1360
info.copied + info.deleted + info.touched, id, buff);
1387
session->status_var.inserted_row_count+= session->rowCount();
1388
DRIZZLE_INSERT_SELECT_DONE(0, session->rowCount());
1361
DRIZZLE_INSERT_SELECT_DONE(0, session->row_count_func);
1483
1456
static Table *create_table_from_items(Session *session, HA_CREATE_INFO *create_info,
1484
1457
TableList *create_table,
1485
message::Table &table_proto,
1458
message::Table *table_proto,
1486
1459
AlterInfo *alter_info,
1487
1460
List<Item> *items,
1488
bool is_if_not_exists,
1490
identifier::Table::const_reference identifier)
1461
DRIZZLE_LOCK **lock)
1492
TableShare share(message::Table::INTERNAL);
1463
Table tmp_table; // Used during 'CreateField()'
1493
1466
uint32_t select_field_count= items->elements;
1494
1467
/* Add selected items to field list */
1495
1468
List_iterator_fast<Item> it(*items);
1497
1470
Field *tmp_field;
1499
if (not (identifier.isTmp()) && create_table->table->db_stat)
1473
if (!(create_info->options & HA_LEX_CREATE_TMP_TABLE) &&
1474
create_table->table->db_stat)
1501
1476
/* Table already exists and was open at openTablesLock() stage. */
1502
if (is_if_not_exists)
1477
if (create_info->options & HA_LEX_CREATE_IF_NOT_EXISTS)
1504
1479
create_info->table_existed= 1; // Mark that table existed
1505
1480
push_warning_printf(session, DRIZZLE_ERROR::WARN_LEVEL_NOTE,
1506
1481
ER_TABLE_EXISTS_ERROR, ER(ER_TABLE_EXISTS_ERROR),
1507
create_table->getTableName());
1482
create_table->table_name);
1508
1483
return create_table->table;
1511
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), create_table->getTableName());
1486
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), create_table->table_name);
1491
tmp_table.timestamp_field= 0;
1492
tmp_table.s= &share;
1494
tmp_table.s->db_create_options=0;
1495
tmp_table.s->blob_ptr_size= portable_sizeof_char_ptr;
1496
tmp_table.s->db_low_byte_first=
1497
test(create_info->db_type == myisam_engine ||
1498
create_info->db_type == heap_engine);
1499
tmp_table.null_row= false;
1500
tmp_table.maybe_null= false;
1516
table::Shell tmp_table(share); // Used during 'CreateField()'
1518
if (not table_proto.engine().name().compare("MyISAM"))
1519
tmp_table.getMutableShare()->db_low_byte_first= true;
1520
else if (not table_proto.engine().name().compare("MEMORY"))
1521
tmp_table.getMutableShare()->db_low_byte_first= true;
1523
tmp_table.in_use= session;
1527
CreateField *cr_field;
1528
Field *field, *def_field;
1529
if (item->type() == Item::FUNC_ITEM)
1531
if (item->result_type() != STRING_RESULT)
1533
field= item->tmp_table_field(&tmp_table);
1537
field= item->tmp_table_field_from_field_type(&tmp_table, 0);
1504
CreateField *cr_field;
1505
Field *field, *def_field;
1506
if (item->type() == Item::FUNC_ITEM)
1507
if (item->result_type() != STRING_RESULT)
1508
field= item->tmp_table_field(&tmp_table);
1542
field= create_tmp_field(session, &tmp_table, item, item->type(),
1543
(Item ***) 0, &tmp_field, &def_field, false,
1548
!(cr_field=new CreateField(field,(item->type() == Item::FIELD_ITEM ?
1549
((Item_field *)item)->field :
1555
if (item->maybe_null)
1557
cr_field->flags &= ~NOT_NULL_FLAG;
1560
alter_info->create_list.push_back(cr_field);
1510
field= item->tmp_table_field_from_field_type(&tmp_table, 0);
1512
field= create_tmp_field(session, &tmp_table, item, item->type(),
1513
(Item ***) 0, &tmp_field, &def_field, 0, 0, 0, 0,
1516
!(cr_field=new CreateField(field,(item->type() == Item::FIELD_ITEM ?
1517
((Item_field *)item)->field :
1520
if (item->maybe_null)
1521
cr_field->flags &= ~NOT_NULL_FLAG;
1522
alter_info->create_list.push_back(cr_field);
1568
1529
creating base table on which name we have exclusive lock. So code below
1569
1530
should not cause deadlocks or races.
1573
if (not create_table_no_lock(session,
1533
if (!mysql_create_table_no_lock(session, create_table->db,
1534
create_table->table_name,
1538
select_field_count))
1582
if (create_info->table_existed && not identifier.isTmp())
1540
if (create_info->table_existed &&
1541
!(create_info->options & HA_LEX_CREATE_TMP_TABLE))
1585
1544
This means that someone created table underneath server
1586
1545
or it was created via different mysqld front-end to the
1587
1546
cluster. We don't have much options but throw an error.
1589
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), create_table->getTableName());
1548
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), create_table->table_name);
1593
if (not identifier.isTmp())
1552
if (!(create_info->options & HA_LEX_CREATE_TMP_TABLE))
1595
/* CREATE TABLE... has found that the table already exists for insert and is adapting to use it */
1596
boost::mutex::scoped_lock scopedLock(table::Cache::singleton().mutex());
1598
if (create_table->table)
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))
1600
table::Concurrent *concurrent_table= static_cast<table::Concurrent *>(create_table->table);
1602
if (concurrent_table->reopen_name_locked_table(create_table, session))
1604
(void)plugin::StorageEngine::dropTable(*session, identifier);
1608
table= create_table->table;
1557
quick_rm_table(create_info->db_type, create_table->db,
1558
create_table->table_name, false);
1613
(void)plugin::StorageEngine::dropTable(*session, identifier);
1561
table= create_table->table;
1562
pthread_mutex_unlock(&LOCK_open);
1618
if (not (table= session->openTable(create_table, (bool*) 0,
1619
DRIZZLE_OPEN_TEMPORARY_ONLY)) &&
1620
not create_info->table_existed)
1566
if (!(table= session->openTable(create_table, (bool*) 0,
1567
DRIZZLE_OPEN_TEMPORARY_ONLY)) &&
1568
!create_info->table_existed)
1623
1571
This shouldn't happen as creation of temporary table should make
1624
1572
it preparable for open. But let us do close_temporary_table() here
1627
session->drop_temporary_table(identifier);
1575
session->drop_temporary_table(create_table);
1631
if (not table) // open failed
1579
if (!table) // open failed
1635
1583
table->reginfo.lock_type=TL_WRITE;
1636
if (not ((*lock)= session->lockTables(&table, 1, DRIZZLE_LOCK_IGNORE_FLUSH)))
1584
if (! ((*lock)= mysql_lock_tables(session, &table, 1,
1585
DRIZZLE_LOCK_IGNORE_FLUSH, ¬_used)))
1640
session->unlockTables(*lock);
1589
mysql_unlock_tables(session, *lock);
1644
if (not create_info->table_existed)
1645
session->drop_open_table(table, identifier);
1593
if (!create_info->table_existed)
1594
session->drop_open_table(table, create_table->db, create_table->table_name);
1654
1603
select_create::prepare(List<Item> &values, Select_Lex_Unit *u)
1656
DrizzleLock *extra_lock= NULL;
1605
DRIZZLE_LOCK *extra_lock= NULL;
1658
For replication, the CREATE-SELECT statement is written
1659
in two pieces: the first transaction messsage contains
1660
the CREATE TABLE statement as a CreateTableStatement message
1661
necessary to create the table.
1663
The second transaction message contains all the InsertStatement
1664
and associated InsertRecords that should go into the table.
1607
For row-based replication, the CREATE-SELECT statement is written
1608
in two pieces: the first one contain the CREATE TABLE statement
1609
necessary to create the table and the second part contain the rows
1610
that should go into the table.
1612
For non-temporary tables, the start of the CREATE-SELECT
1613
implicitly commits the previous transaction, and all events
1614
forming the statement will be stored the transaction cache. At end
1615
of the statement, the entire statement is committed as a
1616
transaction, and all events are written to the binary log.
1618
On the master, the table is locked for the duration of the
1619
statement, but since the CREATE part is replicated as a simple
1620
statement, there is no way to lock the table for accesses on the
1621
slave. Hence, we have to hold on to the CREATE part of the
1622
statement until the statement has finished.
1669
if (not (table= create_table_from_items(session, create_info, create_table,
1671
alter_info, &values,
1673
&extra_lock, identifier)))
1628
Start a statement transaction before the create if we are using
1629
row-based replication for the statement. If we are creating a
1630
temporary table, we need to start a statement transaction.
1633
if (!(table= create_table_from_items(session, create_info, create_table,
1635
alter_info, &values,
1675
1637
return(-1); // abort() deletes table
1678
1639
if (extra_lock)
1680
1641
assert(m_plock == NULL);
1682
if (identifier.isTmp())
1643
if (create_info->options & HA_LEX_CREATE_TMP_TABLE)
1683
1644
m_plock= &m_lock;
1685
1646
m_plock= &session->extra_lock;
1687
1648
*m_plock= extra_lock;
1690
if (table->getShare()->sizeFields() < values.elements)
1651
if (table->s->fields < values.elements)
1692
1653
my_error(ER_WRONG_VALUE_COUNT_ON_ROW, MYF(0), 1);
1696
1657
/* First field to copy */
1697
field= table->getFields() + table->getShare()->sizeFields() - values.elements;
1658
field= table->field+table->s->fields - values.elements;
1699
1660
/* Mark all fields that are given values */
1700
1661
for (Field **f= field ; *f ; f++)
1702
table->setWriteSet((*f)->position());
1662
table->setWriteSet((*f)->field_index);
1705
1664
/* Don't set timestamp if used */
1706
1665
table->timestamp_field_type= TIMESTAMP_NO_AUTO_SET;
1709
1668
table->restoreRecordAsDefault(); // Get empty record
1710
1669
session->cuted_fields=0;
1711
1670
if (info.ignore || info.handle_duplicates != DUP_ERROR)
1712
table->cursor->extra(HA_EXTRA_IGNORE_DUP_KEY);
1671
table->file->extra(HA_EXTRA_IGNORE_DUP_KEY);
1714
1672
if (info.handle_duplicates == DUP_REPLACE)
1715
table->cursor->extra(HA_EXTRA_WRITE_CAN_REPLACE);
1673
table->file->extra(HA_EXTRA_WRITE_CAN_REPLACE);
1717
1674
if (info.handle_duplicates == DUP_UPDATE)
1718
table->cursor->extra(HA_EXTRA_INSERT_WITH_UPDATE);
1720
table->cursor->ha_start_bulk_insert((ha_rows) 0);
1721
session->setAbortOnWarning(not info.ignore);
1675
table->file->extra(HA_EXTRA_INSERT_WITH_UPDATE);
1676
table->file->ha_start_bulk_insert((ha_rows) 0);
1677
session->abort_on_warning= !info.ignore;
1722
1678
if (check_that_all_fields_are_given_values(session, table, table_list))
1725
1680
table->mark_columns_needed_for_insert();
1726
table->cursor->extra(HA_EXTRA_WRITE_CACHE);
1681
table->file->extra(HA_EXTRA_WRITE_CACHE);
1730
1685
void select_create::store_values(List<Item> &values)
1732
fill_record(session, field, values, true);
1687
fill_record(session, field, values, 1);
1736
void select_create::send_error(drizzled::error_t errcode,const char *err)
1691
void select_create::send_error(uint32_t errcode,const char *err)
1739
1696
This will execute any rollbacks that are necessary before writing
1740
1697
the transcation cache.
1762
1721
tables. This can fail, but we should unlock the table
1765
if (!table->getShare()->getType())
1724
if (!table->s->tmp_table)
1767
TransactionServices &transaction_services= TransactionServices::singleton();
1768
transaction_services.autocommitOrRollback(*session, 0);
1726
ha_autocommit_or_rollback(session, 0);
1769
1727
(void) session->endActiveTransaction();
1772
table->cursor->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
1773
table->cursor->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
1730
table->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
1731
table->file->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
1776
session->unlockTables(*m_plock);
1734
mysql_unlock_tables(session, *m_plock);
1777
1735
*m_plock= NULL;
1802
1762
select_insert::abort();
1763
session->transaction.stmt.modified_non_trans_table= false;
1806
session->unlockTables(*m_plock);
1768
mysql_unlock_tables(session, *m_plock);
1807
1769
*m_plock= NULL;
1813
table->cursor->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
1814
table->cursor->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
1815
if (not create_info->table_existed)
1816
session->drop_open_table(table, identifier);
1775
table->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
1776
table->file->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
1777
if (!create_info->table_existed)
1778
session->drop_open_table(table, create_table->db, create_table->table_name);
1817
1779
table= NULL; // Safety
1821
} /* namespace drizzled */
1784
/*****************************************************************************
1785
Instansiate templates
1786
*****************************************************************************/
1788
#ifdef HAVE_EXPLICIT_TEMPLATE_INSTANTIATION
1789
template class List_iterator_fast<List_item>;
1790
#endif /* HAVE_EXPLICIT_TEMPLATE_INSTANTIATION */