1 diff -r -u -d orig/shell.c ./shell.c 2 --- orig/shell.c 2014-08-20 16:26:07.117256041 -0700 3 +++ ./shell.c 2014-08-20 16:45:00.468546769 -0700 4 @@ -35,6 +35,11 @@ 5 #include "sqlite3.h" 6 #include <ctype.h> 7 #include <stdarg.h> 8 +// Begin Android Add 9 +#ifndef NO_ANDROID_FUNCS 10 +#include <sqlite3_android.h> 11 +#endif 12 +// End Android Add 13 14 #if !defined(_WIN32) && !defined(WIN32) 15 # include <signal.h> 16 @@ -1737,6 +1742,21 @@ 17 readfileFunc, 0, 0); 18 sqlite3_create_function(db, "writefile", 2, SQLITE_UTF8, 0, 19 writefileFunc, 0, 0); 20 + 21 + // Begin Android Add 22 + #ifndef NO_ANDROID_FUNCS 23 + int err = register_localized_collators(db, "en_US", 0); 24 + if (err != SQLITE_OK) { 25 + fprintf(stderr, "register_localized_collators() failed\n"); 26 + exit(1); 27 + } 28 + err = register_android_functions(db, 0); 29 + if (err != SQLITE_OK) { 30 + fprintf(stderr, "register_android_functions() failed\n"); 31 + exit(1); 32 + } 33 + #endif 34 + // End Android Add 35 } 36 } 37 38 diff -r -u -d orig/sqlite3.c ./sqlite3.c 39 --- orig/sqlite3.c 2014-08-20 16:26:07.145255923 -0700 40 +++ ./sqlite3.c 2014-08-20 16:26:36.205134826 -0700 41 @@ -24109,6 +24109,13 @@ 42 */ 43 #if SQLITE_OS_UNIX /* This file is used on unix only */ 44 45 +/* Use posix_fallocate() if it is available 46 +*/ 47 +#if !defined(HAVE_POSIX_FALLOCATE) \ 48 + && (_XOPEN_SOURCE >= 600 || _POSIX_C_SOURCE >= 200112L) 49 +# define HAVE_POSIX_FALLOCATE 1 50 +#endif 51 + 52 /* 53 ** There are various methods for file locking used for concurrency 54 ** control: 55 @@ -24660,7 +24667,12 @@ 56 #else 57 { "pread64", (sqlite3_syscall_ptr)0, 0 }, 58 #endif 59 +#ifdef ANDROID 60 +// Bionic defines pread64 using off64_t rather than off_t. 61 +#define osPread64 ((ssize_t(*)(int,void*,size_t,off64_t))aSyscall[10].pCurrent) 62 +#else 63 #define osPread64 ((ssize_t(*)(int,void*,size_t,off_t))aSyscall[10].pCurrent) 64 +#endif 65 66 { "write", (sqlite3_syscall_ptr)write, 0 }, 67 #define osWrite ((ssize_t(*)(int,const void*,size_t))aSyscall[11].pCurrent) 68 @@ -24678,8 +24690,14 @@ 69 #else 70 { "pwrite64", (sqlite3_syscall_ptr)0, 0 }, 71 #endif 72 +#ifdef ANDROID 73 +// Bionic defines pwrite64 using off64_t rather than off_t. 74 +#define osPwrite64 ((ssize_t(*)(int,const void*,size_t,off64_t))\ 75 + aSyscall[13].pCurrent) 76 +#else 77 #define osPwrite64 ((ssize_t(*)(int,const void*,size_t,off_t))\ 78 aSyscall[13].pCurrent) 79 +#endif 80 81 { "fchmod", (sqlite3_syscall_ptr)fchmod, 0 }, 82 #define osFchmod ((int(*)(int,mode_t))aSyscall[14].pCurrent) 83 @@ -27909,7 +27927,7 @@ 84 SimulateIOError( rc=1 ); 85 if( rc!=0 ){ 86 ((unixFile*)id)->lastErrno = errno; 87 - return SQLITE_IOERR_FSTAT; 88 + return unixLogError(SQLITE_IOERR_FSTAT, "fstat", ((unixFile*)id)->zPath); 89 } 90 *pSize = buf.st_size; 91 92 @@ -27944,7 +27962,9 @@ 93 i64 nSize; /* Required file size */ 94 struct stat buf; /* Used to hold return values of fstat() */ 95 96 - if( osFstat(pFile->h, &buf) ) return SQLITE_IOERR_FSTAT; 97 + if( osFstat(pFile->h, &buf) ) { 98 + return unixLogError(SQLITE_IOERR_FSTAT, "fstat", pFile->zPath); 99 + } 100 101 nSize = ((nByte+pFile->szChunk-1) / pFile->szChunk) * pFile->szChunk; 102 if( nSize>(i64)buf.st_size ){ 103 @@ -28510,7 +28530,7 @@ 104 ** with the same permissions. 105 */ 106 if( osFstat(pDbFd->h, &sStat) && pInode->bProcessLock==0 ){ 107 - rc = SQLITE_IOERR_FSTAT; 108 + rc = unixLogError(SQLITE_IOERR_FSTAT, "fstat", pDbFd->zPath); 109 goto shm_open_err; 110 } 111 112 @@ -29848,7 +29868,7 @@ 113 *pUid = sStat.st_uid; 114 *pGid = sStat.st_gid; 115 }else{ 116 - rc = SQLITE_IOERR_FSTAT; 117 + rc = unixLogError(SQLITE_IOERR_FSTAT, "stat", zDb); 118 } 119 }else if( flags & SQLITE_OPEN_DELETEONCLOSE ){ 120 *pMode = 0600; 121 @@ -100867,7 +100887,7 @@ 122 } 123 if( pDb->pSchema->file_format>SQLITE_MAX_FILE_FORMAT ){ 124 sqlite3SetString(pzErrMsg, db, "unsupported file format"); 125 - rc = SQLITE_ERROR; 126 + rc = SQLITE_CORRUPT_BKPT; // Android Change from "rc = SQLITE_ERROR;" 127 goto initone_error_out; 128 } 129 130 @@ -124770,9 +124790,9 @@ 131 #endif 132 133 #ifdef SQLITE_ENABLE_FTS3 134 - if( !db->mallocFailed && rc==SQLITE_OK ){ 135 - rc = sqlite3Fts3Init(db); 136 - } 137 + if( !db->mallocFailed && rc==SQLITE_OK ){ 138 + rc = sqlite3Fts3Init(db); 139 + } 140 #endif 141 142 #ifdef SQLITE_ENABLE_ICU 143 @@ -130660,16 +130680,28 @@ 144 ** module with sqlite. 145 */ 146 if( SQLITE_OK==rc 147 +#ifndef ANDROID /* fts3_tokenizer disabled for security reasons */ 148 && SQLITE_OK==(rc = sqlite3Fts3InitHashTable(db, pHash, "fts3_tokenizer")) 149 +#endif 150 && SQLITE_OK==(rc = sqlite3_overload_function(db, "snippet", -1)) 151 && SQLITE_OK==(rc = sqlite3_overload_function(db, "offsets", 1)) 152 && SQLITE_OK==(rc = sqlite3_overload_function(db, "matchinfo", 1)) 153 && SQLITE_OK==(rc = sqlite3_overload_function(db, "matchinfo", 2)) 154 && SQLITE_OK==(rc = sqlite3_overload_function(db, "optimize", 1)) 155 ){ 156 +#ifdef SQLITE_ENABLE_FTS3_BACKWARDS 157 + rc = sqlite3_create_module_v2( 158 + db, "fts1", &fts3Module, (void *)pHash, 0 159 + ); 160 + if(rc) return rc; 161 + rc = sqlite3_create_module_v2( 162 + db, "fts2", &fts3Module, (void *)pHash, 0 163 + ); 164 + if(rc) return rc; 165 +#endif 166 rc = sqlite3_create_module_v2( 167 db, "fts3", &fts3Module, (void *)pHash, hashDestroy 168 - ); 169 + ); 170 if( rc==SQLITE_OK ){ 171 rc = sqlite3_create_module_v2( 172 db, "fts4", &fts3Module, (void *)pHash, 0 173