Skip to content

Commit ed0594a

Browse files
committed
More enhancements
* Support for SET SESSION TRANSACTION ISOLATION LEVEL * support for full text search syntax * minus values * schema.table identifier
1 parent 9bfd0a0 commit ed0594a

2 files changed

Lines changed: 387 additions & 173 deletions

File tree

src/mysql_parser/mysql_lexer.l

Lines changed: 45 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)