1 --- orig/shell.c 2018-02-20 10:41:05.477047088 +0000 2 +++ shell.c 2019-03-15 19:21:22.193972160 +0000 3 @@ -87,6 +87,12 @@ 4 #endif 5 #include <ctype.h> 6 #include <stdarg.h> 7 +// Begin Android Add 8 +#ifndef NO_ANDROID_FUNCS 9 +#include <aicu/AIcu.h> 10 +#include <sqlite3_android.h> 11 +#endif 12 +// End Android Add 13 14 #if !defined(_WIN32) && !defined(WIN32) 15 # include <signal.h> 16 @@ -10389,6 +10395,23 @@ 17 editFunc, 0, 0); 18 sqlite3_create_function(p->db, "edit", 2, SQLITE_UTF8, 0, 19 editFunc, 0, 0); 20 + 21 + // Begin Android Add 22 + #ifndef NO_ANDROID_FUNCS 23 + AIcu_initializeIcuOrDie(); 24 + int err = register_localized_collators(p->db, "en_US", 0); 25 + if (err != SQLITE_OK) { 26 + fprintf(stderr, "register_localized_collators() failed\n"); 27 + exit(1); 28 + } 29 + err = register_android_functions(p->db, 0); 30 + if (err != SQLITE_OK) { 31 + fprintf(stderr, "register_android_functions() failed\n"); 32 + exit(1); 33 + } 34 + #endif 35 + // End Android Add 36 + 37 if( p->openMode==SHELL_OPEN_ZIPFILE ){ 38 char *zSql = sqlite3_mprintf( 39 "CREATE VIRTUAL TABLE zip USING zipfile(%Q);", p->zDbFilename); 40 --- orig/sqlite3.c 2019-01-14 19:10:21.799582821 +0000 41 +++ sqlite3.c 2019-01-14 19:10:21.847582627 +0000 42 @@ -30672,6 +30672,10 @@ 43 # include <sys/mount.h> 44 #endif 45 46 +#if defined(__BIONIC__) 47 +# include <android/fdsan.h> 48 +#endif 49 + 50 #ifdef HAVE_UTIME 51 # include <utime.h> 52 #endif 53 @@ -31422,6 +31426,12 @@ 54 #if defined(FD_CLOEXEC) && (!defined(O_CLOEXEC) || O_CLOEXEC==0) 55 osFcntl(fd, F_SETFD, osFcntl(fd, F_GETFD, 0) | FD_CLOEXEC); 56 #endif 57 + 58 +#if defined(__BIONIC__) && __ANDROID_API__ >= __ANDROID_API_Q__ 59 + uint64_t tag = android_fdsan_create_owner_tag( 60 + ANDROID_FDSAN_OWNER_TYPE_SQLITE, fd); 61 + android_fdsan_exchange_owner_tag(fd, 0, tag); 62 +#endif 63 } 64 return fd; 65 } 66 @@ -31954,7 +31964,13 @@ 67 ** and move on. 68 */ 69 static void robust_close(unixFile *pFile, int h, int lineno){ 70 +#if defined(__BIONIC__) && __ANDROID_API__ >= __ANDROID_API_Q__ 71 + uint64_t tag = android_fdsan_create_owner_tag( 72 + ANDROID_FDSAN_OWNER_TYPE_SQLITE, h); 73 + if( android_fdsan_close_with_tag(h, tag) ){ 74 +#else 75 if( osClose(h) ){ 76 +#endif 77 unixLogErrorAtLine(SQLITE_IOERR_CLOSE, "close", 78 pFile ? pFile->zPath : 0, lineno); 79 } 80 @@ -34428,7 +34444,7 @@ 81 SimulateIOError( rc=1 ); 82 if( rc!=0 ){ 83 storeLastErrno((unixFile*)id, errno); 84 - return SQLITE_IOERR_FSTAT; 85 + return unixLogError(SQLITE_IOERR_FSTAT, "fstat", ((unixFile*)id)->zPath); 86 } 87 *pSize = buf.st_size; 88 89 @@ -34464,7 +34480,7 @@ 90 struct stat buf; /* Used to hold return values of fstat() */ 91 92 if( osFstat(pFile->h, &buf) ){ 93 - return SQLITE_IOERR_FSTAT; 94 + return unixLogError(SQLITE_IOERR_FSTAT, "fstat", pFile->zPath); 95 } 96 97 nSize = ((nByte+pFile->szChunk-1) / pFile->szChunk) * pFile->szChunk; 98 @@ -35139,7 +35155,7 @@ 99 ** with the same permissions. 100 */ 101 if( osFstat(pDbFd->h, &sStat) ){ 102 - rc = SQLITE_IOERR_FSTAT; 103 + rc = unixLogError(SQLITE_IOERR_FSTAT, "fstat", pDbFd->zPath); 104 goto shm_open_err; 105 } 106 107 @@ -118054,7 +118070,7 @@ 108 } 109 if( pDb->pSchema->file_format>SQLITE_MAX_FILE_FORMAT ){ 110 sqlite3SetString(pzErrMsg, db, "unsupported file format"); 111 - rc = SQLITE_ERROR; 112 + rc = SQLITE_CORRUPT_BKPT; // Android Change from "rc = SQLITE_ERROR;"; 113 goto initone_error_out; 114 } 115 116 @@ -152769,13 +152785,25 @@ 117 ** module with sqlite. 118 */ 119 if( SQLITE_OK==rc 120 +#ifndef ANDROID /* fts3_tokenizer disabled for security reasons */ 121 && SQLITE_OK==(rc = sqlite3Fts3InitHashTable(db, pHash, "fts3_tokenizer")) 122 +#endif 123 && SQLITE_OK==(rc = sqlite3_overload_function(db, "snippet", -1)) 124 && SQLITE_OK==(rc = sqlite3_overload_function(db, "offsets", 1)) 125 && SQLITE_OK==(rc = sqlite3_overload_function(db, "matchinfo", 1)) 126 && SQLITE_OK==(rc = sqlite3_overload_function(db, "matchinfo", 2)) 127 && SQLITE_OK==(rc = sqlite3_overload_function(db, "optimize", 1)) 128 ){ 129 +#ifdef SQLITE_ENABLE_FTS3_BACKWARDS 130 + rc = sqlite3_create_module_v2( 131 + db, "fts1", &fts3Module, (void *)pHash, 0 132 + ); 133 + if(rc) return rc; 134 + rc = sqlite3_create_module_v2( 135 + db, "fts2", &fts3Module, (void *)pHash, 0 136 + ); 137 + if(rc) return rc; 138 +#endif 139 rc = sqlite3_create_module_v2( 140 db, "fts3", &fts3Module, (void *)pHash, hashDestroy 141 ); 142