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

MySQL数据库

开发平台:

Visual C++

  1. /******************************************************
  2. Select
  3. (c) 1997 Innobase Oy
  4. Created 12/19/1997 Heikki Tuuri
  5. *******************************************************/
  6. #ifndef row0sel_h
  7. #define row0sel_h
  8. #include "univ.i"
  9. #include "data0data.h"
  10. #include "que0types.h"
  11. #include "dict0types.h"
  12. #include "trx0types.h"
  13. #include "row0types.h"
  14. #include "que0types.h"
  15. #include "pars0sym.h"
  16. #include "btr0pcur.h"
  17. #include "read0read.h"
  18. #include "row0mysql.h"
  19. /*************************************************************************
  20. Creates a select node struct. */
  21. sel_node_t*
  22. sel_node_create(
  23. /*============*/
  24. /* out, own: select node struct */
  25. mem_heap_t* heap); /* in: memory heap where created */
  26. /*************************************************************************
  27. Frees the memory private to a select node when a query graph is freed,
  28. does not free the heap where the node was originally created. */
  29. void
  30. sel_node_free_private(
  31. /*==================*/
  32. sel_node_t* node); /* in: select node struct */
  33. /*************************************************************************
  34. Frees a prefetch buffer for a column, including the dynamically allocated
  35. memory for data stored there. */
  36. void
  37. sel_col_prefetch_buf_free(
  38. /*======================*/
  39. sel_buf_t* prefetch_buf); /* in, own: prefetch buffer */
  40. /*************************************************************************
  41. Gets the plan node for the nth table in a join. */
  42. UNIV_INLINE
  43. plan_t*
  44. sel_node_get_nth_plan(
  45. /*==================*/
  46. sel_node_t* node,
  47. ulint i);
  48. /**************************************************************************
  49. Performs a select step. This is a high-level function used in SQL execution
  50. graphs. */
  51. que_thr_t*
  52. row_sel_step(
  53. /*=========*/
  54. /* out: query thread to run next or NULL */
  55. que_thr_t* thr); /* in: query thread */
  56. /**************************************************************************
  57. Performs an execution step of an open or close cursor statement node. */
  58. UNIV_INLINE
  59. que_thr_t*
  60. open_step(
  61. /*======*/
  62. /* out: query thread to run next or NULL */
  63. que_thr_t* thr); /* in: query thread */
  64. /**************************************************************************
  65. Performs a fetch for a cursor. */
  66. que_thr_t*
  67. fetch_step(
  68. /*=======*/
  69. /* out: query thread to run next or NULL */
  70. que_thr_t* thr); /* in: query thread */
  71. /***************************************************************
  72. Prints a row in a select result. */
  73. que_thr_t*
  74. row_printf_step(
  75. /*============*/
  76. /* out: query thread to run next or NULL */
  77. que_thr_t* thr); /* in: query thread */
  78. /********************************************************************
  79. Converts a key value stored in MySQL format to an Innobase dtuple. The last
  80. field of the key value may be just a prefix of a fixed length field: hence
  81. the parameter key_len. But currently we do not allow search keys where the
  82. last field is only a prefix of the full key field len and print a warning if
  83. such appears. */
  84. void
  85. row_sel_convert_mysql_key_to_innobase(
  86. /*==================================*/
  87. dtuple_t* tuple, /* in: tuple where to build;
  88. NOTE: we assume that the type info
  89. in the tuple is already according
  90. to index! */
  91. byte* buf, /* in: buffer to use in field
  92. conversions */
  93. ulint buf_len, /* in: buffer length */
  94. dict_index_t* index, /* in: index of the key value */
  95. byte* key_ptr, /* in: MySQL key value */
  96. ulint key_len, /* in: MySQL key value length */
  97. trx_t* trx); /* in: transaction */
  98. /************************************************************************
  99. Searches for rows in the database. This is used in the interface to
  100. MySQL. This function opens a cursor, and also implements fetch next
  101. and fetch prev. NOTE that if we do a search with a full key value
  102. from a unique index (ROW_SEL_EXACT), then we will not store the cursor
  103. position and fetch next or fetch prev must not be tried to the cursor! */
  104. ulint
  105. row_search_for_mysql(
  106. /*=================*/
  107. /* out: DB_SUCCESS,
  108. DB_RECORD_NOT_FOUND, 
  109. DB_END_OF_INDEX, DB_DEADLOCK,
  110. DB_LOCK_TABLE_FULL,
  111. or DB_TOO_BIG_RECORD */
  112. byte* buf, /* in/out: buffer for the fetched
  113. row in the MySQL format */
  114. ulint mode, /* in: search mode PAGE_CUR_L, ... */
  115. row_prebuilt_t* prebuilt, /* in: prebuilt struct for the
  116. table handle; this contains the info
  117. of search_tuple, index; if search
  118. tuple contains 0 fields then we
  119. position the cursor at the start or
  120. the end of the index, depending on
  121. 'mode' */
  122. ulint match_mode, /* in: 0 or ROW_SEL_EXACT or
  123. ROW_SEL_EXACT_PREFIX */ 
  124. ulint direction); /* in: 0 or ROW_SEL_NEXT or
  125. ROW_SEL_PREV; NOTE: if this is != 0,
  126. then prebuilt must have a pcur
  127. with stored position! In opening of a
  128. cursor 'direction' should be 0. */
  129. /***********************************************************************
  130. Checks if MySQL at the moment is allowed for this table to retrieve a
  131. consistent read result, or store it to the query cache. */
  132. ibool
  133. row_search_check_if_query_cache_permitted(
  134. /*======================================*/
  135. /* out: TRUE if storing or retrieving
  136. from the query cache is permitted */
  137. trx_t* trx, /* in: transaction object */
  138. const char* norm_name); /* in: concatenation of database name,
  139. '/' char, table name */
  140. /* A structure for caching column values for prefetched rows */
  141. struct sel_buf_struct{
  142. byte* data; /* data, or NULL; if not NULL, this field
  143. has allocated memory which must be explicitly
  144. freed; can be != NULL even when len is
  145. UNIV_SQL_NULL */
  146. ulint len; /* data length or UNIV_SQL_NULL */
  147. ulint val_buf_size;
  148. /* size of memory buffer allocated for data:
  149. this can be more than len; this is defined
  150. when data != NULL */
  151. };
  152. struct plan_struct{
  153. dict_table_t* table; /* table struct in the dictionary
  154. cache */
  155. dict_index_t* index; /* table index used in the search */
  156. btr_pcur_t pcur; /* persistent cursor used to search
  157. the index */
  158. ibool asc; /* TRUE if cursor traveling upwards */
  159. ibool pcur_is_open; /* TRUE if pcur has been positioned
  160. and we can try to fetch new rows */
  161. ibool cursor_at_end; /* TRUE if the cursor is open but
  162. we know that there are no more
  163. qualifying rows left to retrieve from
  164. the index tree; NOTE though, that
  165. there may still be unprocessed rows in
  166. the prefetch stack; always FALSE when
  167. pcur_is_open is FALSE */
  168. ibool stored_cursor_rec_processed;
  169. /* TRUE if the pcur position has been
  170. stored and the record it is positioned
  171. on has already been processed */
  172. que_node_t** tuple_exps; /* array of expressions which are used
  173. to calculate the field values in the
  174. search tuple: there is one expression
  175. for each field in the search tuple */
  176. dtuple_t* tuple; /* search tuple */
  177. ulint mode; /* search mode: PAGE_CUR_G, ... */
  178. ulint n_exact_match; /* number of first fields in the search
  179. tuple which must be exactly matched */
  180. ibool unique_search; /* TRUE if we are searching an
  181. index record with a unique key */
  182. ulint n_rows_fetched; /* number of rows fetched using pcur
  183. after it was opened */
  184. ulint n_rows_prefetched;/* number of prefetched rows cached
  185. for fetch: fetching several rows in
  186. the same mtr saves CPU time */
  187. ulint first_prefetched;/* index of the first cached row in
  188. select buffer arrays for each column */
  189. ibool no_prefetch; /* no prefetch for this table */
  190. ibool mixed_index; /* TRUE if index is a clustered index
  191. in a mixed cluster */
  192. sym_node_list_t columns; /* symbol table nodes for the columns
  193. to retrieve from the table */
  194. UT_LIST_BASE_NODE_T(func_node_t)
  195. end_conds; /* conditions which determine the
  196. fetch limit of the index segment we
  197. have to look at: when one of these
  198. fails, the result set has been
  199. exhausted for the cursor in this
  200. index; these conditions are normalized
  201. so that in a comparison the column
  202. for this table is the first argument */
  203. UT_LIST_BASE_NODE_T(func_node_t)
  204. other_conds; /* the rest of search conditions we can
  205. test at this table in a join */
  206. ibool must_get_clust; /* TRUE if index is a non-clustered
  207. index and we must also fetch the
  208. clustered index record; this is the
  209. case if the non-clustered record does
  210. not contain all the needed columns, or
  211. if this is a single-table explicit
  212. cursor, or a searched update or
  213. delete */
  214. ulint* clust_map; /* map telling how clust_ref is built
  215. from the fields of a non-clustered
  216. record */
  217. dtuple_t* clust_ref; /* the reference to the clustered
  218. index entry is built here if index is
  219. a non-clustered index */
  220. btr_pcur_t clust_pcur; /* if index is non-clustered, we use
  221. this pcur to search the clustered
  222. index */
  223. mem_heap_t* old_vers_heap; /* memory heap used in building an old
  224. version of a row, or NULL */
  225. };
  226. struct sel_node_struct{
  227. que_common_t common; /* node type: QUE_NODE_SELECT */
  228. ulint state; /* node state */
  229. que_node_t* select_list; /* select list */
  230. sym_node_t* into_list; /* variables list or NULL */
  231. sym_node_t* table_list; /* table list */
  232. ibool asc; /* TRUE if the rows should be fetched
  233. in an ascending order */
  234. ibool set_x_locks; /* TRUE if the cursor is for update or
  235. delete, which means that a row x-lock
  236. should be placed on the cursor row */
  237. ibool select_will_do_update;
  238. /* TRUE if the select is for a searched
  239. update which can be performed in-place:
  240. in this case the select will take care
  241. of the update */
  242. ulint latch_mode; /* BTR_SEARCH_LEAF, or BTR_MODIFY_LEAF
  243. if select_will_do_update is TRUE */
  244. ulint row_lock_mode; /* LOCK_X or LOCK_S */
  245. ulint n_tables; /* number of tables */
  246. ulint fetch_table; /* number of the next table to access
  247. in the join */
  248. plan_t* plans; /* array of n_tables many plan nodes
  249. containing the search plan and the
  250. search data structures */
  251. que_node_t* search_cond; /* search condition */
  252. read_view_t* read_view; /* if the query is a non-locking
  253. consistent read, its read view is
  254. placed here, otherwise NULL */
  255. ibool consistent_read;/* TRUE if the select is a consistent,
  256. non-locking read */
  257. order_node_t* order_by; /* order by column definition, or
  258. NULL */
  259. ibool is_aggregate; /* TRUE if the select list consists of
  260. aggregate functions */
  261. ibool aggregate_already_fetched;
  262. /* TRUE if the aggregate row has
  263. already been fetched for the current
  264. cursor */
  265. ibool can_get_updated;/* this is TRUE if the select is in a
  266. single-table explicit cursor which can
  267. get updated within the stored procedure,
  268. or in a searched update or delete;
  269. NOTE that to determine of an explicit
  270. cursor if it can get updated, the
  271. parser checks from a stored procedure
  272. if it contains positioned update or
  273. delete statements */
  274. sym_node_t* explicit_cursor;/* not NULL if an explicit cursor */
  275. UT_LIST_BASE_NODE_T(sym_node_t)
  276. copy_variables; /* variables whose values we have to
  277. copy when an explicit cursor is opened,
  278. so that they do not change between
  279. fetches */
  280. };
  281. /* Select node states */
  282. #define SEL_NODE_CLOSED 0 /* it is a declared cursor which is not
  283. currently open */
  284. #define SEL_NODE_OPEN 1 /* intention locks not yet set on
  285. tables */
  286. #define SEL_NODE_FETCH 2 /* intention locks have been set */
  287. #define SEL_NODE_NO_MORE_ROWS 3 /* cursor has reached the result set
  288. end */
  289. /* Fetch statement node */
  290. struct fetch_node_struct{
  291. que_common_t common; /* type: QUE_NODE_FETCH */
  292. sel_node_t* cursor_def; /* cursor definition */
  293. sym_node_t* into_list; /* variables to set */
  294. };
  295. /* Open or close cursor statement node */
  296. struct open_node_struct{
  297. que_common_t common; /* type: QUE_NODE_OPEN */
  298. ulint op_type; /* ROW_SEL_OPEN_CURSOR or
  299. ROW_SEL_CLOSE_CURSOR */
  300. sel_node_t* cursor_def; /* cursor definition */
  301. };
  302. /* Row printf statement node */
  303. struct row_printf_node_struct{
  304. que_common_t common; /* type: QUE_NODE_ROW_PRINTF */
  305. sel_node_t* sel_node; /* select */
  306. };
  307. #define ROW_SEL_OPEN_CURSOR 0
  308. #define ROW_SEL_CLOSE_CURSOR 1
  309. /* Flags for the MySQL interface */
  310. #define ROW_SEL_NEXT 1
  311. #define ROW_SEL_PREV 2
  312. #define ROW_SEL_EXACT 1 /* search using a complete key value */
  313. #define ROW_SEL_EXACT_PREFIX  2 /* search using a key prefix which
  314. must match to rows: the prefix may
  315. contain an incomplete field (the
  316. last field in prefix may be just
  317. a prefix of a fixed length column) */
  318. #ifndef UNIV_NONINL
  319. #include "row0sel.ic"
  320. #endif
  321. #endif