From a67a31624d3e1133538d0d4c0b39980a86c61d4f Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 15 Aug 2015 00:51:23 +0000 Subject: [PATCH] Change the display of the P4 operand of CursorHint in EXPLAIN output to function notation. FossilOrigin-Name: bee73d429cb0e99b43fb191ac15e298d0353b135 --- manifest | 14 ++++----- manifest.uuid | 2 +- src/vdbeaux.c | 68 +++++++++++++++++++++++--------------------- test/cursorhint.test | 12 ++++---- 4 files changed, 49 insertions(+), 47 deletions(-) diff --git a/manifest b/manifest index 931701bf6b..32218e8eda 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Always\sprovide\sthe\sBTREE_BULKLOAD\shint,\seven\swhen\sSQLITE_ENABLE_CURSOR_HINTS\nis\snot\sdefined,\sas\sthat\shint\sgives\sa\s4%\sperformance\sincrease. -D 2015-08-14T23:57:04.215 +C Change\sthe\sdisplay\sof\sthe\sP4\soperand\sof\sCursorHint\sin\sEXPLAIN\soutput\sto\nfunction\snotation. +D 2015-08-15T00:51:23.737 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2fc9ca6bf5949d415801c007ed3004a4bdb7c380 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -402,7 +402,7 @@ F src/vdbe.c 4dbcceb38f5c3e42c0725a56e7c76eb12adedebb F src/vdbe.h 529bb4a7bedcd28dccba5abb3927e3c5cb70a832 F src/vdbeInt.h 7258d75fc2dad0bccdef14d7d8d2fd50fd1bf2d2 F src/vdbeapi.c adabbd66eb2e3a10f3998485ee0be7e326d06ee4 -F src/vdbeaux.c 9f726265d3c4a64264c9aa80d35aa19c51a3c6f4 +F src/vdbeaux.c e8dbcc838ca29f0d2767e789f4fe5883541e4f6e F src/vdbeblob.c 4f2e8e075d238392df98c5e03a64342465b03f90 F src/vdbemem.c ae38a0d35ae71cf604381a887c170466ba518090 F src/vdbesort.c f5009e7a35e3065635d8918b9a31f498a499976b @@ -560,7 +560,7 @@ F test/crashtest1.c 09c1c7d728ccf4feb9e481671e29dda5669bbcc2 F test/createtab.test b5de160630b209c4b8925bdcbbaf48cc90b67fe8 F test/cse.test 277350a26264495e86b1785f34d2d0c8600e021c F test/ctime.test 7bd009071e242aac4f18521581536b652b789a47 -F test/cursorhint.test c3844bed3eec3506b38b98ab5f0ca22a4ab9ecb4 +F test/cursorhint.test 0d79cce943e4e61910d9a5cf73b1e57b2b42429f F test/date.test 42973251b9429f2c41b77eb98a7b0b0ba2d3b2c0 F test/dbstatus.test 8de104bb5606f19537d23cd553b41349b5ab1204 F test/dbstatus2.test 10418e62b3db5dca070f0c3eef3ea13946f339c2 @@ -1374,7 +1374,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 bf383e665a191a4f33a540d1240960a922e22813 -R 87aadf49a7545642a0a9fb9a1d94cce7 +P 83a844357e132683ab3d88eee0fe32a8beeb6662 +R 64f1f656f75dd3e1a8b619dc73ce4cbc U drh -Z 44853a09e3a1d8da8995535278d599e8 +Z 780f279750b73ad9a07ce3a651ba66ad diff --git a/manifest.uuid b/manifest.uuid index 9c7ac55d4b..dd4f395a20 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -83a844357e132683ab3d88eee0fe32a8beeb6662 \ No newline at end of file +bee73d429cb0e99b43fb191ac15e298d0353b135 \ No newline at end of file diff --git a/src/vdbeaux.c b/src/vdbeaux.c index df6ac61f82..37be7f44c8 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -1090,25 +1090,22 @@ static int displayComment( ** that can be displayed in the P4 column of EXPLAIN output. */ static int displayP4Expr(int nTemp, char *zTemp, Expr *pExpr){ - const char *zBinOp = 0; + const char *zOp = 0; + int n; 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: { if( pExpr->iColumn<0 ){ sqlite3_snprintf(nTemp, zTemp, "rowid"); @@ -1117,43 +1114,48 @@ static int displayP4Expr(int nTemp, char *zTemp, Expr *pExpr){ } 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; + case TK_LT: zOp = "LT"; break; + case TK_LE: zOp = "LE"; break; + case TK_GT: zOp = "GT"; break; + case TK_GE: zOp = "GE"; break; + case TK_NE: zOp = "NE"; break; + case TK_EQ: zOp = "EQ"; break; + case TK_IS: zOp = "IS"; break; + case TK_ISNOT: zOp = "ISNOT"; break; + case TK_AND: zOp = "AND"; break; + case TK_OR: zOp = "OR"; break; + case TK_PLUS: zOp = "ADD"; break; + case TK_STAR: zOp = "MUL"; break; + case TK_MINUS: zOp = "SUB"; break; + case TK_REM: zOp = "REM"; break; + case TK_BITAND: zOp = "BITAND"; break; + case TK_BITOR: zOp = "BITOR"; break; + case TK_SLASH: zOp = "DIV"; break; + case TK_LSHIFT: zOp = "LSHIFT"; break; + case TK_RSHIFT: zOp = "RSHIFT"; break; + case TK_CONCAT: zOp = "CONCAT"; break; + case TK_UMINUS: zOp = "MINUS"; break; + case TK_UPLUS: zOp = "PLUS"; break; + case TK_BITNOT: zOp = "BITNOT"; break; + case TK_NOT: zOp = "NOT"; break; + case TK_ISNULL: zOp = "ISNULL"; break; + case TK_NOTNULL: zOp = "NOTNULL"; break; default: sqlite3_snprintf(nTemp, zTemp, "%s", "expr"); break; } - if( zBinOp && nTemp>5 ){ - int n = 1; - zTemp[0] = '('; + if( zOp ){ + sqlite3_snprintf(nTemp, zTemp, "%s(", zOp); + n = sqlite3Strlen30(zTemp); 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); + if( npRight ){ + 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) */ diff --git a/test/cursorhint.test b/test/cursorhint.test index b9677b640d..9d12c90d7b 100644 --- a/test/cursorhint.test +++ b/test/cursorhint.test @@ -59,7 +59,7 @@ do_test 1.1 { p4_of_opcode db CursorHint { SELECT * FROM t1 CROSS JOIN t2 WHERE a=x } -} {/(r*==c0)/} +} {{EQ(r[1],c0)}} do_test 1.2 { p5_of_opcode db OpenRead . { SELECT * FROM t1 CROSS JOIN t2 WHERE a=x @@ -72,7 +72,7 @@ do_test 2.1 { p4_of_opcode db CursorHint { SELECT * FROM t2 CROSS JOIN t1 WHERE a=x } -} {/(c0==r*)/} +} {{EQ(c0,r[1])}} do_test 2.2 { p5_of_opcode db OpenRead . { SELECT * FROM t2 CROSS JOIN t1 WHERE a=x @@ -85,12 +85,12 @@ do_test 3.1 { p4_of_opcode db CursorHint { SELECT * FROM t1 WHERE a=15 AND c=22 AND rowid!=98 } -} {/(c0==15).*(c2==22).*(rowid!=98)/} +} {AND(AND(EQ(c0,15),EQ(c2,22)),NE(rowid,98))} do_test 3.2 { p4_of_opcode db CursorHint { SELECT * FROM t3 WHERE a<15 AND b>22 AND id!=98 } -} {/(c1<15).*(c2>22).*(c0!=98)/} +} {AND(AND(LT(c1,15),GT(c2,22)),NE(c0,98))} # Indexed queries # @@ -102,7 +102,7 @@ do_test 4.1 { p4_of_opcode db CursorHint { SELECT * FROM t1 WHERE b>11; } -} {/(c0>11)/} +} {GT(c0,11)} do_test 4.2 { p5_of_opcode db OpenRead . { SELECT * FROM t1 WHERE b>11; @@ -112,7 +112,7 @@ do_test 4.3 { p4_of_opcode db CursorHint { SELECT c FROM t1 WHERE b>11; } -} {/(c0>11)/} +} {GT(c0,11)} do_test 4.4 { p5_of_opcode db OpenRead . { SELECT c FROM t1 WHERE b>11;