diff options
author | dan <dan@noemail.net> | 2009-08-31 08:22:46 +0000 |
---|---|---|
committer | dan <dan@noemail.net> | 2009-08-31 08:22:46 +0000 |
commit | 2bd935168efdc443310164df21b5482bd532f78d (patch) | |
tree | 72d3a1d52f6520cb763dfc55692adf23e33c51af /src/resolve.c | |
parent | c02008333c9f9cd3016aae950a5d12fcdde5bb3c (diff) | |
download | sqlite-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.c | 47 |
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; |