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

MySQL数据库

开发平台:

Visual C++

  1. /******************************************************
  2. SQL parser symbol table
  3. (c) 1997 Innobase Oy
  4. Created 12/15/1997 Heikki Tuuri
  5. *******************************************************/
  6. #include "pars0sym.h"
  7. #ifdef UNIV_NONINL
  8. #include "pars0sym.ic"
  9. #endif
  10. #include "mem0mem.h"
  11. #include "data0type.h"
  12. #include "data0data.h"
  13. #include "pars0pars.h"
  14. #include "que0que.h"
  15. #include "eval0eval.h"
  16. #include "row0sel.h"
  17. /**********************************************************************
  18. Creates a symbol table for a single stored procedure or query. */
  19. sym_tab_t*
  20. sym_tab_create(
  21. /*===========*/
  22. /* out, own: symbol table */
  23. mem_heap_t* heap) /* in: memory heap where to create */
  24. {
  25. sym_tab_t* sym_tab;
  26. sym_tab = mem_heap_alloc(heap, sizeof(sym_tab_t));
  27. UT_LIST_INIT(sym_tab->sym_list);
  28. UT_LIST_INIT(sym_tab->func_node_list);
  29. sym_tab->heap = heap;
  30. return(sym_tab);
  31. }
  32. /**********************************************************************
  33. Frees the memory allocated dynamically AFTER parsing phase for variables
  34. etc. in the symbol table. Does not free the mem heap where the table was
  35. originally created. Frees also SQL explicit cursor definitions. */
  36. void
  37. sym_tab_free_private(
  38. /*=================*/
  39. sym_tab_t* sym_tab) /* in, own: symbol table */
  40. {
  41. sym_node_t* sym;
  42. func_node_t* func;
  43. sym = UT_LIST_GET_FIRST(sym_tab->sym_list);
  44. while (sym) {
  45. eval_node_free_val_buf(sym);
  46. if (sym->prefetch_buf) {
  47. sel_col_prefetch_buf_free(sym->prefetch_buf);
  48. }
  49. if (sym->cursor_def) {
  50. que_graph_free_recursive(sym->cursor_def);
  51. }
  52. sym = UT_LIST_GET_NEXT(sym_list, sym);
  53. }
  54. func = UT_LIST_GET_FIRST(sym_tab->func_node_list);
  55. while (func) {
  56. eval_node_free_val_buf(func);
  57. func = UT_LIST_GET_NEXT(func_node_list, func);
  58. }
  59. }
  60. /**********************************************************************
  61. Adds an integer literal to a symbol table. */
  62. sym_node_t*
  63. sym_tab_add_int_lit(
  64. /*================*/
  65. /* out: symbol table node */
  66. sym_tab_t* sym_tab, /* in: symbol table */
  67. ulint val) /* in: integer value */
  68. {
  69. sym_node_t* node;
  70. byte* data;
  71. node = mem_heap_alloc(sym_tab->heap, sizeof(sym_node_t));
  72. node->common.type = QUE_NODE_SYMBOL;
  73. node->resolved = TRUE;
  74. node->token_type = SYM_LIT;
  75. node->indirection = NULL;
  76. dtype_set(&(node->common.val.type), DATA_INT, 0, 4, 0);
  77. data = mem_heap_alloc(sym_tab->heap, 4);
  78. mach_write_to_4(data, val);
  79. dfield_set_data(&(node->common.val), data, 4);
  80. node->common.val_buf_size = 0;
  81. node->prefetch_buf = NULL;
  82. node->cursor_def = NULL;
  83. UT_LIST_ADD_LAST(sym_list, sym_tab->sym_list, node);
  84. node->sym_table = sym_tab;
  85. return(node);
  86. }
  87. /**********************************************************************
  88. Adds a string literal to a symbol table. */
  89. sym_node_t*
  90. sym_tab_add_str_lit(
  91. /*================*/
  92. /* out: symbol table node */
  93. sym_tab_t* sym_tab, /* in: symbol table */
  94. byte* str, /* in: string with no quotes around
  95. it */
  96. ulint len) /* in: string length */
  97. {
  98. sym_node_t* node;
  99. byte* data;
  100. node = mem_heap_alloc(sym_tab->heap, sizeof(sym_node_t));
  101. node->common.type = QUE_NODE_SYMBOL;
  102. node->resolved = TRUE;
  103. node->token_type = SYM_LIT;
  104. node->indirection = NULL;
  105. dtype_set(&(node->common.val.type), DATA_VARCHAR, DATA_ENGLISH, 0, 0);
  106. if (len) {
  107. data = mem_heap_alloc(sym_tab->heap, len);
  108. ut_memcpy(data, str, len);
  109. } else {
  110. data = NULL;
  111. }
  112. dfield_set_data(&(node->common.val), data, len);
  113. node->common.val_buf_size = 0;
  114. node->prefetch_buf = NULL;
  115. node->cursor_def = NULL;
  116. UT_LIST_ADD_LAST(sym_list, sym_tab->sym_list, node);
  117. node->sym_table = sym_tab;
  118. return(node);
  119. }
  120. /**********************************************************************
  121. Adds an SQL null literal to a symbol table. */
  122. sym_node_t*
  123. sym_tab_add_null_lit(
  124. /*=================*/
  125. /* out: symbol table node */
  126. sym_tab_t* sym_tab) /* in: symbol table */
  127. {
  128. sym_node_t* node;
  129. node = mem_heap_alloc(sym_tab->heap, sizeof(sym_node_t));
  130. node->common.type = QUE_NODE_SYMBOL;
  131. node->resolved = TRUE;
  132. node->token_type = SYM_LIT;
  133. node->indirection = NULL;
  134. node->common.val.type.mtype = DATA_ERROR;
  135. dfield_set_data(&(node->common.val), NULL, UNIV_SQL_NULL);
  136. node->common.val_buf_size = 0;
  137. node->prefetch_buf = NULL;
  138. node->cursor_def = NULL;
  139. UT_LIST_ADD_LAST(sym_list, sym_tab->sym_list, node);
  140. node->sym_table = sym_tab;
  141. return(node);
  142. }
  143. /**********************************************************************
  144. Adds an identifier to a symbol table. */
  145. sym_node_t*
  146. sym_tab_add_id(
  147. /*===========*/
  148. /* out: symbol table node */
  149. sym_tab_t* sym_tab, /* in: symbol table */
  150. byte* name, /* in: identifier name */
  151. ulint len) /* in: identifier length */
  152. {
  153. sym_node_t* node;
  154. node = mem_heap_alloc(sym_tab->heap, sizeof(sym_node_t));
  155. node->common.type = QUE_NODE_SYMBOL;
  156. node->resolved = FALSE;
  157. node->indirection = NULL;
  158. node->name = mem_heap_strdupl(sym_tab->heap, name, len + 1);
  159. node->name_len = len;
  160. UT_LIST_ADD_LAST(sym_list, sym_tab->sym_list, node);
  161. dfield_set_data(&(node->common.val), NULL, UNIV_SQL_NULL);
  162. node->common.val_buf_size = 0;
  163. node->prefetch_buf = NULL;
  164. node->cursor_def = NULL;
  165. node->sym_table = sym_tab;
  166. return(node);
  167. }