From: danielk1977 Date: Tue, 1 Jul 2008 17:39:27 +0000 (+0000) Subject: Fix another memory leak related to UNION ALL and sub-selects. (CVS 5336) X-Git-Tag: version-3.6.10~841 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5e7ad5085838c2dfce49ea35ea9770e95d48e398;p=thirdparty%2Fsqlite.git Fix another memory leak related to UNION ALL and sub-selects. (CVS 5336) FossilOrigin-Name: 56109b9a1f600ab3f16769aba0d47dcf782bbc95 --- diff --git a/manifest b/manifest index 4288c90631..dfd0a1b917 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C In\slemon:\scoalesce\sidentical\sdestructors.\s(CVS\s5335) -D 2008-07-01T17:13:57 +C Fix\sanother\smemory\sleak\srelated\sto\sUNION\sALL\sand\ssub-selects.\s(CVS\s5336) +D 2008-07-01T17:39:27 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0 F Makefile.in 325dfac0a0dd1cb4d975f1ace6453157892e6042 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654 @@ -140,7 +140,7 @@ F src/pragma.c 9a95f5b3708f6d3ddd987eab5f369a19ffcb6795 F src/prepare.c aba51dad52308e3d9d2074d8ff4e612e7f1cab51 F src/printf.c 8b063da9dcde26b7c500a01444b718d86f21bc6e F src/random.c 5c754319d38abdd6acd74601ee0105504adc508a -F src/select.c 8e9951054ae130661b8e45a74e21d5422c9bb8e2 +F src/select.c 0b01cf5fb40589d9198f33c9ced1991ac628a2f8 F src/shell.c 484e7297e066f22830f9c15d7abbcdd2acb097b0 F src/sqlite.h.in 76c144d23f8824e8811e837e9396b9f1361f5902 F src/sqlite3ext.h 1e3887c9bd3ae66cb599e922824b04cd0d0f2c3e @@ -449,7 +449,7 @@ F test/select7.test 7906735805cfbee4dddc0bed4c14e68d7f5f9c5f F test/select8.test 391de11bdd52339c30580dabbbbe97e3e9a3c79d F test/select9.test b4007b15396cb7ba2615cab31e1973b572e43210 F test/selectA.test e4501789a1d0fe9d00db15187623fb5b7031357b -F test/selectB.test effd81c29572fb35d8aa39e4b73dbf194f5f68ea +F test/selectB.test afc43b5bbcfe405f82155f19f74f9622146ea7ad F test/server1.test f5b790d4c0498179151ca8a7715a65a7802c859c F test/shared.test c6769531e0cb751d46a9838c0532d3786606c0f6 F test/shared2.test 0ee9de8964d70e451936a48c41cb161d9134ccf4 @@ -596,7 +596,7 @@ F tool/speedtest16.c c8a9c793df96db7e4933f0852abb7a03d48f2e81 F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff F tool/speedtest8.c 1dbced29de5f59ba2ebf877edcadf171540374d1 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e -P 5c9cc22cd8e9bec3d8622d2c354423281f2db0fb -R 572c6d45547d9cace3b11f3c52551913 -U drh -Z d8dbcd09b221a01c995fcf2ef0061da2 +P 3447086cd3f6e9b89a8cf61afcf4715977bbf4cd +R cb3df126aa8389a3fd8ddcad9fc0443a +U danielk1977 +Z 22d640258a50fd055c660f5120001e9b diff --git a/manifest.uuid b/manifest.uuid index 75e29d7502..3012663668 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3447086cd3f6e9b89a8cf61afcf4715977bbf4cd \ No newline at end of file +56109b9a1f600ab3f16769aba0d47dcf782bbc95 \ No newline at end of file diff --git a/src/select.c b/src/select.c index 811ded6940..f0702a87db 100644 --- a/src/select.c +++ b/src/select.c @@ -12,7 +12,7 @@ ** This file contains C code routines that are called by the parser ** to handle SELECT statements in SQLite. ** -** $Id: select.c,v 1.443 2008/07/01 16:05:26 danielk1977 Exp $ +** $Id: select.c,v 1.444 2008/07/01 17:39:27 danielk1977 Exp $ */ #include "sqliteInt.h" @@ -2895,6 +2895,9 @@ static int multiSelectOrderBy( /* Reassembly the compound query so that it will be freed correctly ** by the calling function */ + if( p->pPrior ){ + sqlite3SelectDelete(p->pPrior); + } p->pPrior = pPrior; /*** TBD: Insert subroutine calls to close cursors on incomplete diff --git a/test/selectB.test b/test/selectB.test index f988d671b7..6015796ef8 100644 --- a/test/selectB.test +++ b/test/selectB.test @@ -10,7 +10,7 @@ #*********************************************************************** # This file implements regression tests for SQLite library. # -# $Id: selectB.test,v 1.3 2008/07/01 16:05:26 danielk1977 Exp $ +# $Id: selectB.test,v 1.4 2008/07/01 17:39:28 danielk1977 Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl @@ -144,56 +144,154 @@ for {set ii 1} {$ii <= 2} {incr ii} { UNION ALL SELECT c FROM t1 WHERE c>=10 ORDER BY 1 LIMIT 3 } {12 12 14} - } - -do_test selectB-2.1 { +do_test selectB-3.0 { execsql { - SELECT DISTINCT * FROM - (SELECT c FROM t1 UNION ALL SELECT e FROM t2) - ORDER BY 1; + DROP INDEX i1; + DROP INDEX i2; } -} {6 12 15 18 24} +} {} -do_test selectB-2.2 { - execsql { - SELECT c, count(*) FROM - (SELECT c FROM t1 UNION ALL SELECT e FROM t2) - GROUP BY c ORDER BY 1; - } -} {6 2 12 1 15 1 18 1 24 1} -do_test selectB-2.3 { - execsql { - SELECT c, count(*) FROM - (SELECT c FROM t1 UNION ALL SELECT e FROM t2) - GROUP BY c HAVING count(*)>1; - } -} {6 2} -do_test selectB-2.4 { - execsql { - SELECT t4.c, t3.a FROM - (SELECT c FROM t1 UNION ALL SELECT e FROM t2) AS t4, t1 AS t3 - WHERE t3.a=14 - ORDER BY 1 - } -} {6 14 6 14 12 14 15 14 18 14 24 14} +for {set ii 3} {$ii <= 4} {incr ii} { -do_test selectB-2.5 { - execsql { - SELECT d FROM t2 - EXCEPT - SELECT a FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2) + if {$ii == 4} { + do_test selectB-4.0 { + execsql { + CREATE INDEX i1 ON t1(a); + CREATE INDEX i2 ON t1(b); + CREATE INDEX i3 ON t1(c); + CREATE INDEX i4 ON t2(d); + CREATE INDEX i5 ON t2(e); + CREATE INDEX i6 ON t2(f); + } + } {} } -} {} -do_test selectB-2.6 { - execsql { - SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2) - EXCEPT - SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2) - } -} {} + do_test selectB-$ii.1 { + execsql { + SELECT DISTINCT * FROM + (SELECT c FROM t1 UNION ALL SELECT e FROM t2) + ORDER BY 1; + } + } {6 12 15 18 24} + + do_test selectB-$ii.2 { + execsql { + SELECT c, count(*) FROM + (SELECT c FROM t1 UNION ALL SELECT e FROM t2) + GROUP BY c ORDER BY 1; + } + } {6 2 12 1 15 1 18 1 24 1} + do_test selectB-$ii.3 { + execsql { + SELECT c, count(*) FROM + (SELECT c FROM t1 UNION ALL SELECT e FROM t2) + GROUP BY c HAVING count(*)>1; + } + } {6 2} + do_test selectB-$ii.4 { + execsql { + SELECT t4.c, t3.a FROM + (SELECT c FROM t1 UNION ALL SELECT e FROM t2) AS t4, t1 AS t3 + WHERE t3.a=14 + ORDER BY 1 + } + } {6 14 6 14 12 14 15 14 18 14 24 14} + + do_test selectB-$ii.5 { + execsql { + SELECT d FROM t2 + EXCEPT + SELECT a FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2) + } + } {} + do_test selectB-$ii.6 { + execsql { + SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2) + EXCEPT + SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2) + } + } {} + do_test selectB-$ii.7 { + execsql { + SELECT c FROM t1 + EXCEPT + SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2) + } + } {12} + do_test selectB-$ii.8 { + execsql { + SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2) + EXCEPT + SELECT c FROM t1 + } + } {9 15 24 27} + do_test selectB-$ii.9 { + execsql { + SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2) + EXCEPT + SELECT c FROM t1 + ORDER BY c DESC + } + } {27 24 15 9} + + do_test selectB-$ii.10 { + execsql { + SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2) + UNION + SELECT c FROM t1 + ORDER BY c DESC + } + } {27 24 18 15 12 9 6} + do_test selectB-$ii.11 { + execsql { + SELECT c FROM t1 + UNION + SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2) + ORDER BY c + } + } {6 9 12 15 18 24 27} + do_test selectB-$ii.12 { + execsql { + SELECT c FROM t1 UNION SELECT e FROM t2 UNION ALL SELECT f FROM t2 + ORDER BY c + } + } {6 9 12 15 18 18 24 27} + do_test selectB-$ii.13 { + execsql { + SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2) + UNION + SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2) + ORDER BY 1 + } + } {6 9 15 18 24 27} + + do_test selectB-$ii.14 { + execsql { + SELECT c FROM t1 + INTERSECT + SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2) + ORDER BY 1 + } + } {6 18} + do_test selectB-$ii.15 { + execsql { + SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2) + INTERSECT + SELECT c FROM t1 + ORDER BY 1 + } + } {6 18} + do_test selectB-$ii.16 { + execsql { + SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2) + INTERSECT + SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2) + ORDER BY 1 + } + } {6 9 15 18 24 27} +} finish_test