pars0sym.h
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:6k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /******************************************************
  2. SQL parser symbol table
  3. (c) 1997 Innobase Oy
  4. Created 12/15/1997 Heikki Tuuri
  5. *******************************************************/
  6. #ifndef pars0sym_h
  7. #define pars0sym_h
  8. #include "univ.i"
  9. #include "que0types.h"
  10. #include "usr0types.h"
  11. #include "dict0types.h"
  12. #include "pars0types.h"
  13. #include "row0types.h"
  14. /**********************************************************************
  15. Creates a symbol table for a single stored procedure or query. */
  16. sym_tab_t*
  17. sym_tab_create(
  18. /*===========*/
  19. /* out, own: symbol table */
  20. mem_heap_t* heap); /* in: memory heap where to create */
  21. /**********************************************************************
  22. Frees the memory allocated dynamically AFTER parsing phase for variables
  23. etc. in the symbol table. Does not free the mem heap where the table was
  24. originally created. Frees also SQL explicit cursor definitions. */
  25. void
  26. sym_tab_free_private(
  27. /*=================*/
  28. sym_tab_t* sym_tab); /* in, own: symbol table */
  29. /**********************************************************************
  30. Adds an integer literal to a symbol table. */
  31. sym_node_t*
  32. sym_tab_add_int_lit(
  33. /*================*/
  34. /* out: symbol table node */
  35. sym_tab_t* sym_tab, /* in: symbol table */
  36. ulint val); /* in: integer value */
  37. /**********************************************************************
  38. Adds an string literal to a symbol table. */
  39. sym_node_t*
  40. sym_tab_add_str_lit(
  41. /*================*/
  42. /* out: symbol table node */
  43. sym_tab_t* sym_tab, /* in: symbol table */
  44. byte* str, /* in: string with no quotes around
  45. it */
  46. ulint len); /* in: string length */
  47. /**********************************************************************
  48. Adds an SQL null literal to a symbol table. */
  49. sym_node_t*
  50. sym_tab_add_null_lit(
  51. /*=================*/
  52. /* out: symbol table node */
  53. sym_tab_t* sym_tab); /* in: symbol table */
  54. /**********************************************************************
  55. Adds an identifier to a symbol table. */
  56. sym_node_t*
  57. sym_tab_add_id(
  58. /*===========*/
  59. /* out: symbol table node */
  60. sym_tab_t* sym_tab, /* in: symbol table */
  61. byte* name, /* in: identifier name */
  62. ulint len); /* in: identifier length */
  63. #define SYM_CLUST_FIELD_NO 0
  64. #define SYM_SEC_FIELD_NO 1
  65. struct sym_node_struct{
  66. que_common_t common; /* node type:
  67. QUE_NODE_SYMBOL */
  68. /* NOTE: if the data field in 'common.val' is not NULL and the symbol
  69. table node is not for a temporary column, the memory for the value has
  70. been allocated from dynamic memory and it should be freed when the
  71. symbol table is discarded */
  72. sym_node_t* indirection; /* pointer to
  73. another symbol table
  74. node which contains
  75. the value for this
  76. node, NULL otherwise */
  77. sym_node_t* alias; /* pointer to
  78. another symbol table
  79. node for which this
  80. node is an alias,
  81. NULL otherwise */
  82. UT_LIST_NODE_T(sym_node_t) col_var_list; /* list of table
  83. columns or a list of
  84. input variables for an
  85. explicit cursor */
  86. ibool copy_val; /* TRUE if a column
  87. and its value should
  88. be copied to dynamic
  89. memory when fetched */
  90. ulint field_nos[2]; /* if a column, in
  91. the position
  92. SYM_CLUST_FIELD_NO is
  93. the field number in the
  94. clustered index; in
  95. the position
  96. SYM_SEC_FIELD_NO
  97. the field number in the
  98. non-clustered index to
  99. use first; if not found
  100. from the index, then
  101. ULINT_UNDEFINED */
  102. ibool resolved; /* TRUE if the
  103. meaning of a variable
  104. or a column has been
  105. resolved; for literals
  106. this is always TRUE */
  107. ulint token_type; /* SYM_VAR, SYM_COLUMN,
  108. SYM_IMPLICIT_VAR,
  109. SYM_LIT, SYM_TABLE,
  110. SYM_CURSOR, ... */
  111. char* name; /* name of an id */
  112. ulint name_len; /* id name length */
  113. dict_table_t* table; /* table definition
  114. if a table id or a
  115. column id */
  116. dict_proc_t* procedure_def; /* stored procedure
  117. definition, if a
  118. stored procedure name */
  119. ulint col_no; /* column number if a
  120. column */
  121. sel_buf_t* prefetch_buf; /* NULL, or a buffer
  122. for cached column
  123. values for prefetched
  124. rows */
  125. sel_node_t* cursor_def; /* cursor definition
  126. select node if a
  127. named cursor */
  128. ulint param_type; /* PARS_INPUT,
  129. PARS_OUTPUT, or
  130. PARS_NOT_PARAM if not a
  131. procedure parameter */
  132. sym_tab_t* sym_table; /* back pointer to
  133. the symbol table */
  134. UT_LIST_NODE_T(sym_node_t) sym_list; /* list of symbol
  135. nodes */
  136. };
  137. struct sym_tab_struct{
  138. que_t* query_graph;
  139. /* query graph generated by the
  140. parser */
  141. char* sql_string;
  142. /* SQL string to parse */
  143. int string_len;
  144. /* SQL string length */
  145. int next_char_pos;
  146. /* position of the next character in
  147. sql_string to give to the lexical
  148. analyzer */
  149. sym_node_list_t sym_list;
  150. /* list of symbol nodes in the symbol
  151. table */
  152. UT_LIST_BASE_NODE_T(func_node_t)
  153. func_node_list;
  154. /* list of function nodes in the
  155. parsed query graph */
  156. mem_heap_t* heap; /* memory heap from which we can
  157. allocate space */
  158. };
  159. /* Types of a symbol table entry */
  160. #define SYM_VAR 91 /* declared parameter or local
  161. variable of a procedure */
  162. #define SYM_IMPLICIT_VAR 92 /* storage for a intermediate result
  163. of a calculation */
  164. #define SYM_LIT 93 /* literal */
  165. #define SYM_TABLE 94 /* database table name */
  166. #define SYM_COLUMN 95 /* database table name */
  167. #define SYM_CURSOR 96 /* named cursor */
  168. #define SYM_PROCEDURE_NAME 97 /* stored procedure name */
  169. #define SYM_INDEX 98 /* database index name */
  170. #ifndef UNIV_NONINL
  171. #include "pars0sym.ic"
  172. #endif
  173. #endif