| 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 |