| diff -r -u -d orig/shell.c ./shell.c |
| --- orig/shell.c 2017-07-21 00:59:10.429051976 -0700 |
| +++ ./shell.c 2017-07-21 00:59:36.616845501 -0700 |
| @@ -35,6 +35,11 @@ |
| #include "sqlite3.h" |
| #include <ctype.h> |
| #include <stdarg.h> |
| +// Begin Android Add |
| +#ifndef NO_ANDROID_FUNCS |
| +#include <sqlite3_android.h> |
| +#endif |
| +// End Android Add |
| |
| #if !defined(_WIN32) && !defined(WIN32) |
| # include <signal.h> |
| @@ -1737,6 +1742,21 @@ |
| readfileFunc, 0, 0); |
| sqlite3_create_function(db, "writefile", 2, SQLITE_UTF8, 0, |
| writefileFunc, 0, 0); |
| + |
| + // Begin Android Add |
| + #ifndef NO_ANDROID_FUNCS |
| + int err = register_localized_collators(db, "en_US", 0); |
| + if (err != SQLITE_OK) { |
| + fprintf(stderr, "register_localized_collators() failed\n"); |
| + exit(1); |
| + } |
| + err = register_android_functions(db, 0); |
| + if (err != SQLITE_OK) { |
| + fprintf(stderr, "register_android_functions() failed\n"); |
| + exit(1); |
| + } |
| + #endif |
| + // End Android Add |
| } |
| } |
| |
| diff -r -u -d orig/sqlite3.c ./sqlite3.c |
| --- orig/sqlite3.c 2017-07-21 00:59:14.089023131 -0700 |
| +++ ./sqlite3.c 2017-07-21 00:59:36.652845217 -0700 |
| @@ -24119,6 +24119,13 @@ |
| */ |
| #if SQLITE_OS_UNIX /* This file is used on unix only */ |
| |
| +/* Use posix_fallocate() if it is available |
| +*/ |
| +#if !defined(HAVE_POSIX_FALLOCATE) \ |
| + && (_XOPEN_SOURCE >= 600 || _POSIX_C_SOURCE >= 200112L) |
| +# define HAVE_POSIX_FALLOCATE 1 |
| +#endif |
| + |
| /* |
| ** There are various methods for file locking used for concurrency |
| ** control: |
| @@ -24670,7 +24677,12 @@ |
| #else |
| { "pread64", (sqlite3_syscall_ptr)0, 0 }, |
| #endif |
| +#ifdef ANDROID |
| +// Bionic defines pread64 using off64_t rather than off_t. |
| +#define osPread64 ((ssize_t(*)(int,void*,size_t,off64_t))aSyscall[10].pCurrent) |
| +#else |
| #define osPread64 ((ssize_t(*)(int,void*,size_t,off_t))aSyscall[10].pCurrent) |
| +#endif |
| |
| { "write", (sqlite3_syscall_ptr)write, 0 }, |
| #define osWrite ((ssize_t(*)(int,const void*,size_t))aSyscall[11].pCurrent) |
| @@ -24688,8 +24700,14 @@ |
| #else |
| { "pwrite64", (sqlite3_syscall_ptr)0, 0 }, |
| #endif |
| +#ifdef ANDROID |
| +// Bionic defines pwrite64 using off64_t rather than off_t. |
| +#define osPwrite64 ((ssize_t(*)(int,const void*,size_t,off64_t))\ |
| + aSyscall[13].pCurrent) |
| +#else |
| #define osPwrite64 ((ssize_t(*)(int,const void*,size_t,off_t))\ |
| aSyscall[13].pCurrent) |
| +#endif |
| |
| { "fchmod", (sqlite3_syscall_ptr)fchmod, 0 }, |
| #define osFchmod ((int(*)(int,mode_t))aSyscall[14].pCurrent) |
| @@ -27919,7 +27937,7 @@ |
| SimulateIOError( rc=1 ); |
| if( rc!=0 ){ |
| ((unixFile*)id)->lastErrno = errno; |
| - return SQLITE_IOERR_FSTAT; |
| + return unixLogError(SQLITE_IOERR_FSTAT, "fstat", ((unixFile*)id)->zPath); |
| } |
| *pSize = buf.st_size; |
| |
| @@ -27954,7 +27972,9 @@ |
| i64 nSize; /* Required file size */ |
| struct stat buf; /* Used to hold return values of fstat() */ |
| |
| - if( osFstat(pFile->h, &buf) ) return SQLITE_IOERR_FSTAT; |
| + if( osFstat(pFile->h, &buf) ) { |
| + return unixLogError(SQLITE_IOERR_FSTAT, "fstat", pFile->zPath); |
| + } |
| |
| nSize = ((nByte+pFile->szChunk-1) / pFile->szChunk) * pFile->szChunk; |
| if( nSize>(i64)buf.st_size ){ |
| @@ -28520,7 +28540,7 @@ |
| ** with the same permissions. |
| */ |
| if( osFstat(pDbFd->h, &sStat) && pInode->bProcessLock==0 ){ |
| - rc = SQLITE_IOERR_FSTAT; |
| + rc = unixLogError(SQLITE_IOERR_FSTAT, "fstat", pDbFd->zPath); |
| goto shm_open_err; |
| } |
| |
| @@ -29858,7 +29878,7 @@ |
| *pUid = sStat.st_uid; |
| *pGid = sStat.st_gid; |
| }else{ |
| - rc = SQLITE_IOERR_FSTAT; |
| + rc = unixLogError(SQLITE_IOERR_FSTAT, "stat", zDb); |
| } |
| }else if( flags & SQLITE_OPEN_DELETEONCLOSE ){ |
| *pMode = 0600; |
| @@ -100910,7 +100930,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; |
| } |
| |
| @@ -124833,9 +124853,9 @@ |
| #endif |
| |
| #ifdef SQLITE_ENABLE_FTS3 |
| - if( !db->mallocFailed && rc==SQLITE_OK ){ |
| - rc = sqlite3Fts3Init(db); |
| - } |
| + if( !db->mallocFailed && rc==SQLITE_OK ){ |
| + rc = sqlite3Fts3Init(db); |
| + } |
| #endif |
| |
| #ifdef SQLITE_ENABLE_ICU |
| @@ -130729,16 +130749,28 @@ |
| ** 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 |
| - ); |
| + ); |
| if( rc==SQLITE_OK ){ |
| rc = sqlite3_create_module_v2( |
| db, "fts4", &fts3Module, (void *)pHash, 0 |