From: drh Date: Thu, 13 Aug 2015 21:32:41 +0000 (+0000) Subject: Convert the hint expression of the CursorHint opcode into a string for X-Git-Tag: version-3.10.0~191^2~19 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f7e369070e78887164632b4f142502c1034925b1;p=thirdparty%2Fsqlite.git Convert the hint expression of the CursorHint opcode into a string for display by EXPLAIN. FossilOrigin-Name: 206884718782331a7aaacc2c811e4e9d2effae91 --- diff --git a/manifest b/manifest index 348a2457f5..6e7833ee1e 100644 --- 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 diff --git a/manifest.uuid b/manifest.uuid index db2f1d9f72..ad135c79ee 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -be254715b5f56900e57ed57a179ca8d7bb68685d \ No newline at end of file +206884718782331a7aaacc2c811e4e9d2effae91 \ No newline at end of file diff --git a/src/vdbeInt.h b/src/vdbeInt.h index 4a90ed6483..b5470c2dda 100644 --- a/src/vdbeInt.h +++ b/src/vdbeInt.h @@ -26,6 +26,17 @@ # 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 diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 01c6a0fcad..b2bc88db88 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -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.