25
25
#include <drizzled/probes.h>
26
26
#include <drizzled/sql_base.h>
27
27
#include <drizzled/sql_load.h>
28
#include <drizzled/field/epoch.h>
28
#include <drizzled/field/timestamp.h>
29
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>
34
#include <drizzled/select_insert.h>
35
#include <drizzled/select_create.h>
37
#include <drizzled/table/shell.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"
274
270
value_count= values->elements;
276
if (prepare_insert(session, table_list, table, fields, values,
272
if (mysql_prepare_insert(session, table_list, table, fields, values,
277
273
update_fields, update_values, duplic, &unused_conds,
279
275
(fields.elements || !value_count ||
280
276
(0) != 0), !ignore))
283
table->cursor->ha_release_auto_increment();
285
free_underlaid_joins(session, &session->getLex()->select_lex);
286
session->setAbortOnWarning(false);
287
DRIZZLE_INSERT_DONE(1, 0);
291
279
/* mysql_prepare_insert set table_list->table if it was not set */
292
280
table= table_list->table;
294
context= &session->getLex()->select_lex.context;
282
context= &session->lex->select_lex.context;
296
284
These three asserts test the hypothesis that the resetting of the name
297
285
resolution context below is not necessary at all since the list of local
317
305
if (values->elements != value_count)
319
307
my_error(ER_WRONG_VALUE_COUNT_ON_ROW, MYF(0), counter);
322
table->cursor->ha_release_auto_increment();
324
free_underlaid_joins(session, &session->getLex()->select_lex);
325
session->setAbortOnWarning(false);
326
DRIZZLE_INSERT_DONE(1, 0);
330
310
if (setup_fields(session, 0, *values, MARK_COLUMNS_READ, 0, 0))
333
table->cursor->ha_release_auto_increment();
335
free_underlaid_joins(session, &session->getLex()->select_lex);
336
session->setAbortOnWarning(false);
337
DRIZZLE_INSERT_DONE(1, 0);
341
its= values_list.begin();
343
315
/* Restore the current context. */
344
316
ctx_state.restore_state(context, table_list);
480
452
table->cursor->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
485
table->cursor->ha_release_auto_increment();
487
free_underlaid_joins(session, &session->getLex()->select_lex);
488
session->setAbortOnWarning(false);
489
DRIZZLE_INSERT_DONE(1, 0);
493
456
if (values_list.elements == 1 && (!(session->options & OPTION_WARNINGS) ||
494
457
!session->cuted_fields))
496
459
session->row_count_func= info.copied + info.deleted + info.updated;
497
session->my_ok((ulong) session->rowCount(),
460
session->my_ok((ulong) session->row_count_func,
498
461
info.copied + info.deleted + info.touched, id);
507
470
snprintf(buff, sizeof(buff), ER(ER_INSERT_INFO), (ulong) info.records,
508
471
(ulong) (info.deleted + info.updated), (ulong) session->cuted_fields);
509
472
session->row_count_func= info.copied + info.deleted + info.updated;
510
session->my_ok((ulong) session->rowCount(),
473
session->my_ok((ulong) session->row_count_func,
511
474
info.copied + info.deleted + info.touched, id, buff);
513
session->status_var.inserted_row_count+= session->rowCount();
514
session->setAbortOnWarning(false);
515
DRIZZLE_INSERT_DONE(0, session->rowCount());
476
session->status_var.inserted_row_count+= session->row_count_func;
477
session->abort_on_warning= 0;
478
DRIZZLE_INSERT_DONE(0, session->row_count_func);
483
table->cursor->ha_release_auto_increment();
485
free_underlaid_joins(session, &session->lex->select_lex);
486
session->abort_on_warning= 0;
487
DRIZZLE_INSERT_DONE(1, 0);
550
if (setup_tables_and_check_access(session, &session->getLex()->select_lex.context,
551
&session->getLex()->select_lex.top_join_list,
521
if (setup_tables_and_check_access(session, &session->lex->select_lex.context,
522
&session->lex->select_lex.top_join_list,
553
&session->getLex()->select_lex.leaf_tables,
524
&session->lex->select_lex.leaf_tables,
661
632
if (!res && check_fields)
663
bool saved_abort_on_warning= session->abortOnWarning();
665
session->setAbortOnWarning(abort_on_warning);
634
bool saved_abort_on_warning= session->abort_on_warning;
635
session->abort_on_warning= abort_on_warning;
666
636
res= check_that_all_fields_are_given_values(session,
668
638
context->table_list->table,
669
639
context->table_list);
670
session->setAbortOnWarning(saved_abort_on_warning);
640
session->abort_on_warning= saved_abort_on_warning;
673
643
if (!res && duplic == DUP_UPDATE)
1099
1070
select, LEX::current_select should point to the first select while
1100
1071
we are fixing fields from insert list.
1102
session->getLex()->current_select= &session->getLex()->select_lex;
1073
lex->current_select= &lex->select_lex;
1103
1074
res= check_insert_fields(session, table_list, *fields, values,
1104
1075
!insert_into_view, &map) ||
1105
1076
setup_fields(session, 0, values, MARK_COLUMNS_READ, 0, 0);
1107
1078
if (!res && fields->elements)
1109
bool saved_abort_on_warning= session->abortOnWarning();
1110
session->setAbortOnWarning(not info.ignore);
1080
bool saved_abort_on_warning= session->abort_on_warning;
1081
session->abort_on_warning= !info.ignore;
1111
1082
res= check_that_all_fields_are_given_values(session, table_list->table,
1113
session->setAbortOnWarning(saved_abort_on_warning);
1084
session->abort_on_warning= saved_abort_on_warning;
1116
1087
if (info.handle_duplicates == DUP_UPDATE && !res)
1118
Name_resolution_context *context= &session->getLex()->select_lex.context;
1089
Name_resolution_context *context= &lex->select_lex.context;
1119
1090
Name_resolution_context_state ctx_state;
1121
1092
/* Save the state of the current name resolution context. */
1133
1104
We use next_name_resolution_table descructively, so check it first (views?)
1135
1106
assert (!table_list->next_name_resolution_table);
1136
if (session->getLex()->select_lex.group_list.elements == 0 and
1137
not session->getLex()->select_lex.with_sum_func)
1107
if (lex->select_lex.group_list.elements == 0 &&
1108
!lex->select_lex.with_sum_func)
1139
1110
We must make a single context out of the two separate name resolution contexts :
1140
1111
the INSERT table and the tables in the SELECT part of INSERT ... SELECT.
1183
1154
if (unique_table(table_list, table_list->next_global))
1185
1156
/* Using same table for INSERT and SELECT */
1186
session->getLex()->current_select->options|= OPTION_BUFFER_RESULT;
1187
session->getLex()->current_select->join->select_options|= OPTION_BUFFER_RESULT;
1157
lex->current_select->options|= OPTION_BUFFER_RESULT;
1158
lex->current_select->join->select_options|= OPTION_BUFFER_RESULT;
1189
else if (not (session->getLex()->current_select->options & OPTION_BUFFER_RESULT))
1160
else if (!(lex->current_select->options & OPTION_BUFFER_RESULT))
1192
1163
We must not yet prepare the result table if it is the same as one of the
1203
1174
table->next_number_field=table->found_next_number_field;
1205
1176
session->cuted_fields=0;
1207
1177
if (info.ignore || info.handle_duplicates != DUP_ERROR)
1208
1178
table->cursor->extra(HA_EXTRA_IGNORE_DUP_KEY);
1210
1179
if (info.handle_duplicates == DUP_REPLACE)
1211
1180
table->cursor->extra(HA_EXTRA_WRITE_CAN_REPLACE);
1213
1181
if (info.handle_duplicates == DUP_UPDATE)
1214
1182
table->cursor->extra(HA_EXTRA_INSERT_WITH_UPDATE);
1216
session->setAbortOnWarning(not info.ignore);
1183
session->abort_on_warning= !info.ignore;
1217
1184
table->mark_columns_needed_for_insert();
1383
1354
(session->arg_of_last_insert_id_function ?
1384
1355
session->first_successful_insert_id_in_prev_stmt :
1385
1356
(info.copied ? autoinc_value_of_last_inserted_row : 0));
1386
session->my_ok((ulong) session->rowCount(),
1357
session->my_ok((ulong) session->row_count_func,
1387
1358
info.copied + info.deleted + info.touched, id, buff);
1388
session->status_var.inserted_row_count+= session->rowCount();
1389
DRIZZLE_INSERT_SELECT_DONE(0, session->rowCount());
1359
session->status_var.inserted_row_count+= session->row_count_func;
1360
DRIZZLE_INSERT_SELECT_DONE(0, session->row_count_func);
1488
1459
List<Item> *items,
1489
1460
bool is_if_not_exists,
1490
1461
DrizzleLock **lock,
1491
identifier::Table::const_reference identifier)
1462
TableIdentifier &identifier)
1464
Table tmp_table; // Used during 'CreateField()'
1493
1465
TableShare share(message::Table::INTERNAL);
1494
1467
uint32_t select_field_count= items->elements;
1495
1468
/* Add selected items to field list */
1496
List<Item>::iterator it(items->begin());
1469
List_iterator_fast<Item> it(*items);
1498
1471
Field *tmp_field;
1500
1474
if (not (identifier.isTmp()) && create_table->table->db_stat)
1505
1479
create_info->table_existed= 1; // Mark that table existed
1506
1480
push_warning_printf(session, DRIZZLE_ERROR::WARN_LEVEL_NOTE,
1507
1481
ER_TABLE_EXISTS_ERROR, ER(ER_TABLE_EXISTS_ERROR),
1508
create_table->getTableName());
1482
create_table->table_name);
1509
1483
return create_table->table;
1512
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), create_table->getTableName());
1486
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), create_table->table_name);
1490
tmp_table.timestamp_field= 0;
1491
tmp_table.setShare(&share);
1493
tmp_table.getMutableShare()->db_create_options= 0;
1494
tmp_table.getMutableShare()->blob_ptr_size= portable_sizeof_char_ptr;
1496
if (not table_proto.engine().name().compare("MyISAM"))
1497
tmp_table.getMutableShare()->db_low_byte_first= true;
1498
else if (not table_proto.engine().name().compare("MEMORY"))
1499
tmp_table.getMutableShare()->db_low_byte_first= true;
1501
tmp_table.null_row= false;
1502
tmp_table.maybe_null= false;
1504
tmp_table.in_use= session;
1517
table::Shell tmp_table(share); // Used during 'CreateField()'
1519
if (not table_proto.engine().name().compare("MyISAM"))
1520
tmp_table.getMutableShare()->db_low_byte_first= true;
1521
else if (not table_proto.engine().name().compare("MEMORY"))
1522
tmp_table.getMutableShare()->db_low_byte_first= true;
1524
tmp_table.in_use= session;
1508
CreateField *cr_field;
1509
Field *field, *def_field;
1510
if (item->type() == Item::FUNC_ITEM)
1528
CreateField *cr_field;
1529
Field *field, *def_field;
1530
if (item->type() == Item::FUNC_ITEM)
1512
if (item->result_type() != STRING_RESULT)
1532
if (item->result_type() != STRING_RESULT)
1534
field= item->tmp_table_field(&tmp_table);
1538
field= item->tmp_table_field_from_field_type(&tmp_table, 0);
1514
field= item->tmp_table_field(&tmp_table);
1543
field= create_tmp_field(session, &tmp_table, item, item->type(),
1544
(Item ***) 0, &tmp_field, &def_field, false,
1549
!(cr_field=new CreateField(field,(item->type() == Item::FIELD_ITEM ?
1550
((Item_field *)item)->field :
1556
if (item->maybe_null)
1558
cr_field->flags &= ~NOT_NULL_FLAG;
1561
alter_info->create_list.push_back(cr_field);
1518
field= item->tmp_table_field_from_field_type(&tmp_table, 0);
1523
field= create_tmp_field(session, &tmp_table, item, item->type(),
1524
(Item ***) 0, &tmp_field, &def_field, false,
1529
!(cr_field=new CreateField(field,(item->type() == Item::FIELD_ITEM ?
1530
((Item_field *)item)->field :
1536
if (item->maybe_null)
1538
cr_field->flags &= ~NOT_NULL_FLAG;
1541
alter_info->create_list.push_back(cr_field);
1587
1565
or it was created via different mysqld front-end to the
1588
1566
cluster. We don't have much options but throw an error.
1590
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), create_table->getTableName());
1568
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), create_table->table_name);
1594
1572
if (not identifier.isTmp())
1596
/* CREATE TABLE... has found that the table already exists for insert and is adapting to use it */
1597
boost::mutex::scoped_lock scopedLock(table::Cache::singleton().mutex());
1599
if (create_table->table)
1574
LOCK_open.lock(); /* CREATE TABLE... has found that the table already exists for insert and is adapting to use it */
1575
if (session->reopen_name_locked_table(create_table, false))
1601
table::Concurrent *concurrent_table= static_cast<table::Concurrent *>(create_table->table);
1603
if (concurrent_table->reopen_name_locked_table(create_table, session))
1605
(void)plugin::StorageEngine::dropTable(*session, identifier);
1609
table= create_table->table;
1577
quick_rm_table(*session, identifier);
1614
(void)plugin::StorageEngine::dropTable(*session, identifier);
1580
table= create_table->table;
1625
1591
it preparable for open. But let us do close_temporary_table() here
1628
session->drop_temporary_table(identifier);
1594
session->drop_temporary_table(create_table);
1632
if (not table) // open failed
1598
if (!table) // open failed
1636
1602
table->reginfo.lock_type=TL_WRITE;
1637
if (not ((*lock)= session->lockTables(&table, 1, DRIZZLE_LOCK_IGNORE_FLUSH)))
1603
if (! ((*lock)= mysql_lock_tables(session, &table, 1,
1604
DRIZZLE_LOCK_IGNORE_FLUSH, ¬_used)))
1641
session->unlockTables(*lock);
1608
mysql_unlock_tables(session, *lock);
1645
1612
if (not create_info->table_existed)
1646
1613
session->drop_open_table(table, identifier);
1712
1676
session->cuted_fields=0;
1713
1677
if (info.ignore || info.handle_duplicates != DUP_ERROR)
1714
1678
table->cursor->extra(HA_EXTRA_IGNORE_DUP_KEY);
1716
1679
if (info.handle_duplicates == DUP_REPLACE)
1717
1680
table->cursor->extra(HA_EXTRA_WRITE_CAN_REPLACE);
1719
1681
if (info.handle_duplicates == DUP_UPDATE)
1720
1682
table->cursor->extra(HA_EXTRA_INSERT_WITH_UPDATE);
1722
1683
table->cursor->ha_start_bulk_insert((ha_rows) 0);
1723
session->setAbortOnWarning(not info.ignore);
1684
session->abort_on_warning= !info.ignore;
1724
1685
if (check_that_all_fields_are_given_values(session, table, table_list))
1727
1687
table->mark_columns_needed_for_insert();
1728
1688
table->cursor->extra(HA_EXTRA_WRITE_CACHE);