diff options
author | drh <drh@noemail.net> | 2008-01-23 12:52:40 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2008-01-23 12:52:40 +0000 |
commit | 01495b992158f6da5568bcc11e82d6844ffff4a8 (patch) | |
tree | 4317198de87b54f358a6515089518e65c364a860 /src | |
parent | 7e8b848a60a305231cca0b8cfc7f08be5f0429bd (diff) | |
download | sqlite-01495b992158f6da5568bcc11e82d6844ffff4a8.tar.gz sqlite-01495b992158f6da5568bcc11e82d6844ffff4a8.zip |
Improvements to test coverage in the lemon-generated parser and in the
sqlite3_get_table() interface. (CVS 4745)
FossilOrigin-Name: 9f95d79daeb5e7f6fd62f3c896dae4d332121d1c
Diffstat (limited to 'src')
-rw-r--r-- | src/btmutex.c | 4 | ||||
-rw-r--r-- | src/main.c | 36 | ||||
-rw-r--r-- | src/table.c | 25 | ||||
-rw-r--r-- | src/test9.c | 38 | ||||
-rw-r--r-- | src/test_config.c | 9 | ||||
-rw-r--r-- | src/where.c | 16 |
6 files changed, 44 insertions, 84 deletions
diff --git a/src/btmutex.c b/src/btmutex.c index 36c22e8cf..58a1b56ae 100644 --- a/src/btmutex.c +++ b/src/btmutex.c @@ -10,7 +10,7 @@ ** ************************************************************************* ** -** $Id: btmutex.c,v 1.8 2007/12/07 18:55:28 drh Exp $ +** $Id: btmutex.c,v 1.9 2008/01/23 12:52:41 drh Exp $ ** ** This file contains code used to implement mutexes on Btree objects. ** This code really belongs in btree.c. But btree.c is getting too @@ -61,6 +61,7 @@ void sqlite3BtreeEnter(Btree *p){ p->wantToLock++; if( p->locked ) return; +#ifndef SQLITE_MUTEX_NOOP /* In most cases, we should be able to acquire the lock we ** want without having to go throught the ascending lock ** procedure that follows. Just be sure not to block. @@ -92,6 +93,7 @@ void sqlite3BtreeEnter(Btree *p){ pLater->locked = 1; } } +#endif /* SQLITE_MUTEX_NOOP */ } /* diff --git a/src/main.c b/src/main.c index 2d9d2ca86..bc79451e8 100644 --- a/src/main.c +++ b/src/main.c @@ -14,7 +14,7 @@ ** other files are for internal use by SQLite and should not be ** accessed by users of the library. ** -** $Id: main.c,v 1.413 2008/01/23 03:03:05 drh Exp $ +** $Id: main.c,v 1.414 2008/01/23 12:52:41 drh Exp $ */ #include "sqliteInt.h" #include <ctype.h> @@ -374,9 +374,6 @@ int sqlite3_busy_handler( int (*xBusy)(void*,int), void *pArg ){ - if( !sqlite3SafetyCheckOk(db) ){ - return SQLITE_MISUSE; - } sqlite3_mutex_enter(db->mutex); db->busyHandler.xFunc = xBusy; db->busyHandler.pArg = pArg; @@ -419,9 +416,6 @@ void sqlite3_progress_handler( ** specified number of milliseconds before returning 0. */ int sqlite3_busy_timeout(sqlite3 *db, int ms){ - if( !sqlite3SafetyCheckOk(db) ){ - return SQLITE_MISUSE; - } if( ms>0 ){ db->busyTimeout = ms; sqlite3_busy_handler(db, sqliteDefaultBusyCallback, (void*)db); @@ -461,9 +455,6 @@ int sqlite3CreateFunc( int nName; assert( sqlite3_mutex_held(db->mutex) ); - if( !sqlite3SafetyCheckOk(db) ){ - return SQLITE_MISUSE; - } if( zFunctionName==0 || (xFunc && (xFinal || xStep)) || (!xFunc && (xFinal && !xStep)) || @@ -849,12 +840,12 @@ const void *sqlite3_errmsg16(sqlite3 *db){ ** passed to this function, we assume a malloc() failed during sqlite3_open(). */ int sqlite3_errcode(sqlite3 *db){ - if( !db || db->mallocFailed ){ - return SQLITE_NOMEM; - } if( !sqlite3SafetyCheckSickOrOk(db) ){ return SQLITE_MISUSE; } + if( !db || db->mallocFailed ){ + return SQLITE_NOMEM; + } return db->errCode & db->errMask; } @@ -873,9 +864,6 @@ static int createCollation( CollSeq *pColl; int enc2; - if( !sqlite3SafetyCheckOk(db) ){ - return SQLITE_MISUSE; - } assert( sqlite3_mutex_held(db->mutex) ); /* If SQLITE_UTF16 is specified as the encoding type, transform this @@ -1217,7 +1205,7 @@ int sqlite3_create_collation16( int(*xCompare)(void*,int,const void*,int,const void*) ){ int rc = SQLITE_OK; - char *zName8; + char *zName8; sqlite3_mutex_enter(db->mutex); assert( !db->mallocFailed ); zName8 = sqlite3Utf16to8(db, zName, -1); @@ -1240,9 +1228,6 @@ int sqlite3_collation_needed( void *pCollNeededArg, void(*xCollNeeded)(void*,sqlite3*,int eTextRep,const char*) ){ - if( !sqlite3SafetyCheckOk(db) ){ - return SQLITE_MISUSE; - } sqlite3_mutex_enter(db->mutex); db->xCollNeeded = xCollNeeded; db->xCollNeeded16 = 0; @@ -1261,9 +1246,6 @@ int sqlite3_collation_needed16( void *pCollNeededArg, void(*xCollNeeded16)(void*,sqlite3*,int eTextRep,const void*) ){ - if( !sqlite3SafetyCheckOk(db) ){ - return SQLITE_MISUSE; - } sqlite3_mutex_enter(db->mutex); db->xCollNeeded = 0; db->xCollNeeded16 = xCollNeeded16; @@ -1345,9 +1327,7 @@ int sqlite3_table_column_metadata( int autoinc = 0; /* Ensure the database schema has been loaded */ - if( !sqlite3SafetyCheckOk(db) || sqlite3SafetyOn(db) ){ - return SQLITE_MISUSE; - } + (void)sqlite3SafetyOn(db); sqlite3_mutex_enter(db->mutex); rc = sqlite3Init(db, &zErrMsg); if( SQLITE_OK!=rc ){ @@ -1405,9 +1385,7 @@ int sqlite3_table_column_metadata( } error_out: - if( sqlite3SafetyOff(db) ){ - rc = SQLITE_MISUSE; - } + (void)sqlite3SafetyOff(db); /* Whether the function call succeeded or failed, set the output parameters ** to whatever their local counterparts contain. If an error did occur, diff --git a/src/table.c b/src/table.c index a79a6aca9..48782e895 100644 --- a/src/table.c +++ b/src/table.c @@ -75,12 +75,14 @@ static int sqlite3_get_table_cb(void *pArg, int nCol, char **argv, char **colv){ }else{ z = sqlite3_mprintf("%s", colv[i]); } + if( z==0 ) goto malloc_failed; p->azResult[p->nData++] = z; } }else if( p->nColumn!=nCol ){ - sqlite3SetString(&p->zErrMsg, - "sqlite3_get_table() called with two or more incompatible queries", - (char*)0); + sqlite3_free(p->zErrMsg); + p->zErrMsg = sqlite3_mprintf( + "sqlite3_get_table() called with two or more incompatible queries" + ); p->rc = SQLITE_ERROR; return 1; } @@ -139,15 +141,13 @@ int sqlite3_get_table( res.nData = 1; res.nAlloc = 20; res.rc = SQLITE_OK; - res.azResult = sqlite3_malloc( sizeof(char*)*res.nAlloc ); - if( res.azResult==0 ) return SQLITE_NOMEM; + res.azResult = sqlite3_malloc(sizeof(char*)*res.nAlloc ); + if( res.azResult==0 ){ + db->errCode = SQLITE_NOMEM; + return SQLITE_NOMEM; + } res.azResult[0] = 0; rc = sqlite3_exec(db, zSql, sqlite3_get_table_cb, &res, pzErrMsg); -#ifndef NDEBUG - sqlite3_mutex_enter(db->mutex); - assert((rc&db->errMask)==rc && (res.rc&db->errMask)==res.rc); - sqlite3_mutex_leave(db->mutex); -#endif if( res.azResult ){ assert( sizeof(res.azResult[0])>= sizeof(res.nData) ); res.azResult[0] = (char*)res.nData; @@ -161,9 +161,7 @@ int sqlite3_get_table( } sqlite3_free(res.zErrMsg); } - sqlite3_mutex_enter(db->mutex); - db->errCode = res.rc; - sqlite3_mutex_leave(db->mutex); + db->errCode = res.rc; /* Assume 32-bit assignment is atomic */ return res.rc; } sqlite3_free(res.zErrMsg); @@ -176,6 +174,7 @@ int sqlite3_get_table( azNew = sqlite3_realloc( res.azResult, sizeof(char*)*(res.nData+1) ); if( azNew==0 ){ sqlite3_free_table(&res.azResult[1]); + db->errCode = SQLITE_NOMEM; return SQLITE_NOMEM; } res.nAlloc = res.nData+1; diff --git a/src/test9.c b/src/test9.c index 1e92245ff..a1fb49beb 100644 --- a/src/test9.c +++ b/src/test9.c @@ -14,7 +14,7 @@ ** for completeness. Test code is written in C for these cases ** as there is not much point in binding to Tcl. ** -** $Id: test9.c,v 1.4 2007/08/21 10:44:16 drh Exp $ +** $Id: test9.c,v 1.5 2008/01/23 12:52:41 drh Exp $ */ #include "sqliteInt.h" #include "tcl.h" @@ -131,41 +131,22 @@ static int c_misuse_test( } sqlite3_close(db); -#ifndef SQLITE_OMIT_UTF16 - rc = sqlite3_collation_needed16(db, 0, 0); - if( rc!=SQLITE_MISUSE ){ - zErrFunction = "sqlite3_collation_needed16"; - goto error_out; - } -#endif - rc = sqlite3_collation_needed(db, 0, 0); - if( rc!=SQLITE_MISUSE ){ - zErrFunction = "sqlite3_collation_needed"; - goto error_out; - } - - rc = sqlite3_create_collation(db, 0, 0, 0, 0); - if( rc!=SQLITE_MISUSE ){ - zErrFunction = "sqlite3_create_collation"; - goto error_out; - } - - rc = sqlite3_create_function(db, 0, 0, 0, 0, 0, 0, 0); + rc = sqlite3_errcode(db); if( rc!=SQLITE_MISUSE ){ - zErrFunction = "sqlite3_create_function"; + zErrFunction = "sqlite3_errcode"; goto error_out; } - rc = sqlite3_busy_handler(db, 0, 0); + rc = sqlite3_prepare(db, 0, 0, 0, 0); if( rc!=SQLITE_MISUSE ){ - zErrFunction = "sqlite3_busy_handler"; + zErrFunction = "sqlite3_prepare"; goto error_out; } - rc = sqlite3_errcode(db); + rc = sqlite3_prepare_v2(db, 0, 0, 0, 0); if( rc!=SQLITE_MISUSE ){ - zErrFunction = "sqlite3_busy_handler"; + zErrFunction = "sqlite3_prepare_v2"; goto error_out; } @@ -175,6 +156,11 @@ static int c_misuse_test( zErrFunction = "sqlite3_prepare16"; goto error_out; } + rc = sqlite3_prepare16_v2(db, 0, 0, 0, 0); + if( rc!=SQLITE_MISUSE ){ + zErrFunction = "sqlite3_prepare16_v2"; + goto error_out; + } #endif return TCL_OK; diff --git a/src/test_config.c b/src/test_config.c index dcbd8ed95..b47ca899e 100644 --- a/src/test_config.c +++ b/src/test_config.c @@ -16,7 +16,7 @@ ** The focus of this file is providing the TCL testing layer ** access to compile-time constants. ** -** $Id: test_config.c,v 1.18 2008/01/22 23:37:10 drh Exp $ +** $Id: test_config.c,v 1.19 2008/01/23 12:52:41 drh Exp $ */ #include "sqliteLimit.h" @@ -44,6 +44,8 @@ int sqlite3MAX_LIKE_PATTERN_LENGTH = SQLITE_MAX_LIKE_PATTERN_LENGTH; ** procedures use this to determine when tests should be omitted. */ static void set_options(Tcl_Interp *interp){ + int rc = 0; + #ifdef SQLITE_32BIT_ROWID Tcl_SetVar2(interp, "sqlite_options", "rowid32", "1", TCL_GLOBAL_ONLY); #else @@ -366,12 +368,13 @@ Tcl_SetVar2(interp, "sqlite_options", "long_double", Tcl_SetVar2(interp, "sqlite_options", "tclvar", "1", TCL_GLOBAL_ONLY); #endif + rc = sqlite3_threadsafe(); #if SQLITE_THREADSAFE Tcl_SetVar2(interp, "sqlite_options", "threadsafe", "1", TCL_GLOBAL_ONLY); - assert( sqlite3_threadsafe() ); + assert( rc ); #else Tcl_SetVar2(interp, "sqlite_options", "threadsafe", "0", TCL_GLOBAL_ONLY); - assert( !sqlite3_threadsafe() ); + assert( !rc ); #endif #ifdef SQLITE_OMIT_TRACE diff --git a/src/where.c b/src/where.c index ae8fb4b8c..50bcea2dd 100644 --- a/src/where.c +++ b/src/where.c @@ -16,7 +16,7 @@ ** so is applicable. Because this module is responsible for selecting ** indices, you might also think of this module as the "query optimizer". ** -** $Id: where.c,v 1.285 2008/01/23 03:03:05 drh Exp $ +** $Id: where.c,v 1.286 2008/01/23 12:52:41 drh Exp $ */ #include "sqliteInt.h" @@ -540,11 +540,9 @@ static int isLikeOrGlob( return 0; } pColl = pLeft->pColl; + assert( pColl!=0 || pLeft->iColumn==-1 ); if( pColl==0 ){ - /* TODO: Coverage testing doesn't get this case. Is it actually possible - ** for an expression of type TK_COLUMN to not have an assigned collation - ** sequence at this point? - */ + /* No collation is defined for the ROWID. Use the default. */ pColl = db->pDfltColl; } if( (pColl->type!=SQLITE_COLL_BINARY || noCase) && @@ -1859,13 +1857,7 @@ static void whereInfoFree(WhereInfo *pWInfo){ for(i=0; i<pWInfo->nLevel; i++){ sqlite3_index_info *pInfo = pWInfo->a[i].pIdxInfo; if( pInfo ){ - if( pInfo->needToFreeIdxStr ){ - /* Coverage: Don't think this can be reached. By the time this - ** function is called, the index-strings have been passed - ** to the vdbe layer for deletion. - */ - sqlite3_free(pInfo->idxStr); - } + assert( pInfo->needToFreeIdxStr==0 ); sqlite3_free(pInfo); } } |