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();
1270
1237
bool select_insert::send_data(List<Item> &values)
1275
1242
if (unit->offset_limit_cnt)
1276
1243
{ // using limit offset,count
1277
1244
unit->offset_limit_cnt--;
1281
1248
session->count_cuted_fields= CHECK_FIELD_WARN; // Calculate cuted fields
1282
1249
store_values(values);
1283
1250
session->count_cuted_fields= CHECK_FIELD_IGNORE;
1284
1251
if (session->is_error())
1287
1254
// Release latches in case bulk insert takes a long time
1288
1255
plugin::TransactionalStorageEngine::releaseTemporaryLatches(session);
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;
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;
1528
CreateField *cr_field;
1529
Field *field, *def_field;
1530
if (item->type() == Item::FUNC_ITEM)
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);
1506
CreateField *cr_field;
1507
Field *field, *def_field;
1508
if (item->type() == Item::FUNC_ITEM)
1509
if (item->result_type() != STRING_RESULT)
1510
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);
1512
field= item->tmp_table_field_from_field_type(&tmp_table, 0);
1514
field= create_tmp_field(session, &tmp_table, item, item->type(),
1515
(Item ***) 0, &tmp_field, &def_field, false,
1518
!(cr_field=new CreateField(field,(item->type() == Item::FIELD_ITEM ?
1519
((Item_field *)item)->field :
1522
if (item->maybe_null)
1523
cr_field->flags &= ~NOT_NULL_FLAG;
1524
alter_info->create_list.push_back(cr_field);
1587
1548
or it was created via different mysqld front-end to the
1588
1549
cluster. We don't have much options but throw an error.
1590
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), create_table->getTableName());
1551
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), create_table->table_name);
1594
1555
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)
1557
LOCK_open.lock(); /* CREATE TABLE... has found that the table already exists for insert and is adapting to use it */
1558
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;
1560
quick_rm_table(*session, identifier);
1614
(void)plugin::StorageEngine::dropTable(*session, identifier);
1563
table= create_table->table;
1625
1574
it preparable for open. But let us do close_temporary_table() here
1628
session->drop_temporary_table(identifier);
1577
session->drop_temporary_table(create_table);
1632
if (not table) // open failed
1581
if (!table) // open failed
1636
1585
table->reginfo.lock_type=TL_WRITE;
1637
if (not ((*lock)= session->lockTables(&table, 1, DRIZZLE_LOCK_IGNORE_FLUSH)))
1586
if (! ((*lock)= mysql_lock_tables(session, &table, 1,
1587
DRIZZLE_LOCK_IGNORE_FLUSH, ¬_used)))
1641
session->unlockTables(*lock);
1591
mysql_unlock_tables(session, *lock);
1645
1595
if (not create_info->table_existed)
1646
1596
session->drop_open_table(table, identifier);
1712
1659
session->cuted_fields=0;
1713
1660
if (info.ignore || info.handle_duplicates != DUP_ERROR)
1714
1661
table->cursor->extra(HA_EXTRA_IGNORE_DUP_KEY);
1716
1662
if (info.handle_duplicates == DUP_REPLACE)
1717
1663
table->cursor->extra(HA_EXTRA_WRITE_CAN_REPLACE);
1719
1664
if (info.handle_duplicates == DUP_UPDATE)
1720
1665
table->cursor->extra(HA_EXTRA_INSERT_WITH_UPDATE);
1722
1666
table->cursor->ha_start_bulk_insert((ha_rows) 0);
1723
session->setAbortOnWarning(not info.ignore);
1667
session->abort_on_warning= !info.ignore;
1724
1668
if (check_that_all_fields_are_given_values(session, table, table_list))
1727
1670
table->mark_columns_needed_for_insert();
1728
1671
table->cursor->extra(HA_EXTRA_WRITE_CACHE);