1 | /* |
2 | Copyright (c) 2014, 2015 SkySQL Ab & MariaDB Foundation |
3 | |
4 | This program is free software; you can redistribute it and/or modify |
5 | it under the terms of the GNU General Public License as published by |
6 | the Free Software Foundation; version 2 of the License. |
7 | |
8 | This program is distributed in the hope that it will be useful, |
9 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
10 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
11 | GNU General Public License for more details. |
12 | |
13 | You should have received a copy of the GNU General Public License |
14 | along with this program; if not, write to the Free Software |
15 | Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA */ |
16 | |
17 | /* |
18 | This file implements the group_by_handler interface. This interface |
19 | can be used by storage handlers that can intercept summary or GROUP |
20 | BY queries from MariaDB and itself return the result to the user or |
21 | upper level. It is part of the Storage Engine API |
22 | |
23 | Both main and sub queries are supported. Here are some examples of what the |
24 | storage engine could intersept: |
25 | |
26 | SELECT count(*) FROM t1; |
27 | SELECT a,count(*) FROM t1 group by a; |
28 | SELECT a,count(*) as sum FROM t1 where b > 10 group by a, order by sum; |
29 | SELECT a,count(*) FROM t1,t2; |
30 | SELECT a, (select sum(*) from t2 where t1.a=t2.a) from t2; |
31 | */ |
32 | |
33 | /** |
34 | The structure describing various parts of the query |
35 | |
36 | The engine is supposed to take out parts that it can do internally. |
37 | For example, if the engine can return results sorted according to |
38 | the specified order_by clause, it sets Query::order_by=NULL before |
39 | returning. |
40 | |
41 | At the moment the engine must take group_by (or return an error), and |
42 | optionally can take distinct, where, order_by, and having. |
43 | |
44 | The engine should not modify the select list. It is the extended SELECT |
45 | clause (extended, because it has more items than the original |
46 | user-specified SELECT clause) and it contains all aggregate functions, |
47 | used in the query. |
48 | */ |
49 | struct Query |
50 | { |
51 | List<Item> *select; |
52 | bool distinct; |
53 | TABLE_LIST *from; |
54 | Item *where; |
55 | ORDER *group_by; |
56 | ORDER *order_by; |
57 | Item *having; |
58 | // LIMIT |
59 | }; |
60 | |
61 | class group_by_handler |
62 | { |
63 | public: |
64 | THD *thd; |
65 | handlerton *ht; |
66 | |
67 | /* |
68 | Temporary table where all results should be stored in record[0] |
69 | The table has a field for every item from the Query::select list. |
70 | */ |
71 | TABLE *table; |
72 | |
73 | group_by_handler(THD *thd_arg, handlerton *ht_arg) |
74 | : thd(thd_arg), ht(ht_arg), table(0) {} |
75 | virtual ~group_by_handler() {} |
76 | |
77 | /* |
78 | Functions to scan data. All these returns 0 if ok, error code in case |
79 | of error |
80 | */ |
81 | |
82 | /* |
83 | Initialize group_by scan, prepare for next_row(). |
84 | If this is a sub query with group by, this can be called many times for |
85 | a query. |
86 | */ |
87 | virtual int init_scan()= 0; |
88 | |
89 | /* |
90 | Return next group by result in table->record[0]. |
91 | Return 0 if row found, HA_ERR_END_OF_FILE if last row and other error |
92 | number in case of fatal error. |
93 | */ |
94 | virtual int next_row()= 0; |
95 | |
96 | /* End scanning */ |
97 | virtual int end_scan()=0; |
98 | |
99 | /* Report errors */ |
100 | virtual void print_error(int error, myf errflag); |
101 | }; |
102 | |
103 | |