Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | More changes to take advantage of the TK_ and OP_ alignments to avoid unnecessary translations. (CVS 1999) |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
e8e972ba65fc36171f6b685e8a8f67f9 |
User & Date: | drh 2004-10-04 13:38:09.000 |
Context
2004-10-05
| ||
02:41 | Add support for DEFERRED, IMMEDIATE, and EXCLUSIVE transactions. (CVS 2000) (check-in: 81ff8107ad user: drh tags: trunk) | |
2004-10-04
| ||
13:38 | More changes to take advantage of the TK_ and OP_ alignments to avoid unnecessary translations. (CVS 1999) (check-in: e8e972ba65 user: drh tags: trunk) | |
13:19 | Save about 800 bytes of code space by aligning TK_ and OP_ constants so that we do not have to translate between them. (CVS 1998) (check-in: 4c817e3f29 user: drh tags: trunk) | |
Changes
Changes to src/parse.y.
︙ | ︙ | |||
10 11 12 13 14 15 16 | ** ************************************************************************* ** This file contains SQLite's grammar for SQL. Process this file ** using the lemon parser generator to generate C code that runs ** the parser. Lemon will also generate a header file containing ** numeric codes for all of the tokens. ** | | | 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | ** ************************************************************************* ** This file contains SQLite's grammar for SQL. Process this file ** using the lemon parser generator to generate C code that runs ** the parser. Lemon will also generate a header file containing ** numeric codes for all of the tokens. ** ** @(#) $Id: parse.y,v 1.141 2004/10/04 13:38:09 drh Exp $ */ %token_prefix TK_ %token_type {Token} %default_type {Token} %extra_argument {Parse *pParse} %syntax_error { if( pParse->zErrMsg==0 ){ |
︙ | ︙ | |||
143 144 145 146 147 148 149 | // the sqlite3ExprIfFalse() routine for additional information on this // constraint. // %left OR. %left AND. %right NOT. %left IS LIKE GLOB BETWEEN IN ISNULL NOTNULL NE EQ. | | | 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 | // the sqlite3ExprIfFalse() routine for additional information on this // constraint. // %left OR. %left AND. %right NOT. %left IS LIKE GLOB BETWEEN IN ISNULL NOTNULL NE EQ. %left GT LE LT GE. %left BITAND BITOR LSHIFT RSHIFT. %left PLUS MINUS. %left STAR SLASH REM. %left CONCAT. %right UMINUS UPLUS BITNOT. // And "ids" is an identifer-or-string. |
︙ | ︙ |
Changes to src/where.c.
︙ | ︙ | |||
8 9 10 11 12 13 14 | ** May you find forgiveness for yourself and forgive others. ** May you share freely, never taking more than you give. ** ************************************************************************* ** This module contains C code that generates VDBE code used to process ** the WHERE clause of SQL statements. ** | | | 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | ** May you find forgiveness for yourself and forgive others. ** May you share freely, never taking more than you give. ** ************************************************************************* ** This module contains C code that generates VDBE code used to process ** the WHERE clause of SQL statements. ** ** $Id: where.c,v 1.116 2004/10/04 13:38:09 drh Exp $ */ #include "sqliteInt.h" /* ** The query generator uses an array of instances of this structure to ** help it analyze the subexpressions of the WHERE clause. Each WHERE ** clause subexpression is separated from the others by an AND operator. |
︙ | ︙ | |||
144 145 146 147 148 149 150 | /* ** Return TRUE if the given operator is one of the operators that is ** allowed for an indexable WHERE clause. The allowed operators are ** "=", "<", ">", "<=", ">=", and "IN". */ static int allowedOp(int op){ | < < < | < < < | < < < | 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 | /* ** Return TRUE if the given operator is one of the operators that is ** allowed for an indexable WHERE clause. The allowed operators are ** "=", "<", ">", "<=", ">=", and "IN". */ static int allowedOp(int op){ assert( TK_GT==TK_LE-1 && TK_LE==TK_LT-1 && TK_LT==TK_GE-1 && TK_EQ==TK_GT-1); return op==TK_IN || (op>=TK_EQ && op<=TK_GE); } /* ** Swap two integers. */ #define SWAP(TYPE,A,B) {TYPE t=A; A=B; B=t;} |
︙ | ︙ | |||
217 218 219 220 221 222 223 | ** The collating sequence rule is to always choose the left expression. ** So if we do a flip, we also have to move the collating sequence. */ if( tableOrder(pSrc,pInfo->idxLeft)<tableOrder(pSrc,pInfo->idxRight) ){ assert( pExpr->op!=TK_IN ); SWAP(CollSeq*,pExpr->pRight->pColl,pExpr->pLeft->pColl); SWAP(Expr*,pExpr->pRight,pExpr->pLeft); | | | | > > | | < | 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 | ** The collating sequence rule is to always choose the left expression. ** So if we do a flip, we also have to move the collating sequence. */ if( tableOrder(pSrc,pInfo->idxLeft)<tableOrder(pSrc,pInfo->idxRight) ){ assert( pExpr->op!=TK_IN ); SWAP(CollSeq*,pExpr->pRight->pColl,pExpr->pLeft->pColl); SWAP(Expr*,pExpr->pRight,pExpr->pLeft); if( pExpr->op>=TK_GT ){ assert( TK_LT==TK_GT+2 ); assert( TK_GE==TK_LE+2 ); assert( TK_GT>TK_EQ ); assert( TK_GT<TK_LE ); assert( pExpr->op>=TK_GT && pExpr->op<=TK_GE ); pExpr->op = ((pExpr->op-TK_GT)^2)+TK_GT; } SWAP(unsigned, pInfo->prereqLeft, pInfo->prereqRight); SWAP(short int, pInfo->idxLeft, pInfo->idxRight); } } } |
︙ | ︙ |