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

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_hpp
  14. #define ODBC_CODEGEN_Code_expr_hpp
  15. #include <common/common.hpp>
  16. #include <common/DataField.hpp>
  17. #include "Code_base.hpp"
  18. class Ctx;
  19. class Plan_expr_row;
  20. class Exec_expr;
  21. /**
  22.  * @class Plan_expr
  23.  * @brief Base class for expressions in PlanTree
  24.  */
  25. class Plan_expr : public Plan_base {
  26. public:
  27.     // type is convenient since RTTI cannot be used
  28.     enum Type {
  29. TypeUndefined = 0,
  30. TypeColumn,
  31. TypeConst,
  32. TypeConv,
  33. TypeFunc,
  34. TypeOp,
  35. TypeParam,
  36. TypeValue
  37.     };
  38.     Plan_expr(Plan_root* root, Type type);
  39.     virtual ~Plan_expr() = 0;
  40.     Type type() const;
  41.     const SqlType& sqlType() const; // data type set by analyze
  42.     const TableSet& tableSet() const;
  43.     const BaseString& getAlias() const;
  44.     bool isAggr() const;
  45.     bool isBound() const;
  46.     bool isAnyEqual(const Plan_expr_row* row) const;
  47.     virtual bool isEqual(const Plan_expr* expr) const;
  48.     virtual bool isGroupBy(const Plan_expr_row* row) const;
  49. protected:
  50.     friend class Plan_expr_row;
  51.     friend class Plan_expr_op;
  52.     friend class Plan_expr_func;
  53.     friend class Plan_comp_op;
  54.     const Type m_type;
  55.     SqlType m_sqlType; // subclass must set
  56.     BaseString m_alias; // for row expression alias
  57.     TableSet m_tableSet; // depends on these tables
  58.     bool m_isAggr; // contains an aggregate expression
  59.     bool m_isBound; // only constants and aggregates
  60.     Exec_expr* m_exec; // XXX wrong move
  61. };
  62. inline
  63. Plan_expr::Plan_expr(Plan_root* root, Type type) :
  64.     Plan_base(root),
  65.     m_type(type),
  66.     m_isAggr(false),
  67.     m_isBound(false),
  68.     m_exec(0)
  69. {
  70. }
  71. inline Plan_expr::Type
  72. Plan_expr::type() const
  73. {
  74.     return m_type;
  75. }
  76. inline const SqlType&
  77. Plan_expr::sqlType() const
  78. {
  79.     ctx_assert(m_sqlType.type() != SqlType::Undef);
  80.     return m_sqlType;
  81. }
  82. inline const Plan_base::TableSet&
  83. Plan_expr::tableSet() const
  84. {
  85.     return m_tableSet;
  86. }
  87. inline const BaseString&
  88. Plan_expr::getAlias() const
  89. {
  90.     return m_alias;
  91. }
  92. inline bool
  93. Plan_expr::isAggr() const
  94. {
  95.     return m_isAggr;
  96. }
  97. inline bool
  98. Plan_expr::isBound() const
  99. {
  100.     return m_isBound;
  101. }
  102. /**
  103.  * @class Exec_expr
  104.  * @brief Base class for expressions in ExecTree
  105.  */
  106. class Exec_expr : public Exec_base {
  107. public:
  108.     /**
  109.      * Exec_expr::Code includes reference to SqlSpec which
  110.      * specifies data type and access method.
  111.      */
  112.     class Code : public Exec_base::Code {
  113.     public:
  114. Code(const SqlSpec& sqlSpec);
  115. virtual ~Code() = 0;
  116. const SqlSpec& sqlSpec() const;
  117.     protected:
  118. friend class Exec_expr;
  119. const SqlSpec& m_sqlSpec; // subclass must contain
  120.     };
  121.     /**
  122.      * Exec_expr::Data includes reference to SqlField which
  123.      * contains specification and data address.
  124.      */
  125.     class Data : public Exec_base::Data {
  126.     public:
  127. Data(const SqlField& sqlField);
  128. virtual ~Data() = 0;
  129. const SqlField& sqlField() const;
  130. const SqlField& groupField(unsigned i) const;
  131.     protected:
  132. friend class Exec_expr;
  133. const SqlField& m_sqlField; // subclass must contain
  134. // group-by data
  135. typedef std::vector<SqlField> GroupField;
  136. GroupField m_groupField;
  137. SqlField& groupField(const SqlType& sqlType, unsigned i, bool initFlag);
  138.     };
  139.     Exec_expr(Exec_root* root);
  140.     virtual ~Exec_expr() = 0;
  141.     /**
  142.      * Evaluate the expression.  Must be implemented by all
  143.      * subclasses.  Check ctx.ok() for errors.
  144.      */
  145.     virtual void evaluate(Ctx& ctx, Ctl& ctl) = 0;
  146.     // children
  147.     const Code& getCode() const;
  148.     Data& getData() const;
  149. };
  150. inline
  151. Exec_expr::Code::Code(const SqlSpec& sqlSpec) :
  152.     m_sqlSpec(sqlSpec)
  153. {
  154. }
  155. inline const SqlSpec&
  156. Exec_expr::Code::sqlSpec() const {
  157.     return m_sqlSpec;
  158. }
  159. inline
  160. Exec_expr::Data::Data(const SqlField& sqlField) :
  161.     m_sqlField(sqlField)
  162. {
  163. }
  164. inline const SqlField&
  165. Exec_expr::Data::sqlField() const
  166. {
  167.     return m_sqlField;
  168. }
  169. inline const SqlField&
  170. Exec_expr::Data::groupField(unsigned i) const
  171. {
  172.     ctx_assert(i != 0 && i < m_groupField.size());
  173.     return m_groupField[i];
  174. }
  175. inline
  176. Exec_expr::Exec_expr(Exec_root* root) :
  177.     Exec_base(root)
  178. {
  179. }
  180. // children
  181. inline const Exec_expr::Code&
  182. Exec_expr::getCode() const
  183. {
  184.     const Code* code = static_cast<const Code*>(m_code);
  185.     return *code;
  186. }
  187. inline Exec_expr::Data&
  188. Exec_expr::getData() const
  189. {
  190.     Data* data = static_cast<Data*>(m_data);
  191.     return *data;
  192. }
  193. #endif