]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Convert the hint expression of the CursorHint opcode into a string for
authordrh <drh@noemail.net>
Thu, 13 Aug 2015 21:32:41 +0000 (21:32 +0000)
committerdrh <drh@noemail.net>
Thu, 13 Aug 2015 21:32:41 +0000 (21:32 +0000)
display by EXPLAIN.

FossilOrigin-Name: 206884718782331a7aaacc2c811e4e9d2effae91

manifest
manifest.uuid
src/vdbeInt.h
src/vdbeaux.c

index 348a2457f576468c18d9d7b8e5640c46f278687d..6e7833ee1e49cbbda84b4f9d92c967c6d7f1f3ee 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sa\sbug\sin\ssqlite3ExprContainsSubquery().
-D 2015-08-13T20:34:41.283
+C Convert\sthe\shint\sexpression\sof\sthe\sCursorHint\sopcode\sinto\sa\sstring\sfor\ndisplay\sby\sEXPLAIN.
+D 2015-08-13T21:32:41.246
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in 2fc9ca6bf5949d415801c007ed3004a4bdb7c380
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -401,9 +401,9 @@ F src/util.c bc9dd64b5db544218b871b66243871c202b2781f
 F src/vacuum.c 2ddd5cad2a7b9cef7f9e431b8c7771634c6b1701
 F src/vdbe.c eeef2e6ee7c377c31a1b3f6c2b2812f3f711c2d7
 F src/vdbe.h 529bb4a7bedcd28dccba5abb3927e3c5cb70a832
-F src/vdbeInt.h 8b54e01ad0463590e7cffabce0bc36da9ee4f816
+F src/vdbeInt.h 7258d75fc2dad0bccdef14d7d8d2fd50fd1bf2d2
 F src/vdbeapi.c adabbd66eb2e3a10f3998485ee0be7e326d06ee4
-F src/vdbeaux.c 6194de3a1c44acc4027612240e1d9d664070814f
+F src/vdbeaux.c 56077f78bfc96e80f31ad595a05d4d73ac45f5c0
 F src/vdbeblob.c 4f2e8e075d238392df98c5e03a64342465b03f90
 F src/vdbemem.c ae38a0d35ae71cf604381a887c170466ba518090
 F src/vdbesort.c f5009e7a35e3065635d8918b9a31f498a499976b
@@ -1375,7 +1375,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 82a7a61bc0883b1e7432548e4890791717aa1bb3
-R c0d78b933f8c8505165f8dab4ed556fa
+P be254715b5f56900e57ed57a179ca8d7bb68685d
+R 35eb49e0fc9f5ab493d2ccd36c0aabff
 U drh
-Z 08da2f71cfba0ab0d4b8feee8d71be50
+Z c266af41e61c50699b530df37cf4ff5a
index db2f1d9f7256d9996fd9a09f3f70866ab366728a..ad135c79ee79f2f7d58c0ab5a263c610abc2f005 100644 (file)
@@ -1 +1 @@
-be254715b5f56900e57ed57a179ca8d7bb68685d
\ No newline at end of file
+206884718782331a7aaacc2c811e4e9d2effae91
\ No newline at end of file
index 4a90ed6483b4d8a961eb935a49cb25be51a9a02e..b5470c2ddaa72ad5be471a7109ee177664e9120b 100644 (file)
 # define SQLITE_MAX_SCHEMA_RETRY 50
 #endif
 
+/*
+** VDBE_DISPLAY_P4 is true or false depending on whether or not the
+** "explain" P4 display logic is enabled.
+*/
+#if !defined(SQLITE_OMIT_EXPLAIN) || !defined(NDEBUG) \
+     || defined(VDBE_PROFILE) || defined(SQLITE_DEBUG)
+# define VDBE_DISPLAY_P4 1
+#else
+# define VDBE_DISPLAY_P4 0
+#endif
+
 /*
 ** SQL is translated into a sequence of instructions to be
 ** executed by a virtual machine.  Each instruction is an instance
index 01c6a0fcad885490918a0a4b421d28d2cbd331e0..b2bc88db8822d11c1dd8ee133ffc0bf3f0899218 100644 (file)
@@ -1084,9 +1084,78 @@ static int displayComment(
 }
 #endif /* SQLITE_DEBUG */
 
