Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(174)

Side by Side Diff: third_party/sqlite/src/src/main.c

Issue 2751253002: [sql] Import SQLite 3.17.0. (Closed)
Patch Set: also clang on Linux i386 Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « third_party/sqlite/src/src/loadext.c ('k') | third_party/sqlite/src/src/malloc.c » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 ** 2001 September 15 2 ** 2001 September 15
3 ** 3 **
4 ** The author disclaims copyright to this source code. In place of 4 ** The author disclaims copyright to this source code. In place of
5 ** a legal notice, here is a blessing: 5 ** a legal notice, here is a blessing:
6 ** 6 **
7 ** May you do good and not evil. 7 ** May you do good and not evil.
8 ** May you find forgiveness for yourself and forgive others. 8 ** May you find forgiveness for yourself and forgive others.
9 ** May you share freely, never taking more than you give. 9 ** May you share freely, never taking more than you give.
10 ** 10 **
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after
180 sqlite3GlobalConfig.isMutexInit = 1; 180 sqlite3GlobalConfig.isMutexInit = 1;
181 if( !sqlite3GlobalConfig.isMallocInit ){ 181 if( !sqlite3GlobalConfig.isMallocInit ){
182 rc = sqlite3MallocInit(); 182 rc = sqlite3MallocInit();
183 } 183 }
184 if( rc==SQLITE_OK ){ 184 if( rc==SQLITE_OK ){
185 sqlite3GlobalConfig.isMallocInit = 1; 185 sqlite3GlobalConfig.isMallocInit = 1;
186 if( !sqlite3GlobalConfig.pInitMutex ){ 186 if( !sqlite3GlobalConfig.pInitMutex ){
187 sqlite3GlobalConfig.pInitMutex = 187 sqlite3GlobalConfig.pInitMutex =
188 sqlite3MutexAlloc(SQLITE_MUTEX_RECURSIVE); 188 sqlite3MutexAlloc(SQLITE_MUTEX_RECURSIVE);
189 if( sqlite3GlobalConfig.bCoreMutex && !sqlite3GlobalConfig.pInitMutex ){ 189 if( sqlite3GlobalConfig.bCoreMutex && !sqlite3GlobalConfig.pInitMutex ){
190 rc = SQLITE_NOMEM; 190 rc = SQLITE_NOMEM_BKPT;
191 } 191 }
192 } 192 }
193 } 193 }
194 if( rc==SQLITE_OK ){ 194 if( rc==SQLITE_OK ){
195 sqlite3GlobalConfig.nRefInitMutex++; 195 sqlite3GlobalConfig.nRefInitMutex++;
196 } 196 }
197 sqlite3_mutex_leave(pMaster); 197 sqlite3_mutex_leave(pMaster);
198 198
199 /* If rc is not SQLITE_OK at this point, then either the malloc 199 /* If rc is not SQLITE_OK at this point, then either the malloc
200 ** subsystem could not be initialized or the system failed to allocate 200 ** subsystem could not be initialized or the system failed to allocate
(...skipping 10 matching lines...) Expand all
211 ** 211 **
212 ** IMPLEMENTATION-OF: R-00140-37445 SQLite automatically serializes calls 212 ** IMPLEMENTATION-OF: R-00140-37445 SQLite automatically serializes calls
213 ** to the xInit method, so the xInit method need not be threadsafe. 213 ** to the xInit method, so the xInit method need not be threadsafe.
214 ** 214 **
215 ** The following mutex is what serializes access to the appdef pcache xInit 215 ** The following mutex is what serializes access to the appdef pcache xInit
216 ** methods. The sqlite3_pcache_methods.xInit() all is embedded in the 216 ** methods. The sqlite3_pcache_methods.xInit() all is embedded in the
217 ** call to sqlite3PcacheInitialize(). 217 ** call to sqlite3PcacheInitialize().
218 */ 218 */
219 sqlite3_mutex_enter(sqlite3GlobalConfig.pInitMutex); 219 sqlite3_mutex_enter(sqlite3GlobalConfig.pInitMutex);
220 if( sqlite3GlobalConfig.isInit==0 && sqlite3GlobalConfig.inProgress==0 ){ 220 if( sqlite3GlobalConfig.isInit==0 && sqlite3GlobalConfig.inProgress==0 ){
221 FuncDefHash *pHash = &GLOBAL(FuncDefHash, sqlite3GlobalFunctions);
222 sqlite3GlobalConfig.inProgress = 1; 221 sqlite3GlobalConfig.inProgress = 1;
223 #ifdef SQLITE_ENABLE_SQLLOG 222 #ifdef SQLITE_ENABLE_SQLLOG
224 { 223 {
225 extern void sqlite3_init_sqllog(void); 224 extern void sqlite3_init_sqllog(void);
226 sqlite3_init_sqllog(); 225 sqlite3_init_sqllog();
227 } 226 }
228 #endif 227 #endif
229 memset(pHash, 0, sizeof(sqlite3GlobalFunctions)); 228 memset(&sqlite3BuiltinFunctions, 0, sizeof(sqlite3BuiltinFunctions));
230 sqlite3RegisterGlobalFunctions(); 229 sqlite3RegisterBuiltinFunctions();
231 if( sqlite3GlobalConfig.isPCacheInit==0 ){ 230 if( sqlite3GlobalConfig.isPCacheInit==0 ){
232 rc = sqlite3PcacheInitialize(); 231 rc = sqlite3PcacheInitialize();
233 } 232 }
234 if( rc==SQLITE_OK ){ 233 if( rc==SQLITE_OK ){
235 sqlite3GlobalConfig.isPCacheInit = 1; 234 sqlite3GlobalConfig.isPCacheInit = 1;
236 rc = sqlite3OsInit(); 235 rc = sqlite3OsInit();
237 } 236 }
238 if( rc==SQLITE_OK ){ 237 if( rc==SQLITE_OK ){
239 sqlite3PCacheBufferSetup( sqlite3GlobalConfig.pPage, 238 sqlite3PCacheBufferSetup( sqlite3GlobalConfig.pPage,
240 sqlite3GlobalConfig.szPage, sqlite3GlobalConfig.nPage); 239 sqlite3GlobalConfig.szPage, sqlite3GlobalConfig.nPage);
(...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after
627 sqlite3GlobalConfig.nHeap = va_arg(ap, int); 626 sqlite3GlobalConfig.nHeap = va_arg(ap, int);
628 break; 627 break;
629 } 628 }
630 #endif 629 #endif
631 630
632 case SQLITE_CONFIG_PMASZ: { 631 case SQLITE_CONFIG_PMASZ: {
633 sqlite3GlobalConfig.szPma = va_arg(ap, unsigned int); 632 sqlite3GlobalConfig.szPma = va_arg(ap, unsigned int);
634 break; 633 break;
635 } 634 }
636 635
636 case SQLITE_CONFIG_STMTJRNL_SPILL: {
637 sqlite3GlobalConfig.nStmtSpill = va_arg(ap, int);
638 break;
639 }
640
637 default: { 641 default: {
638 rc = SQLITE_ERROR; 642 rc = SQLITE_ERROR;
639 break; 643 break;
640 } 644 }
641 } 645 }
642 va_end(ap); 646 va_end(ap);
643 return rc; 647 return rc;
644 } 648 }
645 649
646 /* 650 /*
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
691 int i; 695 int i;
692 LookasideSlot *p; 696 LookasideSlot *p;
693 assert( sz > (int)sizeof(LookasideSlot*) ); 697 assert( sz > (int)sizeof(LookasideSlot*) );
694 p = (LookasideSlot*)pStart; 698 p = (LookasideSlot*)pStart;
695 for(i=cnt-1; i>=0; i--){ 699 for(i=cnt-1; i>=0; i--){
696 p->pNext = db->lookaside.pFree; 700 p->pNext = db->lookaside.pFree;
697 db->lookaside.pFree = p; 701 db->lookaside.pFree = p;
698 p = (LookasideSlot*)&((u8*)p)[sz]; 702 p = (LookasideSlot*)&((u8*)p)[sz];
699 } 703 }
700 db->lookaside.pEnd = p; 704 db->lookaside.pEnd = p;
701 db->lookaside.bEnabled = 1; 705 db->lookaside.bDisable = 0;
702 db->lookaside.bMalloced = pBuf==0 ?1:0; 706 db->lookaside.bMalloced = pBuf==0 ?1:0;
703 }else{ 707 }else{
704 db->lookaside.pStart = db; 708 db->lookaside.pStart = db;
705 db->lookaside.pEnd = db; 709 db->lookaside.pEnd = db;
706 db->lookaside.bEnabled = 0; 710 db->lookaside.bDisable = 1;
707 db->lookaside.bMalloced = 0; 711 db->lookaside.bMalloced = 0;
708 } 712 }
709 #endif /* SQLITE_OMIT_LOOKASIDE */ 713 #endif /* SQLITE_OMIT_LOOKASIDE */
710 return SQLITE_OK; 714 return SQLITE_OK;
711 } 715 }
712 716
713 /* 717 /*
714 ** Return the mutex associated with a database connection. 718 ** Return the mutex associated with a database connection.
715 */ 719 */
716 sqlite3_mutex *sqlite3_db_mutex(sqlite3 *db){ 720 sqlite3_mutex *sqlite3_db_mutex(sqlite3 *db){
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
778 } 782 }
779 783
780 /* 784 /*
781 ** Configuration settings for an individual database connection 785 ** Configuration settings for an individual database connection
782 */ 786 */
783 int sqlite3_db_config(sqlite3 *db, int op, ...){ 787 int sqlite3_db_config(sqlite3 *db, int op, ...){
784 va_list ap; 788 va_list ap;
785 int rc; 789 int rc;
786 va_start(ap, op); 790 va_start(ap, op);
787 switch( op ){ 791 switch( op ){
792 case SQLITE_DBCONFIG_MAINDBNAME: {
793 db->aDb[0].zDbSName = va_arg(ap,char*);
794 rc = SQLITE_OK;
795 break;
796 }
788 case SQLITE_DBCONFIG_LOOKASIDE: { 797 case SQLITE_DBCONFIG_LOOKASIDE: {
789 void *pBuf = va_arg(ap, void*); /* IMP: R-26835-10964 */ 798 void *pBuf = va_arg(ap, void*); /* IMP: R-26835-10964 */
790 int sz = va_arg(ap, int); /* IMP: R-47871-25994 */ 799 int sz = va_arg(ap, int); /* IMP: R-47871-25994 */
791 int cnt = va_arg(ap, int); /* IMP: R-04460-53386 */ 800 int cnt = va_arg(ap, int); /* IMP: R-04460-53386 */
792 rc = setupLookaside(db, pBuf, sz, cnt); 801 rc = setupLookaside(db, pBuf, sz, cnt);
793 break; 802 break;
794 } 803 }
795 default: { 804 default: {
796 static const struct { 805 static const struct {
797 int op; /* The opcode */ 806 int op; /* The opcode */
798 u32 mask; /* Mask of the bit in sqlite3.flags to set/clear */ 807 u32 mask; /* Mask of the bit in sqlite3.flags to set/clear */
799 } aFlagOp[] = { 808 } aFlagOp[] = {
800 { SQLITE_DBCONFIG_ENABLE_FKEY, SQLITE_ForeignKeys }, 809 { SQLITE_DBCONFIG_ENABLE_FKEY, SQLITE_ForeignKeys },
801 { SQLITE_DBCONFIG_ENABLE_TRIGGER, SQLITE_EnableTrigger }, 810 { SQLITE_DBCONFIG_ENABLE_TRIGGER, SQLITE_EnableTrigger },
811 { SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER, SQLITE_Fts3Tokenizer },
812 { SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION, SQLITE_LoadExtension },
813 { SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE, SQLITE_NoCkptOnClose },
802 }; 814 };
803 unsigned int i; 815 unsigned int i;
804 rc = SQLITE_ERROR; /* IMP: R-42790-23372 */ 816 rc = SQLITE_ERROR; /* IMP: R-42790-23372 */
805 for(i=0; i<ArraySize(aFlagOp); i++){ 817 for(i=0; i<ArraySize(aFlagOp); i++){
806 if( aFlagOp[i].op==op ){ 818 if( aFlagOp[i].op==op ){
807 int onoff = va_arg(ap, int); 819 int onoff = va_arg(ap, int);
808 int *pRes = va_arg(ap, int*); 820 int *pRes = va_arg(ap, int*);
809 int oldFlags = db->flags; 821 int oldFlags = db->flags;
810 if( onoff>0 ){ 822 if( onoff>0 ){
811 db->flags |= aFlagOp[i].mask; 823 db->flags |= aFlagOp[i].mask;
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
951 db->isTransactionSavepoint = 0; 963 db->isTransactionSavepoint = 0;
952 } 964 }
953 965
954 /* 966 /*
955 ** Invoke the destructor function associated with FuncDef p, if any. Except, 967 ** Invoke the destructor function associated with FuncDef p, if any. Except,
956 ** if this is not the last copy of the function, do not invoke it. Multiple 968 ** if this is not the last copy of the function, do not invoke it. Multiple
957 ** copies of a single function are created when create_function() is called 969 ** copies of a single function are created when create_function() is called
958 ** with SQLITE_ANY as the encoding. 970 ** with SQLITE_ANY as the encoding.
959 */ 971 */
960 static void functionDestroy(sqlite3 *db, FuncDef *p){ 972 static void functionDestroy(sqlite3 *db, FuncDef *p){
961 FuncDestructor *pDestructor = p->pDestructor; 973 FuncDestructor *pDestructor = p->u.pDestructor;
962 if( pDestructor ){ 974 if( pDestructor ){
963 pDestructor->nRef--; 975 pDestructor->nRef--;
964 if( pDestructor->nRef==0 ){ 976 if( pDestructor->nRef==0 ){
965 pDestructor->xDestroy(pDestructor->pUserData); 977 pDestructor->xDestroy(pDestructor->pUserData);
966 sqlite3DbFree(db, pDestructor); 978 sqlite3DbFree(db, pDestructor);
967 } 979 }
968 } 980 }
969 } 981 }
970 982
971 /* 983 /*
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
1020 static int sqlite3Close(sqlite3 *db, int forceZombie){ 1032 static int sqlite3Close(sqlite3 *db, int forceZombie){
1021 if( !db ){ 1033 if( !db ){
1022 /* EVIDENCE-OF: R-63257-11740 Calling sqlite3_close() or 1034 /* EVIDENCE-OF: R-63257-11740 Calling sqlite3_close() or
1023 ** sqlite3_close_v2() with a NULL pointer argument is a harmless no-op. */ 1035 ** sqlite3_close_v2() with a NULL pointer argument is a harmless no-op. */
1024 return SQLITE_OK; 1036 return SQLITE_OK;
1025 } 1037 }
1026 if( !sqlite3SafetyCheckSickOrOk(db) ){ 1038 if( !sqlite3SafetyCheckSickOrOk(db) ){
1027 return SQLITE_MISUSE_BKPT; 1039 return SQLITE_MISUSE_BKPT;
1028 } 1040 }
1029 sqlite3_mutex_enter(db->mutex); 1041 sqlite3_mutex_enter(db->mutex);
1042 if( db->mTrace & SQLITE_TRACE_CLOSE ){
1043 db->xTrace(SQLITE_TRACE_CLOSE, db->pTraceArg, db, 0);
1044 }
1030 1045
1031 /* Force xDisconnect calls on all virtual tables */ 1046 /* Force xDisconnect calls on all virtual tables */
1032 disconnectAllVtab(db); 1047 disconnectAllVtab(db);
1033 1048
1034 /* If a transaction is open, the disconnectAllVtab() call above 1049 /* If a transaction is open, the disconnectAllVtab() call above
1035 ** will not have called the xDisconnect() method on any virtual 1050 ** will not have called the xDisconnect() method on any virtual
1036 ** tables in the db->aVTrans[] array. The following sqlite3VtabRollback() 1051 ** tables in the db->aVTrans[] array. The following sqlite3VtabRollback()
1037 ** call will do so. We need to do this before the check for active 1052 ** call will do so. We need to do this before the check for active
1038 ** SQL statements below, as the v-table implementation may be storing 1053 ** SQL statements below, as the v-table implementation may be storing
1039 ** some prepared statements internally. 1054 ** some prepared statements internally.
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
1133 /* Free up the array of auxiliary databases */ 1148 /* Free up the array of auxiliary databases */
1134 sqlite3CollapseDatabaseArray(db); 1149 sqlite3CollapseDatabaseArray(db);
1135 assert( db->nDb<=2 ); 1150 assert( db->nDb<=2 );
1136 assert( db->aDb==db->aDbStatic ); 1151 assert( db->aDb==db->aDbStatic );
1137 1152
1138 /* Tell the code in notify.c that the connection no longer holds any 1153 /* Tell the code in notify.c that the connection no longer holds any
1139 ** locks and does not require any further unlock-notify callbacks. 1154 ** locks and does not require any further unlock-notify callbacks.
1140 */ 1155 */
1141 sqlite3ConnectionClosed(db); 1156 sqlite3ConnectionClosed(db);
1142 1157
1143 for(j=0; j<ArraySize(db->aFunc.a); j++){ 1158 for(i=sqliteHashFirst(&db->aFunc); i; i=sqliteHashNext(i)){
1144 FuncDef *pNext, *pHash, *p; 1159 FuncDef *pNext, *p;
1145 for(p=db->aFunc.a[j]; p; p=pHash){ 1160 p = sqliteHashData(i);
1146 pHash = p->pHash; 1161 do{
1147 while( p ){ 1162 functionDestroy(db, p);
1148 functionDestroy(db, p); 1163 pNext = p->pNext;
1149 pNext = p->pNext; 1164 sqlite3DbFree(db, p);
1150 sqlite3DbFree(db, p); 1165 p = pNext;
1151 p = pNext; 1166 }while( p );
1152 }
1153 }
1154 } 1167 }
1168 sqlite3HashClear(&db->aFunc);
1155 for(i=sqliteHashFirst(&db->aCollSeq); i; i=sqliteHashNext(i)){ 1169 for(i=sqliteHashFirst(&db->aCollSeq); i; i=sqliteHashNext(i)){
1156 CollSeq *pColl = (CollSeq *)sqliteHashData(i); 1170 CollSeq *pColl = (CollSeq *)sqliteHashData(i);
1157 /* Invoke any destructors registered for collation sequence user data. */ 1171 /* Invoke any destructors registered for collation sequence user data. */
1158 for(j=0; j<3; j++){ 1172 for(j=0; j<3; j++){
1159 if( pColl[j].xDel ){ 1173 if( pColl[j].xDel ){
1160 pColl[j].xDel(pColl[j].pUser); 1174 pColl[j].xDel(pColl[j].pUser);
1161 } 1175 }
1162 } 1176 }
1163 sqlite3DbFree(db, pColl); 1177 sqlite3DbFree(db, pColl);
1164 } 1178 }
(...skipping 382 matching lines...) Expand 10 before | Expand all | Expand 10 after
1547 sqlite3_busy_handler(db, 0, 0); 1561 sqlite3_busy_handler(db, 0, 0);
1548 } 1562 }
1549 return SQLITE_OK; 1563 return SQLITE_OK;
1550 } 1564 }
1551 1565
1552 /* 1566 /*
1553 ** Cause any pending operation to stop at its earliest opportunity. 1567 ** Cause any pending operation to stop at its earliest opportunity.
1554 */ 1568 */
1555 void sqlite3_interrupt(sqlite3 *db){ 1569 void sqlite3_interrupt(sqlite3 *db){
1556 #ifdef SQLITE_ENABLE_API_ARMOR 1570 #ifdef SQLITE_ENABLE_API_ARMOR
1557 if( !sqlite3SafetyCheckOk(db) ){ 1571 if( !sqlite3SafetyCheckOk(db) && (db==0 || db->magic!=SQLITE_MAGIC_ZOMBIE) ){
1558 (void)SQLITE_MISUSE_BKPT; 1572 (void)SQLITE_MISUSE_BKPT;
1559 return; 1573 return;
1560 } 1574 }
1561 #endif 1575 #endif
1562 db->u1.isInterrupted = 1; 1576 db->u1.isInterrupted = 1;
1563 } 1577 }
1564 1578
1565 1579
1566 /* 1580 /*
1567 ** This function is exactly the same as sqlite3_create_function(), except 1581 ** This function is exactly the same as sqlite3_create_function(), except
1568 ** that it is designed to be called by internal code. The difference is 1582 ** that it is designed to be called by internal code. The difference is
1569 ** that if a malloc() fails in sqlite3_create_function(), an error code 1583 ** that if a malloc() fails in sqlite3_create_function(), an error code
1570 ** is returned and the mallocFailed flag cleared. 1584 ** is returned and the mallocFailed flag cleared.
1571 */ 1585 */
1572 int sqlite3CreateFunc( 1586 int sqlite3CreateFunc(
1573 sqlite3 *db, 1587 sqlite3 *db,
1574 const char *zFunctionName, 1588 const char *zFunctionName,
1575 int nArg, 1589 int nArg,
1576 int enc, 1590 int enc,
1577 void *pUserData, 1591 void *pUserData,
1578 void (*xFunc)(sqlite3_context*,int,sqlite3_value **), 1592 void (*xSFunc)(sqlite3_context*,int,sqlite3_value **),
1579 void (*xStep)(sqlite3_context*,int,sqlite3_value **), 1593 void (*xStep)(sqlite3_context*,int,sqlite3_value **),
1580 void (*xFinal)(sqlite3_context*), 1594 void (*xFinal)(sqlite3_context*),
1581 FuncDestructor *pDestructor 1595 FuncDestructor *pDestructor
1582 ){ 1596 ){
1583 FuncDef *p; 1597 FuncDef *p;
1584 int nName; 1598 int nName;
1585 int extraFlags; 1599 int extraFlags;
1586 1600
1587 assert( sqlite3_mutex_held(db->mutex) ); 1601 assert( sqlite3_mutex_held(db->mutex) );
1588 if( zFunctionName==0 || 1602 if( zFunctionName==0 ||
1589 (xFunc && (xFinal || xStep)) || 1603 (xSFunc && (xFinal || xStep)) ||
1590 (!xFunc && (xFinal && !xStep)) || 1604 (!xSFunc && (xFinal && !xStep)) ||
1591 (!xFunc && (!xFinal && xStep)) || 1605 (!xSFunc && (!xFinal && xStep)) ||
1592 (nArg<-1 || nArg>SQLITE_MAX_FUNCTION_ARG) || 1606 (nArg<-1 || nArg>SQLITE_MAX_FUNCTION_ARG) ||
1593 (255<(nName = sqlite3Strlen30( zFunctionName))) ){ 1607 (255<(nName = sqlite3Strlen30( zFunctionName))) ){
1594 return SQLITE_MISUSE_BKPT; 1608 return SQLITE_MISUSE_BKPT;
1595 } 1609 }
1596 1610
1597 assert( SQLITE_FUNC_CONSTANT==SQLITE_DETERMINISTIC ); 1611 assert( SQLITE_FUNC_CONSTANT==SQLITE_DETERMINISTIC );
1598 extraFlags = enc & SQLITE_DETERMINISTIC; 1612 extraFlags = enc & SQLITE_DETERMINISTIC;
1599 enc &= (SQLITE_FUNC_ENCMASK|SQLITE_ANY); 1613 enc &= (SQLITE_FUNC_ENCMASK|SQLITE_ANY);
1600 1614
1601 #ifndef SQLITE_OMIT_UTF16 1615 #ifndef SQLITE_OMIT_UTF16
1602 /* If SQLITE_UTF16 is specified as the encoding type, transform this 1616 /* If SQLITE_UTF16 is specified as the encoding type, transform this
1603 ** to one of SQLITE_UTF16LE or SQLITE_UTF16BE using the 1617 ** to one of SQLITE_UTF16LE or SQLITE_UTF16BE using the
1604 ** SQLITE_UTF16NATIVE macro. SQLITE_UTF16 is not used internally. 1618 ** SQLITE_UTF16NATIVE macro. SQLITE_UTF16 is not used internally.
1605 ** 1619 **
1606 ** If SQLITE_ANY is specified, add three versions of the function 1620 ** If SQLITE_ANY is specified, add three versions of the function
1607 ** to the hash table. 1621 ** to the hash table.
1608 */ 1622 */
1609 if( enc==SQLITE_UTF16 ){ 1623 if( enc==SQLITE_UTF16 ){
1610 enc = SQLITE_UTF16NATIVE; 1624 enc = SQLITE_UTF16NATIVE;
1611 }else if( enc==SQLITE_ANY ){ 1625 }else if( enc==SQLITE_ANY ){
1612 int rc; 1626 int rc;
1613 rc = sqlite3CreateFunc(db, zFunctionName, nArg, SQLITE_UTF8|extraFlags, 1627 rc = sqlite3CreateFunc(db, zFunctionName, nArg, SQLITE_UTF8|extraFlags,
1614 pUserData, xFunc, xStep, xFinal, pDestructor); 1628 pUserData, xSFunc, xStep, xFinal, pDestructor);
1615 if( rc==SQLITE_OK ){ 1629 if( rc==SQLITE_OK ){
1616 rc = sqlite3CreateFunc(db, zFunctionName, nArg, SQLITE_UTF16LE|extraFlags, 1630 rc = sqlite3CreateFunc(db, zFunctionName, nArg, SQLITE_UTF16LE|extraFlags,
1617 pUserData, xFunc, xStep, xFinal, pDestructor); 1631 pUserData, xSFunc, xStep, xFinal, pDestructor);
1618 } 1632 }
1619 if( rc!=SQLITE_OK ){ 1633 if( rc!=SQLITE_OK ){
1620 return rc; 1634 return rc;
1621 } 1635 }
1622 enc = SQLITE_UTF16BE; 1636 enc = SQLITE_UTF16BE;
1623 } 1637 }
1624 #else 1638 #else
1625 enc = SQLITE_UTF8; 1639 enc = SQLITE_UTF8;
1626 #endif 1640 #endif
1627 1641
1628 /* Check if an existing function is being overridden or deleted. If so, 1642 /* Check if an existing function is being overridden or deleted. If so,
1629 ** and there are active VMs, then return SQLITE_BUSY. If a function 1643 ** and there are active VMs, then return SQLITE_BUSY. If a function
1630 ** is being overridden/deleted but there are no active VMs, allow the 1644 ** is being overridden/deleted but there are no active VMs, allow the
1631 ** operation to continue but invalidate all precompiled statements. 1645 ** operation to continue but invalidate all precompiled statements.
1632 */ 1646 */
1633 p = sqlite3FindFunction(db, zFunctionName, nName, nArg, (u8)enc, 0); 1647 p = sqlite3FindFunction(db, zFunctionName, nArg, (u8)enc, 0);
1634 if( p && (p->funcFlags & SQLITE_FUNC_ENCMASK)==enc && p->nArg==nArg ){ 1648 if( p && (p->funcFlags & SQLITE_FUNC_ENCMASK)==enc && p->nArg==nArg ){
1635 if( db->nVdbeActive ){ 1649 if( db->nVdbeActive ){
1636 sqlite3ErrorWithMsg(db, SQLITE_BUSY, 1650 sqlite3ErrorWithMsg(db, SQLITE_BUSY,
1637 "unable to delete/modify user-function due to active statements"); 1651 "unable to delete/modify user-function due to active statements");
1638 assert( !db->mallocFailed ); 1652 assert( !db->mallocFailed );
1639 return SQLITE_BUSY; 1653 return SQLITE_BUSY;
1640 }else{ 1654 }else{
1641 sqlite3ExpirePreparedStatements(db); 1655 sqlite3ExpirePreparedStatements(db);
1642 } 1656 }
1643 } 1657 }
1644 1658
1645 p = sqlite3FindFunction(db, zFunctionName, nName, nArg, (u8)enc, 1); 1659 p = sqlite3FindFunction(db, zFunctionName, nArg, (u8)enc, 1);
1646 assert(p || db->mallocFailed); 1660 assert(p || db->mallocFailed);
1647 if( !p ){ 1661 if( !p ){
1648 return SQLITE_NOMEM; 1662 return SQLITE_NOMEM_BKPT;
1649 } 1663 }
1650 1664
1651 /* If an older version of the function with a configured destructor is 1665 /* If an older version of the function with a configured destructor is
1652 ** being replaced invoke the destructor function here. */ 1666 ** being replaced invoke the destructor function here. */
1653 functionDestroy(db, p); 1667 functionDestroy(db, p);
1654 1668
1655 if( pDestructor ){ 1669 if( pDestructor ){
1656 pDestructor->nRef++; 1670 pDestructor->nRef++;
1657 } 1671 }
1658 p->pDestructor = pDestructor; 1672 p->u.pDestructor = pDestructor;
1659 p->funcFlags = (p->funcFlags & SQLITE_FUNC_ENCMASK) | extraFlags; 1673 p->funcFlags = (p->funcFlags & SQLITE_FUNC_ENCMASK) | extraFlags;
1660 testcase( p->funcFlags & SQLITE_DETERMINISTIC ); 1674 testcase( p->funcFlags & SQLITE_DETERMINISTIC );
1661 p->xFunc = xFunc; 1675 p->xSFunc = xSFunc ? xSFunc : xStep;
1662 p->xStep = xStep;
1663 p->xFinalize = xFinal; 1676 p->xFinalize = xFinal;
1664 p->pUserData = pUserData; 1677 p->pUserData = pUserData;
1665 p->nArg = (u16)nArg; 1678 p->nArg = (u16)nArg;
1666 return SQLITE_OK; 1679 return SQLITE_OK;
1667 } 1680 }
1668 1681
1669 /* 1682 /*
1670 ** Create new user functions. 1683 ** Create new user functions.
1671 */ 1684 */
1672 int sqlite3_create_function( 1685 int sqlite3_create_function(
1673 sqlite3 *db, 1686 sqlite3 *db,
1674 const char *zFunc, 1687 const char *zFunc,
1675 int nArg, 1688 int nArg,
1676 int enc, 1689 int enc,
1677 void *p, 1690 void *p,
1678 void (*xFunc)(sqlite3_context*,int,sqlite3_value **), 1691 void (*xSFunc)(sqlite3_context*,int,sqlite3_value **),
1679 void (*xStep)(sqlite3_context*,int,sqlite3_value **), 1692 void (*xStep)(sqlite3_context*,int,sqlite3_value **),
1680 void (*xFinal)(sqlite3_context*) 1693 void (*xFinal)(sqlite3_context*)
1681 ){ 1694 ){
1682 return sqlite3_create_function_v2(db, zFunc, nArg, enc, p, xFunc, xStep, 1695 return sqlite3_create_function_v2(db, zFunc, nArg, enc, p, xSFunc, xStep,
1683 xFinal, 0); 1696 xFinal, 0);
1684 } 1697 }
1685 1698
1686 int sqlite3_create_function_v2( 1699 int sqlite3_create_function_v2(
1687 sqlite3 *db, 1700 sqlite3 *db,
1688 const char *zFunc, 1701 const char *zFunc,
1689 int nArg, 1702 int nArg,
1690 int enc, 1703 int enc,
1691 void *p, 1704 void *p,
1692 void (*xFunc)(sqlite3_context*,int,sqlite3_value **), 1705 void (*xSFunc)(sqlite3_context*,int,sqlite3_value **),
1693 void (*xStep)(sqlite3_context*,int,sqlite3_value **), 1706 void (*xStep)(sqlite3_context*,int,sqlite3_value **),
1694 void (*xFinal)(sqlite3_context*), 1707 void (*xFinal)(sqlite3_context*),
1695 void (*xDestroy)(void *) 1708 void (*xDestroy)(void *)
1696 ){ 1709 ){
1697 int rc = SQLITE_ERROR; 1710 int rc = SQLITE_ERROR;
1698 FuncDestructor *pArg = 0; 1711 FuncDestructor *pArg = 0;
1699 1712
1700 #ifdef SQLITE_ENABLE_API_ARMOR 1713 #ifdef SQLITE_ENABLE_API_ARMOR
1701 if( !sqlite3SafetyCheckOk(db) ){ 1714 if( !sqlite3SafetyCheckOk(db) ){
1702 return SQLITE_MISUSE_BKPT; 1715 return SQLITE_MISUSE_BKPT;
1703 } 1716 }
1704 #endif 1717 #endif
1705 sqlite3_mutex_enter(db->mutex); 1718 sqlite3_mutex_enter(db->mutex);
1706 if( xDestroy ){ 1719 if( xDestroy ){
1707 pArg = (FuncDestructor *)sqlite3DbMallocZero(db, sizeof(FuncDestructor)); 1720 pArg = (FuncDestructor *)sqlite3DbMallocZero(db, sizeof(FuncDestructor));
1708 if( !pArg ){ 1721 if( !pArg ){
1709 xDestroy(p); 1722 xDestroy(p);
1710 goto out; 1723 goto out;
1711 } 1724 }
1712 pArg->xDestroy = xDestroy; 1725 pArg->xDestroy = xDestroy;
1713 pArg->pUserData = p; 1726 pArg->pUserData = p;
1714 } 1727 }
1715 rc = sqlite3CreateFunc(db, zFunc, nArg, enc, p, xFunc, xStep, xFinal, pArg); 1728 rc = sqlite3CreateFunc(db, zFunc, nArg, enc, p, xSFunc, xStep, xFinal, pArg);
1716 if( pArg && pArg->nRef==0 ){ 1729 if( pArg && pArg->nRef==0 ){
1717 assert( rc!=SQLITE_OK ); 1730 assert( rc!=SQLITE_OK );
1718 xDestroy(p); 1731 xDestroy(p);
1719 sqlite3DbFree(db, pArg); 1732 sqlite3DbFree(db, pArg);
1720 } 1733 }
1721 1734
1722 out: 1735 out:
1723 rc = sqlite3ApiExit(db, rc); 1736 rc = sqlite3ApiExit(db, rc);
1724 sqlite3_mutex_leave(db->mutex); 1737 sqlite3_mutex_leave(db->mutex);
1725 return rc; 1738 return rc;
1726 } 1739 }
1727 1740
1728 #ifndef SQLITE_OMIT_UTF16 1741 #ifndef SQLITE_OMIT_UTF16
1729 int sqlite3_create_function16( 1742 int sqlite3_create_function16(
1730 sqlite3 *db, 1743 sqlite3 *db,
1731 const void *zFunctionName, 1744 const void *zFunctionName,
1732 int nArg, 1745 int nArg,
1733 int eTextRep, 1746 int eTextRep,
1734 void *p, 1747 void *p,
1735 void (*xFunc)(sqlite3_context*,int,sqlite3_value**), 1748 void (*xSFunc)(sqlite3_context*,int,sqlite3_value**),
1736 void (*xStep)(sqlite3_context*,int,sqlite3_value**), 1749 void (*xStep)(sqlite3_context*,int,sqlite3_value**),
1737 void (*xFinal)(sqlite3_context*) 1750 void (*xFinal)(sqlite3_context*)
1738 ){ 1751 ){
1739 int rc; 1752 int rc;
1740 char *zFunc8; 1753 char *zFunc8;
1741 1754
1742 #ifdef SQLITE_ENABLE_API_ARMOR 1755 #ifdef SQLITE_ENABLE_API_ARMOR
1743 if( !sqlite3SafetyCheckOk(db) || zFunctionName==0 ) return SQLITE_MISUSE_BKPT; 1756 if( !sqlite3SafetyCheckOk(db) || zFunctionName==0 ) return SQLITE_MISUSE_BKPT;
1744 #endif 1757 #endif
1745 sqlite3_mutex_enter(db->mutex); 1758 sqlite3_mutex_enter(db->mutex);
1746 assert( !db->mallocFailed ); 1759 assert( !db->mallocFailed );
1747 zFunc8 = sqlite3Utf16to8(db, zFunctionName, -1, SQLITE_UTF16NATIVE); 1760 zFunc8 = sqlite3Utf16to8(db, zFunctionName, -1, SQLITE_UTF16NATIVE);
1748 rc = sqlite3CreateFunc(db, zFunc8, nArg, eTextRep, p, xFunc, xStep, xFinal,0); 1761 rc = sqlite3CreateFunc(db, zFunc8, nArg, eTextRep, p, xSFunc,xStep,xFinal,0);
1749 sqlite3DbFree(db, zFunc8); 1762 sqlite3DbFree(db, zFunc8);
1750 rc = sqlite3ApiExit(db, rc); 1763 rc = sqlite3ApiExit(db, rc);
1751 sqlite3_mutex_leave(db->mutex); 1764 sqlite3_mutex_leave(db->mutex);
1752 return rc; 1765 return rc;
1753 } 1766 }
1754 #endif 1767 #endif
1755 1768
1756 1769
1757 /* 1770 /*
1758 ** Declare that a function has been overloaded by a virtual table. 1771 ** Declare that a function has been overloaded by a virtual table.
1759 ** 1772 **
1760 ** If the function already exists as a regular global function, then 1773 ** If the function already exists as a regular global function, then
1761 ** this routine is a no-op. If the function does not exist, then create 1774 ** this routine is a no-op. If the function does not exist, then create
1762 ** a new one that always throws a run-time error. 1775 ** a new one that always throws a run-time error.
1763 ** 1776 **
1764 ** When virtual tables intend to provide an overloaded function, they 1777 ** When virtual tables intend to provide an overloaded function, they
1765 ** should call this routine to make sure the global function exists. 1778 ** should call this routine to make sure the global function exists.
1766 ** A global function must exist in order for name resolution to work 1779 ** A global function must exist in order for name resolution to work
1767 ** properly. 1780 ** properly.
1768 */ 1781 */
1769 int sqlite3_overload_function( 1782 int sqlite3_overload_function(
1770 sqlite3 *db, 1783 sqlite3 *db,
1771 const char *zName, 1784 const char *zName,
1772 int nArg 1785 int nArg
1773 ){ 1786 ){
1774 int nName = sqlite3Strlen30(zName);
1775 int rc = SQLITE_OK; 1787 int rc = SQLITE_OK;
1776 1788
1777 #ifdef SQLITE_ENABLE_API_ARMOR 1789 #ifdef SQLITE_ENABLE_API_ARMOR
1778 if( !sqlite3SafetyCheckOk(db) || zName==0 || nArg<-2 ){ 1790 if( !sqlite3SafetyCheckOk(db) || zName==0 || nArg<-2 ){
1779 return SQLITE_MISUSE_BKPT; 1791 return SQLITE_MISUSE_BKPT;
1780 } 1792 }
1781 #endif 1793 #endif
1782 sqlite3_mutex_enter(db->mutex); 1794 sqlite3_mutex_enter(db->mutex);
1783 if( sqlite3FindFunction(db, zName, nName, nArg, SQLITE_UTF8, 0)==0 ){ 1795 if( sqlite3FindFunction(db, zName, nArg, SQLITE_UTF8, 0)==0 ){
1784 rc = sqlite3CreateFunc(db, zName, nArg, SQLITE_UTF8, 1796 rc = sqlite3CreateFunc(db, zName, nArg, SQLITE_UTF8,
1785 0, sqlite3InvalidFunction, 0, 0, 0); 1797 0, sqlite3InvalidFunction, 0, 0, 0);
1786 } 1798 }
1787 rc = sqlite3ApiExit(db, rc); 1799 rc = sqlite3ApiExit(db, rc);
1788 sqlite3_mutex_leave(db->mutex); 1800 sqlite3_mutex_leave(db->mutex);
1789 return rc; 1801 return rc;
1790 } 1802 }
1791 1803
1792 #ifndef SQLITE_OMIT_TRACE 1804 #ifndef SQLITE_OMIT_TRACE
1793 /* 1805 /*
1794 ** Register a trace function. The pArg from the previously registered trace 1806 ** Register a trace function. The pArg from the previously registered trace
1795 ** is returned. 1807 ** is returned.
1796 ** 1808 **
1797 ** A NULL trace function means that no tracing is executes. A non-NULL 1809 ** A NULL trace function means that no tracing is executes. A non-NULL
1798 ** trace is a pointer to a function that is invoked at the start of each 1810 ** trace is a pointer to a function that is invoked at the start of each
1799 ** SQL statement. 1811 ** SQL statement.
1800 */ 1812 */
1801 void *sqlite3_trace(sqlite3 *db, void (*xTrace)(void*,const char*), void *pArg){ 1813 #ifndef SQLITE_OMIT_DEPRECATED
1814 void *sqlite3_trace(sqlite3 *db, void(*xTrace)(void*,const char*), void *pArg){
1802 void *pOld; 1815 void *pOld;
1803 1816
1804 #ifdef SQLITE_ENABLE_API_ARMOR 1817 #ifdef SQLITE_ENABLE_API_ARMOR
1805 if( !sqlite3SafetyCheckOk(db) ){ 1818 if( !sqlite3SafetyCheckOk(db) ){
1806 (void)SQLITE_MISUSE_BKPT; 1819 (void)SQLITE_MISUSE_BKPT;
1807 return 0; 1820 return 0;
1808 } 1821 }
1809 #endif 1822 #endif
1810 sqlite3_mutex_enter(db->mutex); 1823 sqlite3_mutex_enter(db->mutex);
1811 pOld = db->pTraceArg; 1824 pOld = db->pTraceArg;
1812 db->xTrace = xTrace; 1825 db->mTrace = xTrace ? SQLITE_TRACE_LEGACY : 0;
1826 db->xTrace = (int(*)(u32,void*,void*,void*))xTrace;
1813 db->pTraceArg = pArg; 1827 db->pTraceArg = pArg;
1814 sqlite3_mutex_leave(db->mutex); 1828 sqlite3_mutex_leave(db->mutex);
1815 return pOld; 1829 return pOld;
1816 } 1830 }
1831 #endif /* SQLITE_OMIT_DEPRECATED */
1832
1833 /* Register a trace callback using the version-2 interface.
1834 */
1835 int sqlite3_trace_v2(
1836 sqlite3 *db, /* Trace this connection */
1837 unsigned mTrace, /* Mask of events to be traced */
1838 int(*xTrace)(unsigned,void*,void*,void*), /* Callback to invoke */
1839 void *pArg /* Context */
1840 ){
1841 #ifdef SQLITE_ENABLE_API_ARMOR
1842 if( !sqlite3SafetyCheckOk(db) ){
1843 return SQLITE_MISUSE_BKPT;
1844 }
1845 #endif
1846 sqlite3_mutex_enter(db->mutex);
1847 if( mTrace==0 ) xTrace = 0;
1848 if( xTrace==0 ) mTrace = 0;
1849 db->mTrace = mTrace;
1850 db->xTrace = xTrace;
1851 db->pTraceArg = pArg;
1852 sqlite3_mutex_leave(db->mutex);
1853 return SQLITE_OK;
1854 }
1855
1856 #ifndef SQLITE_OMIT_DEPRECATED
1817 /* 1857 /*
1818 ** Register a profile function. The pArg from the previously registered 1858 ** Register a profile function. The pArg from the previously registered
1819 ** profile function is returned. 1859 ** profile function is returned.
1820 ** 1860 **
1821 ** A NULL profile function means that no profiling is executes. A non-NULL 1861 ** A NULL profile function means that no profiling is executes. A non-NULL
1822 ** profile is a pointer to a function that is invoked at the conclusion of 1862 ** profile is a pointer to a function that is invoked at the conclusion of
1823 ** each SQL statement that is run. 1863 ** each SQL statement that is run.
1824 */ 1864 */
1825 void *sqlite3_profile( 1865 void *sqlite3_profile(
1826 sqlite3 *db, 1866 sqlite3 *db,
1827 void (*xProfile)(void*,const char*,sqlite_uint64), 1867 void (*xProfile)(void*,const char*,sqlite_uint64),
1828 void *pArg 1868 void *pArg
1829 ){ 1869 ){
1830 void *pOld; 1870 void *pOld;
1831 1871
1832 #ifdef SQLITE_ENABLE_API_ARMOR 1872 #ifdef SQLITE_ENABLE_API_ARMOR
1833 if( !sqlite3SafetyCheckOk(db) ){ 1873 if( !sqlite3SafetyCheckOk(db) ){
1834 (void)SQLITE_MISUSE_BKPT; 1874 (void)SQLITE_MISUSE_BKPT;
1835 return 0; 1875 return 0;
1836 } 1876 }
1837 #endif 1877 #endif
1838 sqlite3_mutex_enter(db->mutex); 1878 sqlite3_mutex_enter(db->mutex);
1839 pOld = db->pProfileArg; 1879 pOld = db->pProfileArg;
1840 db->xProfile = xProfile; 1880 db->xProfile = xProfile;
1841 db->pProfileArg = pArg; 1881 db->pProfileArg = pArg;
1842 sqlite3_mutex_leave(db->mutex); 1882 sqlite3_mutex_leave(db->mutex);
1843 return pOld; 1883 return pOld;
1844 } 1884 }
1885 #endif /* SQLITE_OMIT_DEPRECATED */
1845 #endif /* SQLITE_OMIT_TRACE */ 1886 #endif /* SQLITE_OMIT_TRACE */
1846 1887
1847 /* 1888 /*
1848 ** Register a function to be invoked when a transaction commits. 1889 ** Register a function to be invoked when a transaction commits.
1849 ** If the invoked function returns non-zero, then the commit becomes a 1890 ** If the invoked function returns non-zero, then the commit becomes a
1850 ** rollback. 1891 ** rollback.
1851 */ 1892 */
1852 void *sqlite3_commit_hook( 1893 void *sqlite3_commit_hook(
1853 sqlite3 *db, /* Attach the hook to this database */ 1894 sqlite3 *db, /* Attach the hook to this database */
1854 int (*xCallback)(void*), /* Function to invoke on each commit */ 1895 int (*xCallback)(void*), /* Function to invoke on each commit */
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
1913 } 1954 }
1914 #endif 1955 #endif
1915 sqlite3_mutex_enter(db->mutex); 1956 sqlite3_mutex_enter(db->mutex);
1916 pRet = db->pRollbackArg; 1957 pRet = db->pRollbackArg;
1917 db->xRollbackCallback = xCallback; 1958 db->xRollbackCallback = xCallback;
1918 db->pRollbackArg = pArg; 1959 db->pRollbackArg = pArg;
1919 sqlite3_mutex_leave(db->mutex); 1960 sqlite3_mutex_leave(db->mutex);
1920 return pRet; 1961 return pRet;
1921 } 1962 }
1922 1963
1964 #ifdef SQLITE_ENABLE_PREUPDATE_HOOK
1965 /*
1966 ** Register a callback to be invoked each time a row is updated,
1967 ** inserted or deleted using this database connection.
1968 */
1969 void *sqlite3_preupdate_hook(
1970 sqlite3 *db, /* Attach the hook to this database */
1971 void(*xCallback)( /* Callback function */
1972 void*,sqlite3*,int,char const*,char const*,sqlite3_int64,sqlite3_int64),
1973 void *pArg /* First callback argument */
1974 ){
1975 void *pRet;
1976 sqlite3_mutex_enter(db->mutex);
1977 pRet = db->pPreUpdateArg;
1978 db->xPreUpdateCallback = xCallback;
1979 db->pPreUpdateArg = pArg;
1980 sqlite3_mutex_leave(db->mutex);
1981 return pRet;
1982 }
1983 #endif /* SQLITE_ENABLE_PREUPDATE_HOOK */
1984
1923 #ifndef SQLITE_OMIT_WAL 1985 #ifndef SQLITE_OMIT_WAL
1924 /* 1986 /*
1925 ** The sqlite3_wal_hook() callback registered by sqlite3_wal_autocheckpoint(). 1987 ** The sqlite3_wal_hook() callback registered by sqlite3_wal_autocheckpoint().
1926 ** Invoke sqlite3_wal_checkpoint if the number of frames in the log file 1988 ** Invoke sqlite3_wal_checkpoint if the number of frames in the log file
1927 ** is greater than sqlite3.pWalArg cast to an integer (the value configured by 1989 ** is greater than sqlite3.pWalArg cast to an integer (the value configured by
1928 ** wal_autocheckpoint()). 1990 ** wal_autocheckpoint()).
1929 */ 1991 */
1930 int sqlite3WalDefaultHook( 1992 int sqlite3WalDefaultHook(
1931 void *pClientData, /* Argument */ 1993 void *pClientData, /* Argument */
1932 sqlite3 *db, /* Connection */ 1994 sqlite3 *db, /* Connection */
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
2038 } 2100 }
2039 if( iDb<0 ){ 2101 if( iDb<0 ){
2040 rc = SQLITE_ERROR; 2102 rc = SQLITE_ERROR;
2041 sqlite3ErrorWithMsg(db, SQLITE_ERROR, "unknown database: %s", zDb); 2103 sqlite3ErrorWithMsg(db, SQLITE_ERROR, "unknown database: %s", zDb);
2042 }else{ 2104 }else{
2043 db->busyHandler.nBusy = 0; 2105 db->busyHandler.nBusy = 0;
2044 rc = sqlite3Checkpoint(db, iDb, eMode, pnLog, pnCkpt); 2106 rc = sqlite3Checkpoint(db, iDb, eMode, pnLog, pnCkpt);
2045 sqlite3Error(db, rc); 2107 sqlite3Error(db, rc);
2046 } 2108 }
2047 rc = sqlite3ApiExit(db, rc); 2109 rc = sqlite3ApiExit(db, rc);
2110
2111 /* If there are no active statements, clear the interrupt flag at this
2112 ** point. */
2113 if( db->nVdbeActive==0 ){
2114 db->u1.isInterrupted = 0;
2115 }
2116
2048 sqlite3_mutex_leave(db->mutex); 2117 sqlite3_mutex_leave(db->mutex);
2049 return rc; 2118 return rc;
2050 #endif 2119 #endif
2051 } 2120 }
2052 2121
2053 2122
2054 /* 2123 /*
2055 ** Checkpoint database zDb. If zDb is NULL, or if the buffer zDb points 2124 ** Checkpoint database zDb. If zDb is NULL, or if the buffer zDb points
2056 ** to contains a zero-length string, all attached databases are 2125 ** to contains a zero-length string, all attached databases are
2057 ** checkpointed. 2126 ** checkpointed.
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
2143 #endif 2212 #endif
2144 } 2213 }
2145 2214
2146 /* 2215 /*
2147 ** Return UTF-8 encoded English language explanation of the most recent 2216 ** Return UTF-8 encoded English language explanation of the most recent
2148 ** error. 2217 ** error.
2149 */ 2218 */
2150 const char *sqlite3_errmsg(sqlite3 *db){ 2219 const char *sqlite3_errmsg(sqlite3 *db){
2151 const char *z; 2220 const char *z;
2152 if( !db ){ 2221 if( !db ){
2153 return sqlite3ErrStr(SQLITE_NOMEM); 2222 return sqlite3ErrStr(SQLITE_NOMEM_BKPT);
2154 } 2223 }
2155 if( !sqlite3SafetyCheckSickOrOk(db) ){ 2224 if( !sqlite3SafetyCheckSickOrOk(db) ){
2156 return sqlite3ErrStr(SQLITE_MISUSE_BKPT); 2225 return sqlite3ErrStr(SQLITE_MISUSE_BKPT);
2157 } 2226 }
2158 sqlite3_mutex_enter(db->mutex); 2227 sqlite3_mutex_enter(db->mutex);
2159 if( db->mallocFailed ){ 2228 if( db->mallocFailed ){
2160 z = sqlite3ErrStr(SQLITE_NOMEM); 2229 z = sqlite3ErrStr(SQLITE_NOMEM_BKPT);
2161 }else{ 2230 }else{
2162 testcase( db->pErr==0 ); 2231 testcase( db->pErr==0 );
2163 z = (char*)sqlite3_value_text(db->pErr); 2232 z = (char*)sqlite3_value_text(db->pErr);
2164 assert( !db->mallocFailed ); 2233 assert( !db->mallocFailed );
2165 if( z==0 ){ 2234 if( z==0 ){
2166 z = sqlite3ErrStr(db->errCode); 2235 z = sqlite3ErrStr(db->errCode);
2167 } 2236 }
2168 } 2237 }
2169 sqlite3_mutex_leave(db->mutex); 2238 sqlite3_mutex_leave(db->mutex);
2170 return z; 2239 return z;
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
2202 z = sqlite3_value_text16(db->pErr); 2271 z = sqlite3_value_text16(db->pErr);
2203 if( z==0 ){ 2272 if( z==0 ){
2204 sqlite3ErrorWithMsg(db, db->errCode, sqlite3ErrStr(db->errCode)); 2273 sqlite3ErrorWithMsg(db, db->errCode, sqlite3ErrStr(db->errCode));
2205 z = sqlite3_value_text16(db->pErr); 2274 z = sqlite3_value_text16(db->pErr);
2206 } 2275 }
2207 /* A malloc() may have failed within the call to sqlite3_value_text16() 2276 /* A malloc() may have failed within the call to sqlite3_value_text16()
2208 ** above. If this is the case, then the db->mallocFailed flag needs to 2277 ** above. If this is the case, then the db->mallocFailed flag needs to
2209 ** be cleared before returning. Do this directly, instead of via 2278 ** be cleared before returning. Do this directly, instead of via
2210 ** sqlite3ApiExit(), to avoid setting the database handle error message. 2279 ** sqlite3ApiExit(), to avoid setting the database handle error message.
2211 */ 2280 */
2212 db->mallocFailed = 0; 2281 sqlite3OomClear(db);
2213 } 2282 }
2214 sqlite3_mutex_leave(db->mutex); 2283 sqlite3_mutex_leave(db->mutex);
2215 return z; 2284 return z;
2216 } 2285 }
2217 #endif /* SQLITE_OMIT_UTF16 */ 2286 #endif /* SQLITE_OMIT_UTF16 */
2218 2287
2219 /* 2288 /*
2220 ** Return the most recent error code generated by an SQLite routine. If NULL is 2289 ** Return the most recent error code generated by an SQLite routine. If NULL is
2221 ** passed to this function, we assume a malloc() failed during sqlite3_open(). 2290 ** passed to this function, we assume a malloc() failed during sqlite3_open().
2222 */ 2291 */
2223 int sqlite3_errcode(sqlite3 *db){ 2292 int sqlite3_errcode(sqlite3 *db){
2224 if( db && !sqlite3SafetyCheckSickOrOk(db) ){ 2293 if( db && !sqlite3SafetyCheckSickOrOk(db) ){
2225 return SQLITE_MISUSE_BKPT; 2294 return SQLITE_MISUSE_BKPT;
2226 } 2295 }
2227 if( !db || db->mallocFailed ){ 2296 if( !db || db->mallocFailed ){
2228 return SQLITE_NOMEM; 2297 return SQLITE_NOMEM_BKPT;
2229 } 2298 }
2230 return db->errCode & db->errMask; 2299 return db->errCode & db->errMask;
2231 } 2300 }
2232 int sqlite3_extended_errcode(sqlite3 *db){ 2301 int sqlite3_extended_errcode(sqlite3 *db){
2233 if( db && !sqlite3SafetyCheckSickOrOk(db) ){ 2302 if( db && !sqlite3SafetyCheckSickOrOk(db) ){
2234 return SQLITE_MISUSE_BKPT; 2303 return SQLITE_MISUSE_BKPT;
2235 } 2304 }
2236 if( !db || db->mallocFailed ){ 2305 if( !db || db->mallocFailed ){
2237 return SQLITE_NOMEM; 2306 return SQLITE_NOMEM_BKPT;
2238 } 2307 }
2239 return db->errCode; 2308 return db->errCode;
2240 } 2309 }
2310 int sqlite3_system_errno(sqlite3 *db){
2311 return db ? db->iSysErrno : 0;
2312 }
2241 2313
2242 /* 2314 /*
2243 ** Return a string that describes the kind of error specified in the 2315 ** Return a string that describes the kind of error specified in the
2244 ** argument. For now, this simply calls the internal sqlite3ErrStr() 2316 ** argument. For now, this simply calls the internal sqlite3ErrStr()
2245 ** function. 2317 ** function.
2246 */ 2318 */
2247 const char *sqlite3_errstr(int rc){ 2319 const char *sqlite3_errstr(int rc){
2248 return sqlite3ErrStr(rc); 2320 return sqlite3ErrStr(rc);
2249 } 2321 }
2250 2322
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
2307 if( p->xDel ){ 2379 if( p->xDel ){
2308 p->xDel(p->pUser); 2380 p->xDel(p->pUser);
2309 } 2381 }
2310 p->xCmp = 0; 2382 p->xCmp = 0;
2311 } 2383 }
2312 } 2384 }
2313 } 2385 }
2314 } 2386 }
2315 2387
2316 pColl = sqlite3FindCollSeq(db, (u8)enc2, zName, 1); 2388 pColl = sqlite3FindCollSeq(db, (u8)enc2, zName, 1);
2317 if( pColl==0 ) return SQLITE_NOMEM; 2389 if( pColl==0 ) return SQLITE_NOMEM_BKPT;
2318 pColl->xCmp = xCompare; 2390 pColl->xCmp = xCompare;
2319 pColl->pUser = pCtx; 2391 pColl->pUser = pCtx;
2320 pColl->xDel = xDel; 2392 pColl->xDel = xDel;
2321 pColl->enc = (u8)(enc2 | (enc & SQLITE_UTF16_ALIGNED)); 2393 pColl->enc = (u8)(enc2 | (enc & SQLITE_UTF16_ALIGNED));
2322 sqlite3Error(db, SQLITE_OK); 2394 sqlite3Error(db, SQLITE_OK);
2323 return SQLITE_OK; 2395 return SQLITE_OK;
2324 } 2396 }
2325 2397
2326 2398
2327 /* 2399 /*
(...skipping 27 matching lines...) Expand all
2355 #endif 2427 #endif
2356 #if SQLITE_MAX_SQL_LENGTH>SQLITE_MAX_LENGTH 2428 #if SQLITE_MAX_SQL_LENGTH>SQLITE_MAX_LENGTH
2357 # error SQLITE_MAX_SQL_LENGTH must not be greater than SQLITE_MAX_LENGTH 2429 # error SQLITE_MAX_SQL_LENGTH must not be greater than SQLITE_MAX_LENGTH
2358 #endif 2430 #endif
2359 #if SQLITE_MAX_COMPOUND_SELECT<2 2431 #if SQLITE_MAX_COMPOUND_SELECT<2
2360 # error SQLITE_MAX_COMPOUND_SELECT must be at least 2 2432 # error SQLITE_MAX_COMPOUND_SELECT must be at least 2
2361 #endif 2433 #endif
2362 #if SQLITE_MAX_VDBE_OP<40 2434 #if SQLITE_MAX_VDBE_OP<40
2363 # error SQLITE_MAX_VDBE_OP must be at least 40 2435 # error SQLITE_MAX_VDBE_OP must be at least 40
2364 #endif 2436 #endif
2365 #if SQLITE_MAX_FUNCTION_ARG<0 || SQLITE_MAX_FUNCTION_ARG>1000 2437 #if SQLITE_MAX_FUNCTION_ARG<0 || SQLITE_MAX_FUNCTION_ARG>127
2366 # error SQLITE_MAX_FUNCTION_ARG must be between 0 and 1000 2438 # error SQLITE_MAX_FUNCTION_ARG must be between 0 and 127
2367 #endif 2439 #endif
2368 #if SQLITE_MAX_ATTACHED<0 || SQLITE_MAX_ATTACHED>125 2440 #if SQLITE_MAX_ATTACHED<0 || SQLITE_MAX_ATTACHED>125
2369 # error SQLITE_MAX_ATTACHED must be between 0 and 125 2441 # error SQLITE_MAX_ATTACHED must be between 0 and 125
2370 #endif 2442 #endif
2371 #if SQLITE_MAX_LIKE_PATTERN_LENGTH<1 2443 #if SQLITE_MAX_LIKE_PATTERN_LENGTH<1
2372 # error SQLITE_MAX_LIKE_PATTERN_LENGTH must be at least 1 2444 # error SQLITE_MAX_LIKE_PATTERN_LENGTH must be at least 1
2373 #endif 2445 #endif
2374 #if SQLITE_MAX_COLUMN>32767 2446 #if SQLITE_MAX_COLUMN>32767
2375 # error SQLITE_MAX_COLUMN must not exceed 32767 2447 # error SQLITE_MAX_COLUMN must not exceed 32767
2376 #endif 2448 #endif
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
2486 int iIn; /* Input character index */ 2558 int iIn; /* Input character index */
2487 int iOut = 0; /* Output character index */ 2559 int iOut = 0; /* Output character index */
2488 u64 nByte = nUri+2; /* Bytes of space to allocate */ 2560 u64 nByte = nUri+2; /* Bytes of space to allocate */
2489 2561
2490 /* Make sure the SQLITE_OPEN_URI flag is set to indicate to the VFS xOpen 2562 /* Make sure the SQLITE_OPEN_URI flag is set to indicate to the VFS xOpen
2491 ** method that there may be extra parameters following the file-name. */ 2563 ** method that there may be extra parameters following the file-name. */
2492 flags |= SQLITE_OPEN_URI; 2564 flags |= SQLITE_OPEN_URI;
2493 2565
2494 for(iIn=0; iIn<nUri; iIn++) nByte += (zUri[iIn]=='&'); 2566 for(iIn=0; iIn<nUri; iIn++) nByte += (zUri[iIn]=='&');
2495 zFile = sqlite3_malloc64(nByte); 2567 zFile = sqlite3_malloc64(nByte);
2496 if( !zFile ) return SQLITE_NOMEM; 2568 if( !zFile ) return SQLITE_NOMEM_BKPT;
2497 2569
2498 iIn = 5; 2570 iIn = 5;
2499 #ifdef SQLITE_ALLOW_URI_AUTHORITY 2571 #ifdef SQLITE_ALLOW_URI_AUTHORITY
2500 if( strncmp(zUri+5, "///", 3)==0 ){ 2572 if( strncmp(zUri+5, "///", 3)==0 ){
2501 iIn = 7; 2573 iIn = 7;
2502 /* The following condition causes URIs with five leading / characters 2574 /* The following condition causes URIs with five leading / characters
2503 ** like file://///host/path to be converted into UNCs like //host/path. 2575 ** like file://///host/path to be converted into UNCs like //host/path.
2504 ** The correct URI for that UNC has only two or four leading / characters 2576 ** The correct URI for that UNC has only two or four leading / characters
2505 ** file://host/path or file:////host/path. But 5 leading slashes is a 2577 ** file://host/path or file:////host/path. But 5 leading slashes is a
2506 ** common error, we are told, so we handle it as a special case. */ 2578 ** common error, we are told, so we handle it as a special case. */
(...skipping 30 matching lines...) Expand all
2537 iIn++; 2609 iIn++;
2538 if( c=='%' 2610 if( c=='%'
2539 && sqlite3Isxdigit(zUri[iIn]) 2611 && sqlite3Isxdigit(zUri[iIn])
2540 && sqlite3Isxdigit(zUri[iIn+1]) 2612 && sqlite3Isxdigit(zUri[iIn+1])
2541 ){ 2613 ){
2542 int octet = (sqlite3HexToInt(zUri[iIn++]) << 4); 2614 int octet = (sqlite3HexToInt(zUri[iIn++]) << 4);
2543 octet += sqlite3HexToInt(zUri[iIn++]); 2615 octet += sqlite3HexToInt(zUri[iIn++]);
2544 2616
2545 assert( octet>=0 && octet<256 ); 2617 assert( octet>=0 && octet<256 );
2546 if( octet==0 ){ 2618 if( octet==0 ){
2619 #ifndef SQLITE_ENABLE_URI_00_ERROR
2547 /* This branch is taken when "%00" appears within the URI. In this 2620 /* This branch is taken when "%00" appears within the URI. In this
2548 ** case we ignore all text in the remainder of the path, name or 2621 ** case we ignore all text in the remainder of the path, name or
2549 ** value currently being parsed. So ignore the current character 2622 ** value currently being parsed. So ignore the current character
2550 ** and skip to the next "?", "=" or "&", as appropriate. */ 2623 ** and skip to the next "?", "=" or "&", as appropriate. */
2551 while( (c = zUri[iIn])!=0 && c!='#' 2624 while( (c = zUri[iIn])!=0 && c!='#'
2552 && (eState!=0 || c!='?') 2625 && (eState!=0 || c!='?')
2553 && (eState!=1 || (c!='=' && c!='&')) 2626 && (eState!=1 || (c!='=' && c!='&'))
2554 && (eState!=2 || c!='&') 2627 && (eState!=2 || c!='&')
2555 ){ 2628 ){
2556 iIn++; 2629 iIn++;
2557 } 2630 }
2558 continue; 2631 continue;
2632 #else
2633 /* If ENABLE_URI_00_ERROR is defined, "%00" in a URI is an error. */
2634 *pzErrMsg = sqlite3_mprintf("unexpected %%00 in uri");
2635 rc = SQLITE_ERROR;
2636 goto parse_uri_out;
2637 #endif
2559 } 2638 }
2560 c = octet; 2639 c = octet;
2561 }else if( eState==1 && (c=='&' || c=='=') ){ 2640 }else if( eState==1 && (c=='&' || c=='=') ){
2562 if( zFile[iOut-1]==0 ){ 2641 if( zFile[iOut-1]==0 ){
2563 /* An empty option name. Ignore this option altogether. */ 2642 /* An empty option name. Ignore this option altogether. */
2564 while( zUri[iIn] && zUri[iIn]!='#' && zUri[iIn-1]!='&' ) iIn++; 2643 while( zUri[iIn] && zUri[iIn]!='#' && zUri[iIn-1]!='&' ) iIn++;
2565 continue; 2644 continue;
2566 } 2645 }
2567 if( c=='&' ){ 2646 if( c=='&' ){
2568 zFile[iOut++] = '\0'; 2647 zFile[iOut++] = '\0';
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
2652 } 2731 }
2653 flags = (flags & ~mask) | mode; 2732 flags = (flags & ~mask) | mode;
2654 } 2733 }
2655 } 2734 }
2656 2735
2657 zOpt = &zVal[nVal+1]; 2736 zOpt = &zVal[nVal+1];
2658 } 2737 }
2659 2738
2660 }else{ 2739 }else{
2661 zFile = sqlite3_malloc64(nUri+2); 2740 zFile = sqlite3_malloc64(nUri+2);
2662 if( !zFile ) return SQLITE_NOMEM; 2741 if( !zFile ) return SQLITE_NOMEM_BKPT;
2663 memcpy(zFile, zUri, nUri); 2742 if( nUri ){
2743 memcpy(zFile, zUri, nUri);
2744 }
2664 zFile[nUri] = '\0'; 2745 zFile[nUri] = '\0';
2665 zFile[nUri+1] = '\0'; 2746 zFile[nUri+1] = '\0';
2666 flags &= ~SQLITE_OPEN_URI; 2747 flags &= ~SQLITE_OPEN_URI;
2667 } 2748 }
2668 2749
2669 *ppVfs = sqlite3_vfs_find(zVfs); 2750 *ppVfs = sqlite3_vfs_find(zVfs);
2670 if( *ppVfs==0 ){ 2751 if( *ppVfs==0 ){
2671 *pzErrMsg = sqlite3_mprintf("no such vfs: %s", zVfs); 2752 *pzErrMsg = sqlite3_mprintf("no such vfs: %s", zVfs);
2672 rc = SQLITE_ERROR; 2753 rc = SQLITE_ERROR;
2673 } 2754 }
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
2809 #endif 2890 #endif
2810 #if defined(SQLITE_DEFAULT_FOREIGN_KEYS) && SQLITE_DEFAULT_FOREIGN_KEYS 2891 #if defined(SQLITE_DEFAULT_FOREIGN_KEYS) && SQLITE_DEFAULT_FOREIGN_KEYS
2811 | SQLITE_ForeignKeys 2892 | SQLITE_ForeignKeys
2812 #endif 2893 #endif
2813 #if defined(SQLITE_REVERSE_UNORDERED_SELECTS) 2894 #if defined(SQLITE_REVERSE_UNORDERED_SELECTS)
2814 | SQLITE_ReverseOrder 2895 | SQLITE_ReverseOrder
2815 #endif 2896 #endif
2816 #if defined(SQLITE_ENABLE_OVERSIZE_CELL_CHECK) 2897 #if defined(SQLITE_ENABLE_OVERSIZE_CELL_CHECK)
2817 | SQLITE_CellSizeCk 2898 | SQLITE_CellSizeCk
2818 #endif 2899 #endif
2900 #if defined(SQLITE_ENABLE_FTS3_TOKENIZER)
2901 | SQLITE_Fts3Tokenizer
2902 #endif
2819 ; 2903 ;
2820 sqlite3HashInit(&db->aCollSeq); 2904 sqlite3HashInit(&db->aCollSeq);
2821 #ifndef SQLITE_OMIT_VIRTUALTABLE 2905 #ifndef SQLITE_OMIT_VIRTUALTABLE
2822 sqlite3HashInit(&db->aModule); 2906 sqlite3HashInit(&db->aModule);
2823 #endif 2907 #endif
2824 2908
2825 /* Add the default collation sequence BINARY. BINARY works for both UTF-8 2909 /* Add the default collation sequence BINARY. BINARY works for both UTF-8
2826 ** and UTF-16, so add a version for each to avoid any unnecessary 2910 ** and UTF-16, so add a version for each to avoid any unnecessary
2827 ** conversions. The only error that can occur here is a malloc() failure. 2911 ** conversions. The only error that can occur here is a malloc() failure.
2828 ** 2912 **
(...skipping 11 matching lines...) Expand all
2840 /* EVIDENCE-OF: R-08308-17224 The default collating function for all 2924 /* EVIDENCE-OF: R-08308-17224 The default collating function for all
2841 ** strings is BINARY. 2925 ** strings is BINARY.
2842 */ 2926 */
2843 db->pDfltColl = sqlite3FindCollSeq(db, SQLITE_UTF8, sqlite3StrBINARY, 0); 2927 db->pDfltColl = sqlite3FindCollSeq(db, SQLITE_UTF8, sqlite3StrBINARY, 0);
2844 assert( db->pDfltColl!=0 ); 2928 assert( db->pDfltColl!=0 );
2845 2929
2846 /* Parse the filename/URI argument. */ 2930 /* Parse the filename/URI argument. */
2847 db->openFlags = flags; 2931 db->openFlags = flags;
2848 rc = sqlite3ParseUri(zVfs, zFilename, &flags, &db->pVfs, &zOpen, &zErrMsg); 2932 rc = sqlite3ParseUri(zVfs, zFilename, &flags, &db->pVfs, &zOpen, &zErrMsg);
2849 if( rc!=SQLITE_OK ){ 2933 if( rc!=SQLITE_OK ){
2850 if( rc==SQLITE_NOMEM ) db->mallocFailed = 1; 2934 if( rc==SQLITE_NOMEM ) sqlite3OomFault(db);
2851 sqlite3ErrorWithMsg(db, rc, zErrMsg ? "%s" : 0, zErrMsg); 2935 sqlite3ErrorWithMsg(db, rc, zErrMsg ? "%s" : 0, zErrMsg);
2852 sqlite3_free(zErrMsg); 2936 sqlite3_free(zErrMsg);
2853 goto opendb_out; 2937 goto opendb_out;
2854 } 2938 }
2855 2939
2856 /* Open the backend database driver */ 2940 /* Open the backend database driver */
2857 rc = sqlite3BtreeOpen(db->pVfs, zOpen, db, &db->aDb[0].pBt, 0, 2941 rc = sqlite3BtreeOpen(db->pVfs, zOpen, db, &db->aDb[0].pBt, 0,
2858 flags | SQLITE_OPEN_MAIN_DB); 2942 flags | SQLITE_OPEN_MAIN_DB);
2859 if( rc!=SQLITE_OK ){ 2943 if( rc!=SQLITE_OK ){
2860 if( rc==SQLITE_IOERR_NOMEM ){ 2944 if( rc==SQLITE_IOERR_NOMEM ){
2861 rc = SQLITE_NOMEM; 2945 rc = SQLITE_NOMEM_BKPT;
2862 } 2946 }
2863 sqlite3Error(db, rc); 2947 sqlite3Error(db, rc);
2864 goto opendb_out; 2948 goto opendb_out;
2865 } 2949 }
2866 sqlite3BtreeEnter(db->aDb[0].pBt); 2950 sqlite3BtreeEnter(db->aDb[0].pBt);
2867 db->aDb[0].pSchema = sqlite3SchemaGet(db, db->aDb[0].pBt); 2951 db->aDb[0].pSchema = sqlite3SchemaGet(db, db->aDb[0].pBt);
2868 if( !db->mallocFailed ) ENC(db) = SCHEMA_ENC(db); 2952 if( !db->mallocFailed ) ENC(db) = SCHEMA_ENC(db);
2869 sqlite3BtreeLeave(db->aDb[0].pBt); 2953 sqlite3BtreeLeave(db->aDb[0].pBt);
2870 db->aDb[1].pSchema = sqlite3SchemaGet(db, 0); 2954 db->aDb[1].pSchema = sqlite3SchemaGet(db, 0);
2871 2955
2872 /* The default safety_level for the main database is 'full'; for the temp 2956 /* The default safety_level for the main database is FULL; for the temp
2873 ** database it is 'NONE'. This matches the pager layer defaults. 2957 ** database it is OFF. This matches the pager layer defaults.
2874 */ 2958 */
2875 db->aDb[0].zName = "main"; 2959 db->aDb[0].zDbSName = "main";
2876 db->aDb[0].safety_level = 3; 2960 db->aDb[0].safety_level = SQLITE_DEFAULT_SYNCHRONOUS+1;
2877 db->aDb[1].zName = "temp"; 2961 db->aDb[1].zDbSName = "temp";
2878 db->aDb[1].safety_level = 1; 2962 db->aDb[1].safety_level = PAGER_SYNCHRONOUS_OFF;
2879 2963
2880 db->magic = SQLITE_MAGIC_OPEN; 2964 db->magic = SQLITE_MAGIC_OPEN;
2881 if( db->mallocFailed ){ 2965 if( db->mallocFailed ){
2882 goto opendb_out; 2966 goto opendb_out;
2883 } 2967 }
2884 2968
2885 /* Register all built-in functions, but do not attempt to read the 2969 /* Register all built-in functions, but do not attempt to read the
2886 ** database schema yet. This is delayed until the first time the database 2970 ** database schema yet. This is delayed until the first time the database
2887 ** is accessed. 2971 ** is accessed.
2888 */ 2972 */
2889 sqlite3Error(db, SQLITE_OK); 2973 sqlite3Error(db, SQLITE_OK);
2890 sqlite3RegisterBuiltinFunctions(db); 2974 sqlite3RegisterPerConnectionBuiltinFunctions(db);
2975 rc = sqlite3_errcode(db);
2976
2977 #ifdef SQLITE_ENABLE_FTS5
2978 /* Register any built-in FTS5 module before loading the automatic
2979 ** extensions. This allows automatic extensions to register FTS5
2980 ** tokenizers and auxiliary functions. */
2981 if( !db->mallocFailed && rc==SQLITE_OK ){
2982 rc = sqlite3Fts5Init(db);
2983 }
2984 #endif
2891 2985
2892 /* Load automatic extensions - extensions that have been registered 2986 /* Load automatic extensions - extensions that have been registered
2893 ** using the sqlite3_automatic_extension() API. 2987 ** using the sqlite3_automatic_extension() API.
2894 */ 2988 */
2895 rc = sqlite3_errcode(db);
2896 if( rc==SQLITE_OK ){ 2989 if( rc==SQLITE_OK ){
2897 sqlite3AutoLoadExtensions(db); 2990 sqlite3AutoLoadExtensions(db);
2898 rc = sqlite3_errcode(db); 2991 rc = sqlite3_errcode(db);
2899 if( rc!=SQLITE_OK ){ 2992 if( rc!=SQLITE_OK ){
2900 goto opendb_out; 2993 goto opendb_out;
2901 } 2994 }
2902 } 2995 }
2903 2996
2904 #ifdef SQLITE_ENABLE_FTS1 2997 #ifdef SQLITE_ENABLE_FTS1
2905 if( !db->mallocFailed ){ 2998 if( !db->mallocFailed ){
2906 extern int sqlite3Fts1Init(sqlite3*); 2999 extern int sqlite3Fts1Init(sqlite3*);
2907 rc = sqlite3Fts1Init(db); 3000 rc = sqlite3Fts1Init(db);
2908 } 3001 }
2909 #endif 3002 #endif
2910 3003
2911 #ifdef SQLITE_ENABLE_FTS2 3004 #ifdef SQLITE_ENABLE_FTS2
2912 if( !db->mallocFailed && rc==SQLITE_OK ){ 3005 if( !db->mallocFailed && rc==SQLITE_OK ){
2913 extern int sqlite3Fts2Init(sqlite3*); 3006 extern int sqlite3Fts2Init(sqlite3*);
2914 rc = sqlite3Fts2Init(db); 3007 rc = sqlite3Fts2Init(db);
2915 } 3008 }
2916 #endif 3009 #endif
2917 3010
2918 #ifdef SQLITE_ENABLE_FTS3 /* automatically defined by SQLITE_ENABLE_FTS4 */ 3011 #ifdef SQLITE_ENABLE_FTS3 /* automatically defined by SQLITE_ENABLE_FTS4 */
2919 if( !db->mallocFailed && rc==SQLITE_OK ){ 3012 if( !db->mallocFailed && rc==SQLITE_OK ){
2920 rc = sqlite3Fts3Init(db); 3013 rc = sqlite3Fts3Init(db);
2921 } 3014 }
2922 #endif 3015 #endif
2923 3016
2924 #ifdef SQLITE_ENABLE_FTS5
2925 if( !db->mallocFailed && rc==SQLITE_OK ){
2926 rc = sqlite3Fts5Init(db);
2927 }
2928 #endif
2929
2930 #ifdef DEFAULT_ENABLE_RECOVER 3017 #ifdef DEFAULT_ENABLE_RECOVER
2931 /* Initialize recover virtual table for testing. */ 3018 /* Initialize recover virtual table for testing. */
2932 extern int recoverVtableInit(sqlite3 *db); 3019 extern int recoverVtableInit(sqlite3 *db);
2933 if( !db->mallocFailed && rc==SQLITE_OK ){ 3020 if( !db->mallocFailed && rc==SQLITE_OK ){
2934 rc = recoverVtableInit(db); 3021 rc = recoverVtableInit(db);
2935 } 3022 }
2936 #endif 3023 #endif
2937 3024
2938 #ifdef SQLITE_ENABLE_ICU 3025 #ifdef SQLITE_ENABLE_ICU
2939 if( !db->mallocFailed && rc==SQLITE_OK ){ 3026 if( !db->mallocFailed && rc==SQLITE_OK ){
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
3062 sqlite3ValueSetStr(pVal, -1, zFilename, SQLITE_UTF16NATIVE, SQLITE_STATIC); 3149 sqlite3ValueSetStr(pVal, -1, zFilename, SQLITE_UTF16NATIVE, SQLITE_STATIC);
3063 zFilename8 = sqlite3ValueText(pVal, SQLITE_UTF8); 3150 zFilename8 = sqlite3ValueText(pVal, SQLITE_UTF8);
3064 if( zFilename8 ){ 3151 if( zFilename8 ){
3065 rc = openDatabase(zFilename8, ppDb, 3152 rc = openDatabase(zFilename8, ppDb,
3066 SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, 0); 3153 SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, 0);
3067 assert( *ppDb || rc==SQLITE_NOMEM ); 3154 assert( *ppDb || rc==SQLITE_NOMEM );
3068 if( rc==SQLITE_OK && !DbHasProperty(*ppDb, 0, DB_SchemaLoaded) ){ 3155 if( rc==SQLITE_OK && !DbHasProperty(*ppDb, 0, DB_SchemaLoaded) ){
3069 SCHEMA_ENC(*ppDb) = ENC(*ppDb) = SQLITE_UTF16NATIVE; 3156 SCHEMA_ENC(*ppDb) = ENC(*ppDb) = SQLITE_UTF16NATIVE;
3070 } 3157 }
3071 }else{ 3158 }else{
3072 rc = SQLITE_NOMEM; 3159 rc = SQLITE_NOMEM_BKPT;
3073 } 3160 }
3074 sqlite3ValueFree(pVal); 3161 sqlite3ValueFree(pVal);
3075 3162
3076 return rc & 0xff; 3163 return rc & 0xff;
3077 } 3164 }
3078 #endif /* SQLITE_OMIT_UTF16 */ 3165 #endif /* SQLITE_OMIT_UTF16 */
3079 3166
3080 /* 3167 /*
3081 ** Register a new collation sequence with the database handle db. 3168 ** Register a new collation sequence with the database handle db.
3082 */ 3169 */
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
3207 if( !sqlite3SafetyCheckOk(db) ){ 3294 if( !sqlite3SafetyCheckOk(db) ){
3208 (void)SQLITE_MISUSE_BKPT; 3295 (void)SQLITE_MISUSE_BKPT;
3209 return 0; 3296 return 0;
3210 } 3297 }
3211 #endif 3298 #endif
3212 return db->autoCommit; 3299 return db->autoCommit;
3213 } 3300 }
3214 3301
3215 /* 3302 /*
3216 ** The following routines are substitutes for constants SQLITE_CORRUPT, 3303 ** The following routines are substitutes for constants SQLITE_CORRUPT,
3217 ** SQLITE_MISUSE, SQLITE_CANTOPEN, SQLITE_IOERR and possibly other error 3304 ** SQLITE_MISUSE, SQLITE_CANTOPEN, SQLITE_NOMEM and possibly other error
3218 ** constants. They serve two purposes: 3305 ** constants. They serve two purposes:
3219 ** 3306 **
3220 ** 1. Serve as a convenient place to set a breakpoint in a debugger 3307 ** 1. Serve as a convenient place to set a breakpoint in a debugger
3221 ** to detect when version error conditions occurs. 3308 ** to detect when version error conditions occurs.
3222 ** 3309 **
3223 ** 2. Invoke sqlite3_log() to provide the source code location where 3310 ** 2. Invoke sqlite3_log() to provide the source code location where
3224 ** a low-level error is first detected. 3311 ** a low-level error is first detected.
3225 */ 3312 */
3313 static int reportError(int iErr, int lineno, const char *zType){
3314 sqlite3_log(iErr, "%s at line %d of [%.10s]",
3315 zType, lineno, 20+sqlite3_sourceid());
3316 return iErr;
3317 }
3226 int sqlite3CorruptError(int lineno){ 3318 int sqlite3CorruptError(int lineno){
3227 testcase( sqlite3GlobalConfig.xLog!=0 ); 3319 testcase( sqlite3GlobalConfig.xLog!=0 );
3228 sqlite3_log(SQLITE_CORRUPT, 3320 return reportError(SQLITE_CORRUPT, lineno, "database corruption");
3229 "database corruption at line %d of [%.10s]",
3230 lineno, 20+sqlite3_sourceid());
3231 return SQLITE_CORRUPT;
3232 } 3321 }
3233 int sqlite3MisuseError(int lineno){ 3322 int sqlite3MisuseError(int lineno){
3234 testcase( sqlite3GlobalConfig.xLog!=0 ); 3323 testcase( sqlite3GlobalConfig.xLog!=0 );
3235 sqlite3_log(SQLITE_MISUSE, 3324 return reportError(SQLITE_MISUSE, lineno, "misuse");
3236 "misuse at line %d of [%.10s]",
3237 lineno, 20+sqlite3_sourceid());
3238 return SQLITE_MISUSE;
3239 } 3325 }
3240 int sqlite3CantopenError(int lineno){ 3326 int sqlite3CantopenError(int lineno){
3241 testcase( sqlite3GlobalConfig.xLog!=0 ); 3327 testcase( sqlite3GlobalConfig.xLog!=0 );
3242 sqlite3_log(SQLITE_CANTOPEN, 3328 return reportError(SQLITE_CANTOPEN, lineno, "cannot open file");
3243 "cannot open file at line %d of [%.10s]",
3244 lineno, 20+sqlite3_sourceid());
3245 return SQLITE_CANTOPEN;
3246 } 3329 }
3247 3330 #ifdef SQLITE_DEBUG
3331 int sqlite3NomemError(int lineno){
3332 testcase( sqlite3GlobalConfig.xLog!=0 );
3333 return reportError(SQLITE_NOMEM, lineno, "OOM");
3334 }
3335 int sqlite3IoerrnomemError(int lineno){
3336 testcase( sqlite3GlobalConfig.xLog!=0 );
3337 return reportError(SQLITE_IOERR_NOMEM, lineno, "I/O OOM error");
3338 }
3339 #endif
3248 3340
3249 #ifndef SQLITE_OMIT_DEPRECATED 3341 #ifndef SQLITE_OMIT_DEPRECATED
3250 /* 3342 /*
3251 ** This is a convenience routine that makes sure that all thread-specific 3343 ** This is a convenience routine that makes sure that all thread-specific
3252 ** data for this thread has been deallocated. 3344 ** data for this thread has been deallocated.
3253 ** 3345 **
3254 ** SQLite no longer uses thread-specific data so this routine is now a 3346 ** SQLite no longer uses thread-specific data so this routine is now a
3255 ** no-op. It is retained for historical compatibility. 3347 ** no-op. It is retained for historical compatibility.
3256 */ 3348 */
3257 void sqlite3_thread_cleanup(void){ 3349 void sqlite3_thread_cleanup(void){
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
3331 ** to the caller in local variables zDataType, zCollSeq, notnull, primarykey 3423 ** to the caller in local variables zDataType, zCollSeq, notnull, primarykey
3332 ** and autoinc. At this point there are two possibilities: 3424 ** and autoinc. At this point there are two possibilities:
3333 ** 3425 **
3334 ** 1. The specified column name was rowid", "oid" or "_rowid_" 3426 ** 1. The specified column name was rowid", "oid" or "_rowid_"
3335 ** and there is no explicitly declared IPK column. 3427 ** and there is no explicitly declared IPK column.
3336 ** 3428 **
3337 ** 2. The table is not a view and the column name identified an 3429 ** 2. The table is not a view and the column name identified an
3338 ** explicitly declared column. Copy meta information from *pCol. 3430 ** explicitly declared column. Copy meta information from *pCol.
3339 */ 3431 */
3340 if( pCol ){ 3432 if( pCol ){
3341 zDataType = pCol->zType; 3433 zDataType = sqlite3ColumnType(pCol,0);
3342 zCollSeq = pCol->zColl; 3434 zCollSeq = pCol->zColl;
3343 notnull = pCol->notNull!=0; 3435 notnull = pCol->notNull!=0;
3344 primarykey = (pCol->colFlags & COLFLAG_PRIMKEY)!=0; 3436 primarykey = (pCol->colFlags & COLFLAG_PRIMKEY)!=0;
3345 autoinc = pTab->iPKey==iCol && (pTab->tabFlags & TF_Autoincrement)!=0; 3437 autoinc = pTab->iPKey==iCol && (pTab->tabFlags & TF_Autoincrement)!=0;
3346 }else{ 3438 }else{
3347 zDataType = "INTEGER"; 3439 zDataType = "INTEGER";
3348 primarykey = 1; 3440 primarykey = 1;
3349 } 3441 }
3350 if( !zCollSeq ){ 3442 if( !zCollSeq ){
3351 zCollSeq = sqlite3StrBINARY; 3443 zCollSeq = sqlite3StrBINARY;
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
3444 } 3536 }
3445 sqlite3_mutex_leave(db->mutex); 3537 sqlite3_mutex_leave(db->mutex);
3446 return rc; 3538 return rc;
3447 } 3539 }
3448 3540
3449 /* 3541 /*
3450 ** Interface to the testing logic. 3542 ** Interface to the testing logic.
3451 */ 3543 */
3452 int sqlite3_test_control(int op, ...){ 3544 int sqlite3_test_control(int op, ...){
3453 int rc = 0; 3545 int rc = 0;
3454 #ifdef SQLITE_OMIT_BUILTIN_TEST 3546 #ifdef SQLITE_UNTESTABLE
3455 UNUSED_PARAMETER(op); 3547 UNUSED_PARAMETER(op);
3456 #else 3548 #else
3457 va_list ap; 3549 va_list ap;
3458 va_start(ap, op); 3550 va_start(ap, op);
3459 switch( op ){ 3551 switch( op ){
3460 3552
3461 /* 3553 /*
3462 ** Save the current state of the PRNG. 3554 ** Save the current state of the PRNG.
3463 */ 3555 */
3464 case SQLITE_TESTCTRL_PRNG_SAVE: { 3556 case SQLITE_TESTCTRL_PRNG_SAVE: {
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
3568 ** This action provides a run-time test to see whether or not 3660 ** This action provides a run-time test to see whether or not
3569 ** assert() was enabled at compile-time. If X is true and assert() 3661 ** assert() was enabled at compile-time. If X is true and assert()
3570 ** is enabled, then the return value is true. If X is true and 3662 ** is enabled, then the return value is true. If X is true and
3571 ** assert() is disabled, then the return value is zero. If X is 3663 ** assert() is disabled, then the return value is zero. If X is
3572 ** false and assert() is enabled, then the assertion fires and the 3664 ** false and assert() is enabled, then the assertion fires and the
3573 ** process aborts. If X is false and assert() is disabled, then the 3665 ** process aborts. If X is false and assert() is disabled, then the
3574 ** return value is zero. 3666 ** return value is zero.
3575 */ 3667 */
3576 case SQLITE_TESTCTRL_ASSERT: { 3668 case SQLITE_TESTCTRL_ASSERT: {
3577 volatile int x = 0; 3669 volatile int x = 0;
3578 assert( (x = va_arg(ap,int))!=0 ); 3670 assert( /*side-effects-ok*/ (x = va_arg(ap,int))!=0 );
3579 rc = x; 3671 rc = x;
3580 break; 3672 break;
3581 } 3673 }
3582 3674
3583 3675
3584 /* 3676 /*
3585 ** sqlite3_test_control(SQLITE_TESTCTRL_ALWAYS, int X) 3677 ** sqlite3_test_control(SQLITE_TESTCTRL_ALWAYS, int X)
3586 ** 3678 **
3587 ** This action provides a run-time test to see how the ALWAYS and 3679 ** This action provides a run-time test to see how the ALWAYS and
3588 ** NEVER macros were defined at compile-time. 3680 ** NEVER macros were defined at compile-time.
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
3710 ** formed and never corrupt. This flag is clear by default, indicating that 3802 ** formed and never corrupt. This flag is clear by default, indicating that
3711 ** database files might have arbitrary corruption. Setting the flag during 3803 ** database files might have arbitrary corruption. Setting the flag during
3712 ** testing causes certain assert() statements in the code to be activated 3804 ** testing causes certain assert() statements in the code to be activated
3713 ** that demonstrat invariants on well-formed database files. 3805 ** that demonstrat invariants on well-formed database files.
3714 */ 3806 */
3715 case SQLITE_TESTCTRL_NEVER_CORRUPT: { 3807 case SQLITE_TESTCTRL_NEVER_CORRUPT: {
3716 sqlite3GlobalConfig.neverCorrupt = va_arg(ap, int); 3808 sqlite3GlobalConfig.neverCorrupt = va_arg(ap, int);
3717 break; 3809 break;
3718 } 3810 }
3719 3811
3812 /* Set the threshold at which OP_Once counters reset back to zero.
3813 ** By default this is 0x7ffffffe (over 2 billion), but that value is
3814 ** too big to test in a reasonable amount of time, so this control is
3815 ** provided to set a small and easily reachable reset value.
3816 */
3817 case SQLITE_TESTCTRL_ONCE_RESET_THRESHOLD: {
3818 sqlite3GlobalConfig.iOnceResetThreshold = va_arg(ap, int);
3819 break;
3820 }
3720 3821
3721 /* sqlite3_test_control(SQLITE_TESTCTRL_VDBE_COVERAGE, xCallback, ptr); 3822 /* sqlite3_test_control(SQLITE_TESTCTRL_VDBE_COVERAGE, xCallback, ptr);
3722 ** 3823 **
3723 ** Set the VDBE coverage callback function to xCallback with context 3824 ** Set the VDBE coverage callback function to xCallback with context
3724 ** pointer ptr. 3825 ** pointer ptr.
3725 */ 3826 */
3726 case SQLITE_TESTCTRL_VDBE_COVERAGE: { 3827 case SQLITE_TESTCTRL_VDBE_COVERAGE: {
3727 #ifdef SQLITE_VDBE_COVERAGE 3828 #ifdef SQLITE_VDBE_COVERAGE
3728 typedef void (*branch_callback)(void*,int,u8,u8); 3829 typedef void (*branch_callback)(void*,int,u8,u8);
3729 sqlite3GlobalConfig.xVdbeBranch = va_arg(ap,branch_callback); 3830 sqlite3GlobalConfig.xVdbeBranch = va_arg(ap,branch_callback);
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
3772 db->init.busy = db->init.imposterTable = va_arg(ap,int); 3873 db->init.busy = db->init.imposterTable = va_arg(ap,int);
3773 db->init.newTnum = va_arg(ap,int); 3874 db->init.newTnum = va_arg(ap,int);
3774 if( db->init.busy==0 && db->init.newTnum>0 ){ 3875 if( db->init.busy==0 && db->init.newTnum>0 ){
3775 sqlite3ResetAllSchemasOfConnection(db); 3876 sqlite3ResetAllSchemasOfConnection(db);
3776 } 3877 }
3777 sqlite3_mutex_leave(db->mutex); 3878 sqlite3_mutex_leave(db->mutex);
3778 break; 3879 break;
3779 } 3880 }
3780 } 3881 }
3781 va_end(ap); 3882 va_end(ap);
3782 #endif /* SQLITE_OMIT_BUILTIN_TEST */ 3883 #endif /* SQLITE_UNTESTABLE */
3783 return rc; 3884 return rc;
3784 } 3885 }
3785 3886
3786 /* 3887 /*
3787 ** This is a utility routine, useful to VFS implementations, that checks 3888 ** This is a utility routine, useful to VFS implementations, that checks
3788 ** to see if a database file was a URI that contained a specific query 3889 ** to see if a database file was a URI that contained a specific query
3789 ** parameter, and if so obtains the value of the query parameter. 3890 ** parameter, and if so obtains the value of the query parameter.
3790 ** 3891 **
3791 ** The zFilename argument is the filename pointer passed into the xOpen() 3892 ** The zFilename argument is the filename pointer passed into the xOpen()
3792 ** method of a VFS implementation. The zParam argument is the name of the 3893 ** method of a VFS implementation. The zParam argument is the name of the
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
3828 if( z && sqlite3DecOrHexToI64(z, &v)==SQLITE_OK ){ 3929 if( z && sqlite3DecOrHexToI64(z, &v)==SQLITE_OK ){
3829 bDflt = v; 3930 bDflt = v;
3830 } 3931 }
3831 return bDflt; 3932 return bDflt;
3832 } 3933 }
3833 3934
3834 /* 3935 /*
3835 ** Return the Btree pointer identified by zDbName. Return NULL if not found. 3936 ** Return the Btree pointer identified by zDbName. Return NULL if not found.
3836 */ 3937 */
3837 Btree *sqlite3DbNameToBtree(sqlite3 *db, const char *zDbName){ 3938 Btree *sqlite3DbNameToBtree(sqlite3 *db, const char *zDbName){
3838 int i; 3939 int iDb = zDbName ? sqlite3FindDbName(db, zDbName) : 0;
3839 for(i=0; i<db->nDb; i++){ 3940 return iDb<0 ? 0 : db->aDb[iDb].pBt;
3840 if( db->aDb[i].pBt
3841 && (zDbName==0 || sqlite3StrICmp(zDbName, db->aDb[i].zName)==0)
3842 ){
3843 return db->aDb[i].pBt;
3844 }
3845 }
3846 return 0;
3847 } 3941 }
3848 3942
3849 /* 3943 /*
3850 ** Return the filename of the database associated with a database 3944 ** Return the filename of the database associated with a database
3851 ** connection. 3945 ** connection.
3852 */ 3946 */
3853 const char *sqlite3_db_filename(sqlite3 *db, const char *zDbName){ 3947 const char *sqlite3_db_filename(sqlite3 *db, const char *zDbName){
3854 Btree *pBt; 3948 Btree *pBt;
3855 #ifdef SQLITE_ENABLE_API_ARMOR 3949 #ifdef SQLITE_ENABLE_API_ARMOR
3856 if( !sqlite3SafetyCheckOk(db) ){ 3950 if( !sqlite3SafetyCheckOk(db) ){
(...skipping 26 matching lines...) Expand all
3883 ** Obtain a snapshot handle for the snapshot of database zDb currently 3977 ** Obtain a snapshot handle for the snapshot of database zDb currently
3884 ** being read by handle db. 3978 ** being read by handle db.
3885 */ 3979 */
3886 int sqlite3_snapshot_get( 3980 int sqlite3_snapshot_get(
3887 sqlite3 *db, 3981 sqlite3 *db,
3888 const char *zDb, 3982 const char *zDb,
3889 sqlite3_snapshot **ppSnapshot 3983 sqlite3_snapshot **ppSnapshot
3890 ){ 3984 ){
3891 int rc = SQLITE_ERROR; 3985 int rc = SQLITE_ERROR;
3892 #ifndef SQLITE_OMIT_WAL 3986 #ifndef SQLITE_OMIT_WAL
3893 int iDb;
3894 3987
3895 #ifdef SQLITE_ENABLE_API_ARMOR 3988 #ifdef SQLITE_ENABLE_API_ARMOR
3896 if( !sqlite3SafetyCheckOk(db) ){ 3989 if( !sqlite3SafetyCheckOk(db) ){
3897 return SQLITE_MISUSE_BKPT; 3990 return SQLITE_MISUSE_BKPT;
3898 } 3991 }
3899 #endif 3992 #endif
3900 sqlite3_mutex_enter(db->mutex); 3993 sqlite3_mutex_enter(db->mutex);
3901 3994
3902 iDb = sqlite3FindDbName(db, zDb); 3995 if( db->autoCommit==0 ){
3903 if( iDb==0 || iDb>1 ){ 3996 int iDb = sqlite3FindDbName(db, zDb);
3904 Btree *pBt = db->aDb[iDb].pBt; 3997 if( iDb==0 || iDb>1 ){
3905 if( 0==sqlite3BtreeIsInTrans(pBt) ){ 3998 Btree *pBt = db->aDb[iDb].pBt;
3906 rc = sqlite3BtreeBeginTrans(pBt, 0); 3999 if( 0==sqlite3BtreeIsInTrans(pBt) ){
3907 if( rc==SQLITE_OK ){ 4000 rc = sqlite3BtreeBeginTrans(pBt, 0);
3908 rc = sqlite3PagerSnapshotGet(sqlite3BtreePager(pBt), ppSnapshot); 4001 if( rc==SQLITE_OK ){
4002 rc = sqlite3PagerSnapshotGet(sqlite3BtreePager(pBt), ppSnapshot);
4003 }
3909 } 4004 }
3910 } 4005 }
3911 } 4006 }
3912 4007
3913 sqlite3_mutex_leave(db->mutex); 4008 sqlite3_mutex_leave(db->mutex);
3914 #endif /* SQLITE_OMIT_WAL */ 4009 #endif /* SQLITE_OMIT_WAL */
3915 return rc; 4010 return rc;
3916 } 4011 }
3917 4012
3918 /* 4013 /*
(...skipping 27 matching lines...) Expand all
3946 } 4041 }
3947 } 4042 }
3948 } 4043 }
3949 4044
3950 sqlite3_mutex_leave(db->mutex); 4045 sqlite3_mutex_leave(db->mutex);
3951 #endif /* SQLITE_OMIT_WAL */ 4046 #endif /* SQLITE_OMIT_WAL */
3952 return rc; 4047 return rc;
3953 } 4048 }
3954 4049
3955 /* 4050 /*
4051 ** Recover as many snapshots as possible from the wal file associated with
4052 ** schema zDb of database db.
4053 */
4054 int sqlite3_snapshot_recover(sqlite3 *db, const char *zDb){
4055 int rc = SQLITE_ERROR;
4056 int iDb;
4057 #ifndef SQLITE_OMIT_WAL
4058
4059 #ifdef SQLITE_ENABLE_API_ARMOR
4060 if( !sqlite3SafetyCheckOk(db) ){
4061 return SQLITE_MISUSE_BKPT;
4062 }
4063 #endif
4064
4065 sqlite3_mutex_enter(db->mutex);
4066 iDb = sqlite3FindDbName(db, zDb);
4067 if( iDb==0 || iDb>1 ){
4068 Btree *pBt = db->aDb[iDb].pBt;
4069 if( 0==sqlite3BtreeIsInReadTrans(pBt) ){
4070 rc = sqlite3BtreeBeginTrans(pBt, 0);
4071 if( rc==SQLITE_OK ){
4072 rc = sqlite3PagerSnapshotRecover(sqlite3BtreePager(pBt));
4073 sqlite3BtreeCommit(pBt);
4074 }
4075 }
4076 }
4077 sqlite3_mutex_leave(db->mutex);
4078 #endif /* SQLITE_OMIT_WAL */
4079 return rc;
4080 }
4081
4082 /*
3956 ** Free a snapshot handle obtained from sqlite3_snapshot_get(). 4083 ** Free a snapshot handle obtained from sqlite3_snapshot_get().
3957 */ 4084 */
3958 void sqlite3_snapshot_free(sqlite3_snapshot *pSnapshot){ 4085 void sqlite3_snapshot_free(sqlite3_snapshot *pSnapshot){
3959 sqlite3_free(pSnapshot); 4086 sqlite3_free(pSnapshot);
3960 } 4087 }
3961 #endif /* SQLITE_ENABLE_SNAPSHOT */ 4088 #endif /* SQLITE_ENABLE_SNAPSHOT */
OLDNEW
« no previous file with comments | « third_party/sqlite/src/src/loadext.c ('k') | third_party/sqlite/src/src/malloc.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698