]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
The COMMIT AND CONTINUE TRANSACTION syntax is disabled by default. Enable it
authordrh <>
Mon, 18 Nov 2024 11:49:47 +0000 (11:49 +0000)
committerdrh <>
Mon, 18 Nov 2024 11:49:47 +0000 (11:49 +0000)
using the SQLITE_DBCONFIG_CONTINUE_TRANSACTION configuration option.

FossilOrigin-Name: a2b784cb876f8c7e5b713a5ae5b7c8072e40d1fb48837bff085683bf1b71c68f

manifest
manifest.uuid
src/main.c
src/parse.y
src/shell.c.in
src/sqlite.h.in
src/sqliteInt.h
src/test1.c
test/trans4.test

index 480b0843d91d16231d61d16b1028de8f8fc2b193..185faaf3c6b0e0c4d9f12ce189fe85123ef22471 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sa\stypo\sin\sa\svariable\sname.
-D 2024-11-18T11:14:58.773
+C The\sCOMMIT\sAND\sCONTINUE\sTRANSACTION\ssyntax\sis\sdisabled\sby\sdefault.\s\sEnable\sit\nusing\sthe\sSQLITE_DBCONFIG_CONTINUE_TRANSACTION\sconfiguration\soption.
+D 2024-11-18T11:49:47.244
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d
@@ -737,7 +737,7 @@ F src/insert.c f8d1a0f8ee258411009c6b7f2d93170e351bd19f5ad89d57e1180644297cbe70
 F src/json.c 68a98c020c22127f2d65f08855f7fc7460ff352a6ce0b543d8931dde83319c22
 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa
 F src/loadext.c 7432c944ff197046d67a1207790a1b13eec4548c85a9457eb0896bb3641dfb36
-F src/main.c 9f4286302727f58fddc03a820d24cb7618a1e27473501792fbe979726f846d1f
+F src/main.c c8012cb48693416b41c26c3791116a38064e7efbdfeafc6e80936e0636a9cef5
 F src/malloc.c 410e570b30c26cc36e3372577df50f7a96ee3eed5b2b161c6b6b48773c650c5e
 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
 F src/mem1.c 3bb59158c38e05f6270e761a9f435bf19827a264c13d1631c58b84bdc96d73b2
@@ -763,7 +763,7 @@ F src/os_win.c db4baa8f62bbfe3967c71b008cea31a8f2ff337c1667ff4d8a677e697315ff0d
 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a
 F src/pager.c d29770208271df2adbd96bc5d353aba74f84bbd79926734e9d4d4a081556439a
 F src/pager.h 4637ae0c299215d7ed3b54e379123b518e101c0453faa2d0f7db29cb23525cee
-F src/parse.y 8e86f09a67481b842504704d2c9919dcd22bca13244461d5dade85b308a23af2
+F src/parse.y dde57604943e3b4021ba606b0ab73a4dba9d8ab466c0208a7cdf461a84511a11
 F src/pcache.c 588cc3c5ccaaadde689ed35ce5c5c891a1f7b1f4d1f56f6cf0143b74d8ee6484
 F src/pcache.h 1497ce1b823cf00094bb0cf3bac37b345937e6f910890c626b16512316d3abf5
 F src/pcache1.c 49516ad7718a3626f28f710fa7448ef1fce3c07fd169acbb4817341950264319
@@ -775,17 +775,17 @@ F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
 F src/resolve.c c8a5372b97b2a2e972a280676f06ddb5b74e885d3b1f5ce383f839907b57ef68
 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97
 F src/select.c 4b14337a2742f0c0beeba490e9a05507e9b4b12184b9cd12773501d08d48e3fe
-F src/shell.c.in 9a0011ee9650818782ee746e0e8747568a6f02fb3ae323dc6e27fa1a61457523
-F src/sqlite.h.in 4d93768709c53b7c653a63817a82d5a8625264ca0d8cdf99967ba147bdcf2aa6
+F src/shell.c.in f3540cb6abff54c6c0883b6a60dda361b72aa5bf6482dbc923bb62efdcd225ae
+F src/sqlite.h.in 7a3f076429764e3f3fb076ca3913d0ba6819e767ea3c4b66e015ba186d791b8d
 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
 F src/sqlite3ext.h 3f046c04ea3595d6bfda99b781926b17e672fd6d27da2ba6d8d8fc39981dcb54
