MySQL  8.0.18
Source Code Documentation
sql_parse.h
Go to the documentation of this file.
1 /* Copyright (c) 2006, 2019, Oracle and/or its affiliates. All rights reserved.
2 
3  This program is free software; you can redistribute it and/or modify
4  it under the terms of the GNU General Public License, version 2.0,
5  as published by the Free Software Foundation.
6 
7  This program is also distributed with certain software (including
8  but not limited to OpenSSL) that is licensed under separate terms,
9  as designated in a particular file or component or in included license
10  documentation. The authors of MySQL hereby grant you an additional
11  permission to link the program and your derivative works with the
12  separately licensed software that they have included with MySQL.
13 
14  This program is distributed in the hope that it will be useful,
15  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  GNU General Public License, version 2.0, for more details.
18 
19  You should have received a copy of the GNU General Public License
20  along with this program; if not, write to the Free Software
21  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
22 
23 #ifndef SQL_PARSE_INCLUDED
24 #define SQL_PARSE_INCLUDED
25 
26 #include <stddef.h>
27 #include <sys/types.h>
28 
29 #include "lex_string.h"
30 #include "m_ctype.h"
31 #include "my_command.h"
32 #include "my_sqlcommand.h"
33 #include "mysql_com.h" // enum_server_command
34 #include "sql/handler.h" // enum_schema_tables
35 
36 struct mysql_rwlock_t;
37 template <typename T>
38 class SQL_I_List;
39 
40 /**
41  @addtogroup GROUP_PARSER
42  @{
43 */
44 
45 class Comp_creator;
46 class Item;
48 class Parser_state;
49 class THD;
50 class Table_ident;
51 struct LEX;
52 struct LEX_USER;
53 struct ORDER;
54 struct Parse_context;
55 struct TABLE_LIST;
56 union COM_DATA;
57 
58 extern "C" int test_if_data_home_dir(const char *dir);
59 
60 bool stmt_causes_implicit_commit(const THD *thd, uint mask);
61 
62 #ifndef DBUG_OFF
63 extern void turn_parser_debug_on();
64 #endif
65 
66 bool parse_sql(THD *thd, Parser_state *parser_state,
67  Object_creation_ctx *creation_ctx);
68 
69 void free_items(Item *item);
70 void cleanup_items(Item *item);
71 
72 Comp_creator *comp_eq_creator(bool invert);
73 Comp_creator *comp_equal_creator(bool invert);
74 Comp_creator *comp_ge_creator(bool invert);
75 Comp_creator *comp_gt_creator(bool invert);
76 Comp_creator *comp_le_creator(bool invert);
77 Comp_creator *comp_lt_creator(bool invert);
78 Comp_creator *comp_ne_creator(bool invert);
79 
80 int prepare_schema_table(THD *thd, LEX *lex, Table_ident *table_ident,
81  enum enum_schema_tables schema_table_idx);
82 void get_default_definer(THD *thd, LEX_USER *definer);
85 bool check_string_char_length(const LEX_CSTRING &str, const char *err_msg,
86  size_t max_char_length, const CHARSET_INFO *cs,
87  bool no_error);
88 bool merge_charset_and_collation(const CHARSET_INFO *charset,
89  const CHARSET_INFO *collation,
90  const CHARSET_INFO **to);
92  const CHARSET_INFO *collation,
93  const CHARSET_INFO **to);
94 bool check_host_name(const LEX_CSTRING &str);
99 bool alloc_query(THD *thd, const char *packet, size_t packet_length);
100 void mysql_parse(THD *thd, Parser_state *parser_state);
102 bool create_select_for_variable(Parse_context *pc, const char *var_name);
104 int mysql_execute_command(THD *thd, bool first_level = false);
105 bool do_command(THD *thd);
106 bool dispatch_command(THD *thd, const COM_DATA *com_data,
108 bool prepare_index_and_data_dir_path(THD *thd, const char **data_file_name,
109  const char **index_file_name,
110  const char *table_name);
111 int append_file_to_dir(THD *thd, const char **filename_ptr,
112  const char *table_name);
113 void execute_init_command(THD *thd, LEX_STRING *init_command,
114  mysql_rwlock_t *var_lock);
115 void add_to_list(SQL_I_List<ORDER> &list, ORDER *order);
116 void add_join_on(TABLE_LIST *b, Item *expr);
118  TABLE_LIST *right_op);
119 void init_sql_command_flags(void);
121 void killall_non_super_threads(THD *thd);
122 bool shutdown(THD *thd, enum mysql_enum_shutdown_level level);
123 bool show_precheck(THD *thd, LEX *lex, bool lock);
124 
125 /* Variables */
126 
127 extern uint sql_command_flags[];
128 extern const LEX_CSTRING command_name[];
129 
131  return (cs->mbminlen == 1);
132 }
133 
135 
136 bool all_tables_not_ok(THD *thd, TABLE_LIST *tables);
138 
139 bool execute_show(THD *thd, TABLE_LIST *all_tables);
140 
141 // TODO: remove after refactoring of ALTER DATABASE:
142 bool set_default_charset(HA_CREATE_INFO *create_info,
143  const CHARSET_INFO *value);
144 // TODO: remove after refactoring of ALTER DATABASE:
145 bool set_default_collation(HA_CREATE_INFO *create_info,
146  const CHARSET_INFO *value);
147 
148 /* Bits in sql_command_flags */
149 
150 #define CF_CHANGES_DATA (1U << 0)
151 /* The 2nd bit is unused -- it used to be CF_HAS_ROW_COUNT. */
152 #define CF_STATUS_COMMAND (1U << 2)
153 #define CF_SHOW_TABLE_COMMAND (1U << 3)
154 #define CF_WRITE_LOGS_COMMAND (1U << 4)
155 /**
156  Must be set for SQL statements that may contain
157  Item expressions and/or use joins and tables.
158  Indicates that the parse tree of such statement may
159  contain rule-based optimizations that depend on metadata
160  (i.e. number of columns in a table), and consequently
161  that the statement must be re-prepared whenever
162  referenced metadata changes. Must not be set for
163  statements that themselves change metadata, e.g. RENAME,
164  ALTER and other DDL, since otherwise will trigger constant
165  reprepare. Consequently, complex item expressions and
166  joins are currently prohibited in these statements.
167 */
168 #define CF_REEXECUTION_FRAGILE (1U << 5)
169 /**
170  Implicitly commit before the SQL statement is executed.
171 
172  Statements marked with this flag will cause any active
173  transaction to end (commit) before proceeding with the
174  command execution.
175 
176  This flag should be set for statements that probably can't
177  be rolled back or that do not expect any previously metadata
178  locked tables.
179 */
180 #define CF_IMPLICIT_COMMIT_BEGIN (1U << 6)
181 /**
182  Implicitly commit after the SQL statement.
183 
184  Statements marked with this flag are automatically committed
185  at the end of the statement.
186 
187  This flag should be set for statements that will implicitly
188  open and take metadata locks on system tables that should not
189  be carried for the whole duration of a active transaction.
190 */
191 #define CF_IMPLICIT_COMMIT_END (1U << 7)
192 /**
193  CF_IMPLICIT_COMMIT_BEGIN and CF_IMPLICIT_COMMIT_END are used
194  to ensure that the active transaction is implicitly committed
195  before and after every DDL statement and any statement that
196  modifies our currently non-transactional system tables.
197 */
198 #define CF_AUTO_COMMIT_TRANS (CF_IMPLICIT_COMMIT_BEGIN | CF_IMPLICIT_COMMIT_END)
199 
200 /**
201  Diagnostic statement.
202  Diagnostic statements:
203  - SHOW WARNING
204  - SHOW ERROR
205  - GET DIAGNOSTICS (WL#2111)
206  do not modify the Diagnostics Area during execution.
207 */
208 #define CF_DIAGNOSTIC_STMT (1U << 8)
209 
210 /**
211  Identifies statements that may generate row events
212  and that may end up in the binary log.
213 */
214 #define CF_CAN_GENERATE_ROW_EVENTS (1U << 9)
215 
216 /**
217  Identifies statements which may deal with temporary tables and for which
218  temporary tables should be pre-opened to simplify privilege checks.
219 */
220 #define CF_PREOPEN_TMP_TABLES (1U << 10)
221 
222 /**
223  Identifies statements for which open handlers should be closed in the
224  beginning of the statement.
225 */
226 #define CF_HA_CLOSE (1U << 11)
227 
228 /**
229  Identifies statements that can be explained with EXPLAIN.
230 */
231 #define CF_CAN_BE_EXPLAINED (1U << 12)
232 
233 /** Identifies statements which may generate an optimizer trace */
234 #define CF_OPTIMIZER_TRACE (1U << 14)
235 
236 /**
237  Identifies statements that should always be disallowed in
238  read only transactions.
239 */
240 #define CF_DISALLOW_IN_RO_TRANS (1U << 15)
241 
242 /**
243  Identifies statements and commands that can be used with Protocol Plugin
244 */
245 #define CF_ALLOW_PROTOCOL_PLUGIN (1U << 16)
246 
247 /**
248  Identifies statements (typically DDL) which needs auto-commit mode
249  temporarily turned off.
250 
251  @note This is necessary to prevent InnoDB from automatically committing
252  InnoDB transaction each time data-dictionary tables are closed
253  after being updated.
254 
255  @note This is also necessary for ACL DDL, so the code which
256  saves GTID state or slave state in the system tables at the
257  commit time works correctly. This code does statement commit
258  on low-level (see System_table_access:: close_table()) and
259  thus can pre-maturely commit DDL if @@autocommit=1.
260 */
261 #define CF_NEEDS_AUTOCOMMIT_OFF (1U << 17)
262 
263 /**
264  Identifies statements which can return rows of data columns (SELECT, SHOW ...)
265 */
266 #define CF_HAS_RESULT_SET (1U << 18)
267 
268 /**
269  Identifies DDL statements which can be atomic.
270  Having the bit ON does not yet define an atomic.
271  The property is used both on the master and slave.
272  On the master atomicity infers the binlog and gtid_executed system table.
273  On the slave it more involves the slave info table.
274 
275  @note At the momemnt of declaration the covered DDL subset coincides
276  with the of CF_NEEDS_AUTOCOMMIT_OFF.
277 */
278 #define CF_POTENTIAL_ATOMIC_DDL (1U << 19)
279 
280 /**
281  Statement is depending on the ACL cache, which can be disabled by the
282  --skip-grant-tables server option.
283 */
284 #define CF_REQUIRE_ACL_CACHE (1U << 20)
285 
286 /* Bits in server_command_flags */
287 
288 /**
289  Skip the increase of the global query id counter. Commonly set for
290  commands that are stateless (won't cause any change on the server
291  internal states). This is made obsolete as query id is incremented
292  for ping and statistics commands as well because of race condition
293  (Bug#58785).
294 */
295 #define CF_SKIP_QUERY_ID (1U << 0)
296 
297 /**
298  Skip the increase of the number of statements that clients have
299  sent to the server. Commonly used for commands that will cause
300  a statement to be executed but the statement might have not been
301  sent by the user (ie: stored procedure).
302 */
303 #define CF_SKIP_QUESTIONS (1U << 1)
304 
305 /**
306  1U << 16 is reserved for Protocol Plugin statements and commands
307 */
308 
309 /**
310  @} (end of group GROUP_PARSER)
311 */
312 
313 #endif /* SQL_PARSE_INCLUDED */
Comp_creator * comp_gt_creator(bool invert)
Definition: sql_parse.cc:6619
uint mbminlen
Definition: m_ctype.h:382
bool mysql_test_parse_for_slave(THD *thd)
Usable by the replication SQL thread only: just parse a query to know if it can be ignored because of...
Definition: sql_parse.cc:5319
int prepare_schema_table(THD *thd, LEX *lex, Table_ident *table_ident, enum enum_schema_tables schema_table_idx)
Create a TABLE_LIST object for an INFORMATION_SCHEMA table.
Definition: sql_parse.cc:2286
bool merge_charset_and_collation(const CHARSET_INFO *charset, const CHARSET_INFO *collation, const CHARSET_INFO **to)
(end of group Runtime_Environment)
Definition: sql_parse.cc:7172
char * user
Definition: mysqladmin.cc:59
Definition: mysql_lex_string.h:34
Definition: sql_lex.h:3192
Order clause list element.
Definition: table.h:276
static mi_bit_type mask[]
Definition: mi_packrec.cc:138
bool is_log_table_write_query(enum enum_sql_command command)
Check if a sql command is allowed to write to log tables.
Definition: sql_parse.cc:1061
void add_join_on(TABLE_LIST *b, Item *expr)
Add an ON condition to the second operand of a JOIN ...
Definition: sql_parse.cc:6357
bool check_string_char_length(const LEX_CSTRING &str, const char *err_msg, size_t max_char_length, const CHARSET_INFO *cs, bool no_error)
Definition: sql_parse.cc:6836
Comp_creator * comp_le_creator(bool invert)
Definition: sql_parse.cc:6623
mysql_enum_shutdown_level
We want levels to be in growing order of hardness (because we use number comparisons).
Definition: mysql_com.h:949
void free_items(Item *item)
Definition: sql_parse.cc:1129
void cleanup_items(Item *item)
This works because items are allocated with (*THR_MALLOC)->Alloc().
Definition: sql_parse.cc:1142
void get_default_definer(THD *thd, LEX_USER *definer)
Set the specified definer to the default value, which is the current user in the thread.
Definition: sql_parse.cc:6699
enum_sql_command
Definition: my_sqlcommand.h:45
void killall_non_super_threads(THD *thd)
Definition: sql_parse.cc:6518
Definition: mysql_lex_string.h:39
void mysql_reset_thd_for_next_command(THD *thd)
Reset the part of THD responsible for the state of command processing.
Definition: sql_parse.cc:5002
Object_creation_ctx – interface for creation context of database objects (views, stored routines, events, triggers).
Definition: table.h:193
Simple intrusive linked list.
Definition: item.h:81
bool prepare_index_and_data_dir_path(THD *thd, const char **data_file_name, const char **index_file_name, const char *table_name)
prepares the index and data directory path.
Definition: sql_parse.cc:6537
int mysql_execute_command(THD *thd, bool first_level=false)
Execute command saved in thd and lex->sql_command.
Definition: sql_parse.cc:2624
class udf_list * list
bool alloc_query(THD *thd, const char *packet, size_t packet_length)
Read query from packet and store in thd->query.
Definition: sql_parse.cc:2348
bool check_host_name(const LEX_CSTRING &str)
Check that host name string is valid.
Definition: sql_parse.cc:6904
Definition: com_data.h:106
bool is_update_query(enum enum_sql_command command)
Definition: sql_parse.cc:1046
bool all_tables_not_ok(THD *thd, TABLE_LIST *tables)
Returns true if all tables should be ignored.
Definition: sql_parse.cc:259
int test_if_data_home_dir(const char *dir)
Definition: sql_parse.cc:6865
LEX_USER * create_default_definer(THD *thd)
Create default definer for the specified THD.
Definition: sql_parse.cc:6738
bool do_command(THD *thd)
Read one command from connection and execute it (query or simple command).
Definition: sql_parse.cc:1159
Definition: sql_lex.h:250
bool parse_sql(THD *thd, Parser_state *parser_state, Object_creation_ctx *creation_ctx)
Transform an SQL statement into an AST that is ready for resolving, using the supplied parser state a...
Definition: sql_parse.cc:6999
bool create_select_for_variable(Parse_context *pc, const char *var_name)
Create a select to return the same output as &#39;SELECT @var_name&#39;.
Definition: sql_parse.cc:5103
Common definition between mysql server & client.
Comp_creator * comp_ne_creator(bool invert)
Definition: sql_parse.cc:6631
Internal state of the parser.
Definition: sql_lex.h:3858
Definition: table.h:2367
int append_file_to_dir(THD *thd, const char **filename_ptr, const char *table_name)
If pointer is not a null pointer, append filename to it.
Definition: sql_parse.cc:6577
bool show_precheck(THD *thd, LEX *lex, bool lock)
Do special checking for SHOW statements.
Definition: sql_parse.cc:4786
void create_table_set_open_action_and_adjust_tables(LEX *lex)
Set proper open mode and table type for element representing target table of CREATE TABLE statement...
Definition: sql_parse.cc:6671
bool dispatch_command(THD *thd, const COM_DATA *com_data, enum enum_server_command command)
Perform one connection-level (COM_XXXX) command.
Definition: sql_parse.cc:1467
Comp_creator * comp_equal_creator(bool invert)
Definition: sql_parse.cc:6610
bool stmt_causes_implicit_commit(const THD *thd, uint mask)
Returns whether the command in thd->lex->sql_command should cause an implicit commit.
Definition: sql_parse.cc:355
void execute_init_command(THD *thd, LEX_STRING *init_command, mysql_rwlock_t *var_lock)
Definition: sql_parse.cc:1081
bool shutdown(THD *thd, enum mysql_enum_shutdown_level level)
Shutdown the mysqld server.
Definition: sql_parse.cc:2229
Comp_creator * comp_eq_creator(bool invert)
Definition: sql_parse.cc:6606
Abstract factory interface for creating comparison predicates.
Definition: item_cmpfunc.h:497
Definition: item.h:668
unsigned int uint
Definition: uca-dump.cc:29
bool set_default_collation(HA_CREATE_INFO *create_info, const CHARSET_INFO *value)
Definition: parse_tree_nodes.cc:1487
enum_schema_tables
Definition: handler.h:879
Definition: m_ctype.h:359
uint sql_command_flags[]
Mark all commands that somehow changes a table.
Definition: sql_parse.cc:393
Environment data for the contextualization phase.
Definition: parse_tree_node_base.h:99
enum_server_command
A list of all MySQL protocol commands.
Definition: my_command.h:47
bool execute_show(THD *thd, TABLE_LIST *all_tables)
Definition: sql_parse.cc:4905
An instrumented rwlock structure.
Definition: mysql_rwlock_bits.h:50
bool set_default_charset(HA_CREATE_INFO *create_info, const CHARSET_INFO *value)
Definition: parse_tree_nodes.cc:1464
command
Definition: version_token.cc:278
LEX_USER * get_current_user(THD *thd, LEX_USER *user)
Retuns information about user or current user.
Definition: sql_parse.cc:6760
const LEX_CSTRING command_name[]
Definition: sql_parse.cc:211
const CHARSET_INFO * get_bin_collation(const CHARSET_INFO *cs)
Definition: sql_parse.cc:6374
bool sqlcom_can_generate_row_events(enum enum_sql_command command)
Definition: sql_parse.cc:1042
Definition: handler.h:2629
A better implementation of the UNIX ctype(3) library.
void add_to_list(SQL_I_List< ORDER > &list, ORDER *order)
save order by and tables in own lists.
Definition: sql_parse.cc:5518
void turn_parser_debug_on()
const string value("\alue\)
void mysql_parse(THD *thd, Parser_state *parser_state)
Parse a query.
Definition: sql_parse.cc:5140
Definition: table.h:2468
Comp_creator * comp_lt_creator(bool invert)
Definition: sql_parse.cc:6627
Comp_creator * comp_ge_creator(bool invert)
Definition: sql_parse.cc:6615
void init_sql_command_flags(void)
Definition: sql_parse.cc:396
bool some_non_temp_table_to_be_updated(THD *thd, TABLE_LIST *tables)
Definition: sql_parse.cc:330
bool push_new_name_resolution_context(Parse_context *pc, TABLE_LIST *left_op, TABLE_LIST *right_op)
Push a new name resolution context for a JOIN ...
Definition: sql_parse.cc:6331
bool merge_sp_var_charset_and_collation(const CHARSET_INFO *charset, const CHARSET_INFO *collation, const CHARSET_INFO **to)
Definition: sql_parse.cc:7186
For each client connection we create a separate thread with THD serving as a thread/connection descri...
Definition: sql_class.h:778
bool is_explainable_query(enum enum_sql_command command)
Definition: sql_parse.cc:1051
bool is_supported_parser_charset(const CHARSET_INFO *cs)
Definition: sql_parse.h:130
const char * table_name
Definition: rules_table_service.cc:55