MySQL 8.4.2
Source Code Documentation
sql_lexer_input_stream.h
Go to the documentation of this file.
1/*
2 Copyright (c) 2022, 2024, Oracle and/or its affiliates.
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, version 2.0,
6 as published by the Free Software Foundation.
7
8 This program is designed to work with certain software (including
9 but not limited to OpenSSL) that is licensed under separate terms,
10 as designated in a particular file or component or in included license
11 documentation. The authors of MySQL hereby grant you an additional
12 permission to link the program and your derivative works with the
13 separately licensed software that they have either included with
14 the program or referenced in the documentation.
15
16 This program is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
20
21 You should have received a copy of the GNU General Public License
22 along with this program; if not, write to the Free Software
23 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
24*/
25
26#ifndef ROUTING_SQL_LEXER_INPUT_STREAM_INCLUDED
27#define ROUTING_SQL_LEXER_INPUT_STREAM_INCLUDED
28
29#include <cassert>
30#include <cstddef>
31#include <cstring> // memcpy
32
33#include "lex_string.h" // LEX_STRING
34#include "my_inttypes.h" // uchar, uint, ...
35#include "mysql/strings/m_ctype.h" // my_charset_...
36#include "sql/lexer_yystype.h"
38#include "strings/sql_chars.h" // my_lex_states
39
40#include "sql_lexer_error.h" // warn_on_...
41
42class THD;
43
44/**
45 The state of the lexical parser, when parsing comments.
46 */
48 /**
49 Not parsing comments.
50 */
52
53 /**
54 Parsing comments that need to be preserved.
55 (Copy '/' '*' and '*' '/' sequences to the preprocessed buffer.)
56 Typically, these are user comments '/' '*' ... '*' '/'.
57 */
59
60 /**
61 Parsing comments that need to be discarded.
62 (Don't copy '/' '*' '!' and '*' '/' sequences to the preprocessed buffer.)
63 Typically, these are special comments '/' '*' '!' ... '*' '/',
64 or '/' '*' '!' 'M' 'M' 'm' 'm' 'm' ... '*' '/', where the comment
65 markers should not be expanded.
66 */
68};
69
71 public:
72 /**
73 Constructor
74
75 @param grammar_selector_token_arg See grammar_selector_token.
76 */
77
78 explicit Lex_input_stream(uint grammar_selector_token_arg)
79 : grammar_selector_token(grammar_selector_token_arg) {}
80
81 /**
82 Object initializer. Must be called before usage.
83
84 @retval false OK
85 @retval true Error
86 */
87 bool init(THD *thd, const char *buff, size_t length);
88
89 void reset(const char *buff, size_t length);
90
91 /**
92 Set the echo mode.
93
94 When echo is true, characters parsed from the raw input stream are
95 preserved. When false, characters parsed are silently ignored.
96 @param echo the echo mode.
97 */
98 void set_echo(bool echo) { m_echo = echo; }
99
103 }
104
108 }
109
110 /**
111 Skip binary from the input stream.
112 @param n number of bytes to accept.
113 */
114 void skip_binary(int n) {
115 assert(m_ptr + n <= m_end_of_query);
116 if (m_echo) {
117 memcpy(m_cpp_ptr, m_ptr, n);
118 m_cpp_ptr += n;
119 }
120 m_ptr += n;
121 }
122
123 /**
124 Get a character, and advance in the stream.
125 @return the next character to parse.
126 */
127 unsigned char yyGet() {
128 assert(m_ptr <= m_end_of_query);
129 char c = *m_ptr++;
130 if (m_echo) *m_cpp_ptr++ = c;
131 return c;
132 }
133
134 /**
135 Get the last character accepted.
136 @return the last character accepted.
137 */
138 unsigned char yyGetLast() const { return m_ptr[-1]; }
139
140 /**
141 Look at the next character to parse, but do not accept it.
142 */
143 unsigned char yyPeek() const {
144 assert(m_ptr <= m_end_of_query);
145 return m_ptr[0];
146 }
147
148 /**
149 Look ahead at some character to parse.
150 @param n offset of the character to look up
151 */
152 unsigned char yyPeekn(int n) const {
153 assert(m_ptr + n <= m_end_of_query);
154 return m_ptr[n];
155 }
156
157 /**
158 Cancel the effect of the last yyGet() or yySkip().
159 Note that the echo mode should not change between calls to yyGet / yySkip
160 and yyUnget. The caller is responsible for ensuring that.
161 */
162 void yyUnget() {
163 m_ptr--;
164 if (m_echo) m_cpp_ptr--;
165 }
166
167 /**
168 Accept a character, by advancing the input stream.
169 */
170 void yySkip() {
171 assert(m_ptr <= m_end_of_query);
172 if (m_echo)
173 *m_cpp_ptr++ = *m_ptr++;
174 else
175 m_ptr++;
176 }
177
178 /**
179 Accept multiple characters at once.
180 @param n the number of characters to accept.
181 */
182 void yySkipn(int n) {
183 assert(m_ptr + n <= m_end_of_query);
184 if (m_echo) {
185 memcpy(m_cpp_ptr, m_ptr, n);
186 m_cpp_ptr += n;
187 }
188 m_ptr += n;
189 }
190
191 /**
192 Puts a character back into the stream, canceling
193 the effect of the last yyGet() or yySkip().
194 Note that the echo mode should not change between calls
195 to unput, get, or skip from the stream.
196 */
197 char *yyUnput(char ch) {
198 *--m_ptr = ch;
199 if (m_echo) m_cpp_ptr--;
200 return m_ptr;
201 }
202
203 /**
204 Inject a character into the pre-processed stream.
205
206 Note, this function is used to inject a space instead of multi-character
207 C-comment. Thus there is no boundary checks here (basically, we replace
208 N-chars by 1-char here).
209 */
210 char *cpp_inject(char ch) {
211 *m_cpp_ptr = ch;
212 return ++m_cpp_ptr;
213 }
214
215 /**
216 End of file indicator for the query text to parse.
217 @return true if there are no more characters to parse
218 */
219 bool eof() const { return (m_ptr >= m_end_of_query); }
220
221 /**
222 End of file indicator for the query text to parse.
223 @param n number of characters expected
224 @return true if there are less than n characters to parse
225 */
226 bool eof(int n) const { return ((m_ptr + n) >= m_end_of_query); }
227
228 /** Get the raw query buffer. */
229 const char *get_buf() const { return m_buf; }
230
231 /** Get the pre-processed query buffer. */
232 const char *get_cpp_buf() const { return m_cpp_buf; }
233
234 /** Get the end of the raw query buffer. */
235 const char *get_end_of_query() const { return m_end_of_query; }
236
237 /** Mark the stream position as the start of a new token. */
238 void start_token() {
241
244 }
245
246 /**
247 Adjust the starting position of the current token.
248 This is used to compensate for starting whitespace.
249 */
253 }
254
255 /** Get the token start position, in the raw buffer. */
256 const char *get_tok_start() const { return m_tok_start; }
257
258 /** Get the token start position, in the pre-processed buffer. */
259 const char *get_cpp_tok_start() const { return m_cpp_tok_start; }
260
261 /** Get the token end position, in the raw buffer. */
262 const char *get_tok_end() const { return m_tok_end; }
263
264 /** Get the token end position, in the pre-processed buffer. */
265 const char *get_cpp_tok_end() const { return m_cpp_tok_end; }
266
267 /** Get the current stream pointer, in the raw buffer. */
268 const char *get_ptr() const { return m_ptr; }
269
270 /** Get the current stream pointer, in the pre-processed buffer. */
271 const char *get_cpp_ptr() const { return m_cpp_ptr; }
272
273 /** Get the length of the current token, in the raw buffer. */
274 uint yyLength() const {
275 /*
276 The assumption is that the lexical analyser is always 1 character ahead,
277 which the -1 account for.
278 */
279 assert(m_ptr > m_tok_start);
280 return (uint)((m_ptr - m_tok_start) - 1);
281 }
282
283 /** Get the utf8-body string. */
284 const char *get_body_utf8_str() const { return m_body_utf8; }
285
286 /** Get the utf8-body length. */
287 uint get_body_utf8_length() const {
288 return (uint)(m_body_utf8_ptr - m_body_utf8);
289 }
290
291 void body_utf8_start(THD *thd, const char *begin_ptr);
292 void body_utf8_append(const char *ptr);
293 void body_utf8_append(const char *ptr, const char *end_ptr);
294 void body_utf8_append_literal(THD *thd, const LEX_STRING *txt,
295 const CHARSET_INFO *txt_cs,
296 const char *end_ptr);
297
298 uint get_lineno(const char *raw_ptr) const;
299
300 /** Current thread. */
302
303 /** Current line number. */
305
306 /** Length of the last token parsed. */
308
309 /** Interface with bison, value of the last token parsed. */
311
312 /**
313 LALR(2) resolution, look ahead token.
314 Value of the next token to return, if any,
315 or -1, if no token was parsed in advance.
316 Note: 0 is a legal token, and represents YYEOF.
317 */
319
320 /** LALR(2) resolution, value of the look ahead token.*/
322
323 /// Skip adding of the current token's digest since it is already added
324 ///
325 /// Usually we calculate a digest token by token at the top-level function
326 /// of the lexer: MYSQLlex(). However, some complex ("hintable") tokens break
327 /// that data flow: for example, the `SELECT /*+ HINT(t) */` is the single
328 /// token from the main parser's point of view, and we add the "SELECT"
329 /// keyword to the digest buffer right after the lex_one_token() call,
330 /// but the "/*+ HINT(t) */" is a sequence of separate tokens from the hint
331 /// parser's point of view, and we add those tokens to the digest buffer
332 /// *inside* the lex_one_token() call. Thus, the usual data flow adds
333 /// tokens from the "/*+ HINT(t) */" string first, and only than it appends
334 /// the "SELECT" keyword token to that stream: "/*+ HINT(t) */ SELECT".
335 /// This is not acceptable, since we use the digest buffer to restore
336 /// query strings in their normalized forms, so the order of added tokens is
337 /// important. Thus, we add tokens of "hintable" keywords to a digest buffer
338 /// right in the hint parser and skip adding of them at the caller with the
339 /// help of skip_digest flag.
341
342 void add_digest_token(uint token, Lexer_yystype *yylval);
343
344 void reduce_digest_token(uint token_left, uint token_right);
345
346 /**
347 True if this scanner tokenizes a partial query (partition expression,
348 generated column expression etc.)
349
350 @return true if parsing a partial query, otherwise false.
351 */
352 bool is_partial_parser() const { return grammar_selector_token >= 0; }
353
354 /**
355 Outputs warnings on deprecated charsets in complete SQL statements
356
357 @param [in] cs The character set/collation to check for a deprecation.
358 @param [in] alias The name/alias of @p cs.
359 */
361 const char *alias) const {
362 if (!is_partial_parser()) {
364 }
365 }
366
367 /**
368 Outputs warnings on deprecated collations in complete SQL statements
369
370 @param [in] collation The collation to check for a deprecation.
371 */
373 if (!is_partial_parser()) {
375 }
376 }
377
379
380 private:
381 /** Pointer to the current position in the raw input stream. */
382 char *m_ptr;
383
384 /** Starting position of the last token parsed, in the raw buffer. */
385 const char *m_tok_start;
386
387 /** Ending position of the previous token parsed, in the raw buffer. */
388 const char *m_tok_end;
389
390 /** End of the query text in the input stream, in the raw buffer. */
391 const char *m_end_of_query;
392
393 /** Begining of the query text in the input stream, in the raw buffer. */
394 const char *m_buf;
395
396 /** Length of the raw buffer. */
398
399 /** Echo the parsed stream to the pre-processed buffer. */
400 bool m_echo;
402
403 /** Pre-processed buffer. */
405
406 /** Pointer to the current position in the pre-processed input stream. */
408
409 /**
410 Starting position of the last token parsed,
411 in the pre-processed buffer.
412 */
413 const char *m_cpp_tok_start;
414
415 /**
416 Ending position of the previous token parsed,
417 in the pre-processed buffer.
418 */
419 const char *m_cpp_tok_end;
420
421 /** UTF8-body buffer created during parsing. */
423
424 /** Pointer to the current position in the UTF8-body buffer. */
426
427 /**
428 Position in the pre-processed buffer. The query from m_cpp_buf to
429 m_cpp_utf_processed_ptr is converted to UTF8-body.
430 */
432
433 public:
434 /** Current state of the lexical analyser. */
436
437 /**
438 Position of ';' in the stream, to delimit multiple queries.
439 This delimiter is in the raw buffer.
440 */
441 const char *found_semicolon;
442
443 /** Token character bitmaps, to detect 7bit strings. */
445
446 /** SQL_MODE = IGNORE_SPACE. */
448
449 /**
450 true if we're parsing a prepared statement: in this mode
451 we should allow placeholders.
452 */
454 /**
455 true if we should allow multi-statements.
456 */
458
459 /** State of the lexical analyser for comments. */
462
463 /**
464 Starting position of the TEXT_STRING or IDENT in the pre-processed
465 buffer.
466
467 NOTE: this member must be used within MYSQLlex() function only.
468 */
469 const char *m_cpp_text_start;
470
471 /**
472 Ending position of the TEXT_STRING or IDENT in the pre-processed
473 buffer.
474
475 NOTE: this member must be used within MYSQLlex() function only.
476 */
477 const char *m_cpp_text_end;
478
479 /**
480 Character set specified by the character-set-introducer.
481
482 NOTE: this member must be used within MYSQLlex() function only.
483 */
485
486 /**
487 Current statement digest instrumentation.
488 */
490
491 /**
492 The synthetic 1st token to prepend token stream with.
493
494 This token value tricks parser to simulate multiple %start-ing points.
495 Currently the grammar is aware of 4 such synthetic tokens:
496 1. GRAMMAR_SELECTOR_PART for partitioning stuff from DD,
497 2. GRAMMAR_SELECTOR_GCOL for generated column stuff from DD,
498 3. GRAMMAR_SELECTOR_EXPR for generic single expressions from DD/.frm.
499 4. GRAMMAR_SELECTOR_CTE for generic subquery expressions from CTEs.
500 5. -1 when parsing with the main grammar (no grammar selector available).
501
502 @note yylex() is expected to return the value of type int:
503 0 is for EOF and everything else for real token numbers.
504 Bison, in its turn, generates positive token numbers.
505 So, the negative grammar_selector_token means "not a token".
506 In other words, -1 is "empty value".
507 */
509
510 bool text_string_is_7bit() const { return !(tok_bitmap & 0x80); }
511};
512
513#endif
This class represents the character input stream consumed during lexical analysis.
Definition: sql_lexer_input_stream.h:70
void restart_token()
Adjust the starting position of the current token.
Definition: sql_lexer_input_stream.h:250
void body_utf8_start(THD *thd, const char *begin_ptr)
The operation is called from the parser in order to 1) designate the intention to have utf8 body; 1) ...
Definition: sql_lexer.cc:154
const int grammar_selector_token
The synthetic 1st token to prepend token stream with.
Definition: sql_lexer_input_stream.h:508
void skip_binary(int n)
Skip binary from the input stream.
Definition: sql_lexer_input_stream.h:114
bool skip_digest
Skip adding of the current token's digest since it is already added.
Definition: sql_lexer_input_stream.h:340
const char * m_cpp_text_end
Ending position of the TEXT_STRING or IDENT in the pre-processed buffer.
Definition: sql_lexer_input_stream.h:477
const char * get_end_of_query() const
Get the end of the raw query buffer.
Definition: sql_lexer_input_stream.h:235
sql_digest_state * m_digest
Current statement digest instrumentation.
Definition: sql_lexer_input_stream.h:489
const char * get_cpp_tok_start() const
Get the token start position, in the pre-processed buffer.
Definition: sql_lexer_input_stream.h:259
void body_utf8_append(const char *ptr)
The operation appends unprocessed part of the pre-processed buffer till the given pointer (ptr) and s...
Definition: sql_lexer.cc:215
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:74
enum my_lex_states next_state
Current state of the lexical analyser.
Definition: sql_lexer_input_stream.h:435
const char * get_tok_end() const
Get the token end position, in the raw buffer.
Definition: sql_lexer_input_stream.h:262
uint yyLength() const
Get the length of the current token, in the raw buffer.
Definition: sql_lexer_input_stream.h:274
char * m_body_utf8
UTF8-body buffer created during parsing.
Definition: sql_lexer_input_stream.h:422
const char * get_ptr() const
Get the current stream pointer, in the raw buffer.
Definition: sql_lexer_input_stream.h:268
enum_comment_state in_comment_saved
Definition: sql_lexer_input_stream.h:461
bool eof(int n) const
End of file indicator for the query text to parse.
Definition: sql_lexer_input_stream.h:226
uint get_lineno(const char *raw_ptr) const
Definition: sql_lex.cc:1189
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:259
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:265
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:231
unsigned char yyGetLast() const
Get the last character accepted.
Definition: sql_lexer_input_stream.h:138
bool ignore_space
SQL_MODE = IGNORE_SPACE.
Definition: sql_lexer_input_stream.h:447
void set_echo(bool echo)
Set the echo mode.
Definition: sql_lexer_input_stream.h:98
Lexer_yystype * yylval
Interface with bison, value of the last token parsed.
Definition: sql_lexer_input_stream.h:310
void start_token()
Mark the stream position as the start of a new token.
Definition: sql_lexer_input_stream.h:238
void reset(const char *buff, size_t length)
Prepare Lex_input_stream instance state for use for handling next SQL statement.
Definition: sql_lexer.cc:102
void yyUnget()
Cancel the effect of the last yyGet() or yySkip().
Definition: sql_lexer_input_stream.h:162
char * m_ptr
Pointer to the current position in the raw input stream.
Definition: sql_lexer_input_stream.h:382
const char * m_end_of_query
End of the query text in the input stream, in the raw buffer.
Definition: sql_lexer_input_stream.h:391
unsigned char yyPeekn(int n) const
Look ahead at some character to parse.
Definition: sql_lexer_input_stream.h:152
unsigned char yyPeek() const
Look at the next character to parse, but do not accept it.
Definition: sql_lexer_input_stream.h:143
bool eof() const
End of file indicator for the query text to parse.
Definition: sql_lexer_input_stream.h:219
const CHARSET_INFO * m_underscore_cs
Character set specified by the character-set-introducer.
Definition: sql_lexer_input_stream.h:484
const char * m_tok_end
Ending position of the previous token parsed, in the raw buffer.
Definition: sql_lexer_input_stream.h:388
bool is_partial_parser() const
True if this scanner tokenizes a partial query (partition expression, generated column expression etc...
Definition: sql_lexer_input_stream.h:352
const char * m_buf
Begining of the query text in the input stream, in the raw buffer.
Definition: sql_lexer_input_stream.h:394
const char * m_cpp_tok_start
Starting position of the last token parsed, in the pre-processed buffer.
Definition: sql_lexer_input_stream.h:413
uint yytoklen
Length of the last token parsed.
Definition: sql_lexer_input_stream.h:307
const char * get_cpp_ptr() const
Get the current stream pointer, in the pre-processed buffer.
Definition: sql_lexer_input_stream.h:271
For each client connection we create a separate thread with THD serving as a thread/connection descri...
Definition: sql_lexer_thd.h:36
@ NO_COMMENT
Not parsing comments.
Definition: sql_lexer_input_stream.h:51
@ DISCARD_COMMENT
Parsing comments that need to be discarded.
Definition: sql_lexer_input_stream.h:67
@ PRESERVE_COMMENT
Parsing comments that need to be preserved.
Definition: sql_lexer_input_stream.h:58
A better implementation of the UNIX ctype(3) library.
Some integer typedefs for easier portability.
unsigned char uchar
Definition: my_inttypes.h:52
const char * collation
Definition: audit_api_message_emit.cc:184
Definition: commit_order_queue.h:34
bool length(const dd::Spatial_reference_system *srs, const Geometry *g1, double *length, bool *null) noexcept
Computes the length of linestrings and multilinestrings.
Definition: length.cc:76
my_lex_states
Definition: sql_chars.h:37
enum_comment_state
The state of the lexical parser, when parsing comments.
Definition: sql_lexer_input_stream.h:47
Definition: m_ctype.h:423
Definition: mysql_lex_string.h:35
State data storage for digest_start, digest_add_token.
Definition: sql_digest_stream.h:36
Definition: lexer_yystype.h:33
int n
Definition: xcom_base.cc:509