+#if VDBE_DISPLAY_P4 && defined(SQLITE_ENABLE_CURSOR_HINTS)
+/*
+** Translate the P4.pExpr value for an OP_CursorHint opcode into text
+** that can be displayed in the P4 column of EXPLAIN output.
+*/
+static int displayP4Expr(int nTemp, char *zTemp, Expr *pExpr){
+  const char *zBinOp = 0;
+  switch( pExpr->op ){
+    case TK_STRING:
+      sqlite3_snprintf(nTemp, zTemp, "%Q", pExpr->u.zToken);
+      break;
+
+    case TK_INTEGER:
+      sqlite3_snprintf(nTemp, zTemp, "%d", pExpr->u.iValue);
+      break;
+
+    case TK_NULL:
+      sqlite3_snprintf(nTemp, zTemp, "NULL");
+      break;
+
+    case TK_REGISTER: {
+      sqlite3_snprintf(nTemp, zTemp, "r[%d]", pExpr->iTable);
+      break;
+    }
+
+    case TK_COLUMN: {
+      sqlite3_snprintf(nTemp, zTemp, "c%d", (int)pExpr->iColumn);
+      break;
+    }
+
+    case TK_LT:      zBinOp = "<";        break;
+    case TK_LE:      zBinOp = "<=";       break;
+    case TK_GT:      zBinOp = ">";        break;
+    case TK_GE:      zBinOp = ">=";       break;
+    case TK_NE:      zBinOp = "!=";       break;
+    case TK_EQ:      zBinOp = "==";       break;
+    case TK_IS:      zBinOp = " IS ";     break;
+    case TK_ISNOT:   zBinOp = " IS NOT "; break;
+    case TK_AND:     zBinOp = " AND ";    break;
+    case TK_OR:      zBinOp = " OR ";     break;
+    case TK_PLUS:    zBinOp = "+";        break;
+    case TK_STAR:    zBinOp = "*";        break;
+    case TK_MINUS:   zBinOp = "-";        break;
+    case TK_REM:     zBinOp = "%";        break;
+    case TK_BITAND:  zBinOp = "&";        break;
+    case TK_BITOR:   zBinOp = "|";        break;
+    case TK_SLASH:   zBinOp = "/";        break;
+    case TK_LSHIFT:  zBinOp = "<<";       break;
+    case TK_RSHIFT:  zBinOp = ">>";       break;
+    case TK_CONCAT:  zBinOp = "||";       break;
+
+    default:
+      sqlite3_snprintf(nTemp, zTemp, "%s", "expr");
+      break;
+  }
 
-#if !defined(SQLITE_OMIT_EXPLAIN) || !defined(NDEBUG) \
-     || defined(VDBE_PROFILE) || defined(SQLITE_DEBUG)
+  if( zBinOp && nTemp>5 ){
+    int n = 1;
+    zTemp[0] = '(';
+    n += displayP4Expr(nTemp-n, zTemp+n, pExpr->pLeft);
+    sqlite3_snprintf(nTemp-n, zTemp+n, "%s", zBinOp);
+    n += sqlite3Strlen30(zTemp+n);
+    n += displayP4Expr(nTemp-n, zTemp+n, pExpr->pRight);
+    sqlite3_snprintf(nTemp-n, zTemp+n, ")");
+  }
+
+  return sqlite3Strlen30(zTemp);
+}
+#endif /* VDBE_DISPLAY_P4 && defined(SQLITE_ENABLE_CURSOR_HINTS) */
+
+
+#if VDBE_DISPLAY_P4
 /*
 ** Compute a string that describes the P4 parameter for an opcode.
 ** Use zTemp for any required temporary buffer space.
@@ -1127,7 +1196,7 @@ static char *displayP4(Op *pOp, char *zTemp, int nTemp){
     }
 #ifdef SQLITE_ENABLE_CURSOR_HINTS
     case P4_EXPR: {
-      sqlite3_snprintf(nTemp, zTemp, "(expr)");
+      displayP4Expr(nTemp, zTemp, pOp->p4.pExpr);
       break;
     }
 #endif
@@ -1206,7 +1275,7 @@ static char *displayP4(Op *pOp, char *zTemp, int nTemp){
   assert( zP4!=0 );
   return zP4;
 }
-#endif
+#endif /* VDBE_DISPLAY_P4 */
 
 /*
 ** Declare to the Vdbe that the BTree object at db->aDb[i] is used.