| --- orig/shell.c 2024-03-25 15:44:27.700300649 -0700 |
| +++ shell.c 2024-03-25 15:44:27.724300598 -0700 |
| @@ -127,6 +127,11 @@ |
| #endif |
| #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> |
| @@ -22266,6 +22271,21 @@ |
| editFunc, 0, 0); |
| #endif |
| |
| +// Begin Android Add |
| +#ifndef NO_ANDROID_FUNCS |
| + 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);", zDbFilename); |
| --- orig/sqlite3.c 2024-03-25 15:44:27.708300632 -0700 |
| +++ sqlite3.c 2024-03-25 15:44:27.748300548 -0700 |
| @@ -38035,6 +38035,10 @@ |
| # include <sys/mount.h> |
| #endif |
| |
| +#if defined(__BIONIC__) |
| +# include <android/fdsan.h> |
| +#endif |
| + |
| #ifdef HAVE_UTIME |
| # include <utime.h> |
| #endif |
| @@ -38643,6 +38647,12 @@ |
| #if defined(FD_CLOEXEC) && (!defined(O_CLOEXEC) || O_CLOEXEC==0) |
| osFcntl(fd, F_SETFD, osFcntl(fd, F_GETFD, 0) | FD_CLOEXEC); |
| #endif |
| + |
| +#if defined(__BIONIC__) && __ANDROID_API__ >= __ANDROID_API_Q__ |
| + uint64_t tag = android_fdsan_create_owner_tag( |
| + ANDROID_FDSAN_OWNER_TYPE_SQLITE, fd); |
| + android_fdsan_exchange_owner_tag(fd, 0, tag); |
| +#endif |
| } |
| return fd; |
| } |
| @@ -39223,7 +39233,13 @@ |
| ** and move on. |
| */ |
| static void robust_close(unixFile *pFile, int h, int lineno){ |
| +#if defined(__BIONIC__) && __ANDROID_API__ >= __ANDROID_API_Q__ |
| + uint64_t tag = android_fdsan_create_owner_tag( |
| + ANDROID_FDSAN_OWNER_TYPE_SQLITE, h); |
| + if( android_fdsan_close_with_tag(h, tag) ){ |
| +#else |
| if( osClose(h) ){ |
| +#endif |
| unixLogErrorAtLine(SQLITE_IOERR_CLOSE, "close", |
| pFile ? pFile->zPath : 0, lineno); |
| } |
| @@ -41763,7 +41779,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; |
| |
| @@ -41799,7 +41815,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; |
| @@ -42541,7 +42557,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; |
| } |
| |
| @@ -140715,7 +140731,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; |
| } |
| |
| @@ -188307,7 +188323,9 @@ |
| ** module with sqlite. |
| */ |
| if( SQLITE_OK==rc |
| +#ifndef ANDROID /* fts3_tokenizer disabled for security reasons */ |
| && SQLITE_OK==(rc=sqlite3Fts3InitHashTable(db,&pHash->hash,"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)) |
| @@ -188318,6 +188336,20 @@ |
| rc = sqlite3_create_module_v2( |
| db, "fts3", &fts3Module, (void *)pHash, hashDestroy |
| ); |
| +#ifdef SQLITE_ENABLE_FTS3_BACKWARDS |
| + if( rc==SQLITE_OK ){ |
| + pHash->nRef++; |
| + rc = sqlite3_create_module_v2( |
| + db, "fts1", &fts3Module, (void *)pHash, hashDestroy |
| + ); |
| + } |
| + if( rc==SQLITE_OK ){ |
| + pHash->nRef++; |
| + rc = sqlite3_create_module_v2( |
| + db, "fts2", &fts3Module, (void *)pHash, hashDestroy |
| + ); |
| + } |
| +#endif |
| if( rc==SQLITE_OK ){ |
| pHash->nRef++; |
| rc = sqlite3_create_module_v2( |