You've already forked mariadb-columnstore-engine
							
							
				mirror of
				https://github.com/mariadb-corporation/mariadb-columnstore-engine.git
				synced 2025-10-30 07:25:34 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			257 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			257 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /* Copyright (C) 2014 InfiniDB, Inc.
 | |
|    Copyright (C) 2016 MariaDB Corporation
 | |
| 
 | |
|    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; version 2 of
 | |
|    the License.
 | |
| 
 | |
|    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., 51 Franklin Street, Fifth Floor, Boston,
 | |
|    MA 02110-1301, USA. */
 | |
| 
 | |
| /***********************************************************************
 | |
|  *   $Id: ha_subquery.h 6418 2010-03-29 21:55:08Z zzhu $
 | |
|  *
 | |
|  *
 | |
|  ***********************************************************************/
 | |
| /** @file */
 | |
| /** class subquery series interface */
 | |
| 
 | |
| #pragma once
 | |
| 
 | |
| // #undef LOG_INFO
 | |
| #include <my_config.h>
 | |
| #include "idb_mysql.h"
 | |
| #include "ha_mcs_impl_if.h"
 | |
| 
 | |
| namespace execplan
 | |
| {
 | |
| class PredicateOperator;
 | |
| }
 | |
| 
 | |
| namespace cal_impl_if
 | |
