You've already forked mariadb-columnstore-engine
							
							
				mirror of
				https://github.com/mariadb-corporation/mariadb-columnstore-engine.git
				synced 2025-11-03 17:13:17 +03:00 
			
		
		
		
	* fix(plugin): MCOL-4740: This fixes update rows counter for multi-table update For UPDATEs involving a single table, the server call to handler::direct_update_rows() is used to correctly set the count for the number of updated rows in the UPDATE statement. However, for UPDATEs involving multi-tables, the server does not call handler::direct_update_rows(). This patch adds support to correctly report the number of updated rows to the client by setting multi_update::updated and multi_update::found in handler::rnd_end(). * fix(plugin): MCOL-4740: this is to addres the original patch QA found in the original patch --------- Co-authored-by: Roman Nozdrin <rnozdrin@mariadb.com> Co-authored-by: drrtuy <roman.nozdrin@mariadb.com>
		
			
				
	
	
		
			161 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			161 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/*
 | 
						|
   Copyright (c) 2019-20 MariaDB
 | 
						|
 | 
						|
   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 St, Fifth Floor, Boston, MA 02110-1301  USA */
 | 
						|
 | 
						|
#pragma once
 | 
						|
 | 
						|
#define PREFER_MY_CONFIG_H
 | 
						|
#include "idb_mysql.h"
 | 
						|
#include "ha_mcs.h"
 | 
						|
#include "ha_mcs_sysvars.h"
 | 
						|
#include "ha_mcs_common.h"
 | 
						|
#define NEED_CALPONT_EXTERNS
 | 
						|
#include "ha_mcs_impl.h"
 | 
						|
#include "ha_mcs_impl_if.h"
 | 
						|
#include "ha_mcs_opt_rewrites.h"
 | 
						|
 | 
						|
void mutate_optimizer_flags(THD* thd_);
 | 
						|
void restore_optimizer_flags(THD* thd_);
 | 
						|
 | 
						|
enum mcs_handler_types_t
 | 
						|
{
 | 
						|
  SELECT,
 | 
						|
  DERIVED,
 | 
						|
  LEGACY
 | 
						|
};
 | 
						|
 | 
						|
struct mcs_handler_info
 | 
						|
{
 | 
						|
  mcs_handler_info() : hndl_ptr(nullptr), hndl_type(LEGACY){};
 | 
						|
  mcs_handler_info(mcs_handler_types_t type) : hndl_ptr(nullptr), hndl_type(type){};
 | 
						|
  mcs_handler_info(void* ptr, mcs_handler_types_t type) : hndl_ptr(ptr), hndl_type(type){};
 | 
						|
  ~mcs_handler_info() = default;
 | 
						|
  void* hndl_ptr;
 | 
						|
  mcs_handler_types_t hndl_type;
 | 
						|
};
 | 
						|
 | 
						|
/*@brief  group_by_handler class*/
 | 
						|
/***********************************************************
 | 
						|
 * DESCRIPTION:
 | 
						|
 * Provides server with group_by_handler API methods.
 | 
						|
 * One should read comments in server/sql/group_by_handler.h
 | 
						|
 * Attributes:
 | 
						|
 * select - attribute contains all GROUP BY, HAVING, ORDER items and calls it
 | 
						|
 *              an extended SELECT list according to comments in
 | 
						|
 *              server/sql/group_handler.cc.
 | 
						|
 *              So the temporary table for
 | 
						|
 *              select count(*) from b group by a having a > 3 order by a
 | 
						|
 *              will have 4 columns not 1.
 | 
						|
 *              However server ignores all NULLs used in
 | 
						|
 *              GROUP BY, HAVING, ORDER.
 | 
						|
 * select_list_descr - contains Item description returned by Item->print()
 | 
						|
 *              that is used in lookup for corresponding columns in
 | 
						|
 *              extended SELECT list.
 | 
						|
 * table_list - contains all tables involved. Must be CS tables only.
 | 
						|
 * distinct - looks like a useless thing for now. Couldn't get it set by server.
 | 
						|
 * where - where items.
 | 
						|
 * group_by - group by ORDER items.
 | 
						|
 * order_by - order by ORDER items.
 | 
						|
 * having - having Item.
 | 
						|
 * Methods:
 | 
						|
 * init_scan - get plan and send it to ExeMgr. Get the execution result.
 | 
						|
 * next_row - get a row back from sm.
 | 
						|
 * end_scan - finish and clean the things up.
 | 
						|
 ***********************************************************/
 | 
						|
class ha_mcs_group_by_handler : public group_by_handler
 | 
						|
{
 | 
						|
 private:
 | 
						|
  long time_zone;
 | 
						|
 | 
						|
 public:
 | 
						|
  ha_mcs_group_by_handler(THD* thd_arg, Query* query);
 | 
						|
  ~ha_mcs_group_by_handler() override;
 | 
						|
  int init_scan() override;
 | 
						|
  int next_row() override;
 | 
						|
  int end_scan() override;
 | 
						|
 | 
						|
  List<Item>* select;
 | 
						|
  TABLE_LIST* table_list;
 | 
						|
  bool distinct;
 | 
						|
  Item* where;
 | 
						|
  ORDER* group_by;
 | 
						|
  ORDER* order_by;
 | 
						|
  Item* having;
 | 
						|
};
 | 
						|
 | 
						|
/*@brief  derived_handler class*/
 | 
						|
/***********************************************************
 | 
						|
 * DESCRIPTION:
 | 
						|
 * derived_handler API methods. Could be used by the server
 | 
						|
 * tp process sub-queries.
 | 
						|
 * More details in server/sql/dervied_handler.h
 | 
						|
 * COLUMNSTORE_SHARE* hton share
 | 
						|
 * tbl in the constructor is the list of the tables involved.
 | 
						|
 * Methods:
 | 
						|
 * init_scan - get plan and send it to ExeMgr. Get the execution result.
 | 
						|
 * next_row - get a row back from sm.
 | 
						|
 * end_scan - finish and clean the things up.
 | 
						|
 ***********************************************************/
 | 
						|
class ha_columnstore_derived_handler : public derived_handler
 | 
						|
{
 | 
						|
 private:
 | 
						|
  long time_zone;
 | 
						|
 | 
						|
 public:
 | 
						|
  ha_columnstore_derived_handler(THD* thd_arg, TABLE_LIST* tbl);
 | 
						|
  ~ha_columnstore_derived_handler() override;
 | 
						|
  int init_scan() override;
 | 
						|
  int next_row() override;
 | 
						|
  int end_scan() override;
 | 
						|
  void print_error(int, unsigned long) override;
 | 
						|
};
 | 
						|
 | 
						|
/*@brief select_handler class*/
 | 
						|
/***********************************************************
 | 
						|
 * DESCRIPTION:
 | 
						|
 * select_handler API methods. Could be used by the server
 | 
						|
 * tp pushdown the whole query described by SELECT_LEX.
 | 
						|
 * More details in server/sql/select_handler.h
 | 
						|
 * COLUMNSTORE_SHARE* hton share
 | 
						|
 * sel in the constructor is the semantic tree for the query.
 | 
						|
 * Methods:
 | 
						|
 * init_scan - get plan and send it to ExeMgr. Get the execution result.
 | 
						|
 * next_row - get a row back from sm.
 | 
						|
 * end_scan - finish and clean the things up.
 | 
						|
 ***********************************************************/
 | 
						|
class ha_columnstore_select_handler : public select_handler
 | 
						|
{
 | 
						|
 private:
 | 
						|
  bool prepared;
 | 
						|
  bool scan_ended;
 | 
						|
  long time_zone;
 | 
						|
 | 
						|
 public:
 | 
						|
  bool scan_initialized;
 | 
						|
  int pushdown_init_rc;
 | 
						|
  // MCOL-4525 Store the original TABLE_LIST::outer_join value in a hash map.
 | 
						|
  // This will be used to restore to the original state later in case
 | 
						|
  // query execution fails using the select_handler.
 | 
						|
  cal_impl_if::TableOuterJoinMap tableOuterJoinMap;
 | 
						|
  ha_columnstore_select_handler(THD* thd_arg, SELECT_LEX* sel_lex);
 | 
						|
  ha_columnstore_select_handler(THD* thd_arg, SELECT_LEX_UNIT* sel_unit);
 | 
						|
  ha_columnstore_select_handler(THD* thd_arg, SELECT_LEX* sel_lex, SELECT_LEX_UNIT* sel_unit);
 | 
						|
  ~ha_columnstore_select_handler() override;
 | 
						|
  int init_scan() override;
 | 
						|
  int next_row() override;
 | 
						|
  int end_scan() override;
 | 
						|
  bool prepare() override;
 | 
						|
};
 |