1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-07-29 08:01:23 +03:00

Add new interfaces for accessing the list of SQL keywords:

sqlite3_keyword_count(), sqlite3_keyword_name(), sqlite3_keyword_check().

FossilOrigin-Name: 7dd34e3776fed90a49344d54a1b68bb59f7957b5a8a1a367087b7cafb63111c1
This commit is contained in:
drh
2018-04-25 19:02:48 +00:00
parent 7eabc44dee
commit fc0ec3e5e8
9 changed files with 92 additions and 185 deletions

View File

@ -617,6 +617,16 @@ int main(int argc, char **argv){
printf(" return id;\n");
printf("}\n");
printf("#define SQLITE_N_KEYWORD %d\n", nKeyword);
printf("int sqlite3_keyword_name(int i,const char **pzName,int *pnName){\n");
printf(" if( i<0 || i>=SQLITE_N_KEYWORD ) return SQLITE_ERROR;\n");
printf(" *pzName = zKWText + aKWOffset[i];\n");
printf(" *pnName = aKWLen[i];\n");
printf(" return SQLITE_OK;\n");
printf("}\n");
printf("int sqlite3_keyword_count(void){ return SQLITE_N_KEYWORD; }\n");
printf("int sqlite3_keyword_check(const char *zName, int nName){\n");
printf(" return TK_ID!=sqlite3KeywordCode((const u8*)zName, nName);\n");
printf("}\n");
return 0;
}

View File

@ -134,29 +134,8 @@ static void strPrintf(Str *p, const char *zFormat, ...){
** needed.
*/
static char *safeId(const char *zId){
/* All SQLite keywords, in alphabetical order */
static const char *azKeywords[] = {
"ABORT", "ACTION", "ADD", "AFTER", "ALL", "ALTER", "ANALYZE", "AND", "AS",
"ASC", "ATTACH", "AUTOINCREMENT", "BEFORE", "BEGIN", "BETWEEN", "BY",
"CASCADE", "CASE", "CAST", "CHECK", "COLLATE", "COLUMN", "COMMIT",
"CONFLICT", "CONSTRAINT", "CREATE", "CROSS", "CURRENT_DATE",
"CURRENT_TIME", "CURRENT_TIMESTAMP", "DATABASE", "DEFAULT", "DEFERRABLE",
"DEFERRED", "DELETE", "DESC", "DETACH", "DISTINCT", "DO", "DROP", "EACH",
"ELSE", "END", "ESCAPE", "EXCEPT", "EXCLUSIVE", "EXISTS", "EXPLAIN",
"FAIL", "FOR", "FOREIGN", "FROM", "FULL", "GLOB", "GROUP", "HAVING", "IF",
"IGNORE", "IMMEDIATE", "IN", "INDEX", "INDEXED", "INITIALLY", "INNER",
"INSERT", "INSTEAD", "INTERSECT", "INTO", "IS", "ISNULL", "JOIN", "KEY",
"LEFT", "LIKE", "LIMIT",
"MATCH", "NATURAL", "NO", "NOT", "NOTHING", "NOTNULL",
"NULL", "OF", "OFFSET", "ON", "OR", "ORDER", "OUTER", "PLAN", "PRAGMA",
"PRIMARY", "QUERY", "RAISE", "RECURSIVE", "REFERENCES", "REGEXP",
"REINDEX", "RELEASE", "RENAME", "REPLACE", "RESTRICT", "RIGHT",
"ROLLBACK", "ROW", "SAVEPOINT", "SELECT", "SET", "TABLE", "TEMP",
"TEMPORARY", "THEN", "TO", "TRANSACTION", "TRIGGER", "UNION", "UNIQUE",
"UPDATE", "USING", "VACUUM", "VALUES", "VIEW", "VIRTUAL", "WHEN", "WHERE",
"WITH", "WITHOUT",
};
int lwr, upr, mid, c, i, x;
int i, x;
char c;
if( zId[0]==0 ) return sqlite3_mprintf("\"\"");
for(i=x=0; (c = zId[i])!=0; i++){
if( !isalpha(c) && c!='_' ){
@ -167,20 +146,10 @@ static char *safeId(const char *zId){
}
}
}
if( x ) return sqlite3_mprintf("%s", zId);
lwr = 0;
upr = sizeof(azKeywords)/sizeof(azKeywords[0]) - 1;
while( lwr<=upr ){
mid = (lwr+upr)/2;
c = sqlite3_stricmp(azKeywords[mid], zId);
if( c==0 ) return sqlite3_mprintf("\"%w\"", zId);
if( c<0 ){
lwr = mid+1;
}else{
upr = mid-1;
}
if( x || !sqlite3_keyword_check(zId,i) ){
return sqlite3_mprintf("%s", zId);
}
return sqlite3_mprintf("%s", zId);
return sqlite3_mprintf("\"%w\"", zId);
}
/*