| {
 | |
| /** @file */
 | |
| 
 | |
| class SubQuery
 | |
| {
 | |
|  public:
 | |
|   SubQuery(gp_walk_info& gwip) : fGwip(gwip), fCorrelated(false)
 | |
|   {
 | |
|     next = *gwip.subQueriesChain;
 | |
|     *gwip.subQueriesChain = this;
 | |
|   }
 | |
|   virtual ~SubQuery() = default;
 | |
|   virtual gp_walk_info& gwip() const
 | |
|   {
 | |
|     return fGwip;
 | |
|   }
 | |
|   bool correlated() const
 | |
|   {
 | |
|     return fCorrelated;
 | |
|   }
 | |
|   void correlated(const bool correlated)
 | |
|   {
 | |
|     fCorrelated = correlated;
 | |
|   }
 | |
|   virtual void handleFunc(gp_walk_info* /*gwip*/, Item_func* /*func*/)
 | |
|   {
 | |
|   }
 | |
|   virtual void handleNot()
 | |
|   {
 | |
|   }
 | |
| 
 | |
|   SubQuery* next;
 | |
| 
 | |
|  protected:
 | |
|   gp_walk_info& fGwip;
 | |
|   bool fCorrelated;
 | |
| };
 | |
| 
 | |
| struct SubQueryChainHolder
 | |
| {
 | |
|   SubQuery* chain;
 | |
|   SubQueryChainHolder() : chain(nullptr)
 | |
|   {
 | |
|   }
 | |
|   ~SubQueryChainHolder()
 | |
|   {
 | |
|     while (chain)
 | |
|     {
 | |
|       SubQuery* next = chain->next;
 | |
|       delete chain;
 | |
|       chain = next;
 | |
|     }
 | |
|   }
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * @brief A class to represent a generic WHERE clause subquery
 | |
|  */
 | |
| class WhereSubQuery : public SubQuery
 | |
| {
 | |
|  public:
 | |
|   WhereSubQuery(gp_walk_info& gwip) : SubQuery(gwip), fSub(nullptr), fFunc(nullptr)
 | |
|   {
 | |
|   }
 | |
|   WhereSubQuery(gp_walk_info& gwip, const execplan::SRCP& column, Item_subselect* sub, Item_func* func)
 | |
|    : SubQuery(gwip), fColumn(column), fSub(sub), fFunc(func)
 | |
|   {
 | |
|   }
 | |
|   WhereSubQuery(gp_walk_info& gwip, Item_func* func) : SubQuery(gwip), fFunc(func)
 | |
|   {
 | |
|   }
 | |
|   WhereSubQuery(gp_walk_info& gwip, Item_subselect* sub) : SubQuery(gwip), fSub(sub)
 | |
|   {
 | |
|   }  // for exists
 | |
|   ~WhereSubQuery() override = default;
 | |
| 
 | |
|   /** Accessors and mutators */
 | |
|   virtual Item_subselect* sub() const
 | |
|   {
 | |
|     return fSub;
 | |
|   }
 | |
|   virtual void sub(Item_subselect* sub)
 | |
|   {
 | |
|     fSub = sub;
 | |
|   }
 | |
|   virtual Item_func* func() const
 | |
|   {
 | |
|     return fFunc;
 | |
|   }
 | |
|   virtual void func(Item_func* func)
 | |
|   {
 | |
|     fFunc = func;
 | |
|   }
 | |
|   virtual execplan::ParseTree* transform() = 0;
 | |
| 
 | |
|  protected:
 | |
|   execplan::SRCP fColumn;
 | |
|   Item_subselect* fSub;
 | |
|   Item_func* fFunc;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * @brief A class to represent a scalar subquery
 | |
|  */
 | |
| class ScalarSub : public WhereSubQuery
 | |
| {
 | |
|  public:
 | |
|   ScalarSub(gp_walk_info& gwip);
 | |
|   ScalarSub(gp_walk_info& gwip, Item_func* func);
 | |
|   ScalarSub(gp_walk_info& gwip, const execplan::SRCP& column, Item_subselect* sub, Item_func* func);
 | |
|   ScalarSub(const ScalarSub& rhs);
 | |
|   ~ScalarSub() override;
 | |
|   execplan::ParseTree* transform() override;
 | |
|   execplan::ParseTree* transform_between();
 | |
|   execplan::ParseTree* transform_in();
 | |
|   execplan::ParseTree* buildParseTree(execplan::PredicateOperator* op);
 | |
|   uint64_t returnedColPos() const
 | |
|   {
 | |
|     return fReturnedColPos;
 | |
|   }
 | |
|   void returnedColPos(const uint64_t returnedColPos)
 | |
|   {
 | |
|     fReturnedColPos = returnedColPos;
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   uint64_t fReturnedColPos;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * @brief A class to represent a IN subquery
 | |
|  */
 | |
| class InSub : public WhereSubQuery
 | |
| {
 | |
|  public:
 | |
|   InSub(gp_walk_info& gwip);
 | |
|   InSub(gp_walk_info& gwip, Item_func* func);
 | |
|   InSub(const InSub& rhs);
 | |
|   ~InSub() override;
 | |
|   execplan::ParseTree* transform() override;
 | |
|   void handleFunc(gp_walk_info* gwip, Item_func* func) override;
 | |
|   void handleNot() override;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * @brief A class to represent an EXISTS subquery
 | |
|  */
 | |
| class ExistsSub : public WhereSubQuery
 | |
| {
 | |
|  public:
 | |
|   ExistsSub(gp_walk_info&);  // not complete. just for compile
 | |
|   ExistsSub(gp_walk_info&, Item_subselect* sub);
 | |
|   ~ExistsSub() override;
 | |
|   execplan::ParseTree* transform() override;
 | |
|   void handleNot() override;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * @brief A class to represent a subquery which contains GROUP BY
 | |
|  */
 | |
| class AggregateSub : public WhereSubQuery
 | |
| {
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * @brief A class to represent a generic FROM subquery
 | |
|  */
 | |
| class FromSubQuery : public SubQuery
 | |
| {
 | |
|  public:
 | |
|   FromSubQuery(gp_walk_info&);
 | |
|   FromSubQuery(gp_walk_info&, SELECT_LEX* fromSub);
 | |
|   ~FromSubQuery() override;
 | |
|   const SELECT_LEX* fromSub() const
 | |
|   {
 | |
|     return fFromSub;
 | |
|   }
 | |
|   void fromSub(SELECT_LEX* fromSub)
 | |
|   {
 | |
|     fFromSub = fromSub;
 | |
|   }
 | |
|   const std::string alias() const
 | |
|   {
 | |
|     return fAlias;
 | |
|   }
 | |
|   void alias(const std::string alias)
 | |
|   {
 | |
|     fAlias = alias;
 | |
|   }
 | |
|   execplan::SCSEP transform();
 | |
| 
 | |
|  private:
 | |
|   SELECT_LEX* fFromSub;
 | |
|   std::string fAlias;
 | |
| };
 | |
| 
 | |
| class SelectSubQuery : public SubQuery
 | |
| {
 | |
|  public:
 | |
|   SelectSubQuery(gp_walk_info&);
 | |
|   SelectSubQuery(gp_walk_info&, Item_subselect* sel);
 | |
|   ~SelectSubQuery() override;
 | |
|   execplan::SCSEP transform();
 | |
|   Item_subselect* selSub()
 | |
|   {
 | |
|     return fSelSub;
 | |
|   }
 | |
|   void selSub(Item_subselect* selSub)
 | |
|   {
 | |
|     fSelSub = selSub;
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   Item_subselect* fSelSub;
 | |
| };
 | |
| 
 | |
| }  // namespace cal_impl_if
 |