Code_base.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_base_hpp
  14. #define ODBC_CODEGEN_Code_base_hpp
  15. #include <set>
  16. #include <list>
  17. #include <vector>
  18. #include <common/common.hpp>
  19. #include <common/CodeTree.hpp>
  20. #include <common/DescArea.hpp>
  21. class Ctx;
  22. class ConnArea;
  23. class StmtArea;
  24. class DescArea;
  25. class DictCatalog;
  26. class DictSchema;
  27. class ResultArea;
  28. class ResultSet;
  29. class SpecRow;
  30. class Ndb;
  31. class NdbSchemaCon;
  32. class NdbConnection;
  33. class NdbOperation;
  34. class NdbScanFilter;
  35. class Plan_root;
  36. class Plan_table;
  37. class Plan_column;
  38. class Plan_expr;
  39. class Plan_expr_param;
  40. class Plan_pred;
  41. class Plan_dml_row;
  42. class Plan_dml_column;
  43. class Plan_ddl_column;
  44. class Plan_ddl_constr;
  45. class Plan_idx_column;
  46. class Exec_root;
  47. class Exec_base;
  48. class Exec_query;
  49. class Exec_expr;
  50. class Exec_expr_row;
  51. class Exec_expr_param;
  52. /**
  53.  * @class Plan_base
  54.  * @brief Base class for plan trees
  55.  */
  56. class Plan_base : public PlanTree {
  57. public:
  58.     Plan_base(Plan_root* root);
  59.     virtual ~Plan_base() = 0;
  60.     // get references to StmtArea via Plan_root
  61.     StmtArea& stmtArea() const;
  62.     DescArea& descArea(DescUsage u) const;
  63.     ConnArea& connArea() const;
  64.     // catalogs
  65.     DictCatalog& dictCatalog() const;
  66.     DictSchema& dictSchema() const;
  67.     // ndb
  68.     Ndb* ndbObject() const;
  69.     NdbSchemaCon* ndbSchemaCon() const;
  70.     NdbConnection* ndbConnection() const;
  71.     // containers for Plan classes
  72.     typedef std::vector<Plan_table*> TableVector;
  73.     typedef std::vector<Plan_column*> ColumnVector;
  74.     typedef std::vector<Plan_dml_column*> DmlColumnVector;
  75.     typedef std::vector<Plan_ddl_column*> DdlColumnVector;
  76.     typedef std::vector<Plan_ddl_constr*> DdlConstrVector;
  77.     typedef std::vector<Plan_idx_column*> IdxColumnVector;
  78.     typedef std::vector<Plan_expr*> ExprVector;
  79.     typedef std::list<Plan_expr*> ExprList;
  80.     typedef std::vector<ExprList> ExprListVector;
  81.     typedef std::list<Plan_pred*> PredList;
  82.     typedef std::set<Plan_table*> TableSet;
  83.     typedef std::vector<Plan_expr_param*> ParamVector;
  84.     // control area on the stack  XXX needs to be designed
  85.     struct Ctl {
  86. Ctl(Ctl* up);
  87. Ctl* m_up; // up the stack
  88. // analyze
  89. TableVector m_tableList; // resolve column names
  90. bool m_topand; // in top-level where clause
  91. bool m_extra; // anything but single pk=expr
  92. bool m_aggrok; // aggregate allowed
  93. bool m_aggrin; // within aggregate args
  94. bool m_const; // only constants in set clause
  95. PredList m_topcomp; // top level comparisons
  96. Plan_dml_row *m_dmlRow; // row type to convert to
  97. Plan_table* m_topTable; // top level table for interpreted progs
  98. bool m_having; // in having-predicate
  99. // codegen
  100. Exec_root* m_execRoot; // root of Exec tree
  101. const Exec_query* m_execQuery; // pass to column
  102.     };
  103.     // semantic analysis and optimization
  104.     virtual Plan_base* analyze(Ctx& ctx, Ctl& ctl) = 0;
  105.     // generate "executable" code
  106.     virtual Exec_base* codegen(Ctx& ctx, Ctl& ctl) = 0;
  107.     // misc
  108.     virtual void print(Ctx& ctx) = 0;
  109. protected:
  110.     Plan_root* m_root;
  111.     void printList(Ctx& ctx, Plan_base* a[], unsigned n);
  112. };
  113. inline
  114. Plan_base::Plan_base(Plan_root* root) :
  115.     m_root(root)
  116. {
  117.     ctx_assert(m_root != 0);
  118. }
  119. inline
  120. Plan_base::Ctl::Ctl(Ctl* up) :
  121.     m_up(up),
  122.     m_tableList(1), // 1-based
  123.     m_topand(false),
  124.     m_extra(false),
  125.     m_aggrok(false),
  126.     m_aggrin(false),
  127.     m_dmlRow(0),
  128.     m_topTable(0),
  129.     m_having(false),
  130.     m_execRoot(0),
  131.     m_execQuery(0)
  132. {
  133. }
  134. /**
  135.  * @class Exec_base
  136.  * @brief Base class for exec trees
  137.  */
  138. class Exec_base : public ExecTree {
  139. public:
  140.     class Code : public ExecTree::Code {
  141.     public:
  142. virtual ~Code() = 0;
  143.     };
  144.     class Data : public ExecTree::Data {
  145.     public:
  146. virtual ~Data() = 0;
  147.     };
  148.     Exec_base(Exec_root* root);
  149.     virtual ~Exec_base() = 0;
  150.     // get references to StmtArea via Exec_root
  151.     virtual StmtArea& stmtArea() const;
  152.     DescArea& descArea(DescUsage u) const;
  153.     ConnArea& connArea() const;
  154.     // catalogs
  155.     DictSchema& dictSchema() const;
  156.     // ndb
  157.     Ndb* ndbObject() const;
  158.     NdbSchemaCon* ndbSchemaCon() const;
  159.     NdbConnection* ndbConnection() const;
  160.     // containers for Exec classes
  161.     typedef std::vector<Exec_expr*> ExprVector;
  162.     typedef std::vector<Exec_expr_param*> ParamVector;
  163.     // control area on the stack
  164.     struct Ctl {
  165. Ctl(Ctl* up);
  166. Ctl* m_up; // up the stack
  167. const Exec_query* m_query; // pass Data
  168. ExprVector m_exprList; // pass Data
  169. NdbOperation* m_scanOp; // scan operation
  170. bool m_postEval; // for rownum
  171. unsigned m_groupIndex; // for group by
  172. bool m_groupInit; // first in group
  173. Exec_expr_row* m_sortRow; // from sort to group by
  174. NdbScanFilter* m_scanFilter; // scan filter
  175.     };
  176.     // allocate and deallocate Data instances
  177.     virtual void alloc(Ctx& ctx, Ctl& ctl) = 0;
  178.     virtual void close(Ctx& ctx) = 0;
  179.     // set Code and Data
  180.     void setCode(const Code& code);
  181.     void setData(Data& data);
  182.     // misc
  183.     virtual void print(Ctx& ctx) = 0;
  184. protected:
  185.     const Code* m_code;
  186.     Data* m_data;
  187.     Exec_root* m_root;
  188.     void printList(Ctx& ctx, Exec_base* a[], unsigned n);
  189. };
  190. inline
  191. Exec_base::Exec_base(Exec_root* root) :
  192.     m_code(0),
  193.     m_data(0),
  194.     m_root(root)
  195. {
  196.     ctx_assert(m_root != 0);
  197. }
  198. inline void
  199. Exec_base::setCode(const Code& code)
  200. {
  201.     ctx_assert(m_code == 0);
  202.     m_code = &code;
  203. }
  204. inline void
  205. Exec_base::setData(Data& data)
  206. {
  207.     ctx_assert(m_data == 0);
  208.     m_data = &data;
  209. }
  210. inline
  211. Exec_base::Ctl::Ctl(Ctl* up) :
  212.     m_up(up),
  213.     m_scanOp(0),
  214.     m_postEval(false),
  215.     m_groupIndex(0),
  216.     m_groupInit(false),
  217.     m_sortRow(0),
  218.     m_scanFilter(0)
  219. {
  220. }
  221. #endif