]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Proof of concept for a "PRAGMA vdbe_cycle_limit=N" command. When N>0, vdbe_cycle_limit
authordrh <drh@noemail.net>
Tue, 21 Feb 2017 13:29:18 +0000 (13:29 +0000)
committerdrh <drh@noemail.net>
Tue, 21 Feb 2017 13:29:18 +0000 (13:29 +0000)
invoke sqlite3_interrupt() whenever any byte code program uses more than
N virtual machine cycles.

FossilOrigin-Name: 9626b41e6ef70631cc1867315e409a2a92ce2a53

manifest
manifest.uuid
src/pragma.c
src/pragma.h
tool/mkpragmatab.tcl

index b9e136d68095dd7081479e127a4aa0331b071e10..600a5523ccdd06ddd24829f9e9a0ba0131bc0677 100644 (file)
--- 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
index a4b5b9828732cfaed8e3f068e467c7baa2d312a6..e9f5ffe813a557a4b011c3f413cfc22d64e3e68f 100644 (file)
@@ -1 +1 @@
-1589db012ef1389bf84399fccf96d143b2ac4c0f
\ No newline at end of file
+9626b41e6ef70631cc1867315e409a2a92ce2a53
\ No newline at end of file
index b1775a4082a3a0135f962d8aa37d8809adcd6c4c..a201b35fec36857dd13a4cc253d24ff9249143d9 100644 (file)
@@ -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
index 5d8d0aa35b3f6f46ed9f141150a470fbef48a167..c369b8c32ab5ef46c09b59c0519af5c91a0f9c4c 100644 (file)
 #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. */
index c22f72d491a2c46c6d05f521aa827892839e1b01..b881cdaa44f1e7e1b0dc09e913fb282c18f92896 100644 (file)
@@ -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