-F src/sqliteInt.h 08735a5db1be299c3478ceb03d63729c1c7c4fe1ba82ac7b724535098c86bfa7
+F src/sqliteInt.h 0e5e4a3cadda1a1dadedd990093ad33d0e898f5b9bcb756f7765a835887708e4
 F src/sqliteLimit.h 6993c9cfe3af5b8169ae0e5f15627fc15596726d4f1dc90a221309f79715ce88
 F src/status.c cb11f8589a6912af2da3bb1ec509a94dd8ef27df4d4c1a97e0bcf2309ece972b
 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1
 F src/tclsqlite.c c4b0b27b0ad34e4af085040a1ebe94a35ad5161663cd905d1b947f7884691bff
 F src/tclsqlite.h 65e2c761446e1c9fa0342b7d2612a703483643c8b6a316d12a65b745a4727395
-F src/test1.c 2d507751bfb4aa254dc22588ef1e3c5c5cfcb2e636d0e6e1fa0bbd307669c2a8
+F src/test1.c cbf1c6ca9df2755b86808a671e1b03a787dc18cde9f7f3bfffd03da236f1173b
 F src/test2.c 7ebc518e6735939d8979273a6f7b1d9b5702babf059f6ad62499f7f60a9eb9a3
 F src/test3.c e7573aa0f78ee4e070a4bc8c3493941c1aa64d5c66d4825c74c0f055451f432b
 F src/test4.c 13e57ae7ec7a959ee180970aef09deed141252fe9bb07c61054f0dfa4f1dfd5d
@@ -1888,7 +1888,7 @@ F test/trace3.test 4f418ed30d15d9d17dcf13a17f0bd99a92e3038e038798e35db7525f82f4c
 F test/trans.test 45f6f9ab6f66a7b5744f1caac06b558f95da62501916906cf55586a896f9f439
 F test/trans2.test 62bd045bfc7a1c14c5ba83ba64d21ade31583f76
 F test/trans3.test 91a100e5412b488e22a655fe423a14c26403ab94
-F test/trans4.test 9f6b30b09e9475a0b0590db5a71c09596e1546a9ec508ed73cddd5d812e2aad3
+F test/trans4.test 27168490397f77589c5644b70f44658d7b28daab08333aa9d331cff3f344d2c4
 F test/transitive1.test f8ee983600b33d167da1885657f064aec404e1c0d0bc8765fdf163f4c749237a
 F test/trigger1.test 2834f8830a1ae338d95c2e3ea0c2a7bc4cda126cdeb715004cf0fd071892e44f
 F test/trigger2.test 30fcb3a6aa6782020d47968735ee6086ed795f73a7affa9406c8d5a36e7b5265
@@ -2199,8 +2199,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350
 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7
 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 22393c3a08e9473eef23a3182720b0f908253d3c02ebaad77e120355326023be
-R ebc8f32aec09d6c73258a6866194fa76
+P 9c7f569acdc2fb829354cefda42389a554f5fd957a7ef47e6e093f30789bb28e
+R 71cfe0a915dc3472a75f4219dfbd472d
 U drh
-Z beef99494554fea249e115da86070231
+Z ee6900849d9fc8da51753c4ea5b30c99
 # Remove this line to create a well-formed Fossil manifest.
index 3107cbe0cbcd80076b7b41711fb073bcea5f7b3b..c089531b9f2521939111b80223ffec56cc61d2c2 100644 (file)
@@ -1 +1 @@
-9c7f569acdc2fb829354cefda42389a554f5fd957a7ef47e6e093f30789bb28e
+a2b784cb876f8c7e5b713a5ae5b7c8072e40d1fb48837bff085683bf1b71c68f
index ff2a408d774de85c2c8c5eb47fac853598afc866..a7b4d89a269415ec6c4be90b8c15b3486bbb55ee 100644 (file)
@@ -980,6 +980,7 @@ int sqlite3_db_config(sqlite3 *db, int op, ...){
         { SQLITE_DBCONFIG_TRUSTED_SCHEMA,        SQLITE_TrustedSchema  },
         { SQLITE_DBCONFIG_STMT_SCANSTATUS,       SQLITE_StmtScanStatus },
         { SQLITE_DBCONFIG_REVERSE_SCANORDER,     SQLITE_ReverseOrder   },
+        { SQLITE_DBCONFIG_CONTINUE_TRANSACTION,  SQLITE_OkContTrans    },
       };
       unsigned int i;
       rc = SQLITE_ERROR; /* IMP: R-42790-23372 */
index 1481f9bd4ffc6d83f65b80daeff5f635fd7e5c58..524418d16253a75ed7cda43fc3c151ea25082c1c 100644 (file)
@@ -43,7 +43,7 @@
 %syntax_error {
   UNUSED_PARAMETER(yymajor);  /* Silence some compiler warnings */
   if( TOKEN.z[0] ){
-    sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &TOKEN);
+    sqlite3ReportSyntaxError(pParse, &TOKEN);
   }else{
     sqlite3ErrorMsg(pParse, "incomplete input");
   }
@@ -142,6 +142,11 @@ static void updateDeleteLimitError(
 }
 #endif /* SQLITE_ENABLE_UPDATE_DELETE_LIMIT */
 
+/* Report a syntax error at pToken */
+void sqlite3ReportSyntaxError(Parse *pParse, Token *pToken){
+  sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", pToken);
+}
+
 } // end %include
 
 // Input is a single SQL command
@@ -478,9 +483,12 @@ resolvetype(A) ::= REPLACE.                  {A = OE_Replace;}
 
 ////////////////////////// COMMIT AND CONTINUE TRANSACTION ////////////////////
 //
-cmd ::= COMMIT(X) AND ID(Y) TRANSACTION. {
+cmd ::= COMMIT(X) AND(A) ID(Y) TRANSACTION. {
+  if( (pParse->db->flags & SQLITE_OkContTrans)==0 ){
+    sqlite3ReportSyntaxError(pParse, &A);
+  }
   if( Y.n!=8  || sqlite3_strnicmp(Y.z,"continue",8)!=0 ){
-    sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &Y);
+    sqlite3ReportSyntaxError(pParse, &Y);
   }
   sqlite3EndTransaction(pParse, @X, 1);
 }
@@ -1167,7 +1175,7 @@ expr(A) ::= VARIABLE(X).     {
     Token t = X; /*A-overwrites-X*/
     assert( t.n>=2 );
     if( pParse->nested==0 ){
-      sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &t);
+      sqlite3ReportSyntaxError(pParse, &t);
       A = 0;
     }else{
       A = sqlite3PExpr(pParse, TK_REGISTER, 0, 0);
index a6700eb83a0380496aa4001a3c80a1e99f836b93..4f9ec2ca759b1eaa2f42f4be623de4a4f4563b32 100644 (file)
@@ -8723,6 +8723,7 @@ static int do_meta_command(char *zLine, ShellState *p){
       const char *zName;
       int op;
     } aDbConfig[] = {
+        { "continue_transaction",SQLITE_DBCONFIG_CONTINUE_TRANSACTION },
         { "defensive",          SQLITE_DBCONFIG_DEFENSIVE             },
         { "dqs_ddl",            SQLITE_DBCONFIG_DQS_DDL               },
         { "dqs_dml",            SQLITE_DBCONFIG_DQS_DML               },
index b84938b45cd55fdc45cc4d851667b1eb91351378..258e6fbeb181c8732e2599081e74636e6b2dd047 100644 (file)
@@ -2521,6 +2521,17 @@ struct sqlite3_mem_methods {
 ** then 0 or 1 is written into the integer that the second argument points to
 ** depending on if the reverse scan order flag is set after processing the
 ** first argument.
+**
+** [[SQLITE_DBCONFIG_CONTINUE_TRANSACTION]]
+** <dt>SQLITE_DBCONFIG_CONTINUE_TRANSACTION</dt>
+** <dd>The SQLITE_DBCONFIG_CONTINUE_TRANSACTION option enables or disables
+** the COMMIT AND CONTINUE TRANSACTION syntax.  That special syntax if off
+** by default. This option takes two arguments which are an integer and a
+** pointer to an integer.  The first argument is 1, 0, or -1 to enable,
+** disable, or leave unchanged the COMMIT AND CONTINUE TRANSACTION syntax,
+** respectively.  If the second argument is not NULL, then 0 or 1 is written
+** into the integer that the second argument points to depending on whether
+** or not the COMMIT AND CONTINUE TRANSACTION syntax is enabled.
 ** </dd>
 **
 ** </dl>
@@ -2545,7 +2556,8 @@ struct sqlite3_mem_methods {
 #define SQLITE_DBCONFIG_TRUSTED_SCHEMA        1017 /* int int* */
 #define SQLITE_DBCONFIG_STMT_SCANSTATUS       1018 /* int int* */
 #define SQLITE_DBCONFIG_REVERSE_SCANORDER     1019 /* int int* */
-#define SQLITE_DBCONFIG_MAX                   1019 /* Largest DBCONFIG */
+#define SQLITE_DBCONFIG_CONTINUE_TRANSACTION  1020 /* int int* */
+#define SQLITE_DBCONFIG_MAX                   1020 /* Largest DBCONFIG */
 
 /*
 ** CAPI3REF: Enable Or Disable Extended Result Codes
index 56c2cc911296a3013df2048ec541178e08ace0b8..45f1e394763d05b3d0854d5335b95ccc977b6d62 100644 (file)
@@ -1799,8 +1799,7 @@ struct sqlite3 {
 #define SQLITE_ShortColNames  0x00000040  /* Show short columns names */
 #define SQLITE_TrustedSchema  0x00000080  /* Allow unsafe functions and
                                           ** vtabs in the schema definition */
-#define SQLITE_NullCallback   0x00000100  /* Invoke the callback once if the */
-                                          /*   result set is empty */
+#define SQLITE_OkContTrans    0x00000100  /* Enable COMMIT AND CONTINUE syntax*/
 #define SQLITE_IgnoreChecks   0x00000200  /* Do not enforce check constraints */
 #define SQLITE_StmtScanStatus 0x00000400  /* Enable stmt_scanstats() counters */
 #define SQLITE_NoCkptOnClose  0x00000800  /* No checkpoint on close()/DETACH */
@@ -1830,6 +1829,8 @@ struct sqlite3 {
 #define SQLITE_CorruptRdOnly  HI(0x00002) /* Prohibit writes due to error */
 #define SQLITE_ReadUncommit   HI(0x00004) /* READ UNCOMMITTED in shared-cache */
 #define SQLITE_FkNoAction     HI(0x00008) /* Treat all FK as NO ACTION */
+#define SQLITE_NullCallback   HI(0x00010) /* Invoke the callback once if the */
+                                          /*   result set is empty */
 
 /* Flags used only if debugging */
 #ifdef SQLITE_DEBUG
index cf5d484e9ec372d9b100e8117ca2718a6d322e85..10fbd13f1f858fa2936d335c18a96391de5be42b 100644 (file)
@@ -8389,6 +8389,7 @@ static int SQLITE_TCLAPI test_sqlite3_db_config(
     { "DQS_DDL",            SQLITE_DBCONFIG_DQS_DDL },
     { "LEGACY_FILE_FORMAT", SQLITE_DBCONFIG_LEGACY_FILE_FORMAT },
     { "STMT_SCANSTATUS",    SQLITE_DBCONFIG_STMT_SCANSTATUS },
+    { "CONTINUE_TRANSACTION",SQLITE_DBCONFIG_CONTINUE_TRANSACTION },
   };
   int i;
   int v = 0;
index 99cf18ec43c84aeed87cfd8cd68c430ce2e62b6f..838ee5b9fddc100656e61d7065c5471188ad097b 100644 (file)
@@ -18,6 +18,9 @@ unset -nocomplain ecode
 db close
 sqlite3 db test.db
 sqlite3 db2 test.db
+sqlite3_db_config db CONTINUE_TRANSACTION 1
+sqlite3_db_config db2 CONTINUE_TRANSACTION 1
+
 do_execsql_test -db db2 trans4-1.1 {
   CREATE TABLE t1(x);
   BEGIN;
@@ -50,6 +53,7 @@ do_catchsql_test trans4-1.6 {
 db2 close
 db eval {PRAGMA journal_mode=WAL; VACUUM;}
 sqlite3 db2 test.db
+sqlite3_db_config db2 CONTINUE_TRANSACTION 1
 
 do_execsql_test -db db2 trans4-2.1 {
   DELETE FROM t1;
@@ -90,6 +94,11 @@ do_catchsql_test trans4-3.2 {
 do_catchsql_test trans4-3.3 {
   COMMIT AND continue Transaction;
 } {0 {}}
+sqlite3_db_config db CONTINUE_TRANSACTION 0
+do_catchsql_test trans4-3.4 {
+  COMMIT AND CONTINUE TRANSACTION;
+} {1 {near "AND": syntax error}}
+
 db2 close
 
 finish_test