/*********************************************************************//**
Creates a select node struct.
@return own: select node struct */
sel_node_t*
sel_node_create( /*============*/
mem_heap_t* heap); /*!< in: memory heap where created */ /*********************************************************************//**
Frees the memory private to a select node when a query graph is freed,
does not free the heap where the node was originally created. */ void
sel_node_free_private( /*==================*/
sel_node_t* node); /*!< in: select node struct */ /*********************************************************************//**
Frees a prefetch buffer for a column, including the dynamically allocated
memory for data stored there. */ void
sel_col_prefetch_buf_free( /*======================*/
sel_buf_t* prefetch_buf); /*!< in, own: prefetch buffer */ /**********************************************************************//**
Performs a select step. This is a high-level function used in SQL execution
graphs.
@return query thread to run next or NULL */
que_thr_t*
row_sel_step( /*=========*/
que_thr_t* thr); /*!< in: query thread */ /**********************************************************************//**
Performs a fetch for a cursor.
@return query thread to run next or NULL */
que_thr_t*
fetch_step( /*=======*/
que_thr_t* thr); /*!< in: query thread */ /***********************************************************//**
Prints a row in a select result.
@return query thread to run next or NULL */
que_thr_t*
row_printf_step( /*============*/
que_thr_t* thr); /*!< in: query thread */
/****************************************************************//**
Converts a key value stored in MySQL format to an Innobase dtuple. The last
field of the key value may be just a prefix of a fixed length field: hence
the parameter key_len. But currently we donot allow search keys where the
last field is only a prefix of the full key field len and print a warning if
such appears. */ void
row_sel_convert_mysql_key_to_innobase( /*==================================*/
dtuple_t* tuple, /*!< in/out: tuple where to build; NOTE:weassumethatthetypeinfo inthetupleisalreadyaccording
to index! */
byte* buf, /*!< in: buffer to use in field conversions;NOTEthatdtuple->data mayenduppointinginsidebufso donotdiscardthatbufferwhile thetupleisbeingused.See row_mysql_store_col_in_innobase_format()
in the case of DATA_INT */
ulint buf_len, /*!< in: buffer length */
dict_index_t* index, /*!< in: index of the key value */ const byte* key_ptr, /*!< in: MySQL key value */
ulint key_len) /*!< in: MySQL key value length */
MY_ATTRIBUTE((nonnull(1,4,5)));
/* Type aliases for different row_search_mvcc use cases */ /** MySQL format conversion and manages its own mtr */ using MySQLRowCallback= InnoDBPolicy<true, true>; /** Used for internal read purpose */ using InnoDBReadPolicy= InnoDBPolicy<false, true>; /** Used for internal update/delete purpose */ using InnoDBDMLPolicy= InnoDBPolicy<false, false>;
/** Search for rows in the database using cursor. Functionismainlyusedfortablesthataresharedacrossconnectionsand soitemploystechniquethatcanhelpre-constructtherowsthat transactionissupposetosee. Italsohasoptimizationsuchaspre-cachingtherows,usingAHI,etc.
/** Convenience wrapper for InnoDB callback (read-only, manages own mtr). UsedforFTSqueriesandotherread-onlyoperationswhererow_search_mvcc managesitsownmini-transactionlifecycle. @paramcallbackRecordCallbackinstance @parammodesearchmode @paramprebuiltprebuiltstructure @parammatch_modematchmode @paramdirectionsearchdirection
@return DB_SUCCESS or error code */ inline dberr_t row_search_mvcc_callback(
RecordCallback* callback,
page_cur_mode_t mode,
row_prebuilt_t* prebuilt,
ulint match_mode,
ulint direction) noexcept
{ /* output_record() always invokes compare_record(); a callback
without a comparator would be a null std::function call. */
ut_ad(callback);
ut_ad(callback->compare_record); return row_search_mvcc<InnoDBReadPolicy>( reinterpret_cast<byte*>(callback), mode, prebuilt,
match_mode, direction);
}
/** Convenience wrapper for InnoDB callback (DML, external mtr). UsedforSELECTFORUPDATEandotherDMLoperationswherethecaller managesthemini-transactionlifecycle(e.g.,needstokeepmtropen acrossselect_for_update()andupdate_record()). @paramcallbackRecordCallbackinstance @parammodesearchmode @paramprebuiltprebuiltstructurewithexternalmtrset @parammatch_modematchmode @paramdirectionsearchdirection
@return DB_SUCCESS or error code */ inline dberr_t row_search_mvcc_callback_dml(
RecordCallback* callback,
page_cur_mode_t mode,
row_prebuilt_t* prebuilt,
ulint match_mode,
ulint direction) noexcept
{ /* output_record() always invokes compare_record(); a callback
without a comparator would be a null std::function call. */
ut_ad(callback);
ut_ad(callback->compare_record); return row_search_mvcc<InnoDBDMLPolicy>( reinterpret_cast<byte*>(callback), mode, prebuilt,
match_mode, direction);
}
/********************************************************************//**
Count rows in a R-Tree leaf level.
@return DB_SUCCESS if successful */
dberr_t
row_count_rtree_recs( /*=================*/
row_prebuilt_t* prebuilt, /*!< in: prebuilt struct for the tablehandle;thiscontainstheinfo ofsearch_tuple,index;ifsearch tuplecontains0fieldsthenwe positionthecursoratthestartor theendoftheindex,dependingon
'mode' */
ulint* n_rows); /*!< out: number of entries
seen in the consistent read */
@returnerrorcode
@retval DB_SUCCESS if no error was found */
dberr_t row_check_index(row_prebuilt_t *prebuilt, ulint *n_rows)
MY_ATTRIBUTE((nonnull, warn_unused_result));
/** Read the max AUTOINC value from an index. @param[in]indexindexstartingwithanAUTO_INCREMENTcolumn @returnthelargestAUTO_INCREMENTvalue
@retval 0 if no records were found */
uint64_t row_search_max_autoinc(dict_index_t *index) noexcept
MY_ATTRIBUTE((nonnull, warn_unused_result));
/** A structure for caching column values for prefetched rows */ struct sel_buf_t{
byte* data; /*!< data, or NULL; if not NULL, this field hasallocatedmemorywhichmustbeexplicitly freed;canbe!=NULLevenwhenlenis
UNIV_SQL_NULL */
ulint len; /*!< data length or UNIV_SQL_NULL */
ulint val_buf_size; /*!< size of memory buffer allocated for data: thiscanbemorethanlen;thisisdefined
when data != NULL */
};
/** Query plan */ struct plan_t{
dict_table_t* table; /*!< table struct in the dictionary
cache */
dict_index_t* index; /*!< table index used in the search */
btr_pcur_t pcur; /*!< persistent cursor used to search
the index */
ibool asc; /*!< TRUE if cursor traveling upwards */
ibool pcur_is_open; /*!< TRUE if pcur has been positioned
and we can try to fetch new rows */
ibool cursor_at_end; /*!< TRUE if the cursor is open but weknowthattherearenomore qualifyingrowslefttoretrievefrom theindextree;NOTEthough,that theremaystillbeunprocessedrowsin theprefetchstack;alwaysFALSEwhen
pcur_is_open is FALSE */
ibool stored_cursor_rec_processed; /*!< TRUE if the pcur position has been storedandtherecorditispositioned
on has already been processed */
que_node_t** tuple_exps; /*!< array of expressions whichareusedtocalculate thefieldvaluesinthesearch tuple:thereisoneexpression foreachfieldinthesearch
tuple */
dtuple_t* tuple; /*!< search tuple */
page_cur_mode_t mode; /*!< search mode: PAGE_CUR_G, ... */
ulint n_exact_match; /*!< number of first fields in thesearchtuplewhichmustbe
exactly matched */
ibool unique_search; /*!< TRUE if we are searching an
index record with a unique key */
ulint n_rows_fetched; /*!< number of rows fetched using pcur
after it was opened */
ulint n_rows_prefetched;/*!< number of prefetched rows cached forfetch:fetchingseveralrowsin
the same mtr saves CPU time */
ulint first_prefetched;/*!< index of the first cached row in
select buffer arrays for each column */
ibool no_prefetch; /*!< no prefetch for this table */
sym_node_list_t columns; /*!< symbol table nodes for the columns
to retrieve from the table */
UT_LIST_BASE_NODE_T(func_node_t)
end_conds; /*!< conditions which determine the fetchlimitoftheindexsegmentwe havetolookat:whenoneofthese fails,theresultsethasbeen exhaustedforthecursorinthis index;theseconditionsarenormalized sothatinacomparisonthecolumn
for this table is the first argument */
UT_LIST_BASE_NODE_T(func_node_t)
other_conds; /*!< the rest of search conditions we can
test at this table in a join */
ibool must_get_clust; /*!< TRUE if index is a non-clustered indexandwemustalsofetchthe clusteredindexrecord;thisisthe caseifthenon-clusteredrecorddoes notcontainalltheneededcolumns,or ifthisisasingle-tableexplicit cursor,orasearchedupdateor
delete */
ulint* clust_map; /*!< map telling how clust_ref is built fromthefieldsofanon-clustered
record */
dtuple_t* clust_ref; /*!< the reference to the clustered indexentryisbuilthereifindexis
a non-clustered index */
btr_pcur_t clust_pcur; /*!< if index is non-clustered, we use thispcurtosearchtheclustered
index */
mem_heap_t* old_vers_heap; /*!< memory heap used in building an old
version of a row, or NULL */
};
/** Select node states */ enum sel_node_state {
SEL_NODE_CLOSED, /*!< it is a declared cursor which is not
currently open */
SEL_NODE_OPEN, /*!< intention locks not yet set on tables */
SEL_NODE_FETCH, /*!< intention locks have been set */
SEL_NODE_NO_MORE_ROWS /*!< cursor has reached the result set end */
};
/** Select statement node */ struct sel_node_t{
que_common_t common; /*!< node type: QUE_NODE_SELECT */ enum sel_node_state
state; /*!< node state */
que_node_t* select_list; /*!< select list */
sym_node_t* into_list; /*!< variables list or NULL */
sym_node_t* table_list; /*!< table list */
ibool asc; /*!< TRUE if the rows should be fetched
in an ascending order */
ibool set_x_locks; /*!< TRUE if the cursor is for update or delete,whichmeansthatarowx-lock
should be placed on the cursor row */
lock_mode row_lock_mode; /*!< LOCK_X or LOCK_S */
ulint n_tables; /*!< number of tables */
ulint fetch_table; /*!< number of the next table to access
in the join */
plan_t* plans; /*!< array of n_tables many plan nodes containingthesearchplanandthe
search data structures */
que_node_t* search_cond; /*!< search condition */
ReadView* read_view; /*!< if the query is a non-locking consistentread,itsreadviewis
placed here, otherwise NULL */
ibool consistent_read;/*!< TRUE if the select is a consistent,
non-locking read */
order_node_t* order_by; /*!< order by column definition, or
NULL */
ibool is_aggregate; /*!< TRUE if the select list consists of
aggregate functions */
ibool aggregate_already_fetched; /*!< TRUE if the aggregate row has alreadybeenfetchedforthecurrent
cursor */
ibool can_get_updated;/*!< this is TRUE if the select isinasingle-tableexplicit cursorwhichcangetupdated withinthestoredprocedure, orinasearchedupdateor delete;NOTEthattodetermine ofanexplicitcursorifit cangetupdated,theparser checksfromastoredprocedure ifitcontainspositioned
update or delete statements */
sym_node_t* explicit_cursor;/*!< not NULL if an explicit cursor */
UT_LIST_BASE_NODE_T(sym_node_t)
copy_variables; /*!< variables whose values we have to copywhenanexplicitcursorisopened, sothattheydonotchangebetween
fetches */
};
/** Search direction for the MySQL interface */ enum row_sel_direction {
ROW_SEL_NEXT = 1, /*!< ascending direction */
ROW_SEL_PREV = 2/*!< descending direction */
};
/** Match mode for the MySQL interface */ enum row_sel_match_mode {
ROW_SEL_EXACT = 1, /*!< search using a complete key value */
ROW_SEL_EXACT_PREFIX /*!< search using a key prefix which mustmatchrows:theprefixmay containanincompletefield(thelast fieldinprefixmaybejustaprefix
of a fixed length column) */
};
#ifdef UNIV_DEBUG /** Convert a non-SQL-NULL field from Innobase format to MySQL format. */ # define row_sel_field_store_in_mysql_format(dest,templ,idx,field,src,len) \
row_sel_field_store_in_mysql_format_func(dest,templ,idx,field,src,len) #else/* UNIV_DEBUG */ /** Convert a non-SQL-NULL field from Innobase format to MySQL format. */ # define row_sel_field_store_in_mysql_format(dest,templ,idx,field,src,len) \
row_sel_field_store_in_mysql_format_func(dest,templ,src,len) #endif/* UNIV_DEBUG */
/**************************************************************//**
Stores a non-SQL-NULL field in the MySQL format. The counterpart of this
function is row_mysql_store_col_in_innobase_format() in row0mysql.cc. */
void
row_sel_field_store_in_mysql_format_func( /*=====================================*/
byte* dest, /*!< in/out: buffer where to store; NOTE thatBLOBsarenotinthemselves storedhere:thecallermustallocate andcopytheBLOBintobufferbefore, andpassthepointertotheBLOBin
'data' */ const mysql_row_templ_t* templ, /*!< in: MySQL column template. Itsfollowingfieldsarereferenced: type,is_unsigned,mysql_col_len,
mbminlen, mbmaxlen */ #ifdef UNIV_DEBUG const dict_index_t* index, /*!< in: InnoDB index */
ulint field_no, /*!< in: templ->rec_field_no or templ->clust_rec_field_noor
templ->icp_rec_field_no */ #endif/* UNIV_DEBUG */ const byte* data, /*!< in: data to store */
ulint len); /*!< in: length of the data */
Messung V0.5 in Prozent
¤ Diese beiden folgenden Angebotsgruppen bietet das Unternehmen0.15Angebot
(Wie Sie bei der Firma Beratungs- und Dienstleistungen beauftragen können 2026-10-08)
¤
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.