From 04a962fe02e030f10f3bb1b984bb7a49da647a3b Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 3 Sep 2011 16:42:38 +0000 Subject: [PATCH] Simplification and performance tweaks in vdbeSorterMerge(). FossilOrigin-Name: 99e34bdce4ccca15b79159b03b96787e7a7ff85b --- manifest | 14 ++++++------- manifest.uuid | 2 +- src/vdbesort.c | 54 +++++++++++++++++++++----------------------------- 3 files changed, 31 insertions(+), 39 deletions(-) diff --git a/manifest b/manifest index dd25184f0e..aa9396df26 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Reduce\sthe\snumber\sof\sVdbeRecordUnpack()\scalls\smade\sin\svdbesort.c. -D 2011-09-03T14:36:13.912 +C Simplification\sand\sperformance\stweaks\sin\svdbeSorterMerge(). +D 2011-09-03T16:42:38.728 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in d314143fa6be24828021d3f583ad37d9afdce505 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -245,7 +245,7 @@ F src/vdbeapi.c 11dc47987abacb76ad016dcf5abc0dc422482a98 F src/vdbeaux.c e58acbc5ea3823922a0cd8fa21f94f39af51ee88 F src/vdbeblob.c f024f0bf420f36b070143c32b15cc7287341ffd3 F src/vdbemem.c 5e6effb96dd53d233361cbfaa3f0a43b9af689e9 -F src/vdbesort.c 5e38e7e1f5f6900b1b8bea49decd23c69221aed9 +F src/vdbesort.c e6d6f0c2aa003f7cbdea8c9be47a15a8e854fb97 F src/vdbetrace.c 5d0dc3d5fd54878cc8d6d28eb41deb8d5885b114 F src/vtab.c 901791a47318c0562cd0c676a2c6ff1bc530e582 F src/wal.c 3154756177d6219e233d84291d5b05f4e06ff5e9 @@ -961,7 +961,7 @@ F tool/symbols.sh caaf6ccc7300fd43353318b44524853e222557d5 F tool/tostr.awk e75472c2f98dd76e06b8c9c1367f4ab07e122d06 F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f F tool/warnings.sh b7fdb2cc525f5ef4fa43c80e771636dd3690f9d2 -P 68e26c4487696d194ee85370380e4b0e56d206ee -R f6e37dce79fea0b74c498631cfb45ff1 -U dan -Z cc6b7d2a23c219696518afb4690c5277 +P 666c2c3cff51dac2ba5689b75705d99c3705673b +R cfceda33d1a4c239172824f11326438a +U drh +Z 0da609a19e6bdcd2176629a62a8129db diff --git a/manifest.uuid b/manifest.uuid index af74b9885a..f0c89b9c6d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -666c2c3cff51dac2ba5689b75705d99c3705673b \ No newline at end of file +99e34bdce4ccca15b79159b03b96787e7a7ff85b \ No newline at end of file diff --git a/src/vdbesort.c b/src/vdbesort.c index 9e169c3e36..6681aad52d 100644 --- a/src/vdbesort.c +++ b/src/vdbesort.c @@ -490,44 +490,36 @@ static int vdbeSorterMerge( int rc = SQLITE_OK; SorterRecord *pFinal = 0; SorterRecord **pp = &pFinal; - int bKey2InSpace = 0; /* True if pCsr->aSpace contains key2 */ + void *pVal2 = p2 ? p2->pVal : 0; - while( p1 || p2 ){ - if( p1==0 ){ - *pp = p2; - p2 = 0; - }else if( p2==0 ){ + while( p1 && p2 ){ + int res; + rc = vdbeSorterCompare(pCsr, 0, p1->pVal, p1->nVal, pVal2, p2->nVal, &res); + if( rc!=SQLITE_OK ){ + *pp = 0; + vdbeSorterRecordFree(db, p1); + vdbeSorterRecordFree(db, p2); + vdbeSorterRecordFree(db, pFinal); + *ppOut = 0; + return rc; + } + if( res<=0 ){ *pp = p1; - p1 = 0; + pp = &p1->pNext; + p1 = p1->pNext; + pVal2 = 0; }else{ - int res; - rc = vdbeSorterCompare(pCsr, 0, - p1->pVal, p1->nVal, (bKey2InSpace ? 0 : p2->pVal), p2->nVal, &res - ); - if( rc!=SQLITE_OK ){ - vdbeSorterRecordFree(db, p1); - vdbeSorterRecordFree(db, p2); - vdbeSorterRecordFree(db, pFinal); - pFinal = 0; - break; - } - if( res<=0 ){ - *pp = p1; - pp = &p1->pNext; - p1 = p1->pNext; - bKey2InSpace = 1; - }else{ - *pp = p2; - pp = &p2->pNext; - p2 = p2->pNext; - bKey2InSpace = 0; - } - *pp = 0; + *pp = p2; + pp = &p2->pNext; + p2 = p2->pNext; + if( p2==0 ) break; + pVal2 = p2->pVal; } } + *pp = p1 ? p1 : p2; *ppOut = pFinal; - return rc; + return SQLITE_OK; } /* -- 2.39.5