Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Change the NOT operator into !. |
---|---|
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
59096a3d9c4f4b240c05dd108c3838f0 |
User & Date: | drh 2011-07-15 18:36:53 |
Context
2011-07-15
| ||
19:33 | Add ===, !== and >>> operators. check-in: 1296cc1b15 user: drh tags: trunk | |
18:36 | Change the NOT operator into !. check-in: 59096a3d9c user: drh tags: trunk | |
18:22 | Keywords "true", "false", and "null" are now lower-case. ("NULL" can also optionally be all upper-case.) Use && and || instead of AND and OR. check-in: 340cf0441f user: drh tags: trunk | |
Changes
Changes to src/expr.c.
397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 |
xjd1JsonFree(pJRight);
}
pRes->eJType = XJD1_REAL;
xjd1JsonFree(pJLeft);
break;
}
case TK_NOT: {
if( xjd1ExprTrue(p->u.bi.pLeft) ){
pRes->eJType = XJD1_FALSE;
}else{
pRes->eJType = XJD1_TRUE;
}
break;
}
|
| |
397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 |
xjd1JsonFree(pJRight);
}
pRes->eJType = XJD1_REAL;
xjd1JsonFree(pJLeft);
break;
}
case TK_BANG: {
if( xjd1ExprTrue(p->u.bi.pLeft) ){
pRes->eJType = XJD1_FALSE;
}else{
pRes->eJType = XJD1_TRUE;
}
break;
}
|
Changes to src/parse.y.
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
...
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
|
jvalue(A) ::= TRUE. {A = jsonType(p,XJD1_TRUE);} jvalue(A) ::= FALSE. {A = jsonType(p,XJD1_FALSE);} jvalue(A) ::= NULL. {A = jsonType(p,XJD1_NULL);} %left OR. %left AND. %right NOT. %left IS LIKEOP BETWEEN IN NE EQEQ. %left GT LE LT GE. %right ESCAPE. %left BITAND BITOR LSHIFT RSHIFT. %left PLUS MINUS. %left STAR SLASH REM. %left CONCAT. ................................................................................ expr(A) ::= expr(X) BITAND|BITOR|LSHIFT|RSHIFT(OP) expr(Y). {A = biExpr(p,X,@OP,Y);} expr(A) ::= expr(X) PLUS|MINUS(OP) expr(Y). {A = biExpr(p,X,@OP,Y);} expr(A) ::= expr(X) STAR|SLASH|REM(OP) expr(Y). {A = biExpr(p,X,@OP,Y);} expr(A) ::= expr(X) CONCAT(OP) expr(Y). {A = biExpr(p,X,@OP,Y);} %type likeop {int} likeop(A) ::= LIKEOP(OP). {A = @OP;} likeop(A) ::= NOT LIKEOP(OP). {A = 128+@OP;} expr(A) ::= expr(X) likeop(OP) expr(Y). [LIKEOP] {A = biExpr(p,X,OP,Y);} expr(A) ::= expr(X) IS(OP) expr(Y). {A = biExpr(p,X,@OP,Y);} expr(A) ::= expr(X) IS NOT expr(Y). {A = biExpr(p,X,TK_NOT_IS,Y);} expr(A) ::= NOT(OP) expr(X). {A = biExpr(p,X,@OP,0);} expr(A) ::= BITNOT(OP) expr(X). {A = biExpr(p,X,@OP,0);} expr(A) ::= MINUS(OP) expr(X). [BITNOT] {A = biExpr(p,X,@OP,0);} expr(A) ::= PLUS(OP) expr(X). [BITNOT] {A = biExpr(p,X,@OP,0);} expr(A) ::= LP select(X) RP. {A = subqExpr(p,X);} expr(A) ::= LP expr(X) RP. {A = X;} |
|
|
|
|
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
...
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
|
jvalue(A) ::= TRUE. {A = jsonType(p,XJD1_TRUE);} jvalue(A) ::= FALSE. {A = jsonType(p,XJD1_FALSE);} jvalue(A) ::= NULL. {A = jsonType(p,XJD1_NULL);} %left OR. %left AND. %right BANG. %left IS LIKEOP BETWEEN IN NE EQEQ. %left GT LE LT GE. %right ESCAPE. %left BITAND BITOR LSHIFT RSHIFT. %left PLUS MINUS. %left STAR SLASH REM. %left CONCAT. ................................................................................ expr(A) ::= expr(X) BITAND|BITOR|LSHIFT|RSHIFT(OP) expr(Y). {A = biExpr(p,X,@OP,Y);} expr(A) ::= expr(X) PLUS|MINUS(OP) expr(Y). {A = biExpr(p,X,@OP,Y);} expr(A) ::= expr(X) STAR|SLASH|REM(OP) expr(Y). {A = biExpr(p,X,@OP,Y);} expr(A) ::= expr(X) CONCAT(OP) expr(Y). {A = biExpr(p,X,@OP,Y);} %type likeop {int} likeop(A) ::= LIKEOP(OP). {A = @OP;} likeop(A) ::= BANG LIKEOP(OP). {A = 128+@OP;} expr(A) ::= expr(X) likeop(OP) expr(Y). [LIKEOP] {A = biExpr(p,X,OP,Y);} expr(A) ::= expr(X) IS(OP) expr(Y). {A = biExpr(p,X,@OP,Y);} expr(A) ::= expr(X) IS NOT expr(Y). {A = biExpr(p,X,TK_NOT_IS,Y);} expr(A) ::= BANG(OP) expr(X). {A = biExpr(p,X,@OP,0);} expr(A) ::= BITNOT(OP) expr(X). {A = biExpr(p,X,@OP,0);} expr(A) ::= MINUS(OP) expr(X). [BITNOT] {A = biExpr(p,X,@OP,0);} expr(A) ::= PLUS(OP) expr(X). [BITNOT] {A = biExpr(p,X,@OP,0);} expr(A) ::= LP select(X) RP. {A = subqExpr(p,X);} expr(A) ::= LP expr(X) RP. {A = X;} |
Changes to src/tokenize.c.
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
...
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
|
0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40 /* f8..ff ........ */ }; /********************************************************************** ** The following code is automatically generated ** by ../tool/mkkeywordhash.c */ /* Hash score: 58 */ static int keywordCode(const char *z, int n){ /* zText[] encodes 300 bytes of keywords in 211 bytes */ /* BEGINTORDEROLLBACKELSELECTGROUPDATEACHAVINGLOBETWEENULLIKE */ /* SCAPEXISTSALLIMITANDELETEXCEPTASCENDINGCOLLATECOLLECTIONOT */ /* CREATEDESCENDINGDROPRAGMAFLATTENIFROMUNIONVALUEWHEREBYCOMMIT */ /* INSERTINTERSECTOFFSETfalsenulltrue */ static const char zText[210] = { 'B','E','G','I','N','T','O','R','D','E','R','O','L','L','B','A','C','K', 'E','L','S','E','L','E','C','T','G','R','O','U','P','D','A','T','E','A', 'C','H','A','V','I','N','G','L','O','B','E','T','W','E','E','N','U','L', 'L','I','K','E','S','C','A','P','E','X','I','S','T','S','A','L','L','I', 'M','I','T','A','N','D','E','L','E','T','E','X','C','E','P','T','A','S', 'C','E','N','D','I','N','G','C','O','L','L','A','T','E','C','O','L','L', 'E','C','T','I','O','N','O','T','C','R','E','A','T','E','D','E','S','C', 'E','N','D','I','N','G','D','R','O','P','R','A','G','M','A','F','L','A', 'T','T','E','N','I','F','R','O','M','U','N','I','O','N','V','A','L','U', 'E','W','H','E','R','E','B','Y','C','O','M','M','I','T','I','N','S','E', 'R','T','I','N','T','E','R','S','E','C','T','O','F','F','S','E','T','f', 'a','l','s','e','n','u','l','l','t','r','u','e', }; static const unsigned char aHash[80] = { 0, 42, 40, 19, 34, 13, 41, 1, 49, 8, 0, 50, 28, 9, 23, 0, 0, 5, 48, 11, 37, 36, 43, 0, 0, 0, 0, 38, 0, 0, 0, 24, 0, 0, 0, 47, 0, 0, 7, 0, 0, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 27, 30, 46, 29, 10, 20, 0, 21, 33, 2, 25, 32, 0, 45, 0, 0, 0, 35, 0, 0, 26, 22, 0, 0, 0, 31, 44, 18, }; static const unsigned char aNext[50] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 16, 4, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 17, }; static const unsigned char aLen[50] = { 5, 4, 2, 5, 8, 4, 6, 5, 6, 4, 6, 4, 7, 4, 4, 6, 6, 2, 3, 5, 3, 6, 6, 2, 3, 9, 7, 10, 3, 6, 4, 10, 2, 4, 6, 7, 2, 4, 5, 5, 5, 2, 6, 6, 9, 6, 3, 5, 4, 4, }; static const unsigned short int aOffset[50] = { 0, 3, 6, 6, 10, 18, 20, 26, 29, 34, 37, 42, 45, 51, 54, 57, 62, 64, 68, 70, 75, 77, 82, 88, 88, 88, 97, 104, 113, 116, 122, 122, 129, 132, 135, 141, 148, 149, 153, 158, 163, 168, 170, 176, 182, 191, 194, 197, 202, 206, }; static const unsigned char aCode[50] = { TK_BEGIN, TK_INTO, TK_OR, TK_ORDER, TK_ROLLBACK, TK_ELSE, TK_SELECT, TK_GROUP, TK_UPDATE, TK_FLATTENOP, TK_HAVING, TK_LIKEOP, TK_BETWEEN, TK_NULL, TK_LIKEOP, TK_ESCAPE, TK_EXISTS, TK_IS, TK_ALL, TK_LIMIT, TK_AND, TK_DELETE, TK_EXCEPT, TK_AS, TK_ASCENDING, TK_ASCENDING, TK_COLLATE, TK_COLLECTION, TK_NOT, TK_CREATE, TK_DESCENDING, TK_DESCENDING, TK_IN, TK_DROP, TK_PRAGMA, TK_FLATTENOP, TK_IF, TK_FROM, TK_UNION, TK_VALUE, TK_WHERE, TK_BY, TK_COMMIT, TK_INSERT, TK_INTERSECT, TK_OFFSET, TK_SET, TK_FALSE, TK_NULL, TK_TRUE, }; int h, i; if( n<2 ) return TK_ID; h = (z[0]*4 ^ z[n-1]*3 ^ n) % 80; for(i=((int)aHash[h])-1; i>=0; i=((int)aNext[i])-1){ if( aLen[i]==n && memcmp(&zText[aOffset[i]],z,n)==0 ){ return aCode[i]; } } return TK_ID; } #define XJD1_N_KEYWORD 50 /* End of the automatically generated hash code *********************************************************************/ /* ** Return the length of the token that begins at z[0]. ** Store the token type in *tokenType before returning. ................................................................................ }else{ *tokenType = TK_GT; return 1; } } case '!': { if( z[1]!='=' ){ *tokenType = TK_ILLEGAL; return 2; }else{ *tokenType = TK_NE; return 2; } } case '|': { if( z[1]!='|' ){ |
|
|
|
|
|
|
<
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
...
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
|
0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40 /* f8..ff ........ */ }; /********************************************************************** ** The following code is automatically generated ** by ../tool/mkkeywordhash.c */ /* Hash score: 55 */ static int keywordCode(const char *z, int n){ /* zText[] encodes 293 bytes of keywords in 209 bytes */ /* BEGINTORDEROLLBACKELSELECTGROUPDATEACHAVINGLOBETWEENULLIKE */ /* SCAPEXISTSALLIMITASCENDINGCOLLATEXCEPTCOLLECTIONOTCREATEDELETE */ /* DESCENDINGDROPRAGMAFLATTENIFROMUNIONVALUEWHEREBYCOMMITINSERT */ /* INTERSECTOFFSETfalsenulltrue */ static const char zText[208] = { 'B','E','G','I','N','T','O','R','D','E','R','O','L','L','B','A','C','K', 'E','L','S','E','L','E','C','T','G','R','O','U','P','D','A','T','E','A', 'C','H','A','V','I','N','G','L','O','B','E','T','W','E','E','N','U','L', 'L','I','K','E','S','C','A','P','E','X','I','S','T','S','A','L','L','I', 'M','I','T','A','S','C','E','N','D','I','N','G','C','O','L','L','A','T', 'E','X','C','E','P','T','C','O','L','L','E','C','T','I','O','N','O','T', 'C','R','E','A','T','E','D','E','L','E','T','E','D','E','S','C','E','N', 'D','I','N','G','D','R','O','P','R','A','G','M','A','F','L','A','T','T', 'E','N','I','F','R','O','M','U','N','I','O','N','V','A','L','U','E','W', 'H','E','R','E','B','Y','C','O','M','M','I','T','I','N','S','E','R','T', 'I','N','T','E','R','S','E','C','T','O','F','F','S','E','T','f','a','l', 's','e','n','u','l','l','t','r','u','e', }; static const unsigned char aHash[80] = { 0, 40, 38, 18, 32, 12, 39, 1, 47, 7, 0, 48, 25, 8, 24, 0, 0, 4, 46, 10, 35, 34, 41, 0, 0, 0, 0, 36, 0, 0, 0, 20, 0, 0, 0, 45, 0, 0, 6, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 23, 27, 44, 26, 9, 19, 0, 0, 31, 2, 21, 30, 0, 43, 0, 0, 0, 33, 0, 0, 22, 28, 0, 0, 0, 29, 42, 17, }; static const unsigned char aNext[48] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 15, 3, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 16, }; static const unsigned char aLen[48] = { 5, 4, 5, 8, 4, 6, 5, 6, 4, 6, 4, 7, 4, 4, 6, 6, 2, 3, 5, 2, 3, 9, 7, 6, 10, 3, 6, 6, 4, 10, 2, 4, 6, 7, 2, 4, 5, 5, 5, 2, 6, 6, 9, 6, 3, 5, 4, 4, }; static const unsigned short int aOffset[48] = { 0, 3, 6, 10, 18, 20, 26, 29, 34, 37, 42, 45, 51, 54, 57, 62, 64, 68, 70, 75, 75, 75, 84, 90, 96, 105, 108, 114, 120, 120, 127, 130, 133, 139, 146, 147, 151, 156, 161, 166, 168, 174, 180, 189, 192, 195, 200, 204, }; static const unsigned char aCode[48] = { TK_BEGIN, TK_INTO, TK_ORDER, TK_ROLLBACK, TK_ELSE, TK_SELECT, TK_GROUP, TK_UPDATE, TK_FLATTENOP, TK_HAVING, TK_LIKEOP, TK_BETWEEN, TK_NULL, TK_LIKEOP, TK_ESCAPE, TK_EXISTS, TK_IS, TK_ALL, TK_LIMIT, TK_AS, TK_ASCENDING, TK_ASCENDING, TK_COLLATE, TK_EXCEPT, TK_COLLECTION, TK_NOT, TK_CREATE, TK_DELETE, TK_DESCENDING, TK_DESCENDING, TK_IN, TK_DROP, TK_PRAGMA, TK_FLATTENOP, TK_IF, TK_FROM, TK_UNION, TK_VALUE, TK_WHERE, TK_BY, TK_COMMIT, TK_INSERT, TK_INTERSECT, TK_OFFSET, TK_SET, TK_FALSE, TK_NULL, TK_TRUE, }; int h, i; if( n<2 ) return TK_ID; h = (z[0]*4 ^ z[n-1]*3 ^ n) % 80; for(i=((int)aHash[h])-1; i>=0; i=((int)aNext[i])-1){ if( aLen[i]==n && memcmp(&zText[aOffset[i]],z,n)==0 ){ return aCode[i]; } } return TK_ID; } #define XJD1_N_KEYWORD 48 /* End of the automatically generated hash code *********************************************************************/ /* ** Return the length of the token that begins at z[0]. ** Store the token type in *tokenType before returning. ................................................................................ }else{ *tokenType = TK_GT; return 1; } } case '!': { if( z[1]!='=' ){ *tokenType = TK_BANG; return 1; }else{ *tokenType = TK_NE; return 2; } } case '|': { if( z[1]!='|' ){ |
Changes to src/trace.c.
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
...
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
|
{ TK_FLOAT, "TK_FLOAT" }, { TK_STRING, "TK_STRING" }, { TK_TRUE, "TK_TRUE" }, { TK_FALSE, "TK_FALSE" }, { TK_NULL, "TK_NULL" }, { TK_OR, "TK_OR" }, { TK_AND, "TK_AND" }, { TK_NOT, "TK_NOT" }, { TK_IS, "TK_IS" }, { TK_LIKEOP, "TK_LIKEOP" }, { TK_BETWEEN, "TK_BETWEEN" }, { TK_IN, "TK_IN" }, { TK_NE, "TK_NE" }, { TK_EQ, "TK_EQ" }, { TK_GT, "TK_GT" }, ................................................................................ case TK_PLUS: case TK_MINUS: case TK_STAR: case TK_SLASH: case TK_REM: case TK_CONCAT: case TK_IS: case TK_NOT: case TK_NOT_IS: { if( p->u.bi.pRight ){ xjd1StringAppend(pOut, "(", 1); xjd1TraceExpr(pOut, p->u.bi.pLeft); xjd1StringAppendF(pOut, ") %s (", xjd1TokenName(p->eType)); xjd1TraceExpr(pOut, p->u.bi.pRight); xjd1StringAppend(pOut, ")", 1); |
|
|
|
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
...
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
|
{ TK_FLOAT, "TK_FLOAT" }, { TK_STRING, "TK_STRING" }, { TK_TRUE, "TK_TRUE" }, { TK_FALSE, "TK_FALSE" }, { TK_NULL, "TK_NULL" }, { TK_OR, "TK_OR" }, { TK_AND, "TK_AND" }, { TK_BANG, "TK_BANG" }, { TK_IS, "TK_IS" }, { TK_LIKEOP, "TK_LIKEOP" }, { TK_BETWEEN, "TK_BETWEEN" }, { TK_IN, "TK_IN" }, { TK_NE, "TK_NE" }, { TK_EQ, "TK_EQ" }, { TK_GT, "TK_GT" }, ................................................................................ case TK_PLUS: case TK_MINUS: case TK_STAR: case TK_SLASH: case TK_REM: case TK_CONCAT: case TK_IS: case TK_BANG: case TK_NOT_IS: { if( p->u.bi.pRight ){ xjd1StringAppend(pOut, "(", 1); xjd1TraceExpr(pOut, p->u.bi.pLeft); xjd1StringAppendF(pOut, ") %s (", xjd1TokenName(p->eType)); xjd1TraceExpr(pOut, p->u.bi.pRight); xjd1StringAppend(pOut, ")", 1); |
Changes to test/base02.test.
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
SELECT false || true FROM c1; SELECT false || false FROM c1; SELECT "cat" || "dog" FROM c1; SELECT "" || "dog" FROM c1; .result true true true false "cat" "dog" .testcase 5 SELECT NOT true FROM c1; SELECT NOT false FROM c1; SELECT NOT "cat" FROM c1; SELECT NOT "" FROM c1; .result false true false true .testcase 6 SELECT 1 & 2 FROM c1; SELECT "5" & 4 FROM c1; .result 0 4 |
| | | | |
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
SELECT false || true FROM c1; SELECT false || false FROM c1; SELECT "cat" || "dog" FROM c1; SELECT "" || "dog" FROM c1; .result true true true false "cat" "dog" .testcase 5 SELECT ! true FROM c1; SELECT ! false FROM c1; SELECT ! "cat" FROM c1; SELECT ! "" FROM c1; .result false true false true .testcase 6 SELECT 1 & 2 FROM c1; SELECT "5" & 4 FROM c1; .result 0 4 |
Changes to tool/mkkeywordhash.c.
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
..
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
}; /* ** These are the keywords */ static Keyword aKeywordTable[] = { { "ALL", "TK_ALL", }, { "AND", "TK_AND", }, { "ASCENDING", "TK_ASCENDING", }, { "ASC", "TK_ASCENDING", }, { "AS", "TK_AS", }, { "BEGIN", "TK_BEGIN", }, { "BETWEEN", "TK_BETWEEN", }, { "BY", "TK_BY", }, { "COLLATE", "TK_COLLATE", }, ................................................................................ { "LIKE", "TK_LIKEOP", }, { "LIMIT", "TK_LIMIT", }, { "NOT", "TK_NOT", }, { "NULL", "TK_NULL", }, { "null", "TK_NULL", }, { "OFFSET", "TK_OFFSET", }, { "ORDER", "TK_ORDER", }, { "OR", "TK_OR", }, { "PRAGMA", "TK_PRAGMA", }, { "ROLLBACK", "TK_ROLLBACK", }, { "SELECT", "TK_SELECT", }, { "SET", "TK_SET", }, { "true", "TK_TRUE", }, { "UNION", "TK_UNION", }, { "UPDATE", "TK_UPDATE", }, |
<
<
|
54
55
56
57
58
59
60
61
62
63
64
65
66
67
..
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
};
/*
** These are the keywords
*/
static Keyword aKeywordTable[] = {
{ "ALL", "TK_ALL", },
{ "ASCENDING", "TK_ASCENDING", },
{ "ASC", "TK_ASCENDING", },
{ "AS", "TK_AS", },
{ "BEGIN", "TK_BEGIN", },
{ "BETWEEN", "TK_BETWEEN", },
{ "BY", "TK_BY", },
{ "COLLATE", "TK_COLLATE", },
................................................................................
{ "LIKE", "TK_LIKEOP", },
{ "LIMIT", "TK_LIMIT", },
{ "NOT", "TK_NOT", },
{ "NULL", "TK_NULL", },
{ "null", "TK_NULL", },
{ "OFFSET", "TK_OFFSET", },
{ "ORDER", "TK_ORDER", },
{ "PRAGMA", "TK_PRAGMA", },
{ "ROLLBACK", "TK_ROLLBACK", },
{ "SELECT", "TK_SELECT", },
{ "SET", "TK_SET", },
{ "true", "TK_TRUE", },
{ "UNION", "TK_UNION", },
{ "UPDATE", "TK_UPDATE", },
|