diff options
author | drh <drh@noemail.net> | 2003-04-22 20:30:37 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2003-04-22 20:30:37 +0000 |
commit | e22a334b782e5434cc1858eeb2f90c0148ff802d (patch) | |
tree | 6f4753183edc52c0c3c0259713c2e26da42c2863 /src/expr.c | |
parent | 383723795905cdc580dc04374b99f4539bfac1a6 (diff) | |
download | sqlite-e22a334b782e5434cc1858eeb2f90c0148ff802d.tar.gz sqlite-e22a334b782e5434cc1858eeb2f90c0148ff802d.zip |
Update the authorizer API so that it reports the database that table and
indices belong to and so that it reports when actions are taken in response
to a trigger. (CVS 928)
FossilOrigin-Name: c675a5504138f34cae6def782b5d3add2c67d2bc
Diffstat (limited to 'src/expr.c')
-rw-r--r-- | src/expr.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/src/expr.c b/src/expr.c index 059b7bbe7..90f00f3aa 100644 --- a/src/expr.c +++ b/src/expr.c @@ -12,7 +12,7 @@ ** This file contains routines used for analyzing expressions and ** for generating VDBE code that evaluates expressions in SQLite. ** -** $Id: expr.c,v 1.93 2003/04/19 17:27:25 drh Exp $ +** $Id: expr.c,v 1.94 2003/04/22 20:30:39 drh Exp $ */ #include "sqliteInt.h" #include <ctype.h> @@ -432,6 +432,8 @@ int sqliteExprResolveIds( int cnt = 0; /* Number of matches */ int i; /* Loop counter */ char *z; + int iDb = -1; + assert( pExpr->token.z ); z = sqliteStrNDup(pExpr->token.z, pExpr->token.n); sqliteDequote(z); @@ -440,11 +442,13 @@ int sqliteExprResolveIds( int j; Table *pTab = pTabList->a[i].pTab; if( pTab==0 ) continue; + iDb = pTab->iDb; assert( pTab->nCol>0 ); for(j=0; j<pTab->nCol; j++){ if( sqliteStrICmp(pTab->aCol[j].zName, z)==0 ){ cnt++; pExpr->iTable = i + base; + pExpr->iDb = pTab->iDb; if( j==pTab->iPKey ){ /* Substitute the record number for the INTEGER PRIMARY KEY */ pExpr->iColumn = -1; @@ -470,9 +474,10 @@ int sqliteExprResolveIds( } } } - if( cnt==0 && sqliteIsRowid(z) ){ + if( cnt==0 && iDb>=0 && sqliteIsRowid(z) ){ pExpr->iColumn = -1; pExpr->iTable = base; + pExpr->iDb = iDb; cnt = 1 + (pTabList->nSrc>1); pExpr->op = TK_COLUMN; pExpr->dataType = SQLITE_SO_NUM; @@ -544,11 +549,15 @@ int sqliteExprResolveIds( continue; } } - if( 0==(cntTab++) ) pExpr->iTable = i + base; + if( 0==(cntTab++) ){ + pExpr->iTable = i + base; + pExpr->iDb = pTab->iDb; + } for(j=0; j<pTab->nCol; j++){ if( sqliteStrICmp(pTab->aCol[j].zName, zRight)==0 ){ cnt++; pExpr->iTable = i + base; + pExpr->iDb = pTab->iDb; /* Substitute the rowid (column -1) for the INTEGER PRIMARY KEY */ pExpr->iColumn = j==pTab->iPKey ? -1 : j; pExpr->dataType = pTab->aCol[j].sortOrder & SQLITE_SO_TYPEMASK; @@ -563,11 +572,15 @@ int sqliteExprResolveIds( int t = 0; if( pTriggerStack->newIdx != -1 && sqliteStrICmp("new", zLeft) == 0 ){ pExpr->iTable = pTriggerStack->newIdx; + assert( pTriggerStack->pTab ); + pExpr->iDb = pTriggerStack->pTab->iDb; cntTab++; t = 1; } if( pTriggerStack->oldIdx != -1 && sqliteStrICmp("old", zLeft) == 0 ){ pExpr->iTable = pTriggerStack->oldIdx; + assert( pTriggerStack->pTab ); + pExpr->iDb = pTriggerStack->pTab->iDb; cntTab++; t = 1; } |