mirror of
https://github.com/sqlite/sqlite.git
synced 2025-11-06 15:49:35 +03:00
Code generator tries to avoid pointless OP_IsNull and OP_Affinity opcodes.
FossilOrigin-Name: ebb0c8a3e977dc741704e733b5a5d931d9b27028
This commit is contained in:
24
manifest
24
manifest
@@ -1,8 +1,8 @@
|
|||||||
-----BEGIN PGP SIGNED MESSAGE-----
|
-----BEGIN PGP SIGNED MESSAGE-----
|
||||||
Hash: SHA1
|
Hash: SHA1
|
||||||
|
|
||||||
C Make\ssure\sthe\soutput\sof\ssqlite3OsFullPathname\sis\sinitialized\seven\sif\sthe\nfails\sdue\sto\sI/O\sor\sOOM\serrors.
|
C Code\sgenerator\stries\sto\savoid\spointless\sOP_IsNull\sand\sOP_Affinity\sopcodes.
|
||||||
D 2009-11-16T23:36:34
|
D 2009-11-17T18:31:48
|
||||||
F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
|
F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
|
||||||
F Makefile.in 53f3dfa49f28ab5b80cb083fb7c9051e596bcfa1
|
F Makefile.in 53f3dfa49f28ab5b80cb083fb7c9051e596bcfa1
|
||||||
F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
|
F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
|
||||||
@@ -117,7 +117,7 @@ F src/callback.c 908f3e0172c3d4058f4ca0acd42c637c52e9669f
|
|||||||
F src/complete.c 417df1ef5ea798532bb6290b0cc4265fef82980a
|
F src/complete.c 417df1ef5ea798532bb6290b0cc4265fef82980a
|
||||||
F src/date.c a79c0a8f219370b972e320741f995a3bef9df33f
|
F src/date.c a79c0a8f219370b972e320741f995a3bef9df33f
|
||||||
F src/delete.c ec04635d152debdab70d4b30c5516b59282075ea
|
F src/delete.c ec04635d152debdab70d4b30c5516b59282075ea
|
||||||
F src/expr.c 94f3086a342a1d151fb9d17ef1c33bff4cc768f0
|
F src/expr.c cc086099c3afbc10bfdb506a0b5b298b0547c956
|
||||||
F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb
|
F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb
|
||||||
F src/fkey.c e2116672a6bd610dc888e27df292ebc7999c9bb0
|
F src/fkey.c e2116672a6bd610dc888e27df292ebc7999c9bb0
|
||||||
F src/func.c bf54e1202cbfb28bf4b1fd9b58899009ae76716f
|
F src/func.c bf54e1202cbfb28bf4b1fd9b58899009ae76716f
|
||||||
@@ -167,7 +167,7 @@ F src/select.c a727f61f3267bfa20ce1c3e85d38dc2132db1060
|
|||||||
F src/shell.c f4948cb6d30665d755a6b5e0ec313d1094aab828
|
F src/shell.c f4948cb6d30665d755a6b5e0ec313d1094aab828
|
||||||
F src/sqlite.h.in 4464e9772122f0447305d425e04d122b6f1bffec
|
F src/sqlite.h.in 4464e9772122f0447305d425e04d122b6f1bffec
|
||||||
F src/sqlite3ext.h 69dfb8116af51b84a029cddb3b35062354270c89
|
F src/sqlite3ext.h 69dfb8116af51b84a029cddb3b35062354270c89
|
||||||
F src/sqliteInt.h 961a7a3c1428fdc9c18df63ee34c91c7425c47af
|
F src/sqliteInt.h 1d6795e4d56c55cff86d9b9968eab37c67307f95
|
||||||
F src/sqliteLimit.h 3afab2291762b5d09ae20c18feb8e9fa935a60a6
|
F src/sqliteLimit.h 3afab2291762b5d09ae20c18feb8e9fa935a60a6
|
||||||
F src/status.c e651be6b30d397d86384c6867bc016e4913bcac7
|
F src/status.c e651be6b30d397d86384c6867bc016e4913bcac7
|
||||||
F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e
|
F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e
|
||||||
@@ -210,7 +210,7 @@ F src/update.c 8efeb09822886e33c265dd96d29a3d865ea6dcf2
|
|||||||
F src/utf.c dad16adcc0c35ef2437dca125a4b07419d361052
|
F src/utf.c dad16adcc0c35ef2437dca125a4b07419d361052
|
||||||
F src/util.c ad4f03079ba0fe83590d1cc9197e8e4844e38592
|
F src/util.c ad4f03079ba0fe83590d1cc9197e8e4844e38592
|
||||||
F src/vacuum.c 03309a08d549f9389cc3a3589afd4fadbdaf0679
|
F src/vacuum.c 03309a08d549f9389cc3a3589afd4fadbdaf0679
|
||||||
F src/vdbe.c 0bc1c3aaa0c5c13240c2e39ce3b9ae92586fc30b
|
F src/vdbe.c 678dc437014c654707b7980e5a1a76b7dea5fecd
|
||||||
F src/vdbe.h 5f35750615163d1064052785b4a9f0eb004a720d
|
F src/vdbe.h 5f35750615163d1064052785b4a9f0eb004a720d
|
||||||
F src/vdbeInt.h d7ea821ac7813c9bea0fe87558c35e07b2c7c44d
|
F src/vdbeInt.h d7ea821ac7813c9bea0fe87558c35e07b2c7c44d
|
||||||
F src/vdbeapi.c 17680ab7a75ec938c5ba039a6c87489d01faf2cb
|
F src/vdbeapi.c 17680ab7a75ec938c5ba039a6c87489d01faf2cb
|
||||||
@@ -219,7 +219,7 @@ F src/vdbeblob.c 84f924700a7a889152aeebef77ca5f4e3875ffb4
|
|||||||
F src/vdbemem.c 1e16e3a16e55f4c3452834f0e041726021aa66e0
|
F src/vdbemem.c 1e16e3a16e55f4c3452834f0e041726021aa66e0
|
||||||
F src/vtab.c 456fc226614569f0e46f216e33265bea268bd917
|
F src/vtab.c 456fc226614569f0e46f216e33265bea268bd917
|
||||||
F src/walker.c 3112bb3afe1d85dc52317cb1d752055e9a781f8f
|
F src/walker.c 3112bb3afe1d85dc52317cb1d752055e9a781f8f
|
||||||
F src/where.c 5a8ed38834465e47c9e28ea5462f3ad8b90000c7
|
F src/where.c ef0dbd3963087e9caecf175e4669d2ef2a5735a1
|
||||||
F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2
|
F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2
|
||||||
F test/alias.test 4529fbc152f190268a15f9384a5651bbbabc9d87
|
F test/alias.test 4529fbc152f190268a15f9384a5651bbbabc9d87
|
||||||
F test/all.test 14165b3e32715b700b5f0cbf8f6e3833dda0be45
|
F test/all.test 14165b3e32715b700b5f0cbf8f6e3833dda0be45
|
||||||
@@ -771,14 +771,14 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
|
|||||||
F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
|
F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
|
||||||
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
|
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
|
||||||
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
|
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
|
||||||
P 929b6047391411c6f539e47afe6b63d16e352ccb
|
P e4943adb83819dee06e2e9da25ff6d967ca170de
|
||||||
R 13facd3cb5b58e8321f51a81ba26b282
|
R 537d50eb63e21c879029e20006a4ef86
|
||||||
U drh
|
U drh
|
||||||
Z 5557a9bdd7c9ffd1ef2b1b912759377d
|
Z 25f5f894370572ec60a402b96fc8f463
|
||||||
-----BEGIN PGP SIGNATURE-----
|
-----BEGIN PGP SIGNATURE-----
|
||||||
Version: GnuPG v1.4.6 (GNU/Linux)
|
Version: GnuPG v1.4.6 (GNU/Linux)
|
||||||
|
|
||||||
iD8DBQFLAeIFoxKgR168RlERAm5zAJ9+zjsxTXETPUidpMT7BNRJuUEPcQCdGbWG
|
iD8DBQFLAuwXoxKgR168RlERAvfhAJ9lIC9tv6mdYLAjmFMbVFDbfsV4pQCdFA1+
|
||||||
c0lIKv9PQEH8pwwJkLAteDg=
|
c0IYZzkLkFY6S76oMkFaA2k=
|
||||||
=JRXc
|
=BCOF
|
||||||
-----END PGP SIGNATURE-----
|
-----END PGP SIGNATURE-----
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
e4943adb83819dee06e2e9da25ff6d967ca170de
|
ebb0c8a3e977dc741704e733b5a5d931d9b27028
|
||||||
65
src/expr.c
65
src/expr.c
@@ -1258,6 +1258,71 @@ int sqlite3ExprIsInteger(Expr *p, int *pValue){
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Return FALSE if there is no chance that the expression can be NULL.
|
||||||
|
**
|
||||||
|
** If the expression might be NULL or if the expression is too complex
|
||||||
|
** to tell return TRUE.
|
||||||
|
**
|
||||||
|
** This routine is used as an optimization, to skip OP_IsNull opcodes
|
||||||
|
** when we know that a value cannot be NULL. Hence, a false positive
|
||||||
|
** (returning TRUE when in fact the expression can never be NULL) might
|
||||||
|
** be a small performance hit but is otherwise harmless. On the other
|
||||||
|
** hand, a false negative (returning FALSE when the result could be NULL)
|
||||||
|
** will likely result in an incorrect answer. So when in doubt, return
|
||||||
|
** TRUE.
|
||||||
|
*/
|
||||||
|
int sqlite3ExprCanBeNull(const Expr *p){
|
||||||
|
u8 op;
|
||||||
|
while( p->op==TK_UPLUS || p->op==TK_MINUS ){ p = p->pLeft; }
|
||||||
|
op = p->op;
|
||||||
|
if( op==TK_REGISTER ) op = p->op2;
|
||||||
|
switch( op ){
|
||||||
|
case TK_INTEGER:
|
||||||
|
case TK_STRING:
|
||||||
|
case TK_FLOAT:
|
||||||
|
case TK_BLOB:
|
||||||
|
return 0;
|
||||||
|
default:
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Return TRUE if the given expression is a constant which would be
|
||||||
|
** unchanged by OP_Affinity with the affinity given in the second
|
||||||
|
** argument.
|
||||||
|
**
|
||||||
|
** This routine is used to determine if the OP_Affinity operation
|
||||||
|
** can be omitted. When in doubt return FALSE. A false negative
|
||||||
|
** is harmless. A false positive, however, can result in the wrong
|
||||||
|
** answer.
|
||||||
|
*/
|
||||||
|
int sqlite3ExprNeedsNoAffinityChange(const Expr *p, char aff){
|
||||||
|
u8 op;
|
||||||
|
if( aff==SQLITE_AFF_NONE ) return 1;
|
||||||
|
while( p->op==TK_UPLUS || p->op==TK_MINUS ){ p = p->pLeft; }
|
||||||
|
op = p->op;
|
||||||
|
if( op==TK_REGISTER ) op = p->op2;
|
||||||
|
switch( op ){
|
||||||
|
case TK_INTEGER: {
|
||||||
|
return aff==SQLITE_AFF_INTEGER || aff==SQLITE_AFF_NUMERIC;
|
||||||
|
}
|
||||||
|
case TK_FLOAT: {
|
||||||
|
return aff==SQLITE_AFF_REAL || aff==SQLITE_AFF_NUMERIC;
|
||||||
|
}
|
||||||
|
case TK_STRING: {
|
||||||
|
return aff==SQLITE_AFF_TEXT;
|
||||||
|
}
|
||||||
|
case TK_BLOB: {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Return TRUE if the given string is a row-id column name.
|
** Return TRUE if the given string is a row-id column name.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -2674,6 +2674,8 @@ int sqlite3ExprIsConstant(Expr*);
|
|||||||
int sqlite3ExprIsConstantNotJoin(Expr*);
|
int sqlite3ExprIsConstantNotJoin(Expr*);
|
||||||
int sqlite3ExprIsConstantOrFunction(Expr*);
|
int sqlite3ExprIsConstantOrFunction(Expr*);
|
||||||
int sqlite3ExprIsInteger(Expr*, int*);
|
int sqlite3ExprIsInteger(Expr*, int*);
|
||||||
|
int sqlite3ExprCanBeNull(const Expr*);
|
||||||
|
int sqlite3ExprNeedsNoAffinityChange(const Expr*, char);
|
||||||
int sqlite3IsRowid(const char*);
|
int sqlite3IsRowid(const char*);
|
||||||
void sqlite3GenerateRowDelete(Parse*, Table*, int, int, int, Trigger *, int);
|
void sqlite3GenerateRowDelete(Parse*, Table*, int, int, int, Trigger *, int);
|
||||||
void sqlite3GenerateRowIndexDelete(Parse*, Table*, int, int*);
|
void sqlite3GenerateRowIndexDelete(Parse*, Table*, int, int*);
|
||||||
|
|||||||
20
src/vdbe.c
20
src/vdbe.c
@@ -2292,17 +2292,18 @@ op_column_out:
|
|||||||
** memory cell in the range.
|
** memory cell in the range.
|
||||||
*/
|
*/
|
||||||
case OP_Affinity: {
|
case OP_Affinity: {
|
||||||
char *zAffinity; /* The affinity to be applied */
|
const char *zAffinity; /* The affinity to be applied */
|
||||||
Mem *pData0; /* First register to which to apply affinity */
|
char cAff; /* A single character of affinity */
|
||||||
Mem *pLast; /* Last register to which to apply affinity */
|
|
||||||
Mem *pRec; /* Current register */
|
|
||||||
|
|
||||||
zAffinity = pOp->p4.z;
|
zAffinity = pOp->p4.z;
|
||||||
pData0 = &aMem[pOp->p1];
|
assert( zAffinity!=0 );
|
||||||
pLast = &pData0[pOp->p2-1];
|
assert( zAffinity[pOp->p2]==0 );
|
||||||
for(pRec=pData0; pRec<=pLast; pRec++){
|
pIn1 = &aMem[pOp->p1];
|
||||||
ExpandBlob(pRec);
|
while( (cAff = *(zAffinity++))!=0 ){
|
||||||
applyAffinity(pRec, zAffinity[pRec-pData0], encoding);
|
assert( pIn1 <= &p->aMem[p->nMem] );
|
||||||
|
ExpandBlob(pIn1);
|
||||||
|
applyAffinity(pIn1, cAff, encoding);
|
||||||
|
pIn1++;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -3255,6 +3256,7 @@ case OP_SeekGt: { /* jump, in3 */
|
|||||||
assert( oc!=OP_SeekLt || r.flags==0 );
|
assert( oc!=OP_SeekLt || r.flags==0 );
|
||||||
|
|
||||||
r.aMem = &aMem[pOp->p3];
|
r.aMem = &aMem[pOp->p3];
|
||||||
|
ExpandBlob(r.aMem);
|
||||||
rc = sqlite3BtreeMovetoUnpacked(pC->pCursor, &r, 0, 0, &res);
|
rc = sqlite3BtreeMovetoUnpacked(pC->pCursor, &r, 0, 0, &res);
|
||||||
if( rc!=SQLITE_OK ){
|
if( rc!=SQLITE_OK ){
|
||||||
goto abort_due_to_error;
|
goto abort_due_to_error;
|
||||||
|
|||||||
72
src/where.c
72
src/where.c
@@ -2594,15 +2594,40 @@ static void disableTerm(WhereLevel *pLevel, WhereTerm *pTerm){
|
|||||||
** Code an OP_Affinity opcode to apply the column affinity string zAff
|
** Code an OP_Affinity opcode to apply the column affinity string zAff
|
||||||
** to the n registers starting at base.
|
** to the n registers starting at base.
|
||||||
**
|
**
|
||||||
** This routine assumes that zAff is dynamic and makes its own copy.
|
** As an optimization, SQLITE_AFF_NONE entries (which are no-ops) at the
|
||||||
|
** beginning and end of zAff are ignored. If all entries in zAff are
|
||||||
|
** SQLITE_AFF_NONE, then no code gets generated.
|
||||||
|
**
|
||||||
|
** This routine makes its own copy of zAff so that the caller is free
|
||||||
|
** to modify zAff after this routine returns.
|
||||||
*/
|
*/
|
||||||
static void codeApplyAffinity(Parse *pParse, int base, int n, char *zAff){
|
static void codeApplyAffinity(Parse *pParse, int base, int n, char *zAff){
|
||||||
Vdbe *v = pParse->pVdbe;
|
Vdbe *v = pParse->pVdbe;
|
||||||
|
if( zAff==0 ){
|
||||||
|
assert( pParse->db->mallocFailed );
|
||||||
|
return;
|
||||||
|
}
|
||||||
assert( v!=0 );
|
assert( v!=0 );
|
||||||
|
|
||||||
|
/* Adjust base and n to skip over SQLITE_AFF_NONE entries at the beginning
|
||||||
|
** and end of the affinity string.
|
||||||
|
*/
|
||||||
|
while( n>0 && zAff[0]==SQLITE_AFF_NONE ){
|
||||||
|
n--;
|
||||||
|
base++;
|
||||||
|
zAff++;
|
||||||
|
}
|
||||||
|
while( n>1 && zAff[n-1]==SQLITE_AFF_NONE ){
|
||||||
|
n--;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Code the OP_Affinity opcode if there is anything left to do. */
|
||||||
|
if( n>0 ){
|
||||||
sqlite3VdbeAddOp2(v, OP_Affinity, base, n);
|
sqlite3VdbeAddOp2(v, OP_Affinity, base, n);
|
||||||
sqlite3VdbeChangeP4(v, -1, zAff, 0);
|
sqlite3VdbeChangeP4(v, -1, zAff, n);
|
||||||
sqlite3ExprCacheAffinityChange(pParse, base, n);
|
sqlite3ExprCacheAffinityChange(pParse, base, n);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -2672,7 +2697,7 @@ static int codeEqualityTerm(
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
** Generate code that will evaluate all == and IN constraints for an
|
** Generate code that will evaluate all == and IN constraints for an
|
||||||
** index. The values for all constraints are left on the stack.
|
** index.
|
||||||
**
|
**
|
||||||
** For example, consider table t1(a,b,c,d,e,f) with index i1(a,b,c).
|
** For example, consider table t1(a,b,c,d,e,f) with index i1(a,b,c).
|
||||||
** Suppose the WHERE clause is this: a==5 AND b IN (1,2,3) AND c>5 AND c<10
|
** Suppose the WHERE clause is this: a==5 AND b IN (1,2,3) AND c>5 AND c<10
|
||||||
@@ -2684,7 +2709,8 @@ static int codeEqualityTerm(
|
|||||||
**
|
**
|
||||||
** In the example above nEq==2. But this subroutine works for any value
|
** In the example above nEq==2. But this subroutine works for any value
|
||||||
** of nEq including 0. If nEq==0, this routine is nearly a no-op.
|
** of nEq including 0. If nEq==0, this routine is nearly a no-op.
|
||||||
** The only thing it does is allocate the pLevel->iMem memory cell.
|
** The only thing it does is allocate the pLevel->iMem memory cell and
|
||||||
|
** compute the affinity string.
|
||||||
**
|
**
|
||||||
** This routine always allocates at least one memory cell and returns
|
** This routine always allocates at least one memory cell and returns
|
||||||
** the index of that memory cell. The code that
|
** the index of that memory cell. The code that
|
||||||
@@ -2762,12 +2788,18 @@ static int codeAllEqualityTerms(
|
|||||||
testcase( pTerm->eOperator & WO_ISNULL );
|
testcase( pTerm->eOperator & WO_ISNULL );
|
||||||
testcase( pTerm->eOperator & WO_IN );
|
testcase( pTerm->eOperator & WO_IN );
|
||||||
if( (pTerm->eOperator & (WO_ISNULL|WO_IN))==0 ){
|
if( (pTerm->eOperator & (WO_ISNULL|WO_IN))==0 ){
|
||||||
|
Expr *pRight = pTerm->pExpr->pRight;
|
||||||
|
if( sqlite3ExprCanBeNull(pRight) ){
|
||||||
sqlite3VdbeAddOp2(v, OP_IsNull, regBase+j, pLevel->addrBrk);
|
sqlite3VdbeAddOp2(v, OP_IsNull, regBase+j, pLevel->addrBrk);
|
||||||
if( zAff
|
}
|
||||||
&& sqlite3CompareAffinity(pTerm->pExpr->pRight, zAff[j])==SQLITE_AFF_NONE
|
if( zAff ){
|
||||||
){
|
if( sqlite3CompareAffinity(pRight, zAff[j])==SQLITE_AFF_NONE ){
|
||||||
zAff[j] = SQLITE_AFF_NONE;
|
zAff[j] = SQLITE_AFF_NONE;
|
||||||
}
|
}
|
||||||
|
if( sqlite3ExprNeedsNoAffinityChange(pRight, zAff[j]) ){
|
||||||
|
zAff[j] = SQLITE_AFF_NONE;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*pzAff = zAff;
|
*pzAff = zAff;
|
||||||
@@ -3093,14 +3125,17 @@ static Bitmask codeOneLoopStart(
|
|||||||
Expr *pRight = pRangeStart->pExpr->pRight;
|
Expr *pRight = pRangeStart->pExpr->pRight;
|
||||||
sqlite3ExprCode(pParse, pRight, regBase+nEq);
|
sqlite3ExprCode(pParse, pRight, regBase+nEq);
|
||||||
sqlite3VdbeAddOp2(v, OP_IsNull, regBase+nEq, addrNxt);
|
sqlite3VdbeAddOp2(v, OP_IsNull, regBase+nEq, addrNxt);
|
||||||
if( zAff
|
if( zAff ){
|
||||||
&& sqlite3CompareAffinity(pRight, zAff[nConstraint])==SQLITE_AFF_NONE
|
if( sqlite3CompareAffinity(pRight, zAff[nConstraint])==SQLITE_AFF_NONE){
|
||||||
){
|
/* Since the comparison is to be performed with no conversions
|
||||||
/* Since the comparison is to be performed with no conversions applied
|
** applied to the operands, set the affinity to apply to pRight to
|
||||||
** to the operands, set the affinity to apply to pRight to
|
|
||||||
** SQLITE_AFF_NONE. */
|
** SQLITE_AFF_NONE. */
|
||||||
zAff[nConstraint] = SQLITE_AFF_NONE;
|
zAff[nConstraint] = SQLITE_AFF_NONE;
|
||||||
}
|
}
|
||||||
|
if( sqlite3ExprNeedsNoAffinityChange(pRight, zAff[nConstraint]) ){
|
||||||
|
zAff[nConstraint] = SQLITE_AFF_NONE;
|
||||||
|
}
|
||||||
|
}
|
||||||
nConstraint++;
|
nConstraint++;
|
||||||
}else if( isMinQuery ){
|
}else if( isMinQuery ){
|
||||||
sqlite3VdbeAddOp2(v, OP_Null, 0, regBase+nEq);
|
sqlite3VdbeAddOp2(v, OP_Null, 0, regBase+nEq);
|
||||||
@@ -3128,14 +3163,17 @@ static Bitmask codeOneLoopStart(
|
|||||||
sqlite3ExprCacheRemove(pParse, regBase+nEq);
|
sqlite3ExprCacheRemove(pParse, regBase+nEq);
|
||||||
sqlite3ExprCode(pParse, pRight, regBase+nEq);
|
sqlite3ExprCode(pParse, pRight, regBase+nEq);
|
||||||
sqlite3VdbeAddOp2(v, OP_IsNull, regBase+nEq, addrNxt);
|
sqlite3VdbeAddOp2(v, OP_IsNull, regBase+nEq, addrNxt);
|
||||||
if( zAff
|
if( zAff ){
|
||||||
&& sqlite3CompareAffinity(pRight, zAff[nConstraint])==SQLITE_AFF_NONE
|
if( sqlite3CompareAffinity(pRight, zAff[nConstraint])==SQLITE_AFF_NONE){
|
||||||
){
|
/* Since the comparison is to be performed with no conversions
|
||||||
/* Since the comparison is to be performed with no conversions applied
|
** applied to the operands, set the affinity to apply to pRight to
|
||||||
** to the operands, set the affinity to apply to pRight to
|
|
||||||
** SQLITE_AFF_NONE. */
|
** SQLITE_AFF_NONE. */
|
||||||
zAff[nConstraint] = SQLITE_AFF_NONE;
|
zAff[nConstraint] = SQLITE_AFF_NONE;
|
||||||
}
|
}
|
||||||
|
if( sqlite3ExprNeedsNoAffinityChange(pRight, zAff[nConstraint]) ){
|
||||||
|
zAff[nConstraint] = SQLITE_AFF_NONE;
|
||||||
|
}
|
||||||
|
}
|
||||||
codeApplyAffinity(pParse, regBase, nEq+1, zAff);
|
codeApplyAffinity(pParse, regBase, nEq+1, zAff);
|
||||||
nConstraint++;
|
nConstraint++;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user