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

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_row_hpp
  14. #define ODBC_CODEGEN_Code_expr_row_hpp
  15. #include <vector>
  16. #include <common/common.hpp>
  17. #include <common/DataRow.hpp>
  18. #include "Code_base.hpp"
  19. #include "Code_expr.hpp"
  20. class Plan_expr;
  21. /**
  22.  * @class Plan_expr_row
  23.  * @brief Row of expressions in PlanTree
  24.  *
  25.  * Used for select, value, and order by rows.
  26.  */
  27. class Plan_expr_row : public Plan_base {
  28. public:
  29.     Plan_expr_row(Plan_root* root);
  30.     virtual ~Plan_expr_row();
  31.     Plan_base* analyze(Ctx& ctx, Ctl& ctl);
  32.     Exec_base* codegen(Ctx& ctx, Ctl& ctl);
  33.     void print(Ctx& ctx);
  34.     // children
  35.     void setAsterisk();
  36.     bool getAsterisk() const;
  37.     unsigned getSize() const;
  38.     Plan_expr* getExpr(unsigned i) const;
  39.     void setExpr(unsigned i, Plan_expr* expr);
  40.     void addExpr(Plan_expr* expr);
  41.     void addExpr(Plan_expr* expr, const BaseString& alias);
  42.     void setAlias(unsigned i, const BaseString& alias);
  43.     void addExpr(Plan_expr* expr, bool asc);
  44.     bool anyAggr() const;
  45.     bool allBound() const;
  46.     bool isAllGroupBy(const Plan_expr_row* row) const;
  47. protected:
  48.     friend class Plan_query;
  49.     friend class Plan_query_sort;
  50.     bool m_asterisk; // early plan node type
  51.     ExprVector m_exprList;
  52.     typedef std::vector<BaseString> AliasList;
  53.     AliasList m_aliasList;
  54.     typedef std::vector<bool> AscList;
  55.     AscList m_ascList;
  56.     bool m_anyAggr; // at least one aggreate
  57.     bool m_allBound; // all bound
  58. };
  59. inline
  60. Plan_expr_row::Plan_expr_row(Plan_root* root) :
  61.     Plan_base(root),
  62.     m_asterisk(false),
  63.     m_exprList(1),
  64.     m_aliasList(1),
  65.     m_ascList(1),
  66.     m_anyAggr(false),
  67.     m_allBound(false)
  68. {
  69. }
  70. // children
  71. inline void
  72. Plan_expr_row::setAsterisk()
  73. {
  74.     m_asterisk = true;
  75. }
  76. inline bool
  77. Plan_expr_row::getAsterisk() const
  78. {
  79.     return m_asterisk;
  80. }
  81. inline unsigned
  82. Plan_expr_row::getSize() const
  83. {
  84.     ctx_assert(m_exprList.size() >= 1);
  85.     return m_exprList.size() - 1;
  86. }
  87. inline void
  88. Plan_expr_row::addExpr(Plan_expr* expr)
  89. {
  90.     ctx_assert(expr != 0);
  91.     addExpr(expr, expr->m_alias);
  92. }
  93. inline void
  94. Plan_expr_row::addExpr(Plan_expr* expr, const BaseString& alias)
  95. {
  96.     ctx_assert(expr != 0);
  97.     m_exprList.push_back(expr);
  98.     m_aliasList.push_back(alias);
  99. }
  100. inline void
  101. Plan_expr_row::addExpr(Plan_expr* expr, bool asc)
  102. {
  103.     ctx_assert(expr != 0);
  104.     m_exprList.push_back(expr);
  105.     m_ascList.push_back(asc);
  106. }
  107. inline void
  108. Plan_expr_row::setExpr(unsigned i, Plan_expr* expr)
  109. {
  110.     ctx_assert(1 <= i && i < m_exprList.size() && expr != 0);
  111.     m_exprList[i] = expr;
  112. }
  113. inline Plan_expr*
  114. Plan_expr_row::getExpr(unsigned i) const
  115. {
  116.     ctx_assert(1 <= i && i < m_exprList.size() && m_exprList[i] != 0);
  117.     return m_exprList[i];
  118. }
  119. inline void
  120. Plan_expr_row::setAlias(unsigned i, const BaseString& alias)
  121. {
  122.     ctx_assert(1 <= i && i < m_aliasList.size());
  123.     m_aliasList[i] = alias;
  124. }
  125. inline bool
  126. Plan_expr_row::anyAggr() const
  127. {
  128.     return m_anyAggr;
  129. }
  130. inline bool
  131. Plan_expr_row::allBound() const
  132. {
  133.     return m_allBound;
  134. }
  135. /**
  136.  * @class Expr_expr_row
  137.  * @brief Row of expressions in ExecTree
  138.  */
  139. class Exec_expr_row : public Exec_base {
  140. public:
  141.     class Code : public Exec_base::Code {
  142.     public:
  143. typedef char Alias[40];
  144. Code(const SqlSpecs& sqlSpecs, const Alias* aliasList);
  145. virtual ~Code();
  146. const SqlSpecs& sqlSpecs() const;
  147. const char* getAlias(unsigned i) const;
  148.     protected:
  149. friend class Exec_expr_row;
  150. const SqlSpecs m_sqlSpecs;
  151. const Alias* m_aliasList;
  152.     };
  153.     class Data : public Exec_base::Data {
  154.     public:
  155. Data(const SqlRow& sqlRow);
  156. virtual ~Data();
  157. const SqlRow& sqlRow() const;
  158.     protected:
  159. friend class Exec_expr_row;
  160. SqlRow m_sqlRow;
  161.     };
  162.     Exec_expr_row(Exec_root* root, unsigned size);
  163.     virtual ~Exec_expr_row();
  164.     void alloc(Ctx& ctx, Ctl& ctl);
  165.     void evaluate(Ctx& ctx, Ctl& ctl);
  166.     void close(Ctx& ctx);
  167.     void print(Ctx& ctx);
  168.     // children
  169.     const Code& getCode() const;
  170.     Data& getData() const;
  171.     Exec_expr* getExpr(unsigned i) const;
  172.     void setExpr(unsigned i, Exec_expr* expr);
  173. protected:
  174.     Exec_expr** m_expr; // numbered from 1
  175.     unsigned m_size;
  176. };
  177. inline
  178. Exec_expr_row::Code::Code(const SqlSpecs& sqlSpecs, const Alias* aliasList) :
  179.     m_sqlSpecs(sqlSpecs),
  180.     m_aliasList(aliasList)
  181. {
  182. }
  183. inline const SqlSpecs&
  184. Exec_expr_row::Code::sqlSpecs() const
  185. {
  186.     return m_sqlSpecs;
  187. }
  188. inline const char*
  189. Exec_expr_row::Code::getAlias(unsigned i) const
  190. {
  191.     ctx_assert(1 <= i && i <= m_sqlSpecs.count() && m_aliasList != 0);
  192.     return m_aliasList[i];
  193. }
  194. inline
  195. Exec_expr_row::Data::Data(const SqlRow& sqlRow) :
  196.     m_sqlRow(sqlRow)
  197. {
  198. }
  199. inline const SqlRow&
  200. Exec_expr_row::Data::sqlRow() const
  201. {
  202.     return m_sqlRow;
  203. }
  204. inline
  205. Exec_expr_row::Exec_expr_row(Exec_root* root, unsigned size) :
  206.     Exec_base(root),
  207.     m_expr(new Exec_expr* [1 + size]),
  208.     m_size(size)
  209. {
  210.     m_expr[0] = (Exec_expr*)-1;
  211.     for (unsigned i = 1; i <= m_size; i++)
  212. m_expr[i] = 0;
  213. }
  214. // children
  215. inline const Exec_expr_row::Code&
  216. Exec_expr_row::getCode() const
  217. {
  218.     const Code* code = static_cast<const Code*>(m_code);
  219.     return *code;
  220. }
  221. inline Exec_expr_row::Data&
  222. Exec_expr_row::getData() const
  223. {
  224.     Data* data = static_cast<Data*>(m_data);
  225.     return *data;
  226. }
  227. inline Exec_expr*
  228. Exec_expr_row::getExpr(unsigned i) const
  229. {
  230.     ctx_assert(1 <= i && i <= m_size && m_expr != 0 && m_expr[i] != 0);
  231.     return m_expr[i];
  232. }
  233. inline void
  234. Exec_expr_row::setExpr(unsigned i, Exec_expr* expr)
  235. {
  236.     ctx_assert(1 <= i && i <= m_size && m_expr != 0 && m_expr[i] == 0);
  237.     m_expr[i] = expr;
  238. }
  239. #endif