1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-08-07 02:42:48 +03:00

Begin adding the failsafe() macro. (CVS 5383)

FossilOrigin-Name: 8aae4fe7e702b7636fba1fd609a0ca22fdcc3371
This commit is contained in:
drh
2008-07-09 13:28:53 +00:00
parent 474b7cc785
commit 22c2403a1c
9 changed files with 76 additions and 31 deletions

View File

@@ -1,5 +1,5 @@
C Coverage\stesting\sfor\sbalance_quick()\sand\sbalance_deeper().\s(CVS\s5382) C Begin\sadding\sthe\sfailsafe()\smacro.\s(CVS\s5383)
D 2008-07-09T11:49:47 D 2008-07-09T13:28:54
F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
F Makefile.in a03f7cb4f7ad50bc53a788c6c544430e81f95de4 F Makefile.in a03f7cb4f7ad50bc53a788c6c544430e81f95de4
F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@@ -114,7 +114,7 @@ F src/insert.c e8efc17d037346e4a4a6949e72aab850befe3d5d
F src/journal.c cffd2cd214e58c0e99c3ff632b3bee6c7cbb260e F src/journal.c cffd2cd214e58c0e99c3ff632b3bee6c7cbb260e
F src/legacy.c 3626c71fb70912abec9a4312beba753a9ce800df F src/legacy.c 3626c71fb70912abec9a4312beba753a9ce800df
F src/loadext.c ae0eed9fa96d74172d2a90ee63b5bc36d284295c F src/loadext.c ae0eed9fa96d74172d2a90ee63b5bc36d284295c
F src/main.c 47b781b6752eef3ee36ed8269b6f0d48625e82a8 F src/main.c 62ed446133985350b94d16f986862bcdf108bbf2
F src/malloc.c 226a532e9e371d1bb3de2553bdd1f9b600ef099c F src/malloc.c 226a532e9e371d1bb3de2553bdd1f9b600ef099c
F src/md5.c 008216bbb5d34c6fbab5357aa68575ad8a31516a F src/md5.c 008216bbb5d34c6fbab5357aa68575ad8a31516a
F src/mem1.c 8340fa5f969e9f9b9bdeb54106457a2003456d2b F src/mem1.c 8340fa5f969e9f9b9bdeb54106457a2003456d2b
@@ -142,11 +142,11 @@ F src/printf.c 0e4bd1413226e8aaeadec251ffcee93448400417
F src/random.c 5c754319d38abdd6acd74601ee0105504adc508a F src/random.c 5c754319d38abdd6acd74601ee0105504adc508a
F src/select.c e6edf11f024a5207e34683a25f33a700a2f1b43b F src/select.c e6edf11f024a5207e34683a25f33a700a2f1b43b
F src/shell.c 484e7297e066f22830f9c15d7abbcdd2acb097b0 F src/shell.c 484e7297e066f22830f9c15d7abbcdd2acb097b0
F src/sqlite.h.in 22c32cedf7e435d5b3bb8564ce0a640c40dbbfb1 F src/sqlite.h.in 8a00ed8707a16ee724e9e500b07e9af3a6fcc9be
F src/sqlite3ext.h 1e3887c9bd3ae66cb599e922824b04cd0d0f2c3e F src/sqlite3ext.h 1e3887c9bd3ae66cb599e922824b04cd0d0f2c3e
F src/sqliteInt.h 5f820a35b12bedad6f20395f4947b97f645ed243 F src/sqliteInt.h ebf2eab46462b926fdb60277741b4b8659091bee
F src/sqliteLimit.h f435e728c6b620ef7312814d660a81f9356eb5c8 F src/sqliteLimit.h f435e728c6b620ef7312814d660a81f9356eb5c8
F src/status.c 6cb10377992505bd69f1ca1d75c1240a65f25a58 F src/status.c b8d7b1f6b518e71986dfa65058de7a714efd61be
F src/table.c 22744786199c9195720c15a7a42cb97b2e2728d8 F src/table.c 22744786199c9195720c15a7a42cb97b2e2728d8
F src/tclsqlite.c 4dd9ee4cb44846ad9bcc4d0da8088c1e7d4b33d9 F src/tclsqlite.c 4dd9ee4cb44846ad9bcc4d0da8088c1e7d4b33d9
F src/test1.c 30bdb22f911efd492c4f49565eae014330231ece F src/test1.c 30bdb22f911efd492c4f49565eae014330231ece
@@ -166,7 +166,7 @@ F src/test_devsym.c 6012cb8e3acf812513511025a4fa5d626e0ba19b
F src/test_func.c ade4f0117cc96c5a05682e1ef38b84320a866ad9 F src/test_func.c ade4f0117cc96c5a05682e1ef38b84320a866ad9
F src/test_hexio.c 2f1122aa3f012fa0142ee3c36ce5c902a70cd12f F src/test_hexio.c 2f1122aa3f012fa0142ee3c36ce5c902a70cd12f
F src/test_loadext.c df8ab3a6481ddebbdf0d28ebac5d9e0790f7860f F src/test_loadext.c df8ab3a6481ddebbdf0d28ebac5d9e0790f7860f
F src/test_malloc.c 62296810d3ee914fc3e05f2a8a69d8f8f42c32e1 F src/test_malloc.c e762a634a858417eee7225203fc2a5c564b9db20
F src/test_md5.c 28209a4e2068711b5443c33104fe41f21d160071 F src/test_md5.c 28209a4e2068711b5443c33104fe41f21d160071
F src/test_mutex.c 64c88ef9fed47c896fe470af03bffcd0f6f058f2 F src/test_mutex.c 64c88ef9fed47c896fe470af03bffcd0f6f058f2
F src/test_onefile.c 243157b10275251c5dc2d6619aee2ff9ae22379c F src/test_onefile.c 243157b10275251c5dc2d6619aee2ff9ae22379c
@@ -179,7 +179,7 @@ F src/tokenize.c b5fdc79fb7e00077b9c02af7a0da3b89c9f3398e
F src/trigger.c bdb56bb9db1a7b18f8505484051221ab5123f21d F src/trigger.c bdb56bb9db1a7b18f8505484051221ab5123f21d
F src/update.c 945242ccc4fa09799333632baf6b47c657f43cbc F src/update.c 945242ccc4fa09799333632baf6b47c657f43cbc
F src/utf.c 8d52f620a7153d90b058502124fe51d821fcdf57 F src/utf.c 8d52f620a7153d90b058502124fe51d821fcdf57
F src/util.c e202291456d34f8e2cf1c0a6f7e2538a77587445 F src/util.c fbfb7fe4344e93245d8fc2ef975c6d2340f81388
F src/vacuum.c ef342828002debc97514617af3424aea8ef8522c F src/vacuum.c ef342828002debc97514617af3424aea8ef8522c
F src/vdbe.c 4b3c7d0c7f68ec241bebe075c26a46a1618a32cb F src/vdbe.c 4b3c7d0c7f68ec241bebe075c26a46a1618a32cb
F src/vdbe.h c46155c221418bea29ee3a749d5950fcf85a70e2 F src/vdbe.h c46155c221418bea29ee3a749d5950fcf85a70e2
@@ -190,7 +190,7 @@ F src/vdbeblob.c 9345f6dcd675fdcfdb537d2d2f487542d9ea136a
F src/vdbefifo.c c46dae1194e4277bf007144d7e5b0c0b1c24f136 F src/vdbefifo.c c46dae1194e4277bf007144d7e5b0c0b1c24f136
F src/vdbemem.c 3a27b04a25e933a46e9609356426f802fd1ef945 F src/vdbemem.c 3a27b04a25e933a46e9609356426f802fd1ef945
F src/vtab.c 2096c03ec5540a43c8c73a8f43407dfd3549a982 F src/vtab.c 2096c03ec5540a43c8c73a8f43407dfd3549a982
F src/where.c e8a241aab7dc7b43be697de30f2469046d1eca69 F src/where.c 3324f8273a9c40d4b04b65cdef0a8c4954c1cce6
F tclinstaller.tcl 4356d9d94d2b5ed5e68f9f0c80c4df3048dd7617 F tclinstaller.tcl 4356d9d94d2b5ed5e68f9f0c80c4df3048dd7617
F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2
F test/all.test ed6849e7a425620d5d4388409f3b15901b5bc2e7 F test/all.test ed6849e7a425620d5d4388409f3b15901b5bc2e7
@@ -600,7 +600,7 @@ F tool/speedtest16.c c8a9c793df96db7e4933f0852abb7a03d48f2e81
F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
F tool/speedtest8.c 1dbced29de5f59ba2ebf877edcadf171540374d1 F tool/speedtest8.c 1dbced29de5f59ba2ebf877edcadf171540374d1
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
P c6cf08477cc4d622a05ad6706cb9418cf7eea432 P 491f8f9613d2b886acad2ab8f631a4ec61ad698d
R 229bd421824f3bb6fb90dfe5637660e4 R 9b50c0a5ab517d89c7b6337d6fb1deb0
U danielk1977 U drh
Z 426328c9a228ac588ec10fbe5f06c5ef Z c0317483209a7eadce22571dfcdb9040

View File

@@ -1 +1 @@
491f8f9613d2b886acad2ab8f631a4ec61ad698d 8aae4fe7e702b7636fba1fd609a0ca22fdcc3371

View File

@@ -14,7 +14,7 @@
** other files are for internal use by SQLite and should not be ** other files are for internal use by SQLite and should not be
** accessed by users of the library. ** accessed by users of the library.
** **
** $Id: main.c,v 1.472 2008/07/08 19:34:07 drh Exp $ ** $Id: main.c,v 1.473 2008/07/09 13:28:54 drh Exp $
*/ */
#include "sqliteInt.h" #include "sqliteInt.h"
#include <ctype.h> #include <ctype.h>
@@ -579,7 +579,8 @@ static int sqliteDefaultBusyCallback(
*/ */
int sqlite3InvokeBusyHandler(BusyHandler *p){ int sqlite3InvokeBusyHandler(BusyHandler *p){
int rc; int rc;
if( p==0 || p->xFunc==0 || p->nBusy<0 ) return 0; failsafe( p==0, 0x912aaf8d, {return 0;})
if( p->xFunc==0 || p->nBusy<0 ) return 0;
rc = p->xFunc(p->pArg, p->nBusy); rc = p->xFunc(p->pArg, p->nBusy);
if( rc==0 ){ if( rc==0 ){
p->nBusy = -1; p->nBusy = -1;

View File

@@ -30,7 +30,7 @@
** the version number) and changes its name to "sqlite3.h" as ** the version number) and changes its name to "sqlite3.h" as
** part of the build process. ** part of the build process.
** **
** @(#) $Id: sqlite.h.in,v 1.364 2008/07/07 19:52:10 drh Exp $ ** @(#) $Id: sqlite.h.in,v 1.365 2008/07/09 13:28:54 drh Exp $
*/ */
#ifndef _SQLITE3_H_ #ifndef _SQLITE3_H_
#define _SQLITE3_H_ #define _SQLITE3_H_
@@ -6120,6 +6120,7 @@ int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetFlag);
#define SQLITE_STATUS_SCRATCH_USED 3 #define SQLITE_STATUS_SCRATCH_USED 3
#define SQLITE_STATUS_SCRATCH_OVERFLOW 4 #define SQLITE_STATUS_SCRATCH_OVERFLOW 4
#define SQLITE_STATUS_MALLOC_SIZE 5 #define SQLITE_STATUS_MALLOC_SIZE 5
#define SQLITE_STATUS_FAILSAFE 6
/* /*

View File

@@ -11,7 +11,7 @@
************************************************************************* *************************************************************************
** Internal interface definitions for SQLite. ** Internal interface definitions for SQLite.
** **
** @(#) $Id: sqliteInt.h,v 1.738 2008/07/08 23:40:20 drh Exp $ ** @(#) $Id: sqliteInt.h,v 1.739 2008/07/09 13:28:54 drh Exp $
*/ */
#ifndef _SQLITEINT_H_ #ifndef _SQLITEINT_H_
#define _SQLITEINT_H_ #define _SQLITEINT_H_
@@ -62,6 +62,26 @@
# define testcase(X) # define testcase(X)
#endif #endif
/*
** The failsafe() macro is used to test for error conditions that
** should never occur. This is similar to assert() except that with
** failsafe() the application attempts to recover gracefully rather
** than abort. If a error condition is detected, a global flag is
** set to the "Id" prior to recovery in order to alert the application
** to the error condition.
**
** The Id should be a random integer. The idea behind the Id is that
** failsafe() faults in the field can be mapped back to specific failsafe()
** macros, even if line numbers and filenames have changed.
**
** The test condition is argument Cond. The recovery action is
** argument Action.
*/
#ifdef SQLITE_COVERAGE_TEST
# define failsafe(Cond,Id,Action)
#else
# define failsafe(Cond,Id,Action) if( Cond ){ sqlite3Failsafe(Id); Action; }
#endif
/* /*
** The macro unlikely() is a hint that surrounds a boolean ** The macro unlikely() is a hint that surrounds a boolean
@@ -1756,6 +1776,7 @@ struct Sqlite3Config {
int bCoreMutex; /* True to enable core mutexing */ int bCoreMutex; /* True to enable core mutexing */
int bFullMutex; /* True to enable full mutexing */ int bFullMutex; /* True to enable full mutexing */
int mxStrlen; /* Maximum string length */ int mxStrlen; /* Maximum string length */
int iFailsafe; /* Id of failed failsafe() */
sqlite3_mem_methods m; /* Low-level memory allocation interface */ sqlite3_mem_methods m; /* Low-level memory allocation interface */
sqlite3_mutex_methods mutex; /* Low-level mutex interface */ sqlite3_mutex_methods mutex; /* Low-level mutex interface */
void *pHeap; /* Heap storage space */ void *pHeap; /* Heap storage space */
@@ -1791,10 +1812,8 @@ struct Sqlite3Config {
#ifdef SQLITE_DEBUG #ifdef SQLITE_DEBUG
int sqlite3Corrupt(void); int sqlite3Corrupt(void);
# define SQLITE_CORRUPT_BKPT sqlite3Corrupt() # define SQLITE_CORRUPT_BKPT sqlite3Corrupt()
# define DEBUGONLY(X) X
#else #else
# define SQLITE_CORRUPT_BKPT SQLITE_CORRUPT # define SQLITE_CORRUPT_BKPT SQLITE_CORRUPT
# define DEBUGONLY(X)
#endif #endif
/* /*
@@ -2001,6 +2020,7 @@ void sqlite3RegisterDateTimeFunctions(sqlite3*);
#endif #endif
int sqlite3SafetyCheckOk(sqlite3*); int sqlite3SafetyCheckOk(sqlite3*);
int sqlite3SafetyCheckSickOrOk(sqlite3*); int sqlite3SafetyCheckSickOrOk(sqlite3*);
void sqlite3Failsafe(int);
void sqlite3ChangeCookie(Parse*, int); void sqlite3ChangeCookie(Parse*, int);
void sqlite3MaterializeView(Parse*, Select*, Expr*, int); void sqlite3MaterializeView(Parse*, Select*, Expr*, int);

View File

@@ -13,7 +13,7 @@
** This module implements the sqlite3_status() interface and related ** This module implements the sqlite3_status() interface and related
** functionality. ** functionality.
** **
** $Id: status.c,v 1.1 2008/06/19 13:20:02 drh Exp $ ** $Id: status.c,v 1.2 2008/07/09 13:28:54 drh Exp $
*/ */
#include "sqliteInt.h" #include "sqliteInt.h"
@@ -73,6 +73,11 @@ void sqlite3StatusSet(int op, int X){
** then this routine is not threadsafe. ** then this routine is not threadsafe.
*/ */
int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetFlag){ int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetFlag){
if( op==SQLITE_STATUS_FAILSAFE ){
*pCurrent = *pHighwater = sqlite3Config.iFailsafe;
if( resetFlag ) sqlite3Config.iFailsafe = 0;
return SQLITE_OK;
}
if( op<0 || op>=ArraySize(sqlite3Stat.nowValue) ){ if( op<0 || op>=ArraySize(sqlite3Stat.nowValue) ){
return SQLITE_MISUSE; return SQLITE_MISUSE;
} }

View File

@@ -13,7 +13,7 @@
** This file contains code used to implement test interfaces to the ** This file contains code used to implement test interfaces to the
** memory allocation subsystem. ** memory allocation subsystem.
** **
** $Id: test_malloc.c,v 1.33 2008/06/27 14:05:25 danielk1977 Exp $ ** $Id: test_malloc.c,v 1.34 2008/07/09 13:28:54 drh Exp $
*/ */
#include "sqliteInt.h" #include "sqliteInt.h"
#include "tcl.h" #include "tcl.h"
@@ -1043,6 +1043,7 @@ static int test_status(
{ "SQLITE_STATUS_SCRATCH_USED", SQLITE_STATUS_SCRATCH_USED }, { "SQLITE_STATUS_SCRATCH_USED", SQLITE_STATUS_SCRATCH_USED },
{ "SQLITE_STATUS_SCRATCH_OVERFLOW", SQLITE_STATUS_SCRATCH_OVERFLOW }, { "SQLITE_STATUS_SCRATCH_OVERFLOW", SQLITE_STATUS_SCRATCH_OVERFLOW },
{ "SQLITE_STATUS_MALLOC_SIZE", SQLITE_STATUS_MALLOC_SIZE }, { "SQLITE_STATUS_MALLOC_SIZE", SQLITE_STATUS_MALLOC_SIZE },
{ "SQLITE_STATUS_FAILSAFE", SQLITE_STATUS_FAILSAFE },
}; };
Tcl_Obj *pResult; Tcl_Obj *pResult;
if( objc!=3 ){ if( objc!=3 ){

View File

@@ -14,7 +14,7 @@
** This file contains functions for allocating memory, comparing ** This file contains functions for allocating memory, comparing
** strings, and stuff like that. ** strings, and stuff like that.
** **
** $Id: util.c,v 1.234 2008/07/08 14:52:10 drh Exp $ ** $Id: util.c,v 1.235 2008/07/09 13:28:54 drh Exp $
*/ */
#include "sqliteInt.h" #include "sqliteInt.h"
#include <stdarg.h> #include <stdarg.h>
@@ -936,3 +936,17 @@ int sqlite3SafetyCheckSickOrOk(sqlite3 *db){
magic!=SQLITE_MAGIC_BUSY ) return 0; magic!=SQLITE_MAGIC_BUSY ) return 0;
return 1; return 1;
} }
/*
** Report a failsafe() macro failure
*/
void sqlite3Failsafe(int iCode){
sqlite3Config.iFailsafe = iCode;
/* The following assert is always false. When assert() is enabled,
** the following causes a failsafe() failure to work like an assert()
** failure. Normal operating mode for SQLite is for assert() to be
** disabled, however, so the following is normally a no-op.
*/
assert( iCode==0 ); /* Always fails if assert() is enabled */
}

View File

@@ -16,7 +16,7 @@
** so is applicable. Because this module is responsible for selecting ** so is applicable. Because this module is responsible for selecting
** indices, you might also think of this module as the "query optimizer". ** indices, you might also think of this module as the "query optimizer".
** **
** $Id: where.c,v 1.314 2008/07/08 22:28:49 shane Exp $ ** $Id: where.c,v 1.315 2008/07/09 13:28:54 drh Exp $
*/ */
#include "sqliteInt.h" #include "sqliteInt.h"
@@ -450,13 +450,14 @@ static WhereTerm *findTerm(
){ ){
WhereTerm *pTerm; WhereTerm *pTerm;
int k; int k;
assert( iCur>=0 );
for(pTerm=pWC->a, k=pWC->nTerm; k; k--, pTerm++){ for(pTerm=pWC->a, k=pWC->nTerm; k; k--, pTerm++){
if( pTerm->leftCursor==iCur if( pTerm->leftCursor==iCur
&& (pTerm->prereqRight & notReady)==0 && (pTerm->prereqRight & notReady)==0
&& pTerm->leftColumn==iColumn && pTerm->leftColumn==iColumn
&& (pTerm->eOperator & op)!=0 && (pTerm->eOperator & op)!=0
){ ){
if( iCur>=0 && pIdx && pTerm->eOperator!=WO_ISNULL ){ if( pIdx && pTerm->eOperator!=WO_ISNULL ){
Expr *pX = pTerm->pExpr; Expr *pX = pTerm->pExpr;
CollSeq *pColl; CollSeq *pColl;
char idxaff; char idxaff;
@@ -476,8 +477,9 @@ static WhereTerm *findTerm(
pColl = pParse->db->pDfltColl; pColl = pParse->db->pDfltColl;
} }
for(j=0; j<pIdx->nColumn && pIdx->aiColumn[j]!=iColumn; j++){} for(j=0; pIdx->aiColumn[j]!=iColumn; j++){
assert( j<pIdx->nColumn ); failsafe( j>=pIdx->nColumn, 0x0128fc98, {return 0;});
}
if( sqlite3StrICmp(pColl->zName, pIdx->azColl[j]) ) continue; if( sqlite3StrICmp(pColl->zName, pIdx->azColl[j]) ) continue;
} }
return pTerm; return pTerm;
@@ -866,7 +868,7 @@ static void exprAnalyze(
ExprList *pList = 0; ExprList *pList = 0;
Expr *pNew, *pDup; Expr *pNew, *pDup;
Expr *pLeft = 0; Expr *pLeft = 0;
for(i=sOr.nTerm-1, pOrTerm=sOr.a; i>=0 && ok; i--, pOrTerm++){ for(i=sOr.nTerm-1, pOrTerm=sOr.a; i>=0; i--, pOrTerm++){
if( (pOrTerm->flags & TERM_OR_OK)==0 ) continue; if( (pOrTerm->flags & TERM_OR_OK)==0 ) continue;
pDup = sqlite3ExprDup(db, pOrTerm->pExpr->pRight); pDup = sqlite3ExprDup(db, pOrTerm->pExpr->pRight);
pList = sqlite3ExprListAppend(pWC->pParse, pList, pDup, 0); pList = sqlite3ExprListAppend(pWC->pParse, pList, pDup, 0);
@@ -1606,7 +1608,8 @@ static double bestIndex(
flags |= WHERE_COLUMN_IN; flags |= WHERE_COLUMN_IN;
if( pExpr->pSelect!=0 ){ if( pExpr->pSelect!=0 ){
inMultiplier *= 25; inMultiplier *= 25;
}else if( pExpr->pList!=0 ){ }else{
failsafe( pExpr->pList==0, 0x16b91d0f, continue);
inMultiplier *= pExpr->pList->nExpr + 1; inMultiplier *= pExpr->pList->nExpr + 1;
} }
} }
@@ -1722,9 +1725,9 @@ static double bestIndex(
*/ */
static void disableTerm(WhereLevel *pLevel, WhereTerm *pTerm){ static void disableTerm(WhereLevel *pLevel, WhereTerm *pTerm){
if( pTerm if( pTerm
&& (pTerm->flags & TERM_CODED)==0
&& (pLevel->iLeftJoin==0 || ExprHasProperty(pTerm->pExpr, EP_FromJoin)) && (pLevel->iLeftJoin==0 || ExprHasProperty(pTerm->pExpr, EP_FromJoin))
){ ){
failsafe( (pTerm->flags & TERM_CODED)!=0, 0x641154a4, /* no-op */ );
pTerm->flags |= TERM_CODED; pTerm->flags |= TERM_CODED;
if( pTerm->iParent>=0 ){ if( pTerm->iParent>=0 ){
WhereTerm *pOther = &pTerm->pWC->a[pTerm->iParent]; WhereTerm *pOther = &pTerm->pWC->a[pTerm->iParent];
@@ -1870,7 +1873,7 @@ static int codeAllEqualityTerms(
int r1; int r1;
int k = pIdx->aiColumn[j]; int k = pIdx->aiColumn[j];
pTerm = findTerm(pWC, iCur, k, notReady, pLevel->flags, pIdx); pTerm = findTerm(pWC, iCur, k, notReady, pLevel->flags, pIdx);
if( pTerm==0 ) break; failsafe( pTerm==0, 0x7592494c, break );
assert( (pTerm->flags & TERM_CODED)==0 ); assert( (pTerm->flags & TERM_CODED)==0 );
r1 = codeEqualityTerm(pParse, pTerm, pLevel, regBase+j); r1 = codeEqualityTerm(pParse, pTerm, pLevel, regBase+j);
if( r1!=regBase+j ){ if( r1!=regBase+j ){