|
|
@@ -1152,7 +1152,7 @@ extern "C" {
|
|
|
*/
|
|
|
#define SQLITE_VERSION "3.24.0"
|
|
|
#define SQLITE_VERSION_NUMBER 3024000
|
|
|
-#define SQLITE_SOURCE_ID "2018-04-26 18:34:26 9fd0faf517993587d2f54212638545fc85fbbc84a031bcfae8c1e5894825alt1"
|
|
|
+#define SQLITE_SOURCE_ID "2018-04-28 19:08:02 08665a9e2e50a0a1e62529884cf65f8090debe89a306a3904b53268729abalt1"
|
|
|
|
|
|
/*
|
|
|
** CAPI3REF: Run-Time Library Version Numbers
|
|
|
@@ -3141,6 +3141,21 @@ struct sqlite3_mem_methods {
|
|
|
** 0 or 1 to indicate whether output-for-triggers has been disabled - 0 if
|
|
|
** it is not disabled, 1 if it is.
|
|
|
** </dd>
|
|
|
+**
|
|
|
+** <dt>SQLITE_DBCONFIG_RESET_DATABASE</dt>
|
|
|
+** <dd> Set the SQLITE_DBCONFIG_RESET_DATABASE flag and then run
|
|
|
+** [VACUUM] in order to reset a database back to an empty database
|
|
|
+** with no schema and no content. The following process works even for
|
|
|
+** a badly corrupted database file:
|
|
|
+** <ol>
|
|
|
+** <li> sqlite3_db_config(db, SQLITE_DBCONFIG_RESET_DATABASE, 1, 0);
|
|
|
+** <li> [sqlite3_exec](db, "[VACUUM]", 0, 0, 0);
|
|
|
+** <li> sqlite3_db_config(db, SQLITE_DBCONFIG_RESET_DATABASE, 0, 0);
|
|
|
+** </ol>
|
|
|
+** Because resetting a database is destructive and irreversible, the
|
|
|
+** process requires the use of this obscure API and multiple steps to help
|
|
|
+** ensure that it does not happen by accident.
|
|
|
+** </dd>
|
|
|
** </dl>
|
|
|
*/
|
|
|
#define SQLITE_DBCONFIG_MAINDBNAME 1000 /* const char* */
|
|
|
@@ -3152,7 +3167,8 @@ struct sqlite3_mem_methods {
|
|
|
#define SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE 1006 /* int int* */
|
|
|
#define SQLITE_DBCONFIG_ENABLE_QPSG 1007 /* int int* */
|
|
|
#define SQLITE_DBCONFIG_TRIGGER_EQP 1008 /* int int* */
|
|
|
-#define SQLITE_DBCONFIG_MAX 1008 /* Largest DBCONFIG */
|
|
|
+#define SQLITE_DBCONFIG_RESET_DATABASE 1009 /* int int* */
|
|
|
+#define SQLITE_DBCONFIG_MAX 1009 /* Largest DBCONFIG */
|
|
|
|
|
|
/*
|
|
|
** CAPI3REF: Enable Or Disable Extended Result Codes
|
|
|
@@ -6556,6 +6572,36 @@ SQLITE_API char *sqlite3_temp_directory;
|
|
|
*/
|
|
|
SQLITE_API char *sqlite3_data_directory;
|
|
|
|
|
|
+/*
|
|
|
+** CAPI3REF: Win32 Specific Interface
|
|
|
+**
|
|
|
+** These interfaces are available only on Windows. The
|
|
|
+** [sqlite3_win32_set_directory] interface is used to set the value associated
|
|
|
+** with the [sqlite3_temp_directory] or [sqlite3_data_directory] variable, to
|
|
|
+** zValue, depending on the value of the type parameter. The zValue parameter
|
|
|
+** should be NULL to cause the previous value to be freed via [sqlite3_free];
|
|
|
+** a non-NULL value will be copied into memory obtained from [sqlite3_malloc]
|
|
|
+** prior to being used. The [sqlite3_win32_set_directory] interface returns
|
|
|
+** [SQLITE_OK] to indicate success, [SQLITE_ERROR] if the type is unsupported,
|
|
|
+** or [SQLITE_NOMEM] if memory could not be allocated. The value of the
|
|
|
+** [sqlite3_data_directory] variable is intended to act as a replacement for
|
|
|
+** the current directory on the sub-platforms of Win32 where that concept is
|
|
|
+** not present, e.g. WinRT and UWP.
|
|
|
+*/
|
|
|
+SQLITE_API int sqlite3_win32_set_directory(
|
|
|
+ unsigned long type, /* Identifier for directory being set or reset */
|
|
|
+ void *zValue /* New value for directory being set or reset */
|
|
|
+);
|
|
|
+
|
|
|
+/*
|
|
|
+** CAPI3REF: Win32 Directory Types
|
|
|
+**
|
|
|
+** These macros are only available on Windows. They define the allowed values
|
|
|
+** for the type argument to the [sqlite3_win32_set_directory] interface.
|
|
|
+*/
|
|
|
+#define SQLITE_WIN32_DATA_DIRECTORY_TYPE 1
|
|
|
+#define SQLITE_WIN32_TEMP_DIRECTORY_TYPE 2
|
|
|
+
|
|
|
/*
|
|
|
** CAPI3REF: Test For Auto-Commit Mode
|
|
|
** KEYWORDS: {autocommit mode}
|
|
|
@@ -15844,6 +15890,7 @@ struct sqlite3 {
|
|
|
#define SQLITE_Fts3Tokenizer 0x00400000 /* Enable fts3_tokenizer(2) */
|
|
|
#define SQLITE_EnableQPSG 0x00800000 /* Query Planner Stability Guarantee*/
|
|
|
#define SQLITE_TriggerEQP 0x01000000 /* Show trigger EXPLAIN QUERY PLAN */
|
|
|
+#define SQLITE_ResetDatabase 0x02000000 /* Reset the database */
|
|
|
|
|
|
/* Flags used only if debugging */
|
|
|
#ifdef SQLITE_DEBUG
|
|
|
@@ -39848,22 +39895,6 @@ struct winVfsAppData {
|
|
|
# define SQLITE_WIN32_DBG_BUF_SIZE ((int)(4096-sizeof(DWORD)))
|
|
|
#endif
|
|
|
|
|
|
-/*
|
|
|
- * The value used with sqlite3_win32_set_directory() to specify that
|
|
|
- * the data directory should be changed.
|
|
|
- */
|
|
|
-#ifndef SQLITE_WIN32_DATA_DIRECTORY_TYPE
|
|
|
-# define SQLITE_WIN32_DATA_DIRECTORY_TYPE (1)
|
|
|
-#endif
|
|
|
-
|
|
|
-/*
|
|
|
- * The value used with sqlite3_win32_set_directory() to specify that
|
|
|
- * the temporary directory should be changed.
|
|
|
- */
|
|
|
-#ifndef SQLITE_WIN32_TEMP_DIRECTORY_TYPE
|
|
|
-# define SQLITE_WIN32_TEMP_DIRECTORY_TYPE (2)
|
|
|
-#endif
|
|
|
-
|
|
|
/*
|
|
|
* If compiled with SQLITE_WIN32_MALLOC on Windows, we will use the
|
|
|
* various Win32 API heap functions instead of our own.
|
|
|
@@ -41466,7 +41497,10 @@ SQLITE_API char *sqlite3_win32_utf8_to_mbcs_v2(const char *zText, int useAnsi){
|
|
|
** argument is the name of the directory to use. The return value will be
|
|
|
** SQLITE_OK if successful.
|
|
|
*/
|
|
|
-SQLITE_API int sqlite3_win32_set_directory(DWORD type, LPCWSTR zValue){
|
|
|
+SQLITE_API int sqlite3_win32_set_directory(
|
|
|
+ unsigned long type, /* Identifier for directory being set or reset */
|
|
|
+ void *zValue /* New value for directory being set or reset */
|
|
|
+){
|
|
|
char **ppDirectory = 0;
|
|
|
#ifndef SQLITE_OMIT_AUTOINIT
|
|
|
int rc = sqlite3_initialize();
|
|
|
@@ -41482,9 +41516,10 @@ SQLITE_API int sqlite3_win32_set_directory(DWORD type, LPCWSTR zValue){
|
|
|
);
|
|
|
assert( !ppDirectory || sqlite3MemdebugHasType(*ppDirectory, MEMTYPE_HEAP) );
|
|
|
if( ppDirectory ){
|
|
|
+ LPCWSTR zStrValue = zValue;
|
|
|
char *zValueUtf8 = 0;
|
|
|
- if( zValue && zValue[0] ){
|
|
|
- zValueUtf8 = winUnicodeToUtf8(zValue);
|
|
|
+ if( zStrValue && zStrValue[0] ){
|
|
|
+ zValueUtf8 = winUnicodeToUtf8(zStrValue);
|
|
|
if ( zValueUtf8==0 ){
|
|
|
return SQLITE_NOMEM_BKPT;
|
|
|
}
|
|
|
@@ -64876,6 +64911,10 @@ static void setDefaultSyncFlag(BtShared *pBt, u8 safety_level){
|
|
|
# define setDefaultSyncFlag(pBt,safety_level)
|
|
|
#endif
|
|
|
|
|
|
+/* Forward declaration */
|
|
|
+static int newDatabase(BtShared*);
|
|
|
+
|
|
|
+
|
|
|
/*
|
|
|
** Get a reference to pPage1 of the database file. This will
|
|
|
** also acquire a readlock on that file.
|
|
|
@@ -64907,6 +64946,9 @@ static int lockBtree(BtShared *pBt){
|
|
|
if( nPage==0 || memcmp(24+(u8*)pPage1->aData, 92+(u8*)pPage1->aData,4)!=0 ){
|
|
|
nPage = nPageFile;
|
|
|
}
|
|
|
+ if( (pBt->db->flags & SQLITE_ResetDatabase)!=0 ){
|
|
|
+ nPage = 0;
|
|
|
+ }
|
|
|
if( nPage>0 ){
|
|
|
u32 pageSize;
|
|
|
u32 usableSize;
|
|
|
@@ -97925,6 +97967,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+expr_code_doover:
|
|
|
if( pExpr==0 ){
|
|
|
op = TK_NULL;
|
|
|
}else{
|
|
|
@@ -98385,7 +98428,8 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target)
|
|
|
case TK_SPAN:
|
|
|
case TK_COLLATE:
|
|
|
case TK_UPLUS: {
|
|
|
- return sqlite3ExprCodeTarget(pParse, pExpr->pLeft, target);
|
|
|
+ pExpr = pExpr->pLeft;
|
|
|
+ goto expr_code_doover;
|
|
|
}
|
|
|
|
|
|
case TK_TRIGGER: {
|
|
|
@@ -120251,6 +120295,9 @@ static int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg){
|
|
|
for(i=0; i<ArraySize(meta); i++){
|
|
|
sqlite3BtreeGetMeta(pDb->pBt, i+1, (u32 *)&meta[i]);
|
|
|
}
|
|
|
+ if( (db->flags & SQLITE_ResetDatabase)!=0 ){
|
|
|
+ memset(meta, 0, sizeof(meta));
|
|
|
+ }
|
|
|
pDb->pSchema->schema_cookie = meta[BTREE_SCHEMA_VERSION-1];
|
|
|
|
|
|
/* If opening a non-empty database, check the text encoding. For the
|
|
|
@@ -147187,6 +147234,7 @@ SQLITE_API int sqlite3_db_config(sqlite3 *db, int op, ...){
|
|
|
{ SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE, SQLITE_NoCkptOnClose },
|
|
|
{ SQLITE_DBCONFIG_ENABLE_QPSG, SQLITE_EnableQPSG },
|
|
|
{ SQLITE_DBCONFIG_TRIGGER_EQP, SQLITE_TriggerEQP },
|
|
|
+ { SQLITE_DBCONFIG_RESET_DATABASE, SQLITE_ResetDatabase },
|
|
|
};
|
|
|
unsigned int i;
|
|
|
rc = SQLITE_ERROR; /* IMP: R-42790-23372 */
|
|
|
@@ -153276,7 +153324,7 @@ SQLITE_PRIVATE int sqlite3Fts3ExprParse(sqlite3_tokenizer *, int,
|
|
|
);
|
|
|
SQLITE_PRIVATE void sqlite3Fts3ExprFree(Fts3Expr *);
|
|
|
#ifdef SQLITE_TEST
|
|
|
-SQLITE_PRIVATE int sqlite3Fts3ExprInitTestInterface(sqlite3 *db);
|
|
|
+SQLITE_PRIVATE int sqlite3Fts3ExprInitTestInterface(sqlite3 *db, Fts3Hash*);
|
|
|
SQLITE_PRIVATE int sqlite3Fts3InitTerm(sqlite3 *db);
|
|
|
#endif
|
|
|
|
|
|
@@ -156990,7 +157038,7 @@ SQLITE_PRIVATE int sqlite3Fts3Init(sqlite3 *db){
|
|
|
|
|
|
#ifdef SQLITE_TEST
|
|
|
if( rc==SQLITE_OK ){
|
|
|
- rc = sqlite3Fts3ExprInitTestInterface(db);
|
|
|
+ rc = sqlite3Fts3ExprInitTestInterface(db, pHash);
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
@@ -160650,34 +160698,6 @@ SQLITE_PRIVATE void sqlite3Fts3ExprFree(Fts3Expr *pDel){
|
|
|
|
|
|
/* #include <stdio.h> */
|
|
|
|
|
|
-/*
|
|
|
-** Function to query the hash-table of tokenizers (see README.tokenizers).
|
|
|
-*/
|
|
|
-static int queryTestTokenizer(
|
|
|
- sqlite3 *db,
|
|
|
- const char *zName,
|
|
|
- const sqlite3_tokenizer_module **pp
|
|
|
-){
|
|
|
- int rc;
|
|
|
- sqlite3_stmt *pStmt;
|
|
|
- const char zSql[] = "SELECT fts3_tokenizer(?)";
|
|
|
-
|
|
|
- *pp = 0;
|
|
|
- rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
|
|
|
- if( rc!=SQLITE_OK ){
|
|
|
- return rc;
|
|
|
- }
|
|
|
-
|
|
|
- sqlite3_bind_text(pStmt, 1, zName, -1, SQLITE_STATIC);
|
|
|
- if( SQLITE_ROW==sqlite3_step(pStmt) ){
|
|
|
- if( sqlite3_column_type(pStmt, 0)==SQLITE_BLOB ){
|
|
|
- memcpy((void *)pp, sqlite3_column_blob(pStmt, 0), sizeof(*pp));
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- return sqlite3_finalize(pStmt);
|
|
|
-}
|
|
|
-
|
|
|
/*
|
|
|
** Return a pointer to a buffer containing a text representation of the
|
|
|
** expression passed as the first argument. The buffer is obtained from
|
|
|
@@ -160745,12 +160765,12 @@ static char *exprToString(Fts3Expr *pExpr, char *zBuf){
|
|
|
**
|
|
|
** SELECT fts3_exprtest('simple', 'Bill col2:Bloggs', 'col1', 'col2');
|
|
|
*/
|
|
|
-static void fts3ExprTest(
|
|
|
+static void fts3ExprTestCommon(
|
|
|
+ int bRebalance,
|
|
|
sqlite3_context *context,
|
|
|
int argc,
|
|
|
sqlite3_value **argv
|
|
|
){
|
|
|
- sqlite3_tokenizer_module const *pModule = 0;
|
|
|
sqlite3_tokenizer *pTokenizer = 0;
|
|
|
int rc;
|
|
|
char **azCol = 0;
|
|
|
@@ -160760,7 +160780,9 @@ static void fts3ExprTest(
|
|
|
int ii;
|
|
|
Fts3Expr *pExpr;
|
|
|
char *zBuf = 0;
|
|
|
- sqlite3 *db = sqlite3_context_db_handle(context);
|
|
|
+ Fts3Hash *pHash = (Fts3Hash*)sqlite3_user_data(context);
|
|
|
+ const char *zTokenizer = 0;
|
|
|
+ char *zErr = 0;
|
|
|
|
|
|
if( argc<3 ){
|
|
|
sqlite3_result_error(context,
|
|
|
@@ -160769,23 +160791,17 @@ static void fts3ExprTest(
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- rc = queryTestTokenizer(db,
|
|
|
- (const char *)sqlite3_value_text(argv[0]), &pModule);
|
|
|
- if( rc==SQLITE_NOMEM ){
|
|
|
- sqlite3_result_error_nomem(context);
|
|
|
- goto exprtest_out;
|
|
|
- }else if( !pModule ){
|
|
|
- sqlite3_result_error(context, "No such tokenizer module", -1);
|
|
|
- goto exprtest_out;
|
|
|
- }
|
|
|
-
|
|
|
- rc = pModule->xCreate(0, 0, &pTokenizer);
|
|
|
- assert( rc==SQLITE_NOMEM || rc==SQLITE_OK );
|
|
|
- if( rc==SQLITE_NOMEM ){
|
|
|
- sqlite3_result_error_nomem(context);
|
|
|
- goto exprtest_out;
|
|
|
+ zTokenizer = (const char*)sqlite3_value_text(argv[0]);
|
|
|
+ rc = sqlite3Fts3InitTokenizer(pHash, zTokenizer, &pTokenizer, &zErr);
|
|
|
+ if( rc!=SQLITE_OK ){
|
|
|
+ if( rc==SQLITE_NOMEM ){
|
|
|
+ sqlite3_result_error_nomem(context);
|
|
|
+ }else{
|
|
|
+ sqlite3_result_error(context, zErr, -1);
|
|
|
+ }
|
|
|
+ sqlite3_free(zErr);
|
|
|
+ return;
|
|
|
}
|
|
|
- pTokenizer->pModule = pModule;
|
|
|
|
|
|
zExpr = (const char *)sqlite3_value_text(argv[1]);
|
|
|
nExpr = sqlite3_value_bytes(argv[1]);
|
|
|
@@ -160799,7 +160815,7 @@ static void fts3ExprTest(
|
|
|
azCol[ii] = (char *)sqlite3_value_text(argv[ii+2]);
|
|
|
}
|
|
|
|
|
|
- if( sqlite3_user_data(context) ){
|
|
|
+ if( bRebalance ){
|
|
|
char *zDummy = 0;
|
|
|
rc = sqlite3Fts3ExprParse(
|
|
|
pTokenizer, 0, azCol, 0, nCol, nCol, zExpr, nExpr, &pExpr, &zDummy
|
|
|
@@ -160825,23 +160841,38 @@ static void fts3ExprTest(
|
|
|
sqlite3Fts3ExprFree(pExpr);
|
|
|
|
|
|
exprtest_out:
|
|
|
- if( pModule && pTokenizer ){
|
|
|
- rc = pModule->xDestroy(pTokenizer);
|
|
|
+ if( pTokenizer ){
|
|
|
+ rc = pTokenizer->pModule->xDestroy(pTokenizer);
|
|
|
}
|
|
|
sqlite3_free(azCol);
|
|
|
}
|
|
|
|
|
|
+static void fts3ExprTest(
|
|
|
+ sqlite3_context *context,
|
|
|
+ int argc,
|
|
|
+ sqlite3_value **argv
|
|
|
+){
|
|
|
+ fts3ExprTestCommon(0, context, argc, argv);
|
|
|
+}
|
|
|
+static void fts3ExprTestRebalance(
|
|
|
+ sqlite3_context *context,
|
|
|
+ int argc,
|
|
|
+ sqlite3_value **argv
|
|
|
+){
|
|
|
+ fts3ExprTestCommon(1, context, argc, argv);
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
** Register the query expression parser test function fts3_exprtest()
|
|
|
** with database connection db.
|
|
|
*/
|
|
|
-SQLITE_PRIVATE int sqlite3Fts3ExprInitTestInterface(sqlite3* db){
|
|
|
+SQLITE_PRIVATE int sqlite3Fts3ExprInitTestInterface(sqlite3 *db, Fts3Hash *pHash){
|
|
|
int rc = sqlite3_create_function(
|
|
|
- db, "fts3_exprtest", -1, SQLITE_UTF8, 0, fts3ExprTest, 0, 0
|
|
|
+ db, "fts3_exprtest", -1, SQLITE_UTF8, (void*)pHash, fts3ExprTest, 0, 0
|
|
|
);
|
|
|
if( rc==SQLITE_OK ){
|
|
|
rc = sqlite3_create_function(db, "fts3_exprtest_rebalance",
|
|
|
- -1, SQLITE_UTF8, (void *)1, fts3ExprTest, 0, 0
|
|
|
+ -1, SQLITE_UTF8, (void*)pHash, fts3ExprTestRebalance, 0, 0
|
|
|
);
|
|
|
}
|
|
|
return rc;
|
|
|
@@ -177440,6 +177471,10 @@ SQLITE_API void sqlite3rbu_destroy_vfs(const char *zName);
|
|
|
**
|
|
|
** RBU_STATE_OALSZ:
|
|
|
** Valid if STAGE==1. The size in bytes of the *-oal file.
|
|
|
+**
|
|
|
+** RBU_STATE_DATATBL:
|
|
|
+** Only valid if STAGE==1. The RBU database name of the table
|
|
|
+** currently being read.
|
|
|
*/
|
|
|
#define RBU_STATE_STAGE 1
|
|
|
#define RBU_STATE_TBL 2
|
|
|
@@ -177450,6 +177485,7 @@ SQLITE_API void sqlite3rbu_destroy_vfs(const char *zName);
|
|
|
#define RBU_STATE_COOKIE 7
|
|
|
#define RBU_STATE_OALSZ 8
|
|
|
#define RBU_STATE_PHASEONESTEP 9
|
|
|
+#define RBU_STATE_DATATBL 10
|
|
|
|
|
|
#define RBU_STAGE_OAL 1
|
|
|
#define RBU_STAGE_MOVE 2
|
|
|
@@ -177492,6 +177528,7 @@ typedef sqlite3_int64 i64;
|
|
|
struct RbuState {
|
|
|
int eStage;
|
|
|
char *zTbl;
|
|
|
+ char *zDataTbl;
|
|
|
char *zIdx;
|
|
|
i64 iWalCksum;
|
|
|
int nRow;
|
|
|
@@ -179555,6 +179592,7 @@ static sqlite3 *rbuOpenDbhandle(
|
|
|
static void rbuFreeState(RbuState *p){
|
|
|
if( p ){
|
|
|
sqlite3_free(p->zTbl);
|
|
|
+ sqlite3_free(p->zDataTbl);
|
|
|
sqlite3_free(p->zIdx);
|
|
|
sqlite3_free(p);
|
|
|
}
|
|
|
@@ -179625,6 +179663,10 @@ static RbuState *rbuLoadState(sqlite3rbu *p){
|
|
|
pRet->nPhaseOneStep = sqlite3_column_int64(pStmt, 1);
|
|
|
break;
|
|
|
|
|
|
+ case RBU_STATE_DATATBL:
|
|
|
+ pRet->zDataTbl = rbuStrndup((char*)sqlite3_column_text(pStmt, 1), &rc);
|
|
|
+ break;
|
|
|
+
|
|
|
default:
|
|
|
rc = SQLITE_CORRUPT;
|
|
|
break;
|
|
|
@@ -180399,7 +180441,8 @@ static void rbuSaveState(sqlite3rbu *p, int eStage){
|
|
|
"(%d, %lld), "
|
|
|
"(%d, %lld), "
|
|
|
"(%d, %lld), "
|
|
|
- "(%d, %lld) ",
|
|
|
+ "(%d, %lld), "
|
|
|
+ "(%d, %Q) ",
|
|
|
p->zStateDb,
|
|
|
RBU_STATE_STAGE, eStage,
|
|
|
RBU_STATE_TBL, p->objiter.zTbl,
|
|
|
@@ -180409,7 +180452,8 @@ static void rbuSaveState(sqlite3rbu *p, int eStage){
|
|
|
RBU_STATE_CKPT, p->iWalCksum,
|
|
|
RBU_STATE_COOKIE, (i64)pFd->iCookie,
|
|
|
RBU_STATE_OALSZ, p->iOalSz,
|
|
|
- RBU_STATE_PHASEONESTEP, p->nPhaseOneStep
|
|
|
+ RBU_STATE_PHASEONESTEP, p->nPhaseOneStep,
|
|
|
+ RBU_STATE_DATATBL, p->objiter.zDataTbl
|
|
|
)
|
|
|
);
|
|
|
assert( pInsert==0 || rc==SQLITE_OK );
|
|
|
@@ -180665,7 +180709,8 @@ static void rbuSetupOal(sqlite3rbu *p, RbuState *pState){
|
|
|
|
|
|
while( rc==SQLITE_OK && pIter->zTbl && (pIter->bCleanup
|
|
|
|| rbuStrCompare(pIter->zIdx, pState->zIdx)
|
|
|
- || rbuStrCompare(pIter->zTbl, pState->zTbl)
|
|
|
+ || (pState->zDataTbl==0 && rbuStrCompare(pIter->zTbl, pState->zTbl))
|
|
|
+ || (pState->zDataTbl && rbuStrCompare(pIter->zDataTbl, pState->zDataTbl))
|
|
|
)){
|
|
|
rc = rbuObjIterNext(p, pIter);
|
|
|
}
|
|
|
@@ -218790,7 +218835,7 @@ struct SHA1Context {
|
|
|
};
|
|
|
|
|
|
|
|
|
-#if __GNUC__ && (defined(__i386__) || defined(__x86_64__))
|
|
|
+#if __GNUC__ && (defined(__i386__) || defined(__x86_64__)) && !defined(OLD_GCC)
|
|
|
/*
|
|
|
* GCC by itself only generates left rotates. Use right rotates if
|
|
|
* possible to be kinder to dinky implementations with iterative rotate
|
|
|
@@ -222454,9 +222499,9 @@ static void print_elem(void *e, sqlite_int64 c, void* p){
|
|
|
#endif
|
|
|
|
|
|
/************** End of extension-functions.c *********************************/
|
|
|
-#if __LINE__!=222457
|
|
|
+#if __LINE__!=222502
|
|
|
#undef SQLITE_SOURCE_ID
|
|
|
-#define SQLITE_SOURCE_ID "2018-04-26 18:34:26 9fd0faf517993587d2f54212638545fc85fbbc84a031bcfae8c1e5894825alt2"
|
|
|
+#define SQLITE_SOURCE_ID "2018-04-28 19:08:02 08665a9e2e50a0a1e62529884cf65f8090debe89a306a3904b53268729abalt2"
|
|
|
#endif
|
|
|
/* Return the source-id for this library */
|
|
|
SQLITE_API const char *sqlite3_sourceid(void){ return SQLITE_SOURCE_ID; }
|