que0que.ic
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:6k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /******************************************************
  2. Query graph
  3. (c) 1996 Innobase Oy
  4. Created 5/27/1996 Heikki Tuuri
  5. *******************************************************/
  6. #include "usr0sess.h"
  7. /***************************************************************************
  8. Gets the trx of a query thread. */
  9. UNIV_INLINE
  10. trx_t*
  11. thr_get_trx(
  12. /*========*/
  13. que_thr_t* thr) /* in: query thread */
  14. {
  15. ut_ad(thr);
  16. return(thr->graph->trx);
  17. }
  18. /***************************************************************************
  19. Gets the first thr in a fork. */
  20. UNIV_INLINE
  21. que_thr_t*
  22. que_fork_get_first_thr(
  23. /*===================*/
  24. que_fork_t* fork)  /* in: query fork */
  25. {
  26. return(UT_LIST_GET_FIRST(fork->thrs));
  27. }
  28. /***************************************************************************
  29. Gets the child node of the first thr in a fork. */
  30. UNIV_INLINE
  31. que_node_t*
  32. que_fork_get_child(
  33. /*===============*/
  34. que_fork_t* fork)  /* in: query fork */
  35. {
  36. que_thr_t* thr;
  37. thr = UT_LIST_GET_FIRST(fork->thrs);
  38. return(thr->child);
  39. }
  40. /***************************************************************************
  41. Gets the type of a graph node. */
  42. UNIV_INLINE
  43. ulint
  44. que_node_get_type(
  45. /*==============*/
  46. que_node_t* node) /* in: graph node */
  47. {
  48. ut_ad(node);
  49. return(((que_common_t*)node)->type);
  50. }
  51. /***************************************************************************
  52. Gets pointer to the value dfield of a graph node. */
  53. UNIV_INLINE
  54. dfield_t*
  55. que_node_get_val(
  56. /*=============*/
  57. que_node_t* node) /* in: graph node */
  58. {
  59. ut_ad(node);
  60. return(&(((que_common_t*)node)->val));
  61. }
  62. /***************************************************************************
  63. Gets the value buffer size of a graph node. */
  64. UNIV_INLINE
  65. ulint
  66. que_node_get_val_buf_size(
  67. /*======================*/
  68. /* out: val buffer size, not defined if
  69. val.data == NULL in node */
  70. que_node_t* node) /* in: graph node */
  71. {
  72. ut_ad(node);
  73. return(((que_common_t*)node)->val_buf_size);
  74. }
  75. /***************************************************************************
  76. Sets the value buffer size of a graph node. */
  77. UNIV_INLINE
  78. void
  79. que_node_set_val_buf_size(
  80. /*======================*/
  81. que_node_t* node, /* in: graph node */
  82. ulint size) /* in: size */
  83. {
  84. ut_ad(node);
  85. ((que_common_t*)node)->val_buf_size = size;
  86. }
  87. /***************************************************************************
  88. Sets the parent of a graph node. */
  89. UNIV_INLINE
  90. void
  91. que_node_set_parent(
  92. /*================*/
  93. que_node_t* node, /* in: graph node */
  94. que_node_t* parent) /* in: parent */
  95. {
  96. ut_ad(node);
  97. ((que_common_t*)node)->parent = parent;
  98. }
  99. /***************************************************************************
  100. Gets pointer to the value data type field of a graph node. */
  101. UNIV_INLINE
  102. dtype_t*
  103. que_node_get_data_type(
  104. /*===================*/
  105. que_node_t* node) /* in: graph node */
  106. {
  107. ut_ad(node);
  108. return(&(((que_common_t*)node)->val.type));
  109. }
  110. /*************************************************************************
  111. Catenates a query graph node to a list of them, possible empty list. */
  112. UNIV_INLINE
  113. que_node_t*
  114. que_node_list_add_last(
  115. /*===================*/
  116. /* out: one-way list of nodes */
  117. que_node_t* node_list, /* in: node list, or NULL */
  118. que_node_t* node) /* in: node */
  119. {
  120. que_common_t* cnode;
  121. que_common_t* cnode2;
  122. cnode = node;
  123. cnode->brother = NULL;
  124. if (node_list == NULL) {
  125. return(node);
  126. }
  127. cnode2 = node_list;
  128. while (cnode2->brother != NULL) {
  129. cnode2 = cnode2->brother;
  130. }
  131. cnode2->brother = node;
  132. return(node_list);
  133. }
  134. /*************************************************************************
  135. Gets the next list node in a list of query graph nodes. */
  136. UNIV_INLINE
  137. que_node_t*
  138. que_node_get_next(
  139. /*==============*/
  140. /* out: next node in a list of nodes */
  141. que_node_t* node) /* in: node in a list */
  142. {
  143. return(((que_common_t*)node)->brother);
  144. }
  145. /*************************************************************************
  146. Gets a query graph node list length. */
  147. UNIV_INLINE
  148. ulint
  149. que_node_list_get_len(
  150. /*==================*/
  151. /* out: length, for NULL list 0 */
  152. que_node_t* node_list) /* in: node list, or NULL */
  153. {
  154. que_common_t* cnode;
  155. ulint len;
  156. cnode = node_list;
  157. len = 0;
  158. while (cnode != NULL) {
  159. len++;
  160. cnode = cnode->brother;
  161. }
  162. return(len);
  163. }
  164. /*************************************************************************
  165. Gets the parent node of a query graph node. */
  166. UNIV_INLINE
  167. que_node_t*
  168. que_node_get_parent(
  169. /*================*/
  170. /* out: parent node or NULL */
  171. que_node_t* node) /* in: node */
  172. {
  173. return(((que_common_t*)node)->parent);
  174. }
  175. /**************************************************************************
  176. Checks if graph, trx, or session is in a state where the query thread should
  177. be stopped. */
  178. UNIV_INLINE
  179. ibool
  180. que_thr_peek_stop(
  181. /*==============*/
  182. /* out: TRUE if should be stopped; NOTE that
  183. if the peek is made without reserving the
  184. kernel mutex, then another peek with the
  185. mutex reserved is necessary before deciding
  186. the actual stopping */
  187. que_thr_t* thr) /* in: query thread */
  188. {
  189. trx_t* trx;
  190. que_t* graph;
  191. graph = thr->graph;
  192. trx = graph->trx;
  193. if (graph->state != QUE_FORK_ACTIVE
  194.     || trx->que_state == TRX_QUE_LOCK_WAIT
  195.     || (UT_LIST_GET_LEN(trx->signals) > 0
  196. && trx->que_state == TRX_QUE_RUNNING)) {
  197. return(TRUE);
  198. }
  199. return(FALSE);
  200. }
  201. /***************************************************************************
  202. Returns TRUE if the query graph is for a SELECT statement. */
  203. UNIV_INLINE
  204. ibool
  205. que_graph_is_select(
  206. /*================*/
  207. /* out: TRUE if a select */
  208. que_t* graph) /* in: graph */
  209. {
  210. if (graph->fork_type == QUE_FORK_SELECT_SCROLL
  211. || graph->fork_type == QUE_FORK_SELECT_NON_SCROLL) {
  212.      return(TRUE);
  213. }
  214. return(FALSE);
  215. }