-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
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
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
}
#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.
}
#ifdef SQLITE_ENABLE_CURSOR_HINTS
case P4_EXPR: {
- sqlite3_snprintf(nTemp, zTemp, "(expr)");
+ displayP4Expr(nTemp, zTemp, pOp->p4.pExpr);
break;
}
#endif
assert( zP4!=0 );
return zP4;
}
-#endif
+#endif /* VDBE_DISPLAY_P4 */
/*
** Declare to the Vdbe that the BTree object at db->aDb[i] is used.