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