mirror of
https://github.com/MariaDB/server.git
synced 2025-01-23 23:34:34 +01:00
2cfc450bf7
"Re-factor the code for post-join operations". The patch mainly contains the code ported from mysql-5.6 and created for two essential architectural changes: 1. WL#5558: Resolve ORDER BY execution method at the optimization stage 2. WL#6071: Inline tmp tables into the nested loops algorithm The first task was implemented for mysql-5.6 by Ole John Aske. It allows to make all decisions on ORDER BY operation at the optimization stage. The second task implemented for mysql-5.6 by Evgeny Potemkin adds JOIN_TAB nodes for post-join operations that require temporary tables. It allows to execute these operations within the nested loops algorithm that used to be used before this task only for join queries. Besides these task moves all planning on the execution of these operations from the execution phase to the optimization phase. Some other re-factoring changes of mysql-5.6 were pulled in, mainly because it was easier to pull them in than roll them back. In particular all changes concerning Ref_ptr_array were incorporated. The port required some changes in the MariaDB code that concerned the functionality of EXPLAIN and ANALYZE. This was done mainly by Sergey Petrunia.
78 lines
2.4 KiB
C++
78 lines
2.4 KiB
C++
/* Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
|
|
|
|
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 */
|
|
|
|
#ifndef FILESORT_INCLUDED
|
|
#define FILESORT_INCLUDED
|
|
|
|
class SQL_SELECT;
|
|
|
|
#include "my_global.h" /* uint, uchar */
|
|
#include "my_base.h" /* ha_rows */
|
|
#include "sql_list.h" /* Sql_alloc */
|
|
|
|
class SQL_SELECT;
|
|
class THD;
|
|
struct TABLE;
|
|
class Filesort_tracker;
|
|
struct SORT_FIELD;
|
|
typedef struct st_order ORDER;
|
|
|
|
|
|
/**
|
|
Sorting related info.
|
|
To be extended by another WL to include complete filesort implementation.
|
|
*/
|
|
class Filesort: public Sql_alloc
|
|
{
|
|
public:
|
|
/** List of expressions to order the table by */
|
|
ORDER *order;
|
|
/** Number of records to return */
|
|
ha_rows limit;
|
|
/** ORDER BY list with some precalculated info for filesort */
|
|
SORT_FIELD *sortorder;
|
|
/** select to use for getting records */
|
|
SQL_SELECT *select;
|
|
/** TRUE <=> free select on destruction */
|
|
bool own_select;
|
|
/** true means we are using Priority Queue for order by with limit. */
|
|
bool using_pq;
|
|
|
|
Filesort(ORDER *order_arg, ha_rows limit_arg, SQL_SELECT *select_arg):
|
|
order(order_arg),
|
|
limit(limit_arg),
|
|
sortorder(NULL),
|
|
select(select_arg),
|
|
own_select(false),
|
|
using_pq(false)
|
|
{
|
|
DBUG_ASSERT(order);
|
|
};
|
|
|
|
~Filesort() { cleanup(); }
|
|
/* Prepare ORDER BY list for sorting. */
|
|
uint make_sortorder(THD *thd);
|
|
|
|
private:
|
|
void cleanup();
|
|
};
|
|
|
|
ha_rows filesort(THD *thd, TABLE *table, Filesort *filesort,
|
|
bool sort_positions, ha_rows *examined_rows,
|
|
ha_rows *found_rows, Filesort_tracker* tracker);
|
|
void filesort_free_buffers(TABLE *table, bool full);
|
|
void change_double_for_sort(double nr,uchar *to);
|
|
|
|
#endif /* FILESORT_INCLUDED */
|