MySQL 9.6.0
Source Code Documentation
sql_lex.h
Go to the documentation of this file.
1/* Copyright (c) 2000, 2025, Oracle and/or its affiliates.
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 designed to work 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 either included with
13 the program or referenced in the documentation.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License, version 2.0, for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
23
24/**
25 @defgroup GROUP_PARSER Parser
26 @{
27*/
28
29#ifndef SQL_LEX_INCLUDED
30#define SQL_LEX_INCLUDED
31
32#include <string.h>
33#include <sys/types.h> // TODO: replace with cstdint
34
35#include <algorithm>
36#include <cstdint>
37#include <cstring>
38#include <functional>
39#include <map>
40#include <memory>
41#include <new>
42#include <string>
43#include <utility>
44
45#include "lex_string.h"
46#include "map_helpers.h"
47#include "mem_root_deque.h"
48#include "memory_debugging.h"
49#include "my_alloc.h" // Destroy_only
50#include "my_base.h"
51#include "my_compiler.h"
52#include "my_dbug.h"
53#include "my_inttypes.h" // TODO: replace with cstdint
54#include "my_sqlcommand.h"
55#include "my_sys.h"
56#include "my_table_map.h"
57#include "my_thread_local.h"
59#include "mysql/service_mysql_alloc.h" // my_free
61#include "mysql_com.h"
62#include "mysqld_error.h"
63#include "prealloced_array.h" // Prealloced_array
64#include "sql/dd/info_schema/table_stats.h" // dd::info_schema::Table_stati...
65#include "sql/dd/info_schema/tablespace_stats.h" // dd::info_schema::Tablesp...
66#include "sql/enum_query_type.h"
67#include "sql/handler.h"
68#include "sql/item.h" // Name_resolution_context
69#include "sql/item_subselect.h" // Subquery_strategy
73#include "sql/json_duality_view/content_tree.h" // destroy
74#include "sql/key_spec.h" // KEY_CREATE_INFO
75#include "sql/mdl.h"
76#include "sql/mem_root_array.h" // Mem_root_array
77#include "sql/parse_location.h"
78#include "sql/parse_tree_node_base.h" // enum_parsing_context
79#include "sql/parser_yystype.h"
80#include "sql/query_options.h" // OPTION_NO_CONST_TABLES
81#include "sql/query_term.h"
82#include "sql/set_var.h"
83#include "sql/sql_array.h"
84#include "sql/sql_connect.h" // USER_RESOURCES
85#include "sql/sql_const.h"
86#include "sql/sql_data_change.h" // enum_duplicates
87#include "sql/sql_error.h" // warn_on_deprecated_charset
88#include "sql/sql_list.h"
89#include "sql/sql_plugin_ref.h"
90#include "sql/sql_servers.h" // Server_options
91#include "sql/sql_udf.h" // Item_udftype
92#include "sql/table.h" // Table_ref
93#include "sql/thr_malloc.h"
94#include "sql/trigger_def.h" // enum_trigger_action_time_type
95#include "sql/visible_fields.h"
96#include "sql_string.h"
97#include "string_with_len.h"
98#include "strings/sql_chars.h"
99#include "thr_lock.h" // thr_lock_type
100#include "violite.h" // SSL_type
101
102class Alter_info;
103class Event_parse_data;
104class Field;
105class Item_cond;
107class Item_func_match;
111class Item_sum;
112class JOIN;
113class Opt_hints_global;
114class Opt_hints_qb;
115class PT_subquery;
116class PT_with_clause;
117class Parse_tree_root;
118class Protocol;
119class Query_result;
122class Query_block;
123class Query_expression;
125class Sql_cmd;
126class THD;
127class Value_generator;
128class Window;
129class partition_info;
130class sp_head;
131class sp_name;
132class sp_pcontext;
133struct LEX;
134struct NESTED_JOIN;
135struct PSI_digest_locker;
136struct sql_digest_state;
137union Lexer_yystype;
139
141constexpr const int MAX_SELECT_NESTING{sizeof(nesting_map) * 8 - 1};
142
143/*
144 There are 8 different type of table access so there is no more than
145 combinations 2^8 = 256:
146
147 . STMT_READS_TRANS_TABLE
148
149 . STMT_READS_NON_TRANS_TABLE
150
151 . STMT_READS_TEMP_TRANS_TABLE
152
153 . STMT_READS_TEMP_NON_TRANS_TABLE
154
155 . STMT_WRITES_TRANS_TABLE
156
157 . STMT_WRITES_NON_TRANS_TABLE
158
159 . STMT_WRITES_TEMP_TRANS_TABLE
160
161 . STMT_WRITES_TEMP_NON_TRANS_TABLE
162
163 The unsafe conditions for each combination is represented within a byte
164 and stores the status of the option --binlog-direct-non-trans-updates,
165 whether the trx-cache is empty or not, and whether the isolation level
166 is lower than ISO_REPEATABLE_READ:
167
168 . option (OFF/ON)
169 . trx-cache (empty/not empty)
170 . isolation (>= ISO_REPEATABLE_READ / < ISO_REPEATABLE_READ)
171
172 bits 0 : . OFF, . empty, . >= ISO_REPEATABLE_READ
173 bits 1 : . OFF, . empty, . < ISO_REPEATABLE_READ
174 bits 2 : . OFF, . not empty, . >= ISO_REPEATABLE_READ
175 bits 3 : . OFF, . not empty, . < ISO_REPEATABLE_READ
176 bits 4 : . ON, . empty, . >= ISO_REPEATABLE_READ
177 bits 5 : . ON, . empty, . < ISO_REPEATABLE_READ
178 bits 6 : . ON, . not empty, . >= ISO_REPEATABLE_READ
179 bits 7 : . ON, . not empty, . < ISO_REPEATABLE_READ
180*/
181extern uint binlog_unsafe_map[256];
182/*
183 Initializes the array with unsafe combinations and its respective
184 conditions.
185*/
187
188/*
189 If we encounter a diagnostics statement (GET DIAGNOSTICS, or e.g.
190 the old SHOW WARNINGS|ERRORS, or "diagnostics variables" such as
191 @@warning_count | @@error_count, we'll set some hints so this
192 information is not lost. DA_KEEP_UNSPECIFIED is used in LEX constructor to
193 avoid leaving variables uninitialized.
194 */
196 DA_KEEP_NOTHING = 0, /**< keep nothing */
197 DA_KEEP_DIAGNOSTICS, /**< keep the diagnostics area */
198 DA_KEEP_COUNTS, /**< keep \@warning_count / \@error_count */
199 DA_KEEP_PARSE_ERROR, /**< keep diagnostics area after parse error */
200 DA_KEEP_UNSPECIFIED /**< keep semantics is unspecified */
202
208
216
217/**
218 enum_sp_type defines type codes of stored programs.
219
220 @note these codes are used when dealing with the mysql.routines system table,
221 so they must not be changed.
222
223 @note the following macros were used previously for the same purpose. Now they
224 are used for ACL only.
225*/
226enum class enum_sp_type {
227 FUNCTION = 1,
228 PROCEDURE,
229 TRIGGER,
230 EVENT,
231 LIBRARY,
232 /*
233 Must always be the last one.
234 Denotes an error condition.
235 */
237};
238
240 if (val >= static_cast<longlong>(enum_sp_type::FUNCTION) &&
241 val < static_cast<longlong>(enum_sp_type::INVALID_SP_TYPE))
242 return static_cast<enum_sp_type>(val);
243 else
245}
246
248 return static_cast<longlong>(val);
249}
250
251inline uint to_uint(enum_sp_type val) { return static_cast<uint>(val); }
252
253/*
254 Values for the type enum. This reflects the order of the enum declaration
255 in the CREATE TABLE command. These values are used to enumerate object types
256 for the ACL statements.
257
258 These values were also used for enumerating stored program types. However, now
259 enum_sp_type should be used for that instead of them.
260*/
261#define TYPE_ENUM_FUNCTION 1
262#define TYPE_ENUM_PROCEDURE 2
263#define TYPE_ENUM_TRIGGER 3
264#define TYPE_ENUM_PROXY 4
265#define TYPE_ENUM_LIBRARY 5
266#define TYPE_ENUM_INVALID 6
267
268enum class Acl_type {
269 TABLE = 0,
274};
275
276Acl_type lex_type_to_acl_type(ulong lex_type);
277
279
281
283 {STRING_WITH_LEN("")},
284 {STRING_WITH_LEN("CONTAINS SQL")},
285 {STRING_WITH_LEN("NO SQL")},
286 {STRING_WITH_LEN("READS SQL DATA")},
287 {STRING_WITH_LEN("MODIFIES SQL DATA")}};
288
289/* Table type flags for the CREATE TABLE statement */
290#define TABLE_TYPE_TEMPORARY 1 /* 1 << 0 */
291#define TABLE_TYPE_EXTERNAL 2 /* 1 << 1 */
292
294 VIEW_CREATE_NEW, // check that there are not such VIEW/table
295 VIEW_ALTER, // check that VIEW with such name exists
296 VIEW_CREATE_OR_REPLACE // check only that there are not such table
297};
298
300 ALTER_USER_COMMENT_NOT_USED, // No user metadata ALTER in the AST
301 ALTER_USER_COMMENT, // A text comment is expected
302 ALTER_USER_ATTRIBUTE // A JSON object is expected
303};
304
305/* Options to add_table_to_list() */
306#define TL_OPTION_UPDATING 0x01
307#define TL_OPTION_IGNORE_LEAVES 0x02
308#define TL_OPTION_ALIAS 0x04
309
310/* Structure for db & table in sql_yacc */
311class Table_function;
312
314 public:
319
320 Table_ident(Protocol *protocol, const LEX_CSTRING &db_arg,
321 const LEX_CSTRING &table_arg, bool force);
322 Table_ident(const LEX_CSTRING &db_arg, const LEX_CSTRING &table_arg)
323 : db(db_arg), table(table_arg), sel(nullptr), table_function(nullptr) {}
324 Table_ident(const LEX_CSTRING &table_arg)
325 : table(table_arg), sel(nullptr), table_function(nullptr) {
326 db = NULL_CSTR;
327 }
328 /**
329 This constructor is used only for the case when we create a derived
330 table. A derived table has no name and doesn't belong to any database.
331 Later, if there was an alias specified for the table, it will be set
332 by add_table_to_list.
333 */
335 db = EMPTY_CSTR; /* a subject to casedn_str */
337 }
338 /*
339 This constructor is used only for the case when we create a table function.
340 It has no name and doesn't belong to any database as it exists only
341 during query execution. Later, if there was an alias specified for the
342 table, it will be set by add_table_to_list.
343 */
344 Table_ident(LEX_CSTRING &table_arg, Table_function *table_func_arg)
345 : table(table_arg), sel(nullptr), table_function(table_func_arg) {
346 /* We must have a table name here as this is used with add_table_to_list */
347 db = EMPTY_CSTR; /* a subject to casedn_str */
348 }
349 // True if we can tell from syntax that this is a table function.
350 bool is_table_function() const { return (table_function != nullptr); }
351 // True if we can tell from syntax that this is an unnamed derived table.
352 bool is_derived_table() const { return sel; }
353 void change_db(const char *db_name) {
354 db.str = db_name;
355 db.length = strlen(db_name);
356 }
357};
358
361
362/**
363 Structure to hold parameters for CHANGE REPLICATION SOURCE, START REPLICA, and
364 STOP REPLICA.
365
366 Remark: this should not be confused with Master_info (and perhaps
367 would better be renamed to st_lex_replication_info). Some fields,
368 e.g., delay, are saved in Relay_log_info, not in Master_info.
369*/
371 /*
372 The array of IGNORE_SERVER_IDS has a preallocation, and is not expected
373 to grow to any significant size, so no instrumentation.
374 */
376 initialize();
377 }
384 char *gtid;
385 char *view_id;
386 const char *channel; // identifier similar to database name
387 enum {
394
395 /*
396 Enum is used for making it possible to detect if the user
397 changed variable or if it should be left at old value
398 */
399 enum {
409 /*
410 Ciphersuites used for TLS 1.3 communication with the master server.
411 */
416 };
425 /**
426 Flag that is set to `true` whenever `PRIVILEGE_CHECKS_USER` is set to `NULL`
427 as a part of a `CHANGE REPLICATION SOURCE TO` statement.
428 */
430 /**
431 Username and hostname parts of the `PRIVILEGE_CHECKS_USER`, when it's set to
432 a user.
433 */
435 /**
436 Flag indicating if row format should be enforced for this channel event
437 stream.
438 */
440
441 /**
442 Identifies what is the slave policy on primary keys in tables.
443 If set to STREAM it just replicates the value of sql_require_primary_key.
444 If set to ON it fails when the source tries to replicate a table creation
445 or alter operation that does not have a primary key.
446 If set to OFF it does not enforce any policies on the channel for primary
447 keys.
448 */
449 enum {
456
457 enum {
463
465
466 /// Initializes everything to zero/NULL/empty.
467 void initialize();
468 /// Sets all fields to their "unspecified" value.
469 void set_unspecified();
470
471 private:
472 // Not copyable or assignable.
475};
476
478 bool all;
479};
480
486
487/*
488 String names used to print a statement with index hints.
489 Keep in sync with index_hint_type.
490*/
491extern const char *index_hint_type_name[];
493
494/*
495 Bits in index_clause_map : one for each possible FOR clause in
496 USE/FORCE/IGNORE INDEX index hint specification
497*/
498#define INDEX_HINT_MASK_JOIN (1)
499#define INDEX_HINT_MASK_GROUP (1 << 1)
500#define INDEX_HINT_MASK_ORDER (1 << 2)
501
502#define INDEX_HINT_MASK_ALL \
503 (INDEX_HINT_MASK_JOIN | INDEX_HINT_MASK_GROUP | INDEX_HINT_MASK_ORDER)
504
505/* Single element of an USE/FORCE/IGNORE INDEX list specified as a SQL hint */
507 public:
508 /* The type of the hint : USE/FORCE/IGNORE */
510 /* Where the hit applies to. A bitmask of INDEX_HINT_MASK_<place> values */
512 /*
513 The index name. Empty (str=NULL) name represents an empty list
514 USE INDEX () clause
515 */
517
518 Index_hint(const char *str, uint length) {
519 key_name.str = str;
521 }
522
523 void print(const THD *thd, String *str);
524};
525
526/*
527 Class Query_expression represents a query expression.
528 Class Query_block represents a query block.
529
530 In addition to what is explained below, the query block(s) of a query
531 expression is contained in a tree expressing the nesting of set operations,
532 cf. query_term.h
533
534 A query expression contains one or more query blocks (more than one means
535 that the query expression contains one or more set operations - UNION,
536 INTERSECT or EXCEPT - unless the query blocks are used to describe
537 subqueries). These classes are connected as follows: both classes have a
538 master, a slave, a next and a prev field. For class Query_block, master and
539 slave connect to objects of type Query_expression, whereas for class
540 Query_expression, they connect to Query_block. master is pointer to outer
541 node. slave is pointer to the first inner node.
542
543 neighbors are two Query_block or Query_expression objects on
544 the same level.
545
546 The structures are linked with the following pointers:
547 - list of neighbors (next/prev) (prev of first element point to slave
548 pointer of outer structure)
549 - For Query_block, this is a list of query blocks.
550 - For Query_expression, this is a list of subqueries.
551
552 - pointer to outer node (master), which is
553 If this is Query_expression
554 - pointer to outer query_block.
555 If this is Query_block
556 - pointer to outer Query_expression.
557
558 - pointer to inner objects (slave), which is either:
559 If this is an Query_expression:
560 - first query block that belong to this query expression.
561 If this is an Query_block
562 - first query expression that belong to this query block (subqueries).
563
564 - list of all Query_block objects (link_next/link_prev)
565 This is to be used for things like derived tables creation, where we
566 go through this list and create the derived tables.
567
568 In addition to the above mentioned link, the query's tree structure is
569 represented by the member m_query_term, see query_term.h
570 For example for following query:
571
572 select *
573 from table1
574 where table1.field IN (select * from table1_1_1 union
575 select * from table1_1_2)
576 union
577 select *
578 from table2
579 where table2.field=(select (select f1 from table2_1_1_1_1
580 where table2_1_1_1_1.f2=table2_1_1.f3)
581 from table2_1_1
582 where table2_1_1.f1=table2.f2)
583 union
584 select * from table3;
585
586 we will have following structure:
587
588 select1: (select * from table1 ...)
589 select2: (select * from table2 ...)
590 select3: (select * from table3)
591 select1.1.1: (select * from table1_1_1)
592 ...
593
594 main unit
595 select1 select2 select3
596 |^^ |^
597 s||| ||master
598 l||| |+---------------------------------+
599 a||| +---------------------------------+|
600 v|||master slave ||
601 e||+-------------------------+ ||
602 V| neighbor | V|
603 unit1.1<+==================>unit1.2 unit2.1
604 select1.1.1 select 1.1.2 select1.2.1 select2.1.1
605 |^
606 ||
607 V|
608 unit2.1.1.1
609 select2.1.1.1.1
610
611
612 relation in main unit will be following:
613 (bigger picture for:
614 main unit
615 select1 select2 select3
616 in the above picture)
617
618 main unit
619 |^^^
620 ||||
621 ||||
622 |||+------------------------------+
623 ||+--------------+ |
624 slave||master | |
625 V| neighbor | neighbor |
626 select1<========>select2<========>select3
627
628 list of all query_block will be following (as it will be constructed by
629 parser):
630
631 select1->select2->select3->select2.1.1->select 2.1.2->select2.1.1.1.1-+
632 |
633 +---------------------------------------------------------------------+
634 |
635 +->select1.1.1->select1.1.2
636
637*/
638
639/**
640 This class represents a query expression (one query block or
641 several query blocks combined with UNION).
642*/
644 /**
645 Intrusive double-linked list of all query expressions
646 immediately contained within the same query block.
647 */
650
651 /**
652 The query block wherein this query expression is contained,
653 NULL if the query block is the outer-most one.
654 */
656 /// The first query block in this query expression.
658
659 // The query set operation structure, see doc for Query_term.
661
662 public:
663 /// Getter for m_query_term, q.v.
664 Query_term *query_term() const { return m_query_term; }
665 /// Setter for m_query_term, q.v.
667 /// Convenience method to avoid down casting, i.e. interpret m_query_term
668 /// as a Query_term_set_op.
669 /// @retval a non-null node iff !is_simple
670 /// @retval nullptr if is_simple() holds.
672 return is_simple() ? nullptr : down_cast<Query_term_set_op *>(m_query_term);
673 }
674 /// Return the query block iff !is_simple() holds
676 if (is_simple())
677 return nullptr;
678 else
679 return m_query_term->query_block();
680 }
681 bool is_leaf_block(Query_block *qb);
683 for (auto qt : query_terms<>()) {
684 if (qt->query_block() == qb) return qt;
685 }
686 return nullptr;
687 }
688
689 /**
690 Return iterator object over query terms rooted in m_query_term,
691 using either post order visiting (default) or pre order,
692 optionally skipping leaf nodes (query blocks corresponding to SELECTs or
693 table constructors). By default, we visit all nodes.
694 Usage: for (auto qt : query_terms<..>() { ... }
695 E.g.
696 for (auto qt : query_terms<>()) { } Visit all nodes, post order
697 for (auto qt : query_terms<QTC_PRE_ORDER, false>()) { }
698 Skip leaves, pre order
699 @tparam order == QTC_POST_ORDER if post order traversal is desired;default
700 == QTC_PRE_ORDER pre-order traversal
701 @tparam visit_leaves == VL_VISIT_LEAVES: if we want the traversal to include
702 leaf nodes i.e. the SELECTs or table constructors
703 == VL_SKIP_LEAVES: leaves will be skipped
704 @returns iterator object
705 */
706 template <Visit_order order = QTC_POST_ORDER,
707 Visit_leaves visit_leaves = VL_VISIT_LEAVES>
710 }
711
712 /**
713 Return the Query_block of the last query term in a n-ary set
714 operation that is the right side of the last DISTINCT set operation in that
715 n_ary set operation:
716 E.e. for
717 A UNION B UNION ALL C,
718 B's block will be returned. If no DISTINCT is present or not a set
719 operation, return nullptr.
720
721 @returns query block of last distinct right operand
722 */
724 auto const setop = down_cast<Query_term_set_op *>(m_query_term);
725 if (setop->last_distinct() > 0)
726 return setop->child(setop->last_distinct())->query_block();
727 else
728 return nullptr;
729 }
730
732 if (is_simple()) return false;
733 return down_cast<Query_term_set_op *>(m_query_term)->last_distinct() > 0;
734 }
735
736 private:
737 /**
738 Marker for subqueries in WHERE, HAVING, ORDER BY, GROUP BY and
739 SELECT item lists.
740 Must be read/written when holding LOCK_query_plan.
741
742 See Item_subselect::explain_subquery_checker
743 */
745
746 bool prepared; ///< All query blocks in query expression are prepared
747 bool optimized; ///< All query blocks in query expression are optimized
748 bool executed; ///< Query expression has been executed
749 ///< Explain mode: query expression refers stored function
751
752 /// Object to which the result for this query expression is sent.
753 /// Not used if we materialize directly into a parent query expression's
754 /// result table (see optimize()).
756
757 /**
758 An iterator you can read from to get all records for this query.
759
760 May be nullptr even after create_access_paths(), or in the case of an
761 unfinished materialization (see optimize()).
762 */
765
766 /**
767 If there is an unfinished materialization (see optimize()),
768 contains one element for each operand (query block) in this query
769 expression.
770 */
772
773 private:
774 /**
775 Convert the executor structures to a set of access paths, storing the result
776 in m_root_access_path.
777 */
778 void create_access_paths(THD *thd);
779
780 public:
781 /**
782 result of this query can't be cached, bit field, can be :
783 UNCACHEABLE_DEPENDENT
784 UNCACHEABLE_RAND
785 UNCACHEABLE_SIDEEFFECT
786 */
788
789 explicit Query_expression(enum_parsing_context parsing_context);
790
791 /// @return true for a query expression without UNION/INTERSECT/EXCEPT or
792 /// multi-level ORDER, i.e. we have a "simple table".
793 bool is_simple() const { return m_query_term->term_type() == QT_QUERY_BLOCK; }
794
796
797 /// Values for Query_expression::cleaned
799 UC_DIRTY, ///< Unit isn't cleaned
800 UC_PART_CLEAN, ///< Unit were cleaned, except JOIN and JOIN_TABs were
801 ///< kept for possible EXPLAIN
802 UC_CLEAN ///< Unit completely cleaned, all underlying JOINs were
803 ///< freed
804 };
805 enum_clean_state cleaned; ///< cleanliness state
806
807 public:
808 /**
809 Return the query block holding the top level ORDER BY, LIMIT and OFFSET.
810
811 If the query is not a set operation (UNION, INTERSECT or EXCEPT, and the
812 query expression has no multi-level ORDER BY/LIMIT, this represents the
813 single query block of the query itself, cf. documentation for class
814 Query_term.
815
816 @return query block containing the global parameters
817 */
819 return query_term()->query_block();
820 }
821
822 /* LIMIT clause runtime counters */
824
825 /* For IN/EXISTS predicates, we may not push down LIMIT 1 safely if true*/
827
828 /// Points to subquery if this query expression is used in one, otherwise NULL
830 /**
831 The WITH clause which is the first part of this query expression. NULL if
832 none.
833 */
835 /**
836 If this query expression is underlying of a derived table, the derived
837 table. NULL if none.
838 */
840 /**
841 First query block (in this UNION) which references the CTE.
842 NULL if not the query expression of a recursive CTE.
843 */
845
846 /**
847 If 'this' is body of lateral derived table:
848 map of tables in the same FROM clause as this derived table, and to which
849 the derived table's body makes references.
850 In pre-resolution stages, this is OUTER_REF_TABLE_BIT, just to indicate
851 that this has LATERAL; after resolution, which has found references in the
852 body, this is the proper map (with no PSEUDO_TABLE_BITS anymore).
853 */
855
856 /**
857 This query expression represents a scalar subquery and we need a run-time
858 check that the cardinality doesn't exceed 1.
859 */
861
862 /// @return true if query expression can be merged into an outer query
863 bool is_mergeable() const;
864
865 /// @return true if query expression is recommended to be merged
866 bool merge_heuristic(const LEX *lex) const;
867
868 /// @return the query block this query expression belongs to as subquery
870
871 /// @return the first query block inside this query expression
873
874 /// @return the next query expression within same query block (next subquery)
876
877 /// @return the query result object in use for this query expression
879
880 RowIterator *root_iterator() const { return m_root_iterator.get(); }
882 return std::move(m_root_iterator);
883 }
885
886 // Asks each query block to switch to an access path with in2exists
887 // conditions removed (if they were ever added).
888 // See JOIN::change_to_access_path_without_in2exists().
890
892 m_root_access_path = nullptr;
893 m_root_iterator.reset();
894 }
895
896 /**
897 Ensures that there are iterators created for the access paths created
898 by optimize(), even if it is not a top-level Query_expression.
899 If there are already iterators, it is a no-op. optimize() must have
900 been called earlier.
901
902 The use case for this is if we have a query block that's not top-level,
903 but we figure out after the fact that we wanted to run it anyway.
904 The typical case would be that we notice that the query block can return
905 at most one row (a so-called const table), and want to run it during
906 optimization.
907 */
908 bool force_create_iterators(THD *thd);
909
910 /**
911 Creates iterators for the access paths created by optimize(). Usually called
912 on a top-level Query_expression, but can also be called on non-top level
913 expressions from force_create_iterators(). See force_create_iterators() for
914 details.
915 */
916 bool create_iterators(THD *thd);
917
918 /// See optimize().
919 bool unfinished_materialization() const { return !m_operands.empty(); }
920
921 /// See optimize().
924 return std::move(m_operands);
925 }
926
927 /// Set new query result object for this query expression
929
930 /**
931 Whether there is a chance that optimize() is capable of materializing
932 directly into a result table if given one. Note that even if this function
933 returns true, optimize() can choose later not to do so, since it depends
934 on information (in particular, whether the query blocks can run under
935 the iterator executor or not) that is not available before optimize time.
936
937 TODO(sgunders): Now that all query blocks can run under the iterator
938 executor, the above may no longer be true. This needs investigation.
939 */
941
942 bool prepare(THD *thd, Query_result *result,
943 mem_root_deque<Item *> *insert_field_list,
944 ulonglong added_options, ulonglong removed_options);
945
946 /**
947 If and only if materialize_destination is non-nullptr, it means that the
948 caller intends to materialize our result into the given table. If it is
949 advantageous (in particular, if this query expression is a UNION DISTINCT),
950 optimize() will not create an iterator by itself, but rather do an
951 unfinished materialize. This means that it will collect iterators for
952 all the query blocks and prepare them for materializing into the given
953 table, but not actually create a root iterator for this query expression;
954 the caller is responsible for calling release_query_blocks_to_materialize()
955 and creating the iterator itself.
956
957 Even if materialize_destination is non-nullptr, this function may choose
958 to make a regular iterator. The caller is responsible for checking
959 unfinished_materialization() if it has given a non-nullptr table.
960
961 @param thd Thread handle.
962
963 @param materialize_destination What table to try to materialize into,
964 or nullptr if the caller does not intend to materialize the result.
965
966 @param finalize_access_paths Relevant for the hypergraph optimizer only.
967 If false, the given access paths will _not_ be finalized, so you cannot
968 create iterators from it before finalize() is called (see
969 FinalizePlanForQueryBlock()), and create_iterators must also be false.
970 This is relevant only if you are potentially optimizing multiple times
971 (see change_to_access_path_without_in2exists()), since you are only
972 allowed to finalize a query block once. "Fake" query blocks (see
973 query_term.h) are always finalized.
974 */
975 bool optimize(THD *thd, TABLE *materialize_destination,
976 bool finalize_access_paths);
977
978 /**
979 For any non-finalized query block, finalize it so that we are allowed to
980 create iterators. Must be called after the final access path is chosen
981 (ie., after any calls to change_to_access_path_without_in2exists()).
982 */
983 bool finalize(THD *thd);
984
985#ifndef NDEBUG
986 void DebugPrintQueryPlan(THD *thd, const char *keyword) const;
987#endif
988 /**
989 Do everything that would be needed before running Init() on the root
990 iterator. In particular, clear out data from previous execution iterations,
991 if needed.
992 */
993 bool ClearForExecution();
994
995 bool ExecuteIteratorQuery(THD *thd);
996 bool execute(THD *thd);
997 bool explain(THD *explain_thd, const THD *query_thd);
998 bool explain_query_term(THD *explain_thd, const THD *query_thd,
999 Query_term *qt);
1000 void cleanup(bool full);
1001 /**
1002 Destroy contained objects, in particular temporary tables which may
1003 have their own mem_roots.
1004 */
1005 void destroy();
1006
1007 void print(const THD *thd, String *str, enum_query_type query_type);
1008 bool accept(Select_lex_visitor *visitor);
1009
1010 /**
1011 Create a block to be used for ORDERING and LIMIT/OFFSET processing of a
1012 query term, which isn't itself a query specification or table value
1013 constructor. Such blocks are not included in the list starting in
1014 Query_Expression::first_query_block, and Query_block::next_query_block().
1015 They blocks are accessed via Query_term::query_block().
1016
1017 @param term the term on behalf of which we are making a post processing
1018 block
1019 @returns a query block
1020 */
1022
1024 assert(!is_prepared());
1025 prepared = true;
1026 }
1028 assert(is_prepared() && !is_optimized());
1029 optimized = true;
1030 }
1032 // assert(is_prepared() && is_optimized() && !is_executed());
1033 assert(is_prepared() && is_optimized());
1034 executed = true;
1035 }
1036 /// Reset this query expression for repeated evaluation within same execution
1038 assert(is_prepared() && is_optimized());
1039 executed = false;
1040 }
1041 /// Clear execution state, needed before new execution of prepared statement
1043 // Cannot be enforced when called from Prepared_statement::execute():
1044 // assert(is_prepared());
1045 optimized = false;
1046 executed = false;
1047 cleaned = UC_DIRTY;
1048 }
1049 /// Check state of preparation of the contained query expression.
1050 bool is_prepared() const { return prepared; }
1051 /// Check state of optimization of the contained query expression.
1052 bool is_optimized() const { return optimized; }
1053 /**
1054 Check state of execution of the contained query expression.
1055 Should not be used to check the state of a complete statement, use
1056 LEX::is_exec_completed() instead.
1057 */
1058 bool is_executed() const { return executed; }
1060 Query_result_interceptor *old_result);
1061 bool set_limit(THD *thd, Query_block *provider);
1062 bool has_any_limit() const;
1063
1064 inline bool is_union() const;
1065 inline bool is_set_operation() const;
1066
1067 /// Include a query expression below a query block.
1068 void include_down(LEX *lex, Query_block *outer);
1069
1070 /// Exclude this unit and immediately contained query_block objects
1071 void exclude_level();
1072
1073 /// Exclude subtree of current unit from tree of SELECTs
1074 void exclude_tree();
1075
1076 /// Renumber query blocks of a query expression according to supplied LEX
1077 void renumber_selects(LEX *lex);
1078
1080 bool save_cmd_properties(THD *thd);
1081
1082 friend class Query_block;
1083
1086 size_t num_visible_fields() const;
1087
1088 // If we are doing a query with global LIMIT, we need somewhere to store the
1089 // record count for FOUND_ROWS(). It can't be in any of the JOINs, since
1090 // they may have their own LimitOffsetIterators, which will write to
1091 // join->send_records whenever there is an OFFSET. Thus, we'll keep it here
1092 // instead.
1094
1097 void set_explain_marker_from(THD *thd, const Query_expression *u);
1098
1099#ifndef NDEBUG
1100 /**
1101 Asserts that none of {this unit and its children units} is fully cleaned
1102 up.
1103 */
1105#else
1106 void assert_not_fully_clean() {}
1107#endif
1108 void invalidate();
1109
1110 bool is_recursive() const { return first_recursive != nullptr; }
1111
1113
1115
1116 void fix_after_pullout(Query_block *parent_query_block,
1117 Query_block *removed_query_block);
1118
1119 /**
1120 If unit is a subquery, which forms an object of the upper level (an
1121 Item_subselect, a derived Table_ref), adds to this object a map
1122 of tables of the upper level which the unit references.
1123 */
1125
1126 /**
1127 If unit is a subquery, which forms an object of the upper level (an
1128 Item_subselect, a derived Table_ref), returns the place of this object
1129 in the upper level query block.
1130 */
1132
1133 bool walk(Item_processor processor, enum_walk walk, uchar *arg);
1134
1135 /**
1136 Replace all targeted items using transformer provided and info in
1137 arg.
1138 */
1139 bool replace_items(Item_transformer t, uchar *arg);
1140
1141 /*
1142 An exception: this is the only function that needs to adjust
1143 explain_marker.
1144 */
1145 friend bool parse_view_definition(THD *thd, Table_ref *view_ref);
1146};
1147
1150
1151/**
1152 Query_block type enum
1153*/
1155 EXPLAIN_NONE = 0,
1168 // Total:
1169 EXPLAIN_total ///< fake type, total number of all valid types
1170
1171 // Don't insert new types below this line!
1172};
1173
1174/**
1175 This class represents a query block, aka a query specification, which is
1176 a query consisting of a SELECT keyword, followed by a table list,
1177 optionally followed by a WHERE clause, a GROUP BY, etc.
1178*/
1179class Query_block : public Query_term {
1180 public:
1181 /**
1182 @note the group_by and order_by lists below will probably be added to the
1183 constructor when the parser is converted into a true bottom-up design.
1184
1185 //SQL_I_LIST<ORDER> *group_by, SQL_I_LIST<ORDER> order_by
1186 */
1188
1189 /// Query_term methods overridden
1190 void debugPrint(int level, std::ostringstream &buf) const override;
1191 /// Minion of debugPrint
1192 void qbPrint(int level, std::ostringstream &buf) const;
1194 Change_current_query_block *save_query_block,
1195 mem_root_deque<Item *> *insert_field_list,
1196 Query_result *common_result, ulonglong added_options,
1197 ulonglong removed_options,
1198 ulonglong create_option) override;
1200 // leaf block optimization done elsewhere
1201 return false;
1202 }
1203
1206 Mem_root_array<AppendPathParameters> *union_all_subpaths,
1207 bool calc_found_rows) override;
1208
1210 Query_term_type term_type() const override { return QT_QUERY_BLOCK; }
1211 const char *operator_string() const override { return "query_block"; }
1212 Query_block *query_block() const override {
1213 return const_cast<Query_block *>(this);
1214 }
1215 void label_children() override {}
1216 void destroy_tree() override { m_parent = nullptr; }
1217
1218 bool open_result_tables(THD *, int) override;
1219 /// end of overridden methods from Query_term
1220 bool absorb_limit_of(Query_block *block);
1221
1222 Item *where_cond() const { return m_where_cond; }
1224 void set_where_cond(Item *cond) { m_where_cond = cond; }
1225 Item *having_cond() const { return m_having_cond; }
1227 void set_having_cond(Item *cond) { m_having_cond = cond; }
1228 Item *qualify_cond() const { return m_qualify_cond; }
1230 void set_qualify_cond(Item *cond) { m_qualify_cond = cond; }
1233 bool change_query_result(THD *thd, Query_result_interceptor *new_result,
1234 Query_result_interceptor *old_result);
1235
1236 /// Set base options for a query block (and active options too)
1237 void set_base_options(ulonglong options_arg) {
1238 DBUG_EXECUTE_IF("no_const_tables", options_arg |= OPTION_NO_CONST_TABLES;);
1239
1240 // Make sure we do not overwrite options by accident
1241 assert(m_base_options == 0 && m_active_options == 0);
1242 m_base_options = options_arg;
1243 m_active_options = options_arg;
1244 }
1245
1246 /// Add base options to a query block, also update active options
1248 assert(first_execution);
1251 }
1252
1253 /**
1254 Remove base options from a query block.
1255 Active options are also updated, and we assume here that "extra" options
1256 cannot override removed base options.
1257 */
1259 assert(first_execution);
1262 }
1263
1264 /// Make active options from base options, supplied options and environment:
1265 void make_active_options(ulonglong added_options, ulonglong removed_options);
1266
1267 /// Adjust the active option set
1269
1270 /// @return the active query options
1272
1273 /**
1274 Set associated tables as read_only, ie. they cannot be inserted into,
1275 updated or deleted from during this statement.
1276 Commonly used for query blocks that are part of derived tables or
1277 views that are materialized.
1278 */
1280 // Set all referenced base tables as read only.
1281 for (Table_ref *tr = leaf_tables; tr != nullptr; tr = tr->next_leaf)
1282 tr->set_readonly();
1283 }
1284
1285 /// @returns number of tables in query block
1286 size_t table_count() const { return m_table_list.elements; }
1287
1288 /// @returns a map of all tables references in the query block
1289 table_map all_tables_map() const { return (1ULL << leaf_table_count) - 1; }
1290
1291 bool remove_aggregates(THD *thd, Query_block *select);
1292
1296 Query_block *next_query_block() const { return next; }
1297
1299
1301
1302 void mark_as_dependent(Query_block *last, bool aggregate);
1303
1304 /// @returns true if query block references any tables
1305 bool has_tables() const { return m_table_list.elements != 0; }
1306
1307 /// @return true if query block is explicitly grouped (non-empty GROUP BY)
1308 bool is_explicitly_grouped() const { return group_list.elements != 0; }
1309
1310 /**
1311 @return true if this query block is implicitly grouped, ie it is not
1312 explicitly grouped but contains references to set functions.
1313 The query will return max. 1 row (@see also is_single_grouped()).
1314 */
1316 return m_agg_func_used && group_list.elements == 0;
1317 }
1318
1319 /**
1320 @return true if this query block has GROUP BY modifier.
1321 */
1323 return (olap != UNSPECIFIED_OLAP_TYPE);
1324 }
1325
1326 /**
1327 @return true if this query block is explicitly or implicitly grouped.
1328 @note a query with DISTINCT is not considered to be aggregated.
1329 @note in standard SQL, a query with HAVING is defined as grouped, however
1330 MySQL allows HAVING without any aggregation to be the same as WHERE.
1331 */
1332 bool is_grouped() const { return group_list.elements > 0 || m_agg_func_used; }
1333
1334 /// @return true if this query block contains DISTINCT at start of select list
1335 bool is_distinct() const { return active_options() & SELECT_DISTINCT; }
1336
1337 /**
1338 @return true if this query block contains an ORDER BY clause.
1339
1340 @note returns false if ORDER BY has been eliminated, e.g if the query
1341 can return max. 1 row.
1342 */
1343 bool is_ordered() const { return order_list.elements > 0; }
1344
1345 /**
1346 Based on the structure of the query at resolution time, it is possible to
1347 conclude that DISTINCT is useless and remove it.
1348 This is the case if:
1349 - all GROUP BY expressions are in SELECT list, so resulting group rows are
1350 distinct,
1351 - and ROLLUP is not specified, so it adds no row for NULLs.
1352
1353 @returns true if we can remove DISTINCT.
1354
1355 @todo could refine this to if ROLLUP were specified and all GROUP
1356 expressions were non-nullable, because ROLLUP then adds only NULL values.
1357 Currently, ROLLUP+DISTINCT is rejected because executor cannot handle
1358 it in all cases.
1359 */
1360 bool can_skip_distinct() const {
1361 return is_grouped() && hidden_group_field_count == 0 &&
1363 }
1364
1365 /// @return true if this query block has a LIMIT clause
1366 bool has_limit() const { return select_limit != nullptr; }
1367
1368 /// @return true if query block references full-text functions
1369 bool has_ft_funcs() const { return ftfunc_list->elements > 0; }
1370
1371 /// @returns true if query block is a recursive member of a recursive unit
1372 bool is_recursive() const { return recursive_reference != nullptr; }
1373
1374 /**
1375 Finds a group expression matching the given item, or nullptr if
1376 none. When there are multiple candidates, ones that match in name are
1377 given priority (such that “a AS c GROUP BY a,b,c” resolves to c, not a);
1378 if there is still a tie, the leftmost is given priority.
1379
1380 @param item The item to search for.
1381 @param [out] rollup_level If not nullptr, will be set to the group
1382 expression's index (0-based).
1383 */
1384 ORDER *find_in_group_list(Item *item, int *rollup_level) const;
1385 int group_list_size() const;
1386 void set_olap_type(olap_type in_olap) { olap = in_olap; }
1387 /// @returns true if query block contains windows
1388 bool has_windows() const { return m_windows.elements > 0; }
1389
1390 /// @returns true if query block contains window functions
1391 bool has_wfs();
1392
1393 void invalidate();
1394
1395 uint get_in_sum_expr() const { return in_sum_expr; }
1396
1397 bool add_item_to_list(Item *item);
1398 bool add_grouping_expr(THD *thd, Item *item);
1400 Table_ref *add_table_to_list(THD *thd, Table_ident *table, const char *alias,
1401 ulong table_options,
1403 enum_mdl_type mdl_type = MDL_SHARED_READ,
1404 List<Index_hint> *hints = nullptr,
1405 List<String> *partition_names = nullptr,
1406 LEX_STRING *option = nullptr,
1407 Parse_context *pc = nullptr);
1408 /**
1409 Add item to the hidden part of select list
1410
1411 @param item item to add
1412
1413 @return Pointer to reference of the added item
1414 */
1415 Item **add_hidden_item(Item *item);
1416
1417 /// Remove hidden items from select list
1418 void remove_hidden_items();
1419
1420 Table_ref *get_table_list() const { return m_table_list.first; }
1421 bool init_nested_join(THD *thd);
1423 Table_ref *nest_last_join(THD *thd, size_t table_cnt = 2);
1426
1427 /// Wrappers over fields / \c get_fields_list() that hide items where
1428 /// item->hidden, meant for range-based for loops.
1429 /// See \c sql/visible_fields.h.
1431 auto visible_fields() const { return VisibleFields(fields); }
1432
1434 size_t visible_column_count() const override { return num_visible_fields(); }
1435
1436 /// Check privileges for views that are merged into query block
1437 bool check_view_privileges(THD *thd, Access_bitmask want_privilege_first,
1438 Access_bitmask want_privilege_next);
1439 /// Check privileges for all columns referenced from query block
1440 bool check_column_privileges(THD *thd);
1441
1442 /// Check privileges for column references in subqueries of a query block
1444
1445 /// Resolve and prepare information about tables for one query block
1446 bool setup_tables(THD *thd, Table_ref *tables, bool select_insert);
1447
1448 /// Resolve OFFSET and LIMIT clauses
1449 bool resolve_limits(THD *thd);
1450
1451 /// Resolve derived table, view, table function information for a query block
1452 bool resolve_placeholder_tables(THD *thd, bool apply_semijoin);
1453
1454 /// Propagate exclusion from table uniqueness test into subqueries
1456
1457 /// Merge name resolution context objects of a subquery into its parent
1458 void merge_contexts(Query_block *inner);
1459
1460 /// Merge derived table into query block
1461 bool merge_derived(THD *thd, Table_ref *derived_table);
1462
1463 bool flatten_subqueries(THD *thd);
1464
1465 /**
1466 Update available semijoin strategies for semijoin nests.
1467
1468 Available semijoin strategies needs to be updated on every execution since
1469 optimizer_switch setting may have changed.
1470
1471 @param thd Pointer to THD object for session.
1472 Used to access optimizer_switch
1473 */
1475
1476 /**
1477 Returns which subquery execution strategies can be used for this query
1478 block.
1479
1480 @param thd Pointer to THD object for session.
1481 Used to access optimizer_switch
1482
1483 @retval SUBQ_MATERIALIZATION Subquery Materialization should be used
1484 @retval SUBQ_EXISTS In-to-exists execution should be used
1485 @retval CANDIDATE_FOR_IN2EXISTS_OR_MAT A cost-based decision should be made
1486 */
1487 Subquery_strategy subquery_strategy(const THD *thd) const;
1488
1489 /**
1490 Returns whether semi-join is enabled for this query block
1491
1492 @see @c Opt_hints_qb::semijoin_enabled for details on how hints
1493 affect this decision. If there are no hints for this query block,
1494 optimizer_switch setting determines whether semi-join is used.
1495
1496 @param thd Pointer to THD object for session.
1497 Used to access optimizer_switch
1498
1499 @return true if semijoin is enabled,
1500 false otherwise
1501 */
1502 bool semijoin_enabled(const THD *thd) const;
1503
1505 sj_candidates = sj_cand;
1506 }
1508 sj_candidates->push_back(predicate);
1509 }
1510 bool has_sj_candidates() const {
1511 return sj_candidates != nullptr && !sj_candidates->empty();
1512 }
1513
1514 bool has_subquery_transforms() const { return sj_candidates != nullptr; }
1515
1516 /// Add full-text function elements from a list into this query block
1518
1519 void set_lock_for_table(const Lock_descriptor &descriptor, Table_ref *table);
1520
1521 void set_lock_for_tables(thr_lock_type lock_type);
1522
1523 inline void init_order() {
1524 assert(order_list.elements == 0);
1525 order_list.elements = 0;
1526 order_list.first = nullptr;
1527 order_list.next = &order_list.first;
1528 }
1529 /*
1530 This method created for reiniting LEX in mysql_admin_table() and can be
1531 used only if you are going remove all Query_block & units except belonger
1532 to LEX (LEX::unit & LEX::select, for other purposes use
1533 Query_expression::exclude_level()
1534 */
1535 void cut_subtree() { slave = nullptr; }
1536 bool test_limit();
1537 /**
1538 Get offset for LIMIT.
1539
1540 Evaluate offset item if necessary.
1541
1542 @return Number of rows to skip.
1543
1544 @todo Integrate better with Query_expression::set_limit()
1545 */
1546 ha_rows get_offset(const THD *thd) const;
1547 /**
1548 Get limit.
1549
1550 Evaluate limit item if necessary.
1551
1552 @return Limit of rows in result.
1553
1554 @todo Integrate better with Query_expression::set_limit()
1555 */
1556 ha_rows get_limit(const THD *thd) const;
1557
1558 /// Assign a default name resolution object for this query block.
1559 bool set_context(Name_resolution_context *outer_context);
1560
1561 /// Setup the array containing references to base items
1562 bool setup_base_ref_items(THD *thd);
1563 void print(const THD *thd, String *str, enum_query_type query_type);
1564
1565 /**
1566 Print detail of the Query_block object.
1567
1568 @param thd Thread handler
1569 @param query_type Options to print out string output
1570 @param[out] str String of output.
1571 */
1572 void print_query_block(const THD *thd, String *str,
1573 enum_query_type query_type);
1574
1575 /**
1576 Print detail of the UPDATE statement.
1577
1578 @param thd Thread handler
1579 @param[out] str String of output
1580 @param query_type Options to print out string output
1581 */
1582 void print_update(const THD *thd, String *str, enum_query_type query_type);
1583
1584 /**
1585 Print detail of the DELETE statement.
1586
1587 @param thd Thread handler
1588 @param[out] str String of output
1589 @param query_type Options to print out string output
1590 */
1591 void print_delete(const THD *thd, String *str, enum_query_type query_type);
1592
1593 /**
1594 Print detail of the INSERT statement.
1595
1596 @param thd Thread handler
1597 @param[out] str String of output
1598 @param query_type Options to print out string output
1599 */
1600 void print_insert(const THD *thd, String *str, enum_query_type query_type);
1601
1602 /**
1603 Print detail of Hints.
1604
1605 @param thd Thread handler
1606 @param[out] str String of output
1607 @param query_type Options to print out string output
1608 */
1609 void print_hints(const THD *thd, String *str, enum_query_type query_type);
1610
1611 /**
1612 Print error.
1613
1614 @param thd Thread handler
1615 @param[out] str String of output
1616
1617 @retval false If there is no error
1618 @retval true else
1619 */
1620 bool print_error(const THD *thd, String *str);
1621
1622 /**
1623 Print select options.
1624
1625 @param[out] str String of output
1626 */
1628
1629 /**
1630 Print UPDATE options.
1631
1632 @param[out] str String of output
1633 */
1635
1636 /**
1637 Print DELETE options.
1638
1639 @param[out] str String of output
1640 */
1642
1643 /**
1644 Print INSERT options.
1645
1646 @param[out] str String of output
1647 */
1649
1650 /**
1651 Print list of tables.
1652
1653 @param thd Thread handler
1654 @param[out] str String of output
1655 @param table_list Table_ref object
1656 @param query_type Options to print out string output
1657 */
1658 void print_table_references(const THD *thd, String *str,
1659 Table_ref *table_list,
1660 enum_query_type query_type);
1661
1662 /**
1663 Print list of items in Query_block object.
1664
1665 @param thd Thread handle
1666 @param[out] str String of output
1667 @param query_type Options to print out string output
1668 */
1669 void print_item_list(const THD *thd, String *str, enum_query_type query_type);
1670
1671 /**
1672 Print assignments list. Used in UPDATE and
1673 INSERT ... ON DUPLICATE KEY UPDATE ...
1674
1675 @param thd Thread handle
1676 @param[out] str String of output
1677 @param query_type Options to print out string output
1678 @param fields List columns to be assigned.
1679 @param values List of values.
1680 */
1681 void print_update_list(const THD *thd, String *str,
1682 enum_query_type query_type,
1684 const mem_root_deque<Item *> &values);
1685
1686 /**
1687 Print column list to be inserted into. Used in INSERT.
1688
1689 @param thd Thread handle
1690 @param[out] str String of output
1691 @param query_type Options to print out string output
1692 */
1693 void print_insert_fields(const THD *thd, String *str,
1694 enum_query_type query_type);
1695
1696 /**
1697 Print list of values, used in INSERT and for general VALUES clause.
1698
1699 @param thd Thread handle
1700 @param[out] str String of output
1701 @param query_type Options to print out string output
1702 @param values List of values
1703 @param prefix Prefix to print before each row in value list
1704 = nullptr: No prefix wanted
1705 */
1706 void print_values(const THD *thd, String *str, enum_query_type query_type,
1707 const mem_root_deque<mem_root_deque<Item *> *> &values,
1708 const char *prefix);
1709
1710 /**
1711 Print list of tables in FROM clause.
1712
1713 @param thd Thread handler
1714 @param[out] str String of output
1715 @param query_type Options to print out string output
1716 */
1717 void print_from_clause(const THD *thd, String *str,
1718 enum_query_type query_type);
1719
1720 /**
1721 Print list of conditions in WHERE clause.
1722
1723 @param thd Thread handle
1724 @param[out] str String of output
1725 @param query_type Options to print out string output
1726 */
1727 void print_where_cond(const THD *thd, String *str,
1728 enum_query_type query_type);
1729
1730 /**
1731 Print list of items in GROUP BY clause.
1732
1733 @param thd Thread handle
1734 @param[out] str String of output
1735 @param query_type Options to print out string output
1736 */
1737 void print_group_by(const THD *thd, String *str, enum_query_type query_type);
1738
1739 /**
1740 Print list of items in HAVING clause.
1741
1742 @param thd Thread handle
1743 @param[out] str String of output
1744 @param query_type Options to print out string output
1745 */
1746 void print_having(const THD *thd, String *str, enum_query_type query_type);
1747
1748 /**
1749 Print list of items in QUALIFY clause.
1750
1751 @param thd Thread handle
1752 @param[out] str String of output
1753 @param query_type Options to print out string output
1754 */
1755 void print_qualify(const THD *thd, String *str,
1756 enum_query_type query_type) const;
1757
1758 /**
1759 Print details of Windowing functions.
1760
1761 @param thd Thread handler
1762 @param[out] str String of output
1763 @param query_type Options to print out string output
1764 */
1765 void print_windows(const THD *thd, String *str, enum_query_type query_type);
1766
1767 /**
1768 Print list of items in ORDER BY clause.
1769
1770 @param thd Thread handle
1771 @param[out] str String of output
1772 @param query_type Options to print out string output
1773 */
1774 void print_order_by(const THD *thd, String *str,
1775 enum_query_type query_type) const;
1776
1777 void print_limit(const THD *thd, String *str,
1778 enum_query_type query_type) const;
1779 bool save_properties(THD *thd);
1780
1781 /**
1782 Accept function for SELECT and DELETE.
1783
1784 @param visitor Select_lex_visitor Object
1785 */
1786 bool accept(Select_lex_visitor *visitor);
1787
1789
1790 /**
1791 Cleanup this subtree (this Query_block and all nested Query_blockes and
1792 Query_expressions).
1793 @param full if false only partial cleanup is done, JOINs and JOIN_TABs are
1794 kept to provide info for EXPLAIN CONNECTION; if true, complete cleanup is
1795 done, all JOINs are freed.
1796 */
1797 void cleanup(bool full) override;
1798 /*
1799 Recursively cleanup the join of this select lex and of all nested
1800 select lexes. This is not a full cleanup.
1801 */
1802 void cleanup_all_joins();
1803 /**
1804 Destroy contained objects, in particular temporary tables which may
1805 have their own mem_roots.
1806 */
1807 void destroy();
1808
1809 /// @return true when query block is not part of a set operation and is not a
1810 /// parenthesized query expression.
1813 }
1814
1815 /**
1816 @return true if query block is found during preparation to produce no data.
1817 Notice that if query is implicitly grouped, an aggregation row will
1818 still be returned.
1819 */
1820 bool is_empty_query() const { return m_empty_query; }
1821
1822 /// Set query block as returning no data
1823 /// @todo This may also be set when we have an always false WHERE clause
1825 assert(join == nullptr);
1826 m_empty_query = true;
1827 }
1828 /*
1829 For MODE_ONLY_FULL_GROUP_BY we need to know if
1830 this query block is the aggregation query of at least one aggregate
1831 function.
1832 */
1833 bool agg_func_used() const { return m_agg_func_used; }
1835
1836 void set_agg_func_used(bool val) { m_agg_func_used = val; }
1837
1839
1840 bool right_joins() const { return m_right_joins; }
1842
1843 /// Lookup for Query_block type
1844 enum_explain_type type() const;
1845
1846 /// Lookup for a type string
1847 const char *get_type_str() { return type_str[static_cast<int>(type())]; }
1849 return type_str[static_cast<int>(type)];
1850 }
1851
1853 bool is_cacheable() const { return !uncacheable; }
1854
1855 /// @returns true if this query block outputs at most one row.
1857 return (m_table_list.size() == 0 &&
1858 (!is_table_value_constructor || row_value_list->size() == 1));
1859 }
1860
1861 /// Include query block inside a query expression.
1862 void include_down(LEX *lex, Query_expression *outer);
1863
1864 /// Include a query block next to another query block.
1865 void include_neighbour(LEX *lex, Query_block *before);
1866
1867 /// Include query block inside a query expression, but do not link.
1869
1870 /// Include query block into global list.
1871 void include_in_global(Query_block **plink);
1872
1873 /// Include chain of query blocks into global list.
1875
1876 /// Renumber query blocks of contained query expressions
1877 void renumber(LEX *lex);
1878
1879 /**
1880 Does permanent transformations which are local to a query block (which do
1881 not merge it to another block).
1882 */
1883 bool apply_local_transforms(THD *thd, bool prune);
1884
1885 /// Pushes parts of the WHERE condition of this query block to materialized
1886 /// derived tables.
1888
1889 bool get_optimizable_conditions(THD *thd, Item **new_where,
1890 Item **new_having);
1891
1892 bool validate_outermost_option(LEX *lex, const char *wrong_option) const;
1893 bool validate_base_options(LEX *lex, ulonglong options) const;
1894
1895 bool walk(Item_processor processor, enum_walk walk, uchar *arg);
1896
1897 bool add_tables(THD *thd, const Mem_root_array<Table_ident *> *tables,
1898 ulong table_options, thr_lock_type lock_type,
1899 enum_mdl_type mdl_type);
1900
1901 bool resolve_rollup_wfs(THD *thd);
1902
1903 bool setup_conds(THD *thd);
1904 bool prepare(THD *thd, mem_root_deque<Item *> *insert_field_list);
1905 bool optimize(THD *thd, bool finalize_access_paths);
1906 void reset_nj_counters(mem_root_deque<Table_ref *> *join_list = nullptr);
1907
1908 // If the query block has exactly one single visible field, returns it.
1909 // If not, returns nullptr.
1910 Item *single_visible_field() const;
1911 size_t num_visible_fields() const;
1912
1913 // Whether the SELECT list is empty (hidden fields are ignored).
1914 // Typically used to distinguish INSERT INTO ... SELECT queries
1915 // from INSERT INTO ... VALUES queries.
1916 bool field_list_is_empty() const;
1917
1918 /// Creates a clone for the given expression by re-parsing the
1919 /// expression. Used in condition pushdown to derived tables.
1920 Item *clone_expression(THD *thd, Item *item, Table_ref *derived_table);
1921 /// Returns an expression from the select list of the query block
1922 /// using the field's index in a derived table.
1923 Item *get_derived_expr(uint expr_index);
1924
1926 AccessPath *child_path, TABLE *dst_table) const;
1927
1928 // ************************************************
1929 // * Members (most of these should not be public) *
1930 // ************************************************
1931
1933 /**
1934 All expressions needed after join and filtering, ie., select list,
1935 group by list, having clause, window clause, order by clause,
1936 including hidden fields.
1937 Does not include join conditions nor where clause.
1938
1939 This should ideally be changed into Mem_root_array<Item *>, but
1940 find_order_in_list() depends on pointer stability (it stores a pointer
1941 to an element in referenced_by[]). Similarly, there are some instances
1942 of thd->change_item_tree() that store pointers to elements in this list.
1943
1944 Because of this, adding or removing elements in the middle is not allowed;
1945 std::deque guarantees pointer stability only in the face of adding
1946 or removing elements from either end, ie., {push,pop}_{front_back}.
1947
1948 Currently, all hidden items must be before all visible items.
1949 This is primarily due to the requirement for pointer stability
1950 but also because change_to_use_tmp_fields() depends on it when mapping
1951 items to ref_item_array indexes. It would be good to get rid of this
1952 requirement in the future.
1953 */
1955
1956 /**
1957 All windows defined on the select, both named and inlined
1958 */
1960
1961 /**
1962 A pointer to ftfunc_list_alloc, list of full text search functions.
1963 */
1966
1967 /// The VALUES items of a table value constructor.
1969
1970 /// List of semi-join nests generated for this query block
1972
1973 /// List of tables in FROM clause - use Table_ref::next_local to traverse
1975
1976 /**
1977 ORDER BY clause.
1978 This list may be mutated during optimization (by remove_const() in the old
1979 optimizer or by RemoveRedundantOrderElements() in the hypergraph optimizer),
1980 so for prepared statements, we keep a copy of the ORDER.next pointers in
1981 order_list_ptrs, and re-establish the original list before each execution.
1982 */
1985
1986 /**
1987 GROUP BY clause. This list may be mutated during optimization (by
1988 \c remove_const() in the old optimizer or by
1989 RemoveRedundantOrderElements() in the hypergraph optimizer), so for prepared
1990 statements, we keep a copy of the ORDER.next pointers in \c group_list_ptrs,
1991 and re-establish the original list before each execution. The list can also
1992 be temporarily pruned and restored by \c Group_check (if transform done,
1993 cf. \c Query_block::m_gl_size_orig).
1994 */
1997 /**
1998 For an explicitly grouped, correlated, scalar subquery which is transformed
1999 to join with derived tables: the number of added non-column expressions.
2000 Used for better functional dependency analysis since this is checked during
2001 prepare *after* transformations. Transforms will append inner expressions
2002 to the group by list, rendering the check too optimistic. To remedy this,
2003 we temporarily remove the added compound (i.e. not simple column)
2004 expressions when doing the full group by check. This is bit too
2005 pessimistic: we can get occasionally false positives (full group by check
2006 error). The underlying problem is that we do not perform full group by
2007 checking before transformations. See also \c Group_check's ctor and dtor.
2008 */
2010
2011 // Used so that AggregateIterator knows which items to signal when the rollup
2012 // level changes. Obviously only used in the presence of rollup.
2017
2018 /// Query-block-level hints, for this query block
2020
2021 char *db{nullptr};
2022
2023 /**
2024 If this query block is a recursive member of a recursive unit: the
2025 Table_ref, in this recursive member, referencing the query
2026 name.
2027 */
2029
2030 /// Reference to LEX that this query block belongs to
2031 LEX *parent_lex{nullptr};
2032
2033 /**
2034 The set of those tables whose fields are referenced in the select list of
2035 this select level.
2036 */
2038 table_map outer_join{0}; ///< Bitmap of all inner tables from outer joins
2039
2040 /**
2041 Context for name resolution for all column references except columns
2042 from joined tables.
2043 */
2045
2046 /**
2047 Pointer to first object in list of Name res context objects that have
2048 this query block as the base query block.
2049 Includes field "context" which is embedded in this query block.
2050 */
2052
2053 /**
2054 After optimization it is pointer to corresponding JOIN. This member
2055 should be changed only when THD::LOCK_query_plan mutex is taken.
2056 */
2057 JOIN *join{nullptr};
2058 /// Set of table references contained in outer-most join nest
2060 /// Pointer to the set of table references in the currently active join
2062 /// table embedding the above list
2064 /**
2065 Points to first leaf table of query block. After setup_tables() is done,
2066 this is a list of base tables and derived tables. After derived tables
2067 processing is done, this is a list of base tables only.
2068 Use Table_ref::next_leaf to traverse the list.
2069 */
2071 /// Last table for LATERAL join, used by table functions
2073
2074 /// LIMIT clause, NULL if no limit is given
2076 /// LIMIT ... OFFSET clause, NULL if no offset is given
2078 /// Whether we have LIMIT 1 and no OFFSET.
2079 bool m_limit_1{false};
2080 /**
2081 Circular linked list of aggregate functions in nested query blocks.
2082 This is needed if said aggregate functions depend on outer values
2083 from this query block; if so, we want to add them as hidden items
2084 in our own field list, to be able to evaluate them.
2085 @see Item_sum::check_sum_func
2086 */
2088
2089 /**
2090 Array of pointers to "base" items; one each for every selected expression
2091 and referenced item in the query block. All members of "base_ref_items"
2092 are also present in the "fields" container.
2093 All references to columns (i.e. Item_field) are to buffers associated
2094 with the primary input tables.
2095
2096 Note: The order of expressions in "base_ref_items" may be different from
2097 the order of expressions in "fields".
2098 Note: The array must be created with sufficient size during resolving and
2099 must be preserved in size and location as long as statement exists.
2100 Note: Currently, items representing expressions must be added as follows:
2101 <original visible exprs> <hidden exprs> <generated visible exprs>.
2102 <hidden exprs> are added during resolving and may be an empty set.
2103 <generated visible exprs> are added during possible transformation
2104 stages and may also be an empty set.
2105 */
2107
2108 uint select_number{0}; ///< Query block number (used for EXPLAIN)
2109
2110 /**
2111 Saved values of the WHERE and HAVING clauses. Allowed values are:
2112 - COND_UNDEF if the condition was not specified in the query or if it
2113 has not been optimized yet
2114 - COND_TRUE if the condition is always true
2115 - COND_FALSE if the condition is impossible
2116 - COND_OK otherwise
2117 */
2120
2121 /// Parse context: indicates where the current expression is being parsed
2123 /// Parse context: is inside a set function if this is positive
2125 /// Parse context: is inside a window function if this is positive
2127
2128 /**
2129 Three fields used by semi-join transformations to know when semi-join is
2130 possible, and in which condition tree the subquery predicate is located.
2131 */
2141 RESOLVE_NONE}; ///< Indicates part of query being resolved
2142
2143 /**
2144 Number of fields used in select list or where clause of current select
2145 and all inner subselects.
2146 */
2148 /**
2149 Number of items in the select list, HAVING clause, QUALIFY clause and ORDER
2150 BY clause. It is used to reserve space in the base_ref_items array so that
2151 it is big enough to hold hidden items for any of the expressions or
2152 sub-expressions in those clauses.
2153 */
2155 /// Number of arguments of and/or/xor in where/having/on
2157 /// Number of predicates after preparation
2158 uint cond_count{0};
2159 /// Number of between predicates in where/having/on
2161 /// Maximal number of elements in multiple equalities
2163
2164 /**
2165 Number of Item_sum-derived objects in this SELECT. Keeps count of
2166 aggregate functions and window functions(to allocate items in ref array).
2167 See Query_block::setup_base_ref_items.
2168 */
2170 /// Number of Item_sum-derived objects in children and descendant SELECTs
2172
2173 /// Keep track for allocation of base_ref_items: scalar subqueries may be
2174 /// replaced by a field during scalar_to_derived transformation
2176
2177 /// Number of stored function calls in this query block
2179
2180 /// Number of materialized derived tables and views in this query block.
2182 /// Number of partitioned tables
2184
2185 /**
2186 Number of wildcards used in the SELECT list. For example,
2187 SELECT *, t1.*, catalog.t2.* FROM t0, t1, t2;
2188 has 3 wildcards.
2189 */
2190 uint with_wild{0};
2191
2192 /// Original query table map before aj/sj processing.
2194 /// Number of leaf tables in this query block.
2196 /// Number of derived tables and views in this query block.
2198 /// Number of table functions in this query block
2200
2201 /**
2202 Nesting level of query block, outer-most query block has level 0,
2203 its subqueries have level 1, etc. @see also sql/item_sum.h.
2204 */
2206
2207 /**
2208 Indicates whether this query block contains non-primitive grouping (such as
2209 ROLLUP).
2210 */
2212
2213 /// @see enum_condition_context
2215
2216 /// If set, the query block is of the form VALUES row_list.
2218
2219 /// Describes context of this query block (e.g if it is a derived table).
2221
2222 /**
2223 result of this query can't be cached, bit field, can be :
2224 UNCACHEABLE_DEPENDENT
2225 UNCACHEABLE_RAND
2226 UNCACHEABLE_SIDEEFFECT
2227 */
2229
2230 void update_used_tables();
2232 bool save_cmd_properties(THD *thd);
2233
2234 /**
2235 This variable is required to ensure proper work of subqueries and
2236 stored procedures. Generally, one should use the states of
2237 Query_arena to determine if it's a statement prepare or first
2238 execution of a stored procedure. However, in case when there was an
2239 error during the first execution of a stored procedure, the SP body
2240 is not expelled from the SP cache. Therefore, a deeply nested
2241 subquery might be left unoptimized. So we need this per-subquery
2242 variable to inidicate the optimization/execution state of every
2243 subquery. Prepared statements work OK in that regard, as in
2244 case of an error during prepare the PS is not created.
2245 */
2247
2248 /// True when semi-join pull-out processing is complete
2249 bool sj_pullout_done{false};
2250
2251 /// Used by nested scalar_to_derived transformations
2253
2254 /// True: skip local transformations during prepare() call (used by INSERT)
2256
2258
2259 /// true when having fix field called in processing of this query block
2260 bool having_fix_field{false};
2261 /// true when GROUP BY fix field called in processing of this query block
2262 bool group_fix_field{false};
2263 /// true when resolving a window's ORDER BY or PARTITION BY, the window
2264 /// belonging to this query block.
2266
2267 /**
2268 True if contains or aggregates set functions.
2269 @note this is wrong when a locally found set function is aggregated
2270 in an outer query block.
2271 */
2272 bool with_sum_func{false};
2273
2274 /**
2275 HAVING clause contains subquery => we can't close tables before
2276 query processing end even if we use temporary table
2277 */
2279
2280 /**
2281 If true, use select_limit to limit number of rows selected.
2282 Applicable when no explicit limit is supplied, and only for the
2283 outermost query block of a SELECT statement.
2284 */
2286
2287 /// If true, limit object is added internally
2288 bool m_internal_limit{false};
2289
2290 /// exclude this query block from unique_table() check
2292
2293 bool no_table_names_allowed{false}; ///< used for global order by
2294
2295 /// Keeps track of the current ORDER BY expression we are resolving for
2296 /// ORDER BY, if any. Not used for GROUP BY or windowing ordering.
2298
2299 /// Hidden items added during optimization
2300 /// @note that using this means we modify resolved data during optimization
2302
2303 [[nodiscard]] bool limit_offset_preserves_first_row() const;
2304
2305 private:
2306 friend class Query_expression;
2307 friend class Condition_context;
2308
2309 /// Helper for save_properties()
2311 Group_list_ptrs **list_ptrs);
2312
2314 bool simplify_joins(THD *thd, mem_root_deque<Table_ref *> *join_list,
2315 bool top, bool in_sj, Item **new_conds,
2316 uint *changelog = nullptr);
2317 /// Remove semijoin condition for this query block
2318 void clear_sj_expressions(NESTED_JOIN *nested_join);
2319 /// Build semijoin condition for th query block
2320 bool build_sj_cond(THD *thd, NESTED_JOIN *nested_join,
2321 Query_block *subq_query_block, table_map outer_tables_map,
2322 Item **sj_cond, bool *simple_const);
2324 Table_ref *join_nest);
2325
2328 Item *join_cond, bool left_outer,
2329 bool use_inner_join);
2330 bool transform_subquery_to_derived(THD *thd, Table_ref **out_tl,
2331 Query_expression *subs_query_expression,
2332 Item_subselect *subq, bool use_inner_join,
2333 bool reject_multiple_rows,
2334 Item::Css_info *subquery,
2335 Item *lifted_where_cond);
2337 THD *thd, Item_exists_subselect *subq_pred);
2339 THD *thd, Table_ref *derived, Lifted_expressions_map *lifted_expressions,
2340 mem_root_deque<Item *> &exprs_added_to_group_by, uint hidden_fields);
2342 Lifted_expressions_map *lifted_exprs,
2343 Item *selected_field_or_ref,
2344 const uint first_non_hidden);
2346 THD *thd, Lifted_expressions_map *lifted_exprs);
2348 THD *thd, List_iterator<Item> &inner_exprs, Item *selected_item,
2349 bool *selected_expr_added_to_group_by,
2350 mem_root_deque<Item *> *exprs_added_to_group_by);
2352 THD *thd, Table_ref *derived, Item::Css_info *subquery,
2353 Item *lifted_where, Lifted_expressions_map *lifted_where_expressions,
2354 bool *added_card_check, size_t *added_window_card_checks);
2356 THD *thd, Table_ref *derived, Lifted_expressions_map *lifted_exprs,
2357 bool added_card_check, size_t added_window_card_checks);
2358 /// Replace the first visible item in the select list with a wrapping
2359 /// MIN or MAX aggregate function.
2360 bool replace_first_item_with_min_max(THD *thd, int item_no, bool use_min);
2361 void replace_referenced_item(Item *const old_item, Item *const new_item);
2362 void remap_tables(THD *thd);
2364 Item *resolve_rollup_item(THD *thd, Item *item);
2365 bool resolve_rollup(THD *thd);
2366
2367 bool setup_wild(THD *thd);
2368 bool setup_order_final(THD *thd);
2369 bool setup_group(THD *thd);
2370 void fix_after_pullout(Query_block *parent_query_block,
2371 Query_block *removed_query_block);
2374 bool empty_order_list(Query_block *sl);
2376 bool in_update);
2377 bool find_common_table_expr(THD *thd, Table_ident *table_id, Table_ref *tl,
2378 Parse_context *pc, bool *found);
2379 /**
2380 Transform eligible scalar subqueries in the SELECT list, WHERE condition,
2381 HAVING condition or JOIN conditions of a query block[*] to an equivalent
2382 derived table of a LEFT OUTER join, e.g. as shown in this uncorrelated
2383 subquery:
2384
2385 [*] a.k.a "transformed query block" throughout this method and its minions.
2386
2387 <pre>
2388 SELECT * FROM t1
2389 WHERE t1.a > (SELECT COUNT(a) AS cnt FROM t2); ->
2390
2391 SELECT t1.* FROM t1 LEFT OUTER JOIN
2392 (SELECT COUNT(a) AS cnt FROM t2) AS derived
2393 ON TRUE WHERE t1.a > derived.cnt;
2394 </pre>
2395
2396 Grouping in the transformed query block may necessitate the grouping to be
2397 moved down to another derived table, cf. transform_grouped_to_derived.
2398
2399 Limitations:
2400 - only implicitly grouped subqueries (guaranteed to have cardinality one)
2401 are identified as scalar subqueries.
2402 _ Correlated subqueries are not handled
2403
2404 @param[in,out] thd the session context
2405 @returns true on error
2406 */
2409 Item **lifted_where);
2410 bool replace_item_in_expression(Item **expr, bool was_hidden,
2412 Item_transformer transformer);
2413 bool transform_grouped_to_derived(THD *thd, bool *break_off);
2414 bool replace_subquery_in_expr(THD *thd, Item::Css_info *subquery,
2415 Table_ref *tr, Item **expr);
2416 bool nest_derived(THD *thd, Item *join_cond,
2417 mem_root_deque<Table_ref *> *join_list,
2418 Table_ref *new_derived_table);
2419
2421
2422 // Delete unused columns from merged derived tables
2424
2425 bool prepare_values(THD *thd);
2426 bool check_only_full_group_by(THD *thd);
2427 /**
2428 Copies all non-aggregated calls to the full-text search MATCH function from
2429 the HAVING clause to the SELECT list (as hidden items), so that we can
2430 materialize their result and not only their input. This is needed when the
2431 result will be accessed after aggregation, as the result from MATCH cannot
2432 be recalculated from its input alone. It also needs the underlying scan to
2433 be positioned on the correct row. Storing the value before aggregation
2434 removes the need for evaluating MATCH again after materialization.
2435 */
2437
2438 //
2439 // Members:
2440 //
2441
2442 /**
2443 Pointer to collection of subqueries candidate for semi/antijoin
2444 conversion.
2445 Template parameter is "true": no need to run DTORs on pointers.
2446 */
2448
2449 /// How many expressions are part of the order by but not select list.
2451
2452 /**
2453 Intrusive linked list of all query blocks within the same
2454 query expression.
2455 */
2457
2458 /// The query expression containing this query block.
2460 /// The first query expression contained within this query block.
2462
2463 /// Intrusive double-linked global list of query blocks.
2466
2467 /// Result of this query block
2469
2470 /**
2471 Options assigned from parsing and throughout resolving,
2472 should not be modified after resolving is done.
2473 */
2475 /**
2476 Active options. Derived from base options, modifiers added during
2477 resolving and values from session variable option_bits. Since the latter
2478 may change, active options are refreshed per execution of a statement.
2479 */
2481
2482 /**
2483 If the query block includes non-primitive grouping, then these modifiers are
2484 represented as grouping sets. The variable 'm_num_grouping_sets' holds the
2485 count of grouping sets.
2486 */
2488
2489 public:
2491 nullptr}; ///< Used when resolving outer join condition
2492
2494 void set_number_of_grouping_sets(int num_grouping_sets) {
2495 m_num_grouping_sets = num_grouping_sets;
2496 }
2497
2498 private:
2499 /**
2500 Condition to be evaluated after all tables in a query block are joined.
2501 After all permanent transformations have been conducted by
2502 Query_block::prepare(), this condition is "frozen", any subsequent changes
2503 to it must be done with change_item_tree(), unless they only modify AND/OR
2504 items and use a copy created by Query_block::get_optimizable_conditions().
2505 Same is true for 'having_cond'.
2506 */
2508
2509 /// Condition to be evaluated on grouped rows after grouping.
2511
2512 /// Condition to be evaluated after window functions.
2514
2515 /// Number of GROUP BY expressions added to all_fields
2517
2518 /// A backup of the items in base_ref_items at the end of preparation, so that
2519 /// base_ref_items can be restored between executions of prepared statements.
2520 /// Empty if it's a regular statement.
2522
2523 /**
2524 True if query block has semi-join nests merged into it. Notice that this
2525 is updated earlier than sj_nests, so check this if info is needed
2526 before the full resolver process is complete.
2527 */
2528 bool has_sj_nests{false};
2529 bool has_aj_nests{false}; ///< @see has_sj_nests; counts antijoin nests.
2530 bool m_right_joins{false}; ///< True if query block has right joins
2531
2532 /// Allow merge of immediate unnamed derived tables
2534
2535 bool m_agg_func_used{false};
2537
2538 /**
2539 True if query block does not generate any rows before aggregation,
2540 determined during preparation (not optimization).
2541 */
2542 bool m_empty_query{false};
2543
2544 static const char
2546};
2547
2548inline bool Query_expression::is_union() const {
2549 Query_term *qt = query_term();
2550 while (qt->term_type() == QT_UNARY)
2551 qt = down_cast<Query_term_unary *>(qt)->child(0);
2552 return qt->term_type() == QT_UNION;
2553}
2554
2556 Query_term *qt = query_term();
2557 while (qt->term_type() == QT_UNARY)
2558 qt = down_cast<Query_term_unary *>(qt)->child(0);
2559 const Query_term_type type = qt->term_type();
2560 return type == QT_UNION || type == QT_INTERSECT || type == QT_EXCEPT;
2561}
2562
2563/// Utility RAII class to save/modify/restore the condition_context information
2564/// of a query block. @see enum_condition_context.
2566 public:
2568 Query_block *select_ptr,
2570 : select(nullptr), saved_value() {
2571 if (select_ptr) {
2572 select = select_ptr;
2574 // More restrictive wins over less restrictive:
2575 if (new_type == enum_condition_context::NEITHER ||
2576 (new_type == enum_condition_context::ANDS_ORS &&
2578 select->condition_context = new_type;
2579 }
2580 }
2583 }
2584
2585 private:
2588};
2589
2591 std::function<bool(Table_ref *)> action);
2592
2593/**
2594 Base class for secondary engine execution context objects. Secondary
2595 storage engines may create classes derived from this one which
2596 contain state they need to preserve between optimization and
2597 execution of statements. The context objects should be allocated on
2598 the execution MEM_ROOT.
2599*/
2601 public:
2602 /**
2603 Destructs the secondary engine execution context object. It is
2604 called after the query execution has completed. Secondary engines
2605 may override the destructor in subclasses and add code that
2606 performs cleanup tasks that are needed after query execution.
2607 */
2609};
2610
2612 char *user;
2616
2617 void reset();
2619
2624
2626 : m_db{db}, m_name{name}, m_alias{alias} {}
2627};
2628
2632 bool detistic = false;
2634 LEX_CSTRING language = NULL_CSTR; ///< CREATE|ALTER ... LANGUAGE <language>
2635 bool is_binary = false;
2636
2637 /**
2638 List of imported libraries for this routine
2639 */
2641
2642 /**
2643 Add library names to the set of imported libraries.
2644
2645 We only allow one USING clause in CREATE statements, so repeated calls
2646 to this function should fail.
2647
2648 @param libs Set of libraries to be added
2649 @param mem_root MEM_ROOT to use for allocation
2650
2651 @returns true on failures; false otherwise
2652 */
2654 MEM_ROOT *mem_root) {
2655 assert(!libs.empty());
2656
2657 if (m_imported_libraries != nullptr) return true; // Allow a single USING.
2658
2659 if (libs.empty()) return false; // Nothing to do.
2660 if (create_imported_libraries_deque(mem_root)) return true;
2661
2662 while (!libs.empty()) {
2663 if (m_imported_libraries->push_back(libs.front())) return true;
2664 libs.pop_front();
2665 }
2666 return false;
2667 }
2668
2669 /**
2670 Add a library to the set of imported libraries.
2671
2672 @param database The library's database.
2673 @param name The library's name.
2674 @param alias The library's alias.
2675 @param mem_root MEM_ROOT to use for allocation
2676
2677 @returns true on failures; false otherwise
2678 */
2679 bool add_imported_library(std::string_view database, std::string_view name,
2680 std::string_view alias, MEM_ROOT *mem_root) {
2681 if (m_imported_libraries == nullptr)
2682 if (create_imported_libraries_deque(mem_root)) return true;
2683
2684 return m_imported_libraries->push_back({
2685 {strmake_root(mem_root, database.data(), database.length()),
2686 database.length()}, // sp_name_with_alias.m_db
2687 {strmake_root(mem_root, name.data(), name.length()),
2688 name.length()}, // sp_name_with_alias.m_name
2689 {strmake_root(mem_root, alias.data(), alias.length()),
2690 alias.length()} // sp_name_with_alias.m_alias
2691 });
2692 }
2693
2695 if (m_imported_libraries != nullptr) return true; // Already allocated.
2698 return m_imported_libraries == nullptr;
2699 }
2700
2701 /**
2702 Get the set of imported libraries for the routine
2703
2704 @returns The set of imported libraries, nullptr if no imported libraries
2705 */
2707 return m_imported_libraries;
2708 }
2709
2710 /**
2711 Reset the structure.
2712 */
2713 void reset(void) {
2716 detistic = false;
2719 is_binary = false;
2720 m_imported_libraries = nullptr;
2721 }
2722};
2723
2724extern const LEX_STRING null_lex_str;
2725
2729
2730 /**
2731 FOLLOWS or PRECEDES as specified in the CREATE TRIGGER statement.
2732 */
2734
2735 /**
2736 Trigger name referenced in the FOLLOWS/PRECEDES clause of the CREATE TRIGGER
2737 statement.
2738 */
2740};
2741
2743
2744/*
2745 Class representing list of all tables used by statement and other
2746 information which is necessary for opening and locking its tables,
2747 like SQL command for this statement.
2748
2749 Also contains information about stored functions used by statement
2750 since during its execution we may have to add all tables used by its
2751 stored functions/triggers to this list in order to pre-open and lock
2752 them.
2753
2754 Also used by LEX::reset_n_backup/restore_backup_query_tables_list()
2755 methods to save and restore this information.
2756*/
2757
2759 public:
2761
2762 /**
2763 SQL command for this statement. Part of this class since the
2764 process of opening and locking tables for the statement needs
2765 this information to determine correct type of lock for some of
2766 the tables.
2767 */
2769 /* Global list of all tables used by this statement */
2771 /* Pointer to next_global member of last element in the previous list. */
2773 /*
2774 If non-0 then indicates that query requires prelocking and points to
2775 next_global member of last own element in query table list (i.e. last
2776 table which was not added to it as part of preparation to prelocking).
2777 0 - indicates that this query does not need prelocking.
2778 */
2780 /*
2781 Set of stored routines called by statement.
2782 (Note that we use lazy-initialization for this hash).
2783
2784 See Sroutine_hash_entry for explanation why this hash uses binary
2785 key comparison.
2786 */
2788 std::unique_ptr<malloc_unordered_map<std::string, Sroutine_hash_entry *>>
2790 /*
2791 List linking elements of 'sroutines' set. Allows you to add new elements
2792 to this set as you iterate through the list of existing elements.
2793 'sroutines_list_own_last' is pointer to ::next member of last element of
2794 this list which represents routine which is explicitly used by query.
2795 'sroutines_list_own_elements' number of explicitly used routines.
2796 We use these two members for restoring of 'sroutines_list' to the state
2797 in which it was right after query parsing.
2798 */
2802
2803 /**
2804 Does this LEX context have any stored functions
2805 */
2807
2808 /**
2809 Locking state of tables in this particular statement.
2810
2811 If we under LOCK TABLES or in prelocked mode we consider tables
2812 for the statement to be "locked" if there was a call to lock_tables()
2813 (which called handler::start_stmt()) for tables of this statement
2814 and there was no matching close_thread_tables() call.
2815
2816 As result this state may differ significantly from one represented
2817 by Open_tables_state::lock/locked_tables_mode more, which are always
2818 "on" under LOCK TABLES or in prelocked mode.
2819 */
2823 return (lock_tables_state == LTS_LOCKED);
2824 }
2825
2826 /**
2827 Number of tables which were open by open_tables() and to be locked
2828 by lock_tables().
2829 Note that we set this member only in some cases, when this value
2830 needs to be passed from open_tables() to lock_tables() which are
2831 separated by some amount of code.
2832 */
2834
2835 /*
2836 These constructor and destructor serve for creation/destruction
2837 of Query_tables_list instances which are used as backup storage.
2838 */
2841
2842 /* Initializes (or resets) Query_tables_list object for "real" use. */
2843 void reset_query_tables_list(bool init);
2846 *this = std::move(*state);
2847 }
2848
2849 /*
2850 Direct addition to the list of query tables.
2851 If you are using this function, you must ensure that the table
2852 object, in particular table->db member, is initialized.
2853 */
2855 *(table->prev_global = query_tables_last) = table;
2856 query_tables_last = &table->next_global;
2857 }
2859 void mark_as_requiring_prelocking(Table_ref **tables_own_last) {
2860 query_tables_own_last = tables_own_last;
2861 }
2862 /* Return pointer to first not-own table in query-tables or 0 */
2864 return (query_tables_own_last ? *query_tables_own_last : nullptr);
2865 }
2868 *query_tables_own_last = nullptr;
2870 query_tables_own_last = nullptr;
2871 }
2872 }
2873
2874 /**
2875 All types of unsafe statements.
2876
2877 @note The int values of the enum elements are used to point to
2878 bits in two bitmaps in two different places:
2879
2880 - Query_tables_list::binlog_stmt_flags
2881 - THD::binlog_unsafe_warning_flags
2882
2883 Hence in practice this is not an enum at all, but a map from
2884 symbols to bit indexes.
2885
2886 The ordering of elements in this enum must correspond to the order of
2887 elements in the array binlog_stmt_unsafe_errcode.
2888 */
2890 /**
2891 SELECT..LIMIT is unsafe because the set of rows returned cannot
2892 be predicted.
2893 */
2895 /**
2896 Access to log tables is unsafe because slave and master probably
2897 log different things.
2898 */
2900 /**
2901 Inserting into an autoincrement column in a stored routine is unsafe.
2902 Even with just one autoincrement column, if the routine is invoked more
2903 than once slave is not guaranteed to execute the statement graph same way
2904 as the master. And since it's impossible to estimate how many times a
2905 routine can be invoked at the query pre-execution phase (see lock_tables),
2906 the statement is marked pessimistically unsafe.
2907 */
2909 /**
2910 Using a UDF (user-defined function) is unsafe.
2911 */
2913 /**
2914 Using most system variables is unsafe, because slave may run
2915 with different options than master.
2916 */
2918 /**
2919 Using some functions is unsafe (e.g., UUID).
2920 */
2922
2923 /**
2924 Mixing transactional and non-transactional statements are unsafe if
2925 non-transactional reads or writes are occur after transactional
2926 reads or writes inside a transaction.
2927 */
2929
2930 /**
2931 Mixing self-logging and non-self-logging engines in a statement
2932 is unsafe.
2933 */
2935
2936 /**
2937 Statements that read from both transactional and non-transactional
2938 tables and write to any of them are unsafe.
2939 */
2941
2942 /**
2943 INSERT...IGNORE SELECT is unsafe because which rows are ignored depends
2944 on the order that rows are retrieved by SELECT. This order cannot be
2945 predicted and may differ on master and the slave.
2946 */
2948
2949 /**
2950 INSERT...SELECT...UPDATE is unsafe because which rows are updated depends
2951 on the order that rows are retrieved by SELECT. This order cannot be
2952 predicted and may differ on master and the slave.
2953 */
2955
2956 /**
2957 Query that writes to a table with auto_inc column after selecting from
2958 other tables are unsafe as the order in which the rows are retrieved by
2959 select may differ on master and slave.
2960 */
2962
2963 /**
2964 INSERT...REPLACE SELECT is unsafe because which rows are replaced depends
2965 on the order that rows are retrieved by SELECT. This order cannot be
2966 predicted and may differ on master and the slave.
2967 */
2969
2970 /**
2971 CREATE TABLE... IGNORE... SELECT is unsafe because which rows are ignored
2972 depends on the order that rows are retrieved by SELECT. This order cannot
2973 be predicted and may differ on master and the slave.
2974 */
2976
2977 /**
2978 CREATE TABLE...REPLACE... SELECT is unsafe because which rows are replaced
2979 depends on the order that rows are retrieved from SELECT. This order
2980 cannot be predicted and may differ on master and the slave
2981 */
2983
2984 /**
2985 CREATE TABLE...SELECT on a table with auto-increment column is unsafe
2986 because which rows are replaced depends on the order that rows are
2987 retrieved from SELECT. This order cannot be predicted and may differ on
2988 master and the slave
2989 */
2991
2992 /**
2993 UPDATE...IGNORE is unsafe because which rows are ignored depends on the
2994 order that rows are updated. This order cannot be predicted and may differ
2995 on master and the slave.
2996 */
2998
2999 /**
3000 INSERT... ON DUPLICATE KEY UPDATE on a table with more than one
3001 UNIQUE KEYS is unsafe.
3002 */
3004
3005 /**
3006 INSERT into auto-inc field which is not the first part in composed
3007 primary key.
3008 */
3010
3011 /**
3012 Using a plugin is unsafe.
3013 */
3017
3018 /**
3019 XA transactions and statements.
3020 */
3022
3023 /**
3024 If a substatement inserts into or updates a table that has a column with
3025 an unsafe DEFAULT expression, it may not have the same effect on the
3026 slave.
3027 */
3029
3030 /**
3031 DML or DDL statement that reads a ACL table is unsafe, because the row
3032 are read without acquiring SE row locks. This would allow ACL tables to
3033 be updated by concurrent thread. It would not have the same effect on the
3034 slave.
3035 */
3037
3038 /**
3039 Generating invisible primary key for a table created using CREATE TABLE...
3040 SELECT... is unsafe because order in which rows are retrieved by the
3041 SELECT determines which (if any) rows are inserted. This order cannot be
3042 predicted and values for generated invisible primary key column may
3043 differ on source and replica when @@session.binlog_format=STATEMENT.
3044 */
3046
3047 /* the last element of this enumeration type. */
3050 /**
3051 This has all flags from 0 (inclusive) to BINLOG_STMT_FLAG_COUNT
3052 (exclusive) set.
3053 */
3055 ((1 << BINLOG_STMT_UNSAFE_COUNT) - 1);
3056
3057 /**
3058 Maps elements of enum_binlog_stmt_unsafe to error codes.
3059 */
3061
3062 /**
3063 Determine if this statement is marked as unsafe.
3064
3065 @retval 0 if the statement is not marked as unsafe.
3066 @retval nonzero if the statement is marked as unsafe.
3067 */
3068 inline bool is_stmt_unsafe() const { return get_stmt_unsafe_flags() != 0; }
3069
3071 return binlog_stmt_flags & (1 << unsafe);
3072 }
3073
3074 /**
3075 Flag the current (top-level) statement as unsafe.
3076 The flag will be reset after the statement has finished.
3077
3078 @param unsafe_type The type of unsafety: one of the @c
3079 BINLOG_STMT_FLAG_UNSAFE_* flags in @c enum_binlog_stmt_flag.
3080 */
3081 inline void set_stmt_unsafe(enum_binlog_stmt_unsafe unsafe_type) {
3082 DBUG_TRACE;
3083 assert(unsafe_type >= 0 && unsafe_type < BINLOG_STMT_UNSAFE_COUNT);
3084 binlog_stmt_flags |= (1U << unsafe_type);
3085 return;
3086 }
3087
3088 /**
3089 Set the bits of binlog_stmt_flags determining the type of
3090 unsafeness of the current statement. No existing bits will be
3091 cleared, but new bits may be set.
3092
3093 @param flags A binary combination of zero or more bits, (1<<flag)
3094 where flag is a member of enum_binlog_stmt_unsafe.
3095 */
3097 DBUG_TRACE;
3098 assert((flags & ~BINLOG_STMT_UNSAFE_ALL_FLAGS) == 0);
3100 return;
3101 }
3102
3103 /**
3104 Return a binary combination of all unsafe warnings for the
3105 statement. If the statement has been marked as unsafe by the
3106 'flag' member of enum_binlog_stmt_unsafe, then the return value
3107 from this function has bit (1<<flag) set to 1.
3108 */
3110 DBUG_TRACE;
3112 }
3113
3114 /**
3115 Determine if this statement is a row injection.
3116
3117 @retval 0 if the statement is not a row injection
3118 @retval nonzero if the statement is a row injection
3119 */
3120 inline bool is_stmt_row_injection() const {
3121 constexpr uint32_t shift =
3122 static_cast<uint32_t>(BINLOG_STMT_UNSAFE_COUNT) +
3123 static_cast<uint32_t>(BINLOG_STMT_TYPE_ROW_INJECTION);
3124 return binlog_stmt_flags & (1U << shift);
3125 }
3126
3127 /**
3128 Flag the statement as a row injection. A row injection is either
3129 a BINLOG statement, or a row event in the relay log executed by
3130 the slave SQL thread.
3131 */
3133 constexpr uint32_t shift =
3134 static_cast<uint32_t>(BINLOG_STMT_UNSAFE_COUNT) +
3135 static_cast<uint32_t>(BINLOG_STMT_TYPE_ROW_INJECTION);
3136 DBUG_TRACE;
3137 binlog_stmt_flags |= (1U << shift);
3138 }
3139
3141 /*
3142 If a transactional table is about to be read. Note that
3143 a write implies a read.
3144 */
3146 /*
3147 If a non-transactional table is about to be read. Note that
3148 a write implies a read.
3149 */
3151 /*
3152 If a temporary transactional table is about to be read. Note
3153 that a write implies a read.
3154 */
3156 /*
3157 If a temporary non-transactional table is about to be read. Note
3158 that a write implies a read.
3159 */
3161 /*
3162 If a transactional table is about to be updated.
3163 */
3165 /*
3166 If a non-transactional table is about to be updated.
3167 */
3169 /*
3170 If a temporary transactional table is about to be updated.
3171 */
3173 /*
3174 If a temporary non-transactional table is about to be updated.
3175 */
3177 /*
3178 The last element of the enumeration. Please, if necessary add
3179 anything before this.
3180 */
3183
3184#ifndef NDEBUG
3185 static inline const char *stmt_accessed_table_string(
3186 enum_stmt_accessed_table accessed_table) {
3187 switch (accessed_table) {
3189 return "STMT_READS_TRANS_TABLE";
3190 break;
3192 return "STMT_READS_NON_TRANS_TABLE";
3193 break;
3195 return "STMT_READS_TEMP_TRANS_TABLE";
3196 break;
3198 return "STMT_READS_TEMP_NON_TRANS_TABLE";
3199 break;
3201 return "STMT_WRITES_TRANS_TABLE";
3202 break;
3204 return "STMT_WRITES_NON_TRANS_TABLE";
3205 break;
3207 return "STMT_WRITES_TEMP_TRANS_TABLE";
3208 break;
3210 return "STMT_WRITES_TEMP_NON_TRANS_TABLE";
3211 break;
3213 default:
3214 assert(0);
3215 break;
3216 }
3218 return "";
3219 }
3220#endif /* DBUG */
3221
3222#define BINLOG_DIRECT_ON \
3223 0xF0 /* unsafe when \
3224 --binlog-direct-non-trans-updates \
3225 is ON */
3226
3227#define BINLOG_DIRECT_OFF \
3228 0xF /* unsafe when \
3229 --binlog-direct-non-trans-updates \
3230 is OFF */
3231
3232#define TRX_CACHE_EMPTY 0x33 /* unsafe when trx-cache is empty */
3233
3234#define TRX_CACHE_NOT_EMPTY 0xCC /* unsafe when trx-cache is not empty */
3235
3236#define IL_LT_REPEATABLE 0xAA /* unsafe when < ISO_REPEATABLE_READ */
3237
3238#define IL_GTE_REPEATABLE 0x55 /* unsafe when >= ISO_REPEATABLE_READ */
3239
3240 /**
3241 Sets the type of table that is about to be accessed while executing a
3242 statement.
3244 @param accessed_table Enumeration type that defines the type of table,
3245 e.g. temporary, transactional, non-transactional.
3246 */
3247 inline void set_stmt_accessed_table(enum_stmt_accessed_table accessed_table) {
3248 DBUG_TRACE;
3249
3250 assert(accessed_table >= 0 && accessed_table < STMT_ACCESS_TABLE_COUNT);
3251 stmt_accessed_table_flag |= (1U << accessed_table);
3252
3253 return;
3254 }
3255
3256 /**
3257 Checks if a type of table is about to be accessed while executing a
3258 statement.
3259
3260 @param accessed_table Enumeration type that defines the type of table,
3261 e.g. temporary, transactional, non-transactional.
3263 @retval true if the type of the table is about to be accessed
3264 @retval false otherwise
3265 */
3266 inline bool stmt_accessed_table(enum_stmt_accessed_table accessed_table) {
3267 DBUG_TRACE;
3268
3269 assert(accessed_table >= 0 && accessed_table < STMT_ACCESS_TABLE_COUNT);
3270
3271 return (stmt_accessed_table_flag & (1U << accessed_table)) != 0;
3272 }
3273
3274 /*
3275 Checks if a mixed statement is unsafe.
3276
3277
3278 @param in_multi_stmt_transaction_mode defines if there is an on-going
3279 multi-transactional statement.
3280 @param binlog_direct defines if --binlog-direct-non-trans-updates is
3281 active.
3282 @param trx_cache_is_not_empty defines if the trx-cache is empty or not.
3283 @param trx_isolation defines the isolation level.
3284
3285 @return
3286 @retval true if the mixed statement is unsafe
3287 @retval false otherwise
3288 */
3289 inline bool is_mixed_stmt_unsafe(bool in_multi_stmt_transaction_mode,
3290 bool binlog_direct,
3291 bool trx_cache_is_not_empty,
3292 uint tx_isolation) {
3293 bool unsafe = false;
3294
3295 if (in_multi_stmt_transaction_mode) {
3296 const uint condition =
3297 (binlog_direct ? BINLOG_DIRECT_ON : BINLOG_DIRECT_OFF) &
3298 (trx_cache_is_not_empty ? TRX_CACHE_NOT_EMPTY : TRX_CACHE_EMPTY) &
3299 (tx_isolation >= ISO_REPEATABLE_READ ? IL_GTE_REPEATABLE
3301
3302 unsafe = (binlog_unsafe_map[stmt_accessed_table_flag] & condition);
3303
3304#if !defined(NDEBUG)
3305 DBUG_PRINT("LEX::is_mixed_stmt_unsafe",
3306 ("RESULT %02X %02X %02X\n", condition,
3309
3310 int type_in = 0;
3311 for (; type_in < STMT_ACCESS_TABLE_COUNT; type_in++) {
3313 DBUG_PRINT("LEX::is_mixed_stmt_unsafe",
3314 ("ACCESSED %s ", stmt_accessed_table_string(
3315 (enum_stmt_accessed_table)type_in)));
3316 }
3317#endif
3318 }
3319
3322 tx_isolation < ISO_REPEATABLE_READ)
3323 unsafe = true;
3326 tx_isolation < ISO_REPEATABLE_READ)
3327 unsafe = true;
3328
3329 return (unsafe);
3330 }
3331
3332 /**
3333 true if the parsed tree contains references to stored procedures, triggers
3334 or functions, false otherwise
3336 bool uses_stored_routines() const { return sroutines_list.elements != 0; }
3338 void set_using_match() { using_match = true; }
3339 bool get_using_match() { return using_match; }
3340
3342 bool is_stmt_unsafe_with_mixed_mode() const {
3344 }
3345
3346 private:
3347 /**
3348 Enumeration listing special types of statements.
3349
3350 Currently, the only possible type is ROW_INJECTION.
3351 */
3353 /**
3354 The statement is a row injection (i.e., either a BINLOG
3355 statement or a row event executed by the slave SQL thread).
3356 */
3358
3359 /** The last element of this enumeration type. */
3361 };
3362
3363 /**
3364 Bit field indicating the type of statement.
3365
3366 There are two groups of bits:
3367
3368 - The low BINLOG_STMT_UNSAFE_COUNT bits indicate the types of
3369 unsafeness that the current statement has.
3370
3371 - The next BINLOG_STMT_TYPE_COUNT bits indicate if the statement
3372 is of some special type.
3373
3374 This must be a member of LEX, not of THD: each stored procedure
3375 needs to remember its unsafeness state between calls and each
3376 stored procedure has its own LEX object (but no own THD object).
3377 */
3379
3380 /**
3381 Bit field that determines the type of tables that are about to be
3382 be accessed while executing a statement.
3383 */
3386 /**
3387 It will be set true if 'MATCH () AGAINST' is used in the statement.
3388 */
3389 bool using_match;
3390
3391 /**
3392 This flag is set to true if statement is unsafe to be binlogged in STATEMENT
3393 format, when in MIXED mode.
3394 Currently this flag is set to true if stored program used in statement has
3395 CREATE/DROP temporary table operation(s) as sub-statement(s).
3396 */
3397 bool stmt_unsafe_with_mixed_mode{false};
3398};
3399
3400/*
3401 st_parsing_options contains the flags for constructions that are
3402 allowed in the current statement.
3404
3406 bool allows_variable;
3407 bool allows_select_into;
3408
3409 st_parsing_options() { reset(); }
3410 void reset();
3411};
3413/**
3414 The state of the lexical parser, when parsing comments.
3415*/
3417 /**
3418 Not parsing comments.
3419 */
3420 NO_COMMENT,
3421
3422 /**
3423 Parsing comments that need to be preserved.
3424 (Copy '/' '*' and '*' '/' sequences to the preprocessed buffer.)
3425 Typically, these are user comments '/' '*' ... '*' '/'.
3426 */
3428
3429 /**
3430 Parsing comments that need to be discarded.
3431 (Don't copy '/' '*' '!' and '*' '/' sequences to the preprocessed buffer.)
3432 Typically, these are special comments '/' '*' '!' ... '*' '/',
3433 or '/' '*' '!' 'M' 'M' 'm' 'm' 'm' ... '*' '/', where the comment
3434 markers should not be expanded.
3435 */
3437};
3438
3439/**
3440 This class represents the character input stream consumed during lexical
3441 analysis.
3442
3443 In addition to consuming the input stream, this class performs some comment
3444 pre processing, by filtering out out-of-bound special text from the query
3445 input stream.
3446
3447 Two buffers, with pointers inside each, are maintained in parallel. The
3448 'raw' buffer is the original query text, which may contain out-of-bound
3449 comments. The 'cpp' (for comments pre processor) is the pre-processed buffer
3450 that contains only the query text that should be seen once out-of-bound data
3451 is removed.
3452*/
3453
3454class Lex_input_stream {
3455 public:
3456 /**
3457 Constructor
3459 @param grammar_selector_token_arg See grammar_selector_token.
3460 */
3461
3462 explicit Lex_input_stream(uint grammar_selector_token_arg)
3463 : grammar_selector_token(grammar_selector_token_arg) {}
3464
3465 /**
3466 Object initializer. Must be called before usage.
3468 @retval false OK
3469 @retval true Error
3470 */
3471 bool init(THD *thd, const char *buff, size_t length);
3472
3473 void reset(const char *buff, size_t length);
3474
3475 /**
3476 Set the echo mode.
3477
3478 When echo is true, characters parsed from the raw input stream are
3479 preserved. When false, characters parsed are silently ignored.
3480 @param echo the echo mode.
3481 */
3482 void set_echo(bool echo) { m_echo = echo; }
3483
3484 void save_in_comment_state() {
3487 }
3488
3492 }
3493
3494 /**
3495 Skip binary from the input stream.
3496 @param n number of bytes to accept.
3497 */
3498 void skip_binary(int n) {
3499 assert(m_ptr + n <= m_end_of_query);
3500 if (m_echo) {
3501 memcpy(m_cpp_ptr, m_ptr, n);
3502 m_cpp_ptr += n;
3503 }
3504 m_ptr += n;
3505 }
3506
3507 /**
3508 Get a character, and advance in the stream.
3509 @return the next character to parse.
3510 */
3511 unsigned char yyGet() {
3512 assert(m_ptr <= m_end_of_query);
3513 const char c = *m_ptr++;
3514 if (m_echo) *m_cpp_ptr++ = c;
3515 return c;
3516 }
3517
3518 /**
3519 Get the last character accepted.
3520 @return the last character accepted.
3521 */
3522 unsigned char yyGetLast() const { return m_ptr[-1]; }
3524 /**
3525 Look at the next character to parse, but do not accept it.
3526 */
3527 unsigned char yyPeek() const {
3528 assert(m_ptr <= m_end_of_query);
3529 return m_ptr[0];
3530 }
3531
3532 /**
3533 Look ahead at some character to parse.
3534 @param n offset of the character to look up
3535 */
3536 unsigned char yyPeekn(int n) const {
3537 assert(m_ptr + n <= m_end_of_query);
3538 return m_ptr[n];
3539 }
3540
3541 /**
3542 Cancel the effect of the last yyGet() or yySkip().
3543 Note that the echo mode should not change between calls to yyGet / yySkip
3544 and yyUnget. The caller is responsible for ensuring that.
3545 */
3546 void yyUnget() {
3547 m_ptr--;
3548 if (m_echo) m_cpp_ptr--;
3549 }
3551 /**
3552 Accept a character, by advancing the input stream.
3553 */
3554 void yySkip() {
3555 assert(m_ptr <= m_end_of_query);
3556 if (m_echo)
3557 *m_cpp_ptr++ = *m_ptr++;
3558 else
3559 m_ptr++;
3560 }
3561
3562 /**
3563 Accept multiple characters at once.
3564 @param n the number of characters to accept.
3565 */
3566 void yySkipn(int n) {
3567 assert(m_ptr + n <= m_end_of_query);
3568 if (m_echo) {
3569 memcpy(m_cpp_ptr, m_ptr, n);
3570 m_cpp_ptr += n;
3571 }
3572 m_ptr += n;
3573 }
3574
3575 /**
3576 Puts a character back into the stream, canceling
3577 the effect of the last yyGet() or yySkip().
3578 Note that the echo mode should not change between calls
3579 to unput, get, or skip from the stream.
3580 */
3581 char *yyUnput(char ch) {
3582 *--m_ptr = ch;
3583 if (m_echo) m_cpp_ptr--;
3584 return m_ptr;
3585 }
3586
3587 /**
3588 Inject a character into the pre-processed stream.
3589
3590 Note, this function is used to inject a space instead of multi-character
3591 C-comment. Thus there is no boundary checks here (basically, we replace
3592 N-chars by 1-char here).
3593 */
3594 char *cpp_inject(char ch) {
3595 *m_cpp_ptr = ch;
3596 return ++m_cpp_ptr;
3597 }
3598
3599 /**
3600 End of file indicator for the query text to parse.
3601 @return true if there are no more characters to parse
3602 */
3603 bool eof() const { return (m_ptr >= m_end_of_query); }
3604
3605 /**
3606 End of file indicator for the query text to parse.
3607 @param n number of characters expected
3608 @return true if there are less than n characters to parse
3610 bool eof(int n) const { return ((m_ptr + n) >= m_end_of_query); }
3611
3612 /** Get the raw query buffer. */
3613 const char *get_buf() const { return m_buf; }
3614
3615 /** Get the pre-processed query buffer. */
3616 const char *get_cpp_buf() const { return m_cpp_buf; }
3617
3618 /** Get the end of the raw query buffer. */
3619 const char *get_end_of_query() const { return m_end_of_query; }
3620
3621 /** Mark the stream position as the start of a new token. */
3622 void start_token() {
3624 m_tok_end = m_ptr;
3625
3628 }
3629
3630 /**
3631 Adjust the starting position of the current token.
3632 This is used to compensate for starting whitespace.
3633 */
3634 void restart_token() {
3637 }
3638
3639 /** Get the token start position, in the raw buffer. */
3640 const char *get_tok_start() const { return m_tok_start; }
3641
3642 /** Get the token start position, in the pre-processed buffer. */
3643 const char *get_cpp_tok_start() const { return m_cpp_tok_start; }
3644
3645 /** Get the token end position, in the raw buffer. */
3646 const char *get_tok_end() const { return m_tok_end; }
3647
3648 /** Get the token end position, in the pre-processed buffer. */
3649 const char *get_cpp_tok_end() const { return m_cpp_tok_end; }
3650
3651 /** Get the current stream pointer, in the raw buffer. */
3652 const char *get_ptr() const { return m_ptr; }
3653
3654 /** Get the current stream pointer, in the pre-processed buffer. */
3655 const char *get_cpp_ptr() const { return m_cpp_ptr; }
3656
3657 /** Get the length of the current token, in the raw buffer. */
3658 uint yyLength() const {
3659 /*
3660 The assumption is that the lexical analyser is always 1 character ahead,
3661 which the -1 account for.
3662 */
3663 assert(m_ptr > m_tok_start);
3664 return (uint)((m_ptr - m_tok_start) - 1);
3665 }
3666
3667 /** Get the utf8-body string. */
3668 const char *get_body_utf8_str() const { return m_body_utf8; }
3669
3670 /** Get the utf8-body length. */
3675 void body_utf8_start(THD *thd, const char *begin_ptr);
3676 void body_utf8_append(const char *ptr);
3677 void body_utf8_append(const char *ptr, const char *end_ptr);
3679 const CHARSET_INFO *txt_cs,
3680 const char *end_ptr);
3681
3682 uint get_lineno(const char *raw_ptr) const;
3683
3684 /** Current thread. */
3685 THD *m_thd;
3686
3687 /** Current line number. */
3688 uint yylineno;
3689
3690 /** Length of the last token parsed. */
3691 uint yytoklen;
3692
3693 /** Interface with bison, value of the last token parsed. */
3695
3696 /**
3697 LALR(2) resolution, look ahead token.
3698 Value of the next token to return, if any,
3699 or -1, if no token was parsed in advance.
3700 Note: 0 is a legal token, and represents YYEOF.
3701 */
3702 int lookahead_token;
3703
3704 /** LALR(2) resolution, value of the look ahead token.*/
3706
3707 /// Skip adding of the current token's digest since it is already added
3708 ///
3709 /// Usually we calculate a digest token by token at the top-level function
3710 /// of the lexer: MYSQLlex(). However, some complex ("hintable") tokens break
3711 /// that data flow: for example, the `SELECT /*+ HINT(t) */` is the single
3712 /// token from the main parser's point of view, and we add the "SELECT"
3713 /// keyword to the digest buffer right after the lex_one_token() call,
3714 /// but the "/*+ HINT(t) */" is a sequence of separate tokens from the hint
3715 /// parser's point of view, and we add those tokens to the digest buffer
3716 /// *inside* the lex_one_token() call. Thus, the usual data flow adds
3717 /// tokens from the "/*+ HINT(t) */" string first, and only than it appends
3718 /// the "SELECT" keyword token to that stream: "/*+ HINT(t) */ SELECT".
3719 /// This is not acceptable, since we use the digest buffer to restore
3720 /// query strings in their normalized forms, so the order of added tokens is
3721 /// important. Thus, we add tokens of "hintable" keywords to a digest buffer
3722 /// right in the hint parser and skip adding of them at the caller with the
3723 /// help of skip_digest flag.
3725
3726 void add_digest_token(uint token, Lexer_yystype *yylval);
3727
3728 void reduce_digest_token(uint token_left, uint token_right);
3729
3731
3732 /**
3733 True if this scanner tokenizes a partial query (partition expression,
3734 generated column expression etc.)
3735
3736 @return true if parsing a partial query, otherwise false.
3737 */
3738 bool is_partial_parser() const { return grammar_selector_token >= 0; }
3739
3740 /**
3741 Outputs warnings on deprecated charsets in complete SQL statements
3743 @param [in] cs The character set/collation to check for a deprecation.
3744 @param [in] alias The name/alias of @p cs.
3745 */
3747 const char *alias) const {
3748 if (!is_partial_parser()) {
3750 }
3751 }
3752
3753 /**
3754 Outputs warnings on deprecated collations in complete SQL statements
3755
3756 @param [in] collation The collation to check for a deprecation.
3757 */
3759 if (!is_partial_parser()) {
3761 }
3762 }
3763
3765
3766 private:
3767 /** Pointer to the current position in the raw input stream. */
3768 char *m_ptr;
3769
3770 /** Starting position of the last token parsed, in the raw buffer. */
3771 const char *m_tok_start;
3772
3773 /** Ending position of the previous token parsed, in the raw buffer. */
3774 const char *m_tok_end;
3775
3776 /** End of the query text in the input stream, in the raw buffer. */
3777 const char *m_end_of_query;
3778
3779 /** Beginning of the query text in the input stream, in the raw buffer. */
3780 const char *m_buf;
3781
3782 /** Length of the raw buffer. */
3783 size_t m_buf_length;
3784
3785 /** Echo the parsed stream to the pre-processed buffer. */
3786 bool m_echo;
3787 bool m_echo_saved;
3788
3789 /** Pre-processed buffer. */
3790 char *m_cpp_buf;
3791
3792 /** Pointer to the current position in the pre-processed input stream. */
3793 char *m_cpp_ptr;
3794
3795 /**
3796 Starting position of the last token parsed,
3797 in the pre-processed buffer.
3798 */
3799 const char *m_cpp_tok_start;
3800
3801 /**
3802 Ending position of the previous token parsed,
3803 in the pre-processed buffer.
3804 */
3805 const char *m_cpp_tok_end;
3806
3807 /** UTF8-body buffer created during parsing. */
3808 char *m_body_utf8;
3809
3810 /** Pointer to the current position in the UTF8-body buffer. */
3811 char *m_body_utf8_ptr;
3812
3813 /**
3814 Position in the pre-processed buffer. The query from m_cpp_buf to
3815 m_cpp_utf_processed_ptr is converted to UTF8-body.
3816 */
3817 const char *m_cpp_utf8_processed_ptr;
3818
3819 public:
3820 /** Current state of the lexical analyser. */
3822
3823 /**
3824 Position of ';' in the stream, to delimit multiple queries.
3825 This delimiter is in the raw buffer.
3826 */
3827 const char *found_semicolon;
3828
3829 /** Token character bitmaps, to detect 7bit strings. */
3831
3832 /** SQL_MODE = IGNORE_SPACE. */
3833 bool ignore_space;
3834
3835 /**
3836 true if we're parsing a prepared statement: in this mode
3837 we should allow placeholders.
3838 */
3839 bool stmt_prepare_mode;
3840 /**
3841 true if we should allow multi-statements.
3842 */
3843 bool multi_statements;
3844
3845 /** State of the lexical analyser for comments. */
3848
3849 /**
3850 Starting position of the TEXT_STRING or IDENT in the pre-processed
3851 buffer.
3852
3853 NOTE: this member must be used within MYSQLlex() function only.
3854 */
3855 const char *m_cpp_text_start;
3856
3857 /**
3858 Ending position of the TEXT_STRING or IDENT in the pre-processed
3859 buffer.
3860
3861 NOTE: this member must be used within MYSQLlex() function only.
3862 */
3863 const char *m_cpp_text_end;
3864
3865 /**
3866 Character set specified by the character-set-introducer.
3867
3868 NOTE: this member must be used within MYSQLlex() function only.
3869 */
3871
3872 /**
3873 Current statement digest instrumentation.
3874 */
3876
3877 /**
3878 The synthetic 1st token to prepend token stream with.
3879
3880 This token value tricks parser to simulate multiple %start-ing points.
3881 Currently the grammar is aware of 4 such synthetic tokens:
3882 1. GRAMMAR_SELECTOR_PART for partitioning stuff from DD,
3883 2. GRAMMAR_SELECTOR_GCOL for generated column stuff from DD,
3884 3. GRAMMAR_SELECTOR_EXPR for generic single expressions from DD/.frm.
3885 4. GRAMMAR_SELECTOR_CTE for generic subquery expressions from CTEs.
3886 5. -1 when parsing with the main grammar (no grammar selector available).
3887
3888 @note yylex() is expected to return the value of type int:
3889 0 is for EOF and everything else for real token numbers.
3890 Bison, in its turn, generates positive token numbers.
3891 So, the negative grammar_selector_token means "not a token".
3892 In other words, -1 is "empty value".
3893 */
3894 const int grammar_selector_token;
3896 bool text_string_is_7bit() const { return !(tok_bitmap & 0x80); }
3900 public:
3901 String column;
3903 LEX_COLUMN(const String &x, const Access_bitmask &y) : column(x), rights(y) {}
3904};
3905
3906enum class role_enum;
3908/*
3909 This structure holds information about grantor's context
3910*/
3911class LEX_GRANT_AS {
3912 public:
3914 void cleanup();
3916 public:
3917 bool grant_as_used;
3919 LEX_USER *user;
3921};
3922
3923/*
3924 Some queries can be executed only using the secondary engine. The enum
3925 "execute_only_in_secondary_reasons" retains the explanations for queries that
3926 cannot be executed using the primary engine.
3936};
3937
3939 Some queries can be executed only in using the hypergraph optimizer. The enum
3940 "execute_only_in_hypergraph_reasons" retains the explanations for the same.
3945};
3946
3947/**
3948 The LEX object currently serves three different purposes:
3949
3950 - It contains some universal properties of an SQL command, such as
3951 sql_command, presence of IGNORE in data change statement syntax, and list
3952 of tables (query_tables).
3953
3954 - It contains some execution state variables, like m_exec_started
3955 (set to true when execution is started), plugins (list of plugins used
3956 by statement), insert_update_values_map (a map of objects used by certain
3957 INSERT statements), etc.
3958
3959 - It contains a number of members that should be local to subclasses of
3960 Sql_cmd, like purge_value_list (for the PURGE command), kill_value_list
3961 (for the KILL command).
3962
3963 The LEX object is strictly a part of class Sql_cmd, for those SQL commands
3964 that are represented by an Sql_cmd class. For the remaining SQL commands,
3965 it is a standalone object linked to the current THD.
3966
3967 The lifecycle of a LEX object is as follows:
3968
3969 - The LEX object is constructed either on the execution mem_root
3970 (for regular statements), on a Prepared_statement mem_root (for
3971 prepared statements), on an SP mem_root (for stored procedure instructions),
3972 or created on the current mem_root for short-lived uses.
3973
3974 - Call lex_start() to initialize a LEX object before use.
3975 This initializes the execution state part of the object.
3976 It also calls LEX::reset() to ensure that all members are properly inited.
3977
3978 - Parse and resolve the statement, using the LEX as a work area.
3979
3980 - Execute an SQL command: call set_exec_started() when starting to execute
3981 (actually when starting to optimize).
3982 Typically call is_exec_started() to distinguish between preparation
3983 and optimization/execution stages of SQL command execution.
3984
3985 - Call clear_execution() when execution is finished. This will clear all
3986 execution state associated with the SQL command, it also includes calling
3987 LEX::reset_exec_started().
3988
3989 @todo - Create subclasses of Sql_cmd to contain data that are local
3990 to specific commands.
3991
3992 @todo - Create a Statement context object that will hold the execution state
3993 part of struct LEX.
3994
3995 @todo - Ensure that a LEX struct is never reused, thus making e.g
3996 LEX::reset() redundant.
3997*/
3999struct LEX : public Query_tables_list {
4000 friend bool lex_start(THD *thd);
4002 Query_expression *unit; ///< Outer-most query expression
4003 /// @todo: query_block can be replaced with unit->first-select()
4004 Query_block *query_block; ///< First query block
4005 Query_block *all_query_blocks_list; ///< List of all query blocks
4006 private:
4007 /* current Query_block in parsing */
4009
4011 Some queries can only be executed on a secondary engine, for example,
4012 queries with non-primitive grouping like CUBE.
4013 */
4015
4018
4020 Some queries can only be executed in hypergraph optimizer, for example,
4021 queries with QUALIFY clause.
4022 */
4027 bool m_splitting_window_expression = false;
4028
4029 public:
4030 inline Query_block *current_query_block() const {
4031 return m_current_query_block;
4032 }
4033
4034 /*
4035 We want to keep current_thd out of header files, so the debug assert
4036 is moved to the .cc file.
4037 */
4039 inline void set_current_query_block(Query_block *select) {
4040#ifndef NDEBUG
4042#endif
4044 }
4045 /// @return true if this is an EXPLAIN statement
4046 bool is_explain() const { return explain_format != nullptr; }
4047 bool is_explain_analyze = false;
4048
4049 /**
4050 Whether the currently-running statement should be prepared and executed
4051 with the hypergraph optimizer. This will not change after the statement is
4052 prepared, so you can use it in any optimization phase to e.g. figure out
4053 whether to inhibit some transformation that the hypergraph optimizer
4054 does not properly understand yet. If a different optimizer is requested,
4055 the statement must be re-prepared with the proper optimizer settings.
4056 */
4059 }
4060
4061 void set_using_hypergraph_optimizer(bool use_hypergraph) {
4062 m_using_hypergraph_optimizer = use_hypergraph;
4063 }
4064
4065 /**
4066 Returns true if the statement is executed on a secondary engine. The flag is
4067 set when the query tables are opened and keeps its value until the beginning
4068 of the next execution.
4069 */
4070 bool using_secondary_engine() const { return m_using_secondary_engine; }
4071
4072 void set_using_secondary_engine(bool flag) {
4074 }
4076 /// RAII class to set state \c m_splitting_window_expression for a scope
4078 private:
4079 LEX *m_lex{nullptr};
4080
4081 public:
4082 explicit Splitting_window_expression(LEX *lex, bool v) {
4083 m_lex = lex;
4085 }
4088 }
4089 };
4090
4093 }
4094
4095 void set_splitting_window_expression(bool v) {
4098
4099 private:
4103 public:
4106 char *to_log; /* For PURGE BINARY LOGS TO */
4108 // Widcard from SHOW ... LIKE <wildcard> statements.
4112 nullptr, 0}; ///< Argument of the BINLOG event statement.
4119 THD *thd;
4120
4121 /* Optimizer hints */
4124 /* maintain a list of used plugins for this LEX */
4129 /// Table being inserted into (may be a view)
4131 /// Leaf table being inserted into (always a base table)
4133
4134 /** SELECT of CREATE VIEW statement */
4136
4137 /* Partition info structure filled in by PARTITION BY parse part */
4139
4141 The definer of the object being created (view, trigger, stored routine).
4142 I.e. the value of DEFINER clause.
4152
4153 // PURGE statement-specific fields:
4155
4156 // KILL statement-specific fields:
4158
4159 // other stuff:
4161 List<Item_func_set_user_var> set_var_list; // in-query assignment list
4162 /**
4163 List of placeholders ('?') for parameters of a prepared statement. Because
4164 we append to this list during parsing, it is naturally sorted by
4165 position of the '?' in the query string. The code which fills placeholders
4166 with user-supplied values, and the code which writes a query for
4167 statement-based logging, rely on this order.
4168 This list contains only real placeholders, not the clones which originate
4169 in a re-parsed CTE definition.
4170 */
4172
4174
4175 void insert_values_map(Item_field *f1, Field *f2) {
4177 insert_update_values_map = new std::map<Item_field *, Field *>;
4178 insert_update_values_map->insert(std::make_pair(f1, f2));
4179 }
4180 void destroy_values_map() {
4182 insert_update_values_map->clear();
4184 insert_update_values_map = nullptr;
4185 }
4186 }
4187 void clear_values_map() {
4190 }
4191 }
4192
4194 return result != nullptr && result->export_result_to_object_storage();
4195 }
4196
4197 bool has_values_map() const { return insert_update_values_map != nullptr; }
4198 std::map<Item_field *, Field *>::iterator begin_values_map() {
4199 return insert_update_values_map->begin();
4200 }
4201 std::map<Item_field *, Field *>::iterator end_values_map() {
4202 return insert_update_values_map->end();
4203 }
4204
4207 }
4208
4210 const bool execute_only_in_secondary_engine_param,
4213 execute_only_in_secondary_engine_param;
4217 }
4218
4222 }
4223
4227 case CUBE:
4228 return "CUBE";
4229 case TABLESAMPLE:
4230 return "TABLESAMPLE";
4232 return "OUTFILE to object store";
4234 return "Secondary engine temporary table creation";
4236 return "Secondary engine temporary table within this statement";
4237 case GROUPING_SETS:
4238 return " GROUPING_SETS";
4239 default:
4240 return "UNDEFINED";
4241 }
4245 }
4247 bool execute_in_hypergraph_optimizer_param,
4250 execute_in_hypergraph_optimizer_param;
4252 }
4253
4257 ? "QUALIFY clause"
4258 : "UNDEFINED";
4259 }
4260
4262 const {
4264 }
4265
4266 private:
4267 /*
4268 With Visual Studio, an std::map will always allocate two small objects
4269 on the heap. Sometimes we put LEX objects in a MEM_ROOT, and never run
4270 the LEX DTOR. To avoid memory leaks, put this std::map on the heap,
4271 and call clear_values_map() at the end of each statement.
4272 */
4273 std::map<Item_field *, Field *> *insert_update_values_map;
4274
4275 public:
4276 /*
4277 A stack of name resolution contexts for the query. This stack is used
4278 at parse time to set local name resolution contexts for various parts
4279 of a query. For example, in a JOIN ... ON (some_condition) clause the
4280 Items in 'some_condition' must be resolved only against the operands
4281 of the the join, and not against the whole clause. Similarly, Items in
4282 subqueries should be resolved against the subqueries (and outer queries).
4283 The stack is used in the following way: when the parser detects that
4284 all Items in some clause need a local context, it creates a new context
4285 and pushes it on the stack. All newly created Items always store the
4286 top-most context in the stack. Once the parser leaves the clause that
4287 required a local context, the parser pops the top-most context.
4293 HA_CHECK_OPT check_opt; // check/repair options
4296 LEX_SOURCE_INFO mi; // used by CHANGE REPLICATION SOURCE
4301 ulong type;
4302 /**
4303 This field is used as a work field during resolving to validate
4304 the use of aggregate functions. For example in a query
4305 SELECT ... FROM ...WHERE MIN(i) == 1 GROUP BY ... HAVING MIN(i) > 2
4306 MIN(i) in the WHERE clause is not allowed since only non-aggregated data
4307 is present, whereas MIN(i) in the HAVING clause is allowed because HAVING
4308 operates on the output of a grouping operation.
4309 Each query block is assigned a nesting level. This field is a bit field
4310 that contains the value one in the position of that nesting level if
4311 aggregate functions are allowed for that query block.
4312 */
4314 /**
4315 Windowing functions are not allowed in HAVING - in contrast to grouped
4316 aggregate functions, since windowing in SQL logically follows after all
4317 grouping operations. Nor are they allowed inside grouped aggregate
4318 function arguments. One bit per query block, as also \c allow_sum_func. For
4319 ORDER BY and QUALIFY predicates, window functions \em are allowed unless
4320 they are contained in arguments of a grouped aggregate function. Nor are
4321 references to outer window functions (via alias) allowed in subqueries, but
4322 that is checked separately.
4323 */
4326 /// If true: during prepare, we did a subquery transformation (IN-to-EXISTS,
4327 /// SOME/ANY) that doesn't currently work for subquery to a derived table
4328 /// transformation.
4330
4332
4333 /*
4334 Usually `expr` rule of yacc is quite reused but some commands better
4335 not support subqueries which comes standard with this rule, like
4336 KILL, HA_READ, CREATE/ALTER EVENT etc. Set this to `false` to get
4337 syntax error back.
4338 */
4339 bool expr_allows_subquery{true};
4340 /**
4341 If currently re-parsing a CTE's definition, this is the offset in bytes
4342 of that definition in the original statement which had the WITH
4343 clause. Otherwise this is 0.
4344 */
4346 /**
4347 If currently re-parsing a condition which is pushed down to a derived
4348 table, this will be set to true.
4349 */
4351 /**
4352 If currently re-parsing a condition that is being pushed down to a
4353 derived table, this has the positions of all the parameters that are
4354 part of that condition in the original statement. Otherwise it is empty.
4358 enum SSL_type ssl_type; /* defined in violite.h */
4364 /// QUERY ID for SHOW PROFILE
4366 uint profile_options;
4367 uint grant, grant_tot_col;
4368 /**
4369 Set to true when GRANT ... GRANT OPTION ... TO ...
4370 is used (vs. GRANT ... WITH GRANT OPTION).
4371 The flag is used by @ref mysql_grant to grant GRANT OPTION (@ref GRANT_ACL)
4372 to all dynamic privileges.
4376 int select_number; ///< Number of query block (by EXPLAIN)
4380 /// This flag indicates that the CREATE VIEW statement contains the
4381 /// MATERIALIZED keyword.
4383
4384 /**
4385 @todo ensure that correct CONTEXT_ANALYSIS_ONLY is set for all preparation
4386 code, so we can fully rely on this field.
4387 */
4389 bool drop_if_exists;
4390 /**
4391 refers to optional IF EXISTS clause in REVOKE sql. This flag when set to
4392 true will report warnings in case privilege being granted is not granted to
4393 given user/role. When set to false error is reported.
4394 */
4395 bool grant_if_exists;
4396 /**
4397 refers to optional IGNORE UNKNOWN USER clause in REVOKE sql. This flag when
4398 set to true will report warnings in case target user/role for which
4399 privilege being granted does not exists. When set to false error is
4400 reported.
4404 bool autocommit;
4406 // For show commands to show hidden columns and indexes.
4407 bool m_extended_show;
4408
4409 enum enum_yes_no_unknown tx_chain, tx_release;
4410
4411 /**
4412 Whether this query will return the same answer every time, given unchanged
4413 data. Used to be for the query cache, but is now used to find out if an
4414 expression is usable for partitioning.
4415 */
4418 private:
4419 /// True if statement references UDF functions
4420 bool m_has_udf{false};
4421 bool ignore;
4422 /// True if query has at least one external table
4425 public:
4426 bool is_ignore() const { return ignore; }
4427 void set_ignore(bool ignore_param) { ignore = ignore_param; }
4428 void set_has_udf() { m_has_udf = true; }
4429 bool has_udf() const { return m_has_udf; }
4435 /* Prepared statements SQL syntax:*/
4436 LEX_CSTRING prepared_stmt_name; /* Statement name (in all queries) */
4438 Prepared statement query text or name of variable that holds the
4439 prepared statement (in PREPARE ... queries)
4440 */
4442 /* If true, prepared_stmt_code is a name of variable that holds the query */
4444 /* Names of user variables holding parameters (in EXECUTE) */
4448 bool sp_lex_in_use; /* Keep track on lex usage in SPs for error handling */
4449 bool all_privileges;
4453
4454 private:
4455 bool m_broken; ///< see mark_broken()
4456 /**
4457 Set to true when execution has started (after parsing, tables opened and
4458 query preparation is complete. Used to track arena state for SPs).
4459 */
4460 bool m_exec_started;
4461 /**
4462 Set to true when execution is completed, ie optimization has been done
4463 and execution is successful or ended in error.
4464 */
4466 /**
4467 Set to true when execution crosses global_connection_memory_status_limit.
4468 */
4470 /**
4471 Set to true when execution crosses connection_memory_status_limit.
4472 */
4474 /**
4475 Current SP parsing context.
4476 @see also sp_head::m_root_parsing_ctx.
4477 */
4480 /**
4481 Statement context for Query_block::make_active_options.
4482 */
4484
4485 public:
4486 /**
4487 Gets the options that have been set for this statement. The options are
4488 propagated to the Query_block objects and should usually be read with
4489 #Query_block::active_options().
4490
4491 @return a bit set of options set for this statement
4492 */
4494 /**
4495 Add options to values of m_statement_options. options is an ORed
4496 bit set of options defined in query_options.h
4498 @param options Add this set of options to the set already in
4499 m_statement_options
4503 }
4504 bool is_broken() const { return m_broken; }
4505 /**
4506 Certain permanent transformations (like in2exists), if they fail, may
4507 leave the LEX in an inconsistent state. They should call the
4508 following function, so that this LEX is not reused by another execution.
4510 @todo If lex_start () were a member function of LEX, the "broken"
4511 argument could always be "true" and thus could be removed.
4512 */
4513 void mark_broken(bool broken = true) {
4514 if (broken) {
4515 /*
4516 "OPEN <cursor>" cannot be re-prepared if the cursor uses no tables
4517 ("SELECT FROM DUAL"). Indeed in that case cursor_query is left empty
4518 in constructions of sp_instr_cpush, and thus
4519 sp_lex_instr::parse_expr() cannot re-prepare. So we mark the statement
4520 as broken only if tables are used.
4521 */
4522 if (is_metadata_used()) m_broken = true;
4523 } else
4524 m_broken = false;
4526
4528
4529 void cleanup(bool full) {
4530 unit->cleanup(full);
4531 if (query_tables != nullptr) {
4532 for (Table_ref *tr = query_tables; tr != nullptr; tr = tr->next_global) {
4533 if (tr->jdv_content_tree != nullptr) {
4534 jdv::destroy_content_tree(tr->jdv_content_tree);
4535 tr->jdv_content_tree = nullptr;
4536 }
4537 }
4538 }
4539 if (full) {
4544
4545 bool is_exec_started() const { return m_exec_started; }
4546 void set_exec_started() { m_exec_started = true; }
4547 void reset_exec_started() {
4548 m_exec_started = false;
4549 m_exec_completed = false;
4550 }
4551 /**
4552 Check whether the statement has been executed (regardless of completion -
4553 successful or in error).
4554 Check this instead of Query_expression::is_executed() to determine
4555 the state of a complete statement.
4557 bool is_exec_completed() const { return m_exec_completed; }
4558 void set_exec_completed() { m_exec_completed = true; }
4571 }
4575 }
4577
4581
4582 /// Check if the current statement uses meta-data (uses a table or a stored
4583 /// routine).
4584 bool is_metadata_used() const {
4585 return query_tables != nullptr || has_udf() ||
4586 (sroutines != nullptr && !sroutines->empty());
4587 }
4588
4589 /// We have detected the presence of an alias of a window function with a
4590 /// window on query block qb. Check if the reference is illegal at this point
4591 /// during resolution.
4592 /// @param qb The query block of the window function
4593 /// @return true if window function is referenced from another query block
4594 /// than its window, or if window functions are disallowed at the current
4595 /// point during prepare, cf. also documentation of \c m_deny_window_func.
4596 bool deny_window_function(Query_block *qb) const {
4597 return qb != current_query_block() ||
4598 ((~allow_sum_func | m_deny_window_func) >>
4600 0x1;
4601 }
4603 public:
4605
4606 bool only_view; /* used for SHOW CREATE TABLE/VIEW */
4607 /*
4608 view created to be run from definer (standard behaviour)
4609 */
4611
4612 /**
4613 Intended to point to the next word after DEFINER-clause in the
4614 following statements:
4615
4616 - CREATE TRIGGER (points to "TRIGGER");
4617 - CREATE PROCEDURE (points to "PROCEDURE");
4618 - CREATE FUNCTION (points to "FUNCTION" or "AGGREGATE");
4619 - CREATE EVENT (points to "EVENT")
4621 This pointer is required to add possibly omitted DEFINER-clause to the
4622 DDL-statement before dumping it to the binlog.
4623 */
4624 const char *stmt_definition_begin;
4625 const char *stmt_definition_end;
4626
4627 /**
4628 During name resolution search only in the table list given by
4629 Name_resolution_context::first_name_resolution_table and
4630 Name_resolution_context::last_name_resolution_table
4631 (see Item_field::fix_fields()).
4632 */
4634
4635 bool is_lex_started; /* If lex_start() did run. For debugging. */
4636 /// Set to true while resolving values in ON DUPLICATE KEY UPDATE clause
4639 class Explain_format *explain_format{nullptr};
4640
4641 // Maximum execution time for a statement.
4642 ulong max_execution_time;
4643
4645 To flag the current statement as dependent for binary logging
4646 on explicit_defaults_for_timestamp
4647 */
4649
4650 /**
4651 Used to inform the parser whether it should contextualize the parse
4652 tree. When we get a pure parser this will not be needed.
4653 */
4654 bool will_contextualize;
4655
4656 LEX();
4658 virtual ~LEX();
4659
4660 /// Destroy contained objects, but not the LEX object itself.
4661 void destroy() {
4662 if (unit == nullptr) return;
4663 unit->destroy();
4664 unit = nullptr;
4665 query_block = nullptr;
4666 all_query_blocks_list = nullptr;
4667 m_current_query_block = nullptr;
4668 explain_format = nullptr;
4670 }
4671
4672 /// Reset query context to initial state
4673 void reset();
4674
4675 /// Create an empty query block within this LEX object.
4677
4678 /// Create query expression object that contains one query block.
4679 Query_block *new_query(Query_block *curr_query_block);
4680
4681 /// Create query block and attach it to the current query expression.
4683
4684 /// Create top-level query expression and query block.
4685 bool new_top_level_query();
4686
4687 /// Create query expression and query block in existing memory objects.
4688 void new_static_query(Query_expression *sel_query_expression,
4689 Query_block *select);
4690
4691 /// Create query expression under current_query_block and a query block under
4692 /// the new query expression. The new query expression is linked in under
4693 /// current_query_block. The new query block is linked in under the new
4694 /// query expression.
4695 ///
4696 /// @param thd current session context
4697 /// @param current_query_block the root under which we create the new
4698 /// expression
4699 /// and block
4700 /// @param where_clause any where clause for the block
4701 /// @param having_clause any having clause for the block
4702 /// @param ctx the parsing context
4703 ///
4704 /// @returns the new query expression, or nullptr on error.
4706 THD *thd, Query_block *current_query_block, Item *where_clause,
4707 Item *having_clause, enum_parsing_context ctx);
4708
4709 inline bool is_ps_or_view_context_analysis() {
4712 }
4713
4714 inline bool is_view_context_analysis() {
4716 }
4717
4718 void clear_execution();
4719
4720 /**
4721 Set the current query as uncacheable.
4722
4723 @param curr_query_block Current select query block
4724 @param cause Why this query is uncacheable.
4725
4726 @details
4727 All query blocks representing subqueries, from the current one up to
4728 the outer-most one, but excluding the main query block, are also set
4729 as uncacheable.
4730 */
4731 void set_uncacheable(Query_block *curr_query_block, uint8 cause) {
4732 safe_to_cache_query = false;
4733
4734 if (m_current_query_block == nullptr) return;
4735 Query_block *sl;
4736 Query_expression *un;
4737 for (sl = curr_query_block, un = sl->master_query_expression(); un != unit;
4738 sl = sl->outer_query_block(), un = sl->master_query_expression()) {
4739 sl->uncacheable |= cause;
4740 un->uncacheable |= cause;
4741 }
4742 }
4744
4745 Table_ref *unlink_first_table(bool *link_to_local);
4746 void link_first_table_back(Table_ref *first, bool link_to_local);
4748
4750
4752 for (Table_ref *tr = insert_table->first_leaf_table(); tr != nullptr;
4753 tr = tr->next_leaf)
4754 tr->restore_properties();
4755 }
4756
4758
4759 bool can_use_merged();
4760 bool can_not_use_merged();
4761 bool need_correct_ident();
4762 /*
4763 Is this update command where 'WHITH CHECK OPTION' clause is important
4764
4765 SYNOPSIS
4766 LEX::which_check_option_applicable()
4767
4768 RETURN
4769 true have to take 'WHITH CHECK OPTION' clause into account
4770 false 'WHITH CHECK OPTION' clause do not need
4771 */
4772 inline bool which_check_option_applicable() {
4773 switch (sql_command) {
4774 case SQLCOM_UPDATE:
4776 case SQLCOM_INSERT:
4778 case SQLCOM_REPLACE:
4780 case SQLCOM_LOAD:
4781 return true;
4782 default:
4783 return false;
4784 }
4786
4788
4790 return context_stack.push_front(context);
4791 }
4792
4793 void pop_context() { context_stack.pop(); }
4794
4795 bool copy_db_to(char const **p_db, size_t *p_db_length) const;
4796
4797 bool copy_db_to(char **p_db, size_t *p_db_length) const {
4798 return copy_db_to(const_cast<const char **>(p_db), p_db_length);
4799 }
4800
4802
4805
4806 bool table_or_sp_used();
4807
4808 /**
4809 @brief check if the statement is a single-level join
4810 @return result of the check
4811 @retval true The statement doesn't contain subqueries, unions and
4812 stored procedure calls.
4813 @retval false There are subqueries, UNIONs or stored procedure calls.
4814 */
4815 bool is_single_level_stmt() {
4816 /*
4817 This check exploits the fact that the last added to all_select_list is
4818 on its top. So query_block (as the first added) will be at the tail
4819 of the list.
4820 */
4822 (sroutines == nullptr || sroutines->empty())) {
4824 return true;
4825 }
4826 return false;
4827 }
4828
4829 void release_plugins();
4830
4831 /**
4832 IS schema queries read some dynamic table statistics from SE.
4833 These statistics are cached, to avoid opening of table more
4834 than once while preparing a single output record buffer.
4835 */
4838
4839 bool accept(Select_lex_visitor *visitor);
4840
4841 bool set_wild(LEX_STRING);
4842 void clear_privileges();
4843
4844 bool make_sql_cmd(Parse_tree_root *parse_tree);
4845
4846 private:
4847 /**
4848 Context object used by secondary storage engines to store query
4849 state during optimization and execution.
4850 */
4852
4853 public:
4854 /**
4855 Gets the secondary engine execution context for this statement.
4856 */
4858 const {
4860 }
4861
4862 /**
4863 Sets the secondary engine execution context for this statement.
4864 The old context object is destroyed, if there is one. Can be set
4865 to nullptr to destroy the old context object and clear the
4866 pointer.
4867
4868 The supplied context object should be allocated on the execution
4869 MEM_ROOT, so that its memory doesn't have to be manually freed
4870 after query execution.
4871 */
4874
4875 /**
4876 Validates if a query can run with the old optimizer.
4877 @return True if the query cannot be run with old optimizer, false otherwise.
4880
4881 private:
4883
4884 public:
4887 }
4888
4891 }
4894
4895 private:
4896 bool rewrite_required{false};
4898 public:
4899 void set_rewrite_required() { rewrite_required = true; }
4900 void reset_rewrite_required() { rewrite_required = false; }
4901 bool is_rewrite_required() { return rewrite_required; }
4902};
4903
4905 RAII class to ease the call of LEX::mark_broken() if error.
4906 Used during preparation and optimization of DML queries.
4907*/
4909 public:
4910 Prepare_error_tracker(THD *thd_arg) : thd(thd_arg) {}
4912
4913 private:
4914 THD *const thd;
4915};
4916
4917/**
4918 The internal state of the syntax parser.
4919 This object is only available during parsing,
4920 and is private to the syntax parser implementation (sql_yacc.yy).
4921*/
4922class Yacc_state {
4923 public:
4925 reset();
4926 }
4927
4928 void reset() {
4929 if (yacc_yyss != nullptr) {
4931 yacc_yyss = nullptr;
4932 }
4933 if (yacc_yyvs != nullptr) {
4935 yacc_yyvs = nullptr;
4936 }
4937 if (yacc_yyls != nullptr) {
4939 yacc_yyls = nullptr;
4940 }
4943 }
4944
4945 ~Yacc_state();
4946
4947 /**
4948 Reset part of the state which needs resetting before parsing
4949 substatement.
4950 */
4954 }
4955
4956 /**
4957 Bison internal state stack, yyss, when dynamically allocated using
4958 my_yyoverflow().
4959 */
4961
4962 /**
4963 Bison internal semantic value stack, yyvs, when dynamically allocated using
4964 my_yyoverflow().
4965 */
4967
4968 /**
4969 Bison internal location value stack, yyls, when dynamically allocated using
4970 my_yyoverflow().
4971 */
4973
4974 /**
4975 Type of lock to be used for tables being added to the statement's
4976 table list in table_factor, table_alias_ref, single_multi and
4977 table_wild_one rules.
4978 Statements which use these rules but require lock type different
4979 from one specified by this member have to override it by using
4980 Query_block::set_lock_for_tables() method.
4981
4982 The default value of this member is TL_READ_DEFAULT. The only two
4983 cases in which we change it are:
4984 - When parsing SELECT HIGH_PRIORITY.
4985 - Rule for DELETE. In which we use this member to pass information
4986 about type of lock from delete to single_multi part of rule.
4987
4988 We should try to avoid introducing new use cases as we would like
4989 to get rid of this member eventually.
4990 */
4992
4993 /**
4994 The type of requested metadata lock for tables added to
4995 the statement table list.
4996 */
4998
4999 /*
5000 TODO: move more attributes from the LEX structure here.
5001 */
5002};
5003
5004/**
5005 Input parameters to the parser.
5006*/
5007struct Parser_input {
5008 /**
5009 True if the text parsed corresponds to an actual query,
5010 and not another text artifact.
5011 This flag is used to disable digest parsing of nested:
5012 - view definitions
5013 - table trigger definitions
5014 - table partition definitions
5015 - event scheduler event definitions
5016 */
5017 bool m_has_digest;
5018 /**
5019 True if the caller needs to compute a digest.
5020 This flag is used to request explicitly a digest computation,
5021 independently of the performance schema configuration.
5022 */
5023 bool m_compute_digest;
5024
5025 Parser_input() : m_has_digest(false), m_compute_digest(false) {}
5026};
5027
5028/**
5029 Internal state of the parser.
5030 The complete state consist of:
5031 - input parameters that control the parser behavior
5032 - state data used during lexical parsing,
5033 - state data used during syntactic parsing.
5034*/
5035class Parser_state {
5036 protected:
5037 /**
5038 Constructor for special parsers of partial SQL clauses (DD)
5039
5040 @param grammar_selector_token See Lex_input_stream::grammar_selector_token
5041 */
5042 explicit Parser_state(int grammar_selector_token)
5043 : m_input(), m_lip(grammar_selector_token), m_yacc(), m_comment(false) {}
5044
5045 public:
5046 Parser_state() : m_input(), m_lip(~0U), m_yacc(), m_comment(false) {}
5047
5048 /**
5049 Object initializer. Must be called before usage.
5051 @retval false OK
5052 @retval true Error
5053 */
5054 bool init(THD *thd, const char *buff, size_t length) {
5055 return m_lip.init(thd, buff, length);
5056 }
5057
5058 void reset(const char *found_semicolon, size_t length) {
5059 m_lip.reset(found_semicolon, length);
5061 }
5063 /// Signal that the current query has a comment
5064 void add_comment() { m_comment = true; }
5065 /// Check whether the current query has a comment
5066 bool has_comment() const { return m_comment; }
5067
5068 public:
5072 /**
5073 Current performance digest instrumentation.
5074 */
5076
5077 private:
5078 bool m_comment; ///< True if current query contains comments
5079};
5081/**
5082 Parser state for partition expression parser (.frm/DD stuff)
5083*/
5085 public:
5087
5089};
5091/**
5092 Parser state for generated column expression parser (.frm/DD stuff)
5093*/
5095 public:
5097
5099};
5101/**
5102 Parser state for single expression parser (.frm/DD stuff)
5103*/
5105 public:
5107
5108 Item *result;
5109};
5111/**
5112 Parser state for CTE subquery parser
5113*/
5115 public:
5117
5119};
5120
5122 Parser state for Derived table's condition parser.
5123 (Used in condition pushdown to derived tables)
5124*/
5126 public:
5130};
5131
5132struct st_lex_local : public LEX {
5133 static void *operator new(size_t size) noexcept {
5134 return (*THR_MALLOC)->Alloc(size);
5135 }
5136 static void *operator new(size_t size, MEM_ROOT *mem_root,
5137 const std::nothrow_t &arg
5138 [[maybe_unused]] = std::nothrow) noexcept {
5139 return mem_root->Alloc(size);
5140 }
5141 static void operator delete(void *ptr [[maybe_unused]],
5142 size_t size [[maybe_unused]]) {
5143 TRASH(ptr, size);
5144 }
5145 static void operator delete(
5146 void *, MEM_ROOT *, const std::nothrow_t &) noexcept { /* Never called */
5147 }
5148};
5149
5150extern void lex_free(void);
5151extern bool lex_start(THD *thd);
5152extern void lex_end(LEX *lex);
5153extern int my_sql_parser_lex(MY_SQL_PARSER_STYPE *, POS *, class THD *);
5154
5155extern void trim_whitespace(const CHARSET_INFO *cs, LEX_STRING *str);
5156
5157extern bool is_lex_native_function(const LEX_STRING *name);
5159bool is_keyword(const char *name, size_t len);
5160bool db_is_default_db(const char *db, size_t db_len, const THD *thd);
5161
5163
5164void print_derived_column_names(const THD *thd, String *str,
5166
5167/**
5168 @} (End of group GROUP_PARSER)
5169*/
5170
5171/**
5172 Check if the given string is invalid using the system charset.
5173
5174 @param string_val Reference to the string.
5175 @param charset_info Pointer to charset info.
5176
5177 @return true if the string has an invalid encoding using
5178 the system charset else false.
5179*/
5180
5181inline bool is_invalid_string(const LEX_CSTRING &string_val,
5182 const CHARSET_INFO *charset_info) {
5183 size_t valid_len;
5184 bool len_error;
5185
5186 if (validate_string(charset_info, string_val.str, string_val.length,
5187 &valid_len, &len_error)) {
5188 char hexbuf[7];
5189 octet2hex(
5190 hexbuf, string_val.str + valid_len,
5191 static_cast<uint>(std::min<size_t>(string_val.length - valid_len, 3)));
5192 my_error(ER_INVALID_CHARACTER_STRING, MYF(0), charset_info->csname, hexbuf);
5193 return true;
5194 }
5195 return false;
5196}
5197
5198/**
5199 Check if the given string is invalid using the system charset.
5200
5201 @param string_val Reference to the string.
5202 @param charset_info Pointer to charset info.
5203 @param[out] invalid_sub_str If string has an invalid encoding then invalid
5204 string in printable ASCII format is stored.
5205
5206 @return true if the string has an invalid encoding using
5207 the system charset else false.
5208*/
5209
5210inline bool is_invalid_string(const LEX_CSTRING &string_val,
5212 std::string &invalid_sub_str) {
5213 size_t valid_len;
5214 bool len_error;
5215
5216 if (validate_string(charset_info, string_val.str, string_val.length,
5217 &valid_len, &len_error)) {
5218 char printable_buff[32];
5220 printable_buff, sizeof(printable_buff), string_val.str + valid_len,
5221 static_cast<uint>(std::min<size_t>(string_val.length - valid_len, 3)),
5222 charset_info, 3);
5223 invalid_sub_str = printable_buff;
5224 return true;
5225 }
5226 return false;
5227}
5228
5229/**
5230 In debug mode, verify that we're not adding an item twice to the fields list
5231 with inconsistent hidden flags. Must be called before adding the item to
5232 fields.
5233 */
5235 [[maybe_unused]],
5236 Item *item [[maybe_unused]],
5237 bool hidden [[maybe_unused]]) {
5238#ifndef NDEBUG
5239 if (std::find(fields.begin(), fields.end(), item) != fields.end()) {
5240 // The item is already in the list, so we can't add it
5241 // with a different value for hidden.
5242 assert(item->hidden == hidden);
5243 }
5244#endif
5245}
5246
5247bool walk_item(Item *item, Select_lex_visitor *visitor);
5249bool accept_table(Table_ref *t, Select_lex_visitor *visitor);
5251 Select_lex_visitor *visitor);
5252Table_ref *nest_join(THD *thd, Query_block *select, Table_ref *embedding,
5253 mem_root_deque<Table_ref *> *jlist, size_t table_cnt,
5254 const char *legend);
5256/// RAII class to automate saving/restoring of current_query_block()
5258 public:
5259 explicit Change_current_query_block(THD *thd_arg)
5260 : thd(thd_arg), saved_query_block(thd->lex->current_query_block()) {}
5263
5264 private:
5265 THD *thd;
5267};
5269void get_select_options_str(ulonglong options, std::string *str);
5270
5271template <typename T>
5272inline bool WalkQueryExpression(Query_expression *query_expr, enum_walk walk,
5273 T &&functor) {
5274 return query_expr->walk(&Item::walk_helper_thunk<T>, walk,
5275 reinterpret_cast<uchar *>(&functor));
5276}
5277
5278#endif /* SQL_LEX_INCLUDED */
static mysql_service_status_t init()
Component initialization.
Definition: audit_api_message_emit.cc:566
uint32_t Access_bitmask
Definition: auth_acls.h:34
Kerberos Client Authentication nullptr
Definition: auth_kerberos_client_plugin.cc:247
Data describing the table being created by CREATE TABLE or altered by ALTER TABLE.
Definition: sql_alter.h:205
RAII class to automate saving/restoring of current_query_block()
Definition: sql_lex.h:5253
void restore()
Definition: sql_lex.h:5257
Query_block * saved_query_block
Definition: sql_lex.h:5262
THD * thd
Definition: sql_lex.h:5261
Change_current_query_block(THD *thd_arg)
Definition: sql_lex.h:5255
~Change_current_query_block()
Definition: sql_lex.h:5258
Parser state for CTE subquery parser.
Definition: sql_lex.h:5110
Common_table_expr_parser_state()
Definition: sql_lex.cc:1233
PT_subquery * result
Definition: sql_lex.h:5114
Utility RAII class to save/modify/restore the condition_context information of a query block.
Definition: sql_lex.h:2565
enum_condition_context saved_value
Definition: sql_lex.h:2587
~Condition_context()
Definition: sql_lex.h:2581
Query_block * select
Definition: sql_lex.h:2586
Condition_context(Query_block *select_ptr, enum_condition_context new_type=enum_condition_context::NEITHER)
Definition: sql_lex.h:2567
Parser state for Derived table's condition parser.
Definition: sql_lex.h:5121
Item * result
Definition: sql_lex.h:5125
Derived_expr_parser_state()
Definition: sql_lex.cc:1236
Definition: event_parse_data.h:43
Base class for structured and hierarchical EXPLAIN output formatters.
Definition: opt_explain_format.h:506
Parser state for single expression parser (.frm/DD stuff)
Definition: sql_lex.h:5100
Expression_parser_state()
Definition: sql_lex.cc:1230
Item * result
Definition: sql_lex.h:5104
Definition: field.h:570
Parser state for generated column expression parser (.frm/DD stuff)
Definition: sql_lex.h:5090
Value_generator * result
Definition: sql_lex.h:5094
Gcol_expr_parser_state()
Definition: sql_lex.cc:1227
Definition: sql_lex.h:506
LEX_CSTRING key_name
Definition: sql_lex.h:516
void print(const THD *thd, String *str)
Print an index hint.
Definition: sql_lex.cc:2776
index_clause_map clause
Definition: sql_lex.h:511
enum index_hint_type type
Definition: sql_lex.h:509
Index_hint(const char *str, uint length)
Definition: sql_lex.h:518
Definition: item_cmpfunc.h:2562
Definition: item_subselect.h:460
Definition: item.h:4467
Implements the comparison operator equals (=)
Definition: item_cmpfunc.h:1110
Definition: item_func.h:3551
Definition: item_func.h:3603
This class is used to implement operations like SET @variable or @variable:= expression.
Definition: item_func.h:3355
A wrapper Item that normally returns its parameter, but becomes NULL when processing rows for rollup.
Definition: item_func.h:1755
A wrapper Item that contains a number of aggregate items, one for each level of rollup (see Item_roll...
Definition: item_sum.h:2767
Base class that is common to all subqueries and subquery predicates.
Definition: item_subselect.h:80
Class Item_sum is the base class used for special expressions that SQL calls 'set functions'.
Definition: item_sum.h:399
Base class that is used to represent any kind of expression in a relational query.
Definition: item.h:928
cond_result
Definition: item.h:992
@ COND_UNDEF
Definition: item.h:992
Definition: sql_optimizer.h:133
Definition: key_spec.h:67
RAII class to set state m_splitting_window_expression for a scope.
Definition: sql_lex.h:4073
LEX * m_lex
Definition: sql_lex.h:4075
~Splitting_window_expression()
Definition: sql_lex.h:4082
Splitting_window_expression(LEX *lex, bool v)
Definition: sql_lex.h:4078
Definition: sql_lex.h:3895
LEX_COLUMN(const String &x, const Access_bitmask &y)
Definition: sql_lex.h:3899
String column
Definition: sql_lex.h:3897
Access_bitmask rights
Definition: sql_lex.h:3898
Definition: sql_lex.h:3907
List< LEX_USER > * role_list
Definition: sql_lex.h:3916
void cleanup()
Definition: sql_lex.cc:5303
bool grant_as_used
Definition: sql_lex.h:3913
role_enum role_type
Definition: sql_lex.h:3914
LEX_USER * user
Definition: sql_lex.h:3915
LEX_GRANT_AS()
Definition: sql_lex.cc:5310
This class represents the character input stream consumed during lexical analysis.
Definition: sql_lexer_input_stream.h:70
void restart_token()
Adjust the starting position of the current token.
Definition: sql_lexer_input_stream.h:250
void body_utf8_start(THD *thd, const char *begin_ptr)
The operation is called from the parser in order to 1) designate the intention to have utf8 body; 1) ...
Definition: sql_lexer.cc:154
const int grammar_selector_token
The synthetic 1st token to prepend token stream with.
Definition: sql_lexer_input_stream.h:508
void skip_binary(int n)
Skip binary from the input stream.
Definition: sql_lexer_input_stream.h:114
bool skip_digest
Skip adding of the current token's digest since it is already added.
Definition: sql_lexer_input_stream.h:340
const char * m_cpp_text_end
Ending position of the TEXT_STRING or IDENT in the pre-processed buffer.
Definition: sql_lexer_input_stream.h:477
const char * get_end_of_query() const
Get the end of the raw query buffer.
Definition: sql_lexer_input_stream.h:235
sql_digest_state * m_digest
Current statement digest instrumentation.
Definition: sql_lexer_input_stream.h:489
const char * get_cpp_tok_start() const
Get the token start position, in the pre-processed buffer.
Definition: sql_lexer_input_stream.h:259
void body_utf8_append(const char *ptr)
The operation appends unprocessed part of the pre-processed buffer till the given pointer (ptr) and s...
Definition: sql_lexer.cc:217
char * m_cpp_ptr
Pointer to the current position in the pre-processed input stream.
Definition: sql_lexer_input_stream.h:407
uchar tok_bitmap
Token character bitmaps, to detect 7bit strings.
Definition: sql_lexer_input_stream.h:444
void restore_in_comment_state()
Definition: sql_lexer_input_stream.h:105
THD * m_thd
Current thread.
Definition: sql_lexer_input_stream.h:301
const char * get_tok_start() const
Get the token start position, in the raw buffer.
Definition: sql_lexer_input_stream.h:256
const CHARSET_INFO * query_charset
Definition: sql_lexer_input_stream.h:378
void adjust_digest_by_numeric_column_token(ulonglong value)
Definition: sql_lex.cc:389
const char * get_buf() const
Get the raw query buffer.
Definition: sql_lexer_input_stream.h:229
bool multi_statements
true if we should allow multi-statements.
Definition: sql_lexer_input_stream.h:457
char * yyUnput(char ch)
Puts a character back into the stream, canceling the effect of the last yyGet() or yySkip().
Definition: sql_lexer_input_stream.h:197
uint get_body_utf8_length() const
Get the utf8-body length.
Definition: sql_lexer_input_stream.h:287
bool m_echo_saved
Definition: sql_lexer_input_stream.h:401
const char * m_cpp_tok_end
Ending position of the previous token parsed, in the pre-processed buffer.
Definition: sql_lexer_input_stream.h:419
char * cpp_inject(char ch)
Inject a character into the pre-processed stream.
Definition: sql_lexer_input_stream.h:210
const char * found_semicolon
Position of ';' in the stream, to delimit multiple queries.
Definition: sql_lexer_input_stream.h:441
void warn_on_deprecated_collation(const CHARSET_INFO *collation) const
Outputs warnings on deprecated collations in complete SQL statements.
Definition: sql_lexer_input_stream.h:372
Lexer_yystype * lookahead_yylval
LALR(2) resolution, value of the look ahead token.
Definition: sql_lexer_input_stream.h:321
bool init(THD *thd, const char *buff, size_t length)
Object initializer.
Definition: sql_lexer.cc:74
enum my_lex_states next_state
Current state of the lexical analyser.
Definition: sql_lexer_input_stream.h:435
const char * get_tok_end() const
Get the token end position, in the raw buffer.
Definition: sql_lexer_input_stream.h:262
uint yyLength() const
Get the length of the current token, in the raw buffer.
Definition: sql_lexer_input_stream.h:274
char * m_body_utf8
UTF8-body buffer created during parsing.
Definition: sql_lexer_input_stream.h:422
const char * get_ptr() const
Get the current stream pointer, in the raw buffer.
Definition: sql_lexer_input_stream.h:268
enum_comment_state in_comment_saved
Definition: sql_lexer_input_stream.h:461
uint get_lineno(const char *raw_ptr) const
Definition: sql_lex.cc:1207
bool text_string_is_7bit() const
Definition: sql_lexer_input_stream.h:510
bool stmt_prepare_mode
true if we're parsing a prepared statement: in this mode we should allow placeholders.
Definition: sql_lexer_input_stream.h:453
const char * get_body_utf8_str() const
Get the utf8-body string.
Definition: sql_lexer_input_stream.h:284
void add_digest_token(uint token, Lexer_yystype *yylval)
Definition: sql_lexer.cc:263
const char * m_cpp_utf8_processed_ptr
Position in the pre-processed buffer.
Definition: sql_lexer_input_stream.h:431
size_t m_buf_length
Length of the raw buffer.
Definition: sql_lexer_input_stream.h:397
const char * get_cpp_tok_end() const
Get the token end position, in the pre-processed buffer.
Definition: sql_lexer_input_stream.h:265
const char * get_cpp_buf() const
Get the pre-processed query buffer.
Definition: sql_lexer_input_stream.h:232
void reduce_digest_token(uint token_left, uint token_right)
Definition: sql_lexer.cc:269
char * m_cpp_buf
Pre-processed buffer.
Definition: sql_lexer_input_stream.h:404
const char * m_cpp_text_start
Starting position of the TEXT_STRING or IDENT in the pre-processed buffer.
Definition: sql_lexer_input_stream.h:469
const char * m_tok_start
Starting position of the last token parsed, in the raw buffer.
Definition: sql_lexer_input_stream.h:385
Lex_input_stream(uint grammar_selector_token_arg)
Constructor.
Definition: sql_lexer_input_stream.h:78
void save_in_comment_state()
Definition: sql_lexer_input_stream.h:100
unsigned char yyGet()
Get a character, and advance in the stream.
Definition: sql_lexer_input_stream.h:127
void warn_on_deprecated_charset(const CHARSET_INFO *cs, const char *alias) const
Outputs warnings on deprecated charsets in complete SQL statements.
Definition: sql_lexer_input_stream.h:360
void yySkip()
Accept a character, by advancing the input stream.
Definition: sql_lexer_input_stream.h:170
bool m_echo
Echo the parsed stream to the pre-processed buffer.
Definition: sql_lexer_input_stream.h:400
char * m_body_utf8_ptr
Pointer to the current position in the UTF8-body buffer.
Definition: sql_lexer_input_stream.h:425
uint yylineno
Current line number.
Definition: sql_lexer_input_stream.h:304
void yySkipn(int n)
Accept multiple characters at once.
Definition: sql_lexer_input_stream.h:182
enum_comment_state in_comment
State of the lexical analyser for comments.
Definition: sql_lexer_input_stream.h:460
int lookahead_token
LALR(2) resolution, look ahead token.
Definition: sql_lexer_input_stream.h:318
void body_utf8_append_literal(THD *thd, const LEX_STRING *txt, const CHARSET_INFO *txt_cs, const char *end_ptr)
The operation converts the specified text literal to the utf8 and appends the result to the utf8-body...
Definition: sql_lexer.cc:233
unsigned char yyGetLast() const
Get the last character accepted.
Definition: sql_lexer_input_stream.h:138
bool ignore_space
SQL_MODE = IGNORE_SPACE.
Definition: sql_lexer_input_stream.h:447
void set_echo(bool echo)
Set the echo mode.
Definition: sql_lexer_input_stream.h:98
Lexer_yystype * yylval
Interface with bison, value of the last token parsed.
Definition: sql_lexer_input_stream.h:310
void start_token()
Mark the stream position as the start of a new token.
Definition: sql_lexer_input_stream.h:238
void reset(const char *buff, size_t length)
Prepare Lex_input_stream instance state for use for handling next SQL statement.
Definition: sql_lexer.cc:102
void yyUnget()
Cancel the effect of the last yyGet() or yySkip().
Definition: sql_lexer_input_stream.h:162
char * m_ptr
Pointer to the current position in the raw input stream.
Definition: sql_lexer_input_stream.h:382
const char * m_end_of_query
End of the query text in the input stream, in the raw buffer.
Definition: sql_lexer_input_stream.h:391
unsigned char yyPeekn(int n) const
Look ahead at some character to parse.
Definition: sql_lexer_input_stream.h:152
unsigned char yyPeek() const
Look at the next character to parse, but do not accept it.
Definition: sql_lexer_input_stream.h:143
bool eof() const
End of file indicator for the query text to parse.
Definition: sql_lexer_input_stream.h:219
const CHARSET_INFO * m_underscore_cs
Character set specified by the character-set-introducer.
Definition: sql_lexer_input_stream.h:484
const char * m_tok_end
Ending position of the previous token parsed, in the raw buffer.
Definition: sql_lexer_input_stream.h:388
bool is_partial_parser() const
True if this scanner tokenizes a partial query (partition expression, generated column expression etc...
Definition: sql_lexer_input_stream.h:352
const char * m_buf
Begining of the query text in the input stream, in the raw buffer.
Definition: sql_lexer_input_stream.h:394
const char * m_cpp_tok_start
Starting position of the last token parsed, in the pre-processed buffer.
Definition: sql_lexer_input_stream.h:413
uint yytoklen
Length of the last token parsed.
Definition: sql_lexer_input_stream.h:307
const char * get_cpp_ptr() const
Get the current stream pointer, in the pre-processed buffer.
Definition: sql_lexer_input_stream.h:271
Definition: sql_list.h:633
Definition: sql_list.h:494
A typesafe replacement for DYNAMIC_ARRAY.
Definition: mem_root_array.h:432
Storage for name strings.
Definition: item.h:296
Global level hints.
Definition: opt_hints.h:352
Query block level hints.
Definition: opt_hints.h:378
Definition: parse_tree_nodes.h:1840
Represents the WITH clause: WITH [...], [...] SELECT ..., ^^^^^^^^^^^^^^^^^.
Definition: parse_tree_nodes.h:366
Base class for all top-level nodes of SQL statements.
Definition: parse_tree_nodes.h:162
Internal state of the parser.
Definition: sql_lexer_parser_state.h:44
Lex_input_stream m_lip
Definition: sql_lexer_parser_state.h:79
void add_comment()
Signal that the current query has a comment.
Definition: sql_lexer_parser_state.h:73
void reset(const char *found_semicolon, size_t length)
Definition: sql_lexer_parser_state.h:67
Yacc_state m_yacc
Definition: sql_lexer_parser_state.h:80
Parser_state()
Definition: sql_lex.h:5042
Parser_input m_input
Definition: sql_lexer_parser_state.h:78
bool has_comment() const
Check whether the current query has a comment.
Definition: sql_lexer_parser_state.h:75
bool m_comment
True if current query contains comments.
Definition: sql_lexer_parser_state.h:88
bool init(THD *thd, const char *buff, size_t length)
Object initializer.
Definition: sql_lexer_parser_state.h:63
PSI_digest_locker * m_digest_psi
Current performance digest instrumentation.
Definition: sql_lex.h:5071
Parser state for partition expression parser (.frm/DD stuff)
Definition: sql_lex.h:5080
Partition_expr_parser_state()
Definition: sql_lex.cc:1224
partition_info * result
Definition: sql_lex.h:5084
A typesafe replacement for DYNAMIC_ARRAY.
Definition: prealloced_array.h:71
RAII class to ease the call of LEX::mark_broken() if error.
Definition: sql_lex.h:4904
~Prepare_error_tracker()
Definition: sql_lex.cc:142
THD *const thd
Definition: sql_lex.h:4910
Prepare_error_tracker(THD *thd_arg)
Definition: sql_lex.h:4906
Definition: protocol.h:33
This class represents a query block, aka a query specification, which is a query consisting of a SELE...
Definition: sql_lex.h:1179
void print_update_list(const THD *thd, String *str, enum_query_type query_type, const mem_root_deque< Item * > &fields, const mem_root_deque< Item * > &values)
Print assignments list.
Definition: sql_lex.cc:3358
void print_delete(const THD *thd, String *str, enum_query_type query_type)
Print detail of the DELETE statement.
Definition: sql_lex.cc:3138
void add_base_options(ulonglong options)
Add base options to a query block, also update active options.
Definition: sql_lex.h:1247
uint n_scalar_subqueries
Keep track for allocation of base_ref_items: scalar subqueries may be replaced by a field during scal...
Definition: sql_lex.h:2175
void label_children() override
Set the correct value of Query_term::m_sibling_idx recursively for set operations.
Definition: sql_lex.h:1215
void qbPrint(int level, std::ostringstream &buf) const
Minion of debugPrint.
Definition: query_term.cc:1021
Query_block * next
Intrusive linked list of all query blocks within the same query expression.
Definition: sql_lex.h:2456
void cleanup_all_joins()
Definition: sql_union.cc:1510
uint select_number
Query block number (used for EXPLAIN)
Definition: sql_lex.h:2108
bool subquery_in_having
HAVING clause contains subquery => we can't close tables before query processing end even if we use t...
Definition: sql_lex.h:2278
Query_term_type term_type() const override
Get the node tree type.
Definition: sql_lex.h:1210
void print_where_cond(const THD *thd, String *str, enum_query_type query_type)
Print list of conditions in WHERE clause.
Definition: sql_lex.cc:3445
Item * where_cond() const
Definition: sql_lex.h:1222
bool is_grouped() const
Definition: sql_lex.h:1332
void print_insert_options(String *str)
Print INSERT options.
Definition: sql_lex.cc:3286
bool m_json_agg_func_used
Definition: sql_lex.h:2536
mem_root_deque< mem_root_deque< Item * > * > * row_value_list
The VALUES items of a table value constructor.
Definition: sql_lex.h:1968
bool is_dependent() const
Definition: sql_lex.h:1852
void print_qualify(const THD *thd, String *str, enum_query_type query_type) const
Print list of items in QUALIFY clause.
Definition: sql_lex.cc:3528
mem_root_deque< Item * > * get_fields_list()
Definition: sql_lex.h:1425
MaterializePathParameters::Operand setup_materialize_query_block(AccessPath *child_path, TABLE *dst_table) const
Make materialization parameters for a query block given its input path and destination table,...
Definition: sql_union.cc:710
bool with_sum_func
True if contains or aggregates set functions.
Definition: sql_lex.h:2272
Ref_item_array m_saved_base_items
A backup of the items in base_ref_items at the end of preparation, so that base_ref_items can be rest...
Definition: sql_lex.h:2521
bool is_explicitly_grouped() const
Definition: sql_lex.h:1308
Item * m_where_cond
Condition to be evaluated after all tables in a query block are joined.
Definition: sql_lex.h:2507
olap_type olap
Indicates whether this query block contains non-primitive grouping (such as ROLLUP).
Definition: sql_lex.h:2211
Item::cond_result having_value
Definition: sql_lex.h:2119
Item::cond_result cond_value
Saved values of the WHERE and HAVING clauses.
Definition: sql_lex.h:2118
bool setup_base_ref_items(THD *thd)
Setup the array containing references to base items.
Definition: sql_lex.cc:2618
uint get_in_sum_expr() const
Definition: sql_lex.h:1395
void print_values(const THD *thd, String *str, enum_query_type query_type, const mem_root_deque< mem_root_deque< Item * > * > &values, const char *prefix)
Print list of values, used in INSERT and for general VALUES clause.
Definition: sql_lex.cc:3399
bool group_fix_field
true when GROUP BY fix field called in processing of this query block
Definition: sql_lex.h:2262
void print_item_list(const THD *thd, String *str, enum_query_type query_type)
Print list of items in Query_block object.
Definition: sql_lex.cc:3334
Resolve_place resolve_place
Indicates part of query being resolved.
Definition: sql_lex.h:2140
bool m_right_joins
True if query block has right joins.
Definition: sql_lex.h:2530
Query_block(MEM_ROOT *mem_root, Item *where, Item *having)
Construct and initialize Query_block object.
Definition: sql_lex.cc:2276
bool is_implicitly_grouped() const
Definition: sql_lex.h:1315
void add_subquery_transform_candidate(Item_exists_subselect *predicate)
Definition: sql_lex.h:1507
size_t visible_column_count() const override
Return the number of visible columns of the query term.
Definition: sql_lex.h:1434
Item * m_having_cond
Condition to be evaluated on grouped rows after grouping.
Definition: sql_lex.h:2510
uint cond_count
Number of predicates after preparation.
Definition: sql_lex.h:2158
Query_result * m_query_result
Result of this query block.
Definition: sql_lex.h:2468
void cleanup(bool full) override
Cleanup this subtree (this Query_block and all nested Query_blockes and Query_expressions).
Definition: sql_union.cc:1481
bool absorb_limit_of(Query_block *block)
end of overridden methods from Query_term
Definition: query_term.cc:1080
Table_ref * end_lateral_table
Last table for LATERAL join, used by table functions.
Definition: sql_lex.h:2072
void print_hints(const THD *thd, String *str, enum_query_type query_type)
Print detail of Hints.
Definition: sql_lex.cc:3218
bool accept(Select_lex_visitor *visitor)
Accept function for SELECT and DELETE.
Definition: sql_lex.cc:3617
uint max_equal_elems
Maximal number of elements in multiple equalities.
Definition: sql_lex.h:2162
uint table_func_count
Number of table functions in this query block.
Definition: sql_lex.h:2199
Item ** qualify_cond_ref()
Definition: sql_lex.h:1229
Mem_root_array< Item_exists_subselect * > * sj_candidates
Pointer to collection of subqueries candidate for semi/antijoin conversion.
Definition: sql_lex.h:2447
bool having_fix_field
true when having fix field called in processing of this query block
Definition: sql_lex.h:2260
bool has_aj_nests
Definition: sql_lex.h:2529
uint hidden_items_from_optimization
Hidden items added during optimization.
Definition: sql_lex.h:2301
Query_block * link_next
Intrusive double-linked global list of query blocks.
Definition: sql_lex.h:2464
VisibleFieldsIterator types_iterator() override
Abstract over visible column types: if query block, we offer an iterator over visible fields,...
Definition: sql_lex.h:1433
void invalidate()
Invalidate by nulling out pointers to other Query_expressions and Query_blockes.
Definition: sql_lex.cc:2610
Opt_hints_qb * opt_hints_qb
Query-block-level hints, for this query block.
Definition: sql_lex.h:2019
Query_block * query_block() const override
The query_block which holds the ORDER BY and LIMIT information for this set operation.
Definition: sql_lex.h:1212
Query_block ** link_prev
Definition: sql_lex.h:2465
uint with_wild
Number of wildcards used in the SELECT list.
Definition: sql_lex.h:2190
Name_resolution_context context
Context for name resolution for all column references except columns from joined tables.
Definition: sql_lex.h:2044
Item ** where_cond_ref()
Definition: sql_lex.h:1223
void make_active_options(ulonglong added_options, ulonglong removed_options)
Make active options from base options, supplied options and environment:
Definition: sql_lex.cc:2458
void set_empty_query()
Set query block as returning no data.
Definition: sql_lex.h:1824
Query_expression * slave
The first query expression contained within this query block.
Definition: sql_lex.h:2461
bool is_item_list_lookup
Definition: sql_lex.h:2257
void mark_as_dependent(Query_block *last, bool aggregate)
Mark all query blocks from this to 'last' as dependent.
Definition: sql_lex.cc:2494
Table_ref * leaf_tables
Points to first leaf table of query block.
Definition: sql_lex.h:2070
bool save_order_properties(THD *thd, SQL_I_List< ORDER > *list, Group_list_ptrs **list_ptrs)
Helper for save_properties()
Definition: sql_lex.cc:4418
Item_sum * inner_sum_func_list
Circular linked list of aggregate functions in nested query blocks.
Definition: sql_lex.h:2087
Item ** having_cond_ref()
Definition: sql_lex.h:1226
bool first_execution
This variable is required to ensure proper work of subqueries and stored procedures.
Definition: sql_lex.h:2246
Item * having_cond() const
Definition: sql_lex.h:1225
void print_delete_options(String *str)
Print DELETE options.
Definition: sql_lex.cc:3278
bool add_ftfunc_to_list(Item_func_match *func)
Definition: sql_lex.cc:2602
void print_having(const THD *thd, String *str, enum_query_type query_type)
Print list of items in HAVING clause.
Definition: sql_lex.cc:3512
size_t table_count() const
Definition: sql_lex.h:1286
bool walk(Item_processor processor, enum_walk walk, uchar *arg)
Definition: sql_lex.cc:4866
bool m_agg_func_used
Definition: sql_lex.h:2535
Query_expression * first_inner_query_expression() const
Definition: sql_lex.h:1294
uint materialized_derived_table_count
Number of materialized derived tables and views in this query block.
Definition: sql_lex.h:2181
VisibleFieldsIterator visible_fields()
Wrappers over fields / get_fields_list() that hide items where item->hidden, meant for range-based fo...
Definition: sql_lex.h:1430
List< Item_func_match > * ftfunc_list
A pointer to ftfunc_list_alloc, list of full text search functions.
Definition: sql_lex.h:1964
uint in_sum_expr
Parse context: is inside a set function if this is positive.
Definition: sql_lex.h:2124
enum_condition_context condition_context
Definition: sql_lex.h:2214
void set_right_joins()
Definition: sql_lex.h:1841
uint n_sum_items
Number of Item_sum-derived objects in this SELECT.
Definition: sql_lex.h:2169
bool m_limit_1
Whether we have LIMIT 1 and no OFFSET.
Definition: sql_lex.h:2079
Query_block * outer_query_block() const
Definition: sql_lex.h:1295
void renumber(LEX *lex)
Renumber query blocks of contained query expressions.
Definition: sql_lex.cc:4592
mem_root_deque< Table_ref * > * m_current_table_nest
Pointer to the set of table references in the currently active join.
Definition: sql_lex.h:2061
List< Window > m_windows
All windows defined on the select, both named and inlined.
Definition: sql_lex.h:1959
Table_ref * find_table_by_name(const Table_ident *ident)
Finds a (possibly unresolved) table reference in the from clause by name.
Definition: sql_lex.cc:4937
uint leaf_table_count
Number of leaf tables in this query block.
Definition: sql_lex.h:2195
void set_having_cond(Item *cond)
Definition: sql_lex.h:1227
bool m_use_select_limit
If true, use select_limit to limit number of rows selected.
Definition: sql_lex.h:2285
bool has_limit() const
Definition: sql_lex.h:1366
void set_qualify_cond(Item *cond)
Definition: sql_lex.h:1230
bool validate_outermost_option(LEX *lex, const char *wrong_option) const
Check if an option that can be used only for an outer-most query block is applicable to this query bl...
Definition: sql_lex.cc:4771
table_map original_tables_map
Original query table map before aj/sj processing.
Definition: sql_lex.h:2193
void destroy()
Destroy contained objects, in particular temporary tables which may have their own mem_roots.
Definition: sql_union.cc:1521
uint derived_table_count
Number of derived tables and views in this query block.
Definition: sql_lex.h:2197
bool is_ordered() const
Definition: sql_lex.h:1343
void destroy_tree() override
Destroy the query term tree structure.
Definition: sql_lex.h:1216
uint partitioned_table_count
Number of partitioned tables.
Definition: sql_lex.h:2183
Prealloced_array< Item_rollup_group_item *, 4 > rollup_group_items
Definition: sql_lex.h:2013
void print_insert_fields(const THD *thd, String *str, enum_query_type query_type)
Print column list to be inserted into.
Definition: sql_lex.cc:3379
mem_root_deque< Item * > * types_array() override
Definition: query_term.cc:883
bool json_agg_func_used() const
Definition: sql_lex.h:1834
bool get_optimizable_conditions(THD *thd, Item **new_where, Item **new_having)
Returns disposable copies of WHERE/HAVING/ON conditions.
Definition: sql_lex.cc:4669
uint between_count
Number of between predicates in where/having/on.
Definition: sql_lex.h:2160
Query_result * query_result() const
Definition: sql_lex.h:1232
void include_in_global(Query_block **plink)
Include query block into global list.
Definition: sql_lex.cc:4608
bool agg_func_used() const
Definition: sql_lex.h:1833
Resolve_place
Three fields used by semi-join transformations to know when semi-join is possible,...
Definition: sql_lex.h:2132
@ RESOLVE_HAVING
Definition: sql_lex.h:2136
@ RESOLVE_NONE
Definition: sql_lex.h:2133
@ RESOLVE_SELECT_LIST
Definition: sql_lex.h:2138
@ RESOLVE_QUALIFY
Definition: sql_lex.h:2137
@ RESOLVE_JOIN_NEST
Definition: sql_lex.h:2134
@ RESOLVE_CONDITION
Definition: sql_lex.h:2135
void set_olap_type(olap_type in_olap)
Definition: sql_lex.h:1386
void include_chain_in_global(Query_block **start)
Include chain of query blocks into global list.
Definition: sql_lex.cc:4619
SQL_I_List< ORDER > order_list
ORDER BY clause.
Definition: sql_lex.h:1983
char * db
Definition: sql_lex.h:2021
List< Item_func_match > ftfunc_list_alloc
Definition: sql_lex.h:1965
static const char * get_type_str(enum_explain_type type)
Definition: sql_lex.h:1848
void remove_base_options(ulonglong options)
Remove base options from a query block.
Definition: sql_lex.h:1258
enum_explain_type type() const
Lookup for Query_block type.
Definition: sql_lex.cc:4489
bool optimize_query_term(THD *, Query_expression *) override
Optimize the non-leaf query blocks.
Definition: sql_lex.h:1199
Item * offset_limit
LIMIT ... OFFSET clause, NULL if no offset is given.
Definition: sql_lex.h:2077
void set_sj_candidates(Mem_root_array< Item_exists_subselect * > *sj_cand)
Definition: sql_lex.h:1504
void print_order_by(const THD *thd, String *str, enum_query_type query_type) const
Print list of items in ORDER BY clause.
Definition: sql_lex.cc:3558
static const char * type_str[static_cast< int >(enum_explain_type::EXPLAIN_total)]
Definition: sql_lex.h:2545
bool add_grouping_expr(THD *thd, Item *item)
Add a grouping expression to the query block.
Definition: sql_lex.cc:2595
Query_expression * master
The query expression containing this query block.
Definition: sql_lex.h:2459
bool has_subquery_transforms() const
Definition: sql_lex.h:1514
Ref_item_array base_ref_items
Array of pointers to "base" items; one each for every selected expression and referenced item in the ...
Definition: sql_lex.h:2106
int hidden_order_field_count
How many expressions are part of the order by but not select list.
Definition: sql_lex.h:2450
enum_parsing_context parsing_place
Parse context: indicates where the current expression is being parsed.
Definition: sql_lex.h:2122
void init_order()
Definition: sql_lex.h:1523
uint8 uncacheable
result of this query can't be cached, bit field, can be : UNCACHEABLE_DEPENDENT UNCACHEABLE_RAND UNCA...
Definition: sql_lex.h:2228
ulonglong m_base_options
Options assigned from parsing and throughout resolving, should not be modified after resolving is don...
Definition: sql_lex.h:2474
bool source_table_is_one_row() const
Definition: sql_lex.h:1856
uint in_window_expr
Parse context: is inside a window function if this is positive.
Definition: sql_lex.h:2126
void include_down(LEX *lex, Query_expression *outer)
Include query block inside a query expression.
Definition: sql_lex.cc:4543
void include_standalone(Query_expression *sel)
Include query block inside a query expression, but do not link.
Definition: sql_lex.cc:4580
Group_list_ptrs * group_list_ptrs
Definition: sql_lex.h:1996
uint saved_cond_count
Number of arguments of and/or/xor in where/having/on.
Definition: sql_lex.h:2156
Subquery_strategy subquery_strategy(const THD *thd) const
Returns which subquery execution strategies can be used for this query block.
Definition: sql_lex.cc:4692
Query_block * next_query_block() const
Definition: sql_lex.h:1296
Name_resolution_context * first_context
Pointer to first object in list of Name res context objects that have this query block as the base qu...
Definition: sql_lex.h:2051
void include_neighbour(LEX *lex, Query_block *before)
Include a query block next to another query block.
Definition: sql_lex.cc:4561
bool is_table_value_constructor
If set, the query block is of the form VALUES row_list.
Definition: sql_lex.h:2217
Item * get_derived_expr(uint expr_index)
Returns an expression from the select list of the query block using the field's index in a derived ta...
Definition: sql_derived.cc:1302
bool semijoin_enabled(const THD *thd) const
Returns whether semi-join is enabled for this query block.
Definition: sql_lex.cc:4718
Query_expression * master_query_expression() const
Definition: sql_lex.h:1293
void update_semijoin_strategies(THD *thd)
Update available semijoin strategies for semijoin nests.
Definition: sql_lex.cc:4723
uint select_n_having_items
Number of items in the select list, HAVING clause, QUALIFY clause and ORDER BY clause.
Definition: sql_lex.h:2154
Table_ref * get_table_list() const
Definition: sql_lex.h:1420
void print_update(const THD *thd, String *str, enum_query_type query_type)
Print detail of the UPDATE statement.
Definition: sql_lex.cc:3101
bool is_simple_query_block() const
Definition: sql_lex.h:1811
void print_table_references(const THD *thd, String *str, Table_ref *table_list, enum_query_type query_type)
Print list of tables.
Definition: sql_lex.cc:3300
int m_current_order_by_number
Keeps track of the current ORDER BY expression we are resolving for ORDER BY, if any.
Definition: sql_lex.h:2297
bool has_tables() const
Definition: sql_lex.h:1305
void debugPrint(int level, std::ostringstream &buf) const override
Query_term methods overridden.
Definition: query_term.cc:1058
bool m_internal_limit
If true, limit object is added internally.
Definition: sql_lex.h:2288
int hidden_group_field_count
Number of GROUP BY expressions added to all_fields.
Definition: sql_lex.h:2516
bool is_recursive() const
Definition: sql_lex.h:1372
int get_number_of_grouping_sets() const
Definition: sql_lex.h:2493
void print_windows(const THD *thd, String *str, enum_query_type query_type)
Print details of Windowing functions.
Definition: sql_lex.cc:3536
bool no_table_names_allowed
used for global order by
Definition: sql_lex.h:2293
bool validate_base_options(LEX *lex, ulonglong options) const
Validate base options for a query block.
Definition: sql_lex.cc:4808
void set_where_cond(Item *cond)
Definition: sql_lex.h:1224
Item * select_limit
LIMIT clause, NULL if no limit is given.
Definition: sql_lex.h:2075
ulonglong active_options() const
Definition: sql_lex.h:1271
bool save_properties(THD *thd)
Save properties of a prepared statement needed for repeated optimization.
Definition: sql_lex.cc:4441
Table_ref * embedding
table embedding the above list
Definition: sql_lex.h:2063
bool open_result_tables(THD *, int) override
Open tmp tables for the tree of set operation query results, by recursing.
Definition: query_term.cc:1072
table_map select_list_tables
The set of those tables whose fields are referenced in the select list of this select level.
Definition: sql_lex.h:2037
bool m_was_implicitly_grouped
Used by nested scalar_to_derived transformations.
Definition: sql_lex.h:2252
bool has_sj_nests
True if query block has semi-join nests merged into it.
Definition: sql_lex.h:2528
Prealloced_array< Item_rollup_sum_switcher *, 4 > rollup_sums
Definition: sql_lex.h:2015
SQL_I_List< ORDER > group_list
GROUP BY clause.
Definition: sql_lex.h:1995
SQL_I_List< Table_ref > m_table_list
List of tables in FROM clause - use Table_ref::next_local to traverse.
Definition: sql_lex.h:1974
uint select_n_where_fields
Number of fields used in select list or where clause of current select and all inner subselects.
Definition: sql_lex.h:2147
bool skip_local_transforms
True: skip local transformations during prepare() call (used by INSERT)
Definition: sql_lex.h:2255
void print_limit(const THD *thd, String *str, enum_query_type query_type) const
Definition: sql_lex.cc:2745
const char * get_type_str()
Lookup for a type string.
Definition: sql_lex.h:1847
Table_ref * resolve_nest
Used when resolving outer join condition.
Definition: sql_lex.h:2490
bool is_empty_query() const
Definition: sql_lex.h:1820
void print_query_block(const THD *thd, String *str, enum_query_type query_type)
Print detail of the Query_block object.
Definition: sql_lex.cc:3077
mem_root_deque< Table_ref * > m_table_nest
Set of table references contained in outer-most join nest.
Definition: sql_lex.h:2059
bool set_context(Name_resolution_context *outer_context)
Assign a default name resolution object for this query block.
Definition: sql_lex.cc:2293
bool m_window_order_fix_field
true when resolving a window's ORDER BY or PARTITION BY, the window belonging to this query block.
Definition: sql_lex.h:2265
void set_json_agg_func_used(bool val)
Definition: sql_lex.h:1838
bool allow_merge_derived
Allow merge of immediate unnamed derived tables.
Definition: sql_lex.h:2533
bool add_tables(THD *thd, const Mem_root_array< Table_ident * > *tables, ulong table_options, thr_lock_type lock_type, enum_mdl_type mdl_type)
Add tables from an array to a list of used tables.
Definition: sql_lex.cc:2318
void print_select_options(String *str)
Print select options.
Definition: sql_lex.cc:3264
void set_query_result(Query_result *result)
Definition: sql_lex.h:1231
mem_root_deque< Table_ref * > sj_nests
List of semi-join nests generated for this query block.
Definition: sql_lex.h:1971
Table_ref * recursive_reference
If this query block is a recursive member of a recursive unit: the Table_ref, in this recursive membe...
Definition: sql_lex.h:2028
bool add_item_to_list(Item *item)
Definition: sql_lex.cc:2578
void print(const THD *thd, String *str, enum_query_type query_type)
Definition: sql_lex.cc:3038
bool is_non_primitive_grouped() const
Definition: sql_lex.h:1322
bool exclude_from_table_unique_test
exclude this query block from unique_table() check
Definition: sql_lex.h:2291
bool sj_pullout_done
True when semi-join pull-out processing is complete.
Definition: sql_lex.h:2249
AccessPath * make_set_op_access_path(THD *thd, Query_term_set_op *parent, Mem_root_array< AppendPathParameters > *union_all_subpaths, bool calc_found_rows) override
Recursively constructs the access path of the set operation, possibly materializing in a tmp table if...
Definition: query_term.cc:871
int nest_level
Nesting level of query block, outer-most query block has level 0, its subqueries have level 1,...
Definition: sql_lex.h:2205
const char * operator_string() const override
Get the node type description.
Definition: sql_lex.h:1211
Group_list_ptrs * order_list_ptrs
Definition: sql_lex.h:1984
uint n_child_sum_items
Number of Item_sum-derived objects in children and descendant SELECTs.
Definition: sql_lex.h:2171
bool save_cmd_properties(THD *thd)
Save prepared statement properties for a query block and underlying query expressions.
Definition: sql_lex.cc:4958
void set_agg_func_used(bool val)
Definition: sql_lex.h:1836
bool print_error(const THD *thd, String *str)
Print error.
Definition: sql_lex.cc:3243
bool prepare_query_term(THD *thd, Query_expression *qe, Change_current_query_block *save_query_block, mem_root_deque< Item * > *insert_field_list, Query_result *common_result, ulonglong added_options, ulonglong removed_options, ulonglong create_option) override
a) Prepare query blocks, both leaf blocks and blocks reresenting order by/limit in query primaries wi...
Definition: query_term.cc:816
Item * qualify_cond() const
Definition: sql_lex.h:1228
bool is_cacheable() const
Definition: sql_lex.h:1853
ha_rows get_offset(const THD *thd) const
Get offset for LIMIT.
Definition: sql_lex.cc:2557
void add_active_options(ulonglong options)
Adjust the active option set.
Definition: sql_lex.h:1268
ha_rows get_limit(const THD *thd) const
Get limit.
Definition: sql_lex.cc:2564
Item * clone_expression(THD *thd, Item *item, Table_ref *derived_table)
Creates a clone for the given expression by re-parsing the expression.
Definition: sql_derived.cc:823
void set_base_options(ulonglong options_arg)
Set base options for a query block (and active options too)
Definition: sql_lex.h:1237
uint n_stored_func_calls
Number of stored function calls in this query block.
Definition: sql_lex.h:2178
void print_update_options(String *str)
Print UPDATE options.
Definition: sql_lex.cc:3271
void print_insert(const THD *thd, String *str, enum_query_type query_type)
Print detail of the INSERT statement.
Definition: sql_lex.cc:3170
table_map all_tables_map() const
Definition: sql_lex.h:1289
bool right_joins() const
Definition: sql_lex.h:1840
JOIN * join
After optimization it is pointer to corresponding JOIN.
Definition: sql_lex.h:2057
ulonglong m_active_options
Active options.
Definition: sql_lex.h:2480
decltype(SQL_I_List< ORDER >::elements) m_no_of_added_exprs
For an explicitly grouped, correlated, scalar subquery which is transformed to join with derived tabl...
Definition: sql_lex.h:2009
void restore_cmd_properties()
Restore prepared statement properties for this query block and all underlying query expressions so th...
Definition: sql_lex.cc:4979
Item * m_qualify_cond
Condition to be evaluated after window functions.
Definition: sql_lex.h:2513
void cut_subtree()
Definition: sql_lex.h:1535
bool has_sj_candidates() const
Definition: sql_lex.h:1510
void print_from_clause(const THD *thd, String *str, enum_query_type query_type)
Print list of tables in FROM clause.
Definition: sql_lex.cc:3427
bool m_empty_query
True if query block does not generate any rows before aggregation, determined during preparation (not...
Definition: sql_lex.h:2542
table_map outer_join
Bitmap of all inner tables from outer joins.
Definition: sql_lex.h:2038
void set_number_of_grouping_sets(int num_grouping_sets)
Definition: sql_lex.h:2494
size_t m_added_non_hidden_fields
Definition: sql_lex.h:1932
int m_num_grouping_sets
If the query block includes non-primitive grouping, then these modifiers are represented as grouping ...
Definition: sql_lex.h:2487
Query_block * next_select_in_list() const
Definition: sql_lex.h:1300
void print_group_by(const THD *thd, String *str, enum_query_type query_type)
Print list of items in GROUP BY clause.
Definition: sql_lex.cc:3460
auto visible_fields() const
Definition: sql_lex.h:1431
bool can_skip_distinct() const
Based on the structure of the query at resolution time, it is possible to conclude that DISTINCT is u...
Definition: sql_lex.h:1360
bool is_distinct() const
Definition: sql_lex.h:1335
void set_tables_readonly()
Set associated tables as read_only, ie.
Definition: sql_lex.h:1279
mem_root_deque< Item * > fields
All expressions needed after join and filtering, ie., select list, group by list, having clause,...
Definition: sql_lex.h:1954
LEX * parent_lex
Reference to LEX that this query block belongs to.
Definition: sql_lex.h:2031
bool test_limit()
Definition: sql_lex.cc:2530
bool has_windows() const
Definition: sql_lex.h:1388
bool has_ft_funcs() const
Definition: sql_lex.h:1369
This class represents a query expression (one query block or several query blocks combined with UNION...
Definition: sql_lex.h:643
bool is_executed() const
Check state of execution of the contained query expression.
Definition: sql_lex.h:1058
bool merge_heuristic(const LEX *lex) const
True if heuristics suggest to merge this query expression.
Definition: sql_lex.cc:4003
bool optimize(THD *thd, TABLE *materialize_destination, bool finalize_access_paths)
If and only if materialize_destination is non-nullptr, it means that the caller intends to materializ...
Definition: sql_union.cc:504
Query_block * non_simple_result_query_block() const
Return the query block iff !is_simple() holds.
Definition: sql_lex.h:675
void reset_executed()
Reset this query expression for repeated evaluation within same execution.
Definition: sql_lex.h:1037
void change_to_access_path_without_in2exists(THD *thd)
Definition: sql_union.cc:1369
unique_ptr_destroy_only< RowIterator > m_root_iterator
An iterator you can read from to get all records for this query.
Definition: sql_lex.h:763
bool m_contains_except_all
Definition: sql_lex.h:826
Query_expression(enum_parsing_context parsing_context)
Construct and initialize Query_expression object.
Definition: sql_lex.cc:2225
void set_explain_marker_from(THD *thd, const Query_expression *u)
Definition: sql_lex.cc:2550
void set_prepared()
Definition: sql_lex.h:1023
bool executed
Query expression has been executed.
Definition: sql_lex.h:748
bool walk(Item_processor processor, enum_walk walk, uchar *arg)
Definition: sql_union.cc:1361
void clear_root_access_path()
Definition: sql_lex.h:891
void set_explain_marker(THD *thd, enum_parsing_context m)
Definition: sql_lex.cc:2544
bool has_top_level_distinct() const
Definition: sql_lex.h:731
unique_ptr_destroy_only< RowIterator > release_root_iterator()
Definition: sql_lex.h:881
void exclude_tree()
Exclude subtree of current unit from tree of SELECTs.
Definition: sql_lex.cc:2403
Query_term_set_op * set_operation() const
Convenience method to avoid down casting, i.e.
Definition: sql_lex.h:671
void set_executed()
Definition: sql_lex.h:1031
Mem_root_array< MaterializePathParameters::Operand > m_operands
If there is an unfinished materialization (see optimize()), contains one element for each operand (qu...
Definition: sql_lex.h:771
enum_parsing_context explain_marker
Marker for subqueries in WHERE, HAVING, ORDER BY, GROUP BY and SELECT item lists.
Definition: sql_lex.h:744
Query_term * find_blocks_query_term(const Query_block *qb) const
Definition: sql_lex.h:682
enum_parsing_context get_explain_marker(const THD *thd) const
Definition: sql_lex.cc:2538
Query_expression * next_query_expression() const
Definition: sql_lex.h:875
Query_term * query_term() const
Getter for m_query_term, q.v.
Definition: sql_lex.h:664
Query_expression * next
Intrusive double-linked list of all query expressions immediately contained within the same query blo...
Definition: sql_lex.h:648
bool create_iterators(THD *thd)
Creates iterators for the access paths created by optimize().
Definition: sql_union.cc:660
Query_block * global_parameters() const
Return the query block holding the top level ORDER BY, LIMIT and OFFSET.
Definition: sql_lex.h:818
bool explain_query_term(THD *explain_thd, const THD *query_thd, Query_term *qt)
Definition: sql_union.cc:861
Query_block * slave
The first query block in this query expression.
Definition: sql_lex.h:657
bool has_stored_program() const
Definition: sql_lex.h:795
bool change_query_result(THD *thd, Query_result_interceptor *result, Query_result_interceptor *old_result)
Change the query result object used to return the final result of the unit, replacing occurrences of ...
Definition: sql_union.cc:1301
size_t num_visible_fields() const
Definition: sql_union.cc:1335
bool is_simple() const
Definition: sql_lex.h:793
bool optimized
All query blocks in query expression are optimized.
Definition: sql_lex.h:747
Query_block * outer_query_block() const
Definition: sql_lex.h:869
void exclude_level()
Exclude this unit and immediately contained query_block objects.
Definition: sql_lex.cc:2341
Query_block * first_query_block() const
Definition: sql_lex.h:872
Query_block * master
The query block wherein this query expression is contained, NULL if the query block is the outer-most...
Definition: sql_lex.h:655
Query_block * last_distinct() const
Return the Query_block of the last query term in a n-ary set operation that is the right side of the ...
Definition: sql_lex.h:723
enum_clean_state cleaned
cleanliness state
Definition: sql_lex.h:805
bool prepare(THD *thd, Query_result *result, mem_root_deque< Item * > *insert_field_list, ulonglong added_options, ulonglong removed_options)
Prepares all query blocks of a query expression.
Definition: sql_union.cc:363
bool check_materialized_derived_query_blocks(THD *thd)
Sets up query blocks belonging to the query expression of a materialized derived table.
Definition: sql_derived.cc:952
Query_expression ** prev
Definition: sql_lex.h:649
void DebugPrintQueryPlan(THD *thd, const char *keyword) const
Definition: sql_union.cc:684
void set_query_term(Query_term *qt)
Setter for m_query_term, q.v.
Definition: sql_lex.h:666
ha_rows offset_limit_cnt
Definition: sql_lex.h:823
Query_term * m_query_term
Definition: sql_lex.h:660
AccessPath * m_root_access_path
Definition: sql_lex.h:764
Mem_root_array< MaterializePathParameters::Operand > release_query_blocks_to_materialize()
See optimize().
Definition: sql_lex.h:923
bool has_any_limit() const
Checks if this query expression has limit defined.
Definition: sql_lex.cc:3935
bool ExecuteIteratorQuery(THD *thd)
Definition: sql_union.cc:1036
void set_optimized()
Definition: sql_lex.h:1027
void cleanup(bool full)
Cleanup this query expression object after preparation or one round of execution.
Definition: sql_union.cc:1210
friend bool parse_view_definition(THD *thd, Table_ref *view_ref)
Parse a view definition.
Definition: sql_view.cc:1290
mem_root_deque< Item * > * get_unit_column_types()
Get column type information for this query expression.
Definition: sql_union.cc:1331
Query_block * create_post_processing_block(Query_term_set_op *term)
Create a block to be used for ORDERING and LIMIT/OFFSET processing of a query term,...
Definition: sql_lex.cc:753
bool replace_items(Item_transformer t, uchar *arg)
Replace all targeted items using transformer provided and info in arg.
Definition: item_subselect.cc:3329
RowIterator * root_iterator() const
Definition: sql_lex.h:880
bool is_leaf_block(Query_block *qb)
Definition: sql_lex.cc:775
bool force_create_iterators(THD *thd)
Ensures that there are iterators created for the access paths created by optimize(),...
Definition: sql_union.cc:652
Query_block * first_recursive
First query block (in this UNION) which references the CTE.
Definition: sql_lex.h:844
bool prepared
All query blocks in query expression are prepared.
Definition: sql_lex.h:746
void assert_not_fully_clean()
Asserts that none of {this unit and its children units} is fully cleaned up.
Definition: sql_union.cc:1266
void renumber_selects(LEX *lex)
Renumber query blocks of a query expression according to supplied LEX.
Definition: sql_lex.cc:4019
bool accept(Select_lex_visitor *visitor)
Definition: sql_lex.cc:3587
Query_result * query_result() const
Definition: sql_lex.h:878
ha_rows send_records
Definition: sql_lex.h:1093
enum_parsing_context place() const
If unit is a subquery, which forms an object of the upper level (an Item_subselect,...
Definition: sql_lex.cc:4860
void accumulate_used_tables(table_map map)
If unit is a subquery, which forms an object of the upper level (an Item_subselect,...
Definition: sql_lex.cc:4852
ha_rows select_limit_cnt
Definition: sql_lex.h:823
void create_access_paths(THD *thd)
Convert the executor structures to a set of access paths, storing the result in m_root_access_path.
Definition: sql_union.cc:777
void print(const THD *thd, String *str, enum_query_type query_type)
Definition: sql_lex.cc:2733
Table_ref * derived_table
If this query expression is underlying of a derived table, the derived table.
Definition: sql_lex.h:839
void restore_cmd_properties()
Loop over all query blocks and restore information needed for optimization, including binding data fo...
Definition: sql_lex.cc:4042
bool finalize(THD *thd)
For any non-finalized query block, finalize it so that we are allowed to create iterators.
Definition: sql_union.cc:640
Query_terms< order, visit_leaves > query_terms() const
Return iterator object over query terms rooted in m_query_term, using either post order visiting (def...
Definition: sql_lex.h:708
bool set_limit(THD *thd, Query_block *provider)
Set limit and offset for query expression object.
Definition: sql_lex.cc:3916
bool m_reject_multiple_rows
This query expression represents a scalar subquery and we need a run-time check that the cardinality ...
Definition: sql_lex.h:860
bool ClearForExecution()
Do everything that would be needed before running Init() on the root iterator.
Definition: sql_union.cc:1001
Item_subselect * item
Points to subquery if this query expression is used in one, otherwise NULL.
Definition: sql_lex.h:829
enum_clean_state
Values for Query_expression::cleaned.
Definition: sql_lex.h:798
@ UC_PART_CLEAN
Unit were cleaned, except JOIN and JOIN_TABs were kept for possible EXPLAIN.
Definition: sql_lex.h:800
@ UC_CLEAN
Unit completely cleaned, all underlying JOINs were freed.
Definition: sql_lex.h:802
@ UC_DIRTY
Unit isn't cleaned.
Definition: sql_lex.h:799
void invalidate()
Invalidate by nulling out pointers to other Query expressions and Query blocks.
Definition: sql_lex.cc:2443
bool can_materialize_directly_into_result() const
Whether there is a chance that optimize() is capable of materializing directly into a result table if...
Definition: sql_union.cc:338
PT_with_clause * m_with_clause
The WITH clause which is the first part of this query expression.
Definition: sql_lex.h:834
bool explain(THD *explain_thd, const THD *query_thd)
Explain query starting from this unit.
Definition: sql_union.cc:933
bool is_mergeable() const
Return true if query expression can be merged into an outer query, based on technical constraints.
Definition: sql_lex.cc:3974
Query_result * m_query_result
Object to which the result for this query expression is sent.
Definition: sql_lex.h:755
bool is_prepared() const
Check state of preparation of the contained query expression.
Definition: sql_lex.h:1050
table_map m_lateral_deps
If 'this' is body of lateral derived table: map of tables in the same FROM clause as this derived tab...
Definition: sql_lex.h:854
bool is_optimized() const
Check state of optimization of the contained query expression.
Definition: sql_lex.h:1052
void set_query_result(Query_result *res)
Set new query result object for this query expression.
Definition: sql_lex.h:928
void include_down(LEX *lex, Query_block *outer)
Include a query expression below a query block.
Definition: sql_lex.cc:3948
void destroy()
Destroy contained objects, in particular temporary tables which may have their own mem_roots.
Definition: sql_union.cc:1241
mem_root_deque< Item * > * get_field_list()
Get field list for this query expression.
Definition: sql_union.cc:1349
bool execute(THD *thd)
Execute a query expression that may be a UNION and/or have an ordered result.
Definition: sql_union.cc:1179
bool clear_correlated_query_blocks()
Empties all correlated query blocks defined within the query expression; that is, correlated CTEs def...
Definition: sql_union.cc:987
bool save_cmd_properties(THD *thd)
Save prepared statement properties for a query expression and underlying query blocks.
Definition: sql_lex.cc:4031
bool m_has_stored_program
Definition: sql_lex.h:750
AccessPath * root_access_path() const
Definition: sql_lex.h:884
uint8 uncacheable
result of this query can't be cached, bit field, can be : UNCACHEABLE_DEPENDENT UNCACHEABLE_RAND UNCA...
Definition: sql_lex.h:787
bool unfinished_materialization() const
See optimize().
Definition: sql_lex.h:919
void clear_execution()
Clear execution state, needed before new execution of prepared statement.
Definition: sql_lex.h:1042
bool is_recursive() const
Definition: sql_lex.h:1110
Definition: query_result.h:191
Definition: sql_union.h:40
Definition: query_result.h:60
Definition: sql_lex.h:2758
bool is_mixed_stmt_unsafe(bool in_multi_stmt_transaction_mode, bool binlog_direct, bool trx_cache_is_not_empty, uint tx_isolation)
Definition: sql_lex.h:3285
bool uses_stored_routines() const
true if the parsed tree contains references to stored procedures, triggers or functions,...
Definition: sql_lex.h:3332
void set_stmt_row_injection()
Flag the statement as a row injection.
Definition: sql_lex.h:3132
std::unique_ptr< malloc_unordered_map< std::string, Sroutine_hash_entry * > > sroutines
Definition: sql_lex.h:2789
void set_stmt_unsafe(enum_binlog_stmt_unsafe unsafe_type)
Flag the current (top-level) statement as unsafe.
Definition: sql_lex.h:3081
static const char * stmt_accessed_table_string(enum_stmt_accessed_table accessed_table)
Definition: sql_lex.h:3185
enum_binlog_stmt_type
Enumeration listing special types of statements.
Definition: sql_lex.h:3348
@ BINLOG_STMT_TYPE_ROW_INJECTION
The statement is a row injection (i.e., either a BINLOG statement or a row event executed by the slav...
Definition: sql_lex.h:3353
@ BINLOG_STMT_TYPE_COUNT
The last element of this enumeration type.
Definition: sql_lex.h:3356
Table_ref ** query_tables_last
Definition: sql_lex.h:2772
bool is_stmt_unsafe_with_mixed_mode() const
Definition: sql_lex.h:3338
void reset_query_tables_list(bool init)
Definition: sql_lex.cc:3682
static const int BINLOG_STMT_UNSAFE_ALL_FLAGS
This has all flags from 0 (inclusive) to BINLOG_STMT_FLAG_COUNT (exclusive) set.
Definition: sql_lex.h:3054
~Query_tables_list()=default
enum_sql_command sql_command
SQL command for this statement.
Definition: sql_lex.h:2768
void set_stmt_unsafe_flags(uint32 flags)
Set the bits of binlog_stmt_flags determining the type of unsafeness of the current statement.
Definition: sql_lex.h:3096
uint32 get_stmt_unsafe_flags() const
Return a binary combination of all unsafe warnings for the statement.
Definition: sql_lex.h:3109
void set_stmt_unsafe_with_mixed_mode()
Definition: sql_lex.h:3337
Query_tables_list()=default
bool is_stmt_unsafe() const
Determine if this statement is marked as unsafe.
Definition: sql_lex.h:3068
bool is_stmt_unsafe(enum_binlog_stmt_unsafe unsafe)
Definition: sql_lex.h:3070
uint table_count
Number of tables which were open by open_tables() and to be locked by lock_tables().
Definition: sql_lex.h:2833
uint32 stmt_accessed_table_flag
Bit field that determines the type of tables that are about to be be accessed while executing a state...
Definition: sql_lex.h:3380
enum_stmt_accessed_table
Definition: sql_lex.h:3140
@ STMT_READS_TEMP_TRANS_TABLE
Definition: sql_lex.h:3155
@ STMT_WRITES_TEMP_TRANS_TABLE
Definition: sql_lex.h:3172
@ STMT_WRITES_TRANS_TABLE
Definition: sql_lex.h:3164
@ STMT_WRITES_TEMP_NON_TRANS_TABLE
Definition: sql_lex.h:3176
@ STMT_READS_TRANS_TABLE
Definition: sql_lex.h:3145
@ STMT_READS_TEMP_NON_TRANS_TABLE
Definition: sql_lex.h:3160
@ STMT_ACCESS_TABLE_COUNT
Definition: sql_lex.h:3181
@ STMT_READS_NON_TRANS_TABLE
Definition: sql_lex.h:3150
@ STMT_WRITES_NON_TRANS_TABLE
Definition: sql_lex.h:3168
bool stmt_unsafe_with_mixed_mode
This flag is set to true if statement is unsafe to be binlogged in STATEMENT format,...
Definition: sql_lex.h:3393
uint sroutines_list_own_elements
Definition: sql_lex.h:2801
void mark_as_requiring_prelocking(Table_ref **tables_own_last)
Definition: sql_lex.h:2859
bool is_stmt_row_injection() const
Determine if this statement is a row injection.
Definition: sql_lex.h:3120
enum_lock_tables_state lock_tables_state
Definition: sql_lex.h:2821
void set_query_tables_list(Query_tables_list *state)
Definition: sql_lex.h:2845
void set_using_match()
Definition: sql_lex.h:3334
bool stmt_accessed_table(enum_stmt_accessed_table accessed_table)
Checks if a type of table is about to be accessed while executing a statement.
Definition: sql_lex.h:3262
SQL_I_List< Sroutine_hash_entry > sroutines_list
Definition: sql_lex.h:2799
void destroy_query_tables_list()
Definition: sql_lex.cc:3727
Sroutine_hash_entry ** sroutines_list_own_last
Definition: sql_lex.h:2800
bool using_match
It will be set true if 'MATCH () AGAINST' is used in the statement.
Definition: sql_lex.h:3385
void set_stmt_accessed_table(enum_stmt_accessed_table accessed_table)
Sets the type of table that is about to be accessed while executing a statement.
Definition: sql_lex.h:3243
static const int binlog_stmt_unsafe_errcode[BINLOG_STMT_UNSAFE_COUNT]
Maps elements of enum_binlog_stmt_unsafe to error codes.
Definition: sql_lex.h:3060
enum_binlog_stmt_unsafe
All types of unsafe statements.
Definition: sql_lex.h:2889
@ BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION
Using some functions is unsafe (e.g., UUID).
Definition: sql_lex.h:2921
@ BINLOG_STMT_UNSAFE_MULTIPLE_ENGINES_AND_SELF_LOGGING_ENGINE
Mixing self-logging and non-self-logging engines in a statement is unsafe.
Definition: sql_lex.h:2934
@ BINLOG_STMT_UNSAFE_COUNT
Definition: sql_lex.h:3048
@ BINLOG_STMT_UNSAFE_XA
XA transactions and statements.
Definition: sql_lex.h:3021
@ BINLOG_STMT_UNSAFE_CREATE_SELECT_AUTOINC
CREATE TABLE...SELECT on a table with auto-increment column is unsafe because which rows are replaced...
Definition: sql_lex.h:2990
@ BINLOG_STMT_UNSAFE_DEFAULT_EXPRESSION_IN_SUBSTATEMENT
If a substatement inserts into or updates a table that has a column with an unsafe DEFAULT expression...
Definition: sql_lex.h:3028
@ BINLOG_STMT_UNSAFE_NOWAIT
Definition: sql_lex.h:3016
@ BINLOG_STMT_UNSAFE_FULLTEXT_PLUGIN
Using a plugin is unsafe.
Definition: sql_lex.h:3014
@ BINLOG_STMT_UNSAFE_INSERT_TWO_KEYS
INSERT... ON DUPLICATE KEY UPDATE on a table with more than one UNIQUE KEYS is unsafe.
Definition: sql_lex.h:3003
@ BINLOG_STMT_UNSAFE_AUTOINC_NOT_FIRST
INSERT into auto-inc field which is not the first part in composed primary key.
Definition: sql_lex.h:3009
@ BINLOG_STMT_UNSAFE_CREATE_SELECT_WITH_GIPK
Generating invisible primary key for a table created using CREATE TABLE... SELECT....
Definition: sql_lex.h:3045
@ BINLOG_STMT_UNSAFE_NONTRANS_AFTER_TRANS
Mixing transactional and non-transactional statements are unsafe if non-transactional reads or writes...
Definition: sql_lex.h:2928
@ BINLOG_STMT_UNSAFE_SYSTEM_VARIABLE
Using most system variables is unsafe, because slave may run with different options than master.
Definition: sql_lex.h:2917
@ BINLOG_STMT_UNSAFE_INSERT_IGNORE_SELECT
INSERT...IGNORE SELECT is unsafe because which rows are ignored depends on the order that rows are re...
Definition: sql_lex.h:2947
@ BINLOG_STMT_UNSAFE_MIXED_STATEMENT
Statements that read from both transactional and non-transactional tables and write to any of them ar...
Definition: sql_lex.h:2940
@ BINLOG_STMT_UNSAFE_AUTOINC_COLUMNS
Inserting into an autoincrement column in a stored routine is unsafe.
Definition: sql_lex.h:2908
@ BINLOG_STMT_UNSAFE_SKIP_LOCKED
Definition: sql_lex.h:3015
@ BINLOG_STMT_UNSAFE_CREATE_IGNORE_SELECT
CREATE TABLE... IGNORE... SELECT is unsafe because which rows are ignored depends on the order that r...
Definition: sql_lex.h:2975
@ BINLOG_STMT_UNSAFE_ACL_TABLE_READ_IN_DML_DDL
DML or DDL statement that reads a ACL table is unsafe, because the row are read without acquiring SE ...
Definition: sql_lex.h:3036
@ BINLOG_STMT_UNSAFE_INSERT_SELECT_UPDATE
INSERT...SELECT...UPDATE is unsafe because which rows are updated depends on the order that rows are ...
Definition: sql_lex.h:2954
@ BINLOG_STMT_UNSAFE_LIMIT
SELECT..LIMIT is unsafe because the set of rows returned cannot be predicted.
Definition: sql_lex.h:2894
@ BINLOG_STMT_UNSAFE_REPLACE_SELECT
INSERT...REPLACE SELECT is unsafe because which rows are replaced depends on the order that rows are ...
Definition: sql_lex.h:2968
@ BINLOG_STMT_UNSAFE_CREATE_REPLACE_SELECT
CREATE TABLE...REPLACE... SELECT is unsafe because which rows are replaced depends on the order that ...
Definition: sql_lex.h:2982
@ BINLOG_STMT_UNSAFE_UDF
Using a UDF (user-defined function) is unsafe.
Definition: sql_lex.h:2912
@ BINLOG_STMT_UNSAFE_UPDATE_IGNORE
UPDATE...IGNORE is unsafe because which rows are ignored depends on the order that rows are updated.
Definition: sql_lex.h:2997
@ BINLOG_STMT_UNSAFE_WRITE_AUTOINC_SELECT
Query that writes to a table with auto_inc column after selecting from other tables are unsafe as the...
Definition: sql_lex.h:2961
@ BINLOG_STMT_UNSAFE_SYSTEM_TABLE
Access to log tables is unsafe because slave and master probably log different things.
Definition: sql_lex.h:2899
Query_tables_list & operator=(Query_tables_list &&)=default
@ START_SROUTINES_HASH_SIZE
Definition: sql_lex.h:2787
bool has_stored_functions
Does this LEX context have any stored functions.
Definition: sql_lex.h:2806
Table_ref * query_tables
Definition: sql_lex.h:2770
bool requires_prelocking()
Definition: sql_lex.h:2858
void chop_off_not_own_tables()
Definition: sql_lex.h:2866
Table_ref * first_not_own_table()
Definition: sql_lex.h:2863
Table_ref ** query_tables_own_last
Definition: sql_lex.h:2779
bool get_using_match()
Definition: sql_lex.h:3335
uint32 binlog_stmt_flags
Bit field indicating the type of statement.
Definition: sql_lex.h:3374
bool is_query_tables_locked() const
Definition: sql_lex.h:2822
enum_lock_tables_state
Locking state of tables in this particular statement.
Definition: sql_lex.h:2820
@ LTS_LOCKED
Definition: sql_lex.h:2820
@ LTS_NOT_LOCKED
Definition: sql_lex.h:2820
void add_to_query_tables(Table_ref *table)
Definition: sql_lex.h:2854
Common base class for n-ary set operations, including unary.
Definition: query_term.h:555
Query term tree structure.
Definition: query_term.h:216
virtual Query_block * query_block() const =0
The query_block which holds the ORDER BY and LIMIT information for this set operation.
Query_term_set_op * m_parent
Back pointer to the node whose child we are, or nullptr (root term).
Definition: query_term.h:527
virtual Query_term_type term_type() const =0
Get the node tree type.
Query_term_set_op * parent() const
Getter for m_parent, q.v.
Definition: query_term.h:423
Containing class for iterator over the query term tree.
Definition: query_term.h:824
A context for reading through a single table using a chosen access method: index read,...
Definition: row_iterator.h:82
Simple intrusive linked list.
Definition: sql_list.h:48
Base class for secondary engine execution context objects.
Definition: sql_lex.h:2600
virtual ~Secondary_engine_execution_context()=default
Destructs the secondary engine execution context object.
Abstract base class for traversing the Query_block tree.
Definition: select_lex_visitor.h:40
Context object used by semijoin equality decorrelation code.
Definition: sql_resolver.cc:2464
This class represent server options as set by the parser.
Definition: sql_servers.h:71
Representation of an SQL command.
Definition: sql_cmd.h:83
Structure that represents element in the set of stored routines used by statement or routine.
Definition: sp.h:227
Using this class is fraught with peril, and you need to be very careful when doing so.
Definition: sql_string.h:169
For each client connection we create a separate thread with THD serving as a thread/connection descri...
Definition: sql_lexer_thd.h:36
LEX * lex
Definition: sql_class.h:1006
Class representing a table function.
Definition: table_function.h:53
Definition: sql_lex.h:313
Table_ident(Query_expression *s)
This constructor is used only for the case when we create a derived table.
Definition: sql_lex.h:334
void change_db(const char *db_name)
Definition: sql_lex.h:353
Query_expression * sel
Definition: sql_lex.h:317
Table_ident(Protocol *protocol, const LEX_CSTRING &db_arg, const LEX_CSTRING &table_arg, bool force)
Definition: sql_lex.cc:159
Table_ident(const LEX_CSTRING &table_arg)
Definition: sql_lex.h:324
bool is_table_function() const
Definition: sql_lex.h:350
bool is_derived_table() const
Definition: sql_lex.h:352
Table_ident(LEX_CSTRING &table_arg, Table_function *table_func_arg)
Definition: sql_lex.h:344
LEX_CSTRING table
Definition: sql_lex.h:316
Table_function * table_function
Definition: sql_lex.h:318
LEX_CSTRING db
Definition: sql_lex.h:315
Table_ident(const LEX_CSTRING &db_arg, const LEX_CSTRING &table_arg)
Definition: sql_lex.h:322
Definition: table.h:2952
Table_ref * first_leaf_table()
Return first leaf table of a base table or a view/derived table.
Definition: table.h:3388
Table_ref * next_leaf
Definition: table.h:3889
Table_ref * next_global
Definition: table.h:3660
Used for storing information associated with generated column, default values generated from expressi...
Definition: field.h:478
Definition: visible_fields.h:98
Represents the (explicit) window of a SQL 2003 section 7.11 <window clause>, or the implicit (inlined...
Definition: window.h:110
The internal state of the syntax parser.
Definition: sql_lexer_yacc_state.h:246
Yacc_state()
Definition: sql_lexer_yacc_state.h:248
void reset()
Definition: sql_lexer_yacc_state.h:252
thr_lock_type m_lock_type
Type of lock to be used for tables being added to the statement's table list in table_factor,...
Definition: sql_lexer_yacc_state.h:321
uchar * yacc_yyvs
Bison internal semantic value stack, yyvs, when dynamically allocated using my_yyoverflow().
Definition: sql_lexer_yacc_state.h:296
enum_mdl_type m_mdl_type
The type of requested metadata lock for tables added to the statement table list.
Definition: sql_lexer_yacc_state.h:327
~Yacc_state()
Definition: sql_lexer_yacc_state.h:269
uchar * yacc_yyss
Bison internal state stack, yyss, when dynamically allocated using my_yyoverflow().
Definition: sql_lexer_yacc_state.h:290
void reset_before_substatement()
Reset part of the state which needs resetting before parsing substatement.
Definition: sql_lexer_yacc_state.h:281
uchar * yacc_yyls
Bison internal location value stack, yyls, when dynamically allocated using my_yyoverflow().
Definition: sql_lexer_yacc_state.h:302
The class hold dynamic table statistics for a table.
Definition: table_stats.h:103
void invalidate_cache(void)
Definition: table_stats.h:216
The class hold dynamic table statistics for a table.
Definition: tablespace_stats.h:64
void invalidate_cache(void)
Definition: tablespace_stats.h:111
A (partial) implementation of std::deque allocating its blocks on a MEM_ROOT.
Definition: mem_root_deque.h:111
Element_type & front()
Returns the first element in the deque.
Definition: mem_root_deque.h:256
void pop_front()
Removes the first element from the deque.
Definition: mem_root_deque.h:249
bool empty() const
Definition: mem_root_deque.h:462
Definition: partition_info.h:209
sp_head represents one instance of a stored program.
Definition: sp_head.h:389
Definition: sp_head.h:124
The class represents parse-time context, which keeps track of declared variables/parameters,...
Definition: sp_pcontext.h:252
static MEM_ROOT mem_root
Definition: client_plugin.cc:114
enum_query_type
Query type constants (usable as bitmap flags).
Definition: enum_query_type.h:31
Acl_type
Definition: sql_lex.h:268
uint to_uint(enum_sp_type val)
Definition: sql_lex.h:251
const char * index_hint_type_name[]
Definition: sql_lex.cc:139
enum_sp_data_access
Definition: sql_lex.h:209
void print_derived_column_names(const THD *thd, String *str, const Create_col_name_list *column_names)
Prints into 'str' a comma-separated list of column names, enclosed in parenthesis.
Definition: sql_lex.cc:2210
Acl_type lex_type_to_acl_type(ulong lex_type)
Definition: sql_lex.cc:5334
#define TYPE_ENUM_LIBRARY
Definition: sql_lex.h:265
bool db_is_default_db(const char *db, size_t db_len, const THD *thd)
Definition: sql_lex.cc:2937
bool check_select_for_locking_clause(THD *)
enum_sp_type acl_type_to_enum_sp_type(Acl_type type)
Definition: sql_lex.cc:5348
sub_select_type
Definition: sql_lex.h:481
#define TYPE_ENUM_PROCEDURE
Definition: sql_lex.h:262
execute_only_in_secondary_reasons
Definition: sql_lex.h:3924
enum_alter_user_attribute
Definition: sql_lex.h:299
void binlog_unsafe_map_init()
Definition: sql_lex.cc:5189
Bounds_checked_array< Item * > Ref_item_array
Definition: sql_lex.h:1148
longlong to_longlong(enum_sp_type val)
Definition: sql_lex.h:247
enum_view_create_mode
Definition: sql_lex.h:293
bool walk_join_list(mem_root_deque< Table_ref * > &list, std::function< bool(Table_ref *)> action)
Definition: sql_resolver.cc:2690
execute_only_in_hypergraph_reasons
Definition: sql_lex.h:3938
bool is_union() const
Definition: sql_lex.h:2548
#define TYPE_ENUM_INVALID
Definition: sql_lex.h:266
uint binlog_unsafe_map[256]
Definition: sql_lex.cc:5094
void lex_end(LEX *lex)
Call this function after preparation and execution of a query.
Definition: sql_lex.cc:546
enum_sp_type to_sp_type(longlong val)
Definition: sql_lex.h:239
Acl_type enum_sp_type_to_acl_type(enum_sp_type type)
Definition: sql_lex.cc:5362
enum_explain_type
Query_block type enum.
Definition: sql_lex.h:1154
#define TYPE_ENUM_FUNCTION
Definition: sql_lex.h:261
const LEX_STRING null_lex_str
LEX_STRING constant for null-string to be used in parser and other places.
Definition: sql_lex.cc:95
enum_sp_type
enum_sp_type defines type codes of stored programs.
Definition: sql_lex.h:226
void lex_free(void)
Definition: sql_lex.cc:168
bool is_set_operation() const
Definition: sql_lex.h:2555
constexpr const int MAX_SELECT_NESTING
Definition: sql_lex.h:141
void trim_whitespace(const CHARSET_INFO *cs, LEX_STRING *str)
Definition: sql_lex.cc:2179
bool is_lex_native_function(const LEX_STRING *name)
Check if name is a sql function.
Definition: sql_lex.cc:980
uchar index_clause_map
Definition: sql_lex.h:492
int my_sql_parser_lex(MY_SQL_PARSER_STYPE *, POS *, class THD *)
yylex() function implementation for the main parser
Definition: sql_lex.cc:1381
enum_sp_suid_behaviour
Definition: sql_lex.h:203
const size_t INITIAL_LEX_PLUGIN_LIST_SIZE
Definition: sql_lex.h:140
bool is_keyword(const char *name, size_t len)
Definition: sql_lex.cc:965
const LEX_CSTRING sp_data_access_name[]
Definition: sql_lex.h:282
enum_keep_diagnostics
Definition: sql_lex.h:195
bool lex_start(THD *thd)
Call lex_start() before every query that is to be prepared and executed.
Definition: sql_lex.cc:522
struct struct_replica_connection LEX_REPLICA_CONNECTION
@ SP_READS_SQL_DATA
Definition: sql_lex.h:213
@ SP_MODIFIES_SQL_DATA
Definition: sql_lex.h:214
@ SP_NO_SQL
Definition: sql_lex.h:212
@ SP_DEFAULT_ACCESS
Definition: sql_lex.h:210
@ SP_CONTAINS_SQL
Definition: sql_lex.h:211
@ UNSPECIFIED_TYPE
Definition: sql_lex.h:482
@ DERIVED_TABLE_TYPE
Definition: sql_lex.h:484
@ GLOBAL_OPTIONS_TYPE
Definition: sql_lex.h:483
@ TABLESAMPLE
Definition: sql_lex.h:3927
@ OUTFILE_OBJECT_STORE
Definition: sql_lex.h:3928
@ SUPPORTED_IN_PRIMARY
Definition: sql_lex.h:3925
@ GROUPING_SETS
Definition: sql_lex.h:3931
@ CUBE
Definition: sql_lex.h:3926
@ TEMPORARY_TABLE_USAGE
Definition: sql_lex.h:3930
@ TEMPORARY_TABLE_CREATION
Definition: sql_lex.h:3929
@ QUALIFY_CLAUSE
Definition: sql_lex.h:3940
@ SUPPORTED_IN_BOTH_OPTIMIZERS
Definition: sql_lex.h:3939
@ EXPLAIN_total
fake type, total number of all valid types
@ NO_COMMENT
Not parsing comments.
Definition: sql_lex.h:3416
@ DISCARD_COMMENT
Parsing comments that need to be discarded.
Definition: sql_lex.h:3432
@ PRESERVE_COMMENT
Parsing comments that need to be preserved.
Definition: sql_lex.h:3423
@ SP_IS_SUID
Definition: sql_lex.h:206
@ SP_IS_DEFAULT_SUID
Definition: sql_lex.h:204
@ SP_IS_NOT_SUID
Definition: sql_lex.h:205
@ DA_KEEP_UNSPECIFIED
keep semantics is unspecified
Definition: sql_lex.h:200
@ DA_KEEP_DIAGNOSTICS
keep the diagnostics area
Definition: sql_lex.h:197
@ DA_KEEP_PARSE_ERROR
keep diagnostics area after parse error
Definition: sql_lex.h:199
@ DA_KEEP_COUNTS
keep @warning_count / @error_count
Definition: sql_lex.h:198
@ DA_KEEP_NOTHING
keep nothing
Definition: sql_lex.h:196
void my_error(int nr, myf MyFlags,...)
Fill in and print a previously registered error message.
Definition: my_error.cc:217
char * strmake_root(MEM_ROOT *root, const char *str, size_t len)
Definition: my_alloc.cc:287
bool change_query_result(THD *thd, Query_result_interceptor *new_result, Query_result_interceptor *old_result)
Change the Query_result object of the query block.
Definition: sql_select.cc:4285
bool optimize(THD *thd, bool finalize_access_paths)
Optimize a query block and all inner query expressions.
Definition: sql_select.cc:2126
bool check_column_privileges(THD *thd)
Check privileges for all columns referenced from query block.
Definition: sql_select.cc:2168
bool check_privileges_for_subqueries(THD *thd)
Check privileges for column references in subqueries of a query block.
Definition: sql_select.cc:2273
bool transform_scalar_subqueries_to_join_with_derived(THD *thd)
Transform eligible scalar subqueries in the SELECT list, WHERE condition, HAVING condition or JOIN co...
Definition: sql_resolver.cc:8808
Item * single_visible_field() const
Definition: sql_resolver.cc:4920
bool remove_redundant_subquery_clauses(THD *thd)
For a table subquery predicate (IN/ANY/ALL/EXISTS/etc): since it does not support LIMIT the following...
Definition: sql_resolver.cc:4024
void delete_unused_merged_columns(mem_root_deque< Table_ref * > *tables)
Delete unused columns from merged tables.
Definition: sql_resolver.cc:5324
bool check_only_full_group_by(THD *thd)
Runs checks mandated by ONLY_FULL_GROUP_BY.
Definition: sql_resolver.cc:4553
void clear_sj_expressions(NESTED_JOIN *nested_join)
Remove semijoin condition for this query block.
Definition: sql_resolver.cc:2308
bool apply_local_transforms(THD *thd, bool prune)
Does permanent transformations which are local to a query block (which do not merge it to another blo...
Definition: sql_resolver.cc:842
void replace_referenced_item(Item *const old_item, Item *const new_item)
Replace item in select list and preserve its reference count.
Definition: sql_resolver.cc:8255
bool record_join_nest_info(mem_root_deque< Table_ref * > *tables)
Record join nest info in the select block.
Definition: sql_resolver.cc:2080
bool replace_first_item_with_min_max(THD *thd, int item_no, bool use_min)
Replace the first visible item in the select list with a wrapping MIN or MAX aggregate function.
Definition: sql_resolver.cc:7764
bool limit_offset_preserves_first_row() const
Check if the LIMIT/OFFSET clause is specified in a way that makes it always preserve the first row re...
Definition: sql_resolver.cc:1468
void fix_after_pullout(Query_block *parent_query_block, Query_block *removed_query_block)
Definition: sql_resolver.cc:2267
bool transform_grouped_to_derived(THD *thd, bool *break_off)
Minion of transform_scalar_subqueries_to_join_with_derived.
Definition: sql_resolver.cc:6667
bool decorrelate_condition(Semijoin_decorrelation &sj_decor, Table_ref *join_nest)
Decorrelate the WHERE clause or a join condition of a subquery used in an IN or EXISTS predicate.
Definition: sql_resolver.cc:2645
bool setup_conds(THD *thd)
Resolve WHERE condition and join conditions.
Definition: sql_resolver.cc:1547
bool add_ftfunc_list(List< Item_func_match > *ftfuncs)
Add full-text function elements from a list into this query block.
Definition: sql_resolver.cc:3961
bool setup_join_cond(THD *thd, mem_root_deque< Table_ref * > *tables, bool in_update)
Resolve join conditions for a join nest.
Definition: sql_resolver.cc:1608
void remove_hidden_items()
Remove hidden items from select list.
Definition: sql_resolver.cc:5368
void remap_tables(THD *thd)
Re-map table numbers for all tables in a query block.
Definition: sql_resolver.cc:1377
void repoint_contexts_of_join_nests(mem_root_deque< Table_ref * > join_list)
Go through a list of tables and join nests, recursively, and repoint its query_block pointer.
Definition: sql_resolver.cc:3976
void prune_sj_exprs(Item_func_eq *item, mem_root_deque< Table_ref * > *nest)
Recursively look for removed item inside any nested joins' sj_{inner,outer}_exprs.
Definition: sql_resolver.cc:5303
void propagate_unique_test_exclusion()
Propagate exclusion from table uniqueness test into subqueries.
Definition: sql_resolver.cc:3943
void mark_item_as_maybe_null_if_non_primitive_grouped(Item *item) const
Marks occurrences of group by fields in a function's arguments as nullable, so that we do not optimiz...
Definition: sql_resolver.cc:4906
bool convert_subquery_to_semijoin(THD *thd, Item_exists_subselect *subq_pred)
Convert a subquery predicate of this query block into a Table_ref semi-join nest.
Definition: sql_resolver.cc:2870
void fix_after_pullout(Query_block *parent_query_block, Query_block *removed_query_block)
Fix used tables information for a subquery after query transformations.
Definition: sql_resolver.cc:2253
bool lift_fulltext_from_having_to_select_list(THD *thd)
Copies all non-aggregated calls to the full-text search MATCH function from the HAVING clause to the ...
Definition: sql_resolver.cc:9082
bool setup_wild(THD *thd)
Expand all '*' in list of expressions with the matching column references.
Definition: sql_resolver.cc:1490
bool add_inner_func_calls_to_select_list(THD *thd, Lifted_expressions_map *lifted_exprs)
Definition: sql_resolver.cc:7674
bool remove_aggregates(THD *thd, Query_block *select)
A minion of transform_grouped_to_derived.
Definition: sql_resolver.cc:6472
bool prepare_values(THD *thd)
Prepare a table value constructor query block for optimization.
Definition: sql_resolver.cc:760
bool resolve_placeholder_tables(THD *thd, bool apply_semijoin)
Resolve derived table, view, table function information for a query block.
Definition: sql_resolver.cc:1410
bool simplify_joins(THD *thd, mem_root_deque< Table_ref * > *join_list, bool top, bool in_sj, Item **new_conds, uint *changelog=nullptr)
Simplify joins replacing outer joins by inner joins whenever it's possible.
Definition: sql_resolver.cc:1797
void update_used_tables()
Update used tables information for all local expressions.
Definition: sql_resolver.cc:952
bool resolve_limits(THD *thd)
Resolve OFFSET and LIMIT clauses.
Definition: sql_resolver.cc:1005
int group_list_size() const
Definition: sql_resolver.cc:4719
bool empty_order_list(Query_block *sl)
Empty the ORDER list.
Definition: sql_resolver.cc:4123
bool prepare(THD *thd, mem_root_deque< Item * > *insert_field_list)
Prepare query block for optimization.
Definition: sql_resolver.cc:184
void reset_nj_counters(mem_root_deque< Table_ref * > *join_list=nullptr)
Set NESTED_JOIN::counter=0 in all nested joins in passed list.
Definition: sql_resolver.cc:1664
bool check_view_privileges(THD *thd, Access_bitmask want_privilege_first, Access_bitmask want_privilege_next)
Check privileges for views that are merged into query block.
Definition: sql_resolver.cc:1244
bool add_inner_fields_to_select_list(THD *thd, Lifted_expressions_map *lifted_exprs, Item *selected_field_or_ref, const uint first_non_hidden)
Minion of decorrelate_derived_scalar_subquery_pre.
Definition: sql_resolver.cc:7614
bool resolve_rollup_wfs(THD *thd)
Replace group by field references inside window functions with references in the presence of ROLLUP.
Definition: sql_resolver.cc:5167
bool field_list_is_empty() const
Definition: sql_resolver.cc:4936
Item ** add_hidden_item(Item *item)
Add item to the hidden part of select list.
Definition: sql_resolver.cc:5359
void merge_contexts(Query_block *inner)
Merge name resolution context objects of a subquery into its parent.
Definition: sql_resolver.cc:3993
bool add_inner_exprs_to_group_by(THD *thd, List_iterator< Item > &inner_exprs, Item *selected_item, bool *selected_expr_added_to_group_by, mem_root_deque< Item * > *exprs_added_to_group_by)
Run through the inner expressions and add them to the block's GROUP BY if not already present.
Definition: sql_resolver.cc:7559
bool transform_table_subquery_to_join_with_derived(THD *thd, Item_exists_subselect *subq_pred)
Replace a table subquery ([NOT] {IN, EXISTS}, $cmp$ ALL, $cmp$ ANY) with a join to a derived table.
Definition: sql_resolver.cc:5510
bool flatten_subqueries(THD *thd)
Convert semi-join subquery predicates into semi-join join nests.
Definition: sql_resolver.cc:3706
bool replace_subquery_in_expr(THD *thd, Item::Css_info *subquery, Table_ref *tr, Item **expr)
A minion of transform_scalar_subqueries_to_join_with_derived.
Definition: sql_resolver.cc:7175
size_t num_visible_fields() const
Definition: sql_resolver.cc:4932
ORDER * find_in_group_list(Item *item, int *rollup_level) const
Finds a group expression matching the given item, or nullptr if none.
Definition: sql_resolver.cc:4683
bool resolve_table_value_constructor_values(THD *thd)
Resolve the rows of a table value constructor and aggregate the type of each column across rows.
Definition: sql_resolver.cc:5384
bool merge_derived(THD *thd, Table_ref *derived_table)
Merge derived table into query block.
Definition: sql_resolver.cc:3333
bool setup_tables(THD *thd, Table_ref *tables, bool select_insert)
Resolve and prepare information about tables for one query block.
Definition: sql_resolver.cc:1281
bool supported_correlated_scalar_subquery(THD *thd, Item::Css_info *subquery, Item **lifted_where)
Called when the scalar subquery is correlated.
Definition: sql_resolver.cc:8542
bool replace_item_in_expression(Item **expr, bool was_hidden, Item::Item_replacement *info, Item_transformer transformer)
Minion of transform_grouped_to_derived.
Definition: sql_resolver.cc:6589
bool setup_order_final(THD *thd)
Do final setup of ORDER BY clause, after the query block is fully resolved.
Definition: sql_resolver.cc:4587
bool setup_counts_over_partitions(THD *thd, Table_ref *derived, Lifted_expressions_map *lifted_expressions, mem_root_deque< Item * > &exprs_added_to_group_by, uint hidden_fields)
Add all COUNT(0) to SELECT list of the derived table to be used for cardinality checking of the trans...
Definition: sql_resolver.cc:7462
bool nest_derived(THD *thd, Item *join_cond, mem_root_deque< Table_ref * > *join_list, Table_ref *new_derived_table)
Push the generated derived table to the correct location inside a join nest.
Definition: sql_resolver.cc:7328
bool decorrelate_derived_scalar_subquery_post(THD *thd, Table_ref *derived, Lifted_expressions_map *lifted_exprs, bool added_card_check, size_t added_window_card_checks)
See explanation in companion method decorrelate_derived_scalar_subquery_pre.
Definition: sql_resolver.cc:8180
bool setup_group(THD *thd)
Resolve and set up the GROUP BY list.
Definition: sql_resolver.cc:4634
Table_ref * synthesize_derived(THD *thd, Query_expression *unit, Item *join_cond, bool left_outer, bool use_inner_join)
Create a new Table_ref object for this query block, for either: 1) a derived table which will replace...
Definition: sql_resolver.cc:6376
bool decorrelate_derived_scalar_subquery_pre(THD *thd, Table_ref *derived, Item::Css_info *subquery, Item *lifted_where, Lifted_expressions_map *lifted_where_expressions, bool *added_card_check, size_t *added_window_card_checks)
We have a correlated scalar subquery, so we must do several things:
Definition: sql_resolver.cc:7854
bool push_conditions_to_derived_tables(THD *thd)
Pushes parts of the WHERE condition of this query block to materialized derived tables.
Definition: sql_resolver.cc:711
bool resolve_rollup(THD *thd)
Resolve items in SELECT list and ORDER BY list for rollup processing.
Definition: sql_resolver.cc:5072
bool has_wfs()
Definition: sql_resolver.cc:4727
bool transform_subquery_to_derived(THD *thd, Table_ref **out_tl, Query_expression *subs_query_expression, Item_subselect *subq, bool use_inner_join, bool reject_multiple_rows, Item::Css_info *subquery, Item *lifted_where_cond)
Converts a subquery to a derived table and inserts it into the FROM clause of the owning query block.
Definition: sql_resolver.cc:8287
bool build_sj_cond(THD *thd, NESTED_JOIN *nested_join, Query_block *subq_query_block, table_map outer_tables_map, Item **sj_cond, bool *simple_const)
Build semijoin condition for th query block.
Definition: sql_resolver.cc:2334
Item * resolve_rollup_item(THD *thd, Item *item)
Resolve an item (and its tree) for rollup processing by replacing items matching grouped expressions ...
Definition: sql_resolver.cc:4982
bool add_joined_table(Table_ref *table)
Add a table to the current join list.
Definition: sql_parse.cc:6416
void set_lock_for_tables(thr_lock_type lock_type)
Set lock for all tables in current query block.
Definition: sql_parse.cc:6447
bool find_common_table_expr(THD *thd, Table_ident *table_id, Table_ref *tl, Parse_context *pc, bool *found)
Tries to match an identifier to the CTEs in scope; if matched, it modifies *table_name,...
Definition: sql_parse.cc:5830
Table_ref * end_nested_join()
End a nested join table list.
Definition: sql_parse.cc:6331
bool init_nested_join(THD *thd)
Initialize a new table list for a nested join.
Definition: sql_parse.cc:6304
Table_ref * nest_join(THD *thd, Query_block *select, Table_ref *embedding, mem_root_deque< Table_ref * > *jlist, size_t table_cnt, const char *legend)
Plumbing for nest_last_join, q.v.
Definition: sql_parse.cc:6358
Table_ref * add_table_to_list(THD *thd, Table_ident *table, const char *alias, ulong table_options, thr_lock_type flags=TL_UNLOCK, enum_mdl_type mdl_type=MDL_SHARED_READ, List< Index_hint > *hints=nullptr, List< String > *partition_names=nullptr, LEX_STRING *option=nullptr, Parse_context *pc=nullptr)
Add a table to list of used tables.
Definition: sql_parse.cc:6041
void set_lock_for_table(const Lock_descriptor &descriptor, Table_ref *table)
Definition: sql_parse.cc:6424
Table_ref * nest_last_join(THD *thd, size_t table_cnt=2)
Nest last join operations.
Definition: sql_parse.cc:6398
struct PSI_digest_locker PSI_digest_locker
Definition: psi_statement_bits.h:112
static int flags[50]
Definition: hp_test1.cc:40
static int flag
Definition: hp_test1.cc:40
static void start(mysql_harness::PluginFuncEnv *env)
Definition: http_auth_backend_plugin.cc:180
Item *(Item::* Item_transformer)(uchar *arg)
Type for transformers used by Item::transform and Item::compile.
Definition: item.h:719
Subquery_strategy
Classes that represent predicates over table subqueries: [NOT] EXISTS, [NOT] IN, ANY/SOME and ALL.
Definition: item_subselect.h:438
#define T
Definition: jit_executor_value.cc:373
constexpr const LEX_CSTRING EMPTY_CSTR
Definition: lex_string.h:49
constexpr const LEX_CSTRING NULL_CSTR
Definition: lex_string.h:48
A better implementation of the UNIX ctype(3) library.
Various macros useful for communicating with memory debuggers, such as Valgrind.
void TRASH(void *ptr, size_t length)
Put bad content in memory to be sure it will segfault if dereferenced.
Definition: memory_debugging.h:71
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:480
This file includes constants used by all storage engines.
my_off_t ha_rows
Definition: my_base.h:1228
Header for compiler-dependent features.
#define MY_ASSERT_UNREACHABLE()
Definition: my_compiler.h:78
#define DBUG_EXECUTE_IF(keyword, a1)
Definition: my_dbug.h:171
#define DBUG_PRINT(keyword, arglist)
Definition: my_dbug.h:181
#define DBUG_TRACE
Definition: my_dbug.h:146
Some integer typedefs for easier portability.
unsigned long long int ulonglong
Definition: my_inttypes.h:56
uint8_t uint8
Definition: my_inttypes.h:63
unsigned char uchar
Definition: my_inttypes.h:52
long long int longlong
Definition: my_inttypes.h:55
#define MYF(v)
Definition: my_inttypes.h:97
uint32_t uint32
Definition: my_inttypes.h:67
void my_free(void *ptr)
Frees the memory pointed by the ptr.
Definition: my_memory.cc:81
enum_sql_command
Definition: my_sqlcommand.h:46
@ SQLCOM_UPDATE
Definition: my_sqlcommand.h:51
@ SQLCOM_LOAD
Definition: my_sqlcommand.h:77
@ SQLCOM_INSERT
Definition: my_sqlcommand.h:52
@ SQLCOM_INSERT_SELECT
Definition: my_sqlcommand.h:53
@ SQLCOM_REPLACE
Definition: my_sqlcommand.h:87
@ SQLCOM_UPDATE_MULTI
Definition: my_sqlcommand.h:122
@ SQLCOM_REPLACE_SELECT
Definition: my_sqlcommand.h:88
Common header for many mysys elements.
uint64_t nesting_map
Definition: my_table_map.h:31
uint64_t table_map
Definition: my_table_map.h:30
uint32 my_thread_id
Definition: my_thread_local.h:34
static bool backup
Definition: myisampack.cc:198
static bool column_names
Definition: mysql.cc:174
static const CHARSET_INFO * charset_info
Definition: mysql.cc:249
Common definition between mysql server & client.
char * octet2hex(char *to, const char *str, unsigned int len)
static char * where
Definition: mysqldump.cc:153
const char * collation
Definition: audit_api_message_emit.cc:184
std::string str(const mysqlrouter::ConfigGenerator::Options::Endpoint &ep)
Definition: config_generator.cc:1077
static PFS_engine_table_share_proxy table
Definition: pfs.cc:61
Definition: buf0block_hint.cc:30
Definition: commit_order_queue.h:34
bool length(const dd::Spatial_reference_system *srs, const Geometry *g1, double *length, bool *null) noexcept
Computes the length of linestrings and multilinestrings.
Definition: length.cc:76
Container::const_iterator find(const Container &c, Value &&value)
Definition: generic.h:39
void destroy_content_tree(Content_tree_node *root)
Deletes the content tree for given JSON duality view.
Definition: content_tree.cc:389
ValueType value(const std::optional< ValueType > &v)
Definition: gtid.h:83
size_t size(const char *const c)
Definition: base64.h:46
Definition: options.cc:57
const char * db_name
Definition: rules_table_service.cc:55
std::basic_ostringstream< char, std::char_traits< char >, ut::allocator< char > > ostringstream
Specialization of basic_ostringstream which uses ut::allocator.
Definition: ut0new.h:2876
std::map< Key, Value, Compare, ut::allocator< std::pair< const Key, Value > > > map
Specialization of map which uses ut_allocator.
Definition: ut0new.h:2898
std::list< T, ut::allocator< T > > list
Specialization of list which uses ut_allocator.
Definition: ut0new.h:2884
olap_type
Definition: olap.h:31
@ UNSPECIFIED_OLAP_TYPE
Definition: olap.h:32
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
#define UNCACHEABLE_DEPENDENT
Definition: parse_tree_node_base.h:50
enum_yes_no_unknown
Definition: parser_yystype.h:173
struct result result
Definition: result.h:34
Performance schema instrumentation interface.
#define SELECT_DISTINCT
Definition: query_options.h:52
#define OPTION_NO_CONST_TABLES
Definition: query_options.h:78
Query_term_type
This class hierarchy is used to represent SQL structures between <query expression> and <query specif...
Definition: query_term.h:96
@ QT_UNARY
Represents a query primary with parentesized query expression body with order by clause and/or limit/...
Definition: query_term.h:103
@ QT_EXCEPT
Definition: query_term.h:107
@ QT_UNION
Definition: query_term.h:108
@ QT_INTERSECT
Represents the three set operations.
Definition: query_term.h:106
@ QT_QUERY_BLOCK
Represents Query specification, table value constructor and explicit table.
Definition: query_term.h:99
Visit_leaves
Query term iterator template argument type: whether to visit leaf nodes.
Definition: query_term.h:114
@ VL_VISIT_LEAVES
Definition: query_term.h:114
Visit_order
Query term iterator template argument type: how to visit nodes in tree.
Definition: query_term.h:112
@ QTC_POST_ORDER
Definition: query_term.h:112
required string type
Definition: replication_group_member_actions.proto:34
repeated Action action
Definition: replication_group_member_actions.proto:43
"public" interface to sys_var - server configuration variables.
enum_var_type
Definition: set_var.h:92
enum_tx_isolation
Definition: handler.h:3344
@ ISO_REPEATABLE_READ
Definition: handler.h:3347
enum_view_type
Definition: table.h:2632
index_hint_type
Definition: table.h:1441
role_enum
Definition: sql_admin.h:255
my_lex_states
Definition: sql_chars.h:37
File containing constants that can be used throughout the server.
constexpr const uint8_t CONTEXT_ANALYSIS_ONLY_PREPARE
Don't evaluate this subquery during statement prepare even if it's a constant one.
Definition: sql_const.h:174
enum_walk
Enumeration for {Item,Query_block[_UNIT],Table_function}walk.
Definition: sql_const.h:289
bool(Item::*)(unsigned char *) Item_processor
Processor type for {Item,Query_block[_UNIT],Table_function}walk.
Definition: sql_const.h:307
constexpr const uint8_t CONTEXT_ANALYSIS_ONLY_VIEW
Special Query_block::prepare mode: changing of query is prohibited.
Definition: sql_const.h:182
enum_condition_context
Enumeration for Query_block::condition_context.
Definition: sql_const.h:313
Contains classes representing SQL-data change statements.
enum_duplicates
Definition: sql_data_change.h:48
bool walk_item(Item *item, Select_lex_visitor *visitor)
Definition: sql_lex.cc:3573
#define IL_GTE_REPEATABLE
Definition: sql_lex.h:3234
void get_select_options_str(ulonglong options, std::string *str)
Definition: sql_lex.cc:5312
#define TRX_CACHE_EMPTY
Definition: sql_lex.h:3228
#define IL_LT_REPEATABLE
Definition: sql_lex.h:3232
void assert_consistent_hidden_flags(const mem_root_deque< Item * > &fields, Item *item, bool hidden)
In debug mode, verify that we're not adding an item twice to the fields list with inconsistent hidden...
Definition: sql_lex.h:5230
#define BINLOG_DIRECT_OFF
Definition: sql_lex.h:3225
bool WalkQueryExpression(Query_expression *query_expr, enum_walk walk, T &&functor)
Definition: sql_lex.h:5268
#define BINLOG_DIRECT_ON
Definition: sql_lex.h:3222
bool is_invalid_string(const LEX_CSTRING &string_val, const CHARSET_INFO *charset_info)
(End of group GROUP_PARSER)
Definition: sql_lex.h:5177
bool accept_for_order(SQL_I_List< ORDER > orders, Select_lex_visitor *visitor)
Definition: sql_lex.cc:3579
#define TRX_CACHE_NOT_EMPTY
Definition: sql_lex.h:3230
bool accept_for_join(mem_root_deque< Table_ref * > *tables, Select_lex_visitor *visitor)
Definition: sql_lex.cc:3601
bool accept_table(Table_ref *t, Select_lex_visitor *visitor)
Definition: sql_lex.cc:3609
enum_comment_state
The state of the lexical parser, when parsing comments.
Definition: sql_lexer_input_stream.h:47
enum_mdl_type
Type of metadata lock request.
Definition: sql_lexer_yacc_state.h:106
@ MDL_SHARED_READ
Definition: sql_lexer_yacc_state.h:169
static const Query_options options
Definition: sql_show_processlist.cc:69
Our own string classes, used pervasively throughout the executor.
size_t convert_to_printable(char *to, size_t to_len, const char *from, size_t from_len, const CHARSET_INFO *from_cs, size_t nbytes=0)
Convert string to printable ASCII string.
Definition: sql_string.cc:1025
bool validate_string(const CHARSET_INFO *cs, const char *str, size_t length, size_t *valid_length, bool *length_error)
Check if an input byte sequence is a valid character string of a given charset.
Definition: sql_string.cc:1131
case opt name
Definition: sslopt-case.h:29
#define STRING_WITH_LEN(X)
Definition: string_with_len.h:29
Access paths are a query planning structure that correspond 1:1 to iterators, in that an access path ...
Definition: access_path.h:238
Definition: m_ctype.h:421
const char * csname
Definition: m_ctype.h:426
Definition: handler.h:3967
Struct to hold information about the table that should be created.
Definition: handler.h:3360
Minion class under Collect_scalar_subquery_info ("Css").
Definition: item.h:3002
Definition: item.h:3258
Definition: table.h:2775
Definition: sql_lex.h:477
bool all
Definition: sql_lex.h:478
Structure to hold parameters for CHANGE REPLICATION SOURCE, START REPLICA, and STOP REPLICA.
Definition: sql_lex.h:370
void initialize()
Initializes everything to zero/NULL/empty.
Definition: sql_lex.cc:5052
enum LEX_SOURCE_INFO::@186 require_table_primary_key_check
Identifies what is the slave policy on primary keys in tables.
uint port
Definition: sql_lex.h:379
enum LEX_SOURCE_INFO::@185 port_opt
const char * channel
Definition: sql_lex.h:386
bool replica_until
Definition: sql_lex.h:392
char * bind_addr
Definition: sql_lex.h:378
enum LEX_SOURCE_INFO::@185 auto_position
char * network_namespace
Definition: sql_lex.h:378
enum LEX_SOURCE_INFO::@185 get_public_key
char * ssl_crl
Definition: sql_lex.h:408
char * public_key_path
Definition: sql_lex.h:419
char * view_id
Definition: sql_lex.h:385
ulong relay_log_pos
Definition: sql_lex.h:421
char * tls_version
Definition: sql_lex.h:408
enum LEX_SOURCE_INFO::@185 m_gtid_only
enum LEX_SOURCE_INFO::@184 gtid_until_condition
char * relay_log_name
Definition: sql_lex.h:420
int sql_delay
Definition: sql_lex.h:381
float heartbeat_period
Definition: sql_lex.h:380
char * tls_ciphersuites_string
Definition: sql_lex.h:418
ulong server_id
Definition: sql_lex.h:383
ulong retry_count
Definition: sql_lex.h:383
char * ssl_ca
Definition: sql_lex.h:407
ulonglong pos
Definition: sql_lex.h:382
uint connect_retry
Definition: sql_lex.h:379
LEX_SOURCE_INFO & operator=(const LEX_SOURCE_INFO &)
char * ssl_cert
Definition: sql_lex.h:407
Prealloced_array< ulong, 2 > repl_ignore_server_ids
Definition: sql_lex.h:424
enum LEX_SOURCE_INFO::@185 retry_count_opt
@ LEX_MI_PK_CHECK_OFF
Definition: sql_lex.h:453
@ LEX_MI_PK_CHECK_STREAM
Definition: sql_lex.h:451
@ LEX_MI_PK_CHECK_UNCHANGED
Definition: sql_lex.h:450
@ LEX_MI_PK_CHECK_ON
Definition: sql_lex.h:452
@ LEX_MI_PK_CHECK_GENERATE
Definition: sql_lex.h:454
char * ssl_key
Definition: sql_lex.h:407
@ LEX_MI_UNCHANGED
Definition: sql_lex.h:400
@ LEX_MI_DISABLE
Definition: sql_lex.h:401
@ LEX_MI_ENABLE
Definition: sql_lex.h:402
enum LEX_SOURCE_INFO::@185 m_source_connection_auto_failover
void set_unspecified()
Sets all fields to their "unspecified" value.
Definition: sql_lex.cc:5089
char * user
Definition: sql_lex.h:378
int require_row_format
Flag indicating if row format should be enforced for this channel event stream.
Definition: sql_lex.h:439
uint zstd_compression_level
Definition: sql_lex.h:423
@ UNTIL_SQL_AFTER_GTIDS
Definition: sql_lex.h:389
@ UNTIL_SQL_BEFORE_GTIDS
Definition: sql_lex.h:388
char * log_file_name
Definition: sql_lex.h:378
enum_tls_ciphersuites
Definition: sql_lex.h:412
@ SPECIFIED_NULL
Definition: sql_lex.h:414
@ SPECIFIED_STRING
Definition: sql_lex.h:415
@ UNSPECIFIED
Definition: sql_lex.h:413
char * password
Definition: sql_lex.h:378
enum LEX_SOURCE_INFO::@185 repl_ignore_server_ids_opt
const char * privilege_checks_hostname
Definition: sql_lex.h:434
char * host
Definition: sql_lex.h:378
char * compression_algorithm
Definition: sql_lex.h:422
bool privilege_checks_none
Flag that is set to true whenever PRIVILEGE_CHECKS_USER is set to NULL as a part of a CHANGE REPLICAT...
Definition: sql_lex.h:429
enum LEX_SOURCE_INFO::@185 ssl
char * ssl_cipher
Definition: sql_lex.h:407
enum enum_tls_ciphersuites tls_ciphersuites
Definition: sql_lex.h:417
enum LEX_SOURCE_INFO::@187 assign_gtids_to_anonymous_transactions_type
char * gtid
Definition: sql_lex.h:384
@ LEX_MI_ANONYMOUS_TO_GTID_UUID
Definition: sql_lex.h:461
@ LEX_MI_ANONYMOUS_TO_GTID_LOCAL
Definition: sql_lex.h:460
@ LEX_MI_ANONYMOUS_TO_GTID_UNCHANGED
Definition: sql_lex.h:458
@ LEX_MI_ANONYMOUS_TO_GTID_OFF
Definition: sql_lex.h:459
LEX_SOURCE_INFO()
Definition: sql_lex.h:375
bool until_after_gaps
Definition: sql_lex.h:391
LEX_SOURCE_INFO(const LEX_SOURCE_INFO &)
enum LEX_SOURCE_INFO::@185 ssl_verify_server_cert
const char * assign_gtids_to_anonymous_transactions_manual_uuid
Definition: sql_lex.h:464
char * ssl_crlpath
Definition: sql_lex.h:408
bool for_channel
Definition: sql_lex.h:393
enum LEX_SOURCE_INFO::@185 heartbeat_opt
char * ssl_capath
Definition: sql_lex.h:407
const char * privilege_checks_username
Username and hostname parts of the PRIVILEGE_CHECKS_USER, when it's set to a user.
Definition: sql_lex.h:434
Definition: table.h:2819
The LEX object currently serves three different purposes:
Definition: sql_lex.h:3995
bool export_result_to_object_storage() const
Definition: sql_lex.h:4189
execute_only_in_secondary_reasons get_not_supported_in_primary_reason() const
Definition: sql_lex.h:4216
void set_uncacheable(Query_block *curr_query_block, uint8 cause)
Set the current query as uncacheable.
Definition: sql_lex.h:4727
LEX_USER * grant_user
Definition: sql_lex.h:4110
bool binlog_need_explicit_defaults_ts
Definition: sql_lex.h:4644
uint grant_tot_col
Definition: sql_lex.h:4363
LEX_STRING prepared_stmt_code
Definition: sql_lex.h:4437
const char * x509_issuer
Definition: sql_lex.h:4103
bool all_privileges
Definition: sql_lex.h:4445
bool is_exec_started() const
Definition: sql_lex.h:4541
bool use_only_table_context
During name resolution search only in the table list given by Name_resolution_context::first_name_res...
Definition: sql_lex.h:4629
bool ignore_unknown_user
refers to optional IGNORE UNKNOWN USER clause in REVOKE sql.
Definition: sql_lex.h:4398
std::vector< uint > reparse_derived_table_params_at
If currently re-parsing a condition that is being pushed down to a derived table, this has the positi...
Definition: sql_lex.h:4352
void restore_backup_query_tables_list(Query_tables_list *backup)
Definition: sql_lex.cc:4366
execute_only_in_secondary_reasons m_execute_only_in_secondary_engine_reason
Definition: sql_lex.h:4012
uint8 create_view_check
Definition: sql_lex.h:4374
Prealloced_array< plugin_ref, INITIAL_LEX_PLUGIN_LIST_SIZE > Plugins_array
Definition: sql_lex.h:4122
bool new_top_level_query()
Create top-level query expression and query block.
Definition: sql_lex.cc:790
bool need_correct_ident()
Definition: sql_lex.cc:3858
execute_only_in_hypergraph_reasons m_execute_only_in_hypergraph_reason
Definition: sql_lex.h:4020
bool can_execute_only_in_hypergraph_optimizer() const
Definition: sql_lex.h:4239
LEX_ALTER alter_password
Definition: sql_lex.h:4111
bool m_broken
see mark_broken()
Definition: sql_lex.h:4451
const char * ssl_cipher
Definition: sql_lex.h:4103
bool table_or_sp_used()
Definition: sql_lex.cc:4382
Query_block * new_set_operation_query(Query_block *curr_query_block)
Create query block and attach it to the current query expression.
Definition: sql_lex.cc:714
void first_lists_tables_same()
Definition: sql_lex.cc:4256
bool validate_use_in_old_optimizer()
Validates if a query can run with the old optimizer.
Definition: sql_lex.cc:5290
Secondary_engine_execution_context * m_secondary_engine_context
Context object used by secondary storage engines to store query state during optimization and executi...
Definition: sql_lex.h:4847
bool was_replication_command_executed() const
Definition: sql_lex.h:4881
LEX_CSTRING prepared_stmt_name
Definition: sql_lex.h:4432
List< Name_resolution_context > context_stack
Definition: sql_lex.h:4285
bool autocommit
Definition: sql_lex.h:4400
Table_ref * insert_table
Table being inserted into (may be a view)
Definition: sql_lex.h:4126
void destroy()
Destroy contained objects, but not the LEX object itself.
Definition: sql_lex.h:4657
Query_result * result
Definition: sql_lex.h:4106
void destroy_values_map()
Definition: sql_lex.h:4176
void set_was_replication_command_executed()
Definition: sql_lex.h:4885
void set_current_query_block(Query_block *select)
Definition: sql_lex.h:4035
uint start_transaction_opt
Definition: sql_lex.h:4371
void new_static_query(Query_expression *sel_query_expression, Query_block *select)
Create query expression and query block in existing memory objects.
Definition: sql_lex.cc:822
bool deny_window_function(Query_block *qb) const
We have detected the presence of an alias of a window function with a window on query block qb.
Definition: sql_lex.h:4592
HA_CHECK_OPT check_opt
Definition: sql_lex.h:4289
bool drop_if_exists
Definition: sql_lex.h:4385
Table_ref * unlink_first_table(bool *link_to_local)
Definition: sql_lex.cc:4206
bool is_metadata_used() const
Check if the current statement uses meta-data (uses a table or a stored routine).
Definition: sql_lex.h:4580
bool is_lex_started
Definition: sql_lex.h:4631
bool is_explain() const
Definition: sql_lex.h:4042
char * to_log
Definition: sql_lex.h:4102
bool no_write_to_binlog
Definition: sql_lex.h:4401
bool drop_temporary
Definition: sql_lex.h:4399
void insert_values_map(Item_field *f1, Field *f2)
Definition: sql_lex.h:4171
Plugins_array plugins
Definition: sql_lex.h:4123
List< LEX_USER > * default_roles
Definition: sql_lex.h:4145
bool m_has_udf
True if statement references UDF functions.
Definition: sql_lex.h:4416
void mark_broken(bool broken=true)
Certain permanent transformations (like in2exists), if they fail, may leave the LEX in an inconsisten...
Definition: sql_lex.h:4509
bool has_external_tables() const
Definition: sql_lex.h:4428
bool is_ignore() const
Definition: sql_lex.h:4422
void set_has_external_tables()
Definition: sql_lex.h:4427
Alter_info * alter_info
Definition: sql_lex.h:4430
const char * stmt_definition_end
Definition: sql_lex.h:4621
void set_exec_completed()
Definition: sql_lex.h:4554
List< LEX_CSTRING > dynamic_privileges
Definition: sql_lex.h:4144
ulonglong m_statement_options
Statement context for Query_block::make_active_options.
Definition: sql_lex.h:4479
List< LEX_COLUMN > columns
Definition: sql_lex.h:4143
void cleanup_after_one_table_open()
Definition: sql_lex.cc:4325
void reset_has_external_tables()
Definition: sql_lex.h:4426
Query_expression * unit
Outer-most query expression.
Definition: sql_lex.h:3998
bool verbose
Definition: sql_lex.h:4401
enum_view_create_mode create_view_mode
Definition: sql_lex.h:4358
bool has_values_map() const
Definition: sql_lex.h:4193
Opt_hints_global * opt_hints_global
Definition: sql_lex.h:4118
void set_splitting_window_expression(bool v)
Definition: sql_lex.h:4091
bool make_sql_cmd(Parse_tree_root *parse_tree)
Uses parse_tree to instantiate an Sql_cmd object and assigns it to the Lex.
Definition: sql_lex.cc:5136
List< LEX_USER > users_list
Definition: sql_lex.h:4142
bool can_execute_only_in_secondary_engine() const
Definition: sql_lex.h:4201
bool is_crossed_connection_memory_status_limit() const
Definition: sql_lex.h:4559
List< Item_param > param_list
List of placeholders ('?') for parameters of a prepared statement.
Definition: sql_lex.h:4167
bool grant_if_exists
refers to optional IF EXISTS clause in REVOKE sql.
Definition: sql_lex.h:4391
bool splitting_window_expression() const
Definition: sql_lex.h:4087
dd::info_schema::Table_statistics m_IS_table_stats
IS schema queries read some dynamic table statistics from SE.
Definition: sql_lex.h:4832
LEX_RESET_REPLICA reset_replica_info
Definition: sql_lex.h:4296
enum enum_duplicates duplicates
Definition: sql_lex.h:4355
bool is_single_level_stmt()
check if the statement is a single-level join
Definition: sql_lex.h:4811
bool m_extended_show
Definition: sql_lex.h:4403
USER_RESOURCES mqh
Definition: sql_lex.h:4295
bool using_hypergraph_optimizer() const
Whether the currently-running statement should be prepared and executed with the hypergraph optimizer...
Definition: sql_lex.h:4053
bool only_view
Definition: sql_lex.h:4602
bool m_using_secondary_engine
Definition: sql_lex.h:4097
bool save_cmd_properties(THD *thd)
Definition: sql_lex.h:4753
sp_pcontext * sp_current_parsing_ctx
Current SP parsing context.
Definition: sql_lex.h:4474
bool will_contextualize
Used to inform the parser whether it should contextualize the parse tree.
Definition: sql_lex.h:4650
st_sp_chistics sp_chistics
Definition: sql_lex.h:4600
KEY_CREATE_INFO key_create_info
Definition: sql_lex.h:4291
enum enum_tx_isolation tx_isolation
Definition: sql_lex.h:4356
void set_sp_current_parsing_ctx(sp_pcontext *ctx)
Definition: sql_lex.h:4574
uint32 next_binlog_file_nr
Definition: sql_lex.h:4448
bool check_preparation_invalid(THD *thd)
Check whether preparation state for prepared statement is invalid.
Definition: sql_lex.cc:856
void set_execute_only_in_hypergraph_optimizer(bool execute_in_hypergraph_optimizer_param, execute_only_in_hypergraph_reasons reason)
Definition: sql_lex.h:4242
dd::info_schema::Tablespace_statistics m_IS_tablespace_stats
Definition: sql_lex.h:4833
const char * get_only_supported_in_hypergraph_reason_str() const
Definition: sql_lex.h:4250
sp_pcontext * get_sp_current_parsing_ctx()
Definition: sql_lex.h:4572
void set_using_secondary_engine(bool flag)
Definition: sql_lex.h:4068
LEX_STRING binlog_stmt_arg
Argument of the BINLOG event statement.
Definition: sql_lex.h:4107
Query_block * new_query(Query_block *curr_query_block)
Create query expression object that contains one query block.
Definition: sql_lex.cc:655
THD * thd
Definition: sql_lex.h:4115
bool rewrite_required
Definition: sql_lex.h:4892
bool m_splitting_window_expression
Definition: sql_lex.h:4023
bool contains_plaintext_password
Definition: sql_lex.h:4446
LEX_STRING name
Definition: sql_lex.h:4100
uint8 create_view_algorithm
Definition: sql_lex.h:4373
LEX_SOURCE_INFO mi
Definition: sql_lex.h:4292
ulong max_execution_time
Definition: sql_lex.h:4638
void restore_cmd_properties()
Definition: sql_lex.h:4745
bool grant_privilege
Set to true when GRANT ... GRANT OPTION ... TO ... is used (vs.
Definition: sql_lex.h:4370
bool m_exec_completed
Set to true when execution is completed, ie optimization has been done and execution is successful or...
Definition: sql_lex.h:4461
LEX_STRING ident
Definition: sql_lex.h:4109
bool m_can_execute_only_in_secondary_engine
Definition: sql_lex.h:4010
ulonglong bulk_insert_row_cnt
Definition: sql_lex.h:4147
void set_has_udf()
Definition: sql_lex.h:4424
bool has_udf() const
Definition: sql_lex.h:4425
List< Item_func_set_user_var > set_var_list
Definition: sql_lex.h:4157
uint8 create_view_suid
Definition: sql_lex.h:4606
bool push_context(Name_resolution_context *context)
Definition: sql_lex.h:4785
void pop_context()
Definition: sql_lex.h:4789
bool m_was_replication_command_executed
Definition: sql_lex.h:4878
enum enum_yes_no_unknown tx_chain tx_release
Definition: sql_lex.h:4405
void clear_privileges()
Definition: sql_lex.cc:3651
LEX()
Definition: sql_lex.cc:3743
partition_info * part_info
Definition: sql_lex.h:4134
bool m_using_hypergraph_optimizer
Definition: sql_lex.h:4096
char * help_arg
Definition: sql_lex.h:4101
Server_options server_options
Definition: sql_lex.h:4294
bool copy_db_to(char const **p_db, size_t *p_db_length) const
This method should be called only during parsing.
Definition: sql_lex.cc:3889
enum_alter_user_attribute alter_user_attribute
Definition: sql_lex.h:4112
bool m_can_execute_only_in_hypergraph_optimizer
Definition: sql_lex.h:4019
std::map< Item_field *, Field * >::iterator end_values_map()
Definition: sql_lex.h:4197
List< Item > purge_value_list
Definition: sql_lex.h:4150
Query_block * current_query_block() const
Definition: sql_lex.h:4026
std::map< Item_field *, Field * > * insert_update_values_map
Definition: sql_lex.h:4269
bool ignore
Definition: sql_lex.h:4417
Name_resolution_context * current_context()
Definition: sql_lex.h:4797
enum SSL_type ssl_type
Definition: sql_lex.h:4354
bool is_explain_analyze
Definition: sql_lex.h:4043
HA_CREATE_INFO * create_info
Definition: sql_lex.h:4290
void set_using_hypergraph_optimizer(bool use_hypergraph)
Definition: sql_lex.h:4057
void assert_ok_set_current_query_block()
Definition: sql_lex.cc:395
Query_block * new_empty_query_block()
Create an empty query block within this LEX object.
Definition: sql_lex.cc:598
bool in_update_value_clause
Set to true while resolving values in ON DUPLICATE KEY UPDATE clause.
Definition: sql_lex.h:4633
Query_block * all_query_blocks_list
List of all query blocks.
Definition: sql_lex.h:4001
void release_plugins()
Definition: sql_lex.cc:557
uint reparse_common_table_expr_at
If currently re-parsing a CTE's definition, this is the offset in bytes of that definition in the ori...
Definition: sql_lex.h:4341
bool safe_to_cache_query
Whether this query will return the same answer every time, given unchanged data.
Definition: sql_lex.h:4412
sp_name * spname
Definition: sql_lex.h:4443
bool prepared_stmt_code_is_varref
Definition: sql_lex.h:4439
void set_ignore(bool ignore_param)
Definition: sql_lex.h:4423
my_thread_id show_profile_query_id
QUERY ID for SHOW PROFILE.
Definition: sql_lex.h:4361
List< set_var_base > var_list
Definition: sql_lex.h:4156
bool reparse_derived_table_condition
If currently re-parsing a condition which is pushed down to a derived table, this will be set to true...
Definition: sql_lex.h:4346
LEX_STRING alter_user_comment_text
Definition: sql_lex.h:4113
bool is_ps_or_view_context_analysis()
Definition: sql_lex.h:4705
bool m_crossed_connection_memory_status_limit
Set to true when execution crosses connection_memory_status_limit.
Definition: sql_lex.h:4469
Query_block * query_block
First query block.
Definition: sql_lex.h:4000
ulonglong statement_options()
Gets the options that have been set for this statement.
Definition: sql_lex.h:4489
bool which_check_option_applicable()
Definition: sql_lex.h:4768
enum_view_type create_view_type
Definition: sql_lex.h:4375
void set_execute_only_in_secondary_engine(const bool execute_only_in_secondary_engine_param, execute_only_in_secondary_reasons reason)
Definition: sql_lex.h:4205
bool set_wild(LEX_STRING)
Definition: sql_lex.cc:5043
uint grant
Definition: sql_lex.h:4363
bool is_crossed_global_connection_memory_status_limit() const
Definition: sql_lex.h:4556
enum_keep_diagnostics keep_diagnostics
Definition: sql_lex.h:4447
bool is_rewrite_required()
Definition: sql_lex.h:4897
Table_ref * insert_table_leaf
Leaf table being inserted into (always a base table)
Definition: sql_lex.h:4128
LEX_USER * definer
Definition: sql_lex.h:4140
void set_rewrite_required()
Definition: sql_lex.h:4895
List< Item > kill_value_list
Definition: sql_lex.h:4153
const char * get_not_supported_in_primary_reason_str()
Definition: sql_lex.h:4220
uint replica_thd_opt
Definition: sql_lex.h:4371
bool m_has_external_tables
True if query has at least one external table.
Definition: sql_lex.h:4419
void restore_properties_for_insert()
Definition: sql_lex.h:4747
void clear_values_map()
Definition: sql_lex.h:4183
void set_secondary_engine_execution_context(Secondary_engine_execution_context *context)
Sets the secondary engine execution context for this statement.
Definition: sql_lex.cc:5282
bool is_broken() const
Definition: sql_lex.h:4500
bool sp_lex_in_use
Definition: sql_lex.h:4444
List< LEX_STRING > prepared_stmt_params
Definition: sql_lex.h:4441
LEX_REPLICA_CONNECTION replica_connection
Definition: sql_lex.h:4293
Secondary_engine_execution_context * secondary_engine_execution_context() const
Gets the secondary engine execution context for this statement.
Definition: sql_lex.h:4853
st_parsing_options parsing_options
Definition: sql_lex.h:4429
int select_number
Number of query block (by EXPLAIN)
Definition: sql_lex.h:4372
void add_statement_options(ulonglong options)
Add options to values of m_statement_options.
Definition: sql_lex.h:4497
uint profile_options
Definition: sql_lex.h:4362
Query_expression * create_query_expr_and_block(THD *thd, Query_block *current_query_block, Item *where_clause, Item *having_clause, enum_parsing_context ctx)
Create query expression under current_query_block and a query block under the new query expression.
Definition: sql_lex.cc:608
nesting_map m_deny_window_func
Windowing functions are not allowed in HAVING - in contrast to grouped aggregate functions,...
Definition: sql_lex.h:4320
LEX_GRANT_AS grant_as
Definition: sql_lex.h:4114
String * wild
Definition: sql_lex.h:4105
bool expr_allows_subquery
Definition: sql_lex.h:4335
void reset()
Reset query context to initial state.
Definition: sql_lex.cc:418
bool m_exec_started
Set to true when execution has started (after parsing, tables opened and query preparation is complet...
Definition: sql_lex.h:4456
void clear_execution()
Clear execution state for a statement after it has been prepared or executed, and before it is (re-)e...
Definition: sql_lex.cc:569
bool locate_var_assignment(const Name_string &name)
Locate an assignment to a user variable with a given name, within statement.
Definition: sql_lex.cc:4399
Sql_cmd * m_sql_cmd
Definition: sql_lex.h:4327
execute_only_in_hypergraph_reasons get_only_supported_in_hypergraph_reason() const
Definition: sql_lex.h:4257
void reset_rewrite_required()
Definition: sql_lex.h:4896
LEX_STRING create_view_query_block
SELECT of CREATE VIEW statement.
Definition: sql_lex.h:4131
bool m_crossed_global_connection_memory_status_limit
Set to true when execution crosses global_connection_memory_status_limit.
Definition: sql_lex.h:4465
bool set_channel_name(LEX_CSTRING name={})
Set replication channel name.
Definition: sql_lex.cc:5155
bool accept(Select_lex_visitor *visitor)
Definition: sql_lex.cc:5039
void reset_exec_started()
Definition: sql_lex.h:4543
sp_head * sphead
Definition: sql_lex.h:4442
void reset_n_backup_query_tables_list(Query_tables_list *backup)
Definition: sql_lex.cc:4349
udf_func udf
Definition: sql_lex.h:4288
void set_trg_event_type_for_tables()
Set the initial purpose of this Table_ref object in the list of used tables.
Definition: sql_lex.cc:4071
void set_crossed_global_connection_memory_status_limit()
Definition: sql_lex.h:4562
void link_first_table_back(Table_ref *first, bool link_to_local)
Definition: sql_lex.cc:4292
const char * stmt_definition_begin
Intended to point to the next word after DEFINER-clause in the following statements:
Definition: sql_lex.h:4620
bool is_exec_completed() const
Check whether the statement has been executed (regardless of completion - successful or in error).
Definition: sql_lex.h:4553
enum enum_var_type option_type
Definition: sql_lex.h:4357
uint8 context_analysis_only
Definition: sql_lex.h:4384
bool create_view_materialization
This flag indicates that the CREATE VIEW statement contains the MATERIALIZED keyword.
Definition: sql_lex.h:4378
bool using_secondary_engine() const
Returns true if the statement is executed on a secondary engine.
Definition: sql_lex.h:4066
bool can_use_merged()
check if command can use VIEW with MERGE algorithm (for top VIEWs)
Definition: sql_lex.cc:3781
bool can_not_use_merged()
Check if command can't use merged views in any part of command.
Definition: sql_lex.cc:3835
std::map< Item_field *, Field * >::iterator begin_values_map()
Definition: sql_lex.h:4194
bool m_subquery_to_derived_is_impossible
If true: during prepare, we did a subquery transformation (IN-to-EXISTS, SOME/ANY) that doesn't curre...
Definition: sql_lex.h:4325
void set_exec_started()
Definition: sql_lex.h:4542
Query_block * m_current_query_block
Definition: sql_lex.h:4004
Item_sum * in_sum_func
Definition: sql_lex.h:4287
virtual ~LEX()
Definition: sql_lex.cc:402
class Explain_format * explain_format
Definition: sql_lex.h:4635
void cleanup(bool full)
Definition: sql_lex.h:4525
void reset_crossed_memory_status_limit()
Definition: sql_lex.h:4568
nesting_map allow_sum_func
This field is used as a work field during resolving to validate the use of aggregate functions.
Definition: sql_lex.h:4309
const char * x509_subject
Definition: sql_lex.h:4103
friend bool lex_start(THD *thd)
Call lex_start() before every query that is to be prepared and executed.
Definition: sql_lex.cc:522
bool is_view_context_analysis()
Definition: sql_lex.h:4710
void set_crossed_connection_memory_status_limit()
Definition: sql_lex.h:4565
ulong type
Definition: sql_lex.h:4297
Helper singleton class used to track information needed to perform the transform of a correlated scal...
Definition: sql_resolver.cc:7409
Definition: thr_lock.h:99
The MEM_ROOT is a simple arena, where allocations are carved out of larger blocks.
Definition: my_alloc.h:83
void * Alloc(size_t length)
Allocate memory.
Definition: my_alloc.h:145
Definition: mysql_lex_string.h:40
const char * str
Definition: mysql_lex_string.h:41
size_t length
Definition: mysql_lex_string.h:42
Definition: mysql_lex_string.h:35
Bison "location" class.
Definition: parse_location.h:43
Definition: materialize_path_parameters.h:42
Struct NESTED_JOIN is used to represent how tables are connected through outer join operations and se...
Definition: nested_join.h:78
Instances of Name_resolution_context store the information necessary for name resolution of Items and...
Definition: item.h:413
Definition: table.h:298
Environment data for the contextualization phase.
Definition: parse_tree_node_base.h:422
Input parameters to the parser.
Definition: sql_lexer_parser_input.h:32
Parser_input()
Definition: sql_lexer_parser_input.h:50
bool m_compute_digest
True if the caller needs to compute a digest.
Definition: sql_lexer_parser_input.h:48
bool m_has_digest
True if the text parsed corresponds to an actual query, and not another text artifact.
Definition: sql_lexer_parser_input.h:42
Definition: table.h:1450
Definition: simset.h:36
Definition: result.h:30
Definition: sql_lex.h:2620
LEX_CSTRING m_db
Definition: sql_lex.h:2621
LEX_STRING m_name
Definition: sql_lex.h:2622
LEX_CSTRING m_alias
Definition: sql_lex.h:2623
sp_name_with_alias(LEX_CSTRING db, LEX_STRING name, LEX_CSTRING alias)
Definition: sql_lex.h:2625
State data storage for digest_start, digest_add_token.
Definition: sql_digest_stream.h:36
Definition: sql_lex.h:5128
Definition: sql_lex.h:3401
void reset()
Definition: sql_lex.cc:172
bool allows_select_into
Definition: sql_lex.h:3403
bool allows_variable
Definition: sql_lex.h:3402
st_parsing_options()
Definition: sql_lex.h:3405
Definition: sql_lex.h:2629
mem_root_deque< sp_name_with_alias > * m_imported_libraries
List of imported libraries for this routine.
Definition: sql_lex.h:2640
LEX_CSTRING comment
Definition: sql_lex.h:2630
void reset(void)
Reset the structure.
Definition: sql_lex.h:2713
enum enum_sp_data_access daccess
Definition: sql_lex.h:2633
bool detistic
Definition: sql_lex.h:2632
bool is_binary
Definition: sql_lex.h:2635
enum enum_sp_suid_behaviour suid
Definition: sql_lex.h:2631
LEX_CSTRING language
CREATE|ALTER ... LANGUAGE <language>
Definition: sql_lex.h:2634
bool add_imported_library(std::string_view database, std::string_view name, std::string_view alias, MEM_ROOT *mem_root)
Add a library to the set of imported libraries.
Definition: sql_lex.h:2679
const mem_root_deque< sp_name_with_alias > * get_imported_libraries()
Get the set of imported libraries for the routine.
Definition: sql_lex.h:2706
bool add_imported_libraries(mem_root_deque< sp_name_with_alias > &libs, MEM_ROOT *mem_root)
Add library names to the set of imported libraries.
Definition: sql_lex.h:2653
bool create_imported_libraries_deque(MEM_ROOT *mem_root)
Definition: sql_lex.h:2694
Definition: sql_lex.h:2726
enum enum_trigger_event_type event
Definition: sql_lex.h:2728
LEX_CSTRING anchor_trigger_name
Trigger name referenced in the FOLLOWS/PRECEDES clause of the CREATE TRIGGER statement.
Definition: sql_lex.h:2739
enum enum_trigger_order_type ordering_clause
FOLLOWS or PRECEDES as specified in the CREATE TRIGGER statement.
Definition: sql_lex.h:2733
enum enum_trigger_action_time_type action_time
Definition: sql_lex.h:2727
Definition: sql_lex.h:2611
void reset()
Cleans slave connection info.
Definition: sql_lex.cc:180
char * user
Definition: sql_lex.h:2612
char * plugin_dir
Definition: sql_lex.h:2615
char * plugin_auth
Definition: sql_lex.h:2614
char * password
Definition: sql_lex.h:2613
Definition: sql_udf.h:44
Definition: sql_connect.h:41
thr_lock_type
Definition: thr_lock.h:51
@ TL_UNLOCK
Definition: thr_lock.h:53
@ TL_READ_DEFAULT
Definition: thr_lock.h:61
This file defines all base public constants related to triggers in MySQL.
enum_trigger_event_type
Constants to enumerate possible event types on which triggers can be fired.
Definition: trigger_def.h:42
enum_trigger_order_type
Possible trigger ordering clause values:
Definition: trigger_def.h:64
enum_trigger_action_time_type
Constants to enumerate possible timings when triggers can be fired.
Definition: trigger_def.h:52
Definition: lexer_yystype.h:33
Definition: parser_yystype.h:348
Definition: dtoa.cc:595
#define PSI_NOT_INSTRUMENTED
Definition: validate_password_imp.cc:44
Vio Lite.
SSL_type
Definition: violite.h:307
An adapter class to support iteration over an iterator of Item * (typically mem_root_deque<Item *>),...
VisibleFieldsIterator VisibleFields(mem_root_deque< Item * > &fields)
Definition: visible_fields.h:119
int n
Definition: xcom_base.cc:509