]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Make sure a LIMIT clause on a SELECT cleans up the vdbe stack so that if it
authordrh <drh@noemail.net>
Tue, 2 Mar 2004 18:37:41 +0000 (18:37 +0000)
committerdrh <drh@noemail.net>
Tue, 2 Mar 2004 18:37:41 +0000 (18:37 +0000)
occurs inside a trigger, it won't cause a stack overflow.  Ticket #640. (CVS 1282)

FossilOrigin-Name: 5aaa2939baa972231def086ed5f9d9ba63302532

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

index 7f2507e2674e8db7790566ef3ce66f2d997d2f00..8465fa4fba414b2f09ec07cb7f5b524a1f79ce80 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Updated\saclocal.m4\sand\sconfigure.\s(CVS\s1281)
-D 2004-02-29T15:18:31
+C Make\ssure\sa\sLIMIT\sclause\son\sa\sSELECT\scleans\sup\sthe\svdbe\sstack\sso\sthat\sif\sit\noccurs\sinside\sa\strigger,\sit\swon't\scause\sa\sstack\soverflow.\s\sTicket\s#640.\s(CVS\s1282)
+D 2004-03-02T18:37:41
 F Makefile.in afc6c0377773421633e592347097ad036eef6aeb
 F Makefile.linux-gcc b86a99c493a5bfb402d1d9178dcdc4bd4b32f906
 F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd
@@ -46,7 +46,7 @@ F src/parse.y 023720cb8c3bef74e51738bca78335d0dc6d2cfd
 F src/pragma.c 621d319580e9e23712ec232e8be1786cdae06b36
 F src/printf.c 8c58b7b6d4069eec6ebe2d46bdbc3a89a367bf95
 F src/random.c 775913e0b7fbd6295d21f12a7bd35b46387c44b2
-F src/select.c a8b0f9bfe92001d2399d33832bd6ec57ba492ae7
+F src/select.c fb4360976fdf7b73f5252f274f8129540d5cd141
 F src/shell.c b19e750ffcccf49b626f4b6fefe89c1dbae47e82
 F src/sqlite.h.in 01a7009223517d151da9780b0bb7b748777015dd
 F src/sqliteInt.h 235ce244b62bb26cc9ab394fb7a0724dd4e65c83
@@ -110,7 +110,7 @@ F test/memleak.test 4d5d374c8ea1fc5ac634aed58cac1047848ce65e
 F test/minmax.test d7da9183013ac814a5b032b3542f9caf4c88af42
 F test/misc1.test 0b98d493b0cf55cb5f53e1f3df8107c166eecb5a
 F test/misc2.test 10c2ce26407d37411b96273e552d5095393732be
-F test/misc3.test bd371567b6fec7c1d7fe42a172a551226d271dd2
+F test/misc3.test 3eac0f13a3d8ae71c1c5ec884b0192bd68ae7e5f
 F test/misuse.test 1095f26d1aed406c65e1d2eba651c4bb7c38cbff
 F test/notnull.test 7a08117a71e74b0321aaa937dbeb41a09d6eb1d0
 F test/null.test c14d0f4739f21e929b8115b72bf0c765b6bb1721
@@ -188,7 +188,7 @@ F www/sqlite.tcl 3c83b08cf9f18aa2d69453ff441a36c40e431604
 F www/tclsqlite.tcl b9271d44dcf147a93c98f8ecf28c927307abd6da
 F www/vdbe.tcl 9b9095d4495f37697fd1935d10e14c6015e80aa1
 F www/whentouse.tcl a8335bce47cc2fddb07f19052cb0cb4d9129a8e4
-P 7b3b8968ee9a5349dd6e9ae1e7a311bf8906607c
-R 0d80fa4753fe7d79951a6a308e451a7b
-U a.rottmann
-Z 7c3910c4546d27b133fb0c8d342cad4e
+P 76d42921a475c531a77677c3fe73b6da265a878d
+R dd8609f48345c006180d07e7ef0d5734
+U drh
+Z d1aff38fcd9f7647a8267e5f4641096b
index 0f6a91d9fbb9150ab57f9d7be8391edd00df99fd..5609352d26a5d9f17fef2af440d0021a7bec258f 100644 (file)
@@ -1 +1 @@
-76d42921a475c531a77677c3fe73b6da265a878d
\ No newline at end of file
+5aaa2939baa972231def086ed5f9d9ba63302532
\ No newline at end of file
index 01949aac8d254567be2dd979e9d634a1b2854c59..f47281748b323f9cc589d2d8f37729e0e3a561cc 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.159 2004/02/25 13:47:33 drh Exp $
+** $Id: select.c,v 1.160 2004/03/02 18:37:41 drh Exp $
 */
 #include "sqliteInt.h"
 
