aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordrh <drh@noemail.net>2013-08-17 15:42:29 +0000
committerdrh <drh@noemail.net>2013-08-17 15:42:29 +0000
commitd3605a4f205da7d50bccdec50ee6f8af3be56a42 (patch)
tree38489c686ca46735a722cee9917f1cf9dadbdc10 /src
parentd4b5c60eca0969b900ff4855904d396f32a4e8bb (diff)
downloadsqlite-d3605a4f205da7d50bccdec50ee6f8af3be56a42.tar.gz
sqlite-d3605a4f205da7d50bccdec50ee6f8af3be56a42.zip
The fullfsync, checkpoint_fullfsync, and cache_spill pragmas apply to all
files of a database connection, including those opened by future ATTACH statements. FossilOrigin-Name: d07c4331a28d44deca1ece8a34118f5b121b3ee2
Diffstat (limited to 'src')
-rw-r--r--src/attach.c1
-rw-r--r--src/pragma.c48
2 files changed, 31 insertions, 18 deletions
diff --git a/src/attach.c b/src/attach.c
index b8e12199b..87c15ae3d 100644
--- a/src/attach.c
+++ b/src/attach.c
@@ -158,6 +158,7 @@ static void attachFunc(
sqlite3PagerLockingMode(pPager, db->dfltLockMode);
sqlite3BtreeSecureDelete(aNew->pBt,
sqlite3BtreeSecureDelete(db->aDb[0].pBt,-1) );
+ sqlite3BtreeSetPagerFlags(aNew->pBt, 3 | (db->flags & PAGER_FLAGS_MASK));
}
aNew->safety_level = 3;
aNew->zName = sqlite3DbStrDup(db, zName);
diff --git a/src/pragma.c b/src/pragma.c
index 4a0c2b018..f0f7b5b66 100644
--- a/src/pragma.c
+++ b/src/pragma.c
@@ -158,6 +158,34 @@ static void returnSingleInt(Parse *pParse, const char *zLabel, i64 value){
sqlite3VdbeAddOp2(v, OP_ResultRow, mem, 1);
}
+
+/*
+** Set the safety_level and pager flags for pager iDb. Or if iDb<0
+** set these values for all pagers.
+*/
+#ifndef SQLITE_OMIT_PAGER_PRAGMAS
+static void setAllPagerFlags(sqlite3 *db){
+ if( db->autoCommit ){
+ Db *pDb = db->aDb;
+ int n = db->nDb;
+ assert( SQLITE_FullFSync==PAGER_FULLFSYNC );
+ assert( SQLITE_CkptFullFSync==PAGER_CKPT_FULLFSYNC );
+ assert( SQLITE_CacheSpill==PAGER_CACHESPILL );
+ assert( (PAGER_FULLFSYNC | PAGER_CKPT_FULLFSYNC | PAGER_CACHESPILL)
+ == PAGER_FLAGS_MASK );
+ assert( (pDb->safety_level & PAGER_SYNCHRONOUS_MASK)==pDb->safety_level );
+ while( (n--) > 0 ){
+ if( pDb->pBt ){
+ sqlite3BtreeSetPagerFlags(pDb->pBt,
+ pDb->safety_level | (db->flags & PAGER_FLAGS_MASK) );
+ }
+ pDb++;
+ }
+ }
+}
+#endif
+
+
#ifndef SQLITE_OMIT_FLAG_PRAGMAS
/*
** Check to see if zRight and zLeft refer to a pragma that queries
@@ -967,6 +995,7 @@ void sqlite3Pragma(
"Safety level may not be changed inside a transaction");
}else{
pDb->safety_level = getSafetyLevel(zRight,0,1)+1;
+ setAllPagerFlags(db);
}
}
}else
@@ -974,8 +1003,7 @@ void sqlite3Pragma(
#ifndef SQLITE_OMIT_FLAG_PRAGMAS
if( flagPragma(pParse, zLeft, zRight) ){
- /* The flagPragma() subroutine also generates any necessary code
- ** there is nothing more to do here */
+ setAllPagerFlags(db);
}else
#endif /* SQLITE_OMIT_FLAG_PRAGMAS */
@@ -1806,22 +1834,6 @@ void sqlite3Pragma(
{/* Empty ELSE clause */}
- /*
- ** Reset the safety level, in case the fullfsync flag or synchronous
- ** setting changed.
- */
-#ifndef SQLITE_OMIT_PAGER_PRAGMAS
- if( db->autoCommit ){
- assert( (pDb->safety_level & PAGER_SYNCHRONOUS_MASK)==pDb->safety_level );
- assert( SQLITE_FullFSync==PAGER_FULLFSYNC );
- assert( SQLITE_CkptFullFSync==PAGER_CKPT_FULLFSYNC );
- assert( SQLITE_CacheSpill==PAGER_CACHESPILL );
- assert( (PAGER_FULLFSYNC | PAGER_CKPT_FULLFSYNC | PAGER_CACHESPILL)
- == PAGER_FLAGS_MASK );
- sqlite3BtreeSetPagerFlags(pDb->pBt,
- pDb->safety_level | (db->flags & PAGER_FLAGS_MASK) );
- }
-#endif
pragma_out:
sqlite3DbFree(db, zLeft);
sqlite3DbFree(db, zRight);