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 */
22
Drizzle has a different form of DELAYED then MySQL. DELAYED is just
23
a hint to the the sorage engine (which can then do whatever it likes.
25
#include <drizzled/server_includes.h>
21
26
#include <drizzled/sql_select.h>
22
27
#include <drizzled/show.h>
28
#include <drizzled/replication/mi.h>
23
29
#include <drizzled/error.h>
24
30
#include <drizzled/name_resolution_context_state.h>
31
#include <drizzled/slave.h>
32
#include <drizzled/sql_parse.h>
25
33
#include <drizzled/probes.h>
34
#include <drizzled/tableop_hooks.h>
26
35
#include <drizzled/sql_base.h>
27
36
#include <drizzled/sql_load.h>
28
37
#include <drizzled/field/timestamp.h>
29
38
#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;
44
42
Check if insert fields are correct.
434
436
Do not do this release if this is a delayed insert, it would steal
435
437
auto_inc values from the delayed_insert thread as they share Table.
437
table->cursor->ha_release_auto_increment();
438
if (table->cursor->ha_end_bulk_insert() && !error)
439
table->file->ha_release_auto_increment();
440
if (table->file->ha_end_bulk_insert() && !error)
440
table->print_error(errno,MYF(0));
442
table->file->print_error(my_errno,MYF(0));
443
445
if (duplic != DUP_ERROR || ignore)
444
table->cursor->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
446
transactional_table= table->cursor->has_transactions();
448
changed= (info.copied || info.deleted || info.updated);
449
if ((changed && error <= 0) || session->transaction.stmt.hasModifiedNonTransData())
451
if (session->transaction.stmt.hasModifiedNonTransData())
452
session->transaction.all.markModifiedNonTransData();
454
assert(transactional_table || !changed || session->transaction.stmt.hasModifiedNonTransData());
446
table->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
448
transactional_table= table->file->has_transactions();
450
if ((changed= (info.copied || info.deleted || info.updated)))
453
Invalidate the table in the query cache if something changed.
454
For the transactional algorithm to work the invalidation must be
455
before binlog writing and ha_autocommit_or_rollback
458
if ((changed && error <= 0) || session->transaction.stmt.modified_non_trans_table || was_insert_delayed)
460
if (session->transaction.stmt.modified_non_trans_table)
461
session->transaction.all.modified_non_trans_table= true;
463
assert(transactional_table || !changed ||
464
session->transaction.stmt.modified_non_trans_table);
457
467
session->set_proc_info("end");
475
485
session->count_cuted_fields= CHECK_FIELD_IGNORE;
476
486
table->auto_increment_field_not_null= false;
477
487
if (duplic == DUP_REPLACE)
478
table->cursor->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
488
table->file->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
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);
491
492
if (values_list.elements == 1 && (!(session->options & OPTION_WARNINGS) ||
492
493
!session->cuted_fields))
494
session->row_count_func= info.copied + info.deleted + info.updated;
495
session->my_ok((ulong) session->row_count_func,
496
info.copied + info.deleted + info.touched, id);
495
session->row_count_func= info.copied + info.deleted +
496
((session->client_capabilities & CLIENT_FOUND_ROWS) ?
497
info.touched : info.updated);
498
my_ok(session, (ulong) session->row_count_func, id);
503
ha_rows updated=((session->client_capabilities & CLIENT_FOUND_ROWS) ?
504
info.touched : info.updated);
502
snprintf(buff, sizeof(buff), ER(ER_INSERT_INFO), (ulong) info.records,
506
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
503
507
(ulong) (info.records - info.copied), (ulong) session->cuted_fields);
505
snprintf(buff, sizeof(buff), ER(ER_INSERT_INFO), (ulong) info.records,
506
(ulong) (info.deleted + info.updated), (ulong) session->cuted_fields);
507
session->row_count_func= info.copied + info.deleted + info.updated;
508
session->my_ok((ulong) session->row_count_func,
509
info.copied + info.deleted + info.touched, id, buff);
509
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
510
(ulong) (info.deleted + updated), (ulong) session->cuted_fields);
511
session->row_count_func= info.copied + info.deleted + updated;
512
::my_ok(session, (ulong) session->row_count_func, id, buff);
511
session->status_var.inserted_row_count+= session->row_count_func;
512
514
session->abort_on_warning= 0;
513
DRIZZLE_INSERT_DONE(0, session->row_count_func);
515
DRIZZLE_INSERT_END();
520
table->file->ha_release_auto_increment();
522
free_underlaid_joins(session, &session->lex->select_lex);
523
session->abort_on_warning= 0;
524
DRIZZLE_INSERT_END();
924
if ((error=table->cursor->deleteRecord(table->getUpdateRecord())))
938
if ((error=table->file->ha_delete_row(table->record[1])))
927
if (!table->cursor->has_transactions())
928
session->transaction.stmt.markModifiedNonTransData();
941
if (!table->file->has_transactions())
942
session->transaction.stmt.modified_non_trans_table= true;
929
943
/* Let us attempt do write_row() once more */
933
session->record_first_successful_insert_id_in_cur_stmt(table->cursor->insert_id_for_cur_row);
947
session->record_first_successful_insert_id_in_cur_stmt(table->file->insert_id_for_cur_row);
935
949
Restore column maps if they where replaced during an duplicate key
938
952
if (table->read_set != save_read_set ||
939
953
table->write_set != save_write_set)
940
table->column_bitmaps_set(*save_read_set, *save_write_set);
954
table->column_bitmaps_set(save_read_set, save_write_set);
942
else if ((error=table->cursor->insertRecord(table->getInsertRecord())))
956
else if ((error=table->file->ha_write_row(table->record[0])))
944
958
if (!info->ignore ||
945
table->cursor->is_fatal_error(error, HA_CHECK_DUP))
959
table->file->is_fatal_error(error, HA_CHECK_DUP))
947
table->cursor->restore_auto_increment(prev_insert_id);
961
table->file->restore_auto_increment(prev_insert_id);
948
962
goto gok_or_after_err;
951
965
after_n_copied_inc:
953
session->record_first_successful_insert_id_in_cur_stmt(table->cursor->insert_id_for_cur_row);
967
session->record_first_successful_insert_id_in_cur_stmt(table->file->insert_id_for_cur_row);
955
969
gok_or_after_err:
956
if (!table->cursor->has_transactions())
957
session->transaction.stmt.markModifiedNonTransData();
972
if (!table->file->has_transactions())
973
session->transaction.stmt.modified_non_trans_table= true;
1338
1360
bool select_insert::send_eof()
1341
bool const trans_table= table->cursor->has_transactions();
1363
bool const trans_table= table->file->has_transactions();
1345
error= table->cursor->ha_end_bulk_insert();
1346
table->cursor->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
1347
table->cursor->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
1367
error= table->file->ha_end_bulk_insert();
1368
table->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
1369
table->file->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
1349
1371
if ((changed= (info.copied || info.deleted || info.updated)))
1352
1374
We must invalidate the table in the query cache before binlog writing
1353
and autocommitOrRollback.
1375
and ha_autocommit_or_rollback.
1355
if (session->transaction.stmt.hasModifiedNonTransData())
1356
session->transaction.all.markModifiedNonTransData();
1377
if (session->transaction.stmt.modified_non_trans_table)
1378
session->transaction.all.modified_non_trans_table= true;
1358
1380
assert(trans_table || !changed ||
1359
session->transaction.stmt.hasModifiedNonTransData());
1381
session->transaction.stmt.modified_non_trans_table);
1361
table->cursor->ha_release_auto_increment();
1383
table->file->ha_release_auto_increment();
1365
table->print_error(error,MYF(0));
1366
DRIZZLE_INSERT_SELECT_DONE(error, 0);
1387
table->file->print_error(error,MYF(0));
1369
1390
char buff[160];
1370
1391
if (info.ignore)
1371
snprintf(buff, sizeof(buff), ER(ER_INSERT_INFO), (ulong) info.records,
1392
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
1372
1393
(ulong) (info.records - info.copied), (ulong) session->cuted_fields);
1374
snprintf(buff, sizeof(buff), ER(ER_INSERT_INFO), (ulong) info.records,
1395
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
1375
1396
(ulong) (info.deleted+info.updated), (ulong) session->cuted_fields);
1376
session->row_count_func= info.copied + info.deleted + info.updated;
1397
session->row_count_func= info.copied + info.deleted +
1398
((session->client_capabilities & CLIENT_FOUND_ROWS) ?
1399
info.touched : info.updated);
1378
1401
id= (session->first_successful_insert_id_in_cur_stmt > 0) ?
1379
1402
session->first_successful_insert_id_in_cur_stmt :
1380
1403
(session->arg_of_last_insert_id_function ?
1381
1404
session->first_successful_insert_id_in_prev_stmt :
1382
1405
(info.copied ? autoinc_value_of_last_inserted_row : 0));
1383
session->my_ok((ulong) session->row_count_func,
1384
info.copied + info.deleted + info.touched, id, buff);
1385
session->status_var.inserted_row_count+= session->row_count_func;
1386
DRIZZLE_INSERT_SELECT_DONE(0, session->row_count_func);
1406
::my_ok(session, (ulong) session->row_count_func, id, buff);
1390
1410
void select_insert::abort() {
1495
1510
Field *tmp_field;
1498
if (not (identifier.isTmp()) && create_table->table->db_stat)
1513
if (!(create_info->options & HA_LEX_CREATE_TMP_TABLE) &&
1514
create_table->table->db_stat)
1500
/* Table already exists and was open at openTablesLock() stage. */
1501
if (is_if_not_exists)
1516
/* Table already exists and was open at open_and_lock_tables() stage. */
1517
if (create_info->options & HA_LEX_CREATE_IF_NOT_EXISTS)
1503
1519
create_info->table_existed= 1; // Mark that table existed
1504
1520
push_warning_printf(session, DRIZZLE_ERROR::WARN_LEVEL_NOTE,
1505
1521
ER_TABLE_EXISTS_ERROR, ER(ER_TABLE_EXISTS_ERROR),
1506
create_table->getTableName());
1507
return create_table->table;
1522
create_table->table_name);
1523
return(create_table->table);
1510
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), create_table->getTableName());
1526
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), create_table->table_name);
1531
tmp_table.timestamp_field= 0;
1532
tmp_table.s= &share;
1533
init_tmp_table_share(session, &share, "", 0, "", "");
1535
tmp_table.s->db_create_options=0;
1536
tmp_table.s->blob_ptr_size= portable_sizeof_char_ptr;
1537
tmp_table.s->db_low_byte_first=
1538
test(create_info->db_type == myisam_hton ||
1539
create_info->db_type == heap_hton);
1540
tmp_table.null_row= false;
1541
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);
1545
Create_field *cr_field;
1546
Field *field, *def_field;
1547
if (item->type() == Item::FUNC_ITEM)
1548
if (item->result_type() != STRING_RESULT)
1549
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);
1551
field= item->tmp_table_field_from_field_type(&tmp_table, 0);
1553
field= create_tmp_field(session, &tmp_table, item, item->type(),
1554
(Item ***) 0, &tmp_field, &def_field, 0, 0, 0, 0,
1557
!(cr_field=new Create_field(field,(item->type() == Item::FIELD_ITEM ?
1558
((Item_field *)item)->field :
1561
if (item->maybe_null)
1562
cr_field->flags &= ~NOT_NULL_FLAG;
1563
alter_info->create_list.push_back(cr_field);
1573
1569
Note that we either creating (or opening existing) temporary table or
1574
1570
creating base table on which name we have exclusive lock. So code below
1575
1571
should not cause deadlocks or races.
1573
We don't log the statement, it will be logged later.
1575
If this is a HEAP table, the automatic DELETE FROM which is written to the
1576
binlog when a HEAP table is opened for the first time since startup, must
1577
not be written: 1) it would be wrong (imagine we're in CREATE SELECT: we
1578
don't want to delete from it) 2) it would be written before the CREATE
1579
Table, which is a wrong order. So we keep binary logging disabled when we
1579
if (not mysql_create_table_no_lock(session,
1583
tmp_disable_binlog(session);
1584
if (!mysql_create_table_no_lock(session, create_table->db,
1585
create_table->table_name,
1586
create_info, alter_info, 0,
1587
select_field_count, true))
1588
if (create_info->table_existed && not identifier.isTmp())
1589
if (create_info->table_existed &&
1590
!(create_info->options & HA_LEX_CREATE_TMP_TABLE))
1591
1593
This means that someone created table underneath server
1592
1594
or it was created via different mysqld front-end to the
1593
1595
cluster. We don't have much options but throw an error.
1595
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), create_table->getTableName());
1597
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), create_table->table_name);
1599
if (not identifier.isTmp())
1601
if (!(create_info->options & HA_LEX_CREATE_TMP_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)
1603
pthread_mutex_lock(&LOCK_open);
1604
if (reopen_name_locked_table(session, 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;
1606
quick_rm_table(create_info->db_type, create_table->db,
1607
table_case_name(create_info, create_table->table_name),
1619
plugin::StorageEngine::dropTable(*session, identifier);
1611
table= create_table->table;
1612
pthread_mutex_unlock(&LOCK_open);
1624
if (not (table= session->openTable(create_table, (bool*) 0,
1625
DRIZZLE_OPEN_TEMPORARY_ONLY)) &&
1626
not create_info->table_existed)
1616
if (!(table= open_table(session, create_table, (bool*) 0,
1617
DRIZZLE_OPEN_TEMPORARY_ONLY)) &&
1618
!create_info->table_existed)
1629
1621
This shouldn't happen as creation of temporary table should make
1630
1622
it preparable for open. But let us do close_temporary_table() here
1633
session->drop_temporary_table(identifier);
1625
drop_temporary_table(session, create_table);
1637
if (not table) // open failed
1629
reenable_binlog(session);
1630
if (!table) // open failed
1641
1634
table->reginfo.lock_type=TL_WRITE;
1642
if (! ((*lock)= session->lockTables(&table, 1, DRIZZLE_LOCK_IGNORE_FLUSH, ¬_used)))
1635
hooks->prelock(&table, 1); // Call prelock hooks
1636
if (! ((*lock)= mysql_lock_tables(session, &table, 1,
1637
DRIZZLE_LOCK_IGNORE_FLUSH, ¬_used)) ||
1638
hooks->postlock(&table, 1))
1646
session->unlockTables(*lock);
1642
mysql_unlock_tables(session, *lock);
1650
if (not create_info->table_existed)
1651
session->drop_open_table(table, identifier);
1646
if (!create_info->table_existed)
1647
drop_open_table(session, table, create_table->db, create_table->table_name);
1660
select_create::prepare(List<Item> &values, Select_Lex_Unit *u)
1655
select_create::prepare(List<Item> &values, SELECT_LEX_UNIT *u)
1662
DrizzleLock *extra_lock= NULL;
1657
DRIZZLE_LOCK *extra_lock= NULL;
1660
Tableop_hooks *hook_ptr= NULL;
1664
For replication, the CREATE-SELECT statement is written
1665
in two pieces: the first transaction messsage contains
1666
the CREATE TABLE statement as a CreateTableStatement message
1667
necessary to create the table.
1669
The second transaction message contains all the InsertStatement
1670
and associated InsertRecords that should go into the table.
1662
For row-based replication, the CREATE-SELECT statement is written
1663
in two pieces: the first one contain the CREATE TABLE statement
1664
necessary to create the table and the second part contain the rows
1665
that should go into the table.
1667
For non-temporary tables, the start of the CREATE-SELECT
1668
implicitly commits the previous transaction, and all events
1669
forming the statement will be stored the transaction cache. At end
1670
of the statement, the entire statement is committed as a
1671
transaction, and all events are written to the binary log.
1673
On the master, the table is locked for the duration of the
1674
statement, but since the CREATE part is replicated as a simple
1675
statement, there is no way to lock the table for accesses on the
1676
slave. Hence, we have to hold on to the CREATE part of the
1677
statement until the statement has finished.
1679
class MY_HOOKS : public Tableop_hooks {
1681
MY_HOOKS(select_create *x, TableList *create_table,
1682
TableList *select_tables)
1683
: ptr(x), all_tables(*create_table)
1685
all_tables.next_global= select_tables;
1689
virtual int do_postlock(Table **tables, uint32_t count)
1691
Table const *const table = *tables;
1692
if (drizzle_bin_log.is_open()
1693
&& !table->s->tmp_table
1694
&& !ptr->get_create_info()->table_existed)
1696
ptr->binlog_show_create_table(tables, count);
1702
TableList all_tables;
1705
MY_HOOKS hooks(this, create_table, select_tables);
1675
if (not (table= create_table_from_items(session, create_info, create_table,
1677
alter_info, &values,
1679
&extra_lock, identifier)))
1711
Start a statement transaction before the create if we are using
1712
row-based replication for the statement. If we are creating a
1713
temporary table, we need to start a statement transaction.
1715
if ((session->lex->create_info.options & HA_LEX_CREATE_TMP_TABLE) == 0
1716
&& drizzle_bin_log.is_open())
1720
if (!(table= create_table_from_items(session, create_info, create_table,
1721
alter_info, &values,
1722
&extra_lock, hook_ptr)))
1681
1723
return(-1); // abort() deletes table
1684
1725
if (extra_lock)
1686
1727
assert(m_plock == NULL);
1688
if (identifier.isTmp())
1729
if (create_info->options & HA_LEX_CREATE_TMP_TABLE)
1689
1730
m_plock= &m_lock;
1691
1732
m_plock= &session->extra_lock;
1693
1734
*m_plock= extra_lock;
1696
if (table->getShare()->sizeFields() < values.elements)
1737
if (table->s->fields < values.elements)
1698
1739
my_error(ER_WRONG_VALUE_COUNT_ON_ROW, MYF(0), 1);
1702
1743
/* First field to copy */
1703
field= table->getFields() + table->getShare()->sizeFields() - values.elements;
1744
field= table->field+table->s->fields - values.elements;
1705
1746
/* Mark all fields that are given values */
1706
1747
for (Field **f= field ; *f ; f++)
1708
table->setWriteSet((*f)->position());
1748
bitmap_set_bit(table->write_set, (*f)->field_index);
1711
1750
/* Don't set timestamp if used */
1712
1751
table->timestamp_field_type= TIMESTAMP_NO_AUTO_SET;
1713
1752
table->next_number_field=table->found_next_number_field;
1715
table->restoreRecordAsDefault(); // Get empty record
1754
restore_record(table,s->default_values); // Get empty record
1716
1755
session->cuted_fields=0;
1717
1756
if (info.ignore || info.handle_duplicates != DUP_ERROR)
1718
table->cursor->extra(HA_EXTRA_IGNORE_DUP_KEY);
1757
table->file->extra(HA_EXTRA_IGNORE_DUP_KEY);
1719
1758
if (info.handle_duplicates == DUP_REPLACE)
1720
table->cursor->extra(HA_EXTRA_WRITE_CAN_REPLACE);
1759
table->file->extra(HA_EXTRA_WRITE_CAN_REPLACE);
1721
1760
if (info.handle_duplicates == DUP_UPDATE)
1722
table->cursor->extra(HA_EXTRA_INSERT_WITH_UPDATE);
1723
table->cursor->ha_start_bulk_insert((ha_rows) 0);
1761
table->file->extra(HA_EXTRA_INSERT_WITH_UPDATE);
1762
table->file->ha_start_bulk_insert((ha_rows) 0);
1724
1763
session->abort_on_warning= !info.ignore;
1725
1764
if (check_that_all_fields_are_given_values(session, table, table_list))
1727
1766
table->mark_columns_needed_for_insert();
1728
table->cursor->extra(HA_EXTRA_WRITE_CACHE);
1767
table->file->extra(HA_EXTRA_WRITE_CACHE);
1772
select_create::binlog_show_create_table(Table **tables, uint32_t count)
1775
Note 1: In RBR mode, we generate a CREATE TABLE statement for the
1776
created table by calling store_create_info() (behaves as SHOW
1777
CREATE TABLE). In the event of an error, nothing should be
1778
written to the binary log, even if the table is non-transactional;
1779
therefore we pretend that the generated CREATE TABLE statement is
1780
for a transactional table. The event will then be put in the
1781
transaction cache, and any subsequent events (e.g., table-map
1782
events and binrow events) will also be put there. We can then use
1783
ha_autocommit_or_rollback() to either throw away the entire
1784
kaboodle of events, or write them to the binary log.
1786
We write the CREATE TABLE statement here and not in prepare()
1787
since there potentially are sub-selects or accesses to information
1788
schema that will do a close_thread_tables(), destroying the
1789
statement transaction cache.
1791
assert(tables && *tables && count > 0);
1794
String query(buf, sizeof(buf), system_charset_info);
1796
TableList tmp_table_list;
1798
memset(&tmp_table_list, 0, sizeof(tmp_table_list));
1799
tmp_table_list.table = *tables;
1800
query.length(0); // Have to zero it since constructor doesn't
1802
result= store_create_info(session, &tmp_table_list, &query, create_info);
1803
assert(result == 0); /* store_create_info() always return 0 */
1732
1806
void select_create::store_values(List<Item> &values)
1734
fill_record(session, field, values, true);
1808
fill_record(session, field, values, 1);
1738
1812
void select_create::send_error(uint32_t errcode,const char *err)
1741
1817
This will execute any rollbacks that are necessary before writing
1742
1818
the transcation cache.