mirror of
https://github.com/sqlite/sqlite.git
synced 2025-07-30 19:03:16 +03:00
Fix a VDBE stack leak in LEFT OUTER JOIN. Fix a bug in the code generator
for JOIN ... USING(...). (CVS 638) FossilOrigin-Name: d861489e1f7dffd1105c271fe8597f73e5b1703c
This commit is contained in:
14
manifest
14
manifest
@ -1,5 +1,5 @@
|
||||
C An\soptimization:\savoid\sthe\suse\sof\san\sintermediate\stable\son\sUNION\sALL\sif\sthere\nis\sno\sORDER\sBY\sclause.\s(CVS\s637)
|
||||
D 2002-06-22T02:33:38
|
||||
C Fix\sa\sVDBE\sstack\sleak\sin\sLEFT\sOUTER\sJOIN.\s\sFix\sa\sbug\sin\sthe\scode\sgenerator\nfor\sJOIN\s...\sUSING(...).\s(CVS\s638)
|
||||
D 2002-06-24T12:20:23
|
||||
F Makefile.in 6291a33b87d2a395aafd7646ee1ed562c6f2c28c
|
||||
F Makefile.template 4e11752e0b5c7a043ca50af4296ec562857ba495
|
||||
F README a4c0ba11354ef6ba0776b400d057c59da47a4cc0
|
||||
@ -37,7 +37,7 @@ F src/pager.h 6fddfddd3b73aa8abc081b973886320e3c614f0e
|
||||
F src/parse.y 2285d8967d7334d52a2188089e5a881d73ba56f6
|
||||
F src/printf.c 236ed7a79386feed4456fa728fff8be793f1547c
|
||||
F src/random.c 19e8e00fe0df32a742f115773f57651be327cabe
|
||||
F src/select.c d71b59805fe8dd8eb9dd87b50860c07820ec7918
|
||||
F src/select.c 3e83a18baeeb5c89936ca84bde0bb0d18709b6b5
|
||||
F src/shell.c 1d22fe870ee852cfb975fd000dbe3973713d0a15
|
||||
F src/shell.tcl 27ecbd63dd88396ad16d81ab44f73e6c0ea9d20e
|
||||
F src/sqlite.h.in 7c8882e352cb70818cfaf9bdb5b1b3bee81ef144
|
||||
@ -54,7 +54,7 @@ F src/update.c 6f6a4dcd71cd9ff730b7f12c83de5498cde4924f
|
||||
F src/util.c 876b259f9186e84b944b72e793dd3dad50e63e95
|
||||
F src/vdbe.c 774f79483ce809b27c3bdb02afd7295cc3c7acd4
|
||||
F src/vdbe.h a9292f2b5fcecef924fa255fb74609e9cbc776c2
|
||||
F src/where.c 1fdb7aca26c1963eb42615a95e0fc2978eec566a
|
||||
F src/where.c 5ff862869a8ab704070df2ef75a3424c782422cf
|
||||
F test/all.test e4d3821eeba751829b419cd47814bd20af4286d1
|
||||
F test/bigrow.test 8ab252dba108f12ad64e337b0f2ff31a807ac578
|
||||
F test/btree.test bf326f546a666617367a7033fa2c07451bd4f8e1
|
||||
@ -137,7 +137,7 @@ F www/speed.tcl da8afcc1d3ccc5696cfb388a68982bc3d9f7f00f
|
||||
F www/sqlite.tcl 8b5884354cb615049aed83039f8dfe1552a44279
|
||||
F www/tclsqlite.tcl 1db15abeb446aad0caf0b95b8b9579720e4ea331
|
||||
F www/vdbe.tcl 2013852c27a02a091d39a766bc87cff329f21218
|
||||
P 9d5523107937e3700c76666fb058694babdd672c
|
||||
R 8009c7f3df0b06e96c68ea3fa98dc912
|
||||
P 8aa73ce61268a50d353d9a5c878461290195525f
|
||||
R 2b416ef8a3e6fcbc67f7c234a7a7ee0f
|
||||
U drh
|
||||
Z 29b6ba248298ad91adb3978ba4b0728d
|
||||
Z f4ef2a81bcc41a1ff76332fb25825e47
|
||||
|
@ -1 +1 @@
|
||||
8aa73ce61268a50d353d9a5c878461290195525f
|
||||
d861489e1f7dffd1105c271fe8597f73e5b1703c
|
14
src/select.c
14
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.97 2002/06/22 02:33:38 drh Exp $
|
||||
** $Id: select.c,v 1.98 2002/06/24 12:20:23 drh Exp $
|
||||
*/
|
||||
#include "sqliteInt.h"
|
||||
|
||||
@ -244,14 +244,14 @@ static int sqliteProcessJoin(Parse *pParse, Select *p){
|
||||
assert( i<pSrc->nSrc-1 );
|
||||
pList = pTerm->pUsing;
|
||||
for(j=0; j<pList->nId; j++){
|
||||
if( columnIndex(pTerm->pTab, pList->a[i].zName)<0 ||
|
||||
columnIndex(pOther->pTab, pList->a[i].zName)<0 ){
|
||||
if( columnIndex(pTerm->pTab, pList->a[j].zName)<0 ||
|
||||
columnIndex(pOther->pTab, pList->a[j].zName)<0 ){
|
||||
sqliteSetString(&pParse->zErrMsg, "cannot join using column ",
|
||||
pList->a[i].zName, " - column not present in both tables", 0);
|
||||
pList->a[j].zName, " - column not present in both tables", 0);
|
||||
pParse->nErr++;
|
||||
return 1;
|
||||
}
|
||||
addWhereTerm(pList->a[i].zName, pTerm->pTab, pOther->pTab, &p->pWhere);
|
||||
addWhereTerm(pList->a[j].zName, pTerm->pTab, pOther->pTab, &p->pWhere);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1745,14 +1745,14 @@ int sqliteSelect(
|
||||
}else{
|
||||
int iMem = pParse->nMem++;
|
||||
sqliteVdbeAddOp(v, OP_Integer, -p->nLimit, 0);
|
||||
sqliteVdbeAddOp(v, OP_MemStore, iMem, 0);
|
||||
sqliteVdbeAddOp(v, OP_MemStore, iMem, 1);
|
||||
p->nLimit = iMem;
|
||||
if( p->nOffset<=0 ){
|
||||
p->nOffset = 0;
|
||||
}else{
|
||||
iMem = pParse->nMem++;
|
||||
sqliteVdbeAddOp(v, OP_Integer, -p->nOffset, 0);
|
||||
sqliteVdbeAddOp(v, OP_MemStore, iMem, 0);
|
||||
sqliteVdbeAddOp(v, OP_MemStore, iMem, 1);
|
||||
p->nOffset = iMem;
|
||||
}
|
||||
}
|
||||
|
@ -13,7 +13,7 @@
|
||||
** the WHERE clause of SQL statements. Also found here are subroutines
|
||||
** to generate VDBE code to evaluate expressions.
|
||||
**
|
||||
** $Id: where.c,v 1.53 2002/06/19 14:27:06 drh Exp $
|
||||
** $Id: where.c,v 1.54 2002/06/24 12:20:23 drh Exp $
|
||||
*/
|
||||
#include "sqliteInt.h"
|
||||
|
||||
@ -1057,7 +1057,7 @@ void sqliteWhereEnd(WhereInfo *pWInfo){
|
||||
if( pLevel->iLeftJoin ){
|
||||
int addr;
|
||||
addr = sqliteVdbeAddOp(v, OP_MemLoad, pLevel->iLeftJoin, 0);
|
||||
sqliteVdbeAddOp(v, OP_NotNull, 0, addr+4);
|
||||
sqliteVdbeAddOp(v, OP_NotNull, 1, addr+4);
|
||||
sqliteVdbeAddOp(v, OP_NullRow, base+i, 0);
|
||||
sqliteVdbeAddOp(v, OP_Goto, 0, pLevel->top);
|
||||
}
|
||||
|
Reference in New Issue
Block a user