@@ -564,18 +564,19 @@ static void generateSortTail(
   int eDest,       /* Write the sorted results here */
   int iParm        /* Optional parameter associated with eDest */
 ){
-  int end = sqliteVdbeMakeLabel(v);
+  int end1 = sqliteVdbeMakeLabel(v);
+  int end2 = sqliteVdbeMakeLabel(v);
   int addr;
   if( eDest==SRT_Sorter ) return;
   sqliteVdbeAddOp(v, OP_Sort, 0, 0);
-  addr = sqliteVdbeAddOp(v, OP_SortNext, 0, end);
+  addr = sqliteVdbeAddOp(v, OP_SortNext, 0, end1);
   if( p->iOffset>=0 ){
     sqliteVdbeAddOp(v, OP_MemIncr, p->iOffset, addr+4);
     sqliteVdbeAddOp(v, OP_Pop, 1, 0);
     sqliteVdbeAddOp(v, OP_Goto, 0, addr);
   }
   if( p->iLimit>=0 ){
-    sqliteVdbeAddOp(v, OP_MemIncr, p->iLimit, end);
+    sqliteVdbeAddOp(v, OP_MemIncr, p->iLimit, end2);
   }
   switch( eDest ){
     case SRT_Callback: {
@@ -601,7 +602,7 @@ static void generateSortTail(
     case SRT_Mem: {
       assert( nColumn==1 );
       sqliteVdbeAddOp(v, OP_MemStore, iParm, 1);
-      sqliteVdbeAddOp(v, OP_Goto, 0, end);
+      sqliteVdbeAddOp(v, OP_Goto, 0, end1);
       break;
     }
     case SRT_Subroutine: {
@@ -619,7 +620,9 @@ static void generateSortTail(
     }
   }
   sqliteVdbeAddOp(v, OP_Goto, 0, addr);
-  sqliteVdbeResolveLabel(v, end);
+  sqliteVdbeResolveLabel(v, end2);
+  sqliteVdbeAddOp(v, OP_Pop, 1, 0);
+  sqliteVdbeResolveLabel(v, end1);
   sqliteVdbeAddOp(v, OP_SortReset, 0, 0);
 }
 
index 0b1fbf3790c072c8737bd3370f8e775167a87a6c..946c2510167f494c4ee7de014edbcf9a21778af5 100644 (file)
@@ -13,7 +13,7 @@
 # This file implements tests for miscellanous features that were
 # left out of other test files.
 #
-# $Id: misc3.test,v 1.8 2004/02/24 01:04:12 drh Exp $
+# $Id: misc3.test,v 1.9 2004/03/02 18:37:42 drh Exp $
 
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
@@ -251,4 +251,40 @@ do_test misc3-6.3 {
   catchsql {ROLLBACK}
 } {0 {}}
 
+# Ticket #640:  vdbe stack overflow with a LIMIT clause on a SELECT inside
+# of a trigger.
+#
+do_test misc3-7.1 {
+  execsql {
+    BEGIN;
+    CREATE TABLE y1(a);
+    CREATE TABLE y2(b);
+    CREATE TABLE y3(c);
+    CREATE TRIGGER r1 AFTER DELETE ON y1 FOR EACH ROW BEGIN
+      INSERT INTO y3(c) SELECT b FROM y2 ORDER BY b LIMIT 1;
+    END;
+    INSERT INTO y1 VALUES(1);
+    INSERT INTO y1 VALUES(2);
+    INSERT INTO y1 SELECT a+2 FROM y1;
+    INSERT INTO y1 SELECT a+4 FROM y1;
+    INSERT INTO y1 SELECT a+8 FROM y1;
+    INSERT INTO y1 SELECT a+16 FROM y1;
+    INSERT INTO y2 SELECT a FROM y1;
+    COMMIT;
+    SELECT count(*) FROM y1;
+  }
+} 32
+do_test misc3-7.2 {
+  execsql {
+    DELETE FROM y1;
+    SELECT count(*) FROM y1;
+  }
+} 0
+do_test misc3-7.3 {
+  execsql {
+    SELECT count(*) FROM y3;
+  }
+} 32
+
+
 finish_test