From: drh <> Date: Mon, 18 Nov 2024 11:49:47 +0000 (+0000) Subject: The COMMIT AND CONTINUE TRANSACTION syntax is disabled by default. Enable it X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6e81f2af830c13978d47e618c605cbd240bc89a9;p=thirdparty%2Fsqlite.git The COMMIT AND CONTINUE TRANSACTION syntax is disabled by default. Enable it using the SQLITE_DBCONFIG_CONTINUE_TRANSACTION configuration option. FossilOrigin-Name: a2b784cb876f8c7e5b713a5ae5b7c8072e40d1fb48837bff085683bf1b71c68f --- diff --git a/manifest b/manifest index 480b0843d9..185faaf3c6 100644 --- 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. diff --git a/manifest.uuid b/manifest.uuid index 3107cbe0cb..c089531b9f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9c7f569acdc2fb829354cefda42389a554f5fd957a7ef47e6e093f30789bb28e +a2b784cb876f8c7e5b713a5ae5b7c8072e40d1fb48837bff085683bf1b71c68f diff --git a/src/main.c b/src/main.c index ff2a408d77..a7b4d89a26 100644 --- a/src/main.c +++ b/src/main.c @@ -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 */ diff --git a/src/parse.y b/src/parse.y index 1481f9bd4f..524418d162 100644 --- a/src/parse.y +++ b/src/parse.y @@ -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); diff --git a/src/shell.c.in b/src/shell.c.in index a6700eb83a..4f9ec2ca75 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -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 }, diff --git a/src/sqlite.h.in b/src/sqlite.h.in index b84938b45c..258e6fbeb1 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -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]] +**
SQLITE_DBCONFIG_CONTINUE_TRANSACTION
+**
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. **
** ** @@ -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 diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 56c2cc9112..45f1e39476 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -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 diff --git a/src/test1.c b/src/test1.c index cf5d484e9e..10fbd13f1f 100644 --- a/src/test1.c +++ b/src/test1.c @@ -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; diff --git a/test/trans4.test b/test/trans4.test index 99cf18ec43..838ee5b9fd 100644 --- a/test/trans4.test +++ b/test/trans4.test @@ -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