Code_table.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_table_hpp
  14. #define ODBC_CODEGEN_Code_table_hpp
  15. #include <vector>
  16. #include <common/common.hpp>
  17. #include "Code_base.hpp"
  18. class DictTable;
  19. class DictColumn;
  20. class DictIndex;
  21. class Plan_query_filter;
  22. class Plan_query_lookup;
  23. class Plan_query_range;
  24. class Plan_column;
  25. class Plan_expr_column;
  26. class Plan_select;
  27. class Plan_delete;
  28. class Plan_delete_lookup;
  29. class Plan_update;
  30. class Plan_update_lookup;
  31. /**
  32.  * @class Plan_table
  33.  * @brief Table node in PlanTree
  34.  *
  35.  * This is a pure Plan node.  Final executable nodes have table
  36.  * information built-in.
  37.  */
  38. class Plan_table : public Plan_base {
  39. public:
  40.     Plan_table(Plan_root* root, const BaseString& name);
  41.     virtual ~Plan_table();
  42.     Plan_base* analyze(Ctx& ctx, Ctl& ctl);
  43.     Exec_base* codegen(Ctx& ctx, Ctl& ctl);
  44.     void print(Ctx& ctx);
  45.     // attributes
  46.     const BaseString& getName() const;
  47.     const BaseString& getCname() const;
  48.     const char* getPrintName() const;
  49.     void setCname(const BaseString& cname);
  50.     const DictTable& dictTable() const;
  51.     unsigned indexCount() const;
  52.     // resolve
  53.     const ColumnVector& exprColumns() const;
  54.     const ColumnVector& dmlColumns() const;
  55. protected:
  56.     friend class Plan_column;
  57.     friend class Plan_query_filter;
  58.     friend class Plan_query_lookup;
  59.     friend class Plan_query_index;
  60.     friend class Plan_query_range;
  61.     friend class Plan_expr_column;
  62.     friend class Plan_select;
  63.     friend class Plan_delete;
  64.     friend class Plan_delete_lookup;
  65.     friend class Plan_delete_index;
  66.     friend class Plan_update;
  67.     friend class Plan_update_lookup;
  68.     friend class Plan_update_index;
  69.     BaseString m_name;
  70.     BaseString m_cname;
  71.     BaseString m_printName;
  72.     DictTable* m_dictTable;
  73.     /*
  74.      * Resolve column.  Returns 1 on found, 0 on not found, and -1 on error.
  75.      * Modifies both table and column data.
  76.      */
  77.     int resolveColumn(Ctx& ctx, Plan_column* column, bool stripSchemaName = false);
  78.     ColumnVector m_exprColumns;
  79.     ColumnVector m_dmlColumns;
  80.     /*
  81.      * Offset for resolved columns in join.  This is sum over m_exprColumns
  82.      * lengths for all preceding tables.
  83.      */
  84.     unsigned m_resOff;
  85.     /*
  86.      * Each column in primary key and unique hash index has list of
  87.      * expressions it is set equal to in the where-clause (at top level).
  88.      */
  89.     bool resolveEq(Ctx& ctx, Plan_expr_column* column, Plan_expr* expr);
  90.     /*
  91.      * Index struct for primary key and indexes.
  92.      */
  93.     struct Index {
  94. Index() :
  95.     m_pos(0),
  96.     m_keyFound(false),
  97.     m_dictIndex(0),
  98.     m_rank(~0),
  99.     m_keyCount(0),
  100.     m_keyCountUsed(0) {
  101. }
  102. unsigned m_pos;
  103. ExprListVector m_keyEqList;
  104. bool m_keyFound;
  105. ExprVector m_keyEq;
  106. TableSet m_keySet;
  107. const DictIndex* m_dictIndex; // for index only
  108. unsigned m_rank; // 0-pk 1-hash index 2-ordered index
  109. unsigned m_keyCount; // number of columns
  110. unsigned m_keyCountUsed; // may be less for ordered index
  111. unsigned m_keyCountUnused; // m_keyCount - m_keyCountUsed
  112.     };
  113.     typedef std::vector<Index> IndexList; // primary key is entry 0
  114.     IndexList m_indexList;
  115.     /*
  116.      * Find set of additional tables (maybe empty) required to resolve the key
  117.      * columns.
  118.      */
  119.     void resolveSet(Ctx& ctx, Index& index, const TableSet& tsDone);
  120.     void resolveSet(Ctx& ctx, Index& index, const TableSet& tsDone, ExprVector& keyEq, unsigned n);
  121.     /*
  122.      * Check for exactly one key or index match.
  123.      */
  124.     bool exactKey(Ctx& ctx, const Index* indexKey) const;
  125. };
  126. inline
  127. Plan_table::Plan_table(Plan_root* root, const BaseString& name) :
  128.     Plan_base(root),
  129.     m_name(name),
  130.     m_printName(name),
  131.     m_dictTable(0),
  132.     m_exprColumns(1), // 1-based
  133.     m_dmlColumns(1), // 1-based
  134.     m_resOff(0),
  135.     m_indexList(1)
  136. {
  137. }
  138. inline const BaseString&
  139. Plan_table::getName() const
  140. {
  141.     return m_name;
  142. }
  143. inline const BaseString&
  144. Plan_table::getCname() const
  145. {
  146.     return m_cname;
  147. }
  148. inline const char*
  149. Plan_table::getPrintName() const
  150. {
  151.     return m_printName.c_str();
  152. }
  153. inline void
  154. Plan_table::setCname(const BaseString& cname)
  155. {
  156.     m_cname.assign(cname);
  157.     m_printName.assign(m_name);
  158.     if (! m_cname.empty()) {
  159. m_printName.append(" ");
  160. m_printName.append(m_cname);
  161.     }
  162. }
  163. inline const DictTable&
  164. Plan_table::dictTable() const
  165. {
  166.     ctx_assert(m_dictTable != 0);
  167.     return *m_dictTable;
  168. }
  169. inline unsigned
  170. Plan_table::indexCount() const
  171. {
  172.     ctx_assert(m_indexList.size() > 0);
  173.     return m_indexList.size() - 1;
  174. }
  175. inline const Plan_table::ColumnVector&
  176. Plan_table::exprColumns() const
  177. {
  178.     return m_exprColumns;
  179. }
  180. inline const Plan_table::ColumnVector&
  181. Plan_table::dmlColumns() const
  182. {
  183.     return m_dmlColumns;
  184. }
  185. #endif