From: drh Date: Tue, 2 Mar 2004 18:37:41 +0000 (+0000) Subject: Make sure a LIMIT clause on a SELECT cleans up the vdbe stack so that if it X-Git-Tag: version-3.6.10~4786 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b1aa04fcccb4a078c18152dfd2107e6c71aa9454;p=thirdparty%2Fsqlite.git Make sure a LIMIT clause on a SELECT cleans up the vdbe stack so that if it occurs inside a trigger, it won't cause a stack overflow. Ticket #640. (CVS 1282) FossilOrigin-Name: 5aaa2939baa972231def086ed5f9d9ba63302532 --- diff --git a/manifest b/manifest index 7f2507e267..8465fa4fba 100644 --- 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 diff --git a/manifest.uuid b/manifest.uuid index 0f6a91d9fb..5609352d26 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -76d42921a475c531a77677c3fe73b6da265a878d \ No newline at end of file +5aaa2939baa972231def086ed5f9d9ba63302532 \ No newline at end of file diff --git a/src/select.c b/src/select.c index 01949aac8d..f47281748b 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.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); } diff --git a/test/misc3.test b/test/misc3.test index 0b1fbf3790..946c251016 100644 --- a/test/misc3.test +++ b/test/misc3.test @@ -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