]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add the SQLITE_DBCONFIG_REQUIRE_TXN argument for sqlite3_dbconfig() which when
authordrh <drh@noemail.net>
Tue, 5 Apr 2016 17:50:36 +0000 (17:50 +0000)
committerdrh <drh@noemail.net>
Tue, 5 Apr 2016 17:50:36 +0000 (17:50 +0000)
set requires an explicit transaction before updating the database.

FossilOrigin-Name: b7570ac14df0b799569070c7400904040d30d4cc

manifest
manifest.uuid
src/main.c
src/sqlite.h.in
src/sqliteInt.h
src/vdbe.c

index 9328401ca9f1d68e2933d807185981b3f81445fc..20b5e8311cfa8d1fbe572ba9fd773ba99305a2d2 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Incorrect\sversion\sof\sbuild.c\schecked\sin\sat\s[87e5f5a6c60e3]\s(because\sI\nneglected\sto\spress\sthe\s"Save"\sbutton\son\sthe\stext\seditor).\s\sThere\sis\sno\schange\nto\sthe\slogic,\sjust\simproved\spresentation.
-D 2016-04-05T15:59:23.006
+C Add\sthe\sSQLITE_DBCONFIG_REQUIRE_TXN\sargument\sfor\ssqlite3_dbconfig()\swhich\swhen\nset\srequires\san\sexplicit\stransaction\sbefore\supdating\sthe\sdatabase.
+D 2016-04-05T17:50:36.562
 F Makefile.in e812bb732d7af01baa09f1278bd4f4a2e3a09449
 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
 F Makefile.msc fe57d7e3e74fa383fd01ced796c0ffd966fc094a
@@ -340,7 +340,7 @@ F src/hwtime.h d32741c8f4df852c7d959236615444e2b1063b08
 F src/insert.c 8f4e9fcbd8e95e85f15647ba8b413b18d556ec2b
 F src/legacy.c 75d3023be8f0d2b99d60f905090341a03358c58e
 F src/loadext.c e70f8f9e97624a232870ea5486e682c813ac3002
-F src/main.c 5ac9dccc03faadd6f867f67b9018ff41eeeadb46
+F src/main.c 1e93cbb15727492cfa1f3d4a8b66b76fa2b7d998
 F src/malloc.c 1443d1ad95d67c21d77af7ae3f44678252f0efec
 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
 F src/mem1.c 6919bcf12f221868ea066eec27e579fed95ce98b
@@ -377,10 +377,10 @@ F src/resolve.c b8f7174e5f8c33c44ded3a25a973d0bb89228c20
 F src/rowset.c 9fe4b3ad7cc00944386bb600233d8f523de07a6e
 F src/select.c 7849cee0a01952a9c93cd28989daedfa57731143
 F src/shell.c b7922fa264f8c8d72a5ec6dd0b091e15a93c4de5
-F src/sqlite.h.in 7f437b068314f053e6417d452c59f08d05092591
+F src/sqlite.h.in a3577257d45892fa2799ae9996ba24705f5a8b21
 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
 F src/sqlite3ext.h 98f72cbfe00169c39089115427d06ea05fe4b4a2
-F src/sqliteInt.h 594bf31a7a0cc788688ca947e562576e23bd7904
+F src/sqliteInt.h f0814546248fcee52268339bbeac964eb8b6c4b9
 F src/sqliteLimit.h c0373387c287c8d0932510b5547ecde31b5da247
 F src/status.c 70912d7be68e9e2dbc4010c93d344af61d4c59ba
 F src/table.c 5226df15ab9179b9ed558d89575ea0ce37b03fc9
@@ -441,7 +441,7 @@ F src/update.c 3e67ab3c0814635f355fb1f8ab010a2b9e016e7d
 F src/utf.c 699001c79f28e48e9bcdf8a463da029ea660540c
 F src/util.c 8873d696c9ccc4206058c402e09e101f1b81561a
 F src/vacuum.c feb1eabb20987983d9350cad98299b21fa811f52
-F src/vdbe.c 936166d3dc5aa00364877603f545707896c1519e
+F src/vdbe.c 260c47de1b8b3b57825ea1709fb0b60283c8b7cc
 F src/vdbe.h c16ba943d407baa1c7085eefea73a063fc631863
 F src/vdbeInt.h ddb157974436d87652de7dc641f7191496d9a8cd
 F src/vdbeapi.c ba85b78fe08dc4a9ce747e62c89a2b4a4547e74c
@@ -1482,7 +1482,10 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P ed128e8b826cd9620b7146d01d461ed28b9a672d
-R 27e5e4c2995b5324778005dedfa90fe5
+P cf569f9f2fab1828e4bfced111fd9a6ee23ea8c0
+R e6b61a1d38c394d935d14241736aba21
+T *branch * require-write-txn
+T *sym-require-write-txn *
+T -sym-trunk *
 U drh
-Z ed5acb084f4d8b134ae4eeee3cdc81ad
+Z ba47653689e7a4efff681f718284bc92
index cf9761250d9e3805dc52992988f2489215a9d172..aa27493a5472c767f4465095b1c13c0d7eb6ffb0 100644 (file)
@@ -1 +1 @@
-cf569f9f2fab1828e4bfced111fd9a6ee23ea8c0
\ No newline at end of file
+b7570ac14df0b799569070c7400904040d30d4cc
\ No newline at end of file
index 9f773667af1a9182490e10dd250d8aea15cce57f..18430e2981f715d856c8c180a308c88d24df39fa 100644 (file)
@@ -804,6 +804,7 @@ int sqlite3_db_config(sqlite3 *db, int op, ...){
         { SQLITE_DBCONFIG_ENABLE_FKEY,           SQLITE_ForeignKeys    },
         { SQLITE_DBCONFIG_ENABLE_TRIGGER,        SQLITE_EnableTrigger  },
         { SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER, SQLITE_Fts3Tokenizer  },
+        { SQLITE_DBCONFIG_REQUIRE_TXN,           SQLITE_RequireTxn     },
       };
       unsigned int i;
       rc = SQLITE_ERROR; /* IMP: R-42790-23372 */
index b28e1ba14a486bd630d85a862efb681da8f0d2b3..0add09c18a08fb6767c991e1f979b580ffe03203 100644 (file)
@@ -1938,6 +1938,7 @@ struct sqlite3_mem_methods {
 #define SQLITE_DBCONFIG_ENABLE_FKEY           1002 /* int int* */
 #define SQLITE_DBCONFIG_ENABLE_TRIGGER        1003 /* int int* */
 #define SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER 1004 /* int int* */
+#define SQLITE_DBCONFIG_REQUIRE_TXN           1005 /* int int* */
 
 
 /*
index d789cc00e49aa07ec8f1eba69db987393e0652b8..38e34e4ebed380dc5ecf0c0bc5bd308f40cdc95a 100644 (file)
@@ -1384,7 +1384,7 @@ struct sqlite3 {
 #define SQLITE_Vacuum         0x08000000  /* Currently in a VACUUM */
 #define SQLITE_CellSizeCk     0x10000000  /* Check btree cell sizes on load */
 #define SQLITE_Fts3Tokenizer  0x20000000  /* Enable fts3_tokenizer(2) */
-
+#define SQLITE_RequireTxn     0x40000000  /* BEGIN required to write */
 
 /*
 ** Bits of the sqlite3.dbOptFlags field that are used by the
index f5b00d824a53d1eef56bc3d9aa2c67b72d718f59..c3334fb33f394a4ab8f1087e64449a1cec655960 100644 (file)
@@ -3123,8 +3123,13 @@ case OP_Transaction: {
   assert( p->readOnly==0 || pOp->p2==0 );
   assert( pOp->p1>=0 && pOp->p1<db->nDb );
   assert( DbMaskTest(p->btreeMask, pOp->p1) );
-  if( pOp->p2 && (db->flags & SQLITE_QueryOnly)!=0 ){
-    rc = SQLITE_READONLY;
+  if( pOp->p2 && (db->flags & (SQLITE_QueryOnly|SQLITE_RequireTxn))!=0 ){
+    if( db->flags & SQLITE_QueryOnly ){
+      rc = SQLITE_READONLY;
+    }else if( db->autoCommit && (pOp->p2&02)==0 ){
+      sqlite3VdbeError(p, "cannot write outside of a transaction");
+      rc = SQLITE_ERROR;
+    }
     goto abort_due_to_error;
   }
   pBt = db->aDb[pOp->p1].pBt;
@@ -3176,9 +3181,8 @@ case OP_Transaction: {
     iGen = iMeta = 0;
   }
   assert( pOp->p5==0 || pOp->p4type==P4_INT32 );
-  if( pOp->p5 && (iMeta!=pOp->p3 || iGen!=pOp->p4.i) ){
-    sqlite3DbFree(db, p->zErrMsg);
-    p->zErrMsg = sqlite3DbStrDup(db, "database schema has changed");
+  if( (pOp->p5&0x01)!=0 && (iMeta!=pOp->p3 || iGen!=pOp->p4.i) ){
+    sqlite3VdbeError(p, "database schema has changed");
     /* If the schema-cookie from the database file matches the cookie 
     ** stored with the in-memory representation of the schema, do
     ** not reload the schema from the database file.