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:
16
manifest
16
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
|
||||
|
||||
@@ -1 +1 @@
|
||||
76d42921a475c531a77677c3fe73b6da265a878d
|
||||
5aaa2939baa972231def086ed5f9d9ba63302532
|
||||
15
src/select.c
15
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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user