From: dan Date: Mon, 2 Jul 2018 17:14:37 +0000 (+0000) Subject: Fix a segfault caused by having identical window functions in the select-list X-Git-Tag: version-3.25.0~173 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f607bec7493d938f9b74f65dd0cfe516fe4d6eaf;p=thirdparty%2Fsqlite.git Fix a segfault caused by having identical window functions in the select-list and ORDER BY clause of a SELECT statement. FossilOrigin-Name: 693b4350d741391226a33ab6a05eaad61e8ef1590176f01e8aed2a212e2d6419 --- diff --git a/manifest b/manifest index 50d0feff5d..6f4766f979 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\scrash\scaused\sby\sa\sLIKE\spattern\sthat\sconsists\sof\sa\ssingle\sescape\ncharacter. -D 2018-07-02T15:03:50.160 +C Fix\sa\ssegfault\scaused\sby\shaving\sidentical\swindow\sfunctions\sin\sthe\sselect-list\nand\sORDER\sBY\sclause\sof\sa\sSELECT\sstatement. +D 2018-07-02T17:14:37.869 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 0a3a6c81e6fcb969ff9106e882f0a08547014ba463cb6beca4c4efaecc924ee6 @@ -493,7 +493,7 @@ F src/pragma.h bb83728944b42f6d409c77f5838a8edbdb0fe83046c5496ffc9602b40340a324 F src/prepare.c e966ecc97c3671ff0e96227c8c877b83f2d33ea371ee190bbf1698b36b5605c0 F src/printf.c 7f6f3cba8e0c49c19e30a1ff4e9aeda6e06814dcbad4b664a69e1b6cb6e7e365 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c f2f5533afd25cef8fa9d01cfd1ae0ef1e62872a9c7080778099b220b223b3816 +F src/resolve.c 1f965d00b4c26b7eb886b90c687069f5db0d05157dbc1ca406fe88e990eac671 F src/rowset.c 7b7e7e479212e65b723bf40128c7b36dc5afdfac F src/select.c 82aa95aa1cfeadef5ecae1126afff1efca64c49050bbf7116425a8a1d4fc5e6c F src/shell.c.in 8578421c5fb2a972461b2a996f7173646e55e0dbd2a2eee30c8f5dc7d3dbadfd @@ -1626,7 +1626,7 @@ F test/window3.test 87fb18021903fc4d1659b8b2092aea55d611a9606cfa7272686234e5197c F test/window4.tcl 7cec7e578aa9f78b7265bff8d552cda17a1d8d89f0449d0e74970a527b8846f5 F test/window4.test dcd8767869988e0d23d56bc3f8b46ec116de23127b81b5f66fd48d5529072ed1 F test/window5.test 8187f46597c90b73e8f96659e893353cbda337479cc582f7a488eab351ba08d3 -F test/window6.test 6e817df58449ec92db67a76d4840ad5f4a6662af0d2e22328288523e2ba537e4 +F test/window6.test 6a7df4ab43b3acaf21486d023f0ae7401e189837c4d10a244f06ef5b809965fa F test/windowfault.test 97d5fc404308edb579a5a183e294ed874c844ecf01f0a28ba46df3141ebaee1f F test/with1.test 58475190cd8caaeebea8cfeb2a264ec97a0c492b8ffe9ad20cefbb23df462f96 F test/with2.test e0030e2f0267a910d6c0e4f46f2dfe941c1cc0d4f659ba69b3597728e7e8f1ab @@ -1744,7 +1744,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 4f3c8a82fd1c5b14d84f2301e34cfc8d52fe4b3a60840c39e895c11f2da529d9 -R 947603f57703a72e98c481cdb1471c29 +P bb9bfc3a12dfb89b1c58f5551cdc89ab7b0fbe03f285f2ed86611786ed02ffd9 +R 869ea010a75065e221583f71c948b611 U dan -Z b6e0a0e0cc4dd2ca9103d3009ba7802b +Z 376f884c9201b63aa371e9665eabb618 diff --git a/manifest.uuid b/manifest.uuid index 72abf34945..e0b1989aed 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -bb9bfc3a12dfb89b1c58f5551cdc89ab7b0fbe03f285f2ed86611786ed02ffd9 \ No newline at end of file +693b4350d741391226a33ab6a05eaad61e8ef1590176f01e8aed2a212e2d6419 \ No newline at end of file diff --git a/src/resolve.c b/src/resolve.c index 7c1d4b1620..13deeca92d 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -1243,6 +1243,17 @@ static int resolveOrderGroupBy( } for(j=0; jpEList->nExpr; j++){ if( sqlite3ExprCompare(0, pE, pSelect->pEList->a[j].pExpr, -1)==0 ){ +#ifndef SQLITE_OMIT_WINDOWFUNC + if( pE->pWin ){ + Window **pp; + for(pp=&pSelect->pWin; *pp; pp=&(*pp)->pNextWin){ + if( *pp==pE->pWin ){ + *pp = (*pp)->pNextWin; + break; + } + } + } +#endif pItem->u.x.iOrderByCol = j+1; } } diff --git a/test/window6.test b/test/window6.test index 040a570135..a244dfff60 100644 --- a/test/window6.test +++ b/test/window6.test @@ -170,6 +170,26 @@ do_execsql_test 7.1 { SELECT count(*) FROM t1 WHERE x LIKE '!' ESCAPE '!'; } {0} +#------------------------------------------------------------------------- +# +do_execsql_test 8.0 { + CREATE TABLE IF NOT EXISTS "sample" ( + "id" INTEGER NOT NULL PRIMARY KEY, + "counter" INTEGER NOT NULL, + "value" REAL NOT NULL + ); + + INSERT INTO "sample" (counter, value) + VALUES (1, 10.), (1, 20.), (2, 1.), (2, 3.), (3, 100.); +} -finish_test +do_execsql_test 8.1 { + SELECT "counter", "value", RANK() OVER w AS "rank" + FROM "sample" + WINDOW w AS (PARTITION BY "counter" ORDER BY "value" DESC) + ORDER BY "counter", RANK() OVER w +} { + 1 20.0 1 1 10.0 2 2 3.0 1 2 1.0 2 3 100.0 1 +} +finish_test