diff -r -u -d orig/shell.c ./shell.c --- orig/shell.c 2019-07-10 11:07:00.000000000 -0700 +++ ./shell.c 2019-07-14 13:48:26.498556296 -0700 @@ -87,6 +87,12 @@ #endif #include #include +// Begin Android Add +#ifndef NO_ANDROID_FUNCS +#include "IcuUtils.h" +#include +#endif +// End Android Add #if !defined(_WIN32) && !defined(WIN32) # include @@ -12702,6 +12708,23 @@ sqlite3_create_function(p->db, "edit", 2, SQLITE_UTF8, 0, editFunc, 0, 0); #endif + + // Begin Android Add + #ifndef NO_ANDROID_FUNCS + InitializeIcuOrDie(); + int err = register_localized_collators(p->db, "en_US", 0); + if (err != SQLITE_OK) { + fprintf(stderr, "register_localized_collators() failed\n"); + exit(1); + } + err = register_android_functions(p->db, 0); + if (err != SQLITE_OK) { + fprintf(stderr, "register_android_functions() failed\n"); + exit(1); + } + #endif + // End Android Add + if( p->openMode==SHELL_OPEN_ZIPFILE ){ char *zSql = sqlite3_mprintf( "CREATE VIRTUAL TABLE zip USING zipfile(%Q);", p->zDbFilename); diff -r -u -d orig/sqlite3.c ./sqlite3.c --- orig/sqlite3.c 2019-07-10 11:07:00.000000000 -0700 +++ ./sqlite3.c 2019-07-14 13:48:26.571891200 -0700 @@ -36374,7 +36374,7 @@ SimulateIOError( rc=1 ); if( rc!=0 ){ storeLastErrno((unixFile*)id, errno); - return SQLITE_IOERR_FSTAT; + return unixLogError(SQLITE_IOERR_FSTAT, "fstat", ((unixFile*)id)->zPath); } *pSize = buf.st_size; @@ -36410,7 +36410,7 @@ struct stat buf; /* Used to hold return values of fstat() */ if( osFstat(pFile->h, &buf) ){ - return SQLITE_IOERR_FSTAT; + return unixLogError(SQLITE_IOERR_FSTAT, "fstat", pFile->zPath); } nSize = ((nByte+pFile->szChunk-1) / pFile->szChunk) * pFile->szChunk; @@ -37096,7 +37096,7 @@ ** with the same permissions. */ if( osFstat(pDbFd->h, &sStat) ){ - rc = SQLITE_IOERR_FSTAT; + rc = unixLogError(SQLITE_IOERR_FSTAT, "fstat", pDbFd->zPath); goto shm_open_err; } @@ -54268,15 +54268,9 @@ unsigned pgFlags /* Various flags */ ){ unsigned level = pgFlags & PAGER_SYNCHRONOUS_MASK; - if( pPager->tempFile ){ - pPager->noSync = 1; - pPager->fullSync = 0; - pPager->extraSync = 0; - }else{ - pPager->noSync = level==PAGER_SYNCHRONOUS_OFF ?1:0; - pPager->fullSync = level>=PAGER_SYNCHRONOUS_FULL ?1:0; - pPager->extraSync = level==PAGER_SYNCHRONOUS_EXTRA ?1:0; - } + pPager->noSync = 1; + pPager->fullSync = 0; + pPager->extraSync = 0; if( pPager->noSync ){ pPager->syncFlags = 0; }else if( pgFlags & PAGER_FULLFSYNC ){ @@ -55635,18 +55629,11 @@ pPager->memDb = (u8)memDb; pPager->readOnly = (u8)readOnly; assert( useJournal || pPager->tempFile ); - pPager->noSync = pPager->tempFile; - if( pPager->noSync ){ - assert( pPager->fullSync==0 ); - assert( pPager->extraSync==0 ); - assert( pPager->syncFlags==0 ); - assert( pPager->walSyncFlags==0 ); - }else{ - pPager->fullSync = 1; - pPager->extraSync = 0; - pPager->syncFlags = SQLITE_SYNC_NORMAL; - pPager->walSyncFlags = SQLITE_SYNC_NORMAL | (SQLITE_SYNC_NORMAL<<2); - } + pPager->noSync = 1; + assert( pPager->fullSync==0 ); + assert( pPager->extraSync==0 ); + assert( pPager->syncFlags==0 ); + assert( pPager->walSyncFlags==0 ); /* pPager->pFirst = 0; */ /* pPager->pFirstSynced = 0; */ /* pPager->pLast = 0; */ @@ -106558,7 +106545,7 @@ #endif sqlite3BtreeLeave(pNew->pBt); } - pNew->safety_level = SQLITE_DEFAULT_SYNCHRONOUS+1; + pNew->safety_level = 1; if( rc==SQLITE_OK && pNew->zDbSName==0 ){ rc = SQLITE_NOMEM_BKPT; } @@ -124505,7 +124492,7 @@ } if( pDb->pSchema->file_format>SQLITE_MAX_FILE_FORMAT ){ sqlite3SetString(pzErrMsg, db, "unsupported file format"); - rc = SQLITE_ERROR; + rc = SQLITE_CORRUPT_BKPT; // Android Change from "rc = SQLITE_ERROR;"; goto initone_error_out; } @@ -158412,7 +158399,7 @@ ** database it is OFF. This matches the pager layer defaults. */ db->aDb[0].zDbSName = "main"; - db->aDb[0].safety_level = SQLITE_DEFAULT_SYNCHRONOUS+1; + db->aDb[0].safety_level = 1; db->aDb[1].zDbSName = "temp"; db->aDb[1].safety_level = PAGER_SYNCHRONOUS_OFF; @@ -164895,13 +164882,25 @@ ** module with sqlite. */ if( SQLITE_OK==rc +#ifndef ANDROID /* fts3_tokenizer disabled for security reasons */ && SQLITE_OK==(rc = sqlite3Fts3InitHashTable(db, pHash, "fts3_tokenizer")) +#endif && SQLITE_OK==(rc = sqlite3_overload_function(db, "snippet", -1)) && SQLITE_OK==(rc = sqlite3_overload_function(db, "offsets", 1)) && SQLITE_OK==(rc = sqlite3_overload_function(db, "matchinfo", 1)) && SQLITE_OK==(rc = sqlite3_overload_function(db, "matchinfo", 2)) && SQLITE_OK==(rc = sqlite3_overload_function(db, "optimize", 1)) ){ +#ifdef SQLITE_ENABLE_FTS3_BACKWARDS + rc = sqlite3_create_module_v2( + db, "fts1", &fts3Module, (void *)pHash, 0 + ); + if(rc) return rc; + rc = sqlite3_create_module_v2( + db, "fts2", &fts3Module, (void *)pHash, 0 + ); + if(rc) return rc; +#endif rc = sqlite3_create_module_v2( db, "fts3", &fts3Module, (void *)pHash, hashDestroy );