2
* Copyright (c) 2021 OceanBase
3
* OceanBase CE is licensed under Mulan PubL v2.
4
* You can use this software according to the terms and conditions of the Mulan PubL v2.
5
* You may obtain a copy of Mulan PubL v2 at:
6
* http://license.coscl.org.cn/MulanPubL-2.0
7
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
8
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
9
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
10
* See the Mulan PubL v2 for more details.
14
%option noyywrap nounput noinput yylineno case-insensitive
15
%option noyyalloc noyyrealloc noyyfree
16
%option reentrant bison-bridge bison-locations
17
%option prefix="obpl_mysql_yy"
18
%option header-file="../../../src/pl/parser/pl_parser_mysql_mode_lex.h"
20
#include "pl/parser/pl_parser_base.h"
21
#include "pl_parser_mysql_mode_tab.h"
23
extern void obpl_mysql_yyerror(YYLTYPE *yylloc, ObParseCtx *parse_ctx, char *s,...);
24
extern void obpl_mysql_parse_fatal_error(int32_t errcode, yyscan_t yyscanner, yyconst char *msg, ...);
26
#define YY_FATAL_ERROR(msg, args...) (obpl_mysql_parse_fatal_error(OB_PARSER_ERR_NO_MEMORY, yyscanner, msg, ##args))
27
#define YY_UNEXPECTED_ERROR(msg, args...) (obpl_mysql_parse_fatal_error(OB_PARSER_ERR_UNEXPECTED, yyscanner, msg, ##args))
28
#define YY_NAME_ERROR(msg, args...) (obpl_mysql_parse_fatal_error(OB_PARSER_ERR_ILLEGAL_NAME, yyscanner, msg, ##args))
35
/* the adq is used to process dq in ANSI_QUOTES sql_mode*/
45
UTF8_GB_CHAR ({U_2}{U}|{U_3}{U}{U}|{U_4}{U}{U}{U}|{GB_1}{GB_2}|{GB_1}{GB_3}{GB_1}{GB_3})
48
comment ("--"{space}+{non_newline}*)|(#{non_newline}*)
49
whitespace ({space}+|{comment})
52
identifer (([A-Za-z0-9$_]|{UTF8_GB_CHAR})*)
54
system_variable (@@[A-Za-z_][A-Za-z0-9_]*)
55
user_variable (@[A-Za-z0-9_\.$]*)|(@[`'\"][`'\"A-Za-z0-9_\.$/%]*)|(@%)
60
sqdouble {quote}{quote}
63
sqnewline {quote}{whitespace}{quote}
68
dqdouble {dquote}{dquote}
70
dqnewline {dquote}{whitespace}{dquote}
75
btdouble {backtick}{backtick}
78
mysql_compatible_comment_with_version \/\*\![0-9]{5}
79
mysql_compatible_comment_without_version \/\*\!
80
mysql_compatible_comment_end \*\/
83
ALTER { return ALTER; }
84
BINARY { return BINARY; }
86
CREATE { return CREATE; }
87
DELETE { return DELETE; }
90
FUNCTION { return FUNCTION; }
91
INSERT { return INSERT; }
93
PROCEDURE { return PROCEDURE; }
94
SELECT { return SELECT; }
96
TABLE { return TABLE; }
97
UPDATE { return UPDATE; }
99
REPLACE { return REPLACE; }
101
ObParseCtx *parse_ctx = (ObParseCtx *)yyextra;
102
parse_ctx->is_for_trigger_ = 1;
107
ObParseCtx *parse_ctx = (ObParseCtx *)yyextra;
108
malloc_new_node(yylval->node, parse_ctx->mem_pool_, T_NULL, 0);
113
int32_t token_ret = INTNUM;
114
ParseNode *node = NULL;
116
ObParseCtx *parse_ctx = (ObParseCtx *)yyextra;
117
malloc_new_node(node, parse_ctx->mem_pool_, T_INT, 0);
119
node->str_value_ = parse_strdup(yytext, parse_ctx->mem_pool_, &(node->str_len_));
120
check_ptr(node->str_value_);
122
node->value_ = strtoll(node->str_value_, NULL, 10);
123
if (ERANGE == errno) {
124
/* if out of range, seem it as must NUMERIC type, now is double */
125
node->type_ = T_NUMBER;
126
token_ret = DECIMAL_VAL;
132
[0-9]+"."[0-9]*E[-+]?[0-9]+ |
133
"."[0-9]+E[-+]?[0-9]+ {
134
ParseNode *node = NULL;
135
ObParseCtx *parse_ctx = (ObParseCtx *)yyextra;
136
malloc_new_node(node, parse_ctx->mem_pool_, T_DOUBLE, 0);
139
node->str_value_ = parse_strdup(yytext, parse_ctx->mem_pool_, &(node->str_len_));
140
check_ptr(node->str_value_);
146
ParseNode *node = NULL;
147
ObParseCtx *parse_ctx = (ObParseCtx *)yyextra;
148
malloc_new_node(node, parse_ctx->mem_pool_, T_NUMBER/* should be T_NUMBER,*/, 0);
151
node->str_value_ = parse_strdup(yytext, parse_ctx->mem_pool_, &(node->str_len_));
152
check_ptr(node->str_value_);
158
ObParseCtx *parse_ctx = (ObParseCtx *)yyextra;
159
ObScannerCtx *scanner_ctx = &(parse_ctx->scanner_ctx_);
160
scanner_ctx->first_column_ = yylloc->first_column;
161
prepare_literal_buffer(scanner_ctx, parse_ctx->stmt_len_ + 1, parse_ctx->mem_pool_);
163
malloc_new_node(yylval->node, parse_ctx->mem_pool_, T_VARCHAR, 0);
164
yylval->node->str_len_ = 0;
170
ObParseCtx *parse_ctx = (ObParseCtx *)yyextra;
171
ObScannerCtx *scanner_ctx = &(parse_ctx->scanner_ctx_);
172
char *tmp_literal = scanner_ctx->tmp_literal_;
173
tmp_literal[yylval->node->str_len_] = '\0';
174
yylloc->first_column = scanner_ctx->first_column_;
175
yylval->node->str_value_ = parse_strndup(tmp_literal, yylval->node->str_len_ + 1, parse_ctx->mem_pool_);
181
ObParseCtx *parse_ctx = (ObParseCtx *)yyextra;
182
ObScannerCtx *scanner_ctx = &(parse_ctx->scanner_ctx_);
183
char *tmp_literal = scanner_ctx->tmp_literal_;
184
tmp_literal[yylval->node->str_len_++] = '\'';
189
ObParseCtx *parse_ctx = (ObParseCtx *)yyextra;
190
ObScannerCtx *scanner_ctx = &(parse_ctx->scanner_ctx_);
191
char *tmp_literal = scanner_ctx->tmp_literal_;
192
memmove(tmp_literal + yylval->node->str_len_, yytext, yyleng);
193
yylval->node->str_len_ += yyleng;
197
int with_back_slash = 1;
198
ObParseCtx *parse_ctx = (ObParseCtx *)yyextra;
199
ObScannerCtx *scanner_ctx = &(parse_ctx->scanner_ctx_);
200
char *tmp_literal = scanner_ctx->tmp_literal_;
202
unsigned char c = escaped_char(yytext[1], &with_back_slash);
203
if (with_back_slash) {
204
tmp_literal[yylval->node->str_len_++] = '\\';
206
tmp_literal[yylval->node->str_len_++] = c;
211
In case of two adjacent string literal, such as " 'a' 'b' ", the two string will be
212
concatenate into 'ab'. However, the string 'a' will used as the column name if it appears
213
in the select list, which means we must save it rather than just skipping the 'sqnewline'.
215
One solution is to do this in the yacc and let the lexer produce all strings as individual
216
tokens. However, it will generate ambiguity in the yacc according to our grammar definition.
217
Instead, we remember the first string as a child of the 'T_VARCHAR' node which represents
218
" 'a' 'b' ", whose str_value_ is 'ab'. This will save us from modifying our grammar and a
222
if (0 == yylval->node->num_child_) {
223
ObParseCtx *parse_ctx = (ObParseCtx *)yyextra;
224
ObScannerCtx *scanner_ctx = &(parse_ctx->scanner_ctx_);
225
char *tmp_literal = scanner_ctx->tmp_literal_;
226
tmp_literal[yylval->node->str_len_] = '\0';
227
yylval->node->children_ = (ParseNode **)parse_malloc(sizeof(ParseNode *), parse_ctx->mem_pool_);
228
if (OB_UNLIKELY(NULL == yylval->node->children_)) {
229
YY_FATAL_ERROR("No more space for mallocing '%s'\n", yytext);
232
malloc_new_node(yylval->node->children_[0], parse_ctx->mem_pool_, T_CONCAT_STRING, 0);
233
(*yylval->node->children_)->str_value_ = parse_strndup(tmp_literal, yylval->node->str_len_ + 1,
234
parse_ctx->mem_pool_);
235
(*yylval->node->children_)->str_len_ = yylval->node->str_len_;
236
yylval->node->num_child_ = 1;
241
obpl_mysql_yyerror(yylloc, yyextra, "unterminated quoted string\n");
247
ObParseCtx *parse_ctx = (ObParseCtx *)yyextra;
248
ObScannerCtx *scanner_ctx = &(parse_ctx->scanner_ctx_);
249
scanner_ctx->first_column_ = yylloc->first_column;
250
prepare_literal_buffer(scanner_ctx, parse_ctx->stmt_len_ + 1, parse_ctx->mem_pool_);
251
bool is_ansi_quotes = false;
252
IS_ANSI_QUOTES(scanner_ctx->sql_mode_, is_ansi_quotes);
253
if (is_ansi_quotes) {
255
malloc_new_node(yylval->node, parse_ctx->mem_pool_, T_IDENT, 0);
256
yylval->node->str_len_ = 0;
259
malloc_new_node(yylval->node, parse_ctx->mem_pool_, T_VARCHAR, 0);
260
yylval->node->str_len_ = 0;
266
ObParseCtx *parse_ctx = (ObParseCtx *)yyextra;
267
ObScannerCtx *scanner_ctx = &(parse_ctx->scanner_ctx_);
268
yylloc->first_column = scanner_ctx->first_column_;
269
char *tmp_literal = scanner_ctx->tmp_literal_;
271
tmp_literal[yylval->node->str_len_] = '\0';
272
yylval->node->str_value_ = parse_strndup(tmp_literal, yylval->node->str_len_ + 1, parse_ctx->mem_pool_);
278
ObParseCtx *parse_ctx = (ObParseCtx *)yyextra;
279
ObScannerCtx *scanner_ctx = &(parse_ctx->scanner_ctx_);
280
char *tmp_literal = scanner_ctx->tmp_literal_;
281
tmp_literal[yylval->node->str_len_++] = '\"';
286
ObParseCtx *parse_ctx = (ObParseCtx *)yyextra;
287
ObScannerCtx *scanner_ctx = &(parse_ctx->scanner_ctx_);
288
char *tmp_literal = scanner_ctx->tmp_literal_;
289
memmove(tmp_literal + yylval->node->str_len_, yytext, yyleng);
290
yylval->node->str_len_ += yyleng;
294
int with_back_slash = 1;
295
ObParseCtx *parse_ctx = (ObParseCtx *)yyextra;
296
ObScannerCtx *scanner_ctx = &(parse_ctx->scanner_ctx_);
297
char *tmp_literal = scanner_ctx->tmp_literal_;
299
unsigned char c = escaped_char(yytext[1], &with_back_slash);
300
if (with_back_slash) {
301
tmp_literal[yylval->node->str_len_++] = '\\';
303
tmp_literal[yylval->node->str_len_++] = c;
307
/* see 'sqnewline' */
309
if (0 == yylval->node->num_child_) {
310
ObParseCtx *parse_ctx = (ObParseCtx *)yyextra;
311
ObScannerCtx *scanner_ctx = &(parse_ctx->scanner_ctx_);
312
char *tmp_literal = scanner_ctx->tmp_literal_;
313
tmp_literal[yylval->node->str_len_] = '\0';
315
yylval->node->children_ = (ParseNode **)parse_malloc(sizeof(ParseNode *), parse_ctx->mem_pool_);
316
if (OB_UNLIKELY(NULL == yylval->node->children_)) {
317
YY_FATAL_ERROR("No more space for mallocing '%s'\n", yytext);
320
malloc_new_node(yylval->node->children_[0], parse_ctx->mem_pool_, T_CONCAT_STRING, 0);
321
(*yylval->node->children_)->str_value_ = parse_strndup(tmp_literal, yylval->node->str_len_ + 1,
322
parse_ctx->mem_pool_);
323
(*yylval->node->children_)->str_len_ = yylval->node->str_len_;
324
yylval->node->num_child_ = 1;
329
obpl_mysql_yyerror(yylloc, yyextra, "unterminated doublequoted string\n");
336
ObParseCtx *parse_ctx = (ObParseCtx *)yyextra;
337
ObScannerCtx *scanner_ctx = &(parse_ctx->scanner_ctx_);
338
char *tmp_literal = scanner_ctx->tmp_literal_;
339
yylloc->first_column = scanner_ctx->first_column_;
340
tmp_literal[yylval->node->str_len_] = '\0';
342
char *dup_value = NULL;
343
if (parse_ctx->is_not_utf8_connection_) {
344
dup_value = parse_str_convert_utf8(parse_ctx->charset_info_, tmp_literal,
345
parse_ctx->mem_pool_, &(yylval->node->str_len_),
346
&(parse_ctx->global_errno_));
347
check_identifier_convert_result(parse_ctx->global_errno_);
349
dup_value = parse_strndup(tmp_literal, yylval->node->str_len_ + 1, parse_ctx->mem_pool_);
351
check_ptr(dup_value);
352
yylval->node->str_value_ = dup_value;
358
ObParseCtx *parse_ctx = (ObParseCtx *)yyextra;
359
ObScannerCtx *scanner_ctx = &(parse_ctx->scanner_ctx_);
360
char *tmp_literal = scanner_ctx->tmp_literal_;
361
tmp_literal[yylval->node->str_len_++] = '"';
366
ObParseCtx *parse_ctx = (ObParseCtx *)yyextra;
367
ObScannerCtx *scanner_ctx = &(parse_ctx->scanner_ctx_);
368
char *tmp_literal = scanner_ctx->tmp_literal_;
369
memmove(tmp_literal + yylval->node->str_len_, yytext, yyleng);
370
yylval->node->str_len_ += yyleng;
374
obpl_mysql_yyerror(yylloc, yyextra, "unterminated doublequoted string\n");
378
X'([0-9A-F])*'|0X([0-9A-F])+ {
379
char *src = yytext + 2;
380
size_t len = yyleng - 2;
381
// https://dev.mysql.com/doc/refman/5.7/en/hexadecimal-literals.html
382
// Values written using X'val' notation must contain an even number of digits or a syntax error occurs. To correct the problem, pad the value with a leading zero.
383
// Values written using 0xval notation that contain an odd number of digits are treated as having an extra leading 0. For example, 0xaaa is interpreted as 0x0aaa.
384
if ('\'' == src[len - 1]) {
385
// Values written using X'val' notation
388
obpl_mysql_yyerror(yylloc, yyextra, "hex string contain an even number of digits\n");
389
return PARSER_SYNTAX_ERROR;
392
ParseNode *node = NULL;
393
ObParseCtx *parse_ctx = (ObParseCtx *)yyextra;
395
malloc_new_node(node, parse_ctx->mem_pool_, T_HEX_STRING, 0);
397
int64_t dest_len = ob_parse_binary_len(len);
398
char *dest = (char *)parse_malloc(dest_len, parse_ctx->mem_pool_);
400
ob_parse_binary(src, len, dest);
401
node->str_value_ = dest;
402
node->str_len_ = dest_len;
404
node->str_value_ = NULL;
408
return HEX_STRING_VALUE;
411
B'([01])*'|0B([01])+ {
412
char* src = yytext + 2;
413
size_t len = yyleng - 2;
414
if(src[len - 1] == '\'') {
417
ParseNode *node = NULL;
418
ObParseCtx *parse_ctx = (ObParseCtx *)yyextra;
420
malloc_new_node(node, parse_ctx->mem_pool_, T_HEX_STRING, 0);
422
int64_t dest_len = ob_parse_bit_string_len(len);
423
char *dest = (char*)parse_malloc(dest_len, parse_ctx->mem_pool_);
425
ob_parse_bit_string(src, len, dest);
426
node->str_value_ = dest;
427
node->str_len_ = dest_len;
429
node->str_value_ = NULL;
433
return HEX_STRING_VALUE;
436
Date{whitespace}?'[^']*' {
437
ObParseCtx *parse_ctx = (ObParseCtx *)yyextra;
439
malloc_time_node_s(parse_ctx->mem_pool_, T_DATE);
443
Time{whitespace}?'[^']*' {
444
ObParseCtx *parse_ctx = (ObParseCtx *)yyextra;
445
malloc_time_node_s(parse_ctx->mem_pool_, T_TIME);
450
Timestamp{whitespace}?'[^']*' {
451
ObParseCtx *parse_ctx = (ObParseCtx *)yyextra;
453
malloc_time_node_s(parse_ctx->mem_pool_, T_TIMESTAMP);
456
Date{whitespace}?\"[^\"]*\" {
457
ObParseCtx *parse_ctx = (ObParseCtx *)yyextra;
458
malloc_time_node_d(parse_ctx->mem_pool_, T_DATE);
463
Time{whitespace}?\"[^\"]*\" {
464
ObParseCtx *parse_ctx = (ObParseCtx *)yyextra;
466
malloc_time_node_d(parse_ctx->mem_pool_, T_TIME);
470
Timestamp{whitespace}?\"[^\"]*\" {
471
ObParseCtx *parse_ctx = (ObParseCtx *)yyextra;
473
malloc_time_node_d(parse_ctx->mem_pool_, T_TIMESTAMP);
478
ParseNode *node = NULL;
479
ObParseCtx *parse_ctx = (ObParseCtx *)yyextra;
481
malloc_new_node(node, parse_ctx->mem_pool_, T_SYSTEM_VARIABLE, 0);
484
node->str_value_ = parse_strdup(yytext + 2, parse_ctx->mem_pool_, &(node->str_len_));
485
check_ptr(node->str_value_);
487
return SYSTEM_VARIABLE;
491
ParseNode *node = NULL;
492
ObParseCtx *parse_ctx = (ObParseCtx *)yyextra;
494
malloc_new_node(node, parse_ctx->mem_pool_, T_USER_VARIABLE_IDENTIFIER, 0);
497
node->str_value_ = parse_strdup(yytext + 1, parse_ctx->mem_pool_, &(node->str_len_));
498
if (NULL != node->str_value_
499
&& *(yytext + 1) == *(yytext + node->str_len_)
500
&& (*(yytext + 1) == '\'' || *(yytext + 1) == '\"' || *(yytext + 1) == '`')) {
501
node->str_value_ += 1;
504
check_ptr(node->str_value_);
505
return USER_VARIABLE;
509
BEGIN(bt); /*fast parameterize don't handle connent in ``*/
511
ObParseCtx *parse_ctx = (ObParseCtx *)yyextra;
512
ObScannerCtx *scanner_ctx = &(parse_ctx->scanner_ctx_);
513
scanner_ctx->first_column_ = yylloc->first_column;
514
prepare_literal_buffer(scanner_ctx, parse_ctx->stmt_len_ + 1, parse_ctx->mem_pool_);
515
malloc_new_node(yylval->node, parse_ctx->mem_pool_, T_IDENT, 0);
516
yylval->node->str_len_ = 0;
521
ObParseCtx *parse_ctx = (ObParseCtx *)yyextra;
522
ObScannerCtx *scanner_ctx = &(parse_ctx->scanner_ctx_);
523
char *tmp_literal = scanner_ctx->tmp_literal_;
524
tmp_literal[yylval->node->str_len_++] = '`';
529
ObParseCtx *parse_ctx = (ObParseCtx *)yyextra;
530
ObScannerCtx *scanner_ctx = &(parse_ctx->scanner_ctx_);
531
char *tmp_literal = scanner_ctx->tmp_literal_;
532
memmove(tmp_literal + yylval->node->str_len_, yytext, yyleng);
533
yylval->node->str_len_ += yyleng;
539
ObParseCtx *parse_ctx = (ObParseCtx *)yyextra;
540
ObScannerCtx *scanner_ctx = &(parse_ctx->scanner_ctx_);
541
char *tmp_literal = scanner_ctx->tmp_literal_;
542
yylloc->first_column = scanner_ctx->first_column_;
543
tmp_literal[yylval->node->str_len_] = '\0';
545
char *dup_value = NULL;
546
if (parse_ctx->is_not_utf8_connection_) {
547
dup_value = parse_str_convert_utf8(parse_ctx->charset_info_, tmp_literal,
548
parse_ctx->mem_pool_, &(yylval->node->str_len_),
549
&(parse_ctx->global_errno_));
550
check_identifier_convert_result(parse_ctx->global_errno_);
552
dup_value = parse_strndup(tmp_literal, yylval->node->str_len_ + 1, parse_ctx->mem_pool_);
554
check_ptr(dup_value);
555
yylval->node->str_value_ = dup_value;
560
obpl_mysql_yyerror(yylloc, yyextra, "unterminated backtick string\n");
564
{mysql_compatible_comment_without_version} {
565
//refer to src/sql/parser/sql_parser_mysql_mode.l for more info.
566
ObParseCtx *parse_ctx = (ObParseCtx *)yyextra;
567
parse_ctx->mysql_compatible_comment_ = true;
570
{mysql_compatible_comment_with_version} {
571
ObParseCtx *parse_ctx = (ObParseCtx *)yyextra;
572
parse_ctx->mysql_compatible_comment_ = true;
575
{mysql_compatible_comment_end} {
576
ObParseCtx *parse_ctx = (ObParseCtx *)yyextra;
577
if (parse_ctx->mysql_compatible_comment_) {
578
parse_ctx->mysql_compatible_comment_ = false;
581
char c_ret = yytext[0];
591
<in_c_comment>{c_cmt_end} {
592
// ((ParseResult *)yyextra)->has_encount_comment_ = true;
596
<in_c_comment><<EOF>> {
597
obpl_mysql_yyerror(yylloc, yyextra, "unterminated log_level string\n");
600
<in_c_comment>[\n] { yylineno++; }
604
// ((ParseResult *)yyextra)->has_encount_comment_ = true;
609
int32_t token = mysql_sql_reserved_keyword_lookup(yytext);
611
const NonReservedKeyword *word = NULL;
612
if (NULL == (word = mysql_pl_non_reserved_keyword_lookup(yytext)))
615
ParseNode *node = NULL;
616
ObParseCtx *parse_ctx = (ObParseCtx *)yyextra;
617
malloc_new_node(node, parse_ctx->mem_pool_, T_IDENT, 0);
619
if (parse_ctx->is_not_utf8_connection_) {
620
node->str_value_ = parse_str_convert_utf8(parse_ctx->charset_info_, yytext,
621
parse_ctx->mem_pool_, &(node->str_len_),
622
&(parse_ctx->global_errno_));
623
check_identifier_convert_result(parse_ctx->global_errno_);
625
node->str_value_ = parse_strdup(yytext, parse_ctx->mem_pool_, &(node->str_len_));
628
yylval->non_reserved_keyword = word;
629
token = word->keyword_type;
637
[-+&~|^/%*(),;.:!] { return yytext[0]; }
642
"=>" { return PARAM_ASSIGN_OPERATOR; }
644
<<EOF>> { return END_P; }
645
. { return yytext[0]; }
649
void obpl_mysql_parse_fatal_error(int32_t errcode, yyscan_t yyscanner, yyconst char *msg, ...)
651
ObParseCtx *parse_ctx = obpl_mysql_yyget_extra(yyscanner);
652
if (parse_ctx != NULL) {
653
parse_ctx->global_errno_ = errcode;
654
if (OB_LIKELY(NULL != msg)) {
657
vsnprintf(parse_ctx->global_errmsg_, MAX_ERROR_MSG, msg, ap);
661
longjmp(parse_ctx->jmp_buf_, 1);//the secord param must be non-zero value
664
void *yyalloc(size_t bytes, void *yyscanner)
666
void *ptr_ret = NULL;
667
ObParseCtx *parse_ctx = yyget_extra(yyscanner);
668
check_ptr(parse_ctx);
669
ptr_ret = parse_malloc(bytes, parse_ctx->mem_pool_);
673
void *yyrealloc(void *ptr, size_t bytes, void *yyscanner)
675
void *ptr_ret = NULL;
676
ObParseCtx *parse_ctx = yyget_extra(yyscanner);
677
check_ptr(parse_ctx);
678
ptr_ret = parse_realloc(ptr, bytes, parse_ctx->mem_pool_);
682
void yyfree(void *ptr, void *yyscanner)
685
/* Do nothing -- we leave it to the garbage collector. */