1 | /* Copyright (c) 2000, 2018, Oracle and/or its affiliates. |
2 | Copyright (c) 2010, 2018, Monty Program Ab. |
3 | |
4 | This program is free software; you can redistribute it and/or modify |
5 | it under the terms of the GNU General Public License as published by |
6 | the Free Software Foundation; version 2 of the License. |
7 | |
8 | This program is distributed in the hope that it will be useful, |
9 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
10 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
11 | GNU General Public License for more details. |
12 | |
13 | You should have received a copy of the GNU General Public License |
14 | along with this program; if not, write to the Free Software |
15 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ |
16 | |
17 | /** |
18 | @file |
19 | |
20 | @details |
21 | Mostly this file is used in the server. But a little part of it is used in |
22 | mysqlbinlog too (definition of SELECT_DISTINCT and others). |
23 | The consequence is that 90% of the file is wrapped in \#ifndef MYSQL_CLIENT, |
24 | except the part which must be in the server and in the client. |
25 | */ |
26 | |
27 | #ifndef SQL_PRIV_INCLUDED |
28 | #define SQL_PRIV_INCLUDED |
29 | |
30 | #ifndef MYSQL_CLIENT |
31 | |
32 | /* |
33 | Generates a warning that a feature is deprecated. After a specified |
34 | version asserts that the feature is removed. |
35 | |
36 | Using it as |
37 | |
38 | WARN_DEPRECATED(thd, 6,2, "BAD", "'GOOD'"); |
39 | |
40 | Will result in a warning |
41 | |
42 | "The syntax 'BAD' is deprecated and will be removed in MySQL 6.2. Please |
43 | use 'GOOD' instead" |
44 | |
45 | Note that in macro arguments BAD is not quoted, while 'GOOD' is. |
46 | Note that the version is TWO numbers, separated with a comma |
47 | (two macro arguments, that is) |
48 | */ |
49 | #define WARN_DEPRECATED(Thd,VerHi,VerLo,Old,New) \ |
50 | do { \ |
51 | compile_time_assert(MYSQL_VERSION_ID < VerHi * 10000 + VerLo * 100); \ |
52 | if (((THD *) Thd) != NULL) \ |
53 | push_warning_printf(((THD *) Thd), Sql_condition::WARN_LEVEL_WARN, \ |
54 | ER_WARN_DEPRECATED_SYNTAX, \ |
55 | ER_THD(((THD *) Thd), ER_WARN_DEPRECATED_SYNTAX), \ |
56 | (Old), (New)); \ |
57 | else \ |
58 | sql_print_warning("The syntax '%s' is deprecated and will be removed " \ |
59 | "in a future release. Please use %s instead.", \ |
60 | (Old), (New)); \ |
61 | } while(0) |
62 | |
63 | |
64 | /* |
65 | Generates a warning that a feature is deprecated and there is no replacement. |
66 | |
67 | Using it as |
68 | |
69 | WARN_DEPRECATED_NO_REPLACEMENT(thd, "BAD"); |
70 | |
71 | Will result in a warning |
72 | |
73 | "'BAD' is deprecated and will be removed in a future release." |
74 | |
75 | Note that in macro arguments BAD is not quoted. |
76 | */ |
77 | |
78 | #define WARN_DEPRECATED_NO_REPLACEMENT(Thd,Old) \ |
79 | do { \ |
80 | THD *thd_= ((THD*) Thd); \ |
81 | if (thd_ != NULL) \ |
82 | push_warning_printf(thd_, Sql_condition::WARN_LEVEL_WARN, \ |
83 | ER_WARN_DEPRECATED_SYNTAX_NO_REPLACEMENT, \ |
84 | ER_THD(thd_, ER_WARN_DEPRECATED_SYNTAX_NO_REPLACEMENT), \ |
85 | (Old)); \ |
86 | else \ |
87 | sql_print_warning("'%s' is deprecated and will be removed " \ |
88 | "in a future release.", (Old)); \ |
89 | } while(0) |
90 | |
91 | /*************************************************************************/ |
92 | |
93 | #endif |
94 | |
95 | /* |
96 | This is included in the server and in the client. |
97 | Options for select set by the yacc parser (stored in lex->options). |
98 | |
99 | NOTE |
100 | log_event.h defines OPTIONS_WRITTEN_TO_BIN_LOG to specify what THD |
101 | options list are written into binlog. These options can NOT change their |
102 | values, or it will break replication between version. |
103 | |
104 | context is encoded as following: |
105 | SELECT - SELECT_LEX_NODE::options |
106 | THD - THD::options |
107 | intern - neither. used only as |
108 | func(..., select_node->options | thd->options | OPTION_XXX, ...) |
109 | |
110 | TODO: separate three contexts above, move them to separate bitfields. |
111 | */ |
112 | |
113 | #define SELECT_DISTINCT (1ULL << 0) // SELECT, user |
114 | #define SELECT_STRAIGHT_JOIN (1ULL << 1) // SELECT, user |
115 | #define SELECT_DESCRIBE (1ULL << 2) // SELECT, user |
116 | #define SELECT_SMALL_RESULT (1ULL << 3) // SELECT, user |
117 | #define SELECT_BIG_RESULT (1ULL << 4) // SELECT, user |
118 | #define OPTION_FOUND_ROWS (1ULL << 5) // SELECT, user |
119 | #define OPTION_TO_QUERY_CACHE (1ULL << 6) // SELECT, user |
120 | #define SELECT_NO_JOIN_CACHE (1ULL << 7) // intern |
121 | /** always the opposite of OPTION_NOT_AUTOCOMMIT except when in fix_autocommit() */ |
122 | #define OPTION_AUTOCOMMIT (1ULL << 8) // THD, user |
123 | #define OPTION_BIG_SELECTS (1ULL << 9) // THD, user |
124 | #define OPTION_LOG_OFF (1ULL << 10) // THD, user |
125 | #define OPTION_QUOTE_SHOW_CREATE (1ULL << 11) // THD, user |
126 | #define TMP_TABLE_ALL_COLUMNS (1ULL << 12) // SELECT, intern |
127 | #define OPTION_WARNINGS (1ULL << 13) // THD, user |
128 | #define OPTION_AUTO_IS_NULL (1ULL << 14) // THD, user, binlog |
129 | #define OPTION_NO_CHECK_CONSTRAINT_CHECKS (1ULL << 14) |
130 | #define OPTION_SAFE_UPDATES (1ULL << 16) // THD, user |
131 | #define OPTION_BUFFER_RESULT (1ULL << 17) // SELECT, user |
132 | #define OPTION_BIN_LOG (1ULL << 18) // THD, user |
133 | #define OPTION_NOT_AUTOCOMMIT (1ULL << 19) // THD, user |
134 | #define OPTION_BEGIN (1ULL << 20) // THD, intern |
135 | #define OPTION_TABLE_LOCK (1ULL << 21) // THD, intern |
136 | #define OPTION_QUICK (1ULL << 22) // SELECT (for DELETE) |
137 | #define OPTION_KEEP_LOG (1ULL << 23) // THD, user |
138 | |
139 | /* The following is used to detect a conflict with DISTINCT */ |
140 | #define SELECT_ALL (1ULL << 24) // SELECT, user, parser |
141 | #define OPTION_GTID_BEGIN (1ULL << 25) // GTID BEGIN found in log |
142 | |
143 | /** The following can be set when importing tables in a 'wrong order' |
144 | to suppress foreign key checks */ |
145 | #define OPTION_NO_FOREIGN_KEY_CHECKS (1ULL << 26) // THD, user, binlog |
146 | /** The following speeds up inserts to InnoDB tables by suppressing unique |
147 | key checks in some cases */ |
148 | #define OPTION_RELAXED_UNIQUE_CHECKS (1ULL << 27) // THD, user, binlog |
149 | #define SELECT_NO_UNLOCK (1ULL << 28) // SELECT, intern |
150 | #define OPTION_SCHEMA_TABLE (1ULL << 29) // SELECT, intern |
151 | /** Flag set if setup_tables already done */ |
152 | #define OPTION_SETUP_TABLES_DONE (1ULL << 30) // intern |
153 | /** If not set then the thread will ignore all warnings with level notes. */ |
154 | #define OPTION_SQL_NOTES (1ULL << 31) // THD, user |
155 | /** |
156 | Force the used temporary table to be a MyISAM table (because we will use |
157 | fulltext functions when reading from it. |
158 | */ |
159 | #define TMP_TABLE_FORCE_MYISAM (1ULL << 32) |
160 | #define OPTION_PROFILING (1ULL << 33) |
161 | /** |
162 | Indicates that this is a HIGH_PRIORITY SELECT. |
163 | Currently used only for printing of such selects. |
164 | Type of locks to be acquired is specified directly. |
165 | */ |
166 | #define SELECT_HIGH_PRIORITY (1ULL << 34) // SELECT, user |
167 | /** |
168 | Is set in slave SQL thread when there was an |
169 | error on master, which, when is not reproducible |
170 | on slave (i.e. the query succeeds on slave), |
171 | is not terminal to the state of repliation, |
172 | and should be ignored. The slave SQL thread, |
173 | however, needs to rollback the effects of the |
174 | succeeded statement to keep replication consistent. |
175 | */ |
176 | #define OPTION_MASTER_SQL_ERROR (1ULL << 35) |
177 | |
178 | /* |
179 | Dont report errors for individual rows, |
180 | But just report error on commit (or read ofcourse) |
181 | Note! Reserved for use in MySQL Cluster |
182 | */ |
183 | #define OPTION_ALLOW_BATCH (1ULL << 36) // THD, intern (slave) |
184 | #define OPTION_SKIP_REPLICATION (1ULL << 37) // THD, user |
185 | #define OPTION_RPL_SKIP_PARALLEL (1ULL << 38) |
186 | #define (1ULL << 39) // SELECT, intern, parser |
187 | |
188 | /* The rest of the file is included in the server only */ |
189 | #ifndef MYSQL_CLIENT |
190 | |
191 | /* @@optimizer_switch flags. These must be in sync with optimizer_switch_typelib */ |
192 | #define OPTIMIZER_SWITCH_INDEX_MERGE (1ULL << 0) |
193 | #define OPTIMIZER_SWITCH_INDEX_MERGE_UNION (1ULL << 1) |
194 | #define OPTIMIZER_SWITCH_INDEX_MERGE_SORT_UNION (1ULL << 2) |
195 | #define OPTIMIZER_SWITCH_INDEX_MERGE_INTERSECT (1ULL << 3) |
196 | #define OPTIMIZER_SWITCH_INDEX_MERGE_SORT_INTERSECT (1ULL << 4) |
197 | #define deprecated_ENGINE_CONDITION_PUSHDOWN (1ULL << 5) |
198 | #define OPTIMIZER_SWITCH_INDEX_COND_PUSHDOWN (1ULL << 6) |
199 | #define OPTIMIZER_SWITCH_DERIVED_MERGE (1ULL << 7) |
200 | #define OPTIMIZER_SWITCH_DERIVED_WITH_KEYS (1ULL << 8) |
201 | #define OPTIMIZER_SWITCH_FIRSTMATCH (1ULL << 9) |
202 | #define OPTIMIZER_SWITCH_LOOSE_SCAN (1ULL << 10) |
203 | #define OPTIMIZER_SWITCH_MATERIALIZATION (1ULL << 11) |
204 | #define OPTIMIZER_SWITCH_IN_TO_EXISTS (1ULL << 12) |
205 | #define OPTIMIZER_SWITCH_SEMIJOIN (1ULL << 13) |
206 | #define OPTIMIZER_SWITCH_PARTIAL_MATCH_ROWID_MERGE (1ULL << 14) |
207 | #define OPTIMIZER_SWITCH_PARTIAL_MATCH_TABLE_SCAN (1ULL << 15) |
208 | #define OPTIMIZER_SWITCH_SUBQUERY_CACHE (1ULL << 16) |
209 | /** If this is off, MRR is never used. */ |
210 | #define OPTIMIZER_SWITCH_MRR (1ULL << 17) |
211 | /** |
212 | If OPTIMIZER_SWITCH_MRR is on and this is on, MRR is used depending on a |
213 | cost-based choice ("automatic"). If OPTIMIZER_SWITCH_MRR is on and this is |
214 | off, MRR is "forced" (i.e. used as long as the storage engine is capable of |
215 | doing it). |
216 | */ |
217 | #define OPTIMIZER_SWITCH_MRR_COST_BASED (1ULL << 18) |
218 | #define OPTIMIZER_SWITCH_MRR_SORT_KEYS (1ULL << 19) |
219 | #define OPTIMIZER_SWITCH_OUTER_JOIN_WITH_CACHE (1ULL << 20) |
220 | #define OPTIMIZER_SWITCH_SEMIJOIN_WITH_CACHE (1ULL << 21) |
221 | #define OPTIMIZER_SWITCH_JOIN_CACHE_INCREMENTAL (1ULL << 22) |
222 | #define OPTIMIZER_SWITCH_JOIN_CACHE_HASHED (1ULL << 23) |
223 | #define OPTIMIZER_SWITCH_JOIN_CACHE_BKA (1ULL << 24) |
224 | #define OPTIMIZER_SWITCH_OPTIMIZE_JOIN_BUFFER_SIZE (1ULL << 25) |
225 | #define OPTIMIZER_SWITCH_TABLE_ELIMINATION (1ULL << 26) |
226 | #define OPTIMIZER_SWITCH_EXTENDED_KEYS (1ULL << 27) |
227 | #define OPTIMIZER_SWITCH_EXISTS_TO_IN (1ULL << 28) |
228 | #define OPTIMIZER_SWITCH_ORDERBY_EQ_PROP (1ULL << 29) |
229 | #define OPTIMIZER_SWITCH_COND_PUSHDOWN_FOR_DERIVED (1ULL << 30) |
230 | #define OPTIMIZER_SWITCH_SPLIT_MATERIALIZED (1ULL << 31) |
231 | |
232 | #define OPTIMIZER_SWITCH_DEFAULT (OPTIMIZER_SWITCH_INDEX_MERGE | \ |
233 | OPTIMIZER_SWITCH_INDEX_MERGE_UNION | \ |
234 | OPTIMIZER_SWITCH_INDEX_MERGE_SORT_UNION | \ |
235 | OPTIMIZER_SWITCH_INDEX_MERGE_INTERSECT | \ |
236 | OPTIMIZER_SWITCH_INDEX_COND_PUSHDOWN | \ |
237 | OPTIMIZER_SWITCH_DERIVED_MERGE | \ |
238 | OPTIMIZER_SWITCH_DERIVED_WITH_KEYS | \ |
239 | OPTIMIZER_SWITCH_TABLE_ELIMINATION | \ |
240 | OPTIMIZER_SWITCH_EXTENDED_KEYS | \ |
241 | OPTIMIZER_SWITCH_IN_TO_EXISTS | \ |
242 | OPTIMIZER_SWITCH_MATERIALIZATION | \ |
243 | OPTIMIZER_SWITCH_PARTIAL_MATCH_ROWID_MERGE|\ |
244 | OPTIMIZER_SWITCH_PARTIAL_MATCH_TABLE_SCAN|\ |
245 | OPTIMIZER_SWITCH_OUTER_JOIN_WITH_CACHE | \ |
246 | OPTIMIZER_SWITCH_SEMIJOIN_WITH_CACHE | \ |
247 | OPTIMIZER_SWITCH_JOIN_CACHE_INCREMENTAL | \ |
248 | OPTIMIZER_SWITCH_JOIN_CACHE_HASHED | \ |
249 | OPTIMIZER_SWITCH_JOIN_CACHE_BKA | \ |
250 | OPTIMIZER_SWITCH_SUBQUERY_CACHE | \ |
251 | OPTIMIZER_SWITCH_SEMIJOIN | \ |
252 | OPTIMIZER_SWITCH_FIRSTMATCH | \ |
253 | OPTIMIZER_SWITCH_LOOSE_SCAN | \ |
254 | OPTIMIZER_SWITCH_EXISTS_TO_IN | \ |
255 | OPTIMIZER_SWITCH_ORDERBY_EQ_PROP | \ |
256 | OPTIMIZER_SWITCH_COND_PUSHDOWN_FOR_DERIVED | \ |
257 | OPTIMIZER_SWITCH_SPLIT_MATERIALIZED) |
258 | |
259 | /* |
260 | Replication uses 8 bytes to store SQL_MODE in the binary log. The day you |
261 | use strictly more than 64 bits by adding one more define above, you should |
262 | contact the replication team because the replication code should then be |
263 | updated (to store more bytes on disk). |
264 | |
265 | NOTE: When adding new SQL_MODE types, make sure to also add them to |
266 | the scripts used for creating the MySQL system tables |
267 | in scripts/mysql_system_tables.sql and scripts/mysql_system_tables_fix.sql |
268 | |
269 | */ |
270 | |
271 | /* |
272 | Flags below are set when we perform |
273 | context analysis of the statement and make |
274 | subqueries non-const. It prevents subquery |
275 | evaluation at context analysis stage. |
276 | */ |
277 | |
278 | /* |
279 | Don't evaluate this subquery during statement prepare even if |
280 | it's a constant one. The flag is switched off in the end of |
281 | mysqld_stmt_prepare. |
282 | */ |
283 | #define CONTEXT_ANALYSIS_ONLY_PREPARE 1 |
284 | /* |
285 | Special JOIN::prepare mode: changing of query is prohibited. |
286 | When creating a view, we need to just check its syntax omitting |
287 | any optimizations: afterwards definition of the view will be |
288 | reconstructed by means of ::print() methods and written to |
289 | to an .frm file. We need this definition to stay untouched. |
290 | */ |
291 | #define CONTEXT_ANALYSIS_ONLY_VIEW 2 |
292 | /* |
293 | Don't evaluate this subquery during derived table prepare even if |
294 | it's a constant one. |
295 | */ |
296 | #define CONTEXT_ANALYSIS_ONLY_DERIVED 4 |
297 | /* |
298 | Don't evaluate constant sub-expressions of virtual column |
299 | expressions when opening tables |
300 | */ |
301 | #define CONTEXT_ANALYSIS_ONLY_VCOL_EXPR 8 |
302 | |
303 | |
304 | /* |
305 | Uncachable causes: |
306 | */ |
307 | /* This subquery has fields from outer query (put by user) */ |
308 | #define UNCACHEABLE_DEPENDENT_GENERATED 1 |
309 | /* This subquery contains functions with random result */ |
310 | #define UNCACHEABLE_RAND 2 |
311 | /* This subquery contains functions with side effect */ |
312 | #define UNCACHEABLE_SIDEEFFECT 4 |
313 | /* Forcing to save JOIN tables for explain */ |
314 | #define UNCACHEABLE_EXPLAIN 8 |
315 | /* For uncorrelated SELECT in an UNION with some correlated SELECTs */ |
316 | #define UNCACHEABLE_UNITED 16 |
317 | #define UNCACHEABLE_CHECKOPTION 32 |
318 | /* |
319 | This subquery has fields from outer query injected during |
320 | transformation process |
321 | */ |
322 | #define UNCACHEABLE_DEPENDENT_INJECTED 64 |
323 | /* This subquery has fields from outer query (any nature) */ |
324 | #define UNCACHEABLE_DEPENDENT (UNCACHEABLE_DEPENDENT_GENERATED | \ |
325 | UNCACHEABLE_DEPENDENT_INJECTED) |
326 | |
327 | /* Used to check GROUP BY list in the MODE_ONLY_FULL_GROUP_BY mode */ |
328 | #define UNDEF_POS (-1) |
329 | |
330 | #define IN_SUBQUERY_CONVERSION_THRESHOLD 1000 |
331 | |
332 | #endif /* !MYSQL_CLIENT */ |
333 | |
334 | /* BINLOG_DUMP options */ |
335 | |
336 | #define BINLOG_DUMP_NON_BLOCK 1 |
337 | #define BINLOG_SEND_ANNOTATE_ROWS_EVENT 2 |
338 | |
339 | #ifndef MYSQL_CLIENT |
340 | |
341 | /* |
342 | Some defines for exit codes for ::is_equal class functions. |
343 | */ |
344 | #define IS_EQUAL_NO 0 |
345 | #define IS_EQUAL_YES 1 |
346 | #define IS_EQUAL_PACK_LENGTH 2 |
347 | |
348 | enum enum_parsing_place |
349 | { |
350 | NO_MATTER, |
351 | IN_HAVING, |
352 | SELECT_LIST, |
353 | IN_WHERE, |
354 | IN_ON, |
355 | IN_GROUP_BY, |
356 | IN_ORDER_BY, |
357 | IN_UPDATE_ON_DUP_KEY, |
358 | IN_PART_FUNC, |
359 | PARSING_PLACE_SIZE /* always should be the last */ |
360 | }; |
361 | |
362 | |
363 | class sys_var; |
364 | |
365 | enum enum_yes_no_unknown |
366 | { |
367 | TVL_YES, TVL_NO, TVL_UNKNOWN |
368 | }; |
369 | |
370 | #ifdef MYSQL_SERVER |
371 | |
372 | /* |
373 | External variables |
374 | */ |
375 | |
376 | |
377 | /* sql_yacc.cc */ |
378 | #ifndef DBUG_OFF |
379 | extern void turn_parser_debug_on(); |
380 | |
381 | #endif |
382 | |
383 | /** |
384 | convert a hex digit into number. |
385 | */ |
386 | |
387 | inline int hexchar_to_int(char c) |
388 | { |
389 | if (c <= '9' && c >= '0') |
390 | return c-'0'; |
391 | c|=32; |
392 | if (c <= 'f' && c >= 'a') |
393 | return c-'a'+10; |
394 | return -1; |
395 | } |
396 | |
397 | /* This must match the path length limit in the ER_NOT_RW_DIR error msg. */ |
398 | #define ER_NOT_RW_DIR_PATHSIZE 200 |
399 | |
400 | #define IS_TABLESPACES_TABLESPACE_NAME 0 |
401 | #define IS_TABLESPACES_ENGINE 1 |
402 | #define IS_TABLESPACES_TABLESPACE_TYPE 2 |
403 | #define IS_TABLESPACES_LOGFILE_GROUP_NAME 3 |
404 | #define IS_TABLESPACES_EXTENT_SIZE 4 |
405 | #define IS_TABLESPACES_AUTOEXTEND_SIZE 5 |
406 | #define IS_TABLESPACES_MAXIMUM_SIZE 6 |
407 | #define IS_TABLESPACES_NODEGROUP_ID 7 |
408 | #define 8 |
409 | |
410 | bool db_name_is_in_ignore_db_dirs_list(const char *dbase); |
411 | |
412 | #endif /* MYSQL_SERVER */ |
413 | |
414 | #endif /* MYSQL_CLIENT */ |
415 | |
416 | #endif /* SQL_PRIV_INCLUDED */ |
417 | |