1
0
mirror of https://github.com/sqlite/sqlite.git synced 2026-01-06 08:01:16 +03:00

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
This commit is contained in:
drh
2004-03-02 18:37:41 +00:00
parent 9bc8b93f41
commit b1aa04fccc
4 changed files with 55 additions and 16 deletions

View File

@@ -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

View File

@@ -1 +1 @@
76d42921a475c531a77677c3fe73b6da265a878d
5aaa2939baa972231def086ed5f9d9ba63302532

View 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);
}

View 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