OLD | NEW |
1 /* | 1 /* |
2 ** Compile and run this standalone program in order to generate code that | 2 ** Compile and run this standalone program in order to generate code that |
3 ** implements a function that will translate alphabetic identifiers into | 3 ** implements a function that will translate alphabetic identifiers into |
4 ** parser token codes. | 4 ** parser token codes. |
5 */ | 5 */ |
6 #include <stdio.h> | 6 #include <stdio.h> |
7 #include <string.h> | 7 #include <string.h> |
8 #include <stdlib.h> | 8 #include <stdlib.h> |
9 #include <assert.h> | 9 #include <assert.h> |
10 | 10 |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
131 #ifdef SQLITE_OMIT_VIRTUALTABLE | 131 #ifdef SQLITE_OMIT_VIRTUALTABLE |
132 # define VTAB 0 | 132 # define VTAB 0 |
133 #else | 133 #else |
134 # define VTAB 0x00010000 | 134 # define VTAB 0x00010000 |
135 #endif | 135 #endif |
136 #ifdef SQLITE_OMIT_AUTOVACUUM | 136 #ifdef SQLITE_OMIT_AUTOVACUUM |
137 # define AUTOVACUUM 0 | 137 # define AUTOVACUUM 0 |
138 #else | 138 #else |
139 # define AUTOVACUUM 0x00020000 | 139 # define AUTOVACUUM 0x00020000 |
140 #endif | 140 #endif |
| 141 #ifdef SQLITE_OMIT_CTE |
| 142 # define CTE 0 |
| 143 #else |
| 144 # define CTE 0x00040000 |
| 145 #endif |
141 | 146 |
142 /* | 147 /* |
143 ** These are the keywords | 148 ** These are the keywords |
144 */ | 149 */ |
145 static Keyword aKeywordTable[] = { | 150 static Keyword aKeywordTable[] = { |
146 { "ABORT", "TK_ABORT", CONFLICT|TRIGGER }, | 151 { "ABORT", "TK_ABORT", CONFLICT|TRIGGER }, |
147 { "ACTION", "TK_ACTION", FKEY }, | 152 { "ACTION", "TK_ACTION", FKEY }, |
148 { "ADD", "TK_ADD", ALTER }, | 153 { "ADD", "TK_ADD", ALTER }, |
149 { "AFTER", "TK_AFTER", TRIGGER }, | 154 { "AFTER", "TK_AFTER", TRIGGER }, |
150 { "ALL", "TK_ALL", ALWAYS }, | 155 { "ALL", "TK_ALL", ALWAYS }, |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
227 { "OFFSET", "TK_OFFSET", ALWAYS }, | 232 { "OFFSET", "TK_OFFSET", ALWAYS }, |
228 { "ON", "TK_ON", ALWAYS }, | 233 { "ON", "TK_ON", ALWAYS }, |
229 { "OR", "TK_OR", ALWAYS }, | 234 { "OR", "TK_OR", ALWAYS }, |
230 { "ORDER", "TK_ORDER", ALWAYS }, | 235 { "ORDER", "TK_ORDER", ALWAYS }, |
231 { "OUTER", "TK_JOIN_KW", ALWAYS }, | 236 { "OUTER", "TK_JOIN_KW", ALWAYS }, |
232 { "PLAN", "TK_PLAN", EXPLAIN }, | 237 { "PLAN", "TK_PLAN", EXPLAIN }, |
233 { "PRAGMA", "TK_PRAGMA", PRAGMA }, | 238 { "PRAGMA", "TK_PRAGMA", PRAGMA }, |
234 { "PRIMARY", "TK_PRIMARY", ALWAYS }, | 239 { "PRIMARY", "TK_PRIMARY", ALWAYS }, |
235 { "QUERY", "TK_QUERY", EXPLAIN }, | 240 { "QUERY", "TK_QUERY", EXPLAIN }, |
236 { "RAISE", "TK_RAISE", TRIGGER }, | 241 { "RAISE", "TK_RAISE", TRIGGER }, |
| 242 { "RECURSIVE", "TK_RECURSIVE", CTE }, |
237 { "REFERENCES", "TK_REFERENCES", FKEY }, | 243 { "REFERENCES", "TK_REFERENCES", FKEY }, |
238 { "REGEXP", "TK_LIKE_KW", ALWAYS }, | 244 { "REGEXP", "TK_LIKE_KW", ALWAYS }, |
239 { "REINDEX", "TK_REINDEX", REINDEX }, | 245 { "REINDEX", "TK_REINDEX", REINDEX }, |
240 { "RELEASE", "TK_RELEASE", ALWAYS }, | 246 { "RELEASE", "TK_RELEASE", ALWAYS }, |
241 { "RENAME", "TK_RENAME", ALTER }, | 247 { "RENAME", "TK_RENAME", ALTER }, |
242 { "REPLACE", "TK_REPLACE", CONFLICT }, | 248 { "REPLACE", "TK_REPLACE", CONFLICT }, |
243 { "RESTRICT", "TK_RESTRICT", FKEY }, | 249 { "RESTRICT", "TK_RESTRICT", FKEY }, |
244 { "RIGHT", "TK_JOIN_KW", ALWAYS }, | 250 { "RIGHT", "TK_JOIN_KW", ALWAYS }, |
245 { "ROLLBACK", "TK_ROLLBACK", ALWAYS }, | 251 { "ROLLBACK", "TK_ROLLBACK", ALWAYS }, |
246 { "ROW", "TK_ROW", TRIGGER }, | 252 { "ROW", "TK_ROW", TRIGGER }, |
247 { "SAVEPOINT", "TK_SAVEPOINT", ALWAYS }, | 253 { "SAVEPOINT", "TK_SAVEPOINT", ALWAYS }, |
248 { "SELECT", "TK_SELECT", ALWAYS }, | 254 { "SELECT", "TK_SELECT", ALWAYS }, |
249 { "SET", "TK_SET", ALWAYS }, | 255 { "SET", "TK_SET", ALWAYS }, |
250 { "TABLE", "TK_TABLE", ALWAYS }, | 256 { "TABLE", "TK_TABLE", ALWAYS }, |
251 { "TEMP", "TK_TEMP", ALWAYS }, | 257 { "TEMP", "TK_TEMP", ALWAYS }, |
252 { "TEMPORARY", "TK_TEMP", ALWAYS }, | 258 { "TEMPORARY", "TK_TEMP", ALWAYS }, |
253 { "THEN", "TK_THEN", ALWAYS }, | 259 { "THEN", "TK_THEN", ALWAYS }, |
254 { "TO", "TK_TO", ALWAYS }, | 260 { "TO", "TK_TO", ALWAYS }, |
255 { "TRANSACTION", "TK_TRANSACTION", ALWAYS }, | 261 { "TRANSACTION", "TK_TRANSACTION", ALWAYS }, |
256 { "TRIGGER", "TK_TRIGGER", TRIGGER }, | 262 { "TRIGGER", "TK_TRIGGER", TRIGGER }, |
257 { "UNION", "TK_UNION", COMPOUND }, | 263 { "UNION", "TK_UNION", COMPOUND }, |
258 { "UNIQUE", "TK_UNIQUE", ALWAYS }, | 264 { "UNIQUE", "TK_UNIQUE", ALWAYS }, |
259 { "UPDATE", "TK_UPDATE", ALWAYS }, | 265 { "UPDATE", "TK_UPDATE", ALWAYS }, |
260 { "USING", "TK_USING", ALWAYS }, | 266 { "USING", "TK_USING", ALWAYS }, |
261 { "VACUUM", "TK_VACUUM", VACUUM }, | 267 { "VACUUM", "TK_VACUUM", VACUUM }, |
262 { "VALUES", "TK_VALUES", ALWAYS }, | 268 { "VALUES", "TK_VALUES", ALWAYS }, |
263 { "VIEW", "TK_VIEW", VIEW }, | 269 { "VIEW", "TK_VIEW", VIEW }, |
264 { "VIRTUAL", "TK_VIRTUAL", VTAB }, | 270 { "VIRTUAL", "TK_VIRTUAL", VTAB }, |
| 271 { "WITH", "TK_WITH", CTE }, |
| 272 { "WITHOUT", "TK_WITHOUT", ALWAYS }, |
265 { "WHEN", "TK_WHEN", ALWAYS }, | 273 { "WHEN", "TK_WHEN", ALWAYS }, |
266 { "WHERE", "TK_WHERE", ALWAYS }, | 274 { "WHERE", "TK_WHERE", ALWAYS }, |
267 }; | 275 }; |
268 | 276 |
269 /* Number of keywords */ | 277 /* Number of keywords */ |
270 static int nKeyword = (sizeof(aKeywordTable)/sizeof(aKeywordTable[0])); | 278 static int nKeyword = (sizeof(aKeywordTable)/sizeof(aKeywordTable[0])); |
271 | 279 |
272 /* An array to map all upper-case characters into their corresponding | 280 /* An array to map all upper-case characters into their corresponding |
273 ** lower-case character. | 281 ** lower-case character. |
274 */ | 282 */ |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
353 if( j<i ){ | 361 if( j<i ){ |
354 aKeywordTable[j] = aKeywordTable[i]; | 362 aKeywordTable[j] = aKeywordTable[i]; |
355 } | 363 } |
356 j++; | 364 j++; |
357 } | 365 } |
358 nKeyword = j; | 366 nKeyword = j; |
359 | 367 |
360 /* Fill in the lengths of strings and hashes for all entries. */ | 368 /* Fill in the lengths of strings and hashes for all entries. */ |
361 for(i=0; i<nKeyword; i++){ | 369 for(i=0; i<nKeyword; i++){ |
362 Keyword *p = &aKeywordTable[i]; | 370 Keyword *p = &aKeywordTable[i]; |
363 p->len = strlen(p->zName); | 371 p->len = (int)strlen(p->zName); |
364 assert( p->len<sizeof(p->zOrigName) ); | 372 assert( p->len<sizeof(p->zOrigName) ); |
365 strcpy(p->zOrigName, p->zName); | 373 memcpy(p->zOrigName, p->zName, p->len+1); |
366 totalLen += p->len; | 374 totalLen += p->len; |
367 p->hash = (UpperToLower[(int)p->zName[0]]*4) ^ | 375 p->hash = (UpperToLower[(int)p->zName[0]]*4) ^ |
368 (UpperToLower[(int)p->zName[p->len-1]]*3) ^ p->len; | 376 (UpperToLower[(int)p->zName[p->len-1]]*3) ^ p->len; |
369 p->id = i+1; | 377 p->id = i+1; |
370 } | 378 } |
371 | 379 |
372 /* Sort the table from shortest to longest keyword */ | 380 /* Sort the table from shortest to longest keyword */ |
373 qsort(aKeywordTable, nKeyword, sizeof(aKeywordTable[0]), keywordCompare1); | 381 qsort(aKeywordTable, nKeyword, sizeof(aKeywordTable[0]), keywordCompare1); |
374 | 382 |
375 /* Look for short keywords embedded in longer keywords */ | 383 /* Look for short keywords embedded in longer keywords */ |
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
593 printf(" }\n"); | 601 printf(" }\n"); |
594 printf(" return TK_ID;\n"); | 602 printf(" return TK_ID;\n"); |
595 printf("}\n"); | 603 printf("}\n"); |
596 printf("int sqlite3KeywordCode(const unsigned char *z, int n){\n"); | 604 printf("int sqlite3KeywordCode(const unsigned char *z, int n){\n"); |
597 printf(" return keywordCode((char*)z, n);\n"); | 605 printf(" return keywordCode((char*)z, n);\n"); |
598 printf("}\n"); | 606 printf("}\n"); |
599 printf("#define SQLITE_N_KEYWORD %d\n", nKeyword); | 607 printf("#define SQLITE_N_KEYWORD %d\n", nKeyword); |
600 | 608 |
601 return 0; | 609 return 0; |
602 } | 610 } |
OLD | NEW |