MySQL  8.0.21
Source Code Documentation
query_result.h
Go to the documentation of this file.
1 /* Copyright (c) 2015, 2020, Oracle and/or its affiliates. All rights reserved.
2 
3  This program is free software; you can redistribute it and/or modify
4  it under the terms of the GNU General Public License, version 2.0,
5  as published by the Free Software Foundation.
6 
7  This program is also distributed with certain software (including
8  but not limited to OpenSSL) that is licensed under separate terms,
9  as designated in a particular file or component or in included license
10  documentation. The authors of MySQL hereby grant you an additional
11  permission to link the program and your derivative works with the
12  separately licensed software that they have included with MySQL.
13 
14  This program is distributed in the hope that it will be useful,
15  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  GNU General Public License, version 2.0, for more details.
18 
19  You should have received a copy of the GNU General Public License
20  along with this program; if not, write to the Free Software
21  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
22 
23 #ifndef QUERY_RESULT_INCLUDED
24 #define QUERY_RESULT_INCLUDED
25 
26 #include <stddef.h>
27 #include <sys/types.h>
28 
29 #include "m_ctype.h"
30 #include "my_base.h"
31 #include "my_dbug.h"
32 #include "my_inttypes.h"
33 #include "my_io.h"
34 #include "my_sys.h"
35 #include "mysqld_error.h" // ER_*
36 #include "sql/sql_list.h"
37 
38 class Item;
39 class Item_subselect;
40 class PT_select_var;
41 class SELECT_LEX_UNIT;
42 class THD;
43 struct TABLE_LIST;
44 
45 /*
46  This is used to get result from a query
47 */
48 
49 class Query_result {
50  protected:
52 
53  public:
54  /**
55  Number of records estimated in this result.
56  Valid only for materialized derived tables/views.
57  */
59  /**
60  Cost to execute the subquery which produces this result.
61  Valid only for materialized derived tables/views.
62  */
64 
65  Query_result() : unit(nullptr), estimated_rowcount(0), estimated_cost(0) {}
66  virtual ~Query_result() {}
67 
68  virtual bool needs_file_privilege() const { return false; }
69 
70  /**
71  Change wrapped Query_result.
72 
73  Replace the wrapped query result object with new_result and call
74  prepare() on new_result.
75 
76  This base class implementation doesn't wrap other Query_results.
77 
78  @retval false Success
79  @retval true Error
80  */
81  virtual bool change_query_result(THD *, Query_result *) { return false; }
82  /// @return true if an interceptor object is needed for EXPLAIN
83  virtual bool need_explain_interceptor() const { return false; }
84 
85  /**
86  Perform preparation specific to the query expression or DML statement.
87 
88  @returns false if success, true if error
89  */
90  virtual bool prepare(THD *, List<Item> &, SELECT_LEX_UNIT *u) {
91  unit = u;
92  return false;
93  }
94 
95  /**
96  Optimize the result processing of a query expression, applicable to
97  data change operation (not simple select queries).
98 
99  @returns false if success, true if error
100  */
101  virtual bool optimize() { return false; }
102 
103  /**
104  Prepare for execution of the query expression or DML statement.
105 
106  Generally, this will have an implementation only for outer-most
107  SELECT_LEX objects, such as data change statements (for preparation
108  of the target table(s)) or dump statements (for preparation of target file).
109 
110  @returns false if success, true if error
111  */
112  virtual bool start_execution(THD *) { return false; }
113 
114  /*
115  Because of peculiarities of prepared statements protocol
116  we need to know number of columns in the result set (if
117  there is a result set) apart from sending columns metadata.
118  */
119  virtual uint field_count(List<Item> &fields) const { return fields.elements; }
120  virtual bool send_result_set_metadata(THD *thd, List<Item> &list,
121  uint flags) = 0;
122  virtual bool send_data(THD *thd, List<Item> &items) = 0;
123  virtual void send_error(THD *, uint errcode, const char *err) {
124  my_message(errcode, err, MYF(0));
125  }
126  virtual bool send_eof(THD *thd) = 0;
127  /**
128  Check if this query returns a result set and therefore is allowed in
129  cursors and set an error message if it is not the case.
130 
131  @retval false success
132  @retval true error, an error message is set
133  */
134  virtual bool check_simple_select() const {
135  my_error(ER_SP_BAD_CURSOR_QUERY, MYF(0));
136  return true;
137  }
138  virtual void abort_result_set(THD *) {}
139  /**
140  Cleanup after one execution of the unit, to be ready for a next execution
141  inside the same statement.
142  @returns true if error
143  */
144  virtual bool reset() {
145  DBUG_ASSERT(0);
146  return false;
147  }
148  /**
149  Cleanup after this execution. Completes the execution and resets object
150  before next execution of a prepared statement/stored procedure.
151  */
152  virtual void cleanup(THD *) { /* do nothing */
153  }
154 
155  void begin_dataset() {}
156 
157  /// @returns Pointer to count of rows retained by this result.
158  virtual const ha_rows *row_count() const /* purecov: inspected */
159  {
160  DBUG_ASSERT(false);
161  return nullptr;
162  } /* purecov: inspected */
163 
164  /**
165  Checks if this Query_result intercepts and transforms the result set.
166 
167  @return true if it is an interceptor, false otherwise
168  */
169  virtual bool is_interceptor() const { return false; }
170 
171  /**
172  If this Query_result performs modifications to tables: tells if it modifies
173  the given table's row as it's read (a.k.a. "on the fly"), or rather buffers
174  it to a temporary structure and modifies it in a post-all-reads phase.
175  @param t TABLE to answer for
176  @return true if "on the fly"
177  */
178  virtual bool immediate_update(TABLE_LIST *t MY_ATTRIBUTE((unused))) const {
179  DBUG_ASSERT(false);
180  return false;
181  }
182 };
183 
184 /*
185  Base class for Query_result descendands which intercept and
186  transform result set rows. As the rows are not sent to the client,
187  sending of result set metadata should be suppressed as well.
188 */
189 
191  public:
193  uint field_count(List<Item> &) const override { return 0; }
195  return false;
196  }
197  bool is_interceptor() const override final { return true; }
198 };
199 
201  /**
202  True if we have sent result set metadata to the client.
203  In this case the client always expects us to end the result
204  set with an eof or error packet
205  */
207 
208  public:
209  Query_result_send() : Query_result(), is_result_set_started(false) {}
210  bool send_result_set_metadata(THD *thd, List<Item> &list,
211  uint flags) override;
212  bool send_data(THD *thd, List<Item> &items) override;
213  bool send_eof(THD *thd) override;
214  bool check_simple_select() const override { return false; }
215  void abort_result_set(THD *thd) override;
216  void cleanup(THD *) override { is_result_set_started = false; }
217 };
218 
219 class sql_exchange;
220 
222  protected:
228 
229  public:
231  : Query_result_interceptor(), exchange(ex), file(-1), row_count(0L) {
232  path[0] = 0;
233  }
234  ~Query_result_to_file() override { DBUG_ASSERT(file < 0); }
235 
236  bool needs_file_privilege() const override { return true; }
237 
238  void send_error(THD *thd, uint errcode, const char *err) override;
239  bool send_eof(THD *thd) override;
240  void cleanup(THD *thd) override;
241 };
242 
243 #define ESCAPE_CHARS "ntrb0ZN" // keep synchronous with READ_INFO::unescape
244 
245 /*
246  List of all possible characters of a numeric value text representation.
247 */
248 #define NUMERIC_CHARS ".0123456789e+-"
249 
252  int field_sep_char, escape_char, line_sep_char;
253  int field_term_char; // first char of FIELDS TERMINATED BY or MAX_INT
254  /*
255  The is_ambiguous_field_sep field is true if a value of the field_sep_char
256  field is one of the 'n', 't', 'r' etc characters
257  (see the READ_INFO::unescape method and the ESCAPE_CHARS constant value).
258  */
260  /*
261  The is_ambiguous_field_term is true if field_sep_char contains the first
262  char of the FIELDS TERMINATED BY (ENCLOSED BY is empty), and items can
263  contain this character.
264  */
266  /*
267  The is_unsafe_field_sep field is true if a value of the field_sep_char
268  field is one of the '0'..'9', '+', '-', '.' and 'e' characters
269  (see the NUMERIC_CHARS constant value).
270  */
273  const CHARSET_INFO *write_cs; // output charset
274  public:
276  bool prepare(THD *thd, List<Item> &list, SELECT_LEX_UNIT *u) override;
277  bool start_execution(THD *thd) override;
278  bool send_data(THD *thd, List<Item> &items) override;
279  void cleanup(THD *thd) override;
280 };
281 
283  public:
285  bool prepare(THD *thd, List<Item> &list, SELECT_LEX_UNIT *u) override;
286  bool start_execution(THD *thd) override;
287  bool send_data(THD *thd, List<Item> &items) override;
288 };
289 
292 
293  public:
296  var_list.empty();
297  }
298  bool prepare(THD *thd, List<Item> &list, SELECT_LEX_UNIT *u) override;
299  bool send_data(THD *thd, List<Item> &items) override;
300  bool send_eof(THD *thd) override;
301  bool check_simple_select() const override;
302  void cleanup(THD *) override { row_count = 0; }
303 };
304 
305 /**
306  Base class for result from a subquery.
307 */
308 
310  protected:
312 
313  public:
315  : Query_result_interceptor(), item(item_arg) {}
316  bool send_data(THD *thd, List<Item> &items) override = 0;
317  bool send_eof(THD *) override { return false; }
318 };
319 
320 #endif // QUERY_RESULT_INCLUDED
Query_result_send()
Definition: query_result.h:209
virtual const ha_rows * row_count() const
Definition: query_result.h:158
int field_term_char
Definition: query_result.h:253
IO_CACHE cache
Definition: query_result.h:225
List< PT_select_var > var_list
Definition: query_result.h:294
Query_result_interceptor()
Definition: query_result.h:192
virtual void send_error(THD *, uint errcode, const char *err)
Definition: query_result.h:123
virtual bool immediate_update(TABLE_LIST *t) const
If this Query_result performs modifications to tables: tells if it modifies the given table&#39;s row as ...
Definition: query_result.h:178
virtual bool prepare(THD *, List< Item > &, SELECT_LEX_UNIT *u)
Perform preparation specific to the query expression or DML statement.
Definition: query_result.h:90
SELECT_LEX_UNIT * unit
Definition: query_result.h:51
Some integer typedefs for easier portability.
void my_error(int nr, myf MyFlags,...)
Fill in and print a previously registered error message.
Definition: my_error.cc:215
Query_result_dump(sql_exchange *ex)
Definition: query_result.h:284
bool fixed_row_size
Definition: query_result.h:272
Query_dumpvar()
Definition: query_result.h:295
double estimated_cost
Cost to execute the subquery which produces this result.
Definition: query_result.h:63
void cleanup(THD *) override
Cleanup after this execution.
Definition: query_result.h:216
bool is_unsafe_field_sep
Definition: query_result.h:271
virtual bool is_interceptor() const
Checks if this Query_result intercepts and transforms the result set.
Definition: query_result.h:169
bool is_ambiguous_field_sep
Definition: query_result.h:259
ha_rows row_count
Definition: query_result.h:226
Definition: query_result.h:49
Query_result_subquery(Item_subselect *item_arg)
Definition: query_result.h:314
bool send_eof(THD *) override
Definition: query_result.h:317
~Query_result_to_file() override
Definition: query_result.h:234
class udf_list * list
int line_sep_char
Definition: query_result.h:252
bool needs_file_privilege() const override
Definition: query_result.h:236
Used to hold information about file and file structure in exchange via non-DB file (...
Definition: sql_exchange.h:76
Definition: item_subselect.h:69
virtual ~Query_result()
Definition: query_result.h:66
Definition: query_result.h:282
This file includes constants used by all storage engines.
virtual bool needs_file_privilege() const
Definition: query_result.h:68
void empty()
Definition: sql_list.h:141
#define DBUG_ASSERT(A)
Definition: my_dbug.h:199
void cleanup(THD *) override
Cleanup after this execution.
Definition: query_result.h:302
sql_exchange * exchange
Definition: query_result.h:223
size_t field_term_length
Definition: query_result.h:251
bool send_result_set_metadata(THD *, List< Item > &, uint) override
Definition: query_result.h:194
virtual bool send_result_set_metadata(THD *thd, List< Item > &list, uint flags)=0
const CHARSET_INFO * write_cs
Definition: query_result.h:273
#define MYF(v)
Item_subselect * item
Definition: query_result.h:311
virtual bool reset()
Cleanup after one execution of the unit, to be ready for a next execution inside the same statement...
Definition: query_result.h:144
Definition: my_sys.h:338
bool is_ambiguous_field_term
Definition: query_result.h:265
ha_rows row_count
Definition: query_result.h:291
static char * path
Definition: mysqldump.cc:131
Definition: item.h:741
unsigned int uint
Definition: uca-dump.cc:29
#define final(a, b, c)
Definition: hash.c:109
#define FN_REFLEN
Definition: my_io.h:82
Query_result_to_file(sql_exchange *ex)
Definition: query_result.h:230
void my_message(uint my_err, const char *str, myf MyFlags)
Print an error message.
Definition: my_error.cc:310
static Value err()
Create a Value object that represents an error condition.
Definition: json_binary.cc:908
Base class for result from a subquery.
Definition: query_result.h:309
This class represents a query expression (one query block or several query blocks combined with UNION...
Definition: sql_lex.h:590
void begin_dataset()
Definition: query_result.h:155
Definition: query_result.h:290
Definition: m_ctype.h:359
virtual uint field_count(List< Item > &fields) const
Definition: query_result.h:119
Common header for many mysys elements.
Query_result_export(sql_exchange *ex)
Definition: query_result.h:275
int File
Definition: my_io_bits.h:50
Definition: query_result.h:190
Definition: query_result.h:200
virtual bool optimize()
Optimize the result processing of a query expression, applicable to data change operation (not simple...
Definition: query_result.h:101
bool is_interceptor() const override final
Checks if this Query_result intercepts and transforms the result set.
Definition: query_result.h:197
ha_rows estimated_rowcount
Number of records estimated in this result.
Definition: query_result.h:58
Definition: query_result.h:221
Definition: parse_tree_nodes.h:1236
uint elements
Definition: sql_list.h:135
virtual bool need_explain_interceptor() const
Definition: query_result.h:83
Common #defines and includes for file and socket I/O.
#define L
Definition: ctype-tis620.cc:75
bool check_simple_select() const override
Check if this query returns a result set and therefore is allowed in cursors and set an error message...
Definition: query_result.h:214
A better implementation of the UNIX ctype(3) library.
virtual bool start_execution(THD *)
Prepare for execution of the query expression or DML statement.
Definition: query_result.h:112
Query_result()
Definition: query_result.h:65
virtual bool send_eof(THD *thd)=0
virtual bool check_simple_select() const
Check if this query returns a result set and therefore is allowed in cursors and set an error message...
Definition: query_result.h:134
Definition: table.h:2494
static int flags[50]
Definition: hp_test1.cc:39
virtual void abort_result_set(THD *)
Definition: query_result.h:138
virtual void cleanup(THD *)
Cleanup after this execution.
Definition: query_result.h:152
File file
Definition: query_result.h:224
bool is_result_set_started
True if we have sent result set metadata to the client.
Definition: query_result.h:206
virtual bool change_query_result(THD *, Query_result *)
Change wrapped Query_result.
Definition: query_result.h:81
uint field_count(List< Item > &) const override
Definition: query_result.h:193
#define false
Definition: config_static.h:43
Definition: query_result.h:250
virtual bool send_data(THD *thd, List< Item > &items)=0
my_off_t ha_rows
Definition: my_base.h:1135
Definition: items.h:34
For each client connection we create a separate thread with THD serving as a thread/connection descri...
Definition: sql_class.h:799
Dialog Client Authentication nullptr
Definition: dialog.cc:353