-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
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
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
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
-76d42921a475c531a77677c3fe73b6da265a878d
\ No newline at end of file
+5aaa2939baa972231def086ed5f9d9ba63302532
\ No newline at end of file
** 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"
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: {
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: {
}
}
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);
}
# 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
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