From: drh Date: Tue, 21 Feb 2017 13:29:18 +0000 (+0000) Subject: Proof of concept for a "PRAGMA vdbe_cycle_limit=N" command. When N>0, X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fheads%2Fvdbe_cycle_limit;p=thirdparty%2Fsqlite.git Proof of concept for a "PRAGMA vdbe_cycle_limit=N" command. When N>0, invoke sqlite3_interrupt() whenever any byte code program uses more than N virtual machine cycles. FossilOrigin-Name: 9626b41e6ef70631cc1867315e409a2a92ce2a53 --- diff --git a/manifest b/manifest index b9e136d680..600a5523cc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Correct\sa\sharmless\stypo\sin\sthe\sprevious\scheck-in. -D 2017-02-20T23:32:04.979 +C Proof\sof\sconcept\sfor\sa\s"PRAGMA\svdbe_cycle_limit=N"\scommand.\s\sWhen\sN>0,\ninvoke\ssqlite3_interrupt()\swhenever\sany\sbyte\scode\sprogram\suses\smore\sthan\nN\svirtual\smachine\scycles. +D 2017-02-21T13:29:18.463 F Makefile.in edb6bcdd37748d2b1c3422ff727c748df7ffe918 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc a89ea37ab5928026001569f056973b9059492fe2 @@ -387,8 +387,8 @@ F src/parse.y af8830094f4aecb91cb69721f3601ad10c36abc4 F src/pcache.c 62835bed959e2914edd26afadfecce29ece0e870 F src/pcache.h 2cedcd8407eb23017d92790b112186886e179490 F src/pcache1.c e3967219b2a92b9edcb9324a4ba75009090d3953 -F src/pragma.c 7831956012f5d764761fbd023e59b0ffc08f5e8d -F src/pragma.h 61aa5389118594bebb28120a6720401aee34ce1a +F src/pragma.c 9180cce9a16e0835c6f7d0aa42d8938ce59c2011 +F src/pragma.h 1ec44ee89a43e65bf70c9ef4ef066df217b9ab3f F src/prepare.c b1140c3d0cf59bc85ace00ce363153041b424b7a F src/printf.c 67427bbee66d891fc6f6f5aada857e9cdb368c1c F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 @@ -1494,7 +1494,7 @@ F tool/mkmsvcmin.tcl 95b37e202cbed873aa8ffdbb493b9db45927be2b F tool/mkopcodec.tcl d1b6362bd3aa80d5520d4d6f3765badf01f6c43c F tool/mkopcodeh.tcl a01d2c1d8a6205b03fc635adf3735b4c523befd3 F tool/mkopts.tcl 66ac10d240cc6e86abd37dc908d50382f84ff46e -F tool/mkpragmatab.tcl ebb4bfcd2f8010e0a3934b6118db4b5f2f5edf5c +F tool/mkpragmatab.tcl b6ef1997fbc019015cb3f1b078c38b884d1ce4b6 F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 F tool/mksqlite3c-noext.tcl fef88397668ae83166735c41af99d79f56afaabb F tool/mksqlite3c.tcl 06b2e6a0f21cc0a5d70fbbd136b3e0a96470645e @@ -1556,7 +1556,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 96b6a98e5e4cb0ddbfcd78b05bfbfcd8976e9f32 -R a6d884232566cde130b9b77412776230 -U mistachkin -Z c97450fc686b8c32bf5204625d8622fc +P 1589db012ef1389bf84399fccf96d143b2ac4c0f +R 927fcfe986f9d231ee2a8f2fc2e00fd4 +T *branch * vdbe_cycle_limit +T *sym-vdbe_cycle_limit * +T -sym-trunk * +U drh +Z 42d28699ae4b43243cadb703ee72bd58 diff --git a/manifest.uuid b/manifest.uuid index a4b5b98287..e9f5ffe813 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1589db012ef1389bf84399fccf96d143b2ac4c0f \ No newline at end of file +9626b41e6ef70631cc1867315e409a2a92ce2a53 \ No newline at end of file diff --git a/src/pragma.c b/src/pragma.c index b1775a4082..a201b35fec 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -295,6 +295,14 @@ static const PragmaName *pragmaLocate(const char *zName){ return lwr>upr ? 0 : &aPragmaName[mid]; } +/* +** A progress handler callback that interrupts. +*/ +static int interruptProgressHandler(void *pDb){ + sqlite3_interrupt((sqlite3*)pDb); + return 1; +} + /* ** Process a pragma statement. ** @@ -736,6 +744,23 @@ void sqlite3Pragma( } #endif + /* + ** PRAGMA vdbe_cycle_limit=N + ** + ** Arrange to interrupt any SQL statement that runs for more than N + ** virtual machine instructions. If N is zero, allow virtual machines + ** to run indefinitely. + */ + case PragTyp_VDBE_CYCLE_LIMIT: { + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + if( zRight ){ + int N = sqlite3Atoi(zRight); + sqlite3_progress_handler(db, N, N>0 ? interruptProgressHandler : 0, db); + } + break; + } + + #ifndef SQLITE_OMIT_PAGER_PRAGMAS /* ** PRAGMA [schema.]cache_size diff --git a/src/pragma.h b/src/pragma.h index 5d8d0aa35b..c369b8c32a 100644 --- a/src/pragma.h +++ b/src/pragma.h @@ -40,14 +40,15 @@ #define PragTyp_TEMP_STORE 32 #define PragTyp_TEMP_STORE_DIRECTORY 33 #define PragTyp_THREADS 34 -#define PragTyp_WAL_AUTOCHECKPOINT 35 -#define PragTyp_WAL_CHECKPOINT 36 -#define PragTyp_ACTIVATE_EXTENSIONS 37 -#define PragTyp_HEXKEY 38 -#define PragTyp_KEY 39 -#define PragTyp_REKEY 40 -#define PragTyp_LOCK_STATUS 41 -#define PragTyp_PARSER_TRACE 42 +#define PragTyp_VDBE_CYCLE_LIMIT 35 +#define PragTyp_WAL_AUTOCHECKPOINT 36 +#define PragTyp_WAL_CHECKPOINT 37 +#define PragTyp_ACTIVATE_EXTENSIONS 38 +#define PragTyp_HEXKEY 39 +#define PragTyp_KEY 40 +#define PragTyp_REKEY 41 +#define PragTyp_LOCK_STATUS 42 +#define PragTyp_PARSER_TRACE 43 /* Property flags associated with various pragma. */ #define PragFlg_NeedSchema 0x01 /* Force schema load before running */ @@ -562,6 +563,15 @@ static const PragmaName aPragmaName[] = { /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, /* ColNames: */ 0, 0, /* iArg: */ SQLITE_VdbeAddopTrace }, +#endif +#endif + {/* zName: */ "vdbe_cycle_limit", + /* ePragTyp: */ PragTyp_VDBE_CYCLE_LIMIT, + /* ePragFlg: */ PragFlg_NoColumns, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) +#if defined(SQLITE_DEBUG) {/* zName: */ "vdbe_debug", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, @@ -604,4 +614,4 @@ static const PragmaName aPragmaName[] = { /* iArg: */ SQLITE_WriteSchema|SQLITE_RecoveryMode }, #endif }; -/* Number of pragmas: 60 on by default, 73 total. */ +/* Number of pragmas: 61 on by default, 74 total. */ diff --git a/tool/mkpragmatab.tcl b/tool/mkpragmatab.tcl index c22f72d491..b881cdaa44 100644 --- a/tool/mkpragmatab.tcl +++ b/tool/mkpragmatab.tcl @@ -331,6 +331,9 @@ set pragma_def { NAME: shrink_memory FLAG: NoColumns + NAME: vdbe_cycle_limit + FLAG: NoColumns + NAME: busy_timeout FLAG: Result0 COLS: timeout