diff options
author | drh <drh@noemail.net> | 2019-04-04 14:00:23 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2019-04-04 14:00:23 +0000 |
commit | 4e61e88348693cde472989b3dc1a06b5ff9dd9c0 (patch) | |
tree | 38f6b0bc3cb5e81365fe2938e5964a0ac07e9a17 /src | |
parent | b92d7d264ea0b811267a91b0ece3e7170bd57d6a (diff) | |
download | sqlite-4e61e88348693cde472989b3dc1a06b5ff9dd9c0.tar.gz sqlite-4e61e88348693cde472989b3dc1a06b5ff9dd9c0.zip |
Only preserve rowid values for VACUUM INTO. Keep the legacy behavior of
renumbering rowids for ordinary VACUUM.
FossilOrigin-Name: 13a0ea6466b051ea5281865ed5285b8b5a99ec4307f400c5f7b03692723f1cd1
Diffstat (limited to 'src')
-rw-r--r-- | src/insert.c | 2 | ||||
-rw-r--r-- | src/sqliteInt.h | 3 | ||||
-rw-r--r-- | src/vacuum.c | 7 |
3 files changed, 7 insertions, 5 deletions
diff --git a/src/insert.c b/src/insert.c index a68db1a1d..b3535b22a 100644 --- a/src/insert.c +++ b/src/insert.c @@ -2352,7 +2352,7 @@ static int xferOptimization( sqlite3RowidConstraint(pParse, onError, pDest); sqlite3VdbeJumpHere(v, addr2); autoIncStep(pParse, regAutoinc, regRowid); - }else if( pDest->pIndex==0 && !(db->mDbFlags & DBFLAG_Vacuum) ){ + }else if( pDest->pIndex==0 && !(db->mDbFlags & DBFLAG_VacuumInto) ){ addr1 = sqlite3VdbeAddOp2(v, OP_NewRowid, iDest, regRowid); }else{ addr1 = sqlite3VdbeAddOp2(v, OP_Rowid, iSrc, regRowid); diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 7a98ee7d0..ee3a7c552 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1565,7 +1565,8 @@ struct sqlite3 { #define DBFLAG_SchemaChange 0x0001 /* Uncommitted Hash table changes */ #define DBFLAG_PreferBuiltin 0x0002 /* Preference to built-in funcs */ #define DBFLAG_Vacuum 0x0004 /* Currently in a VACUUM */ -#define DBFLAG_SchemaKnownOk 0x0008 /* Schema is known to be valid */ +#define DBFLAG_VacuumInto 0x0008 /* Currently running VACUUM INTO */ +#define DBFLAG_SchemaKnownOk 0x0010 /* Schema is known to be valid */ /* ** Bits of the sqlite3.dbOptFlags field that are used by the diff --git a/src/vacuum.c b/src/vacuum.c index 1dbd10076..6ba87e53e 100644 --- a/src/vacuum.c +++ b/src/vacuum.c @@ -170,6 +170,7 @@ int sqlite3RunVacuum( return SQLITE_ERROR; } saved_openFlags = db->openFlags; + saved_mDbFlags = db->mDbFlags; if( pOut ){ if( sqlite3_value_type(pOut)!=SQLITE_TEXT ){ sqlite3SetString(pzErrMsg, db, "non-text filename"); @@ -178,20 +179,20 @@ int sqlite3RunVacuum( zOut = (const char*)sqlite3_value_text(pOut); db->openFlags &= ~SQLITE_OPEN_READONLY; db->openFlags |= SQLITE_OPEN_CREATE|SQLITE_OPEN_READWRITE; + db->mDbFlags |= DBFLAG_PreferBuiltin | DBFLAG_Vacuum | DBFLAG_VacuumInto; }else{ zOut = ""; + db->mDbFlags |= DBFLAG_PreferBuiltin | DBFLAG_Vacuum; } /* Save the current value of the database flags so that it can be ** restored before returning. Then set the writable-schema flag, and ** disable CHECK and foreign key constraints. */ saved_flags = db->flags; - saved_mDbFlags = db->mDbFlags; saved_nChange = db->nChange; saved_nTotalChange = db->nTotalChange; saved_mTrace = db->mTrace; db->flags |= SQLITE_WriteSchema | SQLITE_IgnoreChecks; - db->mDbFlags |= DBFLAG_PreferBuiltin | DBFLAG_Vacuum; db->flags &= ~(u64)(SQLITE_ForeignKeys | SQLITE_ReverseOrder | SQLITE_Defensive | SQLITE_CountRows); db->mTrace = 0; @@ -307,7 +308,7 @@ int sqlite3RunVacuum( zDbMain ); assert( (db->mDbFlags & DBFLAG_Vacuum)!=0 ); - db->mDbFlags &= ~DBFLAG_Vacuum; + db->mDbFlags &= ~(DBFLAG_Vacuum|DBFLAG_VacuumInto); if( rc!=SQLITE_OK ) goto end_of_vacuum; /* Copy the triggers, views, and virtual tables from the main database |