aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/auth.c28
-rw-r--r--src/expr.c6
-rw-r--r--src/resolve.c47
-rw-r--r--src/trigger.c8
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;
}