69
"--"\r?\n comment_token_id = TK_COMMENT; sql_token_append_len(tokens, comment_token_id, GE_STR_LITERAL_WITH_LEN(""));
70
"/*" comment_token_id = TK_COMMENT; sql_token_append_len(tokens, comment_token_id, GE_STR_LITERAL_WITH_LEN("")); BEGIN(COMMENT);
71
"/*!" comment_token_id = TK_COMMENT_MYSQL; sql_token_append_len(tokens, comment_token_id, GE_STR_LITERAL_WITH_LEN("")); BEGIN(COMMENT);
72
"--"[[:blank:]] comment_token_id = TK_COMMENT; sql_token_append_len(tokens, comment_token_id, GE_STR_LITERAL_WITH_LEN("")); BEGIN(LINECOMMENT);
73
<COMMENT>[^*]* sql_token_append_last_token_len(tokens, comment_token_id, yytext, yyleng);
74
<COMMENT>"*"+[^*/]* sql_token_append_last_token_len(tokens, comment_token_id, yytext, yyleng);
64
"--"\r?\n comment_token_id = TK_COMMENT; sql_token_append(tokens, comment_token_id, "");
65
"/*" comment_token_id = TK_COMMENT; sql_token_append(tokens, comment_token_id, ""); BEGIN(COMMENT);
66
"/*!" comment_token_id = TK_COMMENT_MYSQL; sql_token_append(tokens, comment_token_id, ""); BEGIN(COMMENT);
67
"--"[[:blank:]] comment_token_id = TK_COMMENT; sql_token_append(tokens, comment_token_id, ""); BEGIN(LINECOMMENT);
68
<COMMENT>[^*]* sql_token_append_last_token(tokens, comment_token_id, yytext);
69
<COMMENT>"*"+[^*/]* sql_token_append_last_token(tokens, comment_token_id, yytext);
75
70
<COMMENT>"*"+"/" BEGIN(INITIAL);
76
71
<COMMENT><<EOF>> BEGIN(INITIAL);
77
<LINECOMMENT>[^\n]* sql_token_append_last_token_len(tokens, comment_token_id, yytext, yyleng);
72
<LINECOMMENT>[^\n]* sql_token_append_last_token(tokens, comment_token_id, yytext);
78
73
<LINECOMMENT>\r?\n BEGIN(INITIAL);
79
74
<LINECOMMENT><<EOF>> BEGIN(INITIAL);
86
81
case '"': quote_token_id = TK_STRING; break;
87
82
case '`': quote_token_id = TK_LITERAL; break;
89
sql_token_append_len(tokens, quote_token_id, GE_STR_LITERAL_WITH_LEN("")); }
90
<QUOTED>[^"'`\\]* sql_token_append_last_token_len(tokens, quote_token_id, yytext, yyleng); /** all non quote or esc chars are passed through */
91
<QUOTED>"\\". sql_token_append_last_token_len(tokens, quote_token_id, yytext, yyleng); /** add escaping */
84
sql_token_append(tokens, quote_token_id, ""); }
85
<QUOTED>[^"'`\\]* sql_token_append_last_token(tokens, quote_token_id, yytext); /** all non quote or esc chars are passed through */
86
<QUOTED>"\\". sql_token_append_last_token(tokens, quote_token_id, yytext); /** add escaping */
92
87
<QUOTED>["'`]{2} { if (yytext[0] == yytext[1] && yytext[1] == quote_char) {
93
sql_token_append_last_token_len(tokens, quote_token_id, yytext + 1, yyleng - 1); /** doubling quotes */
88
sql_token_append_last_token(tokens, quote_token_id, yytext + 1); /** doubling quotes */
95
/** pick the first char and put the second back to parsing */
90
/** the pick the first char and put the second back to parsing */
97
sql_token_append_last_token_len(tokens, quote_token_id, yytext, yyleng);
100
<QUOTED>["'`] if (*yytext == quote_char) { BEGIN(INITIAL); } else { sql_token_append_last_token_len(tokens, quote_token_id, yytext, yyleng); }
92
sql_token_append_last_token(tokens, quote_token_id, yytext);
95
<QUOTED>["'`] if (*yytext == quote_char) { BEGIN(INITIAL); } else { sql_token_append_last_token(tokens, quote_token_id, yytext); }
101
96
<QUOTED><<EOF>> BEGIN(INITIAL);
103
98
/** strings, quoting, literals */
135
130
[[:digit:]]*[[:alpha:]_@][[:alnum:]_@]*("."[[:digit:]]*[[:alpha:]_@][[:alnum:]_@]*){0,2} {
136
131
char *cur, *tk_start = yytext;
139
132
for (cur = yytext; cur < yytext + yyleng; cur++) {
140
133
if (*cur == '.') {
141
tk_len = cur - tk_start;
143
sql_token_append_len(tokens, sql_token_get_id_len(tk_start, tk_len), tk_start, tk_len);
144
sql_token_append_len(tokens, TK_DOT, GE_STR_LITERAL_WITH_LEN("."));
135
sql_token_append(tokens, sql_token_get_id(tk_start), tk_start);
136
sql_token_append(tokens, TK_DOT, ".");
145
137
tk_start = cur + 1;
149
tk_len = yytext + yyleng - tk_start;
150
sql_token_append_len(tokens, sql_token_get_id_len(tk_start, tk_len), tk_start, tk_len);
140
sql_token_append(tokens, sql_token_get_id(tk_start), tk_start);
152
142
/* literals followed by a ( are function names */
153
143
[[:digit:]]*[[:alpha:]_@][[:alnum:]_@]*("."[[:digit:]]*[[:alpha:]_@][[:alnum:]_@]*){0,2}\( {
154
144
char *cur, *tk_start = yytext;
157
146
yyless(yyleng - 1); /* on step back to track the parantheses correctly */
159
/* split the matched string at the dots */
160
148
for (cur = yytext; cur < yytext + yyleng; cur++) {
161
149
if (*cur == '.') {
162
tk_len = cur - tk_start;
164
sql_token_append_len(tokens, sql_token_get_id_len(tk_start, tk_len), tk_start, tk_len);
165
sql_token_append_len(tokens, TK_DOT, GE_STR_LITERAL_WITH_LEN("."));
151
sql_token_append(tokens, sql_token_get_id(tk_start), tk_start);
152
sql_token_append(tokens, TK_DOT, ".");
166
153
tk_start = cur + 1;
169
tk_len = yytext + yyleng - tk_start;
170
sql_token_append_len(tokens, TK_FUNCTION, tk_start, tk_len);
156
sql_token_append(tokens, TK_FUNCTION, tk_start);
173
[[:digit:]]+ sql_token_append_len(tokens, TK_INTEGER, yytext, yyleng);
174
[[:digit:]]*"."[[:digit:]]+ sql_token_append_len(tokens, TK_FLOAT, yytext, yyleng);
175
"," sql_token_append_len(tokens, TK_COMMA, yytext, yyleng);
176
"." sql_token_append_len(tokens, TK_DOT, yytext, yyleng);
178
"<" sql_token_append_len(tokens, TK_LT, yytext, yyleng);
179
">" sql_token_append_len(tokens, TK_GT, yytext, yyleng);
180
"<=" sql_token_append_len(tokens, TK_LE, yytext, yyleng);
181
">=" sql_token_append_len(tokens, TK_GE, yytext, yyleng);
182
"=" sql_token_append_len(tokens, TK_EQ, yytext, yyleng);
183
"<>" sql_token_append_len(tokens, TK_NE, yytext, yyleng);
184
"!=" sql_token_append_len(tokens, TK_NE, yytext, yyleng);
186
"(" sql_token_append_len(tokens, TK_OBRACE, yytext, yyleng);
187
")" sql_token_append_len(tokens, TK_CBRACE, yytext, yyleng);
188
";" sql_token_append_len(tokens, TK_SEMICOLON, yytext, yyleng);
189
":=" sql_token_append_len(tokens, TK_ASSIGN, yytext, yyleng);
191
"*" sql_token_append_len(tokens, TK_STAR, yytext, yyleng);
192
"+" sql_token_append_len(tokens, TK_PLUS, yytext, yyleng);
193
"/" sql_token_append_len(tokens, TK_DIV, yytext, yyleng);
194
"-" sql_token_append_len(tokens, TK_MINUS, yytext, yyleng);
196
"&" sql_token_append_len(tokens, TK_BITWISE_AND, yytext, yyleng);
197
"&&" sql_token_append_len(tokens, TK_LOGICAL_AND, yytext, yyleng);
198
"|" sql_token_append_len(tokens, TK_BITWISE_OR, yytext, yyleng);
199
"||" sql_token_append_len(tokens, TK_LOGICAL_OR, yytext, yyleng);
201
"^" sql_token_append_len(tokens, TK_BITWISE_XOR, yytext, yyleng);
159
[[:digit:]]+ sql_token_append(tokens, TK_INTEGER, yytext);
160
[[:digit:]]*"."[[:digit:]]+ sql_token_append(tokens, TK_FLOAT, yytext);
161
"," sql_token_append(tokens, TK_COMMA, yytext);
162
"." sql_token_append(tokens, TK_DOT, yytext);
164
"<" sql_token_append(tokens, TK_LT, yytext);
165
">" sql_token_append(tokens, TK_GT, yytext);
166
"<=" sql_token_append(tokens, TK_LE, yytext);
167
">=" sql_token_append(tokens, TK_GE, yytext);
168
"=" sql_token_append(tokens, TK_EQ, yytext);
169
"<>" sql_token_append(tokens, TK_NE, yytext);
170
"!=" sql_token_append(tokens, TK_NE, yytext);
172
"(" sql_token_append(tokens, TK_OBRACE, yytext);
173
")" sql_token_append(tokens, TK_CBRACE, yytext);
174
";" sql_token_append(tokens, TK_SEMICOLON, yytext);
175
":=" sql_token_append(tokens, TK_ASSIGN, yytext);
177
"*" sql_token_append(tokens, TK_STAR, yytext);
178
"+" sql_token_append(tokens, TK_PLUS, yytext);
179
"/" sql_token_append(tokens, TK_DIV, yytext);
180
"-" sql_token_append(tokens, TK_MINUS, yytext);
182
"&" sql_token_append(tokens, TK_BITWISE_AND, yytext);
183
"&&" sql_token_append(tokens, TK_LOGICAL_AND, yytext);
184
"|" sql_token_append(tokens, TK_BITWISE_OR, yytext);
185
"||" sql_token_append(tokens, TK_LOGICAL_OR, yytext);
187
"^" sql_token_append(tokens, TK_BITWISE_XOR, yytext);
203
189
/** the default rule */
204
. sql_token_append_len(tokens, TK_UNKNOWN, yytext, yyleng);
190
. sql_token_append(tokens, TK_UNKNOWN, yytext);
207
193
sql_token *sql_token_new(void) {
255
235
g_assert(token->token_id == token_id);
257
g_string_append_len(token->text, text, text_len);
260
static void sql_token_append_last_token(GPtrArray *tokens, sql_token_id token_id, const gchar *text) {
261
sql_token_append_last_token_len(tokens, token_id, text, strlen(text));
267
} sql_token_cmp_data;
237
g_string_append(token->text, text);
269
240
static int sql_token_cmp(const void *_a, const void *_b) {
270
241
int i = *(int *)_b;
271
const sql_token_cmp_data *name = _a;
242
const char *name = _a;
275
keyword = sql_token_get_name(i, &keyword_len);
245
keyword = sql_token_get_name(i) + sizeof("TK_SQL_") - 1;
276
246
g_assert(keyword); /* if this isn't true, we have a internal problem */
278
keyword += sizeof("TK_SQL_") - 1;
279
keyword_len -= sizeof("TK_SQL_") - 1;
281
for (i = 0; i < keyword_len && i < name->name_len; i++) {
282
int c_diff = g_ascii_tolower(name->name[i]) - g_ascii_tolower(keyword[i]);
284
if (0 != c_diff) return c_diff;
287
/* we are still here, up to now they are the same */
288
return name->name_len - keyword_len;
248
return g_ascii_strcasecmp(name, keyword);
292
252
* get the token_id for a literal
294
sql_token_id sql_token_get_id_len(const gchar *name, gsize name_len) {
254
sql_token_id sql_token_get_id(const gchar *name) {
296
sql_token_cmp_data data;
298
257
/* do a binary search on the sql_keywords */
300
data.name_len = name_len;
303
260
sql_keywords_get(),
304
261
sql_keywords_get_count(),