xref: /sqlite-3.40.0/src/main.c (revision fec00eab)
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