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

MySQL数据库

开发平台:

Visual C++

  1. /******************************************************
  2. SQL evaluator: evaluates simple data structures, like expressions, in
  3. a query graph
  4. (c) 1997 Innobase Oy
  5. Created 12/29/1997 Heikki Tuuri
  6. *******************************************************/
  7. #include "que0que.h"
  8. #include "rem0cmp.h"
  9. #include "pars0grm.h"
  10. /*********************************************************************
  11. Evaluates a function node. */
  12. void
  13. eval_func(
  14. /*======*/
  15. func_node_t* func_node); /* in: function node */
  16. /*********************************************************************
  17. Allocate a buffer from global dynamic memory for a value of a que_node.
  18. NOTE that this memory must be explicitly freed when the query graph is
  19. freed. If the node already has allocated buffer, that buffer is freed
  20. here. NOTE that this is the only function where dynamic memory should be
  21. allocated for a query node val field. */
  22. byte*
  23. eval_node_alloc_val_buf(
  24. /*====================*/
  25. /* out: pointer to allocated buffer */
  26. que_node_t* node, /* in: query graph node; sets the val field
  27. data field to point to the new buffer, and
  28. len field equal to size */
  29. ulint size); /* in: buffer size */
  30. /*********************************************************************
  31. Allocates a new buffer if needed. */
  32. UNIV_INLINE
  33. byte*
  34. eval_node_ensure_val_buf(
  35. /*=====================*/
  36. /* out: pointer to buffer */
  37. que_node_t* node, /* in: query graph node; sets the val field
  38. data field to point to the new buffer, and
  39. len field equal to size */
  40. ulint size) /* in: buffer size */
  41. {
  42. dfield_t* dfield;
  43. byte* data;
  44. dfield = que_node_get_val(node);
  45. dfield_set_len(dfield, size);
  46. data = dfield_get_data(dfield);
  47. if (!data || que_node_get_val_buf_size(node) < size) {
  48. data = eval_node_alloc_val_buf(node, size);
  49. }
  50. return(data);
  51. }
  52. /*********************************************************************
  53. Evaluates a symbol table symbol. */
  54. UNIV_INLINE
  55. void
  56. eval_sym(
  57. /*=====*/
  58. sym_node_t* sym_node) /* in: symbol table node */
  59. {
  60. ut_ad(que_node_get_type(sym_node) == QUE_NODE_SYMBOL);
  61. if (sym_node->indirection) {
  62. /* The symbol table node is an alias for a variable or a
  63. column */
  64. dfield_copy_data(que_node_get_val(sym_node),
  65.    que_node_get_val(sym_node->indirection));
  66. }
  67. }
  68. /*********************************************************************
  69. Evaluates an expression. */
  70. UNIV_INLINE
  71. void
  72. eval_exp(
  73. /*=====*/
  74. que_node_t* exp_node) /* in: expression */
  75. {
  76. if (que_node_get_type(exp_node) == QUE_NODE_SYMBOL) {
  77. eval_sym((sym_node_t*)exp_node);
  78. return;
  79. }
  80. eval_func(exp_node);
  81. }
  82. /*********************************************************************
  83. Sets an integer value as the value of an expression node. */
  84. UNIV_INLINE
  85. void
  86. eval_node_set_int_val(
  87. /*==================*/
  88. que_node_t* node, /* in: expression node */
  89. lint val) /* in: value to set */
  90. {
  91. dfield_t* dfield;
  92. byte* data;
  93. dfield = que_node_get_val(node);
  94. data = dfield_get_data(dfield);
  95. if (data == NULL) {
  96. data = eval_node_alloc_val_buf(node, 4);
  97. }
  98. ut_ad(dfield_get_len(dfield) == 4);
  99. mach_write_to_4(data, (ulint)val);
  100. }
  101. /*********************************************************************
  102. Gets an integer non-SQL null value from an expression node. */
  103. UNIV_INLINE
  104. lint
  105. eval_node_get_int_val(
  106. /*==================*/
  107. /* out: integer value */
  108. que_node_t* node) /* in: expression node */
  109. {
  110. dfield_t* dfield;
  111. dfield = que_node_get_val(node);
  112. ut_ad(dfield_get_len(dfield) == 4);
  113. return((int)mach_read_from_4(dfield_get_data(dfield)));
  114. }
  115. /*********************************************************************
  116. Gets a iboolean value from a query node. */
  117. UNIV_INLINE
  118. ibool
  119. eval_node_get_ibool_val(
  120. /*===================*/
  121. /* out: iboolean value */
  122. que_node_t* node) /* in: query graph node */
  123. {
  124. dfield_t* dfield;
  125. byte* data;
  126. dfield = que_node_get_val(node);
  127. data = dfield_get_data(dfield);
  128. ut_ad(data != NULL);
  129. return(mach_read_from_1(data));
  130. }
  131. /*********************************************************************
  132. Sets a iboolean value as the value of a function node. */
  133. UNIV_INLINE
  134. void
  135. eval_node_set_ibool_val(
  136. /*===================*/
  137. func_node_t* func_node, /* in: function node */
  138. ibool val) /* in: value to set */
  139. {
  140. dfield_t* dfield;
  141. byte* data;
  142. dfield = que_node_get_val(func_node);
  143. data = dfield_get_data(dfield);
  144. if (data == NULL) {
  145. /* Allocate 1 byte to hold the value */
  146. data = eval_node_alloc_val_buf(func_node, 1);
  147. }
  148. ut_ad(dfield_get_len(dfield) == 1);
  149. mach_write_to_1(data, val);
  150. }
  151. /*********************************************************************
  152. Copies a binary string value as the value of a query graph node. Allocates a
  153. new buffer if necessary. */
  154. UNIV_INLINE
  155. void
  156. eval_node_copy_and_alloc_val(
  157. /*=========================*/
  158. que_node_t* node, /* in: query graph node */
  159. byte* str, /* in: binary string */
  160. ulint len) /* in: string length or UNIV_SQL_NULL */
  161. {
  162. byte* data;
  163. ut_ad(UNIV_SQL_NULL > ULINT_MAX);
  164. if (len == UNIV_SQL_NULL) {
  165. dfield_set_len(que_node_get_val(node), len);
  166. return;
  167. }
  168. data = eval_node_ensure_val_buf(node, len);
  169. ut_memcpy(data, str, len);
  170. }
  171. /*********************************************************************
  172. Copies a query node value to another node. */
  173. UNIV_INLINE
  174. void
  175. eval_node_copy_val(
  176. /*===============*/
  177. que_node_t* node1, /* in: node to copy to */
  178. que_node_t* node2) /* in: node to copy from */
  179. {
  180. dfield_t* dfield2;
  181. dfield2 = que_node_get_val(node2);
  182. eval_node_copy_and_alloc_val(node1, dfield_get_data(dfield2),
  183. dfield_get_len(dfield2));
  184. }