diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/auth.c | 28 | ||||
-rw-r--r-- | src/expr.c | 6 | ||||
-rw-r--r-- | src/resolve.c | 47 | ||||
-rw-r--r-- | src/trigger.c | 8 |
4 files changed, 46 insertions, 43 deletions
diff --git a/src/auth.c b/src/auth.c index 13d5ba572..4e5bd164f 100644 --- a/src/auth.c +++ b/src/auth.c @@ -113,36 +113,34 @@ void sqlite3AuthRead( int iSrc; /* Index in pTabList->a[] of table being read */ const char *zDBase; /* Name of database being accessed */ int iDb; /* The index of the database the expression refers to */ + int iCol; /* Index of column in table */ if( db->xAuth==0 ) return; - assert( pExpr->op==TK_COLUMN ); iDb = sqlite3SchemaToIndex(pParse->db, pSchema); if( iDb<0 ){ /* An attempt to read a column out of a subquery or other ** temporary table. */ return; } - if( pTabList ){ + + assert( pExpr->op==TK_COLUMN || pExpr->op==TK_TRIGGER ); + if( pExpr->op==TK_TRIGGER ){ + pTab = pParse->pTriggerTab; + }else{ + assert( pTabList ); for(iSrc=0; iSrc<pTabList->nSrc; iSrc++){ if( pExpr->iTable==pTabList->a[iSrc].iCursor ){ pTab = pTabList->a[iSrc].pTab; - break; + break; } } } - if( !pTab ){ - TriggerStack *pStack = pParse->trigStack; - if( ALWAYS(pStack) ){ - /* This must be an attempt to read the NEW or OLD pseudo-tables - ** of a trigger. */ - assert( pExpr->iTable==pStack->newIdx || pExpr->iTable==pStack->oldIdx ); - pTab = pStack->pTab; - } - } + iCol = pExpr->iColumn; if( NEVER(pTab==0) ) return; - if( pExpr->iColumn>=0 ){ - assert( pExpr->iColumn<pTab->nCol ); - zCol = pTab->aCol[pExpr->iColumn].zName; + + if( iCol>=0 ){ + assert( iCol<pTab->nCol ); + zCol = pTab->aCol[iCol].zName; }else if( pTab->iPKey>=0 ){ assert( pTab->iPKey<pTab->nCol ); zCol = pTab->aCol[pTab->iPKey].zName; diff --git a/src/expr.c b/src/expr.c index 959bc2229..d5dda96ca 100644 --- a/src/expr.c +++ b/src/expr.c @@ -2561,10 +2561,10 @@ int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target){ case TK_TRIGGER: { int iVal = pExpr->iTable * (pExpr->pTab->nCol+1) + 1 + pExpr->iColumn; sqlite3VdbeAddOp2(v, OP_Param, iVal, target); - VdbeComment((v, "%s.%s -> $%d", - (pExpr->iTable ? "new" : "old"), + VdbeComment((v, "%s.%s -> $%d", + (pExpr->iTable ? "new" : "old"), (pExpr->iColumn<0 ? "rowid" : pExpr->pTab->aCol[pExpr->iColumn].zName), - target + target )); break; } 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; diff --git a/src/trigger.c b/src/trigger.c index 7093cbc7f..8442ec2e7 100644 --- a/src/trigger.c +++ b/src/trigger.c @@ -531,7 +531,7 @@ void sqlite3DropTriggerPtr(Parse *pParse, Trigger *pTrigger){ const char *zDb = db->aDb[iDb].zName; const char *zTab = SCHEMA_TABLE(iDb); if( iDb==1 ) code = SQLITE_DROP_TEMP_TRIGGER; - if( sqlite3AuthCheck(pParse, code, pTrigger->name, pTable->zName, zDb) || + if( sqlite3AuthCheck(pParse, code, pTrigger->zName, pTable->zName, zDb) || sqlite3AuthCheck(pParse, SQLITE_DELETE, zTab, 0, zDb) ){ return; } @@ -819,9 +819,7 @@ static CodedTrigger *codeRowTrigger( pSubParse->db = db; pSubParse->pTriggerTab = pTab; pSubParse->pRoot = pRoot; - - /* Push an entry on to the auth context stack */ - sqlite3AuthContextPush(pParse, &sContext, pTrigger->name); + pSubParse->zAuthContext = pTrigger->zName; v = sqlite3GetVdbe(pSubParse); if( v ){ @@ -879,8 +877,6 @@ static CodedTrigger *codeRowTrigger( } sqlite3StackFree(db, pSubParse); - /* Pop the entry off the authorization stack */ - sqlite3AuthContextPop(&sContext); return pC; } |