]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix another memory leak related to UNION ALL and sub-selects. (CVS 5336)
authordanielk1977 <danielk1977@noemail.net>
Tue, 1 Jul 2008 17:39:27 +0000 (17:39 +0000)
committerdanielk1977 <danielk1977@noemail.net>
Tue, 1 Jul 2008 17:39:27 +0000 (17:39 +0000)
FossilOrigin-Name: 56109b9a1f600ab3f16769aba0d47dcf782bbc95

manifest
manifest.uuid
src/select.c
test/selectB.test

index 4288c90631007158bc1b8ef3375d7653cd06f00d..dfd0a1b91760d2eb329332c9f57431ac54c8af9f 100644 (file)
--- 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
index 75e29d7502a6606a6800b93bd19e7b5ddb580c82..3012663668289890882c2f1875be6bbeb9b1070d 100644 (file)
@@ -1 +1 @@
-3447086cd3f6e9b89a8cf61afcf4715977bbf4cd
\ No newline at end of file
+56109b9a1f600ab3f16769aba0d47dcf782bbc95
\ No newline at end of file
index 811ded69404b746d762bf124541ffe98ba954cdf..f0702a87db6d384b4a5df6db4cfaf34f8f864c18 100644 (file)
@@ -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
index f988d671b759a7ec98c707b90aa5ab71c1a8a58c..6015796ef8f9c1977db02f7c43f1ed480bc593c8 100644 (file)
@@ -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