MySQL 8.4.13
Source Code Documentation
item_subselect.h
Go to the documentation of this file.
1#ifndef ITEM_SUBSELECT_INCLUDED
2#define ITEM_SUBSELECT_INCLUDED
3
4/* Copyright (c) 2002, 2026, Oracle and/or its affiliates.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License, version 2.0,
8 as published by the Free Software Foundation.
9
10 This program is designed to work with certain software (including
11 but not limited to OpenSSL) that is licensed under separate terms,
12 as designated in a particular file or component or in included license
13 documentation. The authors of MySQL hereby grant you an additional
14 permission to link the program and your derivative works with the
15 separately licensed software that they have either included with
16 the program or referenced in the documentation.
17
18 This program is distributed in the hope that it will be useful,
19 but WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 GNU General Public License, version 2.0, for more details.
22
23 You should have received a copy of the GNU General Public License
24 along with this program; if not, write to the Free Software
25 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
26
27/// Implements classes that represent subqueries and predicates containing
28/// table subqueries.
29
30#include <assert.h>
31#include <sys/types.h>
32
33#include <cstddef>
34#include <memory> // unique_ptr
35#include <vector>
36
37#include "field_types.h" // enum_field_types
38#include "my_alloc.h" // Destroy_only
39
40#include "my_inttypes.h"
41#include "my_table_map.h"
42#include "my_time.h"
44#include "mysql_time.h"
45#include "sql/comp_creator.h"
46#include "sql/enum_query_type.h"
47#include "sql/item.h" // Item_result_field
48#include "sql/iterators/row_iterator.h" // IWYU pragma: keep
49#include "sql/parse_location.h" // POS
51#include "sql/sql_const.h"
53#include "template_utils.h"
54
55class Comp_creator;
56class Field;
59class JOIN;
60class Json_wrapper;
61class PT_subquery;
65class Query_block;
67class String;
68class THD;
70class my_decimal;
72struct AccessPath;
73class Table_ref;
74
75template <class T>
76class List;
77
78/// Base class that is common to all subqueries and subquery predicates
79
82
83 public:
85
86 /**
87 If !=NO_PLAN_IDX: this Item is in the condition attached to the JOIN_TAB
88 having this index in the parent JOIN.
89 */
91
92 // For EXPLAIN.
95
96 // For EXPLAIN. Only valid if engine_type() == HASH_SJ_ENGINE.
97 const TABLE *get_table() const;
98 const Index_lookup &index_lookup() const;
100
101 void create_iterators(THD *thd);
102 virtual AccessPath *root_access_path() const { return nullptr; }
103
105 SCALAR_SUBQUERY, ///< Scalar or row subquery
106 EXISTS_SUBQUERY, ///< [NOT] EXISTS subquery predicate
107 IN_SUBQUERY, ///< [NOT] IN subquery predicate
108 ALL_SUBQUERY, ///< comp-op ALL quantified comparison predicate
109 ANY_SUBQUERY ///< comp-op ANY quantified comparison predicate
110 };
111
112 /// Accumulate used tables
116 }
117
118 virtual Subquery_type subquery_type() const = 0;
119
120 /**
121 @returns whether this subquery is a single column scalar subquery.
122 (Note that scalar and row subqueries are both represented as
123 scalar subqueries, this function can be used to distinguish them)
124 */
125 virtual bool is_single_column_scalar_subquery() const { return false; }
126
127 /// Return whether this subquery references any tables in the directly
128 /// containing query block, i.e. whether there are outer references to the
129 /// containing block inside the subquery.
131 return (used_tables() & ~PSEUDO_TABLE_BITS) != 0;
132 }
133
134 void cleanup() override;
135 /**
136 Reset state after a single execution of a subquery, useful when a
137 dependent subquery must be evaluated multiple times for varying values
138 of the outer references.
139 This is a lighter cleanup procedure than the one provided by cleanup().
140 */
141 virtual void reset() {
142 m_value_assigned = false;
143 null_value = true;
144 }
145 bool is_value_assigned() const { return m_value_assigned; }
148 enum Type type() const override;
149 bool is_null() override { return update_null_value() || null_value; }
150 bool fix_fields(THD *thd, Item **ref) override;
151 void fix_after_pullout(Query_block *parent_query_block,
152 Query_block *removed_query_block) override;
153 virtual bool exec(THD *thd);
154 table_map used_tables() const override { return m_used_tables_cache; }
155 table_map not_null_tables() const override { return 0; }
156 /// @returns used tables for subquery (excluding any left-hand expression)
158 Item *get_tmp_table_item(THD *thd) override;
159 void update_used_tables() override;
160 void print(const THD *thd, String *str,
161 enum_query_type query_type) const override;
162
165 }
166
167 /*
168 True if this subquery has been already evaluated. Implemented only for
169 single select and union subqueries only.
170 */
171 bool is_evaluated() const;
172 bool is_uncacheable() const;
173
174 /**
175 Used by max/min subquery to initialize value presence registration
176 mechanism. Engine calls this function before re-execution of subquery.
177 */
178 virtual void reset_has_values() {}
179 /**
180 @returns the "place" where this subquery is located in the simply
181 containing query block.
182 */
184
185 bool walk(Item_processor processor, enum_walk walk, uchar *arg) override;
186 bool explain_subquery_checker(uchar **arg) override;
187 bool inform_item_in_cond_of_tab(uchar *arg) override;
188 bool clean_up_after_removal(uchar *arg) override;
189
190 const char *func_name() const override {
191 assert(0);
192 return "subquery";
193 }
194
197 pointer_cast<Check_function_as_value_generator_parameters *>(args);
198 func_arg->err_code = func_arg->get_unnamed_function_error_code();
199 return true;
200 }
201
202 /// argument used by walk method collect_scalar_subqueries ("css")
204 ///< accumulated all subq (or aggregates) found
205 std::vector<Item_subselect *> list;
208 bool contains(Query_expression *candidate) {
209 for (auto sq : list) {
210 if (sq->m_query_expr == candidate) return true;
211 }
212 return false;
213 }
214 };
215
216 bool collect_subqueries(uchar *) override;
217 Item *replace_item_field(uchar *arg) override;
218 Item *replace_item_view_ref(uchar *arg) override;
219
220 protected:
222 explicit Item_subselect(const POS &pos) : super(pos) { set_subquery(); }
223 /**
224 Bind this subquery object with the supplied query expression.
225 As part of transformations, this function may re-bind the subquery to
226 a different query expression.
227
228 @param qe supplied query expression
229 */
230 void bind(Query_expression *qe);
231
232 /// The query expression of the subquery
233 Query_expression *m_query_expr{nullptr}; // Actual value set in construction
234
235 /// The query result object associated with the query expression
237
238 /// Only relevant for Item_in_subselect; optimized structure used for
239 /// execution in place of running the entire subquery.
241
242 /// cache of used tables
244 /// cache of used tables from subquery only (not including LHS of IN subquery)
246
247 /// allowed number of columns (1 for scalar subqueries)
248 uint m_max_columns{0}; // Irrelevant value, actually set during construction
249 /// where subquery is placed
251
252 private:
253 bool subq_opt_away_processor(uchar *arg) override;
254
255 /// Accumulate properties from underlying query expression
257 /// Accumulate properties from underlying query block
259 /// Accumulate properties from a selected expression within a query block.
260 void accumulate_expression(Item *item);
261 /// Accumulate properties from a condition or GROUP/ORDER within a query
262 /// block.
263 void accumulate_condition(Item *item);
264
265 /// True if value has been assigned to subquery
266 bool m_value_assigned{false};
267 /**
268 Whether or not execution of this subquery has been traced by
269 optimizer tracing already. If optimizer trace option
270 REPEATED_SUBSELECT is disabled, this is used to disable tracing
271 after the first one.
272 */
273 bool m_traced_before{false};
274};
275
276/// Class that represents scalar subquery and row subquery
277
279 public:
282
283 bool fix_fields(THD *thd, Item **ref) override;
284 void cleanup() override;
285 Subquery_type subquery_type() const override { return SCALAR_SUBQUERY; }
286 bool create_row(const mem_root_deque<Item *> &item_list, Item_cache **row,
287 bool possibly_empty);
288
289 bool is_single_column_scalar_subquery() const override;
290
291 void reset() override;
292 void store(uint i, Item *item);
293 double val_real() override;
294 longlong val_int() override;
295 String *val_str(String *) override;
296 my_decimal *val_decimal(my_decimal *) override;
297 bool val_json(Json_wrapper *result) override;
298 bool get_date(MYSQL_TIME *ltime, my_time_flags_t fuzzydate) override;
299 bool get_time(MYSQL_TIME *ltime) override;
300 bool val_bool() override;
301 enum Item_result result_type() const override;
302 bool resolve_type(THD *) override;
303
304 /*
305 Mark the subquery as having no rows.
306 If there are aggregate functions (in the outer query),
307 we need to generate a NULL row. @c return_zero_rows().
308 */
309 void no_rows_in_result() override;
310
311 uint cols() const override;
312
313 /**
314 @note that this returns the i-th element of the SELECT list.
315 To check for nullability, look at this->is_nullable() and not
316 element_index[i]->is_nullable(), since the selected expressions are
317 always NULL if the subquery is empty.
318 */
319 Item *element_index(uint i) override { return m_row[i]; }
320 Item **addr(uint i) override { return pointer_cast<Item **>(m_row) + i; }
321 bool check_cols(uint c) override;
322 bool null_inside() override;
323 void bring_value() override;
324
325 bool collect_scalar_subqueries(uchar *) override;
326 virtual bool is_maxmin() const { return false; }
327
328 /**
329 Argument for walk method replace_scalar_subquery
330 */
332 Item_singlerow_subselect *m_target; ///< subquery to be replaced with field
333 Field *m_field; ///< the replacement field
334 Query_block *m_outer_query_block; ///< The transformed query block.
335 Query_block *m_inner_query_block; ///< The immediately surrounding query
336 ///< block. This will be the transformed
337 ///< block or a subquery of it
338 bool m_add_coalesce{false};
340 Query_block *select, bool add_coalesce)
341 : m_target(target),
342 m_field(field),
343 m_outer_query_block(select),
344 m_inner_query_block(select),
345 m_add_coalesce(add_coalesce) {}
346 };
347
348 Item *replace_scalar_subquery(uchar *arge) override;
349 /**
350 This method is used to implement a special case of semantic tree
351 rewriting, mandated by a SQL:2003 exception in the specification.
352 The only caller of this method is handle_sql2003_note184_exception(),
353 see the code there for more details.
354 Note that this method breaks the object internal integrity, by
355 removing it's association with the corresponding Query_block,
356 making this object orphan from the parse tree.
357 No other method, beside the destructor, should be called on this
358 object, as it is now invalid.
359 @return the Query_block structure that was given in the constructor.
360 */
362 std::optional<ContainedSubquery> get_contained_subquery(
363 const Query_block *outer_query_block) override;
365
366 private:
367 /// Value cache of a scalar subquery
369 /**
370 Value cache for a row or scalar subquery. In case of a scalar subquery,
371 m_row points directly at m_value. In case of a row subquery, m_row
372 is an array of pointers to individual Item_cache objects.
373 */
374 Item_cache **m_row{nullptr};
375 bool m_no_rows{false}; ///< @c no_rows_in_result
376};
377
378/* used in static ALL/ANY optimization */
380 public:
381 /**
382 Create an Item for use in transformation of quantified comparison
383 predicates that can be evaluated using MAX or MIN aggregation.
384
385 @param parent The quantified comparison predicate that is transformed.
386 @param query_block The query block representing the inner part of the subq.
387 @param max_arg Whether the aggregation is for MAX or MIN.
388 */
390 bool max_arg);
391 void print(const THD *thd, String *str,
392 enum_query_type query_type) const override;
393 void cleanup() override;
394 bool has_values() const { return m_has_values; }
395 void register_value() { m_has_values = true; }
396 void reset_has_values() override { m_has_values = false; }
397 bool is_maxmin() const override { return true; }
398
399 private:
400 bool m_max; ///< True if performing MAX, false if MIN
401 bool m_has_values{false}; ///< Set if we have found at least one row
402};
403
404/// Classes that represent predicates over table subqueries:
405/// [NOT] EXISTS, [NOT] IN, ANY/SOME and ALL
406
407/**
408 Strategy which will be used to handle this subquery: flattening to a
409 semi-join, conversion to a derived table, rewrite of IN to EXISTS...
410 Sometimes the strategy is first only a candidate, then the real decision
411 happens in a second phase. Other times the first decision is final.
412 */
413enum class Subquery_strategy : int {
414 /// Nothing decided yet
416 /// Candidate for rewriting IN(subquery) to EXISTS, or subquery
417 /// materialization
419 /// Candidate for semi-join flattening
421 /// Candidate for rewriting to joined derived table
423 /// Semi-join flattening
424 SEMIJOIN,
425 /// Rewrite to joined derived table
427 /// Evaluate as EXISTS subquery (possibly after rewriting from another type)
429 /// Subquery materialization (HASH_SJ_ENGINE)
431 /// Subquery has been deleted, probably because it was always false
432 DELETED,
433};
434
437
438 public:
439 /**
440 Create an Item that represents an EXISTS subquery predicate, or any
441 quantified comparison predicate that uses the same base class.
442
443 @param query_block First query block of query expression representing
444 the contained subquery.
445 */
446 explicit Item_exists_subselect(Query_block *query_block);
447
449
450 explicit Item_exists_subselect(const POS &pos) : super(pos) {}
451
452 // The left-hand expression of the subquery predicate. Unused with EXISTS
453 Item *left_expr{nullptr};
454
455 /// Priority of this predicate in the convert-to-semi-join-nest process.
457 /// Execution strategy chosen for this Item
459 /// Used by the transformation to derived table
461
462 /**
463 Used by subquery optimizations to keep track about where this subquery
464 predicate is located, and whether it is a candidate for transformation.
465 (Table_ref*) 1 - the predicate is an AND-part of the WHERE
466 join nest pointer - the predicate is an AND-part of ON expression
467 of a join nest
468 NULL - for all other locations. It also means that the
469 predicate is not a candidate for transformation.
470 See also THD::emb_on_expr_nest.
471
472 As for the second case above (the join nest pointer), note that this value
473 may change if scalar subqueries are transformed to derived tables,
474 cf. transform_scalar_subqueries_to_join_with_derived, due to the need to
475 build new join nests. The change is performed in Query_block::nest_derived.
476 */
478
480
481 /*
482 Transform subquery predicate to a form that can be executed, e.g.
483 as an EXISTS subquery, or a MAX or MIN aggregation on the subquery.
484
485 This is a virtual function that has implementations for EXISTS, IN
486 and quantified comparison subquery predicates.
487
488 @param thd Thread handle
489 @param[out] transformed Points to transformed representation of the object
490 if unchanged: No transformation was performed
491
492 @returns false if success, true if error
493 */
494 virtual bool transformer(THD *thd, Item **transformed);
495
496 Subquery_type subquery_type() const override { return EXISTS_SUBQUERY; }
497 bool is_bool_func() const override { return true; }
498 void reset() override {
500 m_value = false;
501 }
502
503 enum Item_result result_type() const override { return INT_RESULT; }
504 /*
505 The item is
506 ([NOT] IN/EXISTS) [ IS [NOT] TRUE|FALSE ]
507 */
509 bool with_is_op() const {
510 switch (value_transform) {
511 case BOOL_IS_TRUE:
512 case BOOL_IS_FALSE:
513 case BOOL_NOT_TRUE:
514 case BOOL_NOT_FALSE:
515 return true;
516 default:
517 return false;
518 }
519 }
520 /// True if the IS TRUE/FALSE wasn't explicit in the query
521 bool implicit_is_op = false;
522 Item *truth_transformer(THD *, enum Bool_test test) override;
523 bool translate(bool &null_v, bool v);
524 void apply_is_true() override {
525 const bool had_is = with_is_op();
527 if (!had_is && value_transform == BOOL_IS_TRUE)
528 implicit_is_op = true; // needn't be written by EXPLAIN
529 }
530 /// True if the Item has decided that it can do antijoin
531 bool can_do_aj = false;
533 bool fix_fields(THD *thd, Item **ref) override;
534 longlong val_int() override;
535 double val_real() override;
536 String *val_str(String *) override;
537 my_decimal *val_decimal(my_decimal *) override;
538 bool val_bool() override;
539 bool get_date(MYSQL_TIME *ltime, my_time_flags_t fuzzydate) override {
540 return get_date_from_int(ltime, fuzzydate);
541 }
542 bool get_time(MYSQL_TIME *ltime) override { return get_time_from_int(ltime); }
543 bool resolve_type(THD *thd) override;
544 void print(const THD *thd, String *str,
545 enum_query_type query_type) const override;
546
548
549 protected:
550 bool is_semijoin_candidate(THD *thd);
551 bool is_derived_candidate(THD *thd);
552
553 /// value of this item (boolean: exists/not-exists)
554 bool m_value{false};
555
556 /**
557 True if naked IN is allowed to exchange FALSE for UNKNOWN.
558 Because this is about the naked IN, there is no public ignore_unknown(),
559 intentionally, so that callers don't get it wrong.
560 */
561 bool abort_on_null{false};
562};
563
564/**
565 Representation of IN subquery predicates of the form
566 "left_expr IN (SELECT ...)".
567
568 @details
569 This class has:
570 - A "subquery execution engine" (as a subclass of Item_subselect) that allows
571 it to evaluate subqueries. (and this class participates in execution by
572 having m_was_null variable where part of execution result is stored.
573 - Transformation methods (todo: more on this).
574
575 This class is not used directly, it is "wrapped" into Item_in_optimizer
576 which provides some small bits of subquery evaluation.
577*/
578
581
582 public:
584 Item_in_subselect(const POS &pos, Item *left_expr,
585 PT_subquery *pt_subquery_arg);
586
588
589 bool do_itemize(Parse_context *pc, Item **res) override;
590
591 void cleanup() override;
592 Subquery_type subquery_type() const override { return IN_SUBQUERY; }
593
594 void reset() override {
595 m_value = false;
596 null_value = false;
597 m_was_null = false;
598 }
599 bool transformer(THD *thd, Item **transformed) override;
601 Item **transformed);
603 Item **transformed);
604 bool row_value_transformer(THD *thd, Item **transformed);
606 Comp_creator *func);
608 Item_in_optimizer *optimizer);
609 bool subquery_allows_materialization(THD *thd, Query_block *query_block,
610 const Query_block *outer);
611 bool walk(Item_processor processor, enum_walk walk, uchar *arg) override;
613 Item *compile(Item_analyzer analyzer, uchar **arg_p,
614 Item_transformer transformer, uchar *arg_t) override;
615
616 bool exec(THD *thd) override;
617 longlong val_int() override;
618 double val_real() override;
619 String *val_str(String *) override;
620 my_decimal *val_decimal(my_decimal *) override;
621 bool val_bool() override;
622 bool test_limit();
623 void print(const THD *thd, String *str,
624 enum_query_type query_type) const override;
625 void fix_after_pullout(Query_block *parent_query_block,
626 Query_block *removed_query_block) override;
627 void update_used_tables() override;
628 bool init_left_expr_cache(THD *thd);
629
630 /**
631 Once the decision to use IN->EXISTS has been taken, performs some last
632 steps of this transformation.
633 */
634 bool finalize_exists_transform(THD *thd, Query_block *select);
635 /**
636 Once the decision to use materialization has been taken, performs some
637 last steps of this transformation.
638 */
640 AccessPath *root_access_path() const override;
641 std::optional<ContainedSubquery> get_contained_subquery(
642 const Query_block *outer_query_block) override;
643
645 return m_in2exists_info != nullptr && m_in2exists_info->added_to_where;
646 }
647
648 /// Is reliable only if IN->EXISTS has been done.
650 return m_in2exists_info->dependent_before;
651 }
652
653 bool *get_cond_guard(int i) const {
654 return m_pushed_cond_guards != nullptr ? m_pushed_cond_guards + i : nullptr;
655 }
656 void set_cond_guard_var(int i, bool v) const {
657 if (m_pushed_cond_guards != nullptr) m_pushed_cond_guards[i] = v;
658 }
659
662 friend class Item_in_optimizer;
665
666 /// Used to trigger on/off conditions that were pushed down to subquery
667 bool *m_pushed_cond_guards{nullptr};
668
669 /// Point on NOT/NOP before ALL/SOME subquery
671
672 protected:
673 /**
674 Cache of the left operand of the subquery predicate. Allocated in the
675 runtime memory root, for each execution, thus need not be freed.
676 */
678
679 /// Whether m_left_expr_cache holds a value
681
682 /// The need for expr cache may be optimized away, @sa init_left_expr_cache.
683 bool need_expr_cache{true};
684
685 private:
686 bool mark_as_outer(Item *left_operand, size_t col);
687
688 /**
689 In the case of
690
691 x COMP_OP (SELECT1 UNION SELECT2 ...)
692
693 - the subquery transformation is done on SELECT1; this requires wrapping
694 'x' with more Item layers, and injecting that in a condition in SELECT1.
695
696 - the same transformation is done on SELECT2; but the wrapped 'x' doesn't
697 need to be created again, the one created for SELECT1 could be reused
698
699 - to achieve this, the wrapped 'x' is stored in member
700 'm_injected_left_expr' when it is created for SELECT1, and is later
701 reused for SELECT2.
702
703 This will refer to a cached value which is reevaluated once for each
704 candidate row, cf. setup in #single_value_transformer.
705 */
707
708 bool m_was_null{false};
709
710 /**
711 This bundles several pieces of information useful when doing the
712 IN->EXISTS transform. If this transform has not been done, pointer is
713 NULL.
714 */
716 /**
717 True: if IN->EXISTS has been done and has added a condition to the
718 subquery's WHERE clause.
719 */
721 /**
722 True: if subquery was dependent (correlated) before IN->EXISTS
723 was done.
724 */
726 /**
727 True: if subquery was dependent (correlated) after IN->EXISTS
728 was done.
729 */
731 } *m_in2exists_info{nullptr};
732
734
735 bool val_bool_naked();
736};
737
738/**
739 Class that represents a quantified comparison predicate.
740
741 expression comp-op ANY ( subquery )
742 expression comp-op ALL ( subquery )
743
744 Note that the special cases = ANY (aka IN) and <> ALL (aka NOT IN)
745 are handled by the base class Item_in_subselect.
746*/
748 public:
750 Query_block *select, bool all);
751
752 Subquery_type subquery_type() const override {
754 }
755 bool transformer(THD *thd, Item **transformed) override;
756 void print(const THD *thd, String *str,
757 enum_query_type query_type) const override;
758
761 bool m_all;
762};
763
764/**
765 A subquery execution engine that evaluates the subquery by doing index
766 lookups in a single table's index.
767
768 This engine is used to resolve subqueries in forms
769
770 outer_expr IN (SELECT tbl.key FROM tbl WHERE subq_where)
771
772 or, row-based:
773
774 (oe1, .. oeN) IN (SELECT key_part1, ... key_partK
775 FROM tbl WHERE subqwhere)
776
777 i.e. the subquery is a single table SELECT without GROUP BY, aggregate
778 functions, etc.
779*/
781 protected:
782 Query_result_union *result = nullptr; /* results storage class */
783 /// Table which is read, using one of eq_ref, ref, ref_or_null.
784 TABLE *table{nullptr};
788 Item *m_cond; ///< The WHERE condition of the subquery
789 ulonglong m_hash; ///< Hash value calculated by RefIterator, when needed.
790 /*
791 The "having" clause. This clause (further referred to as "artificial
792 having") was inserted by subquery transformation code. It contains
793 Item(s) that have a side-effect: they record whether the subquery has
794 produced a row with NULL certain components. We need to use it for cases
795 like
796 (oe1, oe2) IN (SELECT t.key, t.no_key FROM t1)
797 where we do index lookup on t.key=oe1 but need also to check if there
798 was a row such that t.no_key IS NULL.
799 */
801
802 Item_in_subselect *item; /* item that uses this engine */
803
804 public:
806
808 const Index_lookup &ref,
809 enum join_type join_type,
811 Item *having)
812 : table(table),
814 ref(ref),
816 m_cond(where),
817 m_having(having),
818 item(subs) {}
820 virtual bool exec(THD *thd);
821 virtual void print(const THD *thd, String *str, enum_query_type query_type);
823 virtual void cleanup() {}
824 virtual void create_iterators(THD *) {}
825};
826
827/*
828 This function is actually defined in sql_parse.cc, but it depends on
829 chooser_compare_func_creator defined in this file.
830 */
833 Query_block *select);
834
835/**
836 Compute an IN predicate via a hash semi-join. The subquery is materialized
837 during the first evaluation of the IN predicate. The IN predicate is executed
838 via the functionality inherited from subselect_indexsubquery_engine.
839*/
840
842 private:
843 /* true if the subquery was materialized into a temp table. */
845 // true if we know for sure that there are zero rows in the table.
846 // Set only after is_materialized is true.
847 bool has_zero_rows = false;
848 /**
849 Existence of inner NULLs in materialized table:
850 By design, other values than IRRELEVANT_OR_FALSE are possible only if the
851 subquery has only one inner expression.
852 */
854 /// none, or they don't matter
856 /// they matter, and we don't know yet if they exists
858 /// they matter, and we know there exists at least one.
859 NEX_TRUE = 2
860 };
865
866 /// Saved result object, must be restored after use
868
869 public:
871 Query_expression *query_expr)
873 in_predicate, nullptr, nullptr),
874 is_materialized(false),
875 m_query_expr(query_expr) {}
876 ~subselect_hash_sj_engine() override;
877
878 bool setup(THD *thd, const mem_root_deque<Item *> &tmp_columns);
879 void cleanup() override;
880 bool exec(THD *thd) override;
881 void print(const THD *thd, String *str, enum_query_type query_type) override;
882 enum_engine_type engine_type() const override { return HASH_SJ_ENGINE; }
883
884 TABLE *get_table() const { return table; }
885 const Index_lookup &index_lookup() const { return ref; }
886 enum join_type get_join_type() const { return type; }
888 void create_iterators(THD *thd) override;
889};
890
891/**
892 Removes every predicate injected by IN->EXISTS.
893
894 This function is different from others:
895 - it wants to remove all traces of IN->EXISTS (for
896 materialization)
897 - remove_subq_pushed_predicates() and remove_additional_cond() want to
898 remove only the conditions of IN->EXISTS which index lookup already
899 satisfies (they are just an optimization).
900
901 If there are no in2exists conditions, it will return the exact same
902 pointer. If it returns a new Item, the old Item is left alone, so it
903 can be reused in other settings.
904
905 @param conds Condition; may be nullptr.
906 @returns new condition
907 */
909
910/// @returns whether the item is a quantified comparison predicate
912
913#endif /* ITEM_SUBSELECT_INCLUDED */
Kerberos Client Authentication nullptr
Definition: auth_kerberos_client_plugin.cc:251
Abstract factory interface for creating comparison predicates.
Definition: item_cmpfunc.h:525
Definition: field.h:575
Class that represents a quantified comparison predicate.
Definition: item_subselect.h:747
Item_allany_subselect(Item *left_expr, chooser_compare_func_creator fc, Query_block *select, bool all)
Definition: item_subselect.cc:1464
bool transformer(THD *thd, Item **transformed) override
Definition: item_subselect.cc:2936
bool m_all
Definition: item_subselect.h:761
Subquery_type subquery_type() const override
Definition: item_subselect.h:752
Comp_creator * m_func
Definition: item_subselect.h:760
void print(const THD *thd, String *str, enum_query_type query_type) const override
This method is used for to:
Definition: item_subselect.cc:2946
chooser_compare_func_creator m_func_creator
Definition: item_subselect.h:759
Definition: item.h:6812
Definition: item_subselect.h:435
enum_condition_context outer_condition_context
Used by the transformation to derived table.
Definition: item_subselect.h:460
bool is_semijoin_candidate(THD *thd)
Definition: item_subselect.cc:1520
void apply_is_true() override
Apply the IS TRUE truth property, meaning that an UNKNOWN result and a FALSE result are treated the s...
Definition: item_subselect.h:524
bool resolve_type(THD *thd) override
Resolve type-related information for this item, such as result field type, maximum size,...
Definition: item_subselect.cc:1481
bool get_date(MYSQL_TIME *ltime, my_time_flags_t fuzzydate) override
Definition: item_subselect.h:539
String * val_str(String *) override
Return the result of EXISTS as a string value.
Definition: item_subselect.cc:1729
bool m_value
value of this item (boolean: exists/not-exists)
Definition: item_subselect.h:554
Item_exists_subselect()
Definition: item_subselect.h:448
double val_real() override
Definition: item_subselect.cc:1715
bool get_time(MYSQL_TIME *ltime) override
Definition: item_subselect.h:542
bool implicit_is_op
True if the IS TRUE/FALSE wasn't explicit in the query.
Definition: item_subselect.h:521
Item * truth_transformer(THD *, enum Bool_test test) override
Informs an item that it is wrapped in a truth test, in case it wants to transforms itself to implemen...
Definition: item_subselect.cc:1392
longlong val_int() override
Definition: item_subselect.cc:1717
Subquery_strategy strategy
Execution strategy chosen for this Item.
Definition: item_subselect.h:458
Item * left_expr
Definition: item_subselect.h:453
bool val_bool() override
Definition: item_subselect.cc:1753
int sj_convert_priority
Priority of this predicate in the convert-to-semi-join-nest process.
Definition: item_subselect.h:456
void reset() override
Reset state after a single execution of a subquery, useful when a dependent subquery must be evaluate...
Definition: item_subselect.h:498
void print(const THD *thd, String *str, enum_query_type query_type) const override
This method is used for to:
Definition: item_subselect.cc:1334
bool abort_on_null
True if naked IN is allowed to exchange FALSE for UNKNOWN.
Definition: item_subselect.h:561
virtual bool transformer(THD *thd, Item **transformed)
Definition: item_subselect.cc:1503
bool is_derived_candidate(THD *thd)
Definition: item_subselect.cc:1611
bool can_do_aj
True if the Item has decided that it can do antijoin.
Definition: item_subselect.h:531
bool with_is_op() const
Definition: item_subselect.h:509
bool fix_fields(THD *thd, Item **ref) override
An object of class Item_in_subselect is always substituted with another object of class Item_in_optim...
Definition: item_subselect.cc:2675
enum Bool_test value_transform
Definition: item_subselect.h:508
void notify_removal() override
Called when an item has been removed, can be used to notify external objects about the removal,...
Definition: item_subselect.h:479
Subquery_type subquery_type() const override
Definition: item_subselect.h:496
Item_subselect super
Definition: item_subselect.h:436
bool translate(bool &null_v, bool v)
Translates the value of the naked EXISTS to a value taking into account the optional NULL and IS [NOT...
Definition: item_subselect.cc:1355
bool is_bool_func() const override
Definition: item_subselect.h:497
Table_ref * embedding_join_nest
Used by subquery optimizations to keep track about where this subquery predicate is located,...
Definition: item_subselect.h:477
bool choose_semijoin_or_antijoin()
Helper for is_semijoin_candidate() and is_derived_candidate().
Definition: item_subselect.cc:1678
Item_exists_subselect(const POS &pos)
Definition: item_subselect.h:450
my_decimal * val_decimal(my_decimal *) override
Return the result of EXISTS as a decimal value.
Definition: item_subselect.cc:1746
enum Item_result result_type() const override
Definition: item_subselect.h:503
Definition: item_cmpfunc.h:920
Definition: item_cmpfunc.h:492
Representation of IN subquery predicates of the form "left_expr IN (SELECT ...)".
Definition: item_subselect.h:579
void fix_after_pullout(Query_block *parent_query_block, Query_block *removed_query_block) override
Definition: item_subselect.cc:2745
my_decimal * val_decimal(my_decimal *) override
Return the result of EXISTS as a decimal value.
Definition: item_subselect.cc:1806
Item * compile(Item_analyzer analyzer, uchar **arg_p, Item_transformer transformer, uchar *arg_t) override
Perform a generic "compilation" of the Item tree, ie transform the Item tree by adding zero or more I...
Definition: item_subselect.cc:782
double val_real() override
Definition: item_subselect.cc:1764
struct Item_in_subselect::In2exists_info nullptr
bool m_left_expr_cache_filled
Whether m_left_expr_cache holds a value.
Definition: item_subselect.h:680
bool single_value_transformer(THD *thd, Comp_creator *func, Item **transformed)
Transform a single-column IN/ALL/ANY subquery predicate.
Definition: item_subselect.cc:1842
void set_cond_guard_var(int i, bool v) const
Definition: item_subselect.h:656
bool row_value_transformer(THD *thd, Item **transformed)
Transform a multi-column IN/ALL/ANY subquery predicate.
Definition: item_subselect.cc:2277
bool mark_as_outer(Item *left_operand, size_t col)
Decide whether to mark the injected left expression "outer" relative to the subquery.
Definition: item_subselect.cc:439
std::optional< ContainedSubquery > get_contained_subquery(const Query_block *outer_query_block) override
If this item represents a IN/ALL/ANY/comparison_operator subquery, return that (along with data on ho...
Definition: item_subselect.cc:2803
Item_func_not_all * m_upper_item
Point on NOT/NOP before ALL/SOME subquery.
Definition: item_subselect.h:670
bool need_expr_cache
The need for expr cache may be optimized away,.
Definition: item_subselect.h:683
bool finalize_materialization_transform(THD *thd, JOIN *join)
Once the decision to use materialization has been taken, performs some last steps of this transformat...
Definition: item_subselect.cc:493
bool do_itemize(Parse_context *pc, Item **res) override
The core function that does the actual itemization.
Definition: item_subselect.cc:1451
void print(const THD *thd, String *str, enum_query_type query_type) const override
This method is used for to:
Definition: item_subselect.cc:2633
void reset() override
Reset state after a single execution of a subquery, useful when a dependent subquery must be evaluate...
Definition: item_subselect.h:594
List< Cached_item > * m_left_expr_cache
Cache of the left operand of the subquery predicate.
Definition: item_subselect.h:677
Item * transform(Item_transformer transformer, uchar *arg) override
Perform a generic transformation of the Item tree, by adding zero or more additional Item objects to ...
Definition: item_subselect.cc:775
bool * m_pushed_cond_guards
Used to trigger on/off conditions that were pushed down to subquery.
Definition: item_subselect.h:667
bool dependent_before_in2exists() const
Is reliable only if IN->EXISTS has been done.
Definition: item_subselect.h:649
AccessPath * root_access_path() const override
Definition: item_subselect.cc:584
PT_subquery * pt_subselect
Definition: item_subselect.h:733
longlong val_int() override
Definition: item_subselect.cc:1771
bool * get_cond_guard(int i) const
Definition: item_subselect.h:653
bool row_value_in_to_exists_transformer(THD *thd, Query_block *select, Item_in_optimizer *optimizer)
Transform a (possibly non-correlated) IN subquery into a correlated EXISTS.
Definition: item_subselect.cc:2342
bool finalize_exists_transform(THD *thd, Query_block *select)
Once the decision to use IN->EXISTS has been taken, performs some last steps of this transformation.
Definition: item_subselect.cc:452
bool val_bool() override
Definition: item_subselect.cc:1785
bool m_was_null
Definition: item_subselect.h:708
bool init_left_expr_cache(THD *thd)
Initialize the cache of the left operand of the IN predicate.
Definition: item_subselect.cc:2770
bool quantified_comp_transformer(THD *thd, Comp_creator *func, Item **transformed)
Perform transformation of quantified comparison predicates (ie.
Definition: item_subselect.cc:2552
void cleanup() override
Called for every Item after use (preparation and execution).
Definition: item_subselect.cc:552
String * val_str(String *) override
Return the result of EXISTS as a string value.
Definition: item_subselect.cc:1778
void update_used_tables() override
Updates used tables, not null tables information and accumulates properties up the item tree,...
Definition: item_subselect.cc:2752
bool in2exists_added_to_where() const
Definition: item_subselect.h:644
bool walk(Item_processor processor, enum_walk walk, uchar *arg) override
Traverses a tree of Items in prefix and/or postfix order.
Definition: item_subselect.cc:769
Item_exists_subselect super
Definition: item_subselect.h:580
Subquery_type subquery_type() const override
Definition: item_subselect.h:592
bool single_value_in_to_exists_transformer(THD *thd, Query_block *select, Comp_creator *func)
Transform an IN predicate into EXISTS via predicate injection.
Definition: item_subselect.cc:2063
bool test_limit()
Definition: item_subselect.cc:1423
Item_in_subselect()
Definition: item_subselect.h:587
bool val_bool_naked()
Definition: item_subselect.cc:1792
Item_ref * m_injected_left_expr
In the case of.
Definition: item_subselect.h:706
bool exec(THD *thd) override
Definition: item_subselect.cc:798
bool transformer(THD *thd, Item **transformed) override
Definition: item_subselect.cc:2536
Definition: item_cmpfunc.h:2328
Definition: item_subselect.h:379
void print(const THD *thd, String *str, enum_query_type query_type) const override
This method is used for to:
Definition: item_subselect.cc:1122
bool m_has_values
Set if we have found at least one row.
Definition: item_subselect.h:401
bool is_maxmin() const override
Definition: item_subselect.h:397
bool m_max
True if performing MAX, false if MIN.
Definition: item_subselect.h:400
void reset_has_values() override
Used by max/min subquery to initialize value presence registration mechanism.
Definition: item_subselect.h:396
void cleanup() override
Called for every Item after use (preparation and execution).
Definition: item_subselect.cc:1115
bool has_values() const
Definition: item_subselect.h:394
void register_value()
Definition: item_subselect.h:395
Item_maxmin_subselect(Item_subselect *parent, Query_block *query_block, bool max_arg)
Create an Item for use in transformation of quantified comparison predicates that can be evaluated us...
Definition: item_subselect.cc:1099
Definition: item.h:6294
Definition: item.h:5892
Item with result field.
Definition: item.h:5815
Class that represents scalar subquery and row subquery.
Definition: item_subselect.h:278
Item * replace_scalar_subquery(uchar *arge) override
When walking the item tree seeing an Item_singlerow_subselect matching a target, replace it with a su...
Definition: item_subselect.cc:3035
enum Item_result result_type() const override
Definition: item_subselect.cc:1142
void store(uint i, Item *item)
Definition: item_subselect.cc:1133
void cleanup() override
Called for every Item after use (preparation and execution).
Definition: item_subselect.cc:400
bool null_inside() override
Definition: item_subselect.cc:1196
Item ** addr(uint i) override
Definition: item_subselect.h:320
double val_real() override
Definition: item_subselect.cc:1210
bool resolve_type(THD *) override
Resolve type-related information for this item, such as result field type, maximum size,...
Definition: item_subselect.cc:1147
void no_rows_in_result() override
Definition: item_subselect.cc:1179
bool val_json(Json_wrapper *result) override
Get a JSON value from an Item.
Definition: item_subselect.cc:1255
Item_cache ** m_row
Value cache for a row or scalar subquery.
Definition: item_subselect.h:374
bool m_no_rows
no_rows_in_result
Definition: item_subselect.h:375
void reset() override
Reset state after a single execution of a subquery, useful when a dependent subquery must be evaluate...
Definition: item_subselect.cc:1128
Subquery_type subquery_type() const override
Definition: item_subselect.h:285
bool get_date(MYSQL_TIME *ltime, my_time_flags_t fuzzydate) override
Definition: item_subselect.cc:1266
std::optional< ContainedSubquery > get_contained_subquery(const Query_block *outer_query_block) override
If this item represents a IN/ALL/ANY/comparison_operator subquery, return that (along with data on ho...
Definition: item_subselect.cc:3074
longlong val_int() override
Definition: item_subselect.cc:1221
uint cols() const override
Definition: item_subselect.cc:3285
virtual bool is_maxmin() const
Definition: item_subselect.h:326
bool is_single_column_scalar_subquery() const override
Definition: item_subselect.cc:1138
bool fix_fields(THD *thd, Item **ref) override
Definition: item_subselect.cc:330
Item * element_index(uint i) override
Definition: item_subselect.h:319
Item_singlerow_subselect()
Definition: item_subselect.h:281
Query_block * invalidate_and_restore_query_block()
This method is used to implement a special case of semantic tree rewriting, mandated by a SQL:2003 ex...
Definition: item_subselect.cc:914
bool collect_scalar_subqueries(uchar *) override
Definition: item_subselect.cc:2960
bool get_time(MYSQL_TIME *ltime) override
Definition: item_subselect.cc:1278
String * val_str(String *) override
Definition: item_subselect.cc:1232
bool val_bool() override
Definition: item_subselect.cc:1289
void bring_value() override
Definition: item_subselect.cc:1203
bool create_row(const mem_root_deque< Item * > &item_list, Item_cache **row, bool possibly_empty)
Makes storage for the output values for a scalar or row subquery and calculates their data and column...
Definition: item_subselect.cc:3191
bool check_cols(uint c) override
Definition: item_subselect.cc:1188
my_decimal * val_decimal(my_decimal *) override
Definition: item_subselect.cc:1243
Item_cache * m_value
Value cache of a scalar subquery.
Definition: item_subselect.h:368
Base class that is common to all subqueries and subquery predicates.
Definition: item_subselect.h:80
subselect_indexsubquery_engine * indexsubquery_engine
Only relevant for Item_in_subselect; optimized structure used for execution in place of running the e...
Definition: item_subselect.h:240
Item * replace_item_view_ref(uchar *arg) override
Transform processor.
Definition: item_subselect.cc:3175
void set_value_assigned()
Definition: item_subselect.h:146
bool clean_up_after_removal(uchar *arg) override
Clean up after removing the subquery from the item tree.
Definition: item_subselect.cc:2896
bool is_evaluated() const
Definition: item_subselect.cc:2942
enum_parsing_context m_parsing_place
where subquery is placed
Definition: item_subselect.h:250
bool collect_subqueries(uchar *) override
Definition: item_subselect.cc:2929
table_map used_tables() const override
Definition: item_subselect.h:154
void accumulate_expression(Item *item)
Accumulate properties from a selected expression within a query block.
Definition: item_subselect.cc:264
void accumulate_used_tables(table_map add_tables)
Accumulate used tables.
Definition: item_subselect.h:113
Query_expression * m_query_expr
The query expression of the subquery.
Definition: item_subselect.h:233
virtual Subquery_type subquery_type() const =0
bool check_function_as_value_generator(uchar *args) override
Check if this item is allowed for a virtual column or inside a default expression.
Definition: item_subselect.h:195
table_map subquery_used_tables() const
Definition: item_subselect.h:157
bool is_uncacheable() const
Definition: item_subselect.cc:3290
void accumulate_properties()
Accumulate properties from underlying query expression.
Definition: item_subselect.cc:200
virtual bool exec(THD *thd)
Definition: item_subselect.cc:675
Query_expression * query_expr() const
Definition: item_subselect.h:84
enum_engine_type
Definition: item_subselect.h:93
@ INDEXSUBQUERY_ENGINE
Definition: item_subselect.h:93
@ HASH_SJ_ENGINE
Definition: item_subselect.h:93
@ OTHER_ENGINE
Definition: item_subselect.h:93
void print(const THD *thd, String *str, enum_query_type query_type) const override
This method is used for to:
Definition: item_subselect.cc:874
Subquery_type
Definition: item_subselect.h:104
@ ALL_SUBQUERY
comp-op ALL quantified comparison predicate
Definition: item_subselect.h:108
@ IN_SUBQUERY
[NOT] IN subquery predicate
Definition: item_subselect.h:107
@ SCALAR_SUBQUERY
Scalar or row subquery.
Definition: item_subselect.h:105
@ ANY_SUBQUERY
comp-op ANY quantified comparison predicate
Definition: item_subselect.h:109
@ EXISTS_SUBQUERY
[NOT] EXISTS subquery predicate
Definition: item_subselect.h:106
bool explain_subquery_checker(uchar **arg) override
Register subquery to the table where it is used within a condition.
Definition: item_subselect.cc:668
bool m_value_assigned
True if value has been assigned to subquery.
Definition: item_subselect.h:266
Item * get_tmp_table_item(THD *thd) override
If an Item is materialized in a temporary table, a different Item may have to be used in the part of ...
Definition: item_subselect.cc:853
enum_parsing_context place()
Definition: item_subselect.h:183
virtual void reset()
Reset state after a single execution of a subquery, useful when a dependent subquery must be evaluate...
Definition: item_subselect.h:141
Item * replace_item_field(uchar *arg) override
Transform processor.
Definition: item_subselect.cc:3165
join_type get_join_type() const
Definition: item_subselect.cc:310
int in_cond_of_tab
If !=NO_PLAN_IDX: this Item is in the condition attached to the JOIN_TAB having this index in the par...
Definition: item_subselect.h:90
void accumulate_condition(Item *item)
Accumulate properties from a condition or GROUP/ORDER within a query block.
Definition: item_subselect.cc:275
virtual AccessPath * root_access_path() const
Definition: item_subselect.h:102
void create_iterators(THD *thd)
Definition: item_subselect.cc:280
void cleanup() override
Called for every Item after use (preparation and execution).
Definition: item_subselect.cc:315
Query_result_interceptor * m_query_result
The query result object associated with the query expression.
Definition: item_subselect.h:236
table_map m_subquery_used_tables
cache of used tables from subquery only (not including LHS of IN subquery)
Definition: item_subselect.h:245
const TABLE * get_table() const
Definition: item_subselect.cc:300
enum Type type() const override
Definition: item_subselect.cc:851
bool fix_fields(THD *thd, Item **ref) override
Definition: item_subselect.cc:605
void set_indexsubquery_engine(subselect_indexsubquery_engine *eng)
Definition: item_subselect.h:163
const char * func_name() const override
Definition: item_subselect.h:190
void bind(Query_expression *qe)
Bind this subquery object with the supplied query expression.
Definition: item_subselect.cc:144
void reset_value_assigned()
Definition: item_subselect.h:147
bool contains_outer_references() const
Return whether this subquery references any tables in the directly containing query block,...
Definition: item_subselect.h:130
table_map not_null_tables() const override
Return table map of tables that can't be NULL tables (tables that are used in a context where if they...
Definition: item_subselect.h:155
void update_used_tables() override
Updates used tables, not null tables information and accumulates properties up the item tree,...
Definition: item_subselect.cc:865
bool walk(Item_processor processor, enum_walk walk, uchar *arg) override
Traverses a tree of Items in prefix and/or postfix order.
Definition: item_subselect.cc:647
Item_subselect()
Definition: item_subselect.h:221
bool is_null() override
The method allows to determine nullness of a complex expression without fully evaluating it,...
Definition: item_subselect.h:149
const Index_lookup & index_lookup() const
Definition: item_subselect.cc:305
enum_engine_type engine_type() const
Definition: item_subselect.cc:286
bool is_value_assigned() const
Definition: item_subselect.h:145
Item_result_field super
Definition: item_subselect.h:81
bool m_traced_before
Whether or not execution of this subquery has been traced by optimizer tracing already.
Definition: item_subselect.h:273
bool inform_item_in_cond_of_tab(uchar *arg) override
Tells an Item that it is in the condition of a JOIN_TAB of a query block.
Definition: item_subselect.cc:2868
virtual void reset_has_values()
Used by max/min subquery to initialize value presence registration mechanism.
Definition: item_subselect.h:178
bool subq_opt_away_processor(uchar *arg) override
Mark the subquery as optimized away, for EXPLAIN.
Definition: item_subselect.cc:2880
uint m_max_columns
allowed number of columns (1 for scalar subqueries)
Definition: item_subselect.h:248
virtual bool is_single_column_scalar_subquery() const
Definition: item_subselect.h:125
void fix_after_pullout(Query_block *parent_query_block, Query_block *removed_query_block) override
Definition: item_subselect.cc:749
Item_subselect(const POS &pos)
Definition: item_subselect.h:222
table_map m_used_tables_cache
cache of used tables
Definition: item_subselect.h:243
Base class that is used to represent any kind of expression in a relational query.
Definition: item.h:936
void set_subquery()
Set the "has subquery" property.
Definition: item.h:3398
bool null_value
True if item is null.
Definition: item.h:3671
Type
Definition: item.h:971
Bool_test
< Modifier for result transformation
Definition: item.h:1013
@ BOOL_NOT_FALSE
Definition: item.h:1018
@ BOOL_NOT_TRUE
Definition: item.h:1017
@ BOOL_IS_TRUE
Definition: item.h:1014
@ BOOL_IS_FALSE
Definition: item.h:1015
@ BOOL_IDENTITY
Definition: item.h:1020
bool get_date_from_int(MYSQL_TIME *ltime, my_time_flags_t flags)
Convert val_int() to date in MYSQL_TIME.
Definition: item.cc:1629
bool update_null_value()
Make sure the null_value member has a correct value.
Definition: item.cc:7645
bool get_time_from_int(MYSQL_TIME *ltime)
Convert val_int() to time in MYSQL_TIME.
Definition: item.cc:1716
Definition: sql_optimizer.h:133
Abstraction for accessing JSON values irrespective of whether they are (started out as) binary JSON v...
Definition: json_dom.h:1153
Definition: sql_list.h:467
Definition: parse_tree_nodes.h:1781
Base class for parse tree nodes (excluding the Parse_tree_root hierarchy)
Definition: parse_tree_node_base.h:231
This class represents a query block, aka a query specification, which is a query consisting of a SELE...
Definition: sql_lex.h:1167
This class represents a query expression (one query block or several query blocks combined with UNION...
Definition: sql_lex.h:626
Definition: item_subselect.cc:1300
Definition: query_result.h:181
Query result class for scalar and row subqueries.
Definition: item_subselect.cc:107
Base class for result from a subquery.
Definition: query_result.h:312
Definition: sql_union.h:40
Using this class is fraught with peril, and you need to be very careful when doing so.
Definition: sql_string.h:167
For each client connection we create a separate thread with THD serving as a thread/connection descri...
Definition: sql_lexer_thd.h:36
Definition: table.h:2865
Object containing parameters used when creating and using temporary tables.
Definition: temp_table_param.h:95
A (partial) implementation of std::deque allocating its blocks on a MEM_ROOT.
Definition: mem_root_deque.h:172
my_decimal class limits 'decimal_t' type to what we need in MySQL.
Definition: my_decimal.h:95
Compute an IN predicate via a hash semi-join.
Definition: item_subselect.h:841
void create_iterators(THD *thd) override
Definition: item_subselect.cc:3529
void print(const THD *thd, String *str, enum_query_type query_type) override
Print the state of this engine into a string for debugging and views.
Definition: item_subselect.cc:3762
nulls_exist
Existence of inner NULLs in materialized table: By design, other values than IRRELEVANT_OR_FALSE are ...
Definition: item_subselect.h:853
@ NEX_TRUE
they matter, and we know there exists at least one.
Definition: item_subselect.h:859
@ NEX_UNKNOWN
they matter, and we don't know yet if they exists
Definition: item_subselect.h:857
@ NEX_IRRELEVANT_OR_FALSE
none, or they don't matter
Definition: item_subselect.h:855
void cleanup() override
Cleanup performed after each execution.
Definition: item_subselect.cc:3607
unique_ptr_destroy_only< RowIterator > m_iterator
Definition: item_subselect.h:863
subselect_hash_sj_engine(Item_in_subselect *in_predicate, Query_expression *query_expr)
Definition: item_subselect.h:870
TABLE * get_table() const
Definition: item_subselect.h:884
~subselect_hash_sj_engine() override
Definition: item_subselect.cc:3596
Query_result_interceptor * saved_result
Saved result object, must be restored after use.
Definition: item_subselect.h:867
enum nulls_exist mat_table_has_nulls
Definition: item_subselect.h:861
bool is_materialized
Definition: item_subselect.h:844
Query_expression *const m_query_expr
Definition: item_subselect.h:862
bool has_zero_rows
Definition: item_subselect.h:847
const Index_lookup & index_lookup() const
Definition: item_subselect.h:885
bool exec(THD *thd) override
Execute a subquery IN predicate via materialization.
Definition: item_subselect.cc:3642
enum_engine_type engine_type() const override
Definition: item_subselect.h:882
AccessPath * root_access_path() const
Definition: item_subselect.h:887
bool setup(THD *thd, const mem_root_deque< Item * > &tmp_columns)
Create all structures needed for subquery execution using hash semijoin.
Definition: item_subselect.cc:3358
enum join_type get_join_type() const
Definition: item_subselect.h:886
AccessPath * m_root_access_path
Definition: item_subselect.h:864
A subquery execution engine that evaluates the subquery by doing index lookups in a single table's in...
Definition: item_subselect.h:780
Item * m_cond
The WHERE condition of the subquery.
Definition: item_subselect.h:788
TABLE * table
Table which is read, using one of eq_ref, ref, ref_or_null.
Definition: item_subselect.h:784
virtual ~subselect_indexsubquery_engine()=default
virtual void cleanup()
Definition: item_subselect.h:823
virtual bool exec(THD *thd)
Definition: item_subselect.cc:3274
virtual void print(const THD *thd, String *str, enum_query_type query_type)
Definition: item_subselect.cc:3294
virtual void create_iterators(THD *)
Definition: item_subselect.h:824
Item * m_having
Definition: item_subselect.h:800
join_type type
Definition: item_subselect.h:787
enum_engine_type
Definition: item_subselect.h:805
@ HASH_SJ_ENGINE
Definition: item_subselect.h:805
@ INDEXSUBQUERY_ENGINE
Definition: item_subselect.h:805
Index_lookup ref
Definition: item_subselect.h:786
subselect_indexsubquery_engine(TABLE *table, Table_ref *table_ref, const Index_lookup &ref, enum join_type join_type, Item_in_subselect *subs, Item *where, Item *having)
Definition: item_subselect.h:807
ulonglong m_hash
Hash value calculated by RefIterator, when needed.
Definition: item_subselect.h:789
virtual enum_engine_type engine_type() const
Definition: item_subselect.h:822
Item_in_subselect * item
Definition: item_subselect.h:802
Table_ref * table_ref
Definition: item_subselect.h:785
Comp_creator *(*)(bool invert) chooser_compare_func_creator
Convenience typedef for a function that returns factories for Item comparators (ie....
Definition: comp_creator.h:39
static int cmp(Bigint *a, Bigint *b)
Definition: dtoa.cc:1057
enum_query_type
Query type constants (usable as bitmap flags).
Definition: enum_query_type.h:31
This file contains the field type.
bool subquery_allows_materialization(THD *thd, Query_block *query_block, const Query_block *outer)
Check if the subquery predicate can be executed via materialization.
Definition: sql_resolver.cc:1048
Item * all_any_subquery_creator(Item *left_expr, chooser_compare_func_creator cmp, bool all, Query_block *select)
Construct ALL/ANY/SOME subquery Item.
Definition: sql_parse.cc:6801
bool(Item::* Item_analyzer)(uchar **argp)
Definition: item.h:718
Item *(Item::* Item_transformer)(uchar *arg)
Type for transformers used by Item::transform and Item::compile.
Definition: item.h:727
Item * remove_in2exists_conds(Item *conds)
Removes every predicate injected by IN->EXISTS.
Definition: item_subselect.cc:477
Subquery_strategy
Classes that represent predicates over table subqueries: [NOT] EXISTS, [NOT] IN, ANY/SOME and ALL.
Definition: item_subselect.h:413
@ CANDIDATE_FOR_SEMIJOIN
Candidate for semi-join flattening.
@ UNSPECIFIED
Nothing decided yet.
@ SUBQ_EXISTS
Evaluate as EXISTS subquery (possibly after rewriting from another type)
@ DERIVED_TABLE
Rewrite to joined derived table.
@ DELETED
Subquery has been deleted, probably because it was always false.
@ CANDIDATE_FOR_IN2EXISTS_OR_MAT
Candidate for rewriting IN(subquery) to EXISTS, or subquery materialization.
@ SEMIJOIN
Semi-join flattening.
@ SUBQ_MATERIALIZATION
Subquery materialization (HASH_SJ_ENGINE)
@ CANDIDATE_FOR_DERIVED_TABLE
Candidate for rewriting to joined derived table.
bool is_quantified_comp_predicate(Item *item)
Definition: item_subselect.cc:2835
This file follows Google coding style, except for the name MEM_ROOT (which is kept for historical rea...
std::unique_ptr< T, Destroy_only< T > > unique_ptr_destroy_only
std::unique_ptr, but only destroying.
Definition: my_alloc.h:477
Some integer typedefs for easier portability.
unsigned long long int ulonglong
Definition: my_inttypes.h:56
unsigned char uchar
Definition: my_inttypes.h:52
long long int longlong
Definition: my_inttypes.h:55
uint64_t table_map
Definition: my_table_map.h:30
Interface for low level time utilities.
unsigned int my_time_flags_t
Flags to str_to_datetime and number_to_datetime.
Definition: my_time.h:94
Time declarations shared between the server and client API: you should not add anything to this heade...
static char * where
Definition: mysqldump.cc:152
std::string str(const mysqlrouter::ConfigGenerator::Options::Endpoint &ep)
Definition: config_generator.cc:1087
PT & ref(PT *tp)
Definition: tablespace_impl.cc:359
std::string join(const detail::range auto &rng, std::string_view delim)
join elements of a range into a string separated by a delimiter.
Definition: string.h:74
int add_tables(PFS_engine_table_share_proxy **, unsigned int) noexcept
Definition: pfs_plugin_table_v1_all_empty.cc:33
enum_parsing_context
Names for different query parse tree parts.
Definition: parse_tree_node_base.h:61
@ CTX_NONE
Empty value.
Definition: parse_tree_node_base.h:62
File containing constants that can be used throughout the server.
constexpr const table_map PSEUDO_TABLE_BITS
Definition: sql_const.h:112
enum_walk
Enumeration for {Item,Query_block[_UNIT],Table_function}walk.
Definition: sql_const.h:287
bool(Item::*)(unsigned char *) Item_processor
Processor type for {Item,Query_block[_UNIT],Table_function}walk.
Definition: sql_const.h:305
enum_condition_context
Enumeration for Query_block::condition_context.
Definition: sql_const.h:311
Common types of the Optimizer, used by optimization and execution.
join_type
Definition: sql_opt_exec_shared.h:186
@ JT_UNKNOWN
Definition: sql_opt_exec_shared.h:188
#define NO_PLAN_IDX
undefined index
Definition: sql_opt_exec_shared.h:55
Access paths are a query planning structure that correspond 1:1 to iterators, in that an access path ...
Definition: access_path.h:213
Struct used to pass around arguments to/from check_function_as_value_generator.
Definition: item.h:492
int err_code
the error code found during check(if any)
Definition: item.h:499
int get_unnamed_function_error_code() const
Return the correct error code, based on whether or not if we are checking for disallowed functions in...
Definition: item.h:511
Structure used for index-based lookups.
Definition: sql_opt_exec_shared.h:67
This bundles several pieces of information useful when doing the IN->EXISTS transform.
Definition: item_subselect.h:715
bool added_to_where
True: if IN->EXISTS has been done and has added a condition to the subquery's WHERE clause.
Definition: item_subselect.h:720
bool dependent_before
True: if subquery was dependent (correlated) before IN->EXISTS was done.
Definition: item_subselect.h:725
bool dependent_after
True: if subquery was dependent (correlated) after IN->EXISTS was done.
Definition: item_subselect.h:730
Argument for walk method replace_scalar_subquery.
Definition: item_subselect.h:331
Query_block * m_outer_query_block
The transformed query block.
Definition: item_subselect.h:334
Field * m_field
the replacement field
Definition: item_subselect.h:333
Query_block * m_inner_query_block
The immediately surrounding query.
Definition: item_subselect.h:335
bool m_add_coalesce
Definition: item_subselect.h:338
Item_singlerow_subselect * m_target
subquery to be replaced with field
Definition: item_subselect.h:332
Scalar_subquery_replacement(Item_singlerow_subselect *target, Field *field, Query_block *select, bool add_coalesce)
Definition: item_subselect.h:339
argument used by walk method collect_scalar_subqueries ("css")
Definition: item_subselect.h:203
Collect_subq_info(Query_block *owner)
Definition: item_subselect.h:207
Query_block * m_query_block
Definition: item_subselect.h:206
std::vector< Item_subselect * > list
< accumulated all subq (or aggregates) found
Definition: item_subselect.h:205
bool contains(Query_expression *candidate)
Definition: item_subselect.h:208
Definition: mysql_time.h:82
Bison "location" class.
Definition: parse_location.h:43
Environment data for the contextualization phase.
Definition: parse_tree_node_base.h:420
Definition: table.h:1407
Definition: result.h:30
Item_result
Type of the user defined function return slot and arguments.
Definition: udf_registration_types.h:39
@ INT_RESULT
double
Definition: udf_registration_types.h:43
static int all(site_def const *s, node_no node)
Definition: xcom_transport.cc:893