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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
14
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
17
17
/* Insert of records */
19
#include <drizzled/server_includes.h>
20
21
#include <drizzled/sql_select.h>
21
22
#include <drizzled/show.h>
22
23
#include <drizzled/error.h>
24
25
#include <drizzled/probes.h>
25
26
#include <drizzled/sql_base.h>
26
27
#include <drizzled/sql_load.h>
27
#include <drizzled/field/timestamp.h>
28
#include <drizzled/field/epoch.h>
28
29
#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;
32
44
Check if insert fields are correct.
250
272
value_count= values->elements;
252
if (mysql_prepare_insert(session, table_list, table, fields, values,
274
if (prepare_insert(session, table_list, table, fields, values,
253
275
update_fields, update_values, duplic, &unused_conds,
255
277
(fields.elements || !value_count ||
256
278
(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);
259
289
/* mysql_prepare_insert set table_list->table if it was not set */
260
290
table= table_list->table;
285
315
if (values->elements != value_count)
287
317
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);
290
328
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);
309
354
For single line insert, generate an error if try to set a NOT NULL field
312
session->count_cuted_fields= ((values_list.elements == 1 &&
314
CHECK_FIELD_ERROR_FOR_NULL :
357
session->count_cuted_fields= ignore ? CHECK_FIELD_WARN : CHECK_FIELD_ERROR_FOR_NULL;
316
359
session->cuted_fields = 0L;
317
360
table->next_number_field=table->found_next_number_field;
320
363
session->set_proc_info("update");
321
364
if (duplic == DUP_REPLACE)
322
table->file->extra(HA_EXTRA_WRITE_CAN_REPLACE);
365
table->cursor->extra(HA_EXTRA_WRITE_CAN_REPLACE);
323
366
if (duplic == DUP_UPDATE)
324
table->file->extra(HA_EXTRA_INSERT_WITH_UPDATE);
367
table->cursor->extra(HA_EXTRA_INSERT_WITH_UPDATE);
326
369
if (duplic != DUP_ERROR || ignore)
327
table->file->extra(HA_EXTRA_IGNORE_DUP_KEY);
328
table->file->ha_start_bulk_insert(values_list.elements);
370
table->cursor->extra(HA_EXTRA_IGNORE_DUP_KEY);
371
table->cursor->ha_start_bulk_insert(values_list.elements);
332
session->abort_on_warning= !ignore;
375
session->setAbortOnWarning(not ignore);
334
377
table->mark_columns_needed_for_insert();
359
if (session->used_tables) // Column used in values()
360
table->restoreRecordAsDefault(); // Get empty record
364
Fix delete marker. No need to restore rest of record since it will
365
be overwritten by fill_record() anyway (and fill_record() does not
366
use default values in this case).
368
table->record[0][0]= table->s->default_values[0];
370
if (fill_record(session, table->field, *values, 0))
402
table->restoreRecordAsDefault(); // Get empty record
404
if (fill_record(session, table->getFields(), *values))
372
406
if (values_list.elements != 1 && ! session->is_error())
400
434
Do not do this release if this is a delayed insert, it would steal
401
435
auto_inc values from the delayed_insert thread as they share Table.
403
table->file->ha_release_auto_increment();
404
if (table->file->ha_end_bulk_insert() && !error)
437
table->cursor->ha_release_auto_increment();
438
if (table->cursor->ha_end_bulk_insert() && !error)
406
table->file->print_error(my_errno,MYF(0));
440
table->print_error(errno,MYF(0));
409
443
if (duplic != DUP_ERROR || ignore)
410
table->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
444
table->cursor->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
412
transactional_table= table->file->has_transactions();
446
transactional_table= table->cursor->has_transactions();
414
448
changed= (info.copied || info.deleted || info.updated);
415
if ((changed && error <= 0) || session->transaction.stmt.modified_non_trans_table)
449
if ((changed && error <= 0) || session->transaction.stmt.hasModifiedNonTransData())
417
if (session->transaction.stmt.modified_non_trans_table)
418
session->transaction.all.modified_non_trans_table= true;
451
if (session->transaction.stmt.hasModifiedNonTransData())
452
session->transaction.all.markModifiedNonTransData();
420
assert(transactional_table || !changed || session->transaction.stmt.modified_non_trans_table);
454
assert(transactional_table || !changed || session->transaction.stmt.hasModifiedNonTransData());
423
457
session->set_proc_info("end");
441
475
session->count_cuted_fields= CHECK_FIELD_IGNORE;
442
476
table->auto_increment_field_not_null= false;
443
477
if (duplic == DUP_REPLACE)
444
table->file->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
478
table->cursor->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);
448
491
if (values_list.elements == 1 && (!(session->options & OPTION_WARNINGS) ||
449
492
!session->cuted_fields))
451
494
session->row_count_func= info.copied + info.deleted + info.updated;
452
session->my_ok((ulong) session->row_count_func,
495
session->my_ok((ulong) session->rowCount(),
453
496
info.copied + info.deleted + info.touched, id);
459
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
502
snprintf(buff, sizeof(buff), ER(ER_INSERT_INFO), (ulong) info.records,
460
503
(ulong) (info.records - info.copied), (ulong) session->cuted_fields);
462
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
505
snprintf(buff, sizeof(buff), ER(ER_INSERT_INFO), (ulong) info.records,
463
506
(ulong) (info.deleted + info.updated), (ulong) session->cuted_fields);
464
507
session->row_count_func= info.copied + info.deleted + info.updated;
465
session->my_ok((ulong) session->row_count_func,
508
session->my_ok((ulong) session->rowCount(),
466
509
info.copied + info.deleted + info.touched, id, buff);
468
session->abort_on_warning= 0;
469
DRIZZLE_INSERT_END();
511
session->status_var.inserted_row_count+= session->rowCount();
512
session->setAbortOnWarning(false);
513
DRIZZLE_INSERT_DONE(0, session->rowCount());
474
table->file->ha_release_auto_increment();
476
free_underlaid_joins(session, &session->lex->select_lex);
477
session->abort_on_warning= 0;
478
DRIZZLE_INSERT_END();
639
676
/* Restore the current context. */
640
677
ctx_state.restore_state(context, table_list);
643
680
res= setup_fields(session, 0, update_values, MARK_COLUMNS_READ, 0, 0);
650
687
table= table_list->table;
689
if (not select_insert)
654
691
TableList *duplicate;
655
if ((duplicate= unique_table(session, table_list, table_list->next_global, 1)))
692
if ((duplicate= unique_table(table_list, table_list->next_global, true)))
657
694
my_error(ER_UPDATE_TABLE_USED, MYF(0), table_list->alias);
662
700
if (duplic == DUP_UPDATE || duplic == DUP_REPLACE)
663
701
table->prepare_for_position();
729
767
the autogenerated value to avoid session->insert_id_for_cur_row to become
732
if (table->file->insert_id_for_cur_row > 0)
733
insert_id_for_cur_row= table->file->insert_id_for_cur_row;
770
if (table->cursor->insert_id_for_cur_row > 0)
771
insert_id_for_cur_row= table->cursor->insert_id_for_cur_row;
735
table->file->insert_id_for_cur_row= insert_id_for_cur_row;
773
table->cursor->insert_id_for_cur_row= insert_id_for_cur_row;
736
774
bool is_duplicate_key_error;
737
if (table->file->is_fatal_error(error, HA_CHECK_DUP))
775
if (table->cursor->is_fatal_error(error, HA_CHECK_DUP))
739
is_duplicate_key_error= table->file->is_fatal_error(error, 0);
777
is_duplicate_key_error= table->cursor->is_fatal_error(error, 0);
740
778
if (!is_duplicate_key_error)
763
801
if (info->handle_duplicates == DUP_REPLACE &&
764
802
table->next_number_field &&
765
key_nr == table->s->next_number_index &&
803
key_nr == table->getShare()->next_number_index &&
766
804
(insert_id_for_cur_row > 0))
768
if (table->file->ha_table_flags() & HA_DUPLICATE_POS)
806
if (table->cursor->getEngine()->check_flag(HTON_BIT_DUPLICATE_POS))
770
if (table->file->rnd_pos(table->record[1],table->file->dup_ref))
808
if (table->cursor->rnd_pos(table->getUpdateRecord(),table->cursor->dup_ref))
775
if (table->file->extra(HA_EXTRA_FLUSH_CACHE)) /* Not needed with NISAM */
813
if (table->cursor->extra(HA_EXTRA_FLUSH_CACHE)) /* Not needed with NISAM */
783
if (!(key=(char*) malloc(table->s->max_unique_length)))
821
key.resize(table->getShare()->max_unique_length);
789
key_copy((unsigned char*) key,table->record[0],table->key_info+key_nr,0);
790
if ((error=(table->file->index_read_idx_map(table->record[1],key_nr,
791
(unsigned char*) key, HA_WHOLE_KEY,
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
826
HA_READ_KEY_EXACT))))
812
table->file->restore_auto_increment(prev_insert_id);
846
table->cursor->restore_auto_increment(prev_insert_id);
813
847
if (table->next_number_field)
814
table->file->adjust_next_insert_id_after_explicit_value(
848
table->cursor->adjust_next_insert_id_after_explicit_value(
815
849
table->next_number_field->val_int());
817
if ((table->file->ha_table_flags() & HA_PARTIAL_COLUMN_READ &&
818
!bitmap_is_subset(table->write_set, table->read_set)) ||
819
table->compare_record())
852
if (! table->records_are_comparable() || table->compare_records())
821
if ((error=table->file->ha_update_row(table->record[1],
822
table->record[0])) &&
854
if ((error=table->cursor->updateRecord(table->getUpdateRecord(),
855
table->getInsertRecord())) &&
823
856
error != HA_ERR_RECORD_IS_THE_SAME)
825
858
if (info->ignore &&
826
!table->file->is_fatal_error(error, HA_CHECK_DUP_KEY))
859
!table->cursor->is_fatal_error(error, HA_CHECK_DUP_KEY))
828
861
goto gok_or_after_err;
838
871
If ON DUP KEY UPDATE updates a row instead of inserting one, it's
839
872
like a regular UPDATE statement: it should not affect the value of a
840
next SELECT LAST_INSERT_ID() or mysql_insert_id().
873
next SELECT LAST_INSERT_ID() or insert_id().
841
874
Except if LAST_INSERT_ID(#) was in the INSERT query, which is
842
875
handled separately by Session::arg_of_last_insert_id_function.
844
insert_id_for_cur_row= table->file->insert_id_for_cur_row= 0;
877
insert_id_for_cur_row= table->cursor->insert_id_for_cur_row= 0;
848
881
if (table->next_number_field)
849
table->file->adjust_next_insert_id_after_explicit_value(
882
table->cursor->adjust_next_insert_id_after_explicit_value(
850
883
table->next_number_field->val_int());
869
902
ON UPDATE triggers.
871
904
if (last_uniq_key(table,key_nr) &&
872
!table->file->referenced_by_foreign_key() &&
905
!table->cursor->referenced_by_foreign_key() &&
873
906
(table->timestamp_field_type == TIMESTAMP_NO_AUTO_SET ||
874
907
table->timestamp_field_type == TIMESTAMP_AUTO_SET_ON_BOTH))
876
if ((error=table->file->ha_update_row(table->record[1],
877
table->record[0])) &&
909
if ((error=table->cursor->updateRecord(table->getUpdateRecord(),
910
table->getInsertRecord())) &&
878
911
error != HA_ERR_RECORD_IS_THE_SAME)
880
913
if (error != HA_ERR_RECORD_IS_THE_SAME)
884
session->record_first_successful_insert_id_in_cur_stmt(table->file->insert_id_for_cur_row);
917
session->record_first_successful_insert_id_in_cur_stmt(table->cursor->insert_id_for_cur_row);
886
919
Since we pretend that we have done insert we should call
887
920
its after triggers.
893
if ((error=table->file->ha_delete_row(table->record[1])))
926
if ((error=table->cursor->deleteRecord(table->getUpdateRecord())))
896
if (!table->file->has_transactions())
897
session->transaction.stmt.modified_non_trans_table= true;
929
if (!table->cursor->has_transactions())
930
session->transaction.stmt.markModifiedNonTransData();
898
931
/* Let us attempt do write_row() once more */
902
session->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->cursor->insert_id_for_cur_row);
904
937
Restore column maps if they where replaced during an duplicate key
907
940
if (table->read_set != save_read_set ||
908
941
table->write_set != save_write_set)
909
table->column_bitmaps_set(save_read_set, save_write_set);
942
table->column_bitmaps_set(*save_read_set, *save_write_set);
911
else if ((error=table->file->ha_write_row(table->record[0])))
944
else if ((error=table->cursor->insertRecord(table->getInsertRecord())))
913
946
if (!info->ignore ||
914
table->file->is_fatal_error(error, HA_CHECK_DUP))
947
table->cursor->is_fatal_error(error, HA_CHECK_DUP))
916
table->file->restore_auto_increment(prev_insert_id);
949
table->cursor->restore_auto_increment(prev_insert_id);
917
950
goto gok_or_after_err;
920
953
after_n_copied_inc:
922
session->record_first_successful_insert_id_in_cur_stmt(table->file->insert_id_for_cur_row);
955
session->record_first_successful_insert_id_in_cur_stmt(table->cursor->insert_id_for_cur_row);
924
957
gok_or_after_err:
927
if (!table->file->has_transactions())
928
session->transaction.stmt.modified_non_trans_table= true;
958
if (!table->cursor->has_transactions())
959
session->transaction.stmt.markModifiedNonTransData();
1041
1070
List<Item> *update_fields,
1042
1071
List<Item> *update_values,
1043
1072
enum_duplicates duplic,
1044
bool ignore_check_option_errors)
1045
:table_list(table_list_par), table(table_par), fields(fields_par),
1046
autoinc_value_of_last_inserted_row(0),
1047
insert_into_view(table_list_par && 0 != 0)
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)
1049
memset(&info, 0, sizeof(info));
1050
1078
info.handle_duplicates= duplic;
1051
1079
info.ignore= ignore_check_option_errors;
1052
1080
info.update_fields= update_fields;
1168
1196
We won't start bulk inserts at all if this statement uses functions or
1169
1197
should invoke triggers since they may access to the same table too.
1171
table->file->ha_start_bulk_insert((ha_rows) 0);
1199
table->cursor->ha_start_bulk_insert((ha_rows) 0);
1173
1201
table->restoreRecordAsDefault(); // Get empty record
1174
1202
table->next_number_field=table->found_next_number_field;
1176
1204
session->cuted_fields=0;
1177
1206
if (info.ignore || info.handle_duplicates != DUP_ERROR)
1178
table->file->extra(HA_EXTRA_IGNORE_DUP_KEY);
1207
table->cursor->extra(HA_EXTRA_IGNORE_DUP_KEY);
1179
1209
if (info.handle_duplicates == DUP_REPLACE)
1180
table->file->extra(HA_EXTRA_WRITE_CAN_REPLACE);
1210
table->cursor->extra(HA_EXTRA_WRITE_CAN_REPLACE);
1181
1212
if (info.handle_duplicates == DUP_UPDATE)
1182
table->file->extra(HA_EXTRA_INSERT_WITH_UPDATE);
1183
session->abort_on_warning= !info.ignore;
1213
table->cursor->extra(HA_EXTRA_INSERT_WITH_UPDATE);
1215
session->setAbortOnWarning(not info.ignore);
1184
1216
table->mark_columns_needed_for_insert();
1293
1326
void select_insert::store_values(List<Item> &values)
1295
1328
if (fields->elements)
1296
fill_record(session, *fields, values, 1);
1329
fill_record(session, *fields, values, true);
1298
fill_record(session, table->field, values, 1);
1331
fill_record(session, table->getFields(), values, true);
1301
void select_insert::send_error(uint32_t errcode,const char *err)
1334
void select_insert::send_error(drizzled::error_t errcode,const char *err)
1305
1336
my_message(errcode, err, MYF(0));
1311
1340
bool select_insert::send_eof()
1314
bool const trans_table= table->file->has_transactions();
1343
bool const trans_table= table->cursor->has_transactions();
1318
error= table->file->ha_end_bulk_insert();
1319
table->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
1320
table->file->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
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);
1322
1351
if ((changed= (info.copied || info.deleted || info.updated)))
1325
1354
We must invalidate the table in the query cache before binlog writing
1326
and ha_autocommit_or_rollback.
1355
and autocommitOrRollback.
1328
if (session->transaction.stmt.modified_non_trans_table)
1329
session->transaction.all.modified_non_trans_table= true;
1357
if (session->transaction.stmt.hasModifiedNonTransData())
1358
session->transaction.all.markModifiedNonTransData();
1331
1360
assert(trans_table || !changed ||
1332
session->transaction.stmt.modified_non_trans_table);
1361
session->transaction.stmt.hasModifiedNonTransData());
1334
table->file->ha_release_auto_increment();
1363
table->cursor->ha_release_auto_increment();
1338
table->file->print_error(error,MYF(0));
1367
table->print_error(error,MYF(0));
1368
DRIZZLE_INSERT_SELECT_DONE(error, 0);
1341
1371
char buff[160];
1342
1372
if (info.ignore)
1343
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
1373
snprintf(buff, sizeof(buff), ER(ER_INSERT_INFO), (ulong) info.records,
1344
1374
(ulong) (info.records - info.copied), (ulong) session->cuted_fields);
1346
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
1376
snprintf(buff, sizeof(buff), ER(ER_INSERT_INFO), (ulong) info.records,
1347
1377
(ulong) (info.deleted+info.updated), (ulong) session->cuted_fields);
1348
1378
session->row_count_func= info.copied + info.deleted + info.updated;
1387
1419
zero, so no check for that is made.
1389
1421
changed= (info.copied || info.deleted || info.updated);
1390
transactional_table= table->file->has_transactions();
1422
transactional_table= table->cursor->has_transactions();
1391
1423
assert(transactional_table || !changed ||
1392
session->transaction.stmt.modified_non_trans_table);
1393
table->file->ha_release_auto_increment();
1424
session->transaction.stmt.hasModifiedNonTransData());
1425
table->cursor->ha_release_auto_increment();
1428
if (DRIZZLE_INSERT_SELECT_DONE_ENABLED())
1430
DRIZZLE_INSERT_SELECT_DONE(0, info.copied + info.deleted + info.updated);
1446
1483
static Table *create_table_from_items(Session *session, HA_CREATE_INFO *create_info,
1447
1484
TableList *create_table,
1448
drizzled::message::Table *table_proto,
1449
Alter_info *alter_info,
1485
message::Table &table_proto,
1486
AlterInfo *alter_info,
1450
1487
List<Item> *items,
1451
DRIZZLE_LOCK **lock)
1488
bool is_if_not_exists,
1490
identifier::Table::const_reference identifier)
1453
Table tmp_table; // Used during 'CreateField()'
1492
TableShare share(message::Table::INTERNAL);
1456
1493
uint32_t select_field_count= items->elements;
1457
1494
/* Add selected items to field list */
1458
1495
List_iterator_fast<Item> it(*items);
1460
1497
Field *tmp_field;
1463
if (!(create_info->options & HA_LEX_CREATE_TMP_TABLE) &&
1464
create_table->table->db_stat)
1499
if (not (identifier.isTmp()) && create_table->table->db_stat)
1466
1501
/* Table already exists and was open at openTablesLock() stage. */
1467
if (create_info->options & HA_LEX_CREATE_IF_NOT_EXISTS)
1502
if (is_if_not_exists)
1469
1504
create_info->table_existed= 1; // Mark that table existed
1470
1505
push_warning_printf(session, DRIZZLE_ERROR::WARN_LEVEL_NOTE,
1471
1506
ER_TABLE_EXISTS_ERROR, ER(ER_TABLE_EXISTS_ERROR),
1472
create_table->table_name);
1507
create_table->getTableName());
1473
1508
return create_table->table;
1476
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), create_table->table_name);
1511
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), create_table->getTableName());
1481
tmp_table.timestamp_field= 0;
1482
tmp_table.s= &share;
1484
tmp_table.s->db_create_options=0;
1485
tmp_table.s->blob_ptr_size= portable_sizeof_char_ptr;
1486
tmp_table.s->db_low_byte_first=
1487
test(create_info->db_type == myisam_engine ||
1488
create_info->db_type == heap_engine);
1489
tmp_table.null_row= false;
1490
tmp_table.maybe_null= false;
1494
CreateField *cr_field;
1495
Field *field, *def_field;
1496
if (item->type() == Item::FUNC_ITEM)
1497
if (item->result_type() != STRING_RESULT)
1498
field= item->tmp_table_field(&tmp_table);
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);
1500
field= item->tmp_table_field_from_field_type(&tmp_table, 0);
1502
field= create_tmp_field(session, &tmp_table, item, item->type(),
1503
(Item ***) 0, &tmp_field, &def_field, 0, 0, 0, 0,
1506
!(cr_field=new CreateField(field,(item->type() == Item::FIELD_ITEM ?
1507
((Item_field *)item)->field :
1510
if (item->maybe_null)
1511
cr_field->flags &= ~NOT_NULL_FLAG;
1512
alter_info->create_list.push_back(cr_field);
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);
1519
1568
creating base table on which name we have exclusive lock. So code below
1520
1569
should not cause deadlocks or races.
1523
if (!mysql_create_table_no_lock(session, create_table->db,
1524
create_table->table_name,
1528
select_field_count))
1573
if (not create_table_no_lock(session,
1530
if (create_info->table_existed &&
1531
!(create_info->options & HA_LEX_CREATE_TMP_TABLE))
1582
if (create_info->table_existed && not identifier.isTmp())
1534
1585
This means that someone created table underneath server
1535
1586
or it was created via different mysqld front-end to the
1536
1587
cluster. We don't have much options but throw an error.
1538
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), create_table->table_name);
1589
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), create_table->getTableName());
1542
if (!(create_info->options & HA_LEX_CREATE_TMP_TABLE))
1593
if (not identifier.isTmp())
1544
pthread_mutex_lock(&LOCK_open); /* CREATE TABLE... has found that the table already exists for insert and is adapting to use it */
1545
if (session->reopen_name_locked_table(create_table, false))
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)
1547
quick_rm_table(create_info->db_type, create_table->db,
1548
create_table->table_name, 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;
1551
table= create_table->table;
1552
pthread_mutex_unlock(&LOCK_open);
1613
(void)plugin::StorageEngine::dropTable(*session, identifier);
1556
if (!(table= session->openTable(create_table, (bool*) 0,
1557
DRIZZLE_OPEN_TEMPORARY_ONLY)) &&
1558
!create_info->table_existed)
1618
if (not (table= session->openTable(create_table, (bool*) 0,
1619
DRIZZLE_OPEN_TEMPORARY_ONLY)) &&
1620
not create_info->table_existed)
1561
1623
This shouldn't happen as creation of temporary table should make
1562
1624
it preparable for open. But let us do close_temporary_table() here
1565
session->drop_temporary_table(create_table);
1627
session->drop_temporary_table(identifier);
1569
if (!table) // open failed
1631
if (not table) // open failed
1573
1635
table->reginfo.lock_type=TL_WRITE;
1574
if (! ((*lock)= mysql_lock_tables(session, &table, 1,
1575
DRIZZLE_LOCK_IGNORE_FLUSH, ¬_used)))
1636
if (not ((*lock)= session->lockTables(&table, 1, DRIZZLE_LOCK_IGNORE_FLUSH)))
1579
mysql_unlock_tables(session, *lock);
1640
session->unlockTables(*lock);
1583
if (!create_info->table_existed)
1584
session->drop_open_table(table, create_table->db, create_table->table_name);
1644
if (not create_info->table_existed)
1645
session->drop_open_table(table, identifier);
1593
1654
select_create::prepare(List<Item> &values, Select_Lex_Unit *u)
1595
DRIZZLE_LOCK *extra_lock= NULL;
1656
DrizzleLock *extra_lock= NULL;
1597
For row-based replication, the CREATE-SELECT statement is written
1598
in two pieces: the first one contain the CREATE TABLE statement
1599
necessary to create the table and the second part contain the rows
1600
that should go into the table.
1602
For non-temporary tables, the start of the CREATE-SELECT
1603
implicitly commits the previous transaction, and all events
1604
forming the statement will be stored the transaction cache. At end
1605
of the statement, the entire statement is committed as a
1606
transaction, and all events are written to the binary log.
1608
On the master, the table is locked for the duration of the
1609
statement, but since the CREATE part is replicated as a simple
1610
statement, there is no way to lock the table for accesses on the
1611
slave. Hence, we have to hold on to the CREATE part of the
1612
statement until the statement has finished.
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.
1618
Start a statement transaction before the create if we are using
1619
row-based replication for the statement. If we are creating a
1620
temporary table, we need to start a statement transaction.
1623
if (!(table= create_table_from_items(session, create_info, create_table,
1625
alter_info, &values,
1669
if (not (table= create_table_from_items(session, create_info, create_table,
1671
alter_info, &values,
1673
&extra_lock, identifier)))
1627
1675
return(-1); // abort() deletes table
1629
1678
if (extra_lock)
1631
1680
assert(m_plock == NULL);
1633
if (create_info->options & HA_LEX_CREATE_TMP_TABLE)
1682
if (identifier.isTmp())
1634
1683
m_plock= &m_lock;
1636
1685
m_plock= &session->extra_lock;
1638
1687
*m_plock= extra_lock;
1641
if (table->s->fields < values.elements)
1690
if (table->getShare()->sizeFields() < values.elements)
1643
1692
my_error(ER_WRONG_VALUE_COUNT_ON_ROW, MYF(0), 1);
1647
1696
/* First field to copy */
1648
field= table->field+table->s->fields - values.elements;
1697
field= table->getFields() + table->getShare()->sizeFields() - values.elements;
1650
1699
/* Mark all fields that are given values */
1651
1700
for (Field **f= field ; *f ; f++)
1652
table->setWriteSet((*f)->field_index);
1702
table->setWriteSet((*f)->position());
1654
1705
/* Don't set timestamp if used */
1655
1706
table->timestamp_field_type= TIMESTAMP_NO_AUTO_SET;
1658
1709
table->restoreRecordAsDefault(); // Get empty record
1659
1710
session->cuted_fields=0;
1660
1711
if (info.ignore || info.handle_duplicates != DUP_ERROR)
1661
table->file->extra(HA_EXTRA_IGNORE_DUP_KEY);
1712
table->cursor->extra(HA_EXTRA_IGNORE_DUP_KEY);
1662
1714
if (info.handle_duplicates == DUP_REPLACE)
1663
table->file->extra(HA_EXTRA_WRITE_CAN_REPLACE);
1715
table->cursor->extra(HA_EXTRA_WRITE_CAN_REPLACE);
1664
1717
if (info.handle_duplicates == DUP_UPDATE)
1665
table->file->extra(HA_EXTRA_INSERT_WITH_UPDATE);
1666
table->file->ha_start_bulk_insert((ha_rows) 0);
1667
session->abort_on_warning= !info.ignore;
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);
1668
1722
if (check_that_all_fields_are_given_values(session, table, table_list))
1670
1725
table->mark_columns_needed_for_insert();
1671
table->file->extra(HA_EXTRA_WRITE_CACHE);
1726
table->cursor->extra(HA_EXTRA_WRITE_CACHE);
1675
1730
void select_create::store_values(List<Item> &values)
1677
fill_record(session, field, values, 1);
1732
fill_record(session, field, values, true);
1681
void select_create::send_error(uint32_t errcode,const char *err)
1736
void select_create::send_error(drizzled::error_t errcode,const char *err)
1686
1739
This will execute any rollbacks that are necessary before writing
1687
1740
the transcation cache.
1711
1762
tables. This can fail, but we should unlock the table
1714
if (!table->s->tmp_table)
1765
if (!table->getShare()->getType())
1716
ha_autocommit_or_rollback(session, 0);
1767
TransactionServices &transaction_services= TransactionServices::singleton();
1768
transaction_services.autocommitOrRollback(*session, 0);
1717
1769
(void) session->endActiveTransaction();
1720
table->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
1721
table->file->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
1772
table->cursor->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
1773
table->cursor->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
1724
mysql_unlock_tables(session, *m_plock);
1776
session->unlockTables(*m_plock);
1725
1777
*m_plock= NULL;
1752
1802
select_insert::abort();
1753
session->transaction.stmt.modified_non_trans_table= false;
1758
mysql_unlock_tables(session, *m_plock);
1806
session->unlockTables(*m_plock);
1759
1807
*m_plock= NULL;
1765
table->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
1766
table->file->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
1767
if (!create_info->table_existed)
1768
session->drop_open_table(table, create_table->db, create_table->table_name);
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);
1769
1817
table= NULL; // Safety
1774
/*****************************************************************************
1775
Instansiate templates
1776
*****************************************************************************/
1778
#ifdef HAVE_EXPLICIT_TEMPLATE_INSTANTIATION
1779
template class List_iterator_fast<List_item>;
1780
#endif /* HAVE_EXPLICIT_TEMPLATE_INSTANTIATION */
1821
} /* namespace drizzled */