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

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #ifndef ODBC_CODEGEN_Code_expr_func_hpp
  14. #define ODBC_CODEGEN_Code_expr_func_hpp
  15. #include <common/common.hpp>
  16. #include <common/DataField.hpp>
  17. #include "Code_expr.hpp"
  18. #include "Code_expr_row.hpp"
  19. /**
  20.  * @class Expr_func
  21.  * @brief Specifies a function
  22.  */
  23. struct Expr_func {
  24.     enum Code {
  25. Undef = 0,
  26. Substr,
  27. Left,
  28. Right,
  29. Count,
  30. Max,
  31. Min,
  32. Sum,
  33. Avg,
  34. Rownum,
  35. Sysdate
  36.     };
  37.     Expr_func(Code code, const char* name, bool aggr);
  38.     Code m_code;
  39.     const char* m_name;
  40.     bool m_aggr;
  41.     static const Expr_func& find(const char* name);
  42. };
  43. inline
  44. Expr_func::Expr_func(Code code, const char* name, bool aggr) :
  45.     m_code(code),
  46.     m_name(name),
  47.     m_aggr(aggr)
  48. {
  49. }
  50. /**
  51.  * @class Plan_expr_func
  52.  * @brief Function node in an expression in PlanTree
  53.  */
  54. class Plan_expr_func : public Plan_expr {
  55. public:
  56.     Plan_expr_func(Plan_root* root, const Expr_func& func);
  57.     virtual ~Plan_expr_func();
  58.     Plan_base* analyze(Ctx& ctx, Ctl& ctl);
  59.     Exec_base* codegen(Ctx& ctx, Ctl& ctl);
  60.     void print(Ctx& ctx);
  61.     bool isEqual(const Plan_expr* expr) const;
  62.     bool isGroupBy(const Plan_expr_row* row) const;
  63.     // children
  64.     void setArgs(Plan_expr_row* args);
  65. protected:
  66.     const Expr_func& m_func;
  67.     Plan_expr_row* m_args;
  68.     unsigned m_narg;
  69.     SqlType* m_conv; // temp work area
  70. };
  71. inline
  72. Plan_expr_func::Plan_expr_func(Plan_root* root, const Expr_func& func) :
  73.     Plan_expr(root, TypeFunc),
  74.     m_func(func),
  75.     m_args(0),
  76.     m_narg(0),
  77.     m_conv(0)
  78. {
  79. }
  80. inline void
  81. Plan_expr_func::setArgs(Plan_expr_row* args)
  82. {
  83.     if (args == 0) {
  84. m_args = 0;
  85. m_narg = 0;
  86.     } else {
  87. m_args = args;
  88. m_narg = m_args->getSize();
  89. delete[] m_conv;
  90. m_conv = new SqlType[1 + m_narg];
  91.     }
  92. }
  93. /**
  94.  * @class Exec_expr_func
  95.  * @brief Function node in an expression in ExecTree
  96.  */
  97. class Exec_expr_func : public Exec_expr {
  98. public:
  99.     class Code : public Exec_expr::Code {
  100.     public:
  101. Code(const Expr_func& func, const SqlSpec& spec);
  102. virtual ~Code();
  103.     protected:
  104. friend class Plan_expr_func;
  105. friend class Exec_expr_func;
  106. const Expr_func& m_func;
  107. const SqlSpec m_sqlSpec;
  108. unsigned m_narg;
  109. Exec_expr** m_args; // XXX pointers for now
  110.     };
  111.     class Data : public Exec_expr::Data {
  112.     public:
  113. Data(const SqlField& sqlField);
  114. virtual ~Data();
  115.     protected:
  116. friend class Exec_expr_func;
  117. SqlField m_sqlField;
  118. struct Acc { // accumulators etc
  119.     SqlBigint m_count; // current row count
  120.     union {
  121. SqlBigint m_bigint;
  122. SqlDouble m_double;
  123. SqlDatetime m_sysdate;
  124.     };
  125. };
  126. // group-by extra accumulators (default in entry 0)
  127. typedef std::vector<Acc> GroupAcc;
  128. GroupAcc m_groupAcc;
  129.     };
  130.     Exec_expr_func(Exec_root* root);
  131.     virtual ~Exec_expr_func();
  132.     void alloc(Ctx& ctx, Ctl& ctl);
  133.     void evaluate(Ctx& ctx, Ctl& ctl);
  134.     void close(Ctx& ctx);
  135.     void print(Ctx& ctx);
  136.     // children
  137.     const Code& getCode() const;
  138.     Data& getData() const;
  139. protected:
  140.     void init(Ctx &ctx, Ctl& ctl); // initialize values
  141. };
  142. inline
  143. Exec_expr_func::Code::Code(const Expr_func& func, const SqlSpec& sqlSpec) :
  144.     Exec_expr::Code(m_sqlSpec),
  145.     m_func(func),
  146.     m_sqlSpec(sqlSpec),
  147.     m_args(0)
  148. {
  149. }
  150. inline
  151. Exec_expr_func::Data::Data(const SqlField& sqlField) :
  152.     Exec_expr::Data(m_sqlField),
  153.     m_sqlField(sqlField),
  154.     m_groupAcc(1)
  155. {
  156. }
  157. inline
  158. Exec_expr_func::Exec_expr_func(Exec_root* root) :
  159.     Exec_expr(root)
  160. {
  161. }
  162. // children
  163. inline const Exec_expr_func::Code&
  164. Exec_expr_func::getCode() const
  165. {
  166.     const Code* code = static_cast<const Code*>(m_code);
  167.     return *code;
  168. }
  169. inline Exec_expr_func::Data&
  170. Exec_expr_func::getData() const
  171. {
  172.     Data* data = static_cast<Data*>(m_data);
  173.     return *data;
  174. }
  175. #endif