@@ -55,7 +55,7 @@ union MYSQL_YYSTYPE;
5555 "DELETE" { return TOKEN_DELETE; }
5656 "LOW_PRIORITY" { return TOKEN_LOW_PRIORITY; }
5757 "QUICK" { return TOKEN_QUICK; }
58- "IGNORE" { return TOKEN_IGNORE_SYM; }
58+ "IGNORE" { return TOKEN_IGNORE_SYM; } /* Changed from TOKEN_IGNORE to avoid conflict if IGNORE is a general keyword */
5959 "USING" { return TOKEN_USING; }
6060 "ORDER" { return TOKEN_ORDER; }
6161 "BY" { return TOKEN_BY; }
@@ -68,7 +68,7 @@ union MYSQL_YYSTYPE;
6868 "GROUP" { return TOKEN_GROUP; }
6969 "ALL" { return TOKEN_ALL; }
7070 "HAVING" { return TOKEN_HAVING; }
71- "AND" { return TOKEN_AND; } // Moved here
71+ "AND" { return TOKEN_AND; }
7272
7373 /* JOIN related keywords */
7474 "JOIN" { return TOKEN_JOIN; }
@@ -92,6 +92,24 @@ union MYSQL_YYSTYPE;
9292 "SKIP" { return TOKEN_SKIP; }
9393 "LOCKED" { return TOKEN_LOCKED; }
9494
95+ /* Keywords for SET TRANSACTION (Query 1) */
96+ "TRANSACTION" { return TOKEN_TRANSACTION; }
97+ "ISOLATION" { return TOKEN_ISOLATION; }
98+ "LEVEL" { return TOKEN_LEVEL; }
99+ "READ" { return TOKEN_READ; }
100+ "WRITE" { return TOKEN_WRITE; }
101+ "COMMITTED" { return TOKEN_COMMITTED; }
102+ "UNCOMMITTED" { return TOKEN_UNCOMMITTED; }
103+ "REPEATABLE" { return TOKEN_REPEATABLE; }
104+ "SERIALIZABLE" { return TOKEN_SERIALIZABLE; }
105+
106+ /* Keywords for MATCH AGAINST (Query 5) */
107+ "MATCH" { return TOKEN_MATCH; }
108+ "AGAINST" { return TOKEN_AGAINST; }
109+ "BOOLEAN" { return TOKEN_BOOLEAN; }
110+ "MODE" { return TOKEN_MODE; }
111+ "IN" { return TOKEN_IN; } /* For IN BOOLEAN MODE and IN operator */
112+
95113 /* Keywords for INTO OUTFILE options */
96114 "FIELDS" { return TOKEN_FIELDS; }
97115 "TERMINATED" { return TOKEN_TERMINATED; }
@@ -114,10 +132,10 @@ union MYSQL_YYSTYPE;
114132
115133 "@@global." { return TOKEN_GLOBAL_VAR_PREFIX; }
116134 "@@session." { return TOKEN_SESSION_VAR_PREFIX; }
117- "@@local." { return TOKEN_SESSION_VAR_PREFIX; }
118- "@@persisted." { return TOKEN_PERSIST_VAR_PREFIX; }
119- "@@" { return TOKEN_DOUBLESPECIAL; }
120- "@" { return TOKEN_SPECIAL; }
135+ "@@local." { return TOKEN_SESSION_VAR_PREFIX; } /* local is alias for session */
136+ "@@persisted." { return TOKEN_PERSIST_VAR_PREFIX; } /* MySQL 8 specific */
137+ "@@" { return TOKEN_DOUBLESPECIAL; } /* For @@varname */
138+ "@" { return TOKEN_SPECIAL; } /* For @uservar */
121139
122140 /* Generic Identifier - MUST BE AFTER specific keywords */
123141 [a-zA-Z_][a-zA-Z0-9_]* {
@@ -149,8 +167,8 @@ union MYSQL_YYSTYPE;
149167
150168
151169 [0-9]+("."[0-9]+)?([eE][+-]?[0-9]+)? { SAVE_TOKEN_STRING; return TOKEN_NUMBER_LITERAL; }
152- 0x[0-9a-fA-F]+ { SAVE_TOKEN_STRING; return TOKEN_NUMBER_LITERAL; }
153- X'[0-9a-fA-F]*' { SAVE_TOKEN_STRING; return TOKEN_STRING_LITERAL; }
170+ 0x[0-9a-fA-F]+ { SAVE_TOKEN_STRING; return TOKEN_NUMBER_LITERAL; } /* Hex literal */
171+ X'[0-9a-fA-F]*' { SAVE_TOKEN_STRING; return TOKEN_STRING_LITERAL; } /* Hex string literal X'...' */
154172
155173
156174 . {
@@ -176,7 +194,14 @@ union MYSQL_YYSTYPE;
176194 "[^'\\\\]+" { *(yylval_param->str_val ) += yytext; }
177195 "\\'" { *(yylval_param->str_val ) += " '" ; }
178196 "\\\\" { *(yylval_param->str_val ) += " \\ " ; }
179- "''" { *(yylval_param->str_val ) += " '" ; }
197+ /* Add other standard SQL escape sequences if needed e.g. \n, \t, \b, \r, \0, \Z */
198+ "\\n" { *(yylval_param->str_val ) += " \n " ; }
199+ "\\t" { *(yylval_param->str_val ) += " \t " ; }
200+ "\\r" { *(yylval_param->str_val ) += " \r " ; }
201+ "\\b" { *(yylval_param->str_val ) += " \b " ; }
202+ "\\0" { *(yylval_param->str_val ) += " \0 " ; }
203+ "\\Z" { *(yylval_param->str_val ) += " \x1a " ; } /* Ctrl+Z */
204+ "''" { *(yylval_param->str_val ) += " '" ; } /* SQL standard for literal single quote */
180205 "'" { *(yylval_param->str_val ) += " '" ; BEGIN (INITIAL); return TOKEN_STRING_LITERAL; }
181206 <<EOF>> { if (parser_context) parser_context->internal_add_error (" Unterminated single-quoted string" ); BEGIN (INITIAL); return YY_NULL; }
182207}
@@ -185,19 +210,27 @@ union MYSQL_YYSTYPE;
185210 "[^\"\\\\]+" { *(yylval_param->str_val ) += yytext; }
186211 "\\\"" { *(yylval_param->str_val ) += " \" " ; }
187212 "\\\\" { *(yylval_param->str_val ) += " \\ " ; }
188- "\"\"" { *(yylval_param->str_val ) += " \" " ; }
213+ /* Add other standard SQL escape sequences if needed */
214+ "\\n" { *(yylval_param->str_val ) += " \n " ; }
215+ "\\t" { *(yylval_param->str_val ) += " \t " ; }
216+ "\\r" { *(yylval_param->str_val ) += " \r " ; }
217+ "\\b" { *(yylval_param->str_val ) += " \b " ; }
218+ "\\0" { *(yylval_param->str_val ) += " \0 " ; }
219+ "\\Z" { *(yylval_param->str_val ) += " \x1a " ; }
220+ "\"\"" { *(yylval_param->str_val ) += " \" " ; } /* SQL standard for literal double quote */
189221 "\"" { *(yylval_param->str_val ) += " \" " ; BEGIN (INITIAL); return TOKEN_STRING_LITERAL; }
190222 <<EOF>> { if (parser_context) parser_context->internal_add_error (" Unterminated double-quoted string" ); BEGIN (INITIAL); return YY_NULL; }
191223}
192224
193225<BTIDENT >{
194226 "`" { BEGIN (INITIAL); return TOKEN_IDENTIFIER; }
195- "``" { *(yylval_param->str_val ) += ' `' ; }
227+ "``" { *(yylval_param->str_val ) += ' `' ; } /* Escaped backtick inside identifier */
196228 [^`\n]+ { *(yylval_param->str_val ) += yytext; }
197- \n { if (parser_context) parser_context->internal_add_error (" Newline in backticked identifier" ); BEGIN (INITIAL); }
229+ \n { if (parser_context) parser_context->internal_add_error (" Newline in backticked identifier" ); BEGIN (INITIAL); /* Error, but return to INITIAL */ }
198230 <<EOF>> { if (parser_context) parser_context->internal_add_error (" Unterminated backticked identifier" ); BEGIN (INITIAL); return YY_NULL; }
199231}
200232
201233%%
202234/* C code to be included at the end of the lexer */
203235
236+
0 commit comments