mirror of
https://github.com/sqlite/sqlite.git
synced 2025-07-29 08:01:23 +03:00
Fix LIMIT and OFFSET so that they work and do not leak memory even on
complex queries involving deeply nested views of UNION ALL compounds. Ticket [db4d96798da8]. Secondary to ticket [d58ccbb3f1b7]. FossilOrigin-Name: 497ee36cb8d07c936e6896135163c5cd7e94bdde
This commit is contained in:
14
manifest
14
manifest
@ -1,5 +1,5 @@
|
||||
C New\sdebugging\spragmas:\s\sPRAGMA\svdbe_debug=ON\sis\sshort-hand\sfor\sthe\ssql_trace,\nvdbe_listing,\sand\svdbe_trace\spragmas.\s\sPRAGMA\svdbe_debug\senables\stracing\sof\nsqlite3VdbeAddOp()\scalls.\s\sNone\sof\sthis\sis\sactive\sunless\scompiled\swith\nSQLITE_DEBUG.
|
||||
D 2013-01-29T19:14:31.718
|
||||
C Fix\sLIMIT\sand\sOFFSET\sso\sthat\sthey\swork\sand\sdo\snot\sleak\smemory\seven\son\ncomplex\squeries\sinvolving\sdeeply\snested\sviews\sof\sUNION\sALL\scompounds.\nTicket\s[db4d96798da8].\s\sSecondary\sto\sticket\s[d58ccbb3f1b7].
|
||||
D 2013-01-29T23:55:50.355
|
||||
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
|
||||
F Makefile.in a48faa9e7dd7d556d84f5456eabe5825dd8a6282
|
||||
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
|
||||
@ -174,7 +174,7 @@ F src/printf.c 4a9f882f1c1787a8b494a2987765acf9d97ac21f
|
||||
F src/random.c cd4a67b3953b88019f8cd4ccd81394a8ddfaba50
|
||||
F src/resolve.c 0bca3bf694f14f96a13873d87f62d6a6f38f913f
|
||||
F src/rowset.c 64655f1a627c9c212d9ab497899e7424a34222e0
|
||||
F src/select.c 51232abd81ba0a1359297f07df98ba4926a0b32d
|
||||
F src/select.c 741c623c70c09b5fbe55d8ae6413d9215c1dedbf
|
||||
F src/shell.c 266791241d7add796ccce2317977ae6c3c67d77f
|
||||
F src/sqlite.h.in 39cc33bb08897c748fe3383c29ccf56585704177
|
||||
F src/sqlite3.rc fea433eb0a59f4c9393c8e6d76a6e2596b1fe0c0
|
||||
@ -576,7 +576,7 @@ F test/lastinsert.test 474d519c68cb79d07ecae56a763aa7f322c72f51
|
||||
F test/laststmtchanges.test ae613f53819206b3222771828d024154d51db200
|
||||
F test/like.test 0e5412f4dac4a849f613e1ef8b529d56a6e31d08
|
||||
F test/like2.test 3b2ee13149ba4a8a60b59756f4e5d345573852da
|
||||
F test/limit.test 2db7b3b34fb925b8e847d583d2eb67531d0ce67e
|
||||
F test/limit.test d31ab07cd32672b4520f98edb85998b8ee06ee67
|
||||
F test/loadext.test 2b5e249c51c986a5aff1f0950cf7ba30976c8f22
|
||||
F test/loadext2.test 0bcaeb4d81cd5b6e883fdfea3c1bdbe1f173cbca
|
||||
F test/lock.test 87af515b0c4cf928576d0f89946d67d7c265dfb4
|
||||
@ -1034,7 +1034,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381
|
||||
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
|
||||
F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381
|
||||
F tool/win/sqlite.vsix 97894c2790eda7b5bce3cc79cb2a8ec2fde9b3ac
|
||||
P a6499c2521637931661ed4d3afc4f96f91c69785
|
||||
R 1966f971ee35330a9cfdb2fe42a708ea
|
||||
P ae565ff3e0836b0cb45cc0ba7f27fa8cb2d21d77
|
||||
R a56ec092a082ca5a9e2e733b6db84cc8
|
||||
U drh
|
||||
Z 4b24169152f5fb24a8eeab17cd2e55a2
|
||||
Z c238cfe2534c4131063084d96b99dd3f
|
||||
|
@ -1 +1 @@
|
||||
ae565ff3e0836b0cb45cc0ba7f27fa8cb2d21d77
|
||||
497ee36cb8d07c936e6896135163c5cd7e94bdde
|
@ -1707,6 +1707,8 @@ static int multiSelect(
|
||||
int addr = 0;
|
||||
int nLimit;
|
||||
assert( !pPrior->pLimit );
|
||||
pPrior->iLimit = p->iLimit;
|
||||
pPrior->iOffset = p->iOffset;
|
||||
pPrior->pLimit = p->pLimit;
|
||||
pPrior->pOffset = p->pOffset;
|
||||
explainSetInteger(iSub1, pParse->iNextSelectId);
|
||||
@ -2963,12 +2965,15 @@ static int flattenSubquery(
|
||||
Select *pNew;
|
||||
ExprList *pOrderBy = p->pOrderBy;
|
||||
Expr *pLimit = p->pLimit;
|
||||
Expr *pOffset = p->pOffset;
|
||||
Select *pPrior = p->pPrior;
|
||||
p->pOrderBy = 0;
|
||||
p->pSrc = 0;
|
||||
p->pPrior = 0;
|
||||
p->pLimit = 0;
|
||||
p->pOffset = 0;
|
||||
pNew = sqlite3SelectDup(db, p, 0);
|
||||
p->pOffset = pOffset;
|
||||
p->pLimit = pLimit;
|
||||
p->pOrderBy = pOrderBy;
|
||||
p->pSrc = pSrc;
|
||||
|
152
test/limit.test
152
test/limit.test
@ -468,5 +468,157 @@ do_test limit-12.4 {
|
||||
}
|
||||
} {1 {no such column: x}}
|
||||
|
||||
db close
|
||||
sqlite3_shutdown
|
||||
sqlite3_config_lookaside 0 0
|
||||
sqlite3_initialize
|
||||
sqlite3 db :memory:
|
||||
# Ticket [db4d96798da8b]
|
||||
# LIMIT does not work with nested views containing UNION ALL
|
||||
#
|
||||
do_test limit-13.1 {
|
||||
db eval {
|
||||
CREATE TABLE t13(x);
|
||||
INSERT INTO t13 VALUES(1),(2);
|
||||
CREATE VIEW v13a AS SELECT x AS y FROM t13;
|
||||
CREATE VIEW v13b AS SELECT y AS z FROM v13a UNION ALL SELECT y+10 FROM v13a;
|
||||
CREATE VIEW v13c AS SELECT z FROM v13b UNION ALL SELECT z+20 FROM v13b;
|
||||
}
|
||||
} {}
|
||||
do_test limit-13.2 {
|
||||
db eval {SELECT z FROM v13c LIMIT 1}
|
||||
} {1}
|
||||
do_test limit-13.3 {
|
||||
db eval {SELECT z FROM v13c LIMIT 2}
|
||||
} {1 2}
|
||||
do_test limit-13.4 {
|
||||
db eval {SELECT z FROM v13c LIMIT 3}
|
||||
} {1 2 11}
|
||||
do_test limit-13.5 {
|
||||
db eval {SELECT z FROM v13c LIMIT 4}
|
||||
} {1 2 11 12}
|
||||
do_test limit-13.6 {
|
||||
db eval {SELECT z FROM v13c LIMIT 5}
|
||||
} {1 2 11 12 21}
|
||||
do_test limit-13.7 {
|
||||
db eval {SELECT z FROM v13c LIMIT 6}
|
||||
} {1 2 11 12 21 22}
|
||||
do_test limit-13.8 {
|
||||
db eval {SELECT z FROM v13c LIMIT 7}
|
||||
} {1 2 11 12 21 22 31}
|
||||
do_test limit-13.9 {
|
||||
db eval {SELECT z FROM v13c LIMIT 8}
|
||||
} {1 2 11 12 21 22 31 32}
|
||||
do_test limit-13.10 {
|
||||
db eval {SELECT z FROM v13c LIMIT 9}
|
||||
} {1 2 11 12 21 22 31 32}
|
||||
do_test limit-13.11 {
|
||||
db eval {SELECT z FROM v13c LIMIT 1 OFFSET 1}
|
||||
} {2}
|
||||
do_test limit-13.12 {
|
||||
db eval {SELECT z FROM v13c LIMIT 2 OFFSET 1}
|
||||
} {2 11}
|
||||
do_test limit-13.13 {
|
||||
db eval {SELECT z FROM v13c LIMIT 3 OFFSET 1}
|
||||
} {2 11 12}
|
||||
do_test limit-13.14 {
|
||||
db eval {SELECT z FROM v13c LIMIT 4 OFFSET 1}
|
||||
} {2 11 12 21}
|
||||
do_test limit-13.15 {
|
||||
db eval {SELECT z FROM v13c LIMIT 5 OFFSET 1}
|
||||
} {2 11 12 21 22}
|
||||
do_test limit-13.16 {
|
||||
db eval {SELECT z FROM v13c LIMIT 6 OFFSET 1}
|
||||
} {2 11 12 21 22 31}
|
||||
do_test limit-13.17 {
|
||||
db eval {SELECT z FROM v13c LIMIT 7 OFFSET 1}
|
||||
} {2 11 12 21 22 31 32}
|
||||
do_test limit-13.18 {
|
||||
db eval {SELECT z FROM v13c LIMIT 8 OFFSET 1}
|
||||
} {2 11 12 21 22 31 32}
|
||||
do_test limit-13.21 {
|
||||
db eval {SELECT z FROM v13c LIMIT 1 OFFSET 2}
|
||||
} {11}
|
||||
do_test limit-13.22 {
|
||||
db eval {SELECT z FROM v13c LIMIT 2 OFFSET 2}
|
||||
} {11 12}
|
||||
do_test limit-13.23 {
|
||||
db eval {SELECT z FROM v13c LIMIT 3 OFFSET 2}
|
||||
} {11 12 21}
|
||||
do_test limit-13.24 {
|
||||
db eval {SELECT z FROM v13c LIMIT 4 OFFSET 2}
|
||||
} {11 12 21 22}
|
||||
do_test limit-13.25 {
|
||||
db eval {SELECT z FROM v13c LIMIT 5 OFFSET 2}
|
||||
} {11 12 21 22 31}
|
||||
do_test limit-13.26 {
|
||||
db eval {SELECT z FROM v13c LIMIT 6 OFFSET 2}
|
||||
} {11 12 21 22 31 32}
|
||||
do_test limit-13.27 {
|
||||
db eval {SELECT z FROM v13c LIMIT 7 OFFSET 2}
|
||||
} {11 12 21 22 31 32}
|
||||
do_test limit-13.31 {
|
||||
db eval {SELECT z FROM v13c LIMIT 1 OFFSET 3}
|
||||
} {12}
|
||||
do_test limit-13.32 {
|
||||
db eval {SELECT z FROM v13c LIMIT 2 OFFSET 3}
|
||||
} {12 21}
|
||||
do_test limit-13.33 {
|
||||
db eval {SELECT z FROM v13c LIMIT 3 OFFSET 3}
|
||||
} {12 21 22}
|
||||
do_test limit-13.34 {
|
||||
db eval {SELECT z FROM v13c LIMIT 4 OFFSET 3}
|
||||
} {12 21 22 31}
|
||||
do_test limit-13.35 {
|
||||
db eval {SELECT z FROM v13c LIMIT 5 OFFSET 3}
|
||||
} {12 21 22 31 32}
|
||||
do_test limit-13.36 {
|
||||
db eval {SELECT z FROM v13c LIMIT 6 OFFSET 3}
|
||||
} {12 21 22 31 32}
|
||||
do_test limit-13.41 {
|
||||
db eval {SELECT z FROM v13c LIMIT 1 OFFSET 4}
|
||||
} {21}
|
||||
do_test limit-13.42 {
|
||||
db eval {SELECT z FROM v13c LIMIT 2 OFFSET 4}
|
||||
} {21 22}
|
||||
do_test limit-13.43 {
|
||||
db eval {SELECT z FROM v13c LIMIT 3 OFFSET 4}
|
||||
} {21 22 31}
|
||||
do_test limit-13.44 {
|
||||
db eval {SELECT z FROM v13c LIMIT 4 OFFSET 4}
|
||||
} {21 22 31 32}
|
||||
do_test limit-13.45 {
|
||||
db eval {SELECT z FROM v13c LIMIT 5 OFFSET 4}
|
||||
} {21 22 31 32}
|
||||
do_test limit-13.51 {
|
||||
db eval {SELECT z FROM v13c LIMIT 1 OFFSET 5}
|
||||
} {22}
|
||||
do_test limit-13.52 {
|
||||
db eval {SELECT z FROM v13c LIMIT 2 OFFSET 5}
|
||||
} {22 31}
|
||||
do_test limit-13.53 {
|
||||
db eval {SELECT z FROM v13c LIMIT 3 OFFSET 5}
|
||||
} {22 31 32}
|
||||
do_test limit-13.54 {
|
||||
db eval {SELECT z FROM v13c LIMIT 4 OFFSET 5}
|
||||
} {22 31 32}
|
||||
do_test limit-13.61 {
|
||||
db eval {SELECT z FROM v13c LIMIT 1 OFFSET 6}
|
||||
} {31}
|
||||
do_test limit-13.62 {
|
||||
db eval {SELECT z FROM v13c LIMIT 2 OFFSET 6}
|
||||
} {31 32}
|
||||
do_test limit-13.63 {
|
||||
db eval {SELECT z FROM v13c LIMIT 3 OFFSET 6}
|
||||
} {31 32}
|
||||
do_test limit-13.71 {
|
||||
db eval {SELECT z FROM v13c LIMIT 1 OFFSET 7}
|
||||
} {32}
|
||||
do_test limit-13.72 {
|
||||
db eval {SELECT z FROM v13c LIMIT 2 OFFSET 7}
|
||||
} {32}
|
||||
do_test limit-13.81 {
|
||||
db eval {SELECT z FROM v13c LIMIT 1 OFFSET 8}
|
||||
} {}
|
||||
|
||||
finish_test
|
||||
|
Reference in New Issue
Block a user