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);
743
int write_record(Session *session, Table *table,CopyInfo *info)
709
int write_record(Session *session, Table *table,COPY_INFO *info)
746
std::vector<unsigned char> key;
747
boost::dynamic_bitset<> *save_read_set, *save_write_set;
713
MyBitmap *save_read_set, *save_write_set;
748
714
uint64_t prev_insert_id= table->cursor->next_insert_id;
749
715
uint64_t insert_id_for_cur_row= 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))))
846
816
table->cursor->adjust_next_insert_id_after_explicit_value(
847
817
table->next_number_field->val_int());
850
if (! table->records_are_comparable() || table->compare_records())
819
if ((table->cursor->getEngine()->check_flag(HTON_BIT_PARTIAL_COLUMN_READ) &&
820
!bitmap_is_subset(table->write_set, table->read_set)) ||
821
table->compare_record())
852
if ((error=table->cursor->updateRecord(table->getUpdateRecord(),
853
table->getInsertRecord())) &&
823
if ((error=table->cursor->ha_update_row(table->record[1],
824
table->record[0])) &&
854
825
error != HA_ERR_RECORD_IS_THE_SAME)
856
827
if (info->ignore &&
1068
1043
List<Item> *update_fields,
1069
1044
List<Item> *update_values,
1070
1045
enum_duplicates duplic,
1071
bool ignore_check_option_errors) :
1072
table_list(table_list_par), table(table_par), fields(fields_par),
1073
autoinc_value_of_last_inserted_row(0),
1074
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));
1076
1052
info.handle_duplicates= duplic;
1077
1053
info.ignore= ignore_check_option_errors;
1078
1054
info.update_fields= update_fields;
1369
1344
char buff[160];
1370
1345
if (info.ignore)
1371
snprintf(buff, sizeof(buff), ER(ER_INSERT_INFO), (ulong) info.records,
1346
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
1372
1347
(ulong) (info.records - info.copied), (ulong) session->cuted_fields);
1374
snprintf(buff, sizeof(buff), ER(ER_INSERT_INFO), (ulong) info.records,
1349
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
1375
1350
(ulong) (info.deleted+info.updated), (ulong) session->cuted_fields);
1376
1351
session->row_count_func= info.copied + info.deleted + info.updated;
1503
1482
create_info->table_existed= 1; // Mark that table existed
1504
1483
push_warning_printf(session, DRIZZLE_ERROR::WARN_LEVEL_NOTE,
1505
1484
ER_TABLE_EXISTS_ERROR, ER(ER_TABLE_EXISTS_ERROR),
1506
create_table->getTableName());
1485
create_table->table_name);
1507
1486
return create_table->table;
1510
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), create_table->getTableName());
1489
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), create_table->table_name);
1494
tmp_table.timestamp_field= 0;
1495
tmp_table.s= &share;
1497
tmp_table.s->db_create_options=0;
1498
tmp_table.s->blob_ptr_size= portable_sizeof_char_ptr;
1500
if (not table_proto.engine().name().compare("MyISAM"))
1501
tmp_table.s->db_low_byte_first= true;
1502
else if (not table_proto.engine().name().compare("MEMORY"))
1503
tmp_table.s->db_low_byte_first= true;
1505
tmp_table.null_row= false;
1506
tmp_table.maybe_null= false;
1515
table::Shell tmp_table(share); // Used during 'CreateField()'
1516
tmp_table.timestamp_field= 0;
1518
tmp_table.getMutableShare()->db_create_options= 0;
1519
tmp_table.getMutableShare()->blob_ptr_size= portable_sizeof_char_ptr;
1521
if (not table_proto.engine().name().compare("MyISAM"))
1522
tmp_table.getMutableShare()->db_low_byte_first= true;
1523
else if (not table_proto.engine().name().compare("MEMORY"))
1524
tmp_table.getMutableShare()->db_low_byte_first= true;
1526
tmp_table.null_row= false;
1527
tmp_table.maybe_null= false;
1529
tmp_table.in_use= session;
1533
CreateField *cr_field;
1534
Field *field, *def_field;
1535
if (item->type() == Item::FUNC_ITEM)
1537
if (item->result_type() != STRING_RESULT)
1539
field= item->tmp_table_field(&tmp_table);
1543
field= item->tmp_table_field_from_field_type(&tmp_table, 0);
1510
CreateField *cr_field;
1511
Field *field, *def_field;
1512
if (item->type() == Item::FUNC_ITEM)
1513
if (item->result_type() != STRING_RESULT)
1514
field= item->tmp_table_field(&tmp_table);
1548
field= create_tmp_field(session, &tmp_table, item, item->type(),
1549
(Item ***) 0, &tmp_field, &def_field, false,
1554
!(cr_field=new CreateField(field,(item->type() == Item::FIELD_ITEM ?
1555
((Item_field *)item)->field :
1561
if (item->maybe_null)
1563
cr_field->flags &= ~NOT_NULL_FLAG;
1566
alter_info->create_list.push_back(cr_field);
1516
field= item->tmp_table_field_from_field_type(&tmp_table, 0);
1518
field= create_tmp_field(session, &tmp_table, item, item->type(),
1519
(Item ***) 0, &tmp_field, &def_field, false,
1522
!(cr_field=new CreateField(field,(item->type() == Item::FIELD_ITEM ?
1523
((Item_field *)item)->field :
1526
if (item->maybe_null)
1527
cr_field->flags &= ~NOT_NULL_FLAG;
1528
alter_info->create_list.push_back(cr_field);
1585
1545
select_field_count,
1586
1546
is_if_not_exists))
1588
if (create_info->table_existed && not identifier.isTmp())
1548
if (create_info->table_existed &&
1549
!(lex_identified_temp_table))
1591
1552
This means that someone created table underneath server
1592
1553
or it was created via different mysqld front-end to the
1593
1554
cluster. We don't have much options but throw an error.
1595
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), create_table->getTableName());
1556
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), create_table->table_name);
1599
if (not identifier.isTmp())
1560
if (not lex_identified_temp_table)
1601
/* CREATE TABLE... has found that the table already exists for insert and is adapting to use it */
1602
boost::mutex::scoped_lock scopedLock(table::Cache::singleton().mutex());
1604
if (create_table->table)
1562
pthread_mutex_lock(&LOCK_open); /* CREATE TABLE... has found that the table already exists for insert and is adapting to use it */
1563
if (session->reopen_name_locked_table(create_table, false))
1606
table::Concurrent *concurrent_table= static_cast<table::Concurrent *>(create_table->table);
1608
if (concurrent_table->reopen_name_locked_table(create_table, session))
1610
plugin::StorageEngine::dropTable(*session, identifier);
1614
table= create_table->table;
1565
quick_rm_table(*session, identifier);
1619
plugin::StorageEngine::dropTable(*session, identifier);
1568
table= create_table->table;
1569
pthread_mutex_unlock(&LOCK_open);
1630
1579
it preparable for open. But let us do close_temporary_table() here
1633
session->drop_temporary_table(identifier);
1582
session->drop_temporary_table(create_table);
1637
if (not table) // open failed
1586
if (!table) // open failed
1641
1590
table->reginfo.lock_type=TL_WRITE;
1642
if (! ((*lock)= session->lockTables(&table, 1, DRIZZLE_LOCK_IGNORE_FLUSH, ¬_used)))
1591
if (! ((*lock)= mysql_lock_tables(session, &table, 1,
1592
DRIZZLE_LOCK_IGNORE_FLUSH, ¬_used)))
1646
session->unlockTables(*lock);
1596
mysql_unlock_tables(session, *lock);
1650
if (not create_info->table_existed)
1651
session->drop_open_table(table, identifier);
1600
if (!create_info->table_existed)
1601
session->drop_open_table(table, create_table->db, create_table->table_name);
1693
1643
*m_plock= extra_lock;
1696
if (table->getShare()->sizeFields() < values.elements)
1646
if (table->s->fields < values.elements)
1698
1648
my_error(ER_WRONG_VALUE_COUNT_ON_ROW, MYF(0), 1);
1702
1652
/* First field to copy */
1703
field= table->getFields() + table->getShare()->sizeFields() - values.elements;
1653
field= table->field+table->s->fields - values.elements;
1705
1655
/* Mark all fields that are given values */
1706
1656
for (Field **f= field ; *f ; f++)
1708
table->setWriteSet((*f)->position());
1657
table->setWriteSet((*f)->field_index);
1711
1659
/* Don't set timestamp if used */
1712
1660
table->timestamp_field_type= TIMESTAMP_NO_AUTO_SET;