aboutsummaryrefslogtreecommitdiff
path: root/src/resolve.c
diff options
context:
space:
mode:
authordan <dan@noemail.net>2009-08-31 08:22:46 +0000
committerdan <dan@noemail.net>2009-08-31 08:22:46 +0000
commit2bd935168efdc443310164df21b5482bd532f78d (patch)
tree72d3a1d52f6520cb763dfc55692adf23e33c51af /src/resolve.c
parentc02008333c9f9cd3016aae950a5d12fcdde5bb3c (diff)
downloadsqlite-2bd935168efdc443310164df21b5482bd532f78d.tar.gz
sqlite-2bd935168efdc443310164df21b5482bd532f78d.zip
Fix some authorization callback problems.
FossilOrigin-Name: 8a746fbfd51f70f56e25ade59df49d2dc03c131c
Diffstat (limited to 'src/resolve.c')
-rw-r--r--src/resolve.c47
1 files changed, 28 insertions, 19 deletions
diff --git a/src/resolve.c b/src/resolve.c
index 1fe885f51..2c4d4f2ed 100644
--- a/src/resolve.c
+++ b/src/resolve.c
@@ -137,7 +137,7 @@ static int lookupName(
struct SrcList_item *pMatch = 0; /* The matching pSrcList item */
NameContext *pTopNC = pNC; /* First namecontext in the list */
Schema *pSchema = 0; /* Schema of the expression */
- int isTrigger = 0; /* True if a new.* or old.* reference. */
+ int isTrigger = 0;
assert( pNC ); /* the name context cannot be NULL. */
assert( zCol ); /* The Z in X.Y.Z cannot be NULL */
@@ -240,22 +240,35 @@ static int lookupName(
int iCol;
pSchema = pTab->pSchema;
cntTab++;
- isTrigger = 1;
- for(iCol=0; iCol<pTab->nCol; iCol++){
- Column *pCol = &pTab->aCol[iCol];
- if( sqlite3StrICmp(pCol->zName, zCol)==0 ){
- cnt++;
- pExpr->iColumn = iCol==pTab->iPKey ? -1 : (i16)iCol;
- testcase( iCol==31 );
- testcase( iCol==32 );
- if( iCol>=32 ){
- *piColMask = 0xffffffff;
- }else{
- *piColMask |= ((u32)1)<<iCol;
+ if( sqlite3IsRowid(zCol) ){
+ iCol = -1;
+ }else{
+ for(iCol=0; iCol<pTab->nCol; iCol++){
+ Column *pCol = &pTab->aCol[iCol];
+ if( sqlite3StrICmp(pCol->zName, zCol)==0 ){
+ testcase( iCol==31 );
+ testcase( iCol==32 );
+ if( iCol>=32 ){
+ *piColMask = 0xffffffff;
+ }else{
+ *piColMask |= ((u32)1)<<iCol;
+ }
+ if( iCol==pTab->iPKey ){
+ iCol = -1;
+ }
+ break;
}
- break;
}
}
+ if( iCol<pTab->nCol ){
+ cnt++;
+ if( iCol<0 ){
+ pExpr->affinity = SQLITE_AFF_INTEGER;
+ }
+ pExpr->iColumn = iCol;
+ pExpr->pTab = pTab;
+ isTrigger = 1;
+ }
}
}
#endif /* !defined(SQLITE_OMIT_TRIGGER) */
@@ -366,7 +379,7 @@ static int lookupName(
pExpr->pLeft = 0;
sqlite3ExprDelete(db, pExpr->pRight);
pExpr->pRight = 0;
- pExpr->op = TK_COLUMN;
+ pExpr->op = (isTrigger ? TK_TRIGGER : TK_COLUMN);
lookupname_end:
if( cnt==1 ){
assert( pNC!=0 );
@@ -379,10 +392,6 @@ lookupname_end:
if( pTopNC==pNC ) break;
pTopNC = pTopNC->pNext;
}
- if( isTrigger ){
- pExpr->pTab = pParse->pTriggerTab;
- pExpr->op = TK_TRIGGER;
- }
return WRC_Prune;
} else {
return WRC_Abort;