-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
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
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
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
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
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.
-9c7f569acdc2fb829354cefda42389a554f5fd957a7ef47e6e093f30789bb28e
+a2b784cb876f8c7e5b713a5ae5b7c8072e40d1fb48837bff085683bf1b71c68f
{ 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 */
%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");
}
}
#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
////////////////////////// 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);
}
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);
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 },
** 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>
#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
#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 */
#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
{ "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;
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;
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;
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