Fix a bug in the query flattener when trying to find the datatype of the

rowid of a view.  Also fix a problem with sqlite_compile() and authorization
failures. (CVS 1236)

FossilOrigin-Name: aa0490ccd4a820a707dfb4905e67c01ffb4f758b
This commit is contained in:
drh 2004-02-13 16:22:22 +00:00
parent 78a7583828
commit 50350a15c4
4 changed files with 41 additions and 30 deletions

@ -1,5 +1,5 @@
C Fix\san\suninitialized\svariable\sintroduced\sby\scheck-in\s(1202).\s(CVS\s1235)
D 2004-02-13T14:07:13
C Fix\sa\sbug\sin\sthe\squery\sflattener\swhen\strying\sto\sfind\sthe\sdatatype\sof\sthe\nrowid\sof\sa\sview.\s\sAlso\sfix\sa\sproblem\swith\ssqlite_compile()\sand\sauthorization\nfailures.\s(CVS\s1236)
D 2004-02-13T16:22:23
F Makefile.in cfd75c46b335881999333a9e4b982fa8491f200b
F Makefile.linux-gcc b86a99c493a5bfb402d1d9178dcdc4bd4b32f906
F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd
@ -26,7 +26,7 @@ F src/auth.c c59ad0dab501888f8b1fccc25e2f5965d2265116
F src/btree.c 9aefacf529226b5875b487d59e9be0224961ef3d
F src/btree.h 41cb3ff6ebc3f6da2d0a074e39ff8c7a2287469f
F src/btree_rb.c 32b2cb4285c0fbd53b89de021637b63d52257e54
F src/build.c 2a02df7931cb0ea153c1e29324292cd943d4f73c
F src/build.c f25e98306518b76190c526bf970ebcda60919674
F src/copy.c 9e47975ea96751c658bcf1a0c4f0bb7c6ee61e73
F src/date.c c9d2bfd40b1c95f8f97d53a5eba981d7167c7b61
F src/delete.c 0778fe05df0a1d62ac27fd1a3dba237c186ff4d1
@ -46,7 +46,7 @@ F src/parse.y 1e311dc6aae9261f8641abca9328dd6193083753
F src/pragma.c 89d62c31c6f0a43376fe8d20549b87a6d30c467a
F src/printf.c 84e4ea4ba49cbbf930e95e82295127ad5843ae1f
F src/random.c 775913e0b7fbd6295d21f12a7bd35b46387c44b2
F src/select.c a3a203f9b68c899ac69dbc5fa11cd649fd8acd06
F src/select.c da4f383736a5dacf7ff856de091ffd1ca9874623
F src/shell.c f6975f87264d04398c9ffa51117c6e3a7f4f4396
F src/sqlite.h.in 64f016cd5ce190643a0f47760188fdf4e0b2227e
F src/sqliteInt.h c45fbae6278407111d7a00aa9280ddc0f51344ad
@ -184,7 +184,7 @@ F www/sqlite.tcl 3c83b08cf9f18aa2d69453ff441a36c40e431604
F www/tclsqlite.tcl b9271d44dcf147a93c98f8ecf28c927307abd6da
F www/vdbe.tcl 9b9095d4495f37697fd1935d10e14c6015e80aa1
F www/whentouse.tcl a8335bce47cc2fddb07f19052cb0cb4d9129a8e4
P 5fe8f02306cf1c0af2148835cee0df3003ad0874
R 37f801315d07f57c3a703640bb77ce36
P 9f149fdc1c6af1c663b91c878ed1903f82f80245
R 0a1abd4879d35c7c70d8d469ebb2575b
U drh
Z 05d7354095b873584dabb1ae129be199
Z ccb3ee1ecce4c81620c08fbe0b8c5332

@ -1 +1 @@
9f149fdc1c6af1c663b91c878ed1903f82f80245
aa0490ccd4a820a707dfb4905e67c01ffb4f758b

@ -23,7 +23,7 @@
** ROLLBACK
** PRAGMA
**
** $Id: build.c,v 1.166 2004/02/12 18:46:39 drh Exp $
** $Id: build.c,v 1.167 2004/02/13 16:22:23 drh Exp $
*/
#include "sqliteInt.h"
#include <ctype.h>
@ -83,7 +83,14 @@ void sqliteExec(Parse *pParse){
if( sqlite_malloc_failed ) return;
xCallback = pParse->xCallback;
if( xCallback==0 && pParse->useCallback ) xCallback = fakeCallback;
if( xCallback==0 ){
if( pParse->useCallback ){
xCallback = fakeCallback;
}else if( v==0 ){
v = sqliteGetVdbe(pParse);
sqliteVdbeAddOp(v, OP_Halt, 0, 0);
}
}
if( v && pParse->nErr==0 ){
FILE *trace = (db->flags & SQLITE_VdbeTrace)!=0 ? stdout : 0;
sqliteVdbeTrace(v, trace);

@ -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.152 2004/02/12 15:31:21 drh Exp $
** $Id: select.c,v 1.153 2004/02/13 16:22:23 drh Exp $
*/
#include "sqliteInt.h"
@ -1526,25 +1526,29 @@ static int multiSelect(Parse *pParse, Select *p, int eDest, int iParm){
static void substExprList(ExprList*,int,ExprList*); /* Forward Decl */
static void substExpr(Expr *pExpr, int iTable, ExprList *pEList){
if( pExpr==0 ) return;
if( pExpr->op==TK_COLUMN && pExpr->iTable==iTable && pExpr->iColumn>=0 ){
Expr *pNew;
assert( pEList!=0 && pExpr->iColumn<pEList->nExpr );
assert( pExpr->pLeft==0 && pExpr->pRight==0 && pExpr->pList==0 );
pNew = pEList->a[pExpr->iColumn].pExpr;
assert( pNew!=0 );
pExpr->op = pNew->op;
pExpr->dataType = pNew->dataType;
assert( pExpr->pLeft==0 );
pExpr->pLeft = sqliteExprDup(pNew->pLeft);
assert( pExpr->pRight==0 );
pExpr->pRight = sqliteExprDup(pNew->pRight);
assert( pExpr->pList==0 );
pExpr->pList = sqliteExprListDup(pNew->pList);
pExpr->iTable = pNew->iTable;
pExpr->iColumn = pNew->iColumn;
pExpr->iAgg = pNew->iAgg;
sqliteTokenCopy(&pExpr->token, &pNew->token);
sqliteTokenCopy(&pExpr->span, &pNew->span);
if( pExpr->op==TK_COLUMN && pExpr->iTable==iTable ){
if( pExpr->iColumn<0 ){
pExpr->op = TK_NULL;
}else{
Expr *pNew;
assert( pEList!=0 && pExpr->iColumn<pEList->nExpr );
assert( pExpr->pLeft==0 && pExpr->pRight==0 && pExpr->pList==0 );
pNew = pEList->a[pExpr->iColumn].pExpr;
assert( pNew!=0 );
pExpr->op = pNew->op;
pExpr->dataType = pNew->dataType;
assert( pExpr->pLeft==0 );
pExpr->pLeft = sqliteExprDup(pNew->pLeft);
assert( pExpr->pRight==0 );
pExpr->pRight = sqliteExprDup(pNew->pRight);
assert( pExpr->pList==0 );
pExpr->pList = sqliteExprListDup(pNew->pList);
pExpr->iTable = pNew->iTable;
pExpr->iColumn = pNew->iColumn;
pExpr->iAgg = pNew->iAgg;
sqliteTokenCopy(&pExpr->token, &pNew->token);
sqliteTokenCopy(&pExpr->span, &pNew->span);
}
}else{
substExpr(pExpr->pLeft, iTable, pEList);
substExpr(pExpr->pRight, iTable, pEList);