From: drh Date: Fri, 2 May 2014 13:09:06 +0000 (+0000) Subject: Merge latest trunk enhancements and fixes into the orderby-planning branch. X-Git-Tag: version-3.8.7~132^2~61^2~3 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=fb0d6e56d68240724f7406d63d8ff39f84784854;p=thirdparty%2Fsqlite.git Merge latest trunk enhancements and fixes into the orderby-planning branch. FossilOrigin-Name: 84862d3a095629d20c8e7b8a16f4dc26cd41ab6d --- fb0d6e56d68240724f7406d63d8ff39f84784854 diff --cc manifest index b7837cbb94,af2b3b36ec..6166275bb9 --- a/manifest +++ b/manifest @@@ -1,5 -1,5 +1,5 @@@ - C Improved\sheader\scomment\son\sthe\svdbesort.c\smodule.\s\sNo\schanges\sto\scode. - D 2014-04-24T16:25:25.812 -C Add\sa\scomment\sexplaining\swhy\sWhereLoop\scost\sadjustments\sare\somitted\sfor\nskip-scan\sloops. -D 2014-05-02T00:09:40.134 ++C Merge\slatest\strunk\senhancements\sand\sfixes\sinto\sthe\sorderby-planning\sbranch. ++D 2014-05-02T13:09:06.754 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@@ -217,7 -218,7 +218,7 @@@ F src/printf.c e5a0005f8b3de21f85da6a70 F src/random.c d10c1f85b6709ca97278428fd5db5bbb9c74eece F src/resolve.c 273d5f47c4e2c05b2d3d2bffeda939551ab59e66 F src/rowset.c a9c9aae3234b44a6d7c6f5a3cadf90dce1e627be - F src/select.c 1a229278810ac02b9cb58687c3aa8cdc304d4dcf -F src/select.c 089c4d46f067a5cccae93524c6377f981ba99bd9 ++F src/select.c a5ed3fdc82ebab5b9b095ea1971515a7f8a303d2 F src/shell.c 2afe7a7154e97be0c74c5feacf09626bda8493be F src/sqlite.h.in bde98816e1ba0c9ffef50afe7b32f4e5a8f54fe0 F src/sqlite3.rc 11094cc6a157a028b301a9f06b3d03089ea37c3e @@@ -276,9 -277,9 +277,9 @@@ F src/tokenize.c 6da2de6e12218ccb0aea51 F src/trigger.c 66f3470b03b52b395e839155786966e3e037fddb F src/update.c 5b3e74a03b3811e586b4f2b4cbd7c49f01c93115 F src/utf.c 6dc9ec9f1b3db43ae8ba0365377f11df1ee4c01c - F src/util.c c46c90459ef9bdc0c6c73803cf4c55425b4771cf + F src/util.c 2b5fb283a190aacdb286f7835a447c45b345b83c F src/vacuum.c 3728d74919d4fb1356f9e9a13e27773db60b7179 - F src/vdbe.c 59ad2f4c62178dcce4acef516e00290a7a58dd39 -F src/vdbe.c 7f359193bf2366cc914a9ece093ebf284e56acdc ++F src/vdbe.c b3510cc71f706beffc66e2aa4bbda54bcd5e9668 F src/vdbe.h 394464909ed682334aa3d5831aae0c2fe2abef94 F src/vdbeInt.h e6d83e5bfd62fc6685ba1ed6153f7099f82de9f7 F src/vdbeapi.c 0ed6053f947edd0b30f64ce5aeb811872a3450a4 @@@ -813,10 -817,10 +817,10 @@@ F test/show_speedtest1_rtree.tcl 32e6c5 F test/shrink.test 8c70f62b6e8eb4d54533de6d65bd06b1b9a17868 F test/sidedelete.test f0ad71abe6233e3b153100f3b8d679b19a488329 F test/skipscan1.test bed8cbe9d554c8c27afb6c88500f704c86a9196f - F test/skipscan2.test 5a4db0799c338ddbacb154aaa5589c0254b36a8d + F test/skipscan2.test d77f79cdbba25f0f6f35298136cff21a7d7a553a F test/soak.test 0b5b6375c9f4110c828070b826b3b4b0bb65cd5f F test/softheap1.test 40562fe6cac6d9827b7b42b86d45aedf12c15e24 -F test/sort.test 0e4456e729e5a92a625907c63dcdedfbe72c5dc5 +F test/sort.test cb76a6e9db897b6871ef4dbc206ebc6dbc033bf4 F test/speed1.test f2974a91d79f58507ada01864c0e323093065452 F test/speed1p.explain d841e650a04728b39e6740296b852dccdca9b2cb F test/speed1p.test b180e98609c7677382cf618c0ec9b69f789033a8 @@@ -1161,7 -1166,7 +1166,7 @@@ F tool/vdbe_profile.tcl 67746953071a9f8 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff - P 6077ddcd93318e24b9756adaaf293ba9fb3cedf7 - R f7111ea680230454a4775d5c337b77f9 -P 427409ae106cdab7892a6b50fe30c5f52de5addc -R ee65c8e54ebb299c9693aee246a7e200 ++P bf09ce24d054bc68c226064f5f28d97e0e648a13 3bc43594aaeee9225c0590677fcce480bedcb37b ++R 54b60e57b7c4903b7427b2471b549ff9 U drh - Z b4087c0ba17f1174753bea8bd453086a -Z 5a37e5aacc1e047352493d523b6fb849 ++Z 3f220c7986d95ea2653ad2dab9b5d42e diff --cc manifest.uuid index a672982fcb,6c6f1f805d..2809ea21e5 --- a/manifest.uuid +++ b/manifest.uuid @@@ -1,1 -1,1 +1,1 @@@ - bf09ce24d054bc68c226064f5f28d97e0e648a13 -3bc43594aaeee9225c0590677fcce480bedcb37b ++84862d3a095629d20c8e7b8a16f4dc26cd41ab6d diff --cc src/select.c index d71ac94121,5fff010f34..2747c56af7 --- a/src/select.c +++ b/src/select.c @@@ -462,35 -462,21 +462,36 @@@ static void pushOntoSorter Parse *pParse, /* Parser context */ SortCtx *pSort, /* Information about the ORDER BY clause */ Select *pSelect, /* The whole SELECT statement */ - int regData /* Register holding data to be sorted */ + int regData, /* First register holding data to be sorted */ + int nData, /* Number of elements in the data array */ + int nPrefixReg /* No. of reg prior to regData available for use */ ){ - Vdbe *v = pParse->pVdbe; - int nExpr = pSort->pOrderBy->nExpr; - int regRecord = ++pParse->nMem; - int regBase = pParse->nMem+1; - int nOBSat = pSort->nOBSat; - int op; + Vdbe *v = pParse->pVdbe; /* Stmt under construction */ + int bSeq = ((pSort->sortFlags & SORTFLAG_UseSorter)==0); + int nExpr = pSort->pOrderBy->nExpr; /* No. of ORDER BY terms */ + int nBase = nExpr + bSeq + nData; /* Fields in sorter record */ + int regBase; /* Regs for sorter record */ - int regRecord = sqlite3GetTempReg(pParse); /* Assembled sorter record */ ++ int regRecord = ++pParse->nMem; /* Assembled sorter record */ + int nOBSat = pSort->nOBSat; /* ORDER BY terms to skip */ + int op; /* Opcode to add sorter record to sorter */ + + assert( bSeq==0 || bSeq==1 ); + if( nPrefixReg ){ + assert( nPrefixReg==nExpr+bSeq ); + regBase = regData - nExpr - bSeq; + }else{ - regBase = sqlite3GetTempRange(pParse, nBase); ++ regBase = pParse->nMem + 1; ++ pParse->nMem += nBase; + } + sqlite3ExprCodeExprList(pParse, pSort->pOrderBy, regBase, SQLITE_ECEL_DUP); + if( bSeq ){ + sqlite3VdbeAddOp2(v, OP_Sequence, pSort->iECursor, regBase+nExpr); + } + if( nPrefixReg==0 ){ + sqlite3VdbeAddOp3(v, OP_Move, regData, regBase+nExpr+bSeq, nData); + } - pParse->nMem += nExpr+2; /* nExpr+2 registers allocated at regBase */ - sqlite3ExprCacheClear(pParse); - sqlite3ExprCodeExprList(pParse, pSort->pOrderBy, regBase, 0); - sqlite3VdbeAddOp2(v, OP_Sequence, pSort->iECursor, regBase+nExpr); - sqlite3ExprCodeMove(pParse, regData, regBase+nExpr+1, 1); - sqlite3VdbeAddOp3(v, OP_MakeRecord, regBase+nOBSat, nExpr+2-nOBSat,regRecord); + sqlite3VdbeAddOp3(v, OP_MakeRecord, regBase+nOBSat, nBase-nOBSat, regRecord); if( nOBSat>0 ){ int regPrevKey; /* The first nOBSat columns of the previous row */ int addrFirst; /* Address of the OP_IfNot opcode */ @@@ -511,7 -492,7 +512,7 @@@ sqlite3VdbeAddOp3(v, OP_Compare, regPrevKey, regBase, pSort->nOBSat); pOp = sqlite3VdbeGetOp(v, pSort->addrSortIndex); if( pParse->db->mallocFailed ) return; -- pOp->p2 = nKey + 1; ++ pOp->p2 = nKey + nData; pKI = pOp->p4.pKeyInfo; memset(pKI->aSortOrder, 0, pKI->nField); /* Makes OP_Jump below testable */ sqlite3VdbeChangeP4(v, -1, (char*)pKI, P4_KEYINFO);