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
19
#include "config.h"
21
20
#include <drizzled/sql_select.h>
22
21
#include <drizzled/show.h>
23
22
#include <drizzled/error.h>
315
296
if (values->elements != value_count)
317
298
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->abort_on_warning= 0;
324
DRIZZLE_INSERT_DONE(1, 0);
328
301
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->abort_on_warning= 0;
335
DRIZZLE_INSERT_DONE(1, 0);
502
snprintf(buff, sizeof(buff), ER(ER_INSERT_INFO), (ulong) info.records,
461
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
503
462
(ulong) (info.records - info.copied), (ulong) session->cuted_fields);
505
snprintf(buff, sizeof(buff), ER(ER_INSERT_INFO), (ulong) info.records,
464
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
506
465
(ulong) (info.deleted + info.updated), (ulong) session->cuted_fields);
507
466
session->row_count_func= info.copied + info.deleted + info.updated;
508
467
session->my_ok((ulong) session->row_count_func,
509
468
info.copied + info.deleted + info.touched, id, buff);
511
session->status_var.inserted_row_count+= session->row_count_func;
512
470
session->abort_on_warning= 0;
513
471
DRIZZLE_INSERT_DONE(0, session->row_count_func);
476
table->cursor->ha_release_auto_increment();
478
free_underlaid_joins(session, &session->lex->select_lex);
479
session->abort_on_warning= 0;
480
DRIZZLE_INSERT_DONE(1, 0);
819
key.resize(table->getShare()->max_unique_length);
785
if (!(key=(char*) malloc(table->s->max_unique_length)))
821
key_copy(&key[0], table->getInsertRecord(), table->key_info+key_nr, 0);
822
if ((error=(table->cursor->index_read_idx_map(table->getUpdateRecord(),key_nr,
823
&key[0], HA_WHOLE_KEY,
791
key_copy((unsigned char*) key,table->record[0],table->key_info+key_nr,0);
792
if ((error=(table->cursor->index_read_idx_map(table->record[1],key_nr,
793
(unsigned char*) key, HA_WHOLE_KEY,
824
794
HA_READ_KEY_EXACT))))
1069
1043
List<Item> *update_fields,
1070
1044
List<Item> *update_values,
1071
1045
enum_duplicates duplic,
1072
bool ignore_check_option_errors) :
1073
table_list(table_list_par), table(table_par), fields(fields_par),
1074
autoinc_value_of_last_inserted_row(0),
1075
insert_into_view(table_list_par && 0 != 0)
1046
bool ignore_check_option_errors)
1047
:table_list(table_list_par), table(table_par), fields(fields_par),
1048
autoinc_value_of_last_inserted_row(0),
1049
insert_into_view(table_list_par && 0 != 0)
1051
memset(&info, 0, sizeof(info));
1077
1052
info.handle_duplicates= duplic;
1078
1053
info.ignore= ignore_check_option_errors;
1079
1054
info.update_fields= update_fields;
1276
1251
store_values(values);
1277
1252
session->count_cuted_fields= CHECK_FIELD_IGNORE;
1278
1253
if (session->is_error())
1281
* If we fail mid-way through INSERT..SELECT, we need to remove any
1282
* records that we added to the current Statement message. We can
1283
* use session->row_count to know how many records we have already added.
1285
TransactionServices &ts= TransactionServices::singleton();
1286
ts.removeStatementRecords(session, (session->row_count - 1));
1290
1256
// Release latches in case bulk insert takes a long time
1291
1257
plugin::TransactionalStorageEngine::releaseTemporaryLatches(session);
1293
1259
error= write_record(session, table, &info);
1294
table->auto_increment_field_not_null= false;
1379
1344
char buff[160];
1380
1345
if (info.ignore)
1381
snprintf(buff, sizeof(buff), ER(ER_INSERT_INFO), (ulong) info.records,
1346
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
1382
1347
(ulong) (info.records - info.copied), (ulong) session->cuted_fields);
1384
snprintf(buff, sizeof(buff), ER(ER_INSERT_INFO), (ulong) info.records,
1349
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
1385
1350
(ulong) (info.deleted+info.updated), (ulong) session->cuted_fields);
1386
1351
session->row_count_func= info.copied + info.deleted + info.updated;
1491
1455
static Table *create_table_from_items(Session *session, HA_CREATE_INFO *create_info,
1492
1456
TableList *create_table,
1493
message::Table &table_proto,
1457
message::Table *table_proto,
1494
1458
AlterInfo *alter_info,
1495
1459
List<Item> *items,
1496
1460
bool is_if_not_exists,
1498
TableIdentifier &identifier)
1461
DRIZZLE_LOCK **lock)
1500
TableShare share(message::Table::INTERNAL);
1463
Table tmp_table; // Used during 'CreateField()'
1501
1466
uint32_t select_field_count= items->elements;
1502
1467
/* Add selected items to field list */
1503
1468
List_iterator_fast<Item> it(*items);
1513
1481
create_info->table_existed= 1; // Mark that table existed
1514
1482
push_warning_printf(session, DRIZZLE_ERROR::WARN_LEVEL_NOTE,
1515
1483
ER_TABLE_EXISTS_ERROR, ER(ER_TABLE_EXISTS_ERROR),
1516
create_table->getTableName());
1484
create_table->table_name);
1517
1485
return create_table->table;
1520
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), create_table->getTableName());
1488
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), create_table->table_name);
1493
tmp_table.timestamp_field= 0;
1494
tmp_table.s= &share;
1496
tmp_table.s->db_create_options=0;
1497
tmp_table.s->blob_ptr_size= portable_sizeof_char_ptr;
1498
tmp_table.s->db_low_byte_first=
1499
test(create_info->db_type == myisam_engine ||
1500
create_info->db_type == heap_engine);
1501
tmp_table.null_row= false;
1502
tmp_table.maybe_null= false;
1525
table::Shell tmp_table(share); // Used during 'CreateField()'
1526
tmp_table.timestamp_field= 0;
1528
tmp_table.getMutableShare()->db_create_options= 0;
1529
tmp_table.getMutableShare()->blob_ptr_size= portable_sizeof_char_ptr;
1531
if (not table_proto.engine().name().compare("MyISAM"))
1532
tmp_table.getMutableShare()->db_low_byte_first= true;
1533
else if (not table_proto.engine().name().compare("MEMORY"))
1534
tmp_table.getMutableShare()->db_low_byte_first= true;
1536
tmp_table.null_row= false;
1537
tmp_table.maybe_null= false;
1539
tmp_table.in_use= session;
1543
CreateField *cr_field;
1544
Field *field, *def_field;
1545
if (item->type() == Item::FUNC_ITEM)
1547
if (item->result_type() != STRING_RESULT)
1549
field= item->tmp_table_field(&tmp_table);
1553
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);
1558
field= create_tmp_field(session, &tmp_table, item, item->type(),
1559
(Item ***) 0, &tmp_field, &def_field, false,
1564
!(cr_field=new CreateField(field,(item->type() == Item::FIELD_ITEM ?
1565
((Item_field *)item)->field :
1571
if (item->maybe_null)
1573
cr_field->flags &= ~NOT_NULL_FLAG;
1576
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);
1527
TableIdentifier identifier(create_table->db,
1528
create_table->table_name,
1529
lex_identified_temp_table ? TEMP_TABLE :
1581
1534
Create and lock table.
1584
1537
creating base table on which name we have exclusive lock. So code below
1585
1538
should not cause deadlocks or races.
1589
if (not mysql_create_table_no_lock(session,
1541
if (!mysql_create_table_no_lock(session,
1598
if (create_info->table_existed && not identifier.isTmp())
1550
if (create_info->table_existed &&
1551
!(lex_identified_temp_table))
1601
1554
This means that someone created table underneath server
1602
1555
or it was created via different mysqld front-end to the
1603
1556
cluster. We don't have much options but throw an error.
1605
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), create_table->getTableName());
1558
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), create_table->table_name);
1609
if (not identifier.isTmp())
1562
if (!(lex_identified_temp_table))
1611
LOCK_open.lock(); /* CREATE TABLE... has found that the table already exists for insert and is adapting to use it */
1613
if (create_table->table)
1615
table::Concurrent *concurrent_table= static_cast<table::Concurrent *>(create_table->table);
1617
if (concurrent_table->reopen_name_locked_table(create_table, session))
1619
quick_rm_table(*session, identifier);
1623
table= create_table->table;
1564
pthread_mutex_lock(&LOCK_open); /* CREATE TABLE... has found that the table already exists for insert and is adapting to use it */
1565
if (session->reopen_name_locked_table(create_table, false))
1628
1567
quick_rm_table(*session, identifier);
1570
table= create_table->table;
1571
pthread_mutex_unlock(&LOCK_open);
1635
if (not (table= session->openTable(create_table, (bool*) 0,
1636
DRIZZLE_OPEN_TEMPORARY_ONLY)) &&
1637
not create_info->table_existed)
1575
if (!(table= session->openTable(create_table, (bool*) 0,
1576
DRIZZLE_OPEN_TEMPORARY_ONLY)) &&
1577
!create_info->table_existed)
1640
1580
This shouldn't happen as creation of temporary table should make
1641
1581
it preparable for open. But let us do close_temporary_table() here
1644
session->drop_temporary_table(identifier);
1584
session->drop_temporary_table(create_table);
1648
if (not table) // open failed
1588
if (!table) // open failed
1652
1592
table->reginfo.lock_type=TL_WRITE;
1653
if (! ((*lock)= session->lockTables(&table, 1, DRIZZLE_LOCK_IGNORE_FLUSH, ¬_used)))
1593
if (! ((*lock)= mysql_lock_tables(session, &table, 1,
1594
DRIZZLE_LOCK_IGNORE_FLUSH, ¬_used)))
1657
session->unlockTables(*lock);
1598
mysql_unlock_tables(session, *lock);
1661
if (not create_info->table_existed)
1662
session->drop_open_table(table, identifier);
1602
if (!create_info->table_existed)
1603
session->drop_open_table(table, create_table->db, create_table->table_name);