mariadb/storage/spider/spd_group_by_handler.h
Yuchen Pei 77ed235d50
MDEV-26345 Spider GBH should execute original queries on the data node
Stop skipping const items when selecting but skip them when storing
their results to spider row to avoid storing in mismatching temporary
table fields.

Skip auxiliary fields in SELECTing, and do not store
the (non-existing) results to the corresponding temporary table
accordingly.

When there are BOTH auxiliary fields AND const items in the auxiliary
field items, do not use the spider GBH. This is a rare occasion if it
happens at all and not worth the added complexity to cover it.

Use the original item (item_ptr) in constructing GROUP BY and ORDER
BY, which also means using item->name instead of field->field_name as
aliases in constructing SELECT items. This fixes spurious regressions
caused by the above changes in some tests using ORDER BY, such as
mdev_24517.test. As a by-product, this also fixes MDEV-29546.
Therefore we update mdev_29008.test to include the MDEV-29546 case.
2024-10-15 15:36:12 +11:00

50 lines
1.5 KiB
C++

/* Copyright (C) 2016 Kentoku Shiba
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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
class spider_group_by_handler: public group_by_handler
{
Query query;
spider_fields *fields;
ha_spider *spider;
SPIDER_TRX *trx;
spider_db_result *result;
bool first;
longlong offset_limit;
int store_error;
/*
Bitmap marking constant items among the select items. They are
SELECTed in the query executed at the data node, but not stored in
SPIDER_DB_ROW, because the temp table do not contain the
corresponding fields.
*/
MY_BITMAP skips;
public:
spider_group_by_handler(
THD *thd_arg,
Query *query_arg,
spider_fields *fields_arg,
const MY_BITMAP &skips1
);
~spider_group_by_handler();
int init_scan() override;
int next_row() override;
int end_scan() override;
};
group_by_handler *spider_create_group_by_handler(
THD *thd,
Query *query
);