aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordrh <drh@noemail.net>2019-04-04 14:00:23 +0000
committerdrh <drh@noemail.net>2019-04-04 14:00:23 +0000
commit4e61e88348693cde472989b3dc1a06b5ff9dd9c0 (patch)
tree38f6b0bc3cb5e81365fe2938e5964a0ac07e9a17 /src
parentb92d7d264ea0b811267a91b0ece3e7170bd57d6a (diff)
downloadsqlite-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.c2
-rw-r--r--src/sqliteInt.h3
-rw-r--r--src/vacuum.c7
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