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

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_pred_op_hpp
  14. #define ODBC_CODEGEN_Code_pred_op_hpp
  15. #include <common/common.hpp>
  16. #include <common/DataField.hpp>
  17. #include "Code_pred.hpp"
  18. /**
  19.  * @class Pred_op
  20.  * @brief Boolean operators
  21.  */
  22. struct Pred_op {
  23.     enum Opcode {
  24. And = 1, // binary
  25. Or,
  26. Not // unary
  27.     };
  28.     Pred_op(Opcode opcode);
  29.     const char* name() const;
  30.     unsigned arity() const;
  31.     Opcode m_opcode;
  32. };
  33. inline
  34. Pred_op::Pred_op(Opcode opcode) :
  35.     m_opcode(opcode)
  36. {
  37. }
  38. /**
  39.  * @class Plan_pred_op
  40.  * @brief Operator node in a predicate in PlanTree
  41.  */
  42. class Plan_pred_op : public Plan_pred {
  43. public:
  44.     Plan_pred_op(Plan_root* root, Pred_op op);
  45.     virtual ~Plan_pred_op();
  46.     Plan_base* analyze(Ctx& ctx, Ctl& ctl);
  47.     Exec_base* codegen(Ctx& ctx, Ctl& ctl);
  48.     void print(Ctx& ctx);
  49.     bool isGroupBy(const Plan_expr_row* row) const;
  50.     // children
  51.     void setPred(unsigned i, Plan_pred* pred);
  52. protected:
  53.     friend class Plan_pred;
  54.     Pred_op m_op;
  55.     Plan_pred* m_pred[1 + 2];
  56. };
  57. inline
  58. Plan_pred_op::Plan_pred_op(Plan_root* root, Pred_op op) :
  59.     Plan_pred(root, TypeOp),
  60.     m_op(op)
  61. {
  62.     m_pred[0] = m_pred[1] = m_pred[2] = 0;
  63. }
  64. inline void
  65. Plan_pred_op::setPred(unsigned i, Plan_pred* pred)
  66. {
  67.     ctx_assert(1 <= i && i <= m_op.arity() && pred != 0);
  68.     m_pred[i] = pred;
  69. }
  70. /**
  71.  * @class Exec_pred_op
  72.  * @brief Operator node in a predicate in ExecTree
  73.  */
  74. class Exec_pred_op : public Exec_pred {
  75. public:
  76.     class Code : public Exec_pred::Code {
  77.     public:
  78. Code(Pred_op op);
  79. virtual ~Code();
  80.     protected:
  81. friend class Exec_pred_op;
  82. Pred_op m_op;
  83.     };
  84.     class Data : public Exec_pred::Data {
  85.     public:
  86. Data();
  87. virtual ~Data();
  88.     protected:
  89. friend class Exec_pred_op;
  90.     };
  91.     Exec_pred_op(Exec_root* root);
  92.     virtual ~Exec_pred_op();
  93.     void alloc(Ctx& ctx, Ctl& ctl);
  94.     void execInterp(Ctx& ctx, Ctl& ctl);
  95.     void evaluate(Ctx& ctx, Ctl& ctl);
  96.     void close(Ctx& ctx);
  97.     void print(Ctx& ctx);
  98.     // children
  99.     const Code& getCode() const;
  100.     Data& getData() const;
  101.     void setPred(unsigned i, Exec_pred* pred);
  102. protected:
  103.     Exec_pred* m_pred[1 + 2];
  104. };
  105. inline
  106. Exec_pred_op::Code::Code(Pred_op op) :
  107.     m_op(op)
  108. {
  109. }
  110. inline
  111. Exec_pred_op::Data::Data()
  112. {
  113. }
  114. inline
  115. Exec_pred_op::Exec_pred_op(Exec_root* root) :
  116.     Exec_pred(root)
  117. {
  118.     m_pred[0] = m_pred[1] = m_pred[2] = 0;
  119. }
  120. // children
  121. inline const Exec_pred_op::Code&
  122. Exec_pred_op::getCode() const
  123. {
  124.     const Code* code = static_cast<const Code*>(m_code);
  125.     return *code;
  126. }
  127. inline Exec_pred_op::Data&
  128. Exec_pred_op::getData() const
  129. {
  130.     Data* data = static_cast<Data*>(m_data);
  131.     return *data;
  132. }
  133. inline void
  134. Exec_pred_op::setPred(unsigned i, Exec_pred* pred)
  135. {
  136.     ctx_assert(1 <= i && i <= 2 && m_pred[i] == 0);
  137.     m_pred[i] = pred;
  138. }
  139. #endif