/**************************************************//**
@file include/row0mysql.h
Interface between Innobase row operations and MySQL.
Contains also create table and other data dictionary operations.
Created 9/17/2000 Heikki Tuuri
*******************************************************/
struct row_prebuilt_t; class ha_innobase; class ha_handler_stats;
/*******************************************************************//**
Frees the blob heap in prebuilt when no longer needed. */ void
row_mysql_prebuilt_free_blob_heap( /*==============================*/
row_prebuilt_t* prebuilt); /*!< in: prebuilt struct of a
ha_innobase:: table handle */ /*******************************************************************//**
Stores a >= 5.0.3 format true VARCHAR length to dest, in the MySQL row
format.
@return pointer to the data, we skip the 1or2 bytes at the start
that are used to store the len */
byte*
row_mysql_store_true_var_len( /*=========================*/
byte* dest, /*!< in: where to store */
ulint len, /*!< in: length, must fit in two bytes */
ulint lenlen);/*!< in: storage length of len: either 1 or 2 bytes */ /*******************************************************************//**
Reads a >= 5.0.3 format true VARCHAR length, in the MySQL row format, and
returns a pointer to the data.
@return pointer to the data, we skip the 1or2 bytes at the start
that are used to store the len */ const byte*
row_mysql_read_true_varchar( /*========================*/
ulint* len, /*!< out: variable-length field length */ const byte* field, /*!< in: field in the MySQL format */
ulint lenlen);/*!< in: storage length of len: either 1
or 2 bytes */ /*******************************************************************//**
Stores a reference to a BLOB in the MySQL format. */ void
row_mysql_store_blob_ref( /*=====================*/
byte* dest, /*!< in: where to store */
ulint col_len,/*!< in: dest buffer size: determines into howmanybytestheBLOBlengthisstored, thespaceforthelengthmayvaryfrom1
to 4 bytes */ constvoid* data, /*!< in: BLOB data; if the value to store
is SQL NULL this should be NULL pointer */
ulint len); /*!< in: BLOB length; if the value to store isSQLNULLthisshouldbe0;remember alsotosettheNULLbitintheMySQLrecord
header! */ /*******************************************************************//**
Reads a reference to a BLOB in the MySQL format.
@return pointer to BLOB data */ const byte*
row_mysql_read_blob_ref( /*====================*/
ulint* len, /*!< out: BLOB length */ const byte* ref, /*!< in: BLOB reference in the
MySQL format */
ulint col_len); /*!< in: BLOB reference length
(not BLOB length) */ /*******************************************************************//**
Converts InnoDB geometry data format to MySQL data format. */ void
row_mysql_store_geometry( /*=====================*/
byte* dest, /*!< in/out: where to store */
ulint dest_len, /*!< in: dest buffer size: determines into howmanybytesthegeometrylengthisstored, thespaceforthelengthmayvaryfrom1
to 4 bytes */ const byte* src, /*!< in: geometry data; if the value to store
is SQL NULL this should be NULL pointer */
ulint src_len); /*!< in: geometry length; if the value to store isSQLNULLthisshouldbe0;remember alsotosettheNULLbitintheMySQLrecord
header! */ /**************************************************************//**
Pad a column with spaces. */ void
row_mysql_pad_col( /*==============*/
ulint mbminlen, /*!< in: minimum size of a character,
in bytes */
byte* pad, /*!< out: padded buffer */
ulint len); /*!< in: number of bytes to pad */
/**************************************************************//**
Stores a non-SQL-NULL field given in the MySQL format in the InnoDB format.
The counterpart of this function is row_sel_field_store_in_mysql_format() in
row0sel.cc.
@return up to which byte we used buf in the conversion */
byte*
row_mysql_store_col_in_innobase_format( /*===================================*/
dfield_t* dfield, /*!< in/out: dfield where dtype informationmustbealreadysetwhen
this function is called! */
byte* buf, /*!< in/out: buffer for a converted integervalue;thismustbeatleast col_lenlongthen!NOTEthatdfield mayalsogetapointerto'buf', thereforedonotdiscardthisaslong
as dfield is used! */
ibool row_format_col, /*!< TRUE if the mysql_data is from aMySQLrow,FALSEiffromaMySQL keyvalue; inMySQL,atrueVARCHARstorage formatdiffersinarowandina keyvalue:inakeyvaluethelength
is always stored in 2 bytes! */ const byte* mysql_data, /*!< in: MySQL column value, not SQLNULL;NOTEthatdfieldmayalso getapointertomysql_data, thereforedonotdiscardthisaslong
as dfield is used! */
ulint col_len, /*!< in: MySQL column length; NOTE that thisisthestoragelengthofthe columnintheMySQLformatrow,not necessarilythelengthoftheactual payloaddata;ifthecolumnisatrue
VARCHAR then this is irrelevant */
ulint comp); /*!< in: nonzero=compact format */ /****************************************************************//**
Handles user errors and lock waits detected by the database engine.
@returntrueif it was a lock wait and we should continue running the
query thread */ bool
row_mysql_handle_errors( /*====================*/
dberr_t* new_err,/*!< out: possible new error encountered in rollback,ortheolderrorwhichwas
during the function entry */
trx_t* trx, /*!< in: transaction */
que_thr_t* thr, /*!< in: query thread, or NULL */ const undo_no_t*savept) /*!< in: pointer to savepoint, or nullptr */
MY_ATTRIBUTE((nonnull(1,2))); /********************************************************************//**
Create a prebuilt structfor a MySQL table handle.
@return own: a prebuilt struct */
row_prebuilt_t*
row_create_prebuilt( /*================*/
dict_table_t* table, /*!< in: Innobase table handle */
ulint mysql_row_len); /*!< in: length in bytes of a row in
the MySQL format */ /** Free a prebuilt struct for a TABLE handle. */ void row_prebuilt_free(row_prebuilt_t *prebuilt);
/*********************************************************************//**
Updates the transaction pointers in query graphs stored in the prebuilt struct. */ void
row_update_prebuilt_trx( /*====================*/
row_prebuilt_t* prebuilt, /*!< in/out: prebuilt struct
in MySQL handle */
trx_t* trx); /*!< in: transaction handle */
/*********************************************************************//**
Sets an AUTO_INC type lock on the table mentioned in prebuilt. The
AUTO_INC lock gives exclusive access to the auto-inc counter of the
table. The lock is reserved only for the duration of an SQL statement.
It is not compatible with another AUTO_INC or exclusive lock on the
table.
@return error code or DB_SUCCESS */
dberr_t
row_lock_table_autoinc_for_mysql( /*=============================*/
row_prebuilt_t* prebuilt) /*!< in: prebuilt struct in the MySQL
table handle */
MY_ATTRIBUTE((nonnull, warn_unused_result));
/** Lock a table. @param[in,out]prebuilttablehandle
@return error code or DB_SUCCESS */
dberr_t
row_lock_table(row_prebuilt_t* prebuilt);
/** Does an insert for MySQL. @param[in]mysql_recrowintheMySQLformat @param[in,out]prebuiltprebuiltstructinMySQLhandle @param[in]ins_modewhatrowtypewe'reinserting
@return error code or DB_SUCCESS*/
dberr_t
row_insert_for_mysql( const byte* mysql_rec,
row_prebuilt_t* prebuilt,
ins_mode_t ins_mode)
MY_ATTRIBUTE((warn_unused_result));
/*********************************************************************//**
Builds a dummy query graph used in selects. */ void
row_prebuild_sel_graph( /*===================*/
row_prebuilt_t* prebuilt); /*!< in: prebuilt struct in MySQL
handle */ /*********************************************************************//**
Gets pointer to a prebuilt update vector used in updates. If the update
graph has not yet been built in the prebuilt struct, then this function
first builds it.
@return prebuilt update vector */
upd_t*
row_get_prebuilt_update_vector( /*===========================*/
row_prebuilt_t* prebuilt); /*!< in: prebuilt struct in MySQL
handle */ /** Does an update or delete of a row for MySQL. @param[in,out]prebuiltprebuiltstructinMySQLhandle
@return error code or DB_SUCCESS */
dberr_t
row_update_for_mysql(
row_prebuilt_t* prebuilt)
MY_ATTRIBUTE((warn_unused_result));
/** This can only be used when the current transaction is at READCOMMITTEDorREADUNCOMMITTEDisolationlevel. Beforecallingthisfunctionrow_search_mvcc()musthave initializedprebuilt->new_rec_lockstostoretheinformationwhichnew recordlocksreallywereset.Thisfunctionremovesanewlyset clusteredindexrecordlockunderprebuilt->pcuror prebuilt->clust_pcur.Thus,thisimplementsa'mini-rollback'that releasesthelatestclusteredindexrecordlockweset. @param[in,out]prebuiltprebuiltstructinMySQLhandle @param[in]has_latches_on_recsTRUEifcalledsothatwehavethe latchesontherecordsunderpcur andclust_pcur,andwedonotneed
to reposition the cursors. */ void
row_unlock_for_mysql(
row_prebuilt_t* prebuilt,
ibool has_latches_on_recs);
/*********************************************************************//**
Creates an query graph node of 'update' type to be used in the MySQL
interface.
@return own: update node */
upd_node_t*
row_create_update_node_for_mysql( /*=============================*/
dict_table_t* table, /*!< in: table to update */
mem_heap_t* heap); /*!< in: mem heap from which allocated */
/**********************************************************************//**
Does a cascaded deleteor set null in a foreign key operation.
@return error code or DB_SUCCESS */
dberr_t
row_update_cascade_for_mysql( /*=========================*/
que_thr_t* thr, /*!< in: query thread */
upd_node_t* node, /*!< in: update node used in the cascade
or set null operation */
dict_table_t* table) /*!< in: table where we do the operation */
MY_ATTRIBUTE((nonnull, warn_unused_result));
/** Lock the data dictionary cache exclusively. */ #define row_mysql_lock_data_dictionary(trx) \ do { \
ut_ad(!trx->dict_operation_lock_mode); \
dict_sys.lock(SRW_LOCK_CALL); \
trx->dict_operation_lock_mode = true; \
} while (0)
/** Unlock the data dictionary. */ #define row_mysql_unlock_data_dictionary(trx) \ do { \
ut_ad(!lock_trx_has_sys_table_locks(trx)); \
ut_ad(trx->dict_operation_lock_mode); \
trx->dict_operation_lock_mode = false; \
dict_sys.unlock(); \
} while (0)
/*********************************************************************//**
Creates a table for MySQL. On failure the transaction will be rolled back and the 'table' object will be freed.
@return error code or DB_SUCCESS */
dberr_t
row_create_table_for_mysql( /*=======================*/
dict_table_t* table, /*!< in, own: table definition (willbefreed,oronDB_SUCCESS
added to the data dictionary cache) */
trx_t* trx) /*!< in/out: transaction */
MY_ATTRIBUTE((warn_unused_result));
/*********************************************************************//**
Create an index when creating a table.
On failure, the caller must drop the table!
@return error number or DB_SUCCESS */
dberr_t
row_create_index_for_mysql( /*=======================*/
dict_index_t* index, /*!< in, own: index definition
(will be freed) */
trx_t* trx, /*!< in: transaction handle */ const ulint* field_lengths, /*!< in: if not NULL, must contain dict_index_get_n_fields(index) actualfieldlengthsforthe indexcolumns,whichare thencheckedfornotbeingtoo
large. */
fil_encryption_t mode, /*!< in: encryption mode */
uint32_t key_id) /*!< in: encryption key_id */
MY_ATTRIBUTE((warn_unused_result));
/*********************************************************************//**
Discards the tablespace of a table which stored in an .ibd file. Discarding
means that this function deletes the .ibd file and assigns a new table id for
the table. Also the file_unreadable flag is set.
@return error code or DB_SUCCESS */
dberr_t row_discard_tablespace_for_mysql(dict_table_t *table, trx_t *trx)
MY_ATTRIBUTE((nonnull, warn_unused_result)); /*****************************************************************//**
Imports a tablespace. The space id in the .ibd file must match the space id
of the table in the data dictionary.
@return error code or DB_SUCCESS */
dberr_t
row_import_tablespace_for_mysql( /*============================*/
dict_table_t* table, /*!< in/out: table */
row_prebuilt_t* prebuilt) /*!< in: prebuilt struct in MySQL */
MY_ATTRIBUTE((nonnull, warn_unused_result));
enum rename_fk { /** ignore FOREIGN KEY constraints */
RENAME_IGNORE_FK= 0, /** Rename a table as part of a native table-rebuilding DDL operation */
RENAME_REBUILD, /** Rename as part of ALTER TABLE...ALGORITHM=COPY */
RENAME_ALTER_COPY
};
/*********************************************************************//**
Renames a table for MySQL.
@return error code or DB_SUCCESS */
dberr_t
row_rename_table_for_mysql( /*=======================*/ constchar* old_name, /*!< in: old table name */ constchar* new_name, /*!< in: new table name */
trx_t* trx, /*!< in/out: transaction */
rename_fk fk) /*!< in: how to handle
FOREIGN KEY constraints */
MY_ATTRIBUTE((nonnull, warn_unused_result));
/* A struct describing a place for an individual column in the MySQL rowformatwhichispresentedtothetablehandlerinha_innobase. Thistemplatestructisusedtospeeduprowtransformationsbetween
Innobase and MySQL. */
struct mysql_row_templ_t {
ulint col_no; /*!< column number of the column */
ulint rec_field_no; /*!< field number of the column in an Innobaserecordinthecurrentindex; notdefinediftemplate_typeis
ROW_MYSQL_WHOLE_ROW */
ibool rec_field_is_prefix; /* is this field in a prefix index? */
ulint rec_prefix_field_no; /* record field, even if just a prefix;sameasrec_field_nowhennota prefix,otherwiserec_field_nois ULINT_UNDEFINEDbutthisisthetrue
field number*/
ulint clust_rec_field_no; /*!< field number of the column in an Innobaserecordintheclusteredindex; notdefinediftemplate_typeis
ROW_MYSQL_WHOLE_ROW */
ulint icp_rec_field_no; /*!< field number of the column in an Innobaserecordinthecurrentindex; notdefinedunless
index condition pushdown is used */
ulint mysql_col_offset; /*!< offset of the column in the MySQL
row format */
ulint mysql_col_len; /*!< length of the column in the MySQL
row format */
ulint mysql_null_byte_offset; /*!< MySQL NULL bit byte offset in a
MySQL record */
ulint mysql_null_bit_mask; /*!< bit mask to get the NULL bit,
zero if column cannot be NULL */
ulint type; /*!< column type in Innobase mtype
numbers DATA_CHAR... */
ulint mysql_type; /*!< MySQL type code; this is always
< 256 */
ulint mysql_length_bytes; /*!< if mysql_type ==DATA_MYSQL_TRUE_VARCHAR,thistells whetherweshoulduse1or2bytesto storetheMySQLtrueVARCHARdata lengthatthestartofrowintheMySQL format(NOTEthattheMySQLkeyvalue formatalwaysuses2bytesforthedata
len) */
ulint charset; /*!< MySQL charset-collation code
of the column, or zero */
ulint mbminlen; /*!< minimum length of a char, in bytes,
or zero if not a char type */
ulint mbmaxlen; /*!< maximum length of a char, in bytes,
or zero if not a char type */
ulint is_unsigned; /*!< if a column type is an integer typeandthisfieldis!=0,then
it is an unsigned integer type */
ulint is_virtual; /*!< if a column is a virtual column */
};
#define MYSQL_FETCH_CACHE_SIZE 8 /* After fetching this many rows, we start caching them in fetch_cache */ #define MYSQL_FETCH_CACHE_THRESHOLD 4
/** A struct for (sometimes lazily) prebuilt structures in an Innobase table
handle used within MySQL; these are used to save CPU time. */
struct row_prebuilt_t {
ulint magic_n; /*!< this magic number is set to ROW_PREBUILT_ALLOCATEDwhencreated, orROW_PREBUILT_FREEDwhenthe
struct has been freed */
dict_table_t* table; /*!< Innobase table handle */
dict_index_t* index; /*!< current index for a search, if
any */
trx_t* trx; /*!< current transaction handle */ unsigned sql_stat_start:1;/*!< TRUE when we start processing of anSQLstatement:wemayhavetoset anintentionlockonthetable,
create a consistent read view etc. */ unsigned clust_index_was_generated:1; /*!< if the user did not define a primarykeyinMySQL,thenInnobase automaticallygeneratedaclustered indexwheretheorderingcolumnis therowid:inthiscasethisflag
is set to TRUE */ unsigned index_usable:1; /*!< caches the value of
row_merge_is_index_usable(trx,index) */ unsigned read_just_key:1;/*!< set to 1 when MySQL calls ha_innobase::extrawiththe argumentHA_EXTRA_KEYREAD;itisenough toreadjustcolumnsdefinedin theindex(i.e.,noreadofthe
clustered index record necessary) */ unsigned used_in_HANDLER:1;/*!< TRUE if we have been using this handleinaMySQLHANDLERlowlevel indexcursorcommand:thenwemust storethepcurpositionevenina uniquesearchfromaclusteredindex, becauseHANDLERallowsNEXTandPREV
in such a situation */ unsigned template_type:2;/*!< ROW_MYSQL_WHOLE_ROW, ROW_MYSQL_REC_FIELDS, ROW_MYSQL_DUMMY_TEMPLATE,or
ROW_MYSQL_NO_TEMPLATE */ unsigned n_template:10; /*!< number of elements in the
template */ unsigned null_bitmap_len:10;/*!< number of bytes in the SQL NULL bitmapatthestartofarowinthe
MySQL format */ unsigned need_to_access_clustered:1; /*!< if we are fetching columnsthroughasecondaryindex andatleastonecolumnisnotin thesecondaryindex,thenthisis settoTRUE;notethatsometimesthis issetbutwelateroptimizeoutthe
clustered index lookup */ unsigned templ_contains_blob:1;/*!< TRUE if the template contains acolumnwithDATA_LARGE_MTYPE( get_innobase_type_from_mysql_type()) isTRUE; nottobeconfusedwithInnoDB externallystoredcolumns
(VARCHAR can be off-page too) */ unsigned versioned_write:1;/*!< whether this is
a versioned write */
mysql_row_templ_t* mysql_template;/*!< template used to transform rowsfastbetweenMySQLandInnobase formats;memoryforthistemplate
is not allocated from 'heap' */
mem_heap_t* heap; /*!< memory heap from which theseauxiliarystructuresare
allocated when needed */
ins_node_t* ins_node; /*!< Innobase SQL insert node usedtoperforminserts
to the table */
byte* ins_upd_rec_buff;/*!< buffer for storing data converted totheInnobaseformatfromtheMySQL
format */ const byte* default_rec; /*!< the default values of all columns
(a "default row") in MySQL format */
ulint hint_need_to_fetch_extra_cols; /*!< normally this is set to 0; if this issettoROW_RETRIEVE_PRIMARY_KEY, thenweshouldatleastretrieveall columnsintheprimarykey;ifthis issettoROW_RETRIEVE_ALL_COLS,then wemustretrieveallcolumnsinthe key(ifread_just_key==1),orall
columns in the table */
upd_node_t* upd_node; /*!< Innobase SQL update node used
to perform updates and deletes */
trx_id_t trx_id; /*!< The table->def_trx_id when
ins_graph was built */
que_fork_t* ins_graph; /*!< Innobase SQL query graph used ininserts.Willberebuilton
trx_id or n_indexes mismatch. */
que_fork_t* upd_graph; /*!< Innobase SQL query graph used
in updates or deletes */
btr_pcur_t* pcur; /*!< persistent cursor used in selects
and updates */
btr_pcur_t* clust_pcur; /*!< persistent cursor used in
some selects and updates */
mtr_t* mtr; /*!< external mini-transaction for DMLoperations;whenset,row_search_mvcc
will use this instead of creating its own */
que_fork_t* sel_graph; /*!< dummy query graph used in
selects */
dtuple_t* search_tuple; /*!< prebuilt dtuple used in selects */
byte row_id[DATA_ROW_ID_LEN]; /*!< if the clustered index was generated,therowidofthe lastrowfetchedisstored
here */
doc_id_t fts_doc_id; /* if the table has an FTS index on itthenwefetchthedoc_id. FTS-FIXME:Currentlywefetchitalways butinthefuturewemustonlyfetch itwhenFTScolumnsarebeing
updated */
dtuple_t* clust_ref; /*!< prebuilt dtuple used in
sel/upd/del */
lock_mode select_lock_type;/*!< LOCK_NONE, LOCK_S, or LOCK_X */ bool skip_locked; /*!< TL_{READ,WRITE}_SKIP_LOCKED */
lock_mode stored_select_lock_type;/*!< this field is used to remembertheoriginalselect_lock_type thatwasdecidedinha_innodb.cc, ::store_lock(),::external_lock(),
etc. */
ulint row_read_type; /*!< ROW_READ_WITH_LOCKS if row locks shouldbetheobtainedforrecords underanUPDATEorDELETEcursor. AtREADUNCOMMITTEDor READCOMMITTEDisolationlevel, thiscanbesetto ROW_READ_TRY_SEMI_CONSISTENT,sothat iftherowunderanUPDATEorDELETE cursorwaslockedbyanother transaction,InnoDBwillresort toreadingthelastcommittedvalue ('semi-consistentread').Then, thisfieldwillbesetto ROW_READ_DID_SEMI_CONSISTENTto indicatethat.Iftherowdoesnot matchtheWHEREcondition,MySQLwill invokehandler::unlock_row()to cleartheflagbackto ROW_READ_TRY_SEMI_CONSISTENTand tosimplyskiptherow.If therowmatches,thenextcallto row_search_mvcc()willlock therow. Thiseliminateslockwaitsinsome cases;notethatthisbreaks
serializability. */
ulint new_rec_locks; /*!< normally 0; if thesessionisusingREAD COMMITTEDorREADUNCOMMITTED isolationlevel,setin row_search_mvcc()ifwesetanew recordlockonthesecondary orclusteredindex;thisis usedinrow_unlock_for_mysql() whenreleasingthelockunder thecursorifwedetermine afterretrievingtherowthat itdoesnotneedtobelocked
('mini-rollback') */
ulint mysql_prefix_len;/*!< byte offset of the end of
the last requested column */
ulint mysql_row_len; /*!< length in bytes of a row in the
MySQL format */
ulint n_rows_fetched; /*!< number of rows fetched after
positioning the current cursor */
ulint fetch_direction;/*!< ROW_SEL_NEXT or ROW_SEL_PREV */
byte* fetch_cache[MYSQL_FETCH_CACHE_SIZE]; /*!< a cache for fetched rows if we fetchmanyrowsfromthesamecursor: itsavesCPUtimetofetchthemina batch;wereservemysql_row_len bytesforeachsuchrow;these pointerspoint4bytespastthe allocatedmembufstart,because thereisa4bytemagicnumberatthe
start and at the end */ bool keep_other_fields_on_keyread; /*!< when using fetch cachewithHA_EXTRA_KEYREAD,don't overwriteotherfieldsinmysqlrow
row buffer.*/
ulint fetch_cache_first;/*!< position of the first not yet
fetched row in fetch_cache */
ulint n_fetch_cached; /*!< number of not yet fetched rows
in fetch_cache */
mem_heap_t* blob_heap; /*!< in SELECTS BLOB fields are copied
to this heap */
mem_heap_t* old_vers_heap; /*!< memory heap where a previous
version is built in consistent read */ bool in_fts_query; /*!< Whether we are in a FTS query */ bool fts_doc_id_in_read_set; /*!< true if table has externally
defined FTS_DOC_ID column. */ /*----------------------*/
ulonglong autoinc_last_value; /*!< last value of AUTO-INC interval */
ulonglong autoinc_increment;/*!< The increment step of the auto incrementcolumn.Valuemustbe greaterthanorequalto1.Requiredto
calculate the next value */
ulonglong autoinc_offset; /*!< The offset passed to get_auto_increment()byMySQL.Required
to calculate the next value */
dberr_t autoinc_error; /*!< The actual error code encountered whiletryingtoinitorreadthe autoincvaluefromthetable.We storeitheresothatwecanreturn
it to MySQL */ /*----------------------*/
/** Argument of handler_rowid_filter_check(),
or NULL if no PRIMARY KEY filter is pushed */
ha_innobase* pk_filter;
/** Argument to handler_index_cond_check(),
or NULL if no index condition pushdown (ICP) is used. */
ha_innobase* idx_cond;
ulint idx_cond_n_cols;/*!< Number of fields in idx_cond_cols.
0 if and only if idx_cond == NULL. */ /*----------------------*/
/*----------------------*/
rtr_info_t* rtr_info; /*!< R-tree Search Info */ /*----------------------*/
ulint magic_n2; /*!< this should be the same as
magic_n */
byte* srch_key_val1; /*!< buffer used in converting searchkeyvaluesfromMySQLformat
to InnoDB format.*/
byte* srch_key_val2; /*!< buffer used in converting searchkeyvaluesfromMySQLformat
to InnoDB format.*/
uint srch_key_val_len; /*!< Size of search key */ /** The MySQL table object */
TABLE* m_mysql_table;
/** If TRUE, the SQL layer has advised that we're doing full scan. Alockingreadwillacquireatable-levellock(XorS)instead
of acquiring row-level locks. */ bool full_table_scan;
/** Get template by dict_table_t::cols[] number */ const mysql_row_templ_t* get_template_by_col(ulint col) const
{
ut_ad(col < n_template);
ut_ad(mysql_template); for (ulint i = col; i < n_template; ++i) { const mysql_row_templ_t* templ = &mysql_template[i]; if (!templ->is_virtual && templ->col_no == col) { return templ;
}
} return NULL;
}
};
~ib_vcol_row()
{ if (heap)
{ if (storage.innobase_record)
innobase_free_row_for_vcol(&storage);
mem_heap_free(heap);
}
}
};
/** Report virtual value computation failure in ib::error @param[in]rowthedatarow
*/
ATTRIBUTE_COLD void innobase_report_computed_value_failed(dtuple_t *row);
/** Get the computed value by supplying the base column values. @param[in,out]rowthedatarow @param[in]colvirtualcolumn @param[in]indexindexonthevirtualcolumn @param[in,out]local_heapheapmemoryforprocessinglargedataetc. @param[in,out]heapmemoryheapthatcopiestheactualindexrow @param[in]ifieldindexfield @param[in]thdconnectionhandle @param[in,out]mysql_tableMariaDBtablehandle @param[in,out]mysql_recMariaDBrecordbuffer @param[in]old_tableduringALTERTABLE,thisistheoldtable orNULL. @param[in]updateupdatevectorfortheparentrow @param[in]ignore_warningsignorewarningsduringcalculation.Usually meansthatacalculationisinternaland shouldhavenosideeffects.
@return the field filled with computed value */
dfield_t*
innobase_get_computed_value(
dtuple_t* row, const dict_v_col_t* col, const dict_index_t* index,
mem_heap_t** local_heap,
mem_heap_t* heap, const dict_field_t* ifield,
THD* thd,
TABLE* mysql_table,
byte* mysql_rec, const dict_table_t* old_table=NULL, const upd_t* update=NULL, bool ignore_warnings=false);
/** Change dbname and table name in table->vc_templ. @param[in,out]tablethetablewhosevirtualcolumntemplate
dbname and tbname to be renamed. */ void
innobase_rename_vc_templ(
dict_table_t* table);
#define ROW_PREBUILT_FETCH_MAGIC_N 465765687
#define ROW_MYSQL_WHOLE_ROW 0 #define ROW_MYSQL_REC_FIELDS 1 #define ROW_MYSQL_NO_TEMPLATE 2 #define ROW_MYSQL_DUMMY_TEMPLATE 3/* dummy template used in
row_check_index() */
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.