summaryrefslogtreecommitdiff
path: root/storage/ndb/src/old_files/client/odbc/codegen/Code_base.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'storage/ndb/src/old_files/client/odbc/codegen/Code_base.hpp')
-rw-r--r--storage/ndb/src/old_files/client/odbc/codegen/Code_base.hpp237
1 files changed, 237 insertions, 0 deletions
diff --git a/storage/ndb/src/old_files/client/odbc/codegen/Code_base.hpp b/storage/ndb/src/old_files/client/odbc/codegen/Code_base.hpp
new file mode 100644
index 00000000000..c67c0ca7adb
--- /dev/null
+++ b/storage/ndb/src/old_files/client/odbc/codegen/Code_base.hpp
@@ -0,0 +1,237 @@
+/* Copyright (C) 2003 MySQL AB
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+#ifndef ODBC_CODEGEN_Code_base_hpp
+#define ODBC_CODEGEN_Code_base_hpp
+
+#include <set>
+#include <list>
+#include <vector>
+#include <common/common.hpp>
+#include <common/CodeTree.hpp>
+#include <common/DescArea.hpp>
+
+class Ctx;
+class ConnArea;
+class StmtArea;
+class DescArea;
+class DictCatalog;
+class DictSchema;
+class ResultArea;
+class ResultSet;
+class SpecRow;
+class Ndb;
+class NdbSchemaCon;
+class NdbConnection;
+class NdbOperation;
+class NdbScanFilter;
+
+class Plan_root;
+class Plan_table;
+class Plan_column;
+class Plan_expr;
+class Plan_expr_param;
+class Plan_pred;
+class Plan_dml_row;
+class Plan_dml_column;
+class Plan_ddl_column;
+class Plan_ddl_constr;
+class Plan_idx_column;
+class Exec_root;
+class Exec_base;
+class Exec_query;
+class Exec_expr;
+class Exec_expr_row;
+class Exec_expr_param;
+
+/**
+ * @class Plan_base
+ * @brief Base class for plan trees
+ */
+class Plan_base : public PlanTree {
+public:
+ Plan_base(Plan_root* root);
+ virtual ~Plan_base() = 0;
+ // get references to StmtArea via Plan_root
+ StmtArea& stmtArea() const;
+ DescArea& descArea(DescUsage u) const;
+ ConnArea& connArea() const;
+ // catalogs
+ DictCatalog& dictCatalog() const;
+ DictSchema& dictSchema() const;
+ // ndb
+ Ndb* ndbObject() const;
+ NdbSchemaCon* ndbSchemaCon() const;
+ NdbConnection* ndbConnection() const;
+ // containers for Plan classes
+ typedef std::vector<Plan_table*> TableVector;
+ typedef std::vector<Plan_column*> ColumnVector;
+ typedef std::vector<Plan_dml_column*> DmlColumnVector;
+ typedef std::vector<Plan_ddl_column*> DdlColumnVector;
+ typedef std::vector<Plan_ddl_constr*> DdlConstrVector;
+ typedef std::vector<Plan_idx_column*> IdxColumnVector;
+ typedef std::vector<Plan_expr*> ExprVector;
+ typedef std::list<Plan_expr*> ExprList;
+ typedef std::vector<ExprList> ExprListVector;
+ typedef std::list<Plan_pred*> PredList;
+ typedef std::set<Plan_table*> TableSet;
+ typedef std::vector<Plan_expr_param*> ParamVector;
+ // control area on the stack XXX needs to be designed
+ struct Ctl {
+ Ctl(Ctl* up);
+ Ctl* m_up; // up the stack
+ // analyze
+ TableVector m_tableList; // resolve column names
+ bool m_topand; // in top-level where clause
+ bool m_extra; // anything but single pk=expr
+ bool m_aggrok; // aggregate allowed
+ bool m_aggrin; // within aggregate args
+ bool m_const; // only constants in set clause
+ PredList m_topcomp; // top level comparisons
+ Plan_dml_row *m_dmlRow; // row type to convert to
+ Plan_table* m_topTable; // top level table for interpreted progs
+ bool m_having; // in having-predicate
+ // codegen
+ Exec_root* m_execRoot; // root of Exec tree
+ const Exec_query* m_execQuery; // pass to column
+ };
+ // semantic analysis and optimization
+ virtual Plan_base* analyze(Ctx& ctx, Ctl& ctl) = 0;
+ // generate "executable" code
+ virtual Exec_base* codegen(Ctx& ctx, Ctl& ctl) = 0;
+ // misc
+ virtual void print(Ctx& ctx) = 0;
+protected:
+ Plan_root* m_root;
+ void printList(Ctx& ctx, Plan_base* a[], unsigned n);
+};
+
+inline
+Plan_base::Plan_base(Plan_root* root) :
+ m_root(root)
+{
+ ctx_assert(m_root != 0);
+}
+
+inline
+Plan_base::Ctl::Ctl(Ctl* up) :
+ m_up(up),
+ m_tableList(1), // 1-based
+ m_topand(false),
+ m_extra(false),
+ m_aggrok(false),
+ m_aggrin(false),
+ m_dmlRow(0),
+ m_topTable(0),
+ m_having(false),
+ m_execRoot(0),
+ m_execQuery(0)
+{
+}
+
+/**
+ * @class Exec_base
+ * @brief Base class for exec trees
+ */
+class Exec_base : public ExecTree {
+public:
+ class Code : public ExecTree::Code {
+ public:
+ virtual ~Code() = 0;
+ };
+ class Data : public ExecTree::Data {
+ public:
+ virtual ~Data() = 0;
+ };
+ Exec_base(Exec_root* root);
+ virtual ~Exec_base() = 0;
+ // get references to StmtArea via Exec_root
+ virtual StmtArea& stmtArea() const;
+ DescArea& descArea(DescUsage u) const;
+ ConnArea& connArea() const;
+ // catalogs
+ DictSchema& dictSchema() const;
+ // ndb
+ Ndb* ndbObject() const;
+ NdbSchemaCon* ndbSchemaCon() const;
+ NdbConnection* ndbConnection() const;
+ // containers for Exec classes
+ typedef std::vector<Exec_expr*> ExprVector;
+ typedef std::vector<Exec_expr_param*> ParamVector;
+ // control area on the stack
+ struct Ctl {
+ Ctl(Ctl* up);
+ Ctl* m_up; // up the stack
+ const Exec_query* m_query; // pass Data
+ ExprVector m_exprList; // pass Data
+ NdbOperation* m_scanOp; // scan operation
+ bool m_postEval; // for rownum
+ unsigned m_groupIndex; // for group by
+ bool m_groupInit; // first in group
+ Exec_expr_row* m_sortRow; // from sort to group by
+ NdbScanFilter* m_scanFilter; // scan filter
+ };
+ // allocate and deallocate Data instances
+ virtual void alloc(Ctx& ctx, Ctl& ctl) = 0;
+ virtual void close(Ctx& ctx) = 0;
+ // set Code and Data
+ void setCode(const Code& code);
+ void setData(Data& data);
+ // misc
+ virtual void print(Ctx& ctx) = 0;
+protected:
+ const Code* m_code;
+ Data* m_data;
+ Exec_root* m_root;
+ void printList(Ctx& ctx, Exec_base* a[], unsigned n);
+};
+
+inline
+Exec_base::Exec_base(Exec_root* root) :
+ m_code(0),
+ m_data(0),
+ m_root(root)
+{
+ ctx_assert(m_root != 0);
+}
+
+inline void
+Exec_base::setCode(const Code& code)
+{
+ ctx_assert(m_code == 0);
+ m_code = &code;
+}
+
+inline void
+Exec_base::setData(Data& data)
+{
+ ctx_assert(m_data == 0);
+ m_data = &data;
+}
+
+inline
+Exec_base::Ctl::Ctl(Ctl* up) :
+ m_up(up),
+ m_scanOp(0),
+ m_postEval(false),
+ m_groupIndex(0),
+ m_groupInit(false),
+ m_sortRow(0),
+ m_scanFilter(0)
+{
+}
+
+#endif