175897234Sdrh /* 2b19a2bc6Sdrh ** 2001 September 15 375897234Sdrh ** 4b19a2bc6Sdrh ** The author disclaims copyright to this source code. In place of 5b19a2bc6Sdrh ** a legal notice, here is a blessing: 675897234Sdrh ** 7b19a2bc6Sdrh ** May you do good and not evil. 8b19a2bc6Sdrh ** May you find forgiveness for yourself and forgive others. 9b19a2bc6Sdrh ** May you share freely, never taking more than you give. 1075897234Sdrh ** 1175897234Sdrh ************************************************************************* 1275897234Sdrh ** Main file for the SQLite library. The routines in this file 1375897234Sdrh ** implement the programmer interface to the library. Routines in 1475897234Sdrh ** other files are for internal use by SQLite and should not be 1575897234Sdrh ** accessed by users of the library. 1675897234Sdrh ** 17*fec00eabSdrh ** $Id: main.c,v 1.444 2008/06/14 16:56:22 drh Exp $ 1875897234Sdrh */ 1975897234Sdrh #include "sqliteInt.h" 20ce9079c8Sdrh #include <ctype.h> 2158f1c8b7Sdrh 22820a9069Sdrh #ifdef SQLITE_ENABLE_FTS3 23820a9069Sdrh # include "fts3.h" 24820a9069Sdrh #endif 2558f1c8b7Sdrh #ifdef SQLITE_ENABLE_RTREE 2658f1c8b7Sdrh # include "rtree.h" 2758f1c8b7Sdrh #endif 2875897234Sdrh 2975897234Sdrh /* 30b217a57eSdrh ** The version of the library 31b217a57eSdrh */ 3224b03fd0Sdanielk1977 const char sqlite3_version[] = SQLITE_VERSION; 334aec8b65Sdrh const char *sqlite3_libversion(void){ return sqlite3_version; } 3499ba19eaSdanielk1977 int sqlite3_libversion_number(void){ return SQLITE_VERSION_NUMBER; } 35b67e8bf0Sdrh int sqlite3_threadsafe(void){ return SQLITE_THREADSAFE; } 36b217a57eSdrh 37e265b084Sdrh #if !defined(SQLITE_OMIT_TRACE) && defined(SQLITE_ENABLE_IOTRACE) 38b217a57eSdrh /* 39b0603416Sdrh ** If the following function pointer is not NULL and if 40b0603416Sdrh ** SQLITE_ENABLE_IOTRACE is enabled, then messages describing 41b0603416Sdrh ** I/O active are written using this function. These messages 42b0603416Sdrh ** are intended for debugging activity only. 43b0603416Sdrh */ 443a00f907Smlcreech void (*sqlite3IoTrace)(const char*, ...) = 0; 45e265b084Sdrh #endif 46b0603416Sdrh 47b0603416Sdrh /* 48a16313e5Sdrh ** If the following global variable points to a string which is the 49a16313e5Sdrh ** name of a directory, then that directory will be used to store 50a16313e5Sdrh ** temporary files. 51a16313e5Sdrh ** 52a16313e5Sdrh ** See also the "PRAGMA temp_store_directory" SQL command. 53a16313e5Sdrh */ 54a16313e5Sdrh char *sqlite3_temp_directory = 0; 55a16313e5Sdrh 56c5499befSdrh /* 5740257ffdSdrh ** Flags to help SQLite determine if it has been initialized. 5840257ffdSdrh */ 5940257ffdSdrh static int sqlite3IsInit = 0; /* Initialization has started */ 6040257ffdSdrh static int sqlite3FullInit = 0; /* Initialization is complete */ 6140257ffdSdrh 6240257ffdSdrh /* 6340257ffdSdrh ** Initialize SQLite. 6440257ffdSdrh ** 6540257ffdSdrh ** This routine must be called to initialize the memory allocation, 6640257ffdSdrh ** VFS, and mutex subsystesms prior to doing any serious work with 6740257ffdSdrh ** SQLite. But as long as you do not compile with SQLITE_OMIT_AUTOINIT 6840257ffdSdrh ** this routine will be called automatically by key routines such as 6940257ffdSdrh ** sqlite3_open(). 7040257ffdSdrh ** 7140257ffdSdrh ** This routine is a no-op except on its very first call for the process, 7240257ffdSdrh ** or for the first call after a call to sqlite3_shutdown. 7340257ffdSdrh */ 7440257ffdSdrh int sqlite3_initialize(void){ 7540257ffdSdrh int rc; 7640257ffdSdrh if( sqlite3IsInit ) return SQLITE_OK; 7740257ffdSdrh rc = sqlite3_mutex_init(); 7840257ffdSdrh if( rc==SQLITE_OK ){ 7940257ffdSdrh #ifndef SQLITE_MUTEX_NOOP 8040257ffdSdrh sqlite3_mutex *pMutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER); 8140257ffdSdrh #endif 8240257ffdSdrh sqlite3_mutex_enter(pMutex); 8340257ffdSdrh if( sqlite3IsInit==0 ){ 8440257ffdSdrh sqlite3IsInit = 1; 8540257ffdSdrh if( rc==SQLITE_OK ) rc = sqlite3MallocInit(); 8640257ffdSdrh if( rc==SQLITE_OK ) rc = sqlite3_os_init(); 8740257ffdSdrh if( rc!=SQLITE_OK ){ 8840257ffdSdrh sqlite3IsInit = 0; 8940257ffdSdrh }else{ 9040257ffdSdrh sqlite3FullInit = 1; 9140257ffdSdrh } 9240257ffdSdrh } 9340257ffdSdrh sqlite3_mutex_leave(pMutex); 9440257ffdSdrh } 9540257ffdSdrh return rc; 9640257ffdSdrh } 9740257ffdSdrh 9840257ffdSdrh /* 9940257ffdSdrh ** Undo the effects of sqlite3_initialize(). Must not be called while 10040257ffdSdrh ** there are outstanding database connections or memory allocations or 10140257ffdSdrh ** while any part of SQLite is otherwise in use in any thread. This 10240257ffdSdrh ** routine is not threadsafe. Not by a long shot. 10340257ffdSdrh */ 10440257ffdSdrh int sqlite3_shutdown(void){ 10540257ffdSdrh sqlite3_os_end(); 106*fec00eabSdrh sqlite3MallocEnd(); 10740257ffdSdrh sqlite3_mutex_end(); 10840257ffdSdrh sqlite3FullInit = 0; 10940257ffdSdrh sqlite3IsInit = 0; 11040257ffdSdrh return SQLITE_OK; 11140257ffdSdrh } 11240257ffdSdrh 11340257ffdSdrh /* 11440257ffdSdrh ** This API allows applications to modify the global configuration of 11540257ffdSdrh ** the SQLite library at run-time. 11640257ffdSdrh ** 11740257ffdSdrh ** This routine should only be called when there are no outstanding 11840257ffdSdrh ** database connections or memory allocations. This routine is not 11940257ffdSdrh ** threadsafe. Failure to heed these warnings can lead to unpredictable 12040257ffdSdrh ** behavior. 12140257ffdSdrh */ 12240257ffdSdrh int sqlite3_config(int op, ...){ 12340257ffdSdrh va_list ap; 12440257ffdSdrh int rc = SQLITE_OK; 12540257ffdSdrh 12640257ffdSdrh /* sqlite3_config() shall return SQLITE_MISUSE if it is invoked while 12740257ffdSdrh ** the SQLite library is in use. */ 12840257ffdSdrh if( sqlite3FullInit ) return SQLITE_MISUSE; 12940257ffdSdrh 13040257ffdSdrh va_start(ap, op); 13140257ffdSdrh switch( op ){ 13240257ffdSdrh case SQLITE_CONFIG_SINGLETHREAD: { 13340257ffdSdrh /* Disable all mutexing */ 13440257ffdSdrh sqlite3Config.bCoreMutex = 0; 13540257ffdSdrh sqlite3Config.bFullMutex = 0; 13640257ffdSdrh break; 13740257ffdSdrh } 13840257ffdSdrh case SQLITE_CONFIG_MULTITHREAD: { 13940257ffdSdrh /* Disable mutexing of database connections */ 14040257ffdSdrh /* Enable mutexing of core data structures */ 14140257ffdSdrh sqlite3Config.bCoreMutex = 1; 14240257ffdSdrh sqlite3Config.bFullMutex = 0; 14340257ffdSdrh break; 14440257ffdSdrh } 14540257ffdSdrh case SQLITE_CONFIG_SERIALIZED: { 14640257ffdSdrh /* Enable all mutexing */ 14740257ffdSdrh sqlite3Config.bCoreMutex = 1; 14840257ffdSdrh sqlite3Config.bFullMutex = 1; 14940257ffdSdrh break; 15040257ffdSdrh } 15140257ffdSdrh case SQLITE_CONFIG_MALLOC: { 15240257ffdSdrh /* Specify an alternative malloc implementation */ 153*fec00eabSdrh sqlite3Config.m = *va_arg(ap, sqlite3_mem_methods*); 15440257ffdSdrh break; 15540257ffdSdrh } 156*fec00eabSdrh case SQLITE_CONFIG_MEMSTATUS: { 15740257ffdSdrh /* Enable or disable the malloc status collection */ 15840257ffdSdrh sqlite3Config.bMemstat = va_arg(ap, int); 15940257ffdSdrh break; 16040257ffdSdrh } 16140257ffdSdrh default: { 16240257ffdSdrh rc = SQLITE_ERROR; 16340257ffdSdrh break; 16440257ffdSdrh } 16540257ffdSdrh } 16640257ffdSdrh va_end(ap); 16740257ffdSdrh return rc; 16840257ffdSdrh } 16940257ffdSdrh 17040257ffdSdrh /* 171c5499befSdrh ** Routine needed to support the testcase() macro. 172c5499befSdrh */ 173c5499befSdrh #ifdef SQLITE_COVERAGE_TEST 174c5499befSdrh void sqlite3Coverage(int x){ 175c5499befSdrh static int dummy = 0; 176c5499befSdrh dummy += x; 177c5499befSdrh } 178c5499befSdrh #endif 179c5499befSdrh 180a16313e5Sdrh 181a16313e5Sdrh /* 1829b5adfa2Sdrh ** Return true if the buffer z[0..n-1] contains all spaces. 1839b5adfa2Sdrh */ 1849b5adfa2Sdrh static int allSpaces(const char *z, int n){ 1855f3a367bSdrh while( n>0 && z[n-1]==' ' ){ n--; } 1869b5adfa2Sdrh return n==0; 1879b5adfa2Sdrh } 1889b5adfa2Sdrh 1899b5adfa2Sdrh /* 190d3d39e93Sdrh ** This is the default collating function named "BINARY" which is always 191d3d39e93Sdrh ** available. 1929b5adfa2Sdrh ** 1939b5adfa2Sdrh ** If the padFlag argument is not NULL then space padding at the end 1949b5adfa2Sdrh ** of strings is ignored. This implements the RTRIM collation. 195d3d39e93Sdrh */ 1962c336549Sdanielk1977 static int binCollFunc( 1979b5adfa2Sdrh void *padFlag, 198d3d39e93Sdrh int nKey1, const void *pKey1, 199d3d39e93Sdrh int nKey2, const void *pKey2 200d3d39e93Sdrh ){ 201d3d39e93Sdrh int rc, n; 202d3d39e93Sdrh n = nKey1<nKey2 ? nKey1 : nKey2; 203d3d39e93Sdrh rc = memcmp(pKey1, pKey2, n); 204d3d39e93Sdrh if( rc==0 ){ 2059b5adfa2Sdrh if( padFlag 2069b5adfa2Sdrh && allSpaces(((char*)pKey1)+n, nKey1-n) 2079b5adfa2Sdrh && allSpaces(((char*)pKey2)+n, nKey2-n) 2089b5adfa2Sdrh ){ 2099b5adfa2Sdrh /* Leave rc unchanged at 0 */ 2109b5adfa2Sdrh }else{ 211d3d39e93Sdrh rc = nKey1 - nKey2; 212d3d39e93Sdrh } 2139b5adfa2Sdrh } 214d3d39e93Sdrh return rc; 215d3d39e93Sdrh } 216d3d39e93Sdrh 217d3d39e93Sdrh /* 218dc1bdc4fSdanielk1977 ** Another built-in collating sequence: NOCASE. 219dc1bdc4fSdanielk1977 ** 220dc1bdc4fSdanielk1977 ** This collating sequence is intended to be used for "case independant 221dc1bdc4fSdanielk1977 ** comparison". SQLite's knowledge of upper and lower case equivalents 222dc1bdc4fSdanielk1977 ** extends only to the 26 characters used in the English language. 223dc1bdc4fSdanielk1977 ** 224dc1bdc4fSdanielk1977 ** At the moment there is only a UTF-8 implementation. 2250202b29eSdanielk1977 */ 2260202b29eSdanielk1977 static int nocaseCollatingFunc( 2270202b29eSdanielk1977 void *NotUsed, 2280202b29eSdanielk1977 int nKey1, const void *pKey1, 2290202b29eSdanielk1977 int nKey2, const void *pKey2 2300202b29eSdanielk1977 ){ 2310202b29eSdanielk1977 int r = sqlite3StrNICmp( 232208f80a7Sdrh (const char *)pKey1, (const char *)pKey2, (nKey1<nKey2)?nKey1:nKey2); 2330202b29eSdanielk1977 if( 0==r ){ 2340202b29eSdanielk1977 r = nKey1-nKey2; 2350202b29eSdanielk1977 } 2360202b29eSdanielk1977 return r; 2370202b29eSdanielk1977 } 2380202b29eSdanielk1977 2390202b29eSdanielk1977 /* 240af9ff33aSdrh ** Return the ROWID of the most recent insert 241af9ff33aSdrh */ 2429bb575fdSdrh sqlite_int64 sqlite3_last_insert_rowid(sqlite3 *db){ 243af9ff33aSdrh return db->lastRowid; 244af9ff33aSdrh } 245af9ff33aSdrh 246af9ff33aSdrh /* 24724b03fd0Sdanielk1977 ** Return the number of changes in the most recent call to sqlite3_exec(). 248c8d30ac1Sdrh */ 2499bb575fdSdrh int sqlite3_changes(sqlite3 *db){ 250c8d30ac1Sdrh return db->nChange; 251c8d30ac1Sdrh } 252c8d30ac1Sdrh 253f146a776Srdc /* 254b28af71aSdanielk1977 ** Return the number of changes since the database handle was opened. 255f146a776Srdc */ 256b28af71aSdanielk1977 int sqlite3_total_changes(sqlite3 *db){ 257b28af71aSdanielk1977 return db->nTotalChange; 258b0c374ffSrdc } 259b0c374ffSrdc 260c8d30ac1Sdrh /* 26150e5dadfSdrh ** Close an existing SQLite database 26250e5dadfSdrh */ 2639bb575fdSdrh int sqlite3_close(sqlite3 *db){ 2648e0a2f90Sdrh HashElem *i; 265001bbcbbSdrh int j; 2665c4c7787Sdanielk1977 2675c4c7787Sdanielk1977 if( !db ){ 26896d81f99Sdanielk1977 return SQLITE_OK; 2695c4c7787Sdanielk1977 } 2707e8b848aSdrh if( !sqlite3SafetyCheckSickOrOk(db) ){ 271e35ee196Sdanielk1977 return SQLITE_MISUSE; 272e35ee196Sdanielk1977 } 273605264d2Sdrh sqlite3_mutex_enter(db->mutex); 274e35ee196Sdanielk1977 2751f723bd9Sdanielk1977 #ifdef SQLITE_SSE 2763752785fSdrh { 2773752785fSdrh extern void sqlite3SseCleanup(sqlite3*); 2783bc0e05cSdrh sqlite3SseCleanup(db); 2793752785fSdrh } 2801f723bd9Sdanielk1977 #endif 2811f723bd9Sdanielk1977 282ffc13f69Sdrh sqlite3ResetInternalSchema(db, 0); 283a04a34ffSdanielk1977 28401256832Sdanielk1977 /* If a transaction is open, the ResetInternalSchema() call above 28501256832Sdanielk1977 ** will not have called the xDisconnect() method on any virtual 28601256832Sdanielk1977 ** tables in the db->aVTrans[] array. The following sqlite3VtabRollback() 28701256832Sdanielk1977 ** call will do so. We need to do this before the check for active 28801256832Sdanielk1977 ** SQL statements below, as the v-table implementation may be storing 28901256832Sdanielk1977 ** some prepared statements internally. 29001256832Sdanielk1977 */ 29101256832Sdanielk1977 sqlite3VtabRollback(db); 29201256832Sdanielk1977 293a04a34ffSdanielk1977 /* If there are any outstanding VMs, return SQLITE_BUSY. */ 29496d81f99Sdanielk1977 if( db->pVdbe ){ 29596d81f99Sdanielk1977 sqlite3Error(db, SQLITE_BUSY, 29696d81f99Sdanielk1977 "Unable to close due to unfinalised statements"); 29727641703Sdrh sqlite3_mutex_leave(db->mutex); 29896d81f99Sdanielk1977 return SQLITE_BUSY; 29996d81f99Sdanielk1977 } 3007e8b848aSdrh assert( sqlite3SafetyCheckSickOrOk(db) ); 301e0048400Sdanielk1977 302001bbcbbSdrh for(j=0; j<db->nDb; j++){ 3034d189ca4Sdrh struct Db *pDb = &db->aDb[j]; 3044d189ca4Sdrh if( pDb->pBt ){ 3054adee20fSdanielk1977 sqlite3BtreeClose(pDb->pBt); 3064d189ca4Sdrh pDb->pBt = 0; 307311019beSdanielk1977 if( j!=1 ){ 308311019beSdanielk1977 pDb->pSchema = 0; 309311019beSdanielk1977 } 310113088ecSdrh } 311001bbcbbSdrh } 3124adee20fSdanielk1977 sqlite3ResetInternalSchema(db, 0); 3131c2d8414Sdrh assert( db->nDb<=2 ); 3141c2d8414Sdrh assert( db->aDb==db->aDbStatic ); 3150bce8354Sdrh for(i=sqliteHashFirst(&db->aFunc); i; i=sqliteHashNext(i)){ 3160bce8354Sdrh FuncDef *pFunc, *pNext; 3170bce8354Sdrh for(pFunc = (FuncDef*)sqliteHashData(i); pFunc; pFunc=pNext){ 3188e0a2f90Sdrh pNext = pFunc->pNext; 31917435752Sdrh sqlite3_free(pFunc); 3208e0a2f90Sdrh } 3218e0a2f90Sdrh } 322466be56bSdanielk1977 323d8123366Sdanielk1977 for(i=sqliteHashFirst(&db->aCollSeq); i; i=sqliteHashNext(i)){ 324466be56bSdanielk1977 CollSeq *pColl = (CollSeq *)sqliteHashData(i); 325a9808b31Sdanielk1977 /* Invoke any destructors registered for collation sequence user data. */ 326a9808b31Sdanielk1977 for(j=0; j<3; j++){ 327a9808b31Sdanielk1977 if( pColl[j].xDel ){ 328a9808b31Sdanielk1977 pColl[j].xDel(pColl[j].pUser); 329a9808b31Sdanielk1977 } 330a9808b31Sdanielk1977 } 33117435752Sdrh sqlite3_free(pColl); 332466be56bSdanielk1977 } 333d8123366Sdanielk1977 sqlite3HashClear(&db->aCollSeq); 334b9bb7c18Sdrh #ifndef SQLITE_OMIT_VIRTUALTABLE 335d1ab1ba5Sdanielk1977 for(i=sqliteHashFirst(&db->aModule); i; i=sqliteHashNext(i)){ 336d1ab1ba5Sdanielk1977 Module *pMod = (Module *)sqliteHashData(i); 337832a58a6Sdanielk1977 if( pMod->xDestroy ){ 338832a58a6Sdanielk1977 pMod->xDestroy(pMod->pAux); 339832a58a6Sdanielk1977 } 34017435752Sdrh sqlite3_free(pMod); 341d1ab1ba5Sdanielk1977 } 342b9bb7c18Sdrh sqlite3HashClear(&db->aModule); 343b9bb7c18Sdrh #endif 344466be56bSdanielk1977 3454adee20fSdanielk1977 sqlite3HashClear(&db->aFunc); 3466622cce3Sdanielk1977 sqlite3Error(db, SQLITE_OK, 0); /* Deallocates any cached error strings. */ 347bfd6cce5Sdanielk1977 if( db->pErr ){ 348bfd6cce5Sdanielk1977 sqlite3ValueFree(db->pErr); 349bfd6cce5Sdanielk1977 } 350f1952c5dSdrh sqlite3CloseExtensions(db); 35196d81f99Sdanielk1977 35296d81f99Sdanielk1977 db->magic = SQLITE_MAGIC_ERROR; 353311019beSdanielk1977 354311019beSdanielk1977 /* The temp-database schema is allocated differently from the other schema 355311019beSdanielk1977 ** objects (using sqliteMalloc() directly, instead of sqlite3BtreeSchema()). 356311019beSdanielk1977 ** So it needs to be freed here. Todo: Why not roll the temp schema into 357311019beSdanielk1977 ** the same sqliteMalloc() as the one that allocates the database 358311019beSdanielk1977 ** structure? 359311019beSdanielk1977 */ 36017435752Sdrh sqlite3_free(db->aDb[1].pSchema); 361605264d2Sdrh sqlite3_mutex_leave(db->mutex); 3627e8b848aSdrh db->magic = SQLITE_MAGIC_CLOSED; 363605264d2Sdrh sqlite3_mutex_free(db->mutex); 36417435752Sdrh sqlite3_free(db); 36596d81f99Sdanielk1977 return SQLITE_OK; 36675897234Sdrh } 36775897234Sdrh 36875897234Sdrh /* 369001bbcbbSdrh ** Rollback all database files. 370001bbcbbSdrh */ 3719bb575fdSdrh void sqlite3RollbackAll(sqlite3 *db){ 372001bbcbbSdrh int i; 373f3f06bb3Sdanielk1977 int inTrans = 0; 374e30f4426Sdrh assert( sqlite3_mutex_held(db->mutex) ); 3754873d5f6Sdrh sqlite3FaultBeginBenign(SQLITE_FAULTINJECTOR_MALLOC); 376001bbcbbSdrh for(i=0; i<db->nDb; i++){ 377001bbcbbSdrh if( db->aDb[i].pBt ){ 378f3f06bb3Sdanielk1977 if( sqlite3BtreeIsInTrans(db->aDb[i].pBt) ){ 379f3f06bb3Sdanielk1977 inTrans = 1; 380f3f06bb3Sdanielk1977 } 3814adee20fSdanielk1977 sqlite3BtreeRollback(db->aDb[i].pBt); 382001bbcbbSdrh db->aDb[i].inTrans = 0; 383001bbcbbSdrh } 384001bbcbbSdrh } 385a298e90dSdanielk1977 sqlite3VtabRollback(db); 3864873d5f6Sdrh sqlite3FaultEndBenign(SQLITE_FAULTINJECTOR_MALLOC); 387ae72d982Sdanielk1977 38871fd80bfSdanielk1977 if( db->flags&SQLITE_InternChanges ){ 389ea4d9e2dSdanielk1977 sqlite3ExpirePreparedStatements(db); 3904adee20fSdanielk1977 sqlite3ResetInternalSchema(db, 0); 391001bbcbbSdrh } 392001bbcbbSdrh 39371fd80bfSdanielk1977 /* If one has been configured, invoke the rollback-hook callback */ 394f3f06bb3Sdanielk1977 if( db->xRollbackCallback && (inTrans || !db->autoCommit) ){ 39571fd80bfSdanielk1977 db->xRollbackCallback(db->pRollbackArg); 39671fd80bfSdanielk1977 } 39771fd80bfSdanielk1977 } 39871fd80bfSdanielk1977 399001bbcbbSdrh /* 400c22bd47dSdrh ** Return a static string that describes the kind of error specified in the 401c22bd47dSdrh ** argument. 402247be43dSdrh */ 403f20b21c8Sdanielk1977 const char *sqlite3ErrStr(int rc){ 404c22bd47dSdrh const char *z; 4054ac285a1Sdrh switch( rc & 0xff ){ 406c60d0446Sdrh case SQLITE_ROW: 407c60d0446Sdrh case SQLITE_DONE: 408c22bd47dSdrh case SQLITE_OK: z = "not an error"; break; 409c22bd47dSdrh case SQLITE_ERROR: z = "SQL logic error or missing database"; break; 410c22bd47dSdrh case SQLITE_PERM: z = "access permission denied"; break; 411c22bd47dSdrh case SQLITE_ABORT: z = "callback requested query abort"; break; 412c22bd47dSdrh case SQLITE_BUSY: z = "database is locked"; break; 413c22bd47dSdrh case SQLITE_LOCKED: z = "database table is locked"; break; 414c22bd47dSdrh case SQLITE_NOMEM: z = "out of memory"; break; 415c22bd47dSdrh case SQLITE_READONLY: z = "attempt to write a readonly database"; break; 416c22bd47dSdrh case SQLITE_INTERRUPT: z = "interrupted"; break; 417c22bd47dSdrh case SQLITE_IOERR: z = "disk I/O error"; break; 418c22bd47dSdrh case SQLITE_CORRUPT: z = "database disk image is malformed"; break; 4192db0bbc2Sdrh case SQLITE_FULL: z = "database or disk is full"; break; 420c22bd47dSdrh case SQLITE_CANTOPEN: z = "unable to open database file"; break; 421c22bd47dSdrh case SQLITE_EMPTY: z = "table contains no data"; break; 422c22bd47dSdrh case SQLITE_SCHEMA: z = "database schema has changed"; break; 423023ae03aSdrh case SQLITE_TOOBIG: z = "String or BLOB exceeded size limit"; break; 424c22bd47dSdrh case SQLITE_CONSTRAINT: z = "constraint failed"; break; 425c22bd47dSdrh case SQLITE_MISMATCH: z = "datatype mismatch"; break; 426c22bd47dSdrh case SQLITE_MISUSE: z = "library routine called out of sequence";break; 42765594045Sdrh case SQLITE_NOLFS: z = "large file support is disabled"; break; 428ed6c8671Sdrh case SQLITE_AUTH: z = "authorization denied"; break; 429892f671cSjplyon case SQLITE_FORMAT: z = "auxiliary database format error"; break; 430b08153d0Sdrh case SQLITE_RANGE: z = "bind or column index out of range"; break; 431c602f9aeSdrh case SQLITE_NOTADB: z = "file is encrypted or is not a database";break; 432c22bd47dSdrh default: z = "unknown error"; break; 433247be43dSdrh } 434c22bd47dSdrh return z; 435247be43dSdrh } 436247be43dSdrh 437247be43dSdrh /* 4382dfbbcafSdrh ** This routine implements a busy callback that sleeps and tries 4392dfbbcafSdrh ** again until a timeout value is reached. The timeout value is 4402dfbbcafSdrh ** an integer number of milliseconds passed in as the first 4412dfbbcafSdrh ** argument. 4422dfbbcafSdrh */ 443daffd0e5Sdrh static int sqliteDefaultBusyCallback( 44497903fefSdrh void *ptr, /* Database connection */ 4452dfbbcafSdrh int count /* Number of times table has been busy */ 4462dfbbcafSdrh ){ 44791c839b8Sdrh #if OS_WIN || (defined(HAVE_USLEEP) && HAVE_USLEEP) 448ee570fa4Sdrh static const u8 delays[] = 449ee570fa4Sdrh { 1, 2, 5, 10, 15, 20, 25, 25, 25, 50, 50, 100 }; 450ee570fa4Sdrh static const u8 totals[] = 451ee570fa4Sdrh { 0, 1, 3, 8, 18, 33, 53, 78, 103, 128, 178, 228 }; 452d1bec47aSdrh # define NDELAY (sizeof(delays)/sizeof(delays[0])) 453b4b47411Sdanielk1977 sqlite3 *db = (sqlite3 *)ptr; 454b4b47411Sdanielk1977 int timeout = db->busyTimeout; 45597903fefSdrh int delay, prior; 4562dfbbcafSdrh 457ee570fa4Sdrh assert( count>=0 ); 458ee570fa4Sdrh if( count < NDELAY ){ 459ee570fa4Sdrh delay = delays[count]; 460ee570fa4Sdrh prior = totals[count]; 461d1bec47aSdrh }else{ 462d1bec47aSdrh delay = delays[NDELAY-1]; 46368cb6192Sdrh prior = totals[NDELAY-1] + delay*(count-(NDELAY-1)); 4642dfbbcafSdrh } 465d1bec47aSdrh if( prior + delay > timeout ){ 466d1bec47aSdrh delay = timeout - prior; 4672dfbbcafSdrh if( delay<=0 ) return 0; 4682dfbbcafSdrh } 4692a6bdf6dSdanielk1977 sqlite3OsSleep(db->pVfs, delay*1000); 4702dfbbcafSdrh return 1; 4712dfbbcafSdrh #else 472482ea18fSdrh sqlite3 *db = (sqlite3 *)ptr; 4733f73708cSdrh int timeout = ((sqlite3 *)ptr)->busyTimeout; 4742dfbbcafSdrh if( (count+1)*1000 > timeout ){ 4752dfbbcafSdrh return 0; 4762dfbbcafSdrh } 477482ea18fSdrh sqlite3OsSleep(db->pVfs, 1000000); 4782dfbbcafSdrh return 1; 4792dfbbcafSdrh #endif 4802dfbbcafSdrh } 4812dfbbcafSdrh 4822dfbbcafSdrh /* 483a4afb65cSdrh ** Invoke the given busy handler. 484a4afb65cSdrh ** 485a4afb65cSdrh ** This routine is called when an operation failed with a lock. 486a4afb65cSdrh ** If this routine returns non-zero, the lock is retried. If it 487a4afb65cSdrh ** returns 0, the operation aborts with an SQLITE_BUSY error. 488a4afb65cSdrh */ 489a4afb65cSdrh int sqlite3InvokeBusyHandler(BusyHandler *p){ 490a4afb65cSdrh int rc; 491a4afb65cSdrh if( p==0 || p->xFunc==0 || p->nBusy<0 ) return 0; 492a4afb65cSdrh rc = p->xFunc(p->pArg, p->nBusy); 493a4afb65cSdrh if( rc==0 ){ 494a4afb65cSdrh p->nBusy = -1; 495a4afb65cSdrh }else{ 496a4afb65cSdrh p->nBusy++; 497a4afb65cSdrh } 498a4afb65cSdrh return rc; 499a4afb65cSdrh } 500a4afb65cSdrh 501a4afb65cSdrh /* 5022dfbbcafSdrh ** This routine sets the busy callback for an Sqlite database to the 5032dfbbcafSdrh ** given callback function with the given argument. 5042dfbbcafSdrh */ 505f9d64d2cSdanielk1977 int sqlite3_busy_handler( 506f9d64d2cSdanielk1977 sqlite3 *db, 5072a764eb0Sdanielk1977 int (*xBusy)(void*,int), 5082dfbbcafSdrh void *pArg 5092dfbbcafSdrh ){ 510e30f4426Sdrh sqlite3_mutex_enter(db->mutex); 51124162fe6Sdanielk1977 db->busyHandler.xFunc = xBusy; 51224162fe6Sdanielk1977 db->busyHandler.pArg = pArg; 513a4afb65cSdrh db->busyHandler.nBusy = 0; 514e30f4426Sdrh sqlite3_mutex_leave(db->mutex); 515f9d64d2cSdanielk1977 return SQLITE_OK; 5162dfbbcafSdrh } 5172dfbbcafSdrh 518348bb5d6Sdanielk1977 #ifndef SQLITE_OMIT_PROGRESS_CALLBACK 519348bb5d6Sdanielk1977 /* 520348bb5d6Sdanielk1977 ** This routine sets the progress callback for an Sqlite database to the 521348bb5d6Sdanielk1977 ** given callback function with the given argument. The progress callback will 522348bb5d6Sdanielk1977 ** be invoked every nOps opcodes. 523348bb5d6Sdanielk1977 */ 52424b03fd0Sdanielk1977 void sqlite3_progress_handler( 5259bb575fdSdrh sqlite3 *db, 526348bb5d6Sdanielk1977 int nOps, 527348bb5d6Sdanielk1977 int (*xProgress)(void*), 528348bb5d6Sdanielk1977 void *pArg 529348bb5d6Sdanielk1977 ){ 5307e8b848aSdrh if( sqlite3SafetyCheckOk(db) ){ 531e30f4426Sdrh sqlite3_mutex_enter(db->mutex); 532348bb5d6Sdanielk1977 if( nOps>0 ){ 533348bb5d6Sdanielk1977 db->xProgress = xProgress; 534348bb5d6Sdanielk1977 db->nProgressOps = nOps; 535348bb5d6Sdanielk1977 db->pProgressArg = pArg; 536348bb5d6Sdanielk1977 }else{ 537348bb5d6Sdanielk1977 db->xProgress = 0; 538348bb5d6Sdanielk1977 db->nProgressOps = 0; 539348bb5d6Sdanielk1977 db->pProgressArg = 0; 540348bb5d6Sdanielk1977 } 541e30f4426Sdrh sqlite3_mutex_leave(db->mutex); 542348bb5d6Sdanielk1977 } 543c60d0446Sdrh } 544348bb5d6Sdanielk1977 #endif 545348bb5d6Sdanielk1977 546348bb5d6Sdanielk1977 5472dfbbcafSdrh /* 5482dfbbcafSdrh ** This routine installs a default busy handler that waits for the 5492dfbbcafSdrh ** specified number of milliseconds before returning 0. 5502dfbbcafSdrh */ 551f9d64d2cSdanielk1977 int sqlite3_busy_timeout(sqlite3 *db, int ms){ 5522dfbbcafSdrh if( ms>0 ){ 55397903fefSdrh db->busyTimeout = ms; 55497903fefSdrh sqlite3_busy_handler(db, sqliteDefaultBusyCallback, (void*)db); 5552dfbbcafSdrh }else{ 55624b03fd0Sdanielk1977 sqlite3_busy_handler(db, 0, 0); 5572dfbbcafSdrh } 558f9d64d2cSdanielk1977 return SQLITE_OK; 5592dfbbcafSdrh } 5604c504391Sdrh 5614c504391Sdrh /* 5624c504391Sdrh ** Cause any pending operation to stop at its earliest opportunity. 5634c504391Sdrh */ 5649bb575fdSdrh void sqlite3_interrupt(sqlite3 *db){ 5657e8b848aSdrh if( sqlite3SafetyCheckOk(db) ){ 566881feaa0Sdrh db->u1.isInterrupted = 1; 5674c504391Sdrh } 568c60d0446Sdrh } 569fa86c412Sdrh 570fa86c412Sdrh 571fa86c412Sdrh /* 572771151b6Sdanielk1977 ** This function is exactly the same as sqlite3_create_function(), except 573771151b6Sdanielk1977 ** that it is designed to be called by internal code. The difference is 574771151b6Sdanielk1977 ** that if a malloc() fails in sqlite3_create_function(), an error code 575771151b6Sdanielk1977 ** is returned and the mallocFailed flag cleared. 576fa86c412Sdrh */ 577771151b6Sdanielk1977 int sqlite3CreateFunc( 5786590493dSdanielk1977 sqlite3 *db, 5796590493dSdanielk1977 const char *zFunctionName, 5806590493dSdanielk1977 int nArg, 581d8123366Sdanielk1977 int enc, 5826590493dSdanielk1977 void *pUserData, 5836590493dSdanielk1977 void (*xFunc)(sqlite3_context*,int,sqlite3_value **), 5846590493dSdanielk1977 void (*xStep)(sqlite3_context*,int,sqlite3_value **), 5856590493dSdanielk1977 void (*xFinal)(sqlite3_context*) 5868e0a2f90Sdrh ){ 5870bce8354Sdrh FuncDef *p; 5884b59ab5eSdrh int nName; 5896590493dSdanielk1977 590e30f4426Sdrh assert( sqlite3_mutex_held(db->mutex) ); 591c60d0446Sdrh if( zFunctionName==0 || 592398eae78Sdanielk1977 (xFunc && (xFinal || xStep)) || 593398eae78Sdanielk1977 (!xFunc && (xFinal && !xStep)) || 594398eae78Sdanielk1977 (!xFunc && (!xFinal && xStep)) || 595398eae78Sdanielk1977 (nArg<-1 || nArg>127) || 596398eae78Sdanielk1977 (255<(nName = strlen(zFunctionName))) ){ 597badf7a7aSdrh sqlite3Error(db, SQLITE_ERROR, "bad parameters"); 5986590493dSdanielk1977 return SQLITE_ERROR; 5996590493dSdanielk1977 } 6006590493dSdanielk1977 60193758c8dSdanielk1977 #ifndef SQLITE_OMIT_UTF16 602d8123366Sdanielk1977 /* If SQLITE_UTF16 is specified as the encoding type, transform this 603d8123366Sdanielk1977 ** to one of SQLITE_UTF16LE or SQLITE_UTF16BE using the 604d8123366Sdanielk1977 ** SQLITE_UTF16NATIVE macro. SQLITE_UTF16 is not used internally. 605d8123366Sdanielk1977 ** 606d8123366Sdanielk1977 ** If SQLITE_ANY is specified, add three versions of the function 607d8123366Sdanielk1977 ** to the hash table. 608d8123366Sdanielk1977 */ 609d8123366Sdanielk1977 if( enc==SQLITE_UTF16 ){ 610d8123366Sdanielk1977 enc = SQLITE_UTF16NATIVE; 611d8123366Sdanielk1977 }else if( enc==SQLITE_ANY ){ 612d8123366Sdanielk1977 int rc; 613771151b6Sdanielk1977 rc = sqlite3CreateFunc(db, zFunctionName, nArg, SQLITE_UTF8, 614f9d64d2cSdanielk1977 pUserData, xFunc, xStep, xFinal); 615e30f4426Sdrh if( rc==SQLITE_OK ){ 616771151b6Sdanielk1977 rc = sqlite3CreateFunc(db, zFunctionName, nArg, SQLITE_UTF16LE, 617f9d64d2cSdanielk1977 pUserData, xFunc, xStep, xFinal); 618e30f4426Sdrh } 619e30f4426Sdrh if( rc!=SQLITE_OK ){ 620e30f4426Sdrh return rc; 621e30f4426Sdrh } 622d8123366Sdanielk1977 enc = SQLITE_UTF16BE; 623d8123366Sdanielk1977 } 62493758c8dSdanielk1977 #else 62593758c8dSdanielk1977 enc = SQLITE_UTF8; 62693758c8dSdanielk1977 #endif 627d8123366Sdanielk1977 6289636c4e1Sdanielk1977 /* Check if an existing function is being overridden or deleted. If so, 6299636c4e1Sdanielk1977 ** and there are active VMs, then return SQLITE_BUSY. If a function 6309636c4e1Sdanielk1977 ** is being overridden/deleted but there are no active VMs, allow the 6319636c4e1Sdanielk1977 ** operation to continue but invalidate all precompiled statements. 6329636c4e1Sdanielk1977 */ 6339636c4e1Sdanielk1977 p = sqlite3FindFunction(db, zFunctionName, nName, nArg, enc, 0); 6349636c4e1Sdanielk1977 if( p && p->iPrefEnc==enc && p->nArg==nArg ){ 6359636c4e1Sdanielk1977 if( db->activeVdbeCnt ){ 6369636c4e1Sdanielk1977 sqlite3Error(db, SQLITE_BUSY, 6379636c4e1Sdanielk1977 "Unable to delete/modify user-function due to active statements"); 63817435752Sdrh assert( !db->mallocFailed ); 6399636c4e1Sdanielk1977 return SQLITE_BUSY; 6409636c4e1Sdanielk1977 }else{ 6419636c4e1Sdanielk1977 sqlite3ExpirePreparedStatements(db); 6429636c4e1Sdanielk1977 } 6439636c4e1Sdanielk1977 } 6449636c4e1Sdanielk1977 645d8123366Sdanielk1977 p = sqlite3FindFunction(db, zFunctionName, nName, nArg, enc, 1); 646fa18beceSdanielk1977 assert(p || db->mallocFailed); 647fa18beceSdanielk1977 if( !p ){ 648fa18beceSdanielk1977 return SQLITE_NOMEM; 649fa18beceSdanielk1977 } 65055ef4d97Sdrh p->flags = 0; 6518e0a2f90Sdrh p->xFunc = xFunc; 6528e0a2f90Sdrh p->xStep = xStep; 6536590493dSdanielk1977 p->xFinalize = xFinal; 6541350b030Sdrh p->pUserData = pUserData; 65565fd59f7Sdanielk1977 p->nArg = nArg; 6566590493dSdanielk1977 return SQLITE_OK; 6576590493dSdanielk1977 } 658771151b6Sdanielk1977 659771151b6Sdanielk1977 /* 660771151b6Sdanielk1977 ** Create new user functions. 661771151b6Sdanielk1977 */ 662771151b6Sdanielk1977 int sqlite3_create_function( 663771151b6Sdanielk1977 sqlite3 *db, 664771151b6Sdanielk1977 const char *zFunctionName, 665771151b6Sdanielk1977 int nArg, 666771151b6Sdanielk1977 int enc, 667771151b6Sdanielk1977 void *p, 668771151b6Sdanielk1977 void (*xFunc)(sqlite3_context*,int,sqlite3_value **), 669771151b6Sdanielk1977 void (*xStep)(sqlite3_context*,int,sqlite3_value **), 670771151b6Sdanielk1977 void (*xFinal)(sqlite3_context*) 671771151b6Sdanielk1977 ){ 672771151b6Sdanielk1977 int rc; 673e30f4426Sdrh sqlite3_mutex_enter(db->mutex); 674771151b6Sdanielk1977 rc = sqlite3CreateFunc(db, zFunctionName, nArg, enc, p, xFunc, xStep, xFinal); 675e30f4426Sdrh rc = sqlite3ApiExit(db, rc); 676e30f4426Sdrh sqlite3_mutex_leave(db->mutex); 677e30f4426Sdrh return rc; 678771151b6Sdanielk1977 } 679771151b6Sdanielk1977 68093758c8dSdanielk1977 #ifndef SQLITE_OMIT_UTF16 6816590493dSdanielk1977 int sqlite3_create_function16( 6826590493dSdanielk1977 sqlite3 *db, 6836590493dSdanielk1977 const void *zFunctionName, 6846590493dSdanielk1977 int nArg, 6856590493dSdanielk1977 int eTextRep, 686771151b6Sdanielk1977 void *p, 6876590493dSdanielk1977 void (*xFunc)(sqlite3_context*,int,sqlite3_value**), 6886590493dSdanielk1977 void (*xStep)(sqlite3_context*,int,sqlite3_value**), 6896590493dSdanielk1977 void (*xFinal)(sqlite3_context*) 6906590493dSdanielk1977 ){ 6916590493dSdanielk1977 int rc; 692af9a7c22Sdrh char *zFunc8; 693e30f4426Sdrh sqlite3_mutex_enter(db->mutex); 69417435752Sdrh assert( !db->mallocFailed ); 6951e536953Sdanielk1977 zFunc8 = sqlite3Utf16to8(db, zFunctionName, -1); 696771151b6Sdanielk1977 rc = sqlite3CreateFunc(db, zFunc8, nArg, eTextRep, p, xFunc, xStep, xFinal); 69717435752Sdrh sqlite3_free(zFunc8); 698e30f4426Sdrh rc = sqlite3ApiExit(db, rc); 699e30f4426Sdrh sqlite3_mutex_leave(db->mutex); 700e30f4426Sdrh return rc; 7018e0a2f90Sdrh } 70293758c8dSdanielk1977 #endif 703c9b84a1fSdrh 704b7481e70Sdrh 705b7481e70Sdrh /* 706b7481e70Sdrh ** Declare that a function has been overloaded by a virtual table. 707b7481e70Sdrh ** 708b7481e70Sdrh ** If the function already exists as a regular global function, then 709b7481e70Sdrh ** this routine is a no-op. If the function does not exist, then create 710b7481e70Sdrh ** a new one that always throws a run-time error. 711b7481e70Sdrh ** 712b7481e70Sdrh ** When virtual tables intend to provide an overloaded function, they 713b7481e70Sdrh ** should call this routine to make sure the global function exists. 714b7481e70Sdrh ** A global function must exist in order for name resolution to work 715b7481e70Sdrh ** properly. 716b7481e70Sdrh */ 717b7481e70Sdrh int sqlite3_overload_function( 718b7481e70Sdrh sqlite3 *db, 719b7481e70Sdrh const char *zName, 720b7481e70Sdrh int nArg 721b7481e70Sdrh ){ 722b7481e70Sdrh int nName = strlen(zName); 723e30f4426Sdrh int rc; 724e30f4426Sdrh sqlite3_mutex_enter(db->mutex); 725b7481e70Sdrh if( sqlite3FindFunction(db, zName, nName, nArg, SQLITE_UTF8, 0)==0 ){ 726b7481e70Sdrh sqlite3CreateFunc(db, zName, nArg, SQLITE_UTF8, 727b7481e70Sdrh 0, sqlite3InvalidFunction, 0, 0); 728b7481e70Sdrh } 729e30f4426Sdrh rc = sqlite3ApiExit(db, SQLITE_OK); 730e30f4426Sdrh sqlite3_mutex_leave(db->mutex); 731e30f4426Sdrh return rc; 732b7481e70Sdrh } 733b7481e70Sdrh 73419e2d37fSdrh #ifndef SQLITE_OMIT_TRACE 735c9b84a1fSdrh /* 73618de4824Sdrh ** Register a trace function. The pArg from the previously registered trace 73718de4824Sdrh ** is returned. 73818de4824Sdrh ** 73918de4824Sdrh ** A NULL trace function means that no tracing is executes. A non-NULL 74018de4824Sdrh ** trace is a pointer to a function that is invoked at the start of each 74119e2d37fSdrh ** SQL statement. 74218de4824Sdrh */ 7439bb575fdSdrh void *sqlite3_trace(sqlite3 *db, void (*xTrace)(void*,const char*), void *pArg){ 744e30f4426Sdrh void *pOld; 745e30f4426Sdrh sqlite3_mutex_enter(db->mutex); 746e30f4426Sdrh pOld = db->pTraceArg; 74718de4824Sdrh db->xTrace = xTrace; 74818de4824Sdrh db->pTraceArg = pArg; 749e30f4426Sdrh sqlite3_mutex_leave(db->mutex); 75018de4824Sdrh return pOld; 7510d1a643aSdrh } 75219e2d37fSdrh /* 75319e2d37fSdrh ** Register a profile function. The pArg from the previously registered 75419e2d37fSdrh ** profile function is returned. 75519e2d37fSdrh ** 75619e2d37fSdrh ** A NULL profile function means that no profiling is executes. A non-NULL 75719e2d37fSdrh ** profile is a pointer to a function that is invoked at the conclusion of 75819e2d37fSdrh ** each SQL statement that is run. 75919e2d37fSdrh */ 76019e2d37fSdrh void *sqlite3_profile( 76119e2d37fSdrh sqlite3 *db, 76219e2d37fSdrh void (*xProfile)(void*,const char*,sqlite_uint64), 76319e2d37fSdrh void *pArg 76419e2d37fSdrh ){ 765e30f4426Sdrh void *pOld; 766e30f4426Sdrh sqlite3_mutex_enter(db->mutex); 767e30f4426Sdrh pOld = db->pProfileArg; 76819e2d37fSdrh db->xProfile = xProfile; 76919e2d37fSdrh db->pProfileArg = pArg; 770e30f4426Sdrh sqlite3_mutex_leave(db->mutex); 77119e2d37fSdrh return pOld; 77219e2d37fSdrh } 77319e2d37fSdrh #endif /* SQLITE_OMIT_TRACE */ 774b0208ccaSpaul 775aa940eacSdrh /*** EXPERIMENTAL *** 776aa940eacSdrh ** 777aa940eacSdrh ** Register a function to be invoked when a transaction comments. 77871fd80bfSdanielk1977 ** If the invoked function returns non-zero, then the commit becomes a 779aa940eacSdrh ** rollback. 780aa940eacSdrh */ 78124b03fd0Sdanielk1977 void *sqlite3_commit_hook( 7829bb575fdSdrh sqlite3 *db, /* Attach the hook to this database */ 783aa940eacSdrh int (*xCallback)(void*), /* Function to invoke on each commit */ 784aa940eacSdrh void *pArg /* Argument to the function */ 785aa940eacSdrh ){ 786e30f4426Sdrh void *pOld; 787e30f4426Sdrh sqlite3_mutex_enter(db->mutex); 788e30f4426Sdrh pOld = db->pCommitArg; 789aa940eacSdrh db->xCommitCallback = xCallback; 790aa940eacSdrh db->pCommitArg = pArg; 791e30f4426Sdrh sqlite3_mutex_leave(db->mutex); 792aa940eacSdrh return pOld; 793aa940eacSdrh } 794aa940eacSdrh 79594eb6a14Sdanielk1977 /* 79694eb6a14Sdanielk1977 ** Register a callback to be invoked each time a row is updated, 79794eb6a14Sdanielk1977 ** inserted or deleted using this database connection. 79894eb6a14Sdanielk1977 */ 79971fd80bfSdanielk1977 void *sqlite3_update_hook( 80094eb6a14Sdanielk1977 sqlite3 *db, /* Attach the hook to this database */ 80194eb6a14Sdanielk1977 void (*xCallback)(void*,int,char const *,char const *,sqlite_int64), 80294eb6a14Sdanielk1977 void *pArg /* Argument to the function */ 80394eb6a14Sdanielk1977 ){ 804e30f4426Sdrh void *pRet; 805e30f4426Sdrh sqlite3_mutex_enter(db->mutex); 806e30f4426Sdrh pRet = db->pUpdateArg; 80794eb6a14Sdanielk1977 db->xUpdateCallback = xCallback; 80894eb6a14Sdanielk1977 db->pUpdateArg = pArg; 809e30f4426Sdrh sqlite3_mutex_leave(db->mutex); 81071fd80bfSdanielk1977 return pRet; 81194eb6a14Sdanielk1977 } 81294eb6a14Sdanielk1977 81371fd80bfSdanielk1977 /* 81471fd80bfSdanielk1977 ** Register a callback to be invoked each time a transaction is rolled 81571fd80bfSdanielk1977 ** back by this database connection. 81671fd80bfSdanielk1977 */ 81771fd80bfSdanielk1977 void *sqlite3_rollback_hook( 81871fd80bfSdanielk1977 sqlite3 *db, /* Attach the hook to this database */ 81971fd80bfSdanielk1977 void (*xCallback)(void*), /* Callback function */ 82071fd80bfSdanielk1977 void *pArg /* Argument to the function */ 82171fd80bfSdanielk1977 ){ 822e30f4426Sdrh void *pRet; 823e30f4426Sdrh sqlite3_mutex_enter(db->mutex); 824e30f4426Sdrh pRet = db->pRollbackArg; 82571fd80bfSdanielk1977 db->xRollbackCallback = xCallback; 82671fd80bfSdanielk1977 db->pRollbackArg = pArg; 827e30f4426Sdrh sqlite3_mutex_leave(db->mutex); 82871fd80bfSdanielk1977 return pRet; 82971fd80bfSdanielk1977 } 830aa940eacSdrh 831b0208ccaSpaul /* 83213bff815Sdrh ** This routine is called to create a connection to a database BTree 83313bff815Sdrh ** driver. If zFilename is the name of a file, then that file is 83413bff815Sdrh ** opened and used. If zFilename is the magic name ":memory:" then 83513bff815Sdrh ** the database is stored in memory (and is thus forgotten as soon as 83613bff815Sdrh ** the connection is closed.) If zFilename is NULL then the database 83784bfda41Sdrh ** is a "virtual" database for transient use only and is deleted as 83884bfda41Sdrh ** soon as the connection is closed. 83990f5ecb3Sdrh ** 84084bfda41Sdrh ** A virtual database can be either a disk file (that is automatically 84184bfda41Sdrh ** deleted when the file is closed) or it an be held entirely in memory, 84290f5ecb3Sdrh ** depending on the values of the TEMP_STORE compile-time macro and the 84390f5ecb3Sdrh ** db->temp_store variable, according to the following chart: 84490f5ecb3Sdrh ** 84590f5ecb3Sdrh ** TEMP_STORE db->temp_store Location of temporary database 84690f5ecb3Sdrh ** ---------- -------------- ------------------------------ 84790f5ecb3Sdrh ** 0 any file 84890f5ecb3Sdrh ** 1 1 file 84990f5ecb3Sdrh ** 1 2 memory 85090f5ecb3Sdrh ** 1 0 file 85190f5ecb3Sdrh ** 2 1 file 85290f5ecb3Sdrh ** 2 2 memory 85390f5ecb3Sdrh ** 2 0 memory 85490f5ecb3Sdrh ** 3 any memory 855b0208ccaSpaul */ 8564adee20fSdanielk1977 int sqlite3BtreeFactory( 8579bb575fdSdrh const sqlite3 *db, /* Main database when opening aux otherwise 0 */ 858b0208ccaSpaul const char *zFilename, /* Name of the file containing the BTree database */ 859b0208ccaSpaul int omitJournal, /* if TRUE then do not journal this file */ 860b0208ccaSpaul int nCache, /* How many pages in the page cache */ 86133f4e02aSdrh int vfsFlags, /* Flags passed through to vfsOpen */ 8624adee20fSdanielk1977 Btree **ppBtree /* Pointer to new Btree object written here */ 8634adee20fSdanielk1977 ){ 86433f4e02aSdrh int btFlags = 0; 86590f5ecb3Sdrh int rc; 866b0208ccaSpaul 867e30f4426Sdrh assert( sqlite3_mutex_held(db->mutex) ); 868eec983e1Sdrh assert( ppBtree != 0); 8694adee20fSdanielk1977 if( omitJournal ){ 87033f4e02aSdrh btFlags |= BTREE_OMIT_JOURNAL; 8714adee20fSdanielk1977 } 8727bec505eSdrh if( db->flags & SQLITE_NoReadlock ){ 87333f4e02aSdrh btFlags |= BTREE_NO_READLOCK; 8747bec505eSdrh } 87590f5ecb3Sdrh if( zFilename==0 ){ 87690f5ecb3Sdrh #if TEMP_STORE==0 87722ac46d1Sdrh /* Do nothing */ 87890f5ecb3Sdrh #endif 87903aded49Sdanielk1977 #ifndef SQLITE_OMIT_MEMORYDB 88090f5ecb3Sdrh #if TEMP_STORE==1 88122ac46d1Sdrh if( db->temp_store==2 ) zFilename = ":memory:"; 88290f5ecb3Sdrh #endif 88390f5ecb3Sdrh #if TEMP_STORE==2 88422ac46d1Sdrh if( db->temp_store!=1 ) zFilename = ":memory:"; 88590f5ecb3Sdrh #endif 88690f5ecb3Sdrh #if TEMP_STORE==3 88722ac46d1Sdrh zFilename = ":memory:"; 88890f5ecb3Sdrh #endif 88903aded49Sdanielk1977 #endif /* SQLITE_OMIT_MEMORYDB */ 89090f5ecb3Sdrh } 891b0208ccaSpaul 89233f4e02aSdrh if( (vfsFlags & SQLITE_OPEN_MAIN_DB)!=0 && (zFilename==0 || *zFilename==0) ){ 89333f4e02aSdrh vfsFlags = (vfsFlags & ~SQLITE_OPEN_MAIN_DB) | SQLITE_OPEN_TEMP_DB; 89433f4e02aSdrh } 89533f4e02aSdrh rc = sqlite3BtreeOpen(zFilename, (sqlite3 *)db, ppBtree, btFlags, vfsFlags); 89690f5ecb3Sdrh if( rc==SQLITE_OK ){ 89790f5ecb3Sdrh sqlite3BtreeSetCacheSize(*ppBtree, nCache); 89890f5ecb3Sdrh } 89990f5ecb3Sdrh return rc; 900b0208ccaSpaul } 9014adee20fSdanielk1977 9024ad1713cSdanielk1977 /* 9034ad1713cSdanielk1977 ** Return UTF-8 encoded English language explanation of the most recent 9044ad1713cSdanielk1977 ** error. 9054ad1713cSdanielk1977 */ 9066622cce3Sdanielk1977 const char *sqlite3_errmsg(sqlite3 *db){ 907c60d0446Sdrh const char *z; 908ae7fc49dSdanielk1977 if( !db ){ 909f20b21c8Sdanielk1977 return sqlite3ErrStr(SQLITE_NOMEM); 9104ad1713cSdanielk1977 } 9117e8b848aSdrh if( !sqlite3SafetyCheckSickOrOk(db) || db->errCode==SQLITE_MISUSE ){ 912e35ee196Sdanielk1977 return sqlite3ErrStr(SQLITE_MISUSE); 913e35ee196Sdanielk1977 } 91427641703Sdrh sqlite3_mutex_enter(db->mutex); 91586f8c197Sdrh assert( !db->mallocFailed ); 9162646da7eSdrh z = (char*)sqlite3_value_text(db->pErr); 917131c8bc0Sdanielk1977 assert( !db->mallocFailed ); 918c60d0446Sdrh if( z==0 ){ 919c60d0446Sdrh z = sqlite3ErrStr(db->errCode); 9206622cce3Sdanielk1977 } 921e30f4426Sdrh sqlite3_mutex_leave(db->mutex); 922c60d0446Sdrh return z; 923bfd6cce5Sdanielk1977 } 9246622cce3Sdanielk1977 9256c62608fSdrh #ifndef SQLITE_OMIT_UTF16 9264ad1713cSdanielk1977 /* 9274ad1713cSdanielk1977 ** Return UTF-16 encoded English language explanation of the most recent 9284ad1713cSdanielk1977 ** error. 9294ad1713cSdanielk1977 */ 9306622cce3Sdanielk1977 const void *sqlite3_errmsg16(sqlite3 *db){ 931bfd6cce5Sdanielk1977 /* Because all the characters in the string are in the unicode 9324ad1713cSdanielk1977 ** range 0x00-0xFF, if we pad the big-endian string with a 9334ad1713cSdanielk1977 ** zero byte, we can obtain the little-endian string with 9344ad1713cSdanielk1977 ** &big_endian[1]. 9354ad1713cSdanielk1977 */ 9365719628aSdrh static const char outOfMemBe[] = { 9374ad1713cSdanielk1977 0, 'o', 0, 'u', 0, 't', 0, ' ', 9384ad1713cSdanielk1977 0, 'o', 0, 'f', 0, ' ', 9394ad1713cSdanielk1977 0, 'm', 0, 'e', 0, 'm', 0, 'o', 0, 'r', 0, 'y', 0, 0, 0 9404ad1713cSdanielk1977 }; 9415719628aSdrh static const char misuseBe [] = { 942e35ee196Sdanielk1977 0, 'l', 0, 'i', 0, 'b', 0, 'r', 0, 'a', 0, 'r', 0, 'y', 0, ' ', 943e35ee196Sdanielk1977 0, 'r', 0, 'o', 0, 'u', 0, 't', 0, 'i', 0, 'n', 0, 'e', 0, ' ', 944e35ee196Sdanielk1977 0, 'c', 0, 'a', 0, 'l', 0, 'l', 0, 'e', 0, 'd', 0, ' ', 945e35ee196Sdanielk1977 0, 'o', 0, 'u', 0, 't', 0, ' ', 946e35ee196Sdanielk1977 0, 'o', 0, 'f', 0, ' ', 947e35ee196Sdanielk1977 0, 's', 0, 'e', 0, 'q', 0, 'u', 0, 'e', 0, 'n', 0, 'c', 0, 'e', 0, 0, 0 948e35ee196Sdanielk1977 }; 9494ad1713cSdanielk1977 950c60d0446Sdrh const void *z; 951ae7fc49dSdanielk1977 if( !db ){ 952bfd6cce5Sdanielk1977 return (void *)(&outOfMemBe[SQLITE_UTF16NATIVE==SQLITE_UTF16LE?1:0]); 9536622cce3Sdanielk1977 } 9547e8b848aSdrh if( !sqlite3SafetyCheckSickOrOk(db) || db->errCode==SQLITE_MISUSE ){ 955c60d0446Sdrh return (void *)(&misuseBe[SQLITE_UTF16NATIVE==SQLITE_UTF16LE?1:0]); 956c60d0446Sdrh } 957e30f4426Sdrh sqlite3_mutex_enter(db->mutex); 958e30f4426Sdrh assert( !db->mallocFailed ); 959c60d0446Sdrh z = sqlite3_value_text16(db->pErr); 960c60d0446Sdrh if( z==0 ){ 961b21c8cd4Sdrh sqlite3ValueSetStr(db->pErr, -1, sqlite3ErrStr(db->errCode), 962c60d0446Sdrh SQLITE_UTF8, SQLITE_STATIC); 963c60d0446Sdrh z = sqlite3_value_text16(db->pErr); 964c60d0446Sdrh } 965131c8bc0Sdanielk1977 /* A malloc() may have failed within the call to sqlite3_value_text16() 966131c8bc0Sdanielk1977 ** above. If this is the case, then the db->mallocFailed flag needs to 967131c8bc0Sdanielk1977 ** be cleared before returning. Do this directly, instead of via 968131c8bc0Sdanielk1977 ** sqlite3ApiExit(), to avoid setting the database handle error message. 969131c8bc0Sdanielk1977 */ 970131c8bc0Sdanielk1977 db->mallocFailed = 0; 971e30f4426Sdrh sqlite3_mutex_leave(db->mutex); 972c60d0446Sdrh return z; 973c60d0446Sdrh } 9746c62608fSdrh #endif /* SQLITE_OMIT_UTF16 */ 9756622cce3Sdanielk1977 976c60d0446Sdrh /* 9777ddad969Sdanielk1977 ** Return the most recent error code generated by an SQLite routine. If NULL is 9787ddad969Sdanielk1977 ** passed to this function, we assume a malloc() failed during sqlite3_open(). 979c60d0446Sdrh */ 9806622cce3Sdanielk1977 int sqlite3_errcode(sqlite3 *db){ 9817c36d077Sdanielk1977 if( db && !sqlite3SafetyCheckSickOrOk(db) ){ 982c60d0446Sdrh return SQLITE_MISUSE; 983c60d0446Sdrh } 98401495b99Sdrh if( !db || db->mallocFailed ){ 98501495b99Sdrh return SQLITE_NOMEM; 98601495b99Sdrh } 9874ac285a1Sdrh return db->errCode & db->errMask; 9886622cce3Sdanielk1977 } 9896622cce3Sdanielk1977 9900e819f90Sdrh /* 9910e819f90Sdrh ** Create a new collating function for database "db". The name is zName 9920e819f90Sdrh ** and the encoding is enc. 9930e819f90Sdrh */ 9949a30cf65Sdanielk1977 static int createCollation( 9959a30cf65Sdanielk1977 sqlite3* db, 9969a30cf65Sdanielk1977 const char *zName, 9979a30cf65Sdanielk1977 int enc, 9989a30cf65Sdanielk1977 void* pCtx, 999a9808b31Sdanielk1977 int(*xCompare)(void*,int,const void*,int,const void*), 1000a9808b31Sdanielk1977 void(*xDel)(void*) 10019a30cf65Sdanielk1977 ){ 10029a30cf65Sdanielk1977 CollSeq *pColl; 10037d9bd4e1Sdrh int enc2; 10049a30cf65Sdanielk1977 1005e30f4426Sdrh assert( sqlite3_mutex_held(db->mutex) ); 10069a30cf65Sdanielk1977 10079a30cf65Sdanielk1977 /* If SQLITE_UTF16 is specified as the encoding type, transform this 10089a30cf65Sdanielk1977 ** to one of SQLITE_UTF16LE or SQLITE_UTF16BE using the 10099a30cf65Sdanielk1977 ** SQLITE_UTF16NATIVE macro. SQLITE_UTF16 is not used internally. 10109a30cf65Sdanielk1977 */ 10117d9bd4e1Sdrh enc2 = enc & ~SQLITE_UTF16_ALIGNED; 10127d9bd4e1Sdrh if( enc2==SQLITE_UTF16 ){ 10137d9bd4e1Sdrh enc2 = SQLITE_UTF16NATIVE; 10149a30cf65Sdanielk1977 } 10159a30cf65Sdanielk1977 10167d9bd4e1Sdrh if( (enc2&~3)!=0 ){ 10177d9bd4e1Sdrh sqlite3Error(db, SQLITE_ERROR, "unknown encoding"); 10189a30cf65Sdanielk1977 return SQLITE_ERROR; 10199a30cf65Sdanielk1977 } 10209a30cf65Sdanielk1977 10219a30cf65Sdanielk1977 /* Check if this call is removing or replacing an existing collation 10229a30cf65Sdanielk1977 ** sequence. If so, and there are active VMs, return busy. If there 10239a30cf65Sdanielk1977 ** are no active VMs, invalidate any pre-compiled statements. 10249a30cf65Sdanielk1977 */ 10257d9bd4e1Sdrh pColl = sqlite3FindCollSeq(db, (u8)enc2, zName, strlen(zName), 0); 10269a30cf65Sdanielk1977 if( pColl && pColl->xCmp ){ 10279a30cf65Sdanielk1977 if( db->activeVdbeCnt ){ 10289a30cf65Sdanielk1977 sqlite3Error(db, SQLITE_BUSY, 10299a30cf65Sdanielk1977 "Unable to delete/modify collation sequence due to active statements"); 10309a30cf65Sdanielk1977 return SQLITE_BUSY; 10319a30cf65Sdanielk1977 } 10329a30cf65Sdanielk1977 sqlite3ExpirePreparedStatements(db); 1033a9808b31Sdanielk1977 1034a9808b31Sdanielk1977 /* If collation sequence pColl was created directly by a call to 1035a9808b31Sdanielk1977 ** sqlite3_create_collation, and not generated by synthCollSeq(), 1036a9808b31Sdanielk1977 ** then any copies made by synthCollSeq() need to be invalidated. 1037a9808b31Sdanielk1977 ** Also, collation destructor - CollSeq.xDel() - function may need 1038a9808b31Sdanielk1977 ** to be called. 1039a9808b31Sdanielk1977 */ 1040a9808b31Sdanielk1977 if( (pColl->enc & ~SQLITE_UTF16_ALIGNED)==enc2 ){ 1041a9808b31Sdanielk1977 CollSeq *aColl = sqlite3HashFind(&db->aCollSeq, zName, strlen(zName)); 1042a9808b31Sdanielk1977 int j; 1043a9808b31Sdanielk1977 for(j=0; j<3; j++){ 1044a9808b31Sdanielk1977 CollSeq *p = &aColl[j]; 1045a9808b31Sdanielk1977 if( p->enc==pColl->enc ){ 1046a9808b31Sdanielk1977 if( p->xDel ){ 1047a9808b31Sdanielk1977 p->xDel(p->pUser); 1048a9808b31Sdanielk1977 } 1049a9808b31Sdanielk1977 p->xCmp = 0; 1050a9808b31Sdanielk1977 } 1051a9808b31Sdanielk1977 } 1052a9808b31Sdanielk1977 } 10539a30cf65Sdanielk1977 } 10549a30cf65Sdanielk1977 10557d9bd4e1Sdrh pColl = sqlite3FindCollSeq(db, (u8)enc2, zName, strlen(zName), 1); 10569a30cf65Sdanielk1977 if( pColl ){ 10579a30cf65Sdanielk1977 pColl->xCmp = xCompare; 10589a30cf65Sdanielk1977 pColl->pUser = pCtx; 1059a9808b31Sdanielk1977 pColl->xDel = xDel; 10607d9bd4e1Sdrh pColl->enc = enc2 | (enc & SQLITE_UTF16_ALIGNED); 10619a30cf65Sdanielk1977 } 10629a30cf65Sdanielk1977 sqlite3Error(db, SQLITE_OK, 0); 10639a30cf65Sdanielk1977 return SQLITE_OK; 10649a30cf65Sdanielk1977 } 10659a30cf65Sdanielk1977 10669a30cf65Sdanielk1977 10676622cce3Sdanielk1977 /* 1068bb4957f8Sdrh ** This array defines hard upper bounds on limit values. The 1069bb4957f8Sdrh ** initializer must be kept in sync with the SQLITE_LIMIT_* 1070bb4957f8Sdrh ** #defines in sqlite3.h. 1071bb4957f8Sdrh */ 1072b1a6c3c1Sdrh static const int aHardLimit[] = { 1073bb4957f8Sdrh SQLITE_MAX_LENGTH, 1074bb4957f8Sdrh SQLITE_MAX_SQL_LENGTH, 1075bb4957f8Sdrh SQLITE_MAX_COLUMN, 1076bb4957f8Sdrh SQLITE_MAX_EXPR_DEPTH, 1077bb4957f8Sdrh SQLITE_MAX_COMPOUND_SELECT, 1078bb4957f8Sdrh SQLITE_MAX_VDBE_OP, 1079bb4957f8Sdrh SQLITE_MAX_FUNCTION_ARG, 1080bb4957f8Sdrh SQLITE_MAX_ATTACHED, 1081bb4957f8Sdrh SQLITE_MAX_LIKE_PATTERN_LENGTH, 1082bb4957f8Sdrh SQLITE_MAX_VARIABLE_NUMBER, 1083bb4957f8Sdrh }; 1084bb4957f8Sdrh 1085bb4957f8Sdrh /* 1086bb4957f8Sdrh ** Make sure the hard limits are set to reasonable values 1087bb4957f8Sdrh */ 1088bb4957f8Sdrh #if SQLITE_MAX_LENGTH<100 1089bb4957f8Sdrh # error SQLITE_MAX_LENGTH must be at least 100 1090bb4957f8Sdrh #endif 1091bb4957f8Sdrh #if SQLITE_MAX_SQL_LENGTH<100 1092bb4957f8Sdrh # error SQLITE_MAX_SQL_LENGTH must be at least 100 1093bb4957f8Sdrh #endif 1094bb4957f8Sdrh #if SQLITE_MAX_SQL_LENGTH>SQLITE_MAX_LENGTH 1095bb4957f8Sdrh # error SQLITE_MAX_SQL_LENGTH must not be greater than SQLITE_MAX_LENGTH 1096bb4957f8Sdrh #endif 1097bb4957f8Sdrh #if SQLITE_MAX_COMPOUND_SELECT<2 1098bb4957f8Sdrh # error SQLITE_MAX_COMPOUND_SELECT must be at least 2 1099bb4957f8Sdrh #endif 1100bb4957f8Sdrh #if SQLITE_MAX_VDBE_OP<40 1101bb4957f8Sdrh # error SQLITE_MAX_VDBE_OP must be at least 40 1102bb4957f8Sdrh #endif 1103bb4957f8Sdrh #if SQLITE_MAX_FUNCTION_ARG<0 || SQLITE_MAX_FUNCTION_ARG>255 1104bb4957f8Sdrh # error SQLITE_MAX_FUNCTION_ARG must be between 0 and 255 1105bb4957f8Sdrh #endif 1106bb4957f8Sdrh #if SQLITE_MAX_ATTACH<0 || SQLITE_MAX_ATTACH>30 1107bb4957f8Sdrh # error SQLITE_MAX_ATTACH must be between 0 and 30 1108bb4957f8Sdrh #endif 1109bb4957f8Sdrh #if SQLITE_MAX_LIKE_PATTERN_LENGTH<1 1110bb4957f8Sdrh # error SQLITE_MAX_LIKE_PATTERN_LENGTH must be at least 1 1111bb4957f8Sdrh #endif 1112bb4957f8Sdrh #if SQLITE_MAX_VARIABLE_NUMBER<1 1113bb4957f8Sdrh # error SQLITE_MAX_VARIABLE_NUMBER must be at least 1 1114bb4957f8Sdrh #endif 1115bb4957f8Sdrh 1116bb4957f8Sdrh 1117bb4957f8Sdrh /* 1118bb4957f8Sdrh ** Change the value of a limit. Report the old value. 1119bb4957f8Sdrh ** If an invalid limit index is supplied, report -1. 1120bb4957f8Sdrh ** Make no changes but still report the old value if the 1121bb4957f8Sdrh ** new limit is negative. 1122bb4957f8Sdrh ** 1123bb4957f8Sdrh ** A new lower limit does not shrink existing constructs. 1124bb4957f8Sdrh ** It merely prevents new constructs that exceed the limit 1125bb4957f8Sdrh ** from forming. 1126bb4957f8Sdrh */ 1127bb4957f8Sdrh int sqlite3_limit(sqlite3 *db, int limitId, int newLimit){ 1128bb4957f8Sdrh int oldLimit; 1129521cc849Sdrh if( limitId<0 || limitId>=SQLITE_N_LIMIT ){ 1130bb4957f8Sdrh return -1; 1131bb4957f8Sdrh } 1132bb4957f8Sdrh oldLimit = db->aLimit[limitId]; 1133bb4957f8Sdrh if( newLimit>=0 ){ 1134f47ce56cSdrh if( newLimit>aHardLimit[limitId] ){ 1135bb4957f8Sdrh newLimit = aHardLimit[limitId]; 1136bb4957f8Sdrh } 1137bb4957f8Sdrh db->aLimit[limitId] = newLimit; 1138bb4957f8Sdrh } 1139bb4957f8Sdrh return oldLimit; 1140bb4957f8Sdrh } 1141bb4957f8Sdrh 1142bb4957f8Sdrh /* 11434ad1713cSdanielk1977 ** This routine does the work of opening a database on behalf of 11444ad1713cSdanielk1977 ** sqlite3_open() and sqlite3_open16(). The database filename "zFilename" 1145ee570fa4Sdrh ** is UTF-8 encoded. 11464ad1713cSdanielk1977 */ 11474ad1713cSdanielk1977 static int openDatabase( 11484ad1713cSdanielk1977 const char *zFilename, /* Database filename UTF-8 encoded */ 1149605264d2Sdrh sqlite3 **ppDb, /* OUT: Returned database handle */ 1150605264d2Sdrh unsigned flags, /* Operational flags */ 1151605264d2Sdrh const char *zVfs /* Name of the VFS to use */ 11524ad1713cSdanielk1977 ){ 11534ad1713cSdanielk1977 sqlite3 *db; 1154da184236Sdanielk1977 int rc; 1155d64fe2f3Sdrh CollSeq *pColl; 11564ad1713cSdanielk1977 115740257ffdSdrh #ifndef SQLITE_OMIT_AUTOINIT 115840257ffdSdrh rc = sqlite3_initialize(); 115940257ffdSdrh if( rc ) return rc; 116040257ffdSdrh #endif 116140257ffdSdrh 1162a4267dccSdrh /* Remove harmful bits from the flags parameter */ 1163a4267dccSdrh flags &= ~( SQLITE_OPEN_DELETEONCLOSE | 1164a4267dccSdrh SQLITE_OPEN_MAIN_DB | 1165a4267dccSdrh SQLITE_OPEN_TEMP_DB | 1166a4267dccSdrh SQLITE_OPEN_TRANSIENT_DB | 1167a4267dccSdrh SQLITE_OPEN_MAIN_JOURNAL | 1168a4267dccSdrh SQLITE_OPEN_TEMP_JOURNAL | 1169a4267dccSdrh SQLITE_OPEN_SUBJOURNAL | 1170a4267dccSdrh SQLITE_OPEN_MASTER_JOURNAL 1171a4267dccSdrh ); 1172a4267dccSdrh 11734ad1713cSdanielk1977 /* Allocate the sqlite data structure */ 117417435752Sdrh db = sqlite3MallocZero( sizeof(sqlite3) ); 11754ad1713cSdanielk1977 if( db==0 ) goto opendb_out; 1176605264d2Sdrh db->mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_RECURSIVE); 1177605264d2Sdrh if( db->mutex==0 ){ 1178153c62c4Sdrh sqlite3_free(db); 1179153c62c4Sdrh db = 0; 1180605264d2Sdrh goto opendb_out; 1181605264d2Sdrh } 118227641703Sdrh sqlite3_mutex_enter(db->mutex); 11834ac285a1Sdrh db->errMask = 0xff; 11844ad1713cSdanielk1977 db->priorNewRowid = 0; 11854ad1713cSdanielk1977 db->nDb = 2; 1186153c62c4Sdrh db->magic = SQLITE_MAGIC_BUSY; 11874ad1713cSdanielk1977 db->aDb = db->aDbStatic; 1188bb4957f8Sdrh assert( sizeof(db->aLimit)==sizeof(aHardLimit) ); 1189bb4957f8Sdrh memcpy(db->aLimit, aHardLimit, sizeof(db->aLimit)); 11901d850a72Sdanielk1977 db->autoCommit = 1; 1191ddac25c7Sdrh db->nextAutovac = -1; 1192f653d782Sdanielk1977 db->nextPagesize = 0; 119376fe8032Sdrh db->flags |= SQLITE_ShortColNames 119476fe8032Sdrh #if SQLITE_DEFAULT_FILE_FORMAT<4 119576fe8032Sdrh | SQLITE_LegacyFileFmt 119676fe8032Sdrh #endif 119756424db4Sdrh #ifdef SQLITE_ENABLE_LOAD_EXTENSION 119856424db4Sdrh | SQLITE_LoadExtension 119956424db4Sdrh #endif 120076fe8032Sdrh ; 1201f9b596ebSdrh sqlite3HashInit(&db->aFunc, SQLITE_HASH_STRING, 0); 12024ad1713cSdanielk1977 sqlite3HashInit(&db->aCollSeq, SQLITE_HASH_STRING, 0); 1203b9bb7c18Sdrh #ifndef SQLITE_OMIT_VIRTUALTABLE 1204b9bb7c18Sdrh sqlite3HashInit(&db->aModule, SQLITE_HASH_STRING, 0); 1205b9bb7c18Sdrh #endif 1206da184236Sdanielk1977 120795c8a54cSdanielk1977 db->pVfs = sqlite3_vfs_find(zVfs); 120895c8a54cSdanielk1977 if( !db->pVfs ){ 120995c8a54cSdanielk1977 rc = SQLITE_ERROR; 12107e8b848aSdrh db->magic = SQLITE_MAGIC_SICK; 1211afc91047Sdrh sqlite3Error(db, rc, "no such vfs: %s", zVfs); 121295c8a54cSdanielk1977 goto opendb_out; 121395c8a54cSdanielk1977 } 121495c8a54cSdanielk1977 12150202b29eSdanielk1977 /* Add the default collation sequence BINARY. BINARY works for both UTF-8 12160202b29eSdanielk1977 ** and UTF-16, so add a version for each to avoid any unnecessary 12170202b29eSdanielk1977 ** conversions. The only error that can occur here is a malloc() failure. 12180202b29eSdanielk1977 */ 1219afc91047Sdrh createCollation(db, "BINARY", SQLITE_UTF8, 0, binCollFunc, 0); 1220afc91047Sdrh createCollation(db, "BINARY", SQLITE_UTF16BE, 0, binCollFunc, 0); 1221afc91047Sdrh createCollation(db, "BINARY", SQLITE_UTF16LE, 0, binCollFunc, 0); 1222afc91047Sdrh createCollation(db, "RTRIM", SQLITE_UTF8, (void*)1, binCollFunc, 0); 122377db4c05Sdrh if( db->mallocFailed ){ 12247e8b848aSdrh db->magic = SQLITE_MAGIC_SICK; 12250202b29eSdanielk1977 goto opendb_out; 12260202b29eSdanielk1977 } 122777db4c05Sdrh db->pDfltColl = sqlite3FindCollSeq(db, SQLITE_UTF8, "BINARY", 6, 0); 122877db4c05Sdrh assert( db->pDfltColl!=0 ); 12290202b29eSdanielk1977 12300202b29eSdanielk1977 /* Also add a UTF-8 case-insensitive collation sequence. */ 1231a9808b31Sdanielk1977 createCollation(db, "NOCASE", SQLITE_UTF8, 0, nocaseCollatingFunc, 0); 12324ad1713cSdanielk1977 1233d64fe2f3Sdrh /* Set flags on the built-in collating sequences */ 1234d64fe2f3Sdrh db->pDfltColl->type = SQLITE_COLL_BINARY; 1235d64fe2f3Sdrh pColl = sqlite3FindCollSeq(db, SQLITE_UTF8, "NOCASE", 6, 0); 1236d64fe2f3Sdrh if( pColl ){ 1237d64fe2f3Sdrh pColl->type = SQLITE_COLL_NOCASE; 1238d64fe2f3Sdrh } 1239d64fe2f3Sdrh 12404ad1713cSdanielk1977 /* Open the backend database driver */ 124133f4e02aSdrh db->openFlags = flags; 1242c797d4dcSdrh rc = sqlite3BtreeFactory(db, zFilename, 0, SQLITE_DEFAULT_CACHE_SIZE, 124333f4e02aSdrh flags | SQLITE_OPEN_MAIN_DB, 1244c797d4dcSdrh &db->aDb[0].pBt); 12454ad1713cSdanielk1977 if( rc!=SQLITE_OK ){ 12464ad1713cSdanielk1977 sqlite3Error(db, rc, 0); 12477e8b848aSdrh db->magic = SQLITE_MAGIC_SICK; 12484ad1713cSdanielk1977 goto opendb_out; 12494ad1713cSdanielk1977 } 125017435752Sdrh db->aDb[0].pSchema = sqlite3SchemaGet(db, db->aDb[0].pBt); 125117435752Sdrh db->aDb[1].pSchema = sqlite3SchemaGet(db, 0); 125214db2665Sdanielk1977 125303b808a6Sdrh 125453c0f748Sdanielk1977 /* The default safety_level for the main database is 'full'; for the temp 125553c0f748Sdanielk1977 ** database it is 'NONE'. This matches the pager layer defaults. 125653c0f748Sdanielk1977 */ 125753c0f748Sdanielk1977 db->aDb[0].zName = "main"; 125891cf71b0Sdanielk1977 db->aDb[0].safety_level = 3; 125953c0f748Sdanielk1977 #ifndef SQLITE_OMIT_TEMPDB 126053c0f748Sdanielk1977 db->aDb[1].zName = "temp"; 126191cf71b0Sdanielk1977 db->aDb[1].safety_level = 1; 126253c0f748Sdanielk1977 #endif 126353c0f748Sdanielk1977 1264832a58a6Sdanielk1977 db->magic = SQLITE_MAGIC_OPEN; 126517435752Sdrh if( db->mallocFailed ){ 1266832a58a6Sdanielk1977 goto opendb_out; 1267832a58a6Sdanielk1977 } 1268832a58a6Sdanielk1977 12698e227875Sdanielk1977 /* Register all built-in functions, but do not attempt to read the 12708e227875Sdanielk1977 ** database schema yet. This is delayed until the first time the database 12718e227875Sdanielk1977 ** is accessed. 12728e227875Sdanielk1977 */ 1273bfd6cce5Sdanielk1977 sqlite3Error(db, SQLITE_OK, 0); 1274b7481e70Sdrh sqlite3RegisterBuiltinFunctions(db); 12754ad1713cSdanielk1977 12761409be69Sdrh /* Load automatic extensions - extensions that have been registered 12771409be69Sdrh ** using the sqlite3_automatic_extension() API. 12781409be69Sdrh */ 1279f533acc0Sdrh (void)sqlite3AutoLoadExtensions(db); 1280832a58a6Sdanielk1977 if( sqlite3_errcode(db)!=SQLITE_OK ){ 1281832a58a6Sdanielk1977 goto opendb_out; 1282832a58a6Sdanielk1977 } 12831409be69Sdrh 1284aa29c135Sdrh #ifdef SQLITE_ENABLE_FTS1 128517435752Sdrh if( !db->mallocFailed ){ 1286aa29c135Sdrh extern int sqlite3Fts1Init(sqlite3*); 1287832a58a6Sdanielk1977 rc = sqlite3Fts1Init(db); 1288aa29c135Sdrh } 1289aa29c135Sdrh #endif 1290aa29c135Sdrh 1291a26cf577Sshess #ifdef SQLITE_ENABLE_FTS2 129217435752Sdrh if( !db->mallocFailed && rc==SQLITE_OK ){ 1293a26cf577Sshess extern int sqlite3Fts2Init(sqlite3*); 1294832a58a6Sdanielk1977 rc = sqlite3Fts2Init(db); 1295a26cf577Sshess } 1296a26cf577Sshess #endif 1297a26cf577Sshess 129869c4ae24Sshess #ifdef SQLITE_ENABLE_FTS3 129969c4ae24Sshess if( !db->mallocFailed && rc==SQLITE_OK ){ 130069c4ae24Sshess rc = sqlite3Fts3Init(db); 130169c4ae24Sshess } 130269c4ae24Sshess #endif 130369c4ae24Sshess 130483852accSdanielk1977 #ifdef SQLITE_ENABLE_ICU 130517435752Sdrh if( !db->mallocFailed && rc==SQLITE_OK ){ 130683852accSdanielk1977 extern int sqlite3IcuInit(sqlite3*); 1307832a58a6Sdanielk1977 rc = sqlite3IcuInit(db); 130883852accSdanielk1977 } 130983852accSdanielk1977 #endif 1310ebaecc14Sdanielk1977 1311ebaecc14Sdanielk1977 #ifdef SQLITE_ENABLE_RTREE 1312ebaecc14Sdanielk1977 if( !db->mallocFailed && rc==SQLITE_OK){ 1313ebaecc14Sdanielk1977 rc = sqlite3RtreeInit(db); 1314ebaecc14Sdanielk1977 } 1315ebaecc14Sdanielk1977 #endif 1316ebaecc14Sdanielk1977 1317832a58a6Sdanielk1977 sqlite3Error(db, rc, 0); 131883852accSdanielk1977 13198fd5bd36Sdrh /* -DSQLITE_DEFAULT_LOCKING_MODE=1 makes EXCLUSIVE the default locking 13208fd5bd36Sdrh ** mode. -DSQLITE_DEFAULT_LOCKING_MODE=0 make NORMAL the default locking 13218fd5bd36Sdrh ** mode. Doing nothing at all also makes NORMAL the default. 13228fd5bd36Sdrh */ 13238fd5bd36Sdrh #ifdef SQLITE_DEFAULT_LOCKING_MODE 13248fd5bd36Sdrh db->dfltLockMode = SQLITE_DEFAULT_LOCKING_MODE; 13258fd5bd36Sdrh sqlite3PagerLockingMode(sqlite3BtreePager(db->aDb[0].pBt), 13268fd5bd36Sdrh SQLITE_DEFAULT_LOCKING_MODE); 13278fd5bd36Sdrh #endif 13288fd5bd36Sdrh 13294ad1713cSdanielk1977 opendb_out: 1330afc91047Sdrh if( db ){ 1331afc91047Sdrh assert( db->mutex!=0 ); 133227641703Sdrh sqlite3_mutex_leave(db->mutex); 1333f3a65f7eSdrh } 13347ddad969Sdanielk1977 if( SQLITE_NOMEM==(rc = sqlite3_errcode(db)) ){ 13357ddad969Sdanielk1977 sqlite3_close(db); 13367ddad969Sdanielk1977 db = 0; 133713073931Sdanielk1977 } 13384ad1713cSdanielk1977 *ppDb = db; 133954f0198eSdanielk1977 return sqlite3ApiExit(0, rc); 13404ad1713cSdanielk1977 } 13414ad1713cSdanielk1977 13424ad1713cSdanielk1977 /* 13434ad1713cSdanielk1977 ** Open a new database handle. 13444ad1713cSdanielk1977 */ 134580290863Sdanielk1977 int sqlite3_open( 13464ad1713cSdanielk1977 const char *zFilename, 13474f057f90Sdanielk1977 sqlite3 **ppDb 13484ad1713cSdanielk1977 ){ 1349605264d2Sdrh return openDatabase(zFilename, ppDb, 1350605264d2Sdrh SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, 0); 1351605264d2Sdrh } 1352605264d2Sdrh int sqlite3_open_v2( 1353428e2826Sdrh const char *filename, /* Database filename (UTF-8) */ 1354605264d2Sdrh sqlite3 **ppDb, /* OUT: SQLite db handle */ 1355605264d2Sdrh int flags, /* Flags */ 1356605264d2Sdrh const char *zVfs /* Name of VFS module to use */ 1357605264d2Sdrh ){ 1358605264d2Sdrh return openDatabase(filename, ppDb, flags, zVfs); 135983ab5a8fSdanielk1977 } 136083ab5a8fSdanielk1977 13616c62608fSdrh #ifndef SQLITE_OMIT_UTF16 13624ad1713cSdanielk1977 /* 13634ad1713cSdanielk1977 ** Open a new database handle. 13644ad1713cSdanielk1977 */ 13654ad1713cSdanielk1977 int sqlite3_open16( 13664ad1713cSdanielk1977 const void *zFilename, 13674f057f90Sdanielk1977 sqlite3 **ppDb 13684ad1713cSdanielk1977 ){ 1369bfd6cce5Sdanielk1977 char const *zFilename8; /* zFilename encoded in UTF-8 instead of UTF-16 */ 1370bfd6cce5Sdanielk1977 sqlite3_value *pVal; 137140257ffdSdrh int rc; 13724ad1713cSdanielk1977 13737ddad969Sdanielk1977 assert( zFilename ); 13744ad1713cSdanielk1977 assert( ppDb ); 13754ad1713cSdanielk1977 *ppDb = 0; 137640257ffdSdrh #ifndef SQLITE_OMIT_AUTOINIT 137740257ffdSdrh rc = sqlite3_initialize(); 137840257ffdSdrh if( rc ) return rc; 137940257ffdSdrh #endif 13801e536953Sdanielk1977 pVal = sqlite3ValueNew(0); 1381b21c8cd4Sdrh sqlite3ValueSetStr(pVal, -1, zFilename, SQLITE_UTF16NATIVE, SQLITE_STATIC); 1382b21c8cd4Sdrh zFilename8 = sqlite3ValueText(pVal, SQLITE_UTF8); 1383bfd6cce5Sdanielk1977 if( zFilename8 ){ 1384605264d2Sdrh rc = openDatabase(zFilename8, ppDb, 1385605264d2Sdrh SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, 0); 1386afc91047Sdrh assert( *ppDb || rc==SQLITE_NOMEM ); 1387f51bf48bSdanielk1977 if( rc==SQLITE_OK && !DbHasProperty(*ppDb, 0, DB_SchemaLoaded) ){ 1388fb103a84Sdanielk1977 ENC(*ppDb) = SQLITE_UTF16NATIVE; 13894ad1713cSdanielk1977 } 139040257ffdSdrh }else{ 139140257ffdSdrh rc = SQLITE_NOMEM; 1392bfd6cce5Sdanielk1977 } 1393bfd6cce5Sdanielk1977 sqlite3ValueFree(pVal); 13948e227875Sdanielk1977 139554f0198eSdanielk1977 return sqlite3ApiExit(0, rc); 13964ad1713cSdanielk1977 } 13976c62608fSdrh #endif /* SQLITE_OMIT_UTF16 */ 13984ad1713cSdanielk1977 1399106bb236Sdanielk1977 /* 1400d8123366Sdanielk1977 ** Register a new collation sequence with the database handle db. 1401d8123366Sdanielk1977 */ 14020202b29eSdanielk1977 int sqlite3_create_collation( 14030202b29eSdanielk1977 sqlite3* db, 14040202b29eSdanielk1977 const char *zName, 1405466be56bSdanielk1977 int enc, 14060202b29eSdanielk1977 void* pCtx, 14070202b29eSdanielk1977 int(*xCompare)(void*,int,const void*,int,const void*) 14080202b29eSdanielk1977 ){ 14099a30cf65Sdanielk1977 int rc; 1410e30f4426Sdrh sqlite3_mutex_enter(db->mutex); 141117435752Sdrh assert( !db->mallocFailed ); 1412a9808b31Sdanielk1977 rc = createCollation(db, zName, enc, pCtx, xCompare, 0); 1413e30f4426Sdrh rc = sqlite3ApiExit(db, rc); 1414e30f4426Sdrh sqlite3_mutex_leave(db->mutex); 1415e30f4426Sdrh return rc; 1416a9808b31Sdanielk1977 } 1417a9808b31Sdanielk1977 1418a9808b31Sdanielk1977 /* 1419a9808b31Sdanielk1977 ** Register a new collation sequence with the database handle db. 1420a9808b31Sdanielk1977 */ 1421a393c036Sdanielk1977 int sqlite3_create_collation_v2( 1422a9808b31Sdanielk1977 sqlite3* db, 1423a9808b31Sdanielk1977 const char *zName, 1424a9808b31Sdanielk1977 int enc, 1425a9808b31Sdanielk1977 void* pCtx, 1426a9808b31Sdanielk1977 int(*xCompare)(void*,int,const void*,int,const void*), 1427a9808b31Sdanielk1977 void(*xDel)(void*) 1428a9808b31Sdanielk1977 ){ 1429a9808b31Sdanielk1977 int rc; 1430e30f4426Sdrh sqlite3_mutex_enter(db->mutex); 143117435752Sdrh assert( !db->mallocFailed ); 1432a9808b31Sdanielk1977 rc = createCollation(db, zName, enc, pCtx, xCompare, xDel); 1433e30f4426Sdrh rc = sqlite3ApiExit(db, rc); 1434e30f4426Sdrh sqlite3_mutex_leave(db->mutex); 1435e30f4426Sdrh return rc; 14360202b29eSdanielk1977 } 14370202b29eSdanielk1977 14386c62608fSdrh #ifndef SQLITE_OMIT_UTF16 1439d8123366Sdanielk1977 /* 1440d8123366Sdanielk1977 ** Register a new collation sequence with the database handle db. 1441d8123366Sdanielk1977 */ 14420202b29eSdanielk1977 int sqlite3_create_collation16( 14430202b29eSdanielk1977 sqlite3* db, 14440202b29eSdanielk1977 const char *zName, 1445466be56bSdanielk1977 int enc, 14460202b29eSdanielk1977 void* pCtx, 14470202b29eSdanielk1977 int(*xCompare)(void*,int,const void*,int,const void*) 14480202b29eSdanielk1977 ){ 14499a30cf65Sdanielk1977 int rc = SQLITE_OK; 1450af9a7c22Sdrh char *zName8; 1451e30f4426Sdrh sqlite3_mutex_enter(db->mutex); 145217435752Sdrh assert( !db->mallocFailed ); 14531e536953Sdanielk1977 zName8 = sqlite3Utf16to8(db, zName, -1); 14549a30cf65Sdanielk1977 if( zName8 ){ 1455a9808b31Sdanielk1977 rc = createCollation(db, zName8, enc, pCtx, xCompare, 0); 145617435752Sdrh sqlite3_free(zName8); 14579a30cf65Sdanielk1977 } 1458e30f4426Sdrh rc = sqlite3ApiExit(db, rc); 1459e30f4426Sdrh sqlite3_mutex_leave(db->mutex); 1460e30f4426Sdrh return rc; 14610202b29eSdanielk1977 } 14626c62608fSdrh #endif /* SQLITE_OMIT_UTF16 */ 14637cedc8d4Sdanielk1977 1464d8123366Sdanielk1977 /* 1465d8123366Sdanielk1977 ** Register a collation sequence factory callback with the database handle 1466d8123366Sdanielk1977 ** db. Replace any previously installed collation sequence factory. 1467d8123366Sdanielk1977 */ 14687cedc8d4Sdanielk1977 int sqlite3_collation_needed( 14697cedc8d4Sdanielk1977 sqlite3 *db, 14707cedc8d4Sdanielk1977 void *pCollNeededArg, 14717cedc8d4Sdanielk1977 void(*xCollNeeded)(void*,sqlite3*,int eTextRep,const char*) 14727cedc8d4Sdanielk1977 ){ 1473e30f4426Sdrh sqlite3_mutex_enter(db->mutex); 14747cedc8d4Sdanielk1977 db->xCollNeeded = xCollNeeded; 14757cedc8d4Sdanielk1977 db->xCollNeeded16 = 0; 14767cedc8d4Sdanielk1977 db->pCollNeededArg = pCollNeededArg; 1477e30f4426Sdrh sqlite3_mutex_leave(db->mutex); 14787cedc8d4Sdanielk1977 return SQLITE_OK; 14797cedc8d4Sdanielk1977 } 1480d8123366Sdanielk1977 14816c62608fSdrh #ifndef SQLITE_OMIT_UTF16 1482d8123366Sdanielk1977 /* 1483d8123366Sdanielk1977 ** Register a collation sequence factory callback with the database handle 1484d8123366Sdanielk1977 ** db. Replace any previously installed collation sequence factory. 1485d8123366Sdanielk1977 */ 14867cedc8d4Sdanielk1977 int sqlite3_collation_needed16( 14877cedc8d4Sdanielk1977 sqlite3 *db, 14887cedc8d4Sdanielk1977 void *pCollNeededArg, 14897cedc8d4Sdanielk1977 void(*xCollNeeded16)(void*,sqlite3*,int eTextRep,const void*) 14907cedc8d4Sdanielk1977 ){ 1491e30f4426Sdrh sqlite3_mutex_enter(db->mutex); 14927cedc8d4Sdanielk1977 db->xCollNeeded = 0; 14937cedc8d4Sdanielk1977 db->xCollNeeded16 = xCollNeeded16; 14947cedc8d4Sdanielk1977 db->pCollNeededArg = pCollNeededArg; 1495e30f4426Sdrh sqlite3_mutex_leave(db->mutex); 14967cedc8d4Sdanielk1977 return SQLITE_OK; 14977cedc8d4Sdanielk1977 } 14986c62608fSdrh #endif /* SQLITE_OMIT_UTF16 */ 14996b456a2bSdanielk1977 15006b456a2bSdanielk1977 #ifndef SQLITE_OMIT_GLOBALRECOVER 15016b456a2bSdanielk1977 /* 15027ddad969Sdanielk1977 ** This function is now an anachronism. It used to be used to recover from a 15037ddad969Sdanielk1977 ** malloc() failure, but SQLite now does this automatically. 15046b456a2bSdanielk1977 */ 15057d97efbeSdrh int sqlite3_global_recover(void){ 1506261919ccSdanielk1977 return SQLITE_OK; 15076b456a2bSdanielk1977 } 15086b456a2bSdanielk1977 #endif 15093e1d8e63Sdrh 15103e1d8e63Sdrh /* 15113e1d8e63Sdrh ** Test to see whether or not the database connection is in autocommit 15123e1d8e63Sdrh ** mode. Return TRUE if it is and FALSE if not. Autocommit mode is on 15133e1d8e63Sdrh ** by default. Autocommit is disabled by a BEGIN statement and reenabled 15143e1d8e63Sdrh ** by the next COMMIT or ROLLBACK. 15153e1d8e63Sdrh ** 15163e1d8e63Sdrh ******* THIS IS AN EXPERIMENTAL API AND IS SUBJECT TO CHANGE ****** 15173e1d8e63Sdrh */ 15183e1d8e63Sdrh int sqlite3_get_autocommit(sqlite3 *db){ 15193e1d8e63Sdrh return db->autoCommit; 15203e1d8e63Sdrh } 152149285708Sdrh 152249285708Sdrh #ifdef SQLITE_DEBUG 152349285708Sdrh /* 152449285708Sdrh ** The following routine is subtituted for constant SQLITE_CORRUPT in 152549285708Sdrh ** debugging builds. This provides a way to set a breakpoint for when 152649285708Sdrh ** corruption is first detected. 152749285708Sdrh */ 152849285708Sdrh int sqlite3Corrupt(void){ 152949285708Sdrh return SQLITE_CORRUPT; 153049285708Sdrh } 153149285708Sdrh #endif 15327c1817e2Sdrh 15336f7adc8aSdrh /* 15346f7adc8aSdrh ** This is a convenience routine that makes sure that all thread-specific 15356f7adc8aSdrh ** data for this thread has been deallocated. 1536dce8bdb8Sdrh ** 1537dce8bdb8Sdrh ** SQLite no longer uses thread-specific data so this routine is now a 1538dce8bdb8Sdrh ** no-op. It is retained for historical compatibility. 15396f7adc8aSdrh */ 15406f7adc8aSdrh void sqlite3_thread_cleanup(void){ 15416f7adc8aSdrh } 1542deb802cdSdanielk1977 1543deb802cdSdanielk1977 /* 1544deb802cdSdanielk1977 ** Return meta information about a specific column of a database table. 1545deb802cdSdanielk1977 ** See comment in sqlite3.h (sqlite.h.in) for details. 1546deb802cdSdanielk1977 */ 1547deb802cdSdanielk1977 #ifdef SQLITE_ENABLE_COLUMN_METADATA 1548deb802cdSdanielk1977 int sqlite3_table_column_metadata( 1549deb802cdSdanielk1977 sqlite3 *db, /* Connection handle */ 1550deb802cdSdanielk1977 const char *zDbName, /* Database name or NULL */ 1551deb802cdSdanielk1977 const char *zTableName, /* Table name */ 1552deb802cdSdanielk1977 const char *zColumnName, /* Column name */ 1553deb802cdSdanielk1977 char const **pzDataType, /* OUTPUT: Declared data type */ 1554deb802cdSdanielk1977 char const **pzCollSeq, /* OUTPUT: Collation sequence name */ 1555deb802cdSdanielk1977 int *pNotNull, /* OUTPUT: True if NOT NULL constraint exists */ 1556deb802cdSdanielk1977 int *pPrimaryKey, /* OUTPUT: True if column part of PK */ 1557deb802cdSdanielk1977 int *pAutoinc /* OUTPUT: True if colums is auto-increment */ 1558deb802cdSdanielk1977 ){ 1559deb802cdSdanielk1977 int rc; 1560deb802cdSdanielk1977 char *zErrMsg = 0; 1561deb802cdSdanielk1977 Table *pTab = 0; 1562deb802cdSdanielk1977 Column *pCol = 0; 1563deb802cdSdanielk1977 int iCol; 1564deb802cdSdanielk1977 1565deb802cdSdanielk1977 char const *zDataType = 0; 1566deb802cdSdanielk1977 char const *zCollSeq = 0; 1567deb802cdSdanielk1977 int notnull = 0; 1568deb802cdSdanielk1977 int primarykey = 0; 1569deb802cdSdanielk1977 int autoinc = 0; 1570deb802cdSdanielk1977 1571deb802cdSdanielk1977 /* Ensure the database schema has been loaded */ 1572e30f4426Sdrh sqlite3_mutex_enter(db->mutex); 1573a0af99f9Sdrh (void)sqlite3SafetyOn(db); 15743cb3edc1Sdrh sqlite3BtreeEnterAll(db); 1575deb802cdSdanielk1977 rc = sqlite3Init(db, &zErrMsg); 15763cb3edc1Sdrh sqlite3BtreeLeaveAll(db); 1577deb802cdSdanielk1977 if( SQLITE_OK!=rc ){ 1578deb802cdSdanielk1977 goto error_out; 1579deb802cdSdanielk1977 } 1580deb802cdSdanielk1977 1581deb802cdSdanielk1977 /* Locate the table in question */ 1582deb802cdSdanielk1977 pTab = sqlite3FindTable(db, zTableName, zDbName); 1583deb802cdSdanielk1977 if( !pTab || pTab->pSelect ){ 1584deb802cdSdanielk1977 pTab = 0; 1585deb802cdSdanielk1977 goto error_out; 1586deb802cdSdanielk1977 } 1587deb802cdSdanielk1977 1588deb802cdSdanielk1977 /* Find the column for which info is requested */ 1589deb802cdSdanielk1977 if( sqlite3IsRowid(zColumnName) ){ 1590deb802cdSdanielk1977 iCol = pTab->iPKey; 1591deb802cdSdanielk1977 if( iCol>=0 ){ 1592deb802cdSdanielk1977 pCol = &pTab->aCol[iCol]; 1593deb802cdSdanielk1977 } 1594deb802cdSdanielk1977 }else{ 1595deb802cdSdanielk1977 for(iCol=0; iCol<pTab->nCol; iCol++){ 1596deb802cdSdanielk1977 pCol = &pTab->aCol[iCol]; 1597deb802cdSdanielk1977 if( 0==sqlite3StrICmp(pCol->zName, zColumnName) ){ 1598deb802cdSdanielk1977 break; 1599deb802cdSdanielk1977 } 1600deb802cdSdanielk1977 } 1601deb802cdSdanielk1977 if( iCol==pTab->nCol ){ 1602deb802cdSdanielk1977 pTab = 0; 1603deb802cdSdanielk1977 goto error_out; 1604deb802cdSdanielk1977 } 1605deb802cdSdanielk1977 } 1606deb802cdSdanielk1977 1607deb802cdSdanielk1977 /* The following block stores the meta information that will be returned 1608deb802cdSdanielk1977 ** to the caller in local variables zDataType, zCollSeq, notnull, primarykey 1609deb802cdSdanielk1977 ** and autoinc. At this point there are two possibilities: 1610deb802cdSdanielk1977 ** 1611deb802cdSdanielk1977 ** 1. The specified column name was rowid", "oid" or "_rowid_" 1612deb802cdSdanielk1977 ** and there is no explicitly declared IPK column. 1613deb802cdSdanielk1977 ** 1614deb802cdSdanielk1977 ** 2. The table is not a view and the column name identified an 1615deb802cdSdanielk1977 ** explicitly declared column. Copy meta information from *pCol. 1616deb802cdSdanielk1977 */ 1617deb802cdSdanielk1977 if( pCol ){ 1618deb802cdSdanielk1977 zDataType = pCol->zType; 1619deb802cdSdanielk1977 zCollSeq = pCol->zColl; 1620deb802cdSdanielk1977 notnull = (pCol->notNull?1:0); 1621deb802cdSdanielk1977 primarykey = (pCol->isPrimKey?1:0); 1622deb802cdSdanielk1977 autoinc = ((pTab->iPKey==iCol && pTab->autoInc)?1:0); 1623deb802cdSdanielk1977 }else{ 1624deb802cdSdanielk1977 zDataType = "INTEGER"; 1625deb802cdSdanielk1977 primarykey = 1; 1626deb802cdSdanielk1977 } 1627deb802cdSdanielk1977 if( !zCollSeq ){ 1628deb802cdSdanielk1977 zCollSeq = "BINARY"; 1629deb802cdSdanielk1977 } 1630deb802cdSdanielk1977 1631deb802cdSdanielk1977 error_out: 163201495b99Sdrh (void)sqlite3SafetyOff(db); 1633deb802cdSdanielk1977 1634deb802cdSdanielk1977 /* Whether the function call succeeded or failed, set the output parameters 1635deb802cdSdanielk1977 ** to whatever their local counterparts contain. If an error did occur, 1636deb802cdSdanielk1977 ** this has the effect of zeroing all output parameters. 1637deb802cdSdanielk1977 */ 1638deb802cdSdanielk1977 if( pzDataType ) *pzDataType = zDataType; 1639deb802cdSdanielk1977 if( pzCollSeq ) *pzCollSeq = zCollSeq; 1640deb802cdSdanielk1977 if( pNotNull ) *pNotNull = notnull; 1641deb802cdSdanielk1977 if( pPrimaryKey ) *pPrimaryKey = primarykey; 1642deb802cdSdanielk1977 if( pAutoinc ) *pAutoinc = autoinc; 1643deb802cdSdanielk1977 1644deb802cdSdanielk1977 if( SQLITE_OK==rc && !pTab ){ 1645deb802cdSdanielk1977 sqlite3SetString(&zErrMsg, "no such table column: ", zTableName, ".", 1646deb802cdSdanielk1977 zColumnName, 0); 1647deb802cdSdanielk1977 rc = SQLITE_ERROR; 1648deb802cdSdanielk1977 } 1649deb802cdSdanielk1977 sqlite3Error(db, rc, (zErrMsg?"%s":0), zErrMsg); 165017435752Sdrh sqlite3_free(zErrMsg); 1651e30f4426Sdrh rc = sqlite3ApiExit(db, rc); 1652e30f4426Sdrh sqlite3_mutex_leave(db->mutex); 1653f9cb7f58Sdrh return rc; 1654f9cb7f58Sdrh } 1655e30f4426Sdrh #endif 1656f9cb7f58Sdrh 1657f9cb7f58Sdrh /* 1658f9cb7f58Sdrh ** Sleep for a little while. Return the amount of time slept. 1659f9cb7f58Sdrh */ 1660f9cb7f58Sdrh int sqlite3_sleep(int ms){ 1661b4b47411Sdanielk1977 sqlite3_vfs *pVfs; 1662e30f4426Sdrh int rc; 1663d677b3d6Sdrh pVfs = sqlite3_vfs_find(0); 166440257ffdSdrh if( pVfs==0 ) return 0; 1665fee2d25aSdanielk1977 1666fee2d25aSdanielk1977 /* This function works in milliseconds, but the underlying OsSleep() 1667fee2d25aSdanielk1977 ** API uses microseconds. Hence the 1000's. 1668fee2d25aSdanielk1977 */ 1669e30f4426Sdrh rc = (sqlite3OsSleep(pVfs, 1000*ms)/1000); 1670e30f4426Sdrh return rc; 1671f9cb7f58Sdrh } 16724ac285a1Sdrh 16734ac285a1Sdrh /* 16744ac285a1Sdrh ** Enable or disable the extended result codes. 16754ac285a1Sdrh */ 16764ac285a1Sdrh int sqlite3_extended_result_codes(sqlite3 *db, int onoff){ 1677e30f4426Sdrh sqlite3_mutex_enter(db->mutex); 16784ac285a1Sdrh db->errMask = onoff ? 0xffffffff : 0xff; 1679e30f4426Sdrh sqlite3_mutex_leave(db->mutex); 16804ac285a1Sdrh return SQLITE_OK; 16814ac285a1Sdrh } 1682cc6bb3eaSdrh 1683cc6bb3eaSdrh /* 1684cc6bb3eaSdrh ** Invoke the xFileControl method on a particular database. 1685cc6bb3eaSdrh */ 1686cc6bb3eaSdrh int sqlite3_file_control(sqlite3 *db, const char *zDbName, int op, void *pArg){ 1687cc6bb3eaSdrh int rc = SQLITE_ERROR; 1688cc6bb3eaSdrh int iDb; 1689cc6bb3eaSdrh sqlite3_mutex_enter(db->mutex); 1690cc6bb3eaSdrh if( zDbName==0 ){ 1691cc6bb3eaSdrh iDb = 0; 1692cc6bb3eaSdrh }else{ 1693cc6bb3eaSdrh for(iDb=0; iDb<db->nDb; iDb++){ 1694cc6bb3eaSdrh if( strcmp(db->aDb[iDb].zName, zDbName)==0 ) break; 1695cc6bb3eaSdrh } 1696cc6bb3eaSdrh } 1697cc6bb3eaSdrh if( iDb<db->nDb ){ 1698cc6bb3eaSdrh Btree *pBtree = db->aDb[iDb].pBt; 1699cc6bb3eaSdrh if( pBtree ){ 1700cc6bb3eaSdrh Pager *pPager; 170155176259Sdrh sqlite3_file *fd; 1702cc6bb3eaSdrh sqlite3BtreeEnter(pBtree); 1703cc6bb3eaSdrh pPager = sqlite3BtreePager(pBtree); 170455176259Sdrh assert( pPager!=0 ); 170555176259Sdrh fd = sqlite3PagerFile(pPager); 170655176259Sdrh assert( fd!=0 ); 170755176259Sdrh if( fd->pMethods ){ 1708cc6bb3eaSdrh rc = sqlite3OsFileControl(fd, op, pArg); 1709cc6bb3eaSdrh } 1710cc6bb3eaSdrh sqlite3BtreeLeave(pBtree); 1711cc6bb3eaSdrh } 1712cc6bb3eaSdrh } 1713cc6bb3eaSdrh sqlite3_mutex_leave(db->mutex); 1714cc6bb3eaSdrh return rc; 1715cc6bb3eaSdrh } 1716ed13d98cSdrh 1717ed13d98cSdrh /* 1718ed13d98cSdrh ** Interface to the testing logic. 1719ed13d98cSdrh */ 1720ed13d98cSdrh int sqlite3_test_control(int op, ...){ 1721ed13d98cSdrh int rc = 0; 17223088d59eSdrh #ifndef SQLITE_OMIT_BUILTIN_TEST 17232fa1868fSdrh va_list ap; 1724ed13d98cSdrh va_start(ap, op); 1725ed13d98cSdrh switch( op ){ 1726984bfaa4Sdrh /* 1727984bfaa4Sdrh ** sqlite3_test_control(FAULT_CONFIG, fault_id, nDelay, nRepeat) 1728984bfaa4Sdrh ** 1729984bfaa4Sdrh ** Configure a fault injector. The specific fault injector is 1730984bfaa4Sdrh ** identified by the fault_id argument. (ex: SQLITE_FAULTINJECTOR_MALLOC) 1731984bfaa4Sdrh ** The fault will occur after a delay of nDelay calls. The fault 1732984bfaa4Sdrh ** will repeat nRepeat times. 1733984bfaa4Sdrh */ 1734ed13d98cSdrh case SQLITE_TESTCTRL_FAULT_CONFIG: { 1735ed13d98cSdrh int id = va_arg(ap, int); 1736ed13d98cSdrh int nDelay = va_arg(ap, int); 1737ed13d98cSdrh int nRepeat = va_arg(ap, int); 1738ed13d98cSdrh sqlite3FaultConfig(id, nDelay, nRepeat); 1739ed13d98cSdrh break; 1740ed13d98cSdrh } 1741984bfaa4Sdrh 1742984bfaa4Sdrh /* 1743984bfaa4Sdrh ** sqlite3_test_control(FAULT_FAILURES, fault_id) 1744984bfaa4Sdrh ** 1745984bfaa4Sdrh ** Return the number of faults (both hard and benign faults) that have 1746984bfaa4Sdrh ** occurred since the injector identified by fault_id) was last configured. 1747984bfaa4Sdrh */ 1748ed13d98cSdrh case SQLITE_TESTCTRL_FAULT_FAILURES: { 1749ed13d98cSdrh int id = va_arg(ap, int); 1750ed13d98cSdrh rc = sqlite3FaultFailures(id); 1751ed13d98cSdrh break; 1752ed13d98cSdrh } 1753984bfaa4Sdrh 1754984bfaa4Sdrh /* 1755984bfaa4Sdrh ** sqlite3_test_control(FAULT_BENIGN_FAILURES, fault_id) 1756984bfaa4Sdrh ** 1757984bfaa4Sdrh ** Return the number of benign faults that have occurred since the 1758984bfaa4Sdrh ** injector identified by fault_id was last configured. 1759984bfaa4Sdrh */ 1760ed13d98cSdrh case SQLITE_TESTCTRL_FAULT_BENIGN_FAILURES: { 1761ed13d98cSdrh int id = va_arg(ap, int); 1762ed13d98cSdrh rc = sqlite3FaultBenignFailures(id); 1763ed13d98cSdrh break; 1764ed13d98cSdrh } 1765984bfaa4Sdrh 1766984bfaa4Sdrh /* 1767984bfaa4Sdrh ** sqlite3_test_control(FAULT_PENDING, fault_id) 1768984bfaa4Sdrh ** 1769984bfaa4Sdrh ** Return the number of successes that will occur before the next 1770984bfaa4Sdrh ** scheduled failure on fault injector fault_id. 1771984bfaa4Sdrh ** If no failures are scheduled, return -1. 1772984bfaa4Sdrh */ 1773ed13d98cSdrh case SQLITE_TESTCTRL_FAULT_PENDING: { 1774ed13d98cSdrh int id = va_arg(ap, int); 1775ed13d98cSdrh rc = sqlite3FaultPending(id); 1776ed13d98cSdrh break; 1777ed13d98cSdrh } 1778984bfaa4Sdrh 1779984bfaa4Sdrh /* 1780984bfaa4Sdrh ** Save the current state of the PRNG. 1781984bfaa4Sdrh */ 17822fa1868fSdrh case SQLITE_TESTCTRL_PRNG_SAVE: { 17832fa1868fSdrh sqlite3PrngSaveState(); 17842fa1868fSdrh break; 17852fa1868fSdrh } 1786984bfaa4Sdrh 1787984bfaa4Sdrh /* 1788984bfaa4Sdrh ** Restore the state of the PRNG to the last state saved using 1789984bfaa4Sdrh ** PRNG_SAVE. If PRNG_SAVE has never before been called, then 1790984bfaa4Sdrh ** this verb acts like PRNG_RESET. 1791984bfaa4Sdrh */ 17922fa1868fSdrh case SQLITE_TESTCTRL_PRNG_RESTORE: { 17932fa1868fSdrh sqlite3PrngRestoreState(); 17942fa1868fSdrh break; 17952fa1868fSdrh } 1796984bfaa4Sdrh 1797984bfaa4Sdrh /* 1798984bfaa4Sdrh ** Reset the PRNG back to its uninitialized state. The next call 1799984bfaa4Sdrh ** to sqlite3_randomness() will reseed the PRNG using a single call 1800984bfaa4Sdrh ** to the xRandomness method of the default VFS. 1801984bfaa4Sdrh */ 18022fa1868fSdrh case SQLITE_TESTCTRL_PRNG_RESET: { 18032fa1868fSdrh sqlite3PrngResetState(); 18042fa1868fSdrh break; 18052fa1868fSdrh } 18063088d59eSdrh 18073088d59eSdrh /* 18083088d59eSdrh ** sqlite3_test_control(BITVEC_TEST, size, program) 18093088d59eSdrh ** 18103088d59eSdrh ** Run a test against a Bitvec object of size. The program argument 18113088d59eSdrh ** is an array of integers that defines the test. Return -1 on a 18123088d59eSdrh ** memory allocation error, 0 on success, or non-zero for an error. 18133088d59eSdrh ** See the sqlite3BitvecBuiltinTest() for additional information. 18143088d59eSdrh */ 18153088d59eSdrh case SQLITE_TESTCTRL_BITVEC_TEST: { 18163088d59eSdrh int sz = va_arg(ap, int); 18173088d59eSdrh int *aProg = va_arg(ap, int*); 18183088d59eSdrh rc = sqlite3BitvecBuiltinTest(sz, aProg); 18193088d59eSdrh break; 18203088d59eSdrh } 1821ed13d98cSdrh } 1822ed13d98cSdrh va_end(ap); 18233088d59eSdrh #endif /* SQLITE_OMIT_BUILTIN_TEST */ 18247c36d077Sdanielk1977 return rc; 1825ed13d98cSdrh } 1826