UnQL

Check-in [59096a3d9c]
Login

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: 59096a3d9c4f4b240c05dd108c3838f032fa7f89
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
Hide Diffs Unified Diffs Ignore Whitespace Patch

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",     },