que0que.ic
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:6k
- /******************************************************
- Query graph
- (c) 1996 Innobase Oy
- Created 5/27/1996 Heikki Tuuri
- *******************************************************/
- #include "usr0sess.h"
- /***************************************************************************
- Gets the trx of a query thread. */
- UNIV_INLINE
- trx_t*
- thr_get_trx(
- /*========*/
- que_thr_t* thr) /* in: query thread */
- {
- ut_ad(thr);
- return(thr->graph->trx);
- }
- /***************************************************************************
- Gets the first thr in a fork. */
- UNIV_INLINE
- que_thr_t*
- que_fork_get_first_thr(
- /*===================*/
- que_fork_t* fork) /* in: query fork */
- {
- return(UT_LIST_GET_FIRST(fork->thrs));
- }
- /***************************************************************************
- Gets the child node of the first thr in a fork. */
- UNIV_INLINE
- que_node_t*
- que_fork_get_child(
- /*===============*/
- que_fork_t* fork) /* in: query fork */
- {
- que_thr_t* thr;
- thr = UT_LIST_GET_FIRST(fork->thrs);
- return(thr->child);
- }
- /***************************************************************************
- Gets the type of a graph node. */
- UNIV_INLINE
- ulint
- que_node_get_type(
- /*==============*/
- que_node_t* node) /* in: graph node */
- {
- ut_ad(node);
- return(((que_common_t*)node)->type);
- }
- /***************************************************************************
- Gets pointer to the value dfield of a graph node. */
- UNIV_INLINE
- dfield_t*
- que_node_get_val(
- /*=============*/
- que_node_t* node) /* in: graph node */
- {
- ut_ad(node);
- return(&(((que_common_t*)node)->val));
- }
- /***************************************************************************
- Gets the value buffer size of a graph node. */
- UNIV_INLINE
- ulint
- que_node_get_val_buf_size(
- /*======================*/
- /* out: val buffer size, not defined if
- val.data == NULL in node */
- que_node_t* node) /* in: graph node */
- {
- ut_ad(node);
- return(((que_common_t*)node)->val_buf_size);
- }
- /***************************************************************************
- Sets the value buffer size of a graph node. */
- UNIV_INLINE
- void
- que_node_set_val_buf_size(
- /*======================*/
- que_node_t* node, /* in: graph node */
- ulint size) /* in: size */
- {
- ut_ad(node);
- ((que_common_t*)node)->val_buf_size = size;
- }
- /***************************************************************************
- Sets the parent of a graph node. */
- UNIV_INLINE
- void
- que_node_set_parent(
- /*================*/
- que_node_t* node, /* in: graph node */
- que_node_t* parent) /* in: parent */
- {
- ut_ad(node);
- ((que_common_t*)node)->parent = parent;
- }
- /***************************************************************************
- Gets pointer to the value data type field of a graph node. */
- UNIV_INLINE
- dtype_t*
- que_node_get_data_type(
- /*===================*/
- que_node_t* node) /* in: graph node */
- {
- ut_ad(node);
- return(&(((que_common_t*)node)->val.type));
- }
- /*************************************************************************
- Catenates a query graph node to a list of them, possible empty list. */
- UNIV_INLINE
- que_node_t*
- que_node_list_add_last(
- /*===================*/
- /* out: one-way list of nodes */
- que_node_t* node_list, /* in: node list, or NULL */
- que_node_t* node) /* in: node */
- {
- que_common_t* cnode;
- que_common_t* cnode2;
- cnode = node;
-
- cnode->brother = NULL;
- if (node_list == NULL) {
- return(node);
- }
- cnode2 = node_list;
-
- while (cnode2->brother != NULL) {
- cnode2 = cnode2->brother;
- }
- cnode2->brother = node;
- return(node_list);
- }
- /*************************************************************************
- Gets the next list node in a list of query graph nodes. */
- UNIV_INLINE
- que_node_t*
- que_node_get_next(
- /*==============*/
- /* out: next node in a list of nodes */
- que_node_t* node) /* in: node in a list */
- {
- return(((que_common_t*)node)->brother);
- }
- /*************************************************************************
- Gets a query graph node list length. */
- UNIV_INLINE
- ulint
- que_node_list_get_len(
- /*==================*/
- /* out: length, for NULL list 0 */
- que_node_t* node_list) /* in: node list, or NULL */
- {
- que_common_t* cnode;
- ulint len;
- cnode = node_list;
- len = 0;
-
- while (cnode != NULL) {
- len++;
- cnode = cnode->brother;
- }
- return(len);
- }
- /*************************************************************************
- Gets the parent node of a query graph node. */
- UNIV_INLINE
- que_node_t*
- que_node_get_parent(
- /*================*/
- /* out: parent node or NULL */
- que_node_t* node) /* in: node */
- {
- return(((que_common_t*)node)->parent);
- }
- /**************************************************************************
- Checks if graph, trx, or session is in a state where the query thread should
- be stopped. */
- UNIV_INLINE
- ibool
- que_thr_peek_stop(
- /*==============*/
- /* out: TRUE if should be stopped; NOTE that
- if the peek is made without reserving the
- kernel mutex, then another peek with the
- mutex reserved is necessary before deciding
- the actual stopping */
- que_thr_t* thr) /* in: query thread */
- {
- trx_t* trx;
- que_t* graph;
- graph = thr->graph;
- trx = graph->trx;
-
- if (graph->state != QUE_FORK_ACTIVE
- || trx->que_state == TRX_QUE_LOCK_WAIT
- || (UT_LIST_GET_LEN(trx->signals) > 0
- && trx->que_state == TRX_QUE_RUNNING)) {
- return(TRUE);
- }
- return(FALSE);
- }
- /***************************************************************************
- Returns TRUE if the query graph is for a SELECT statement. */
- UNIV_INLINE
- ibool
- que_graph_is_select(
- /*================*/
- /* out: TRUE if a select */
- que_t* graph) /* in: graph */
- {
- if (graph->fork_type == QUE_FORK_SELECT_SCROLL
- || graph->fork_type == QUE_FORK_SELECT_NON_SCROLL) {
- return(TRUE);
- }
- return(FALSE);
- }