aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorStephen Frost <sfrost@snowman.net>2014-08-26 23:08:41 -0400
committerStephen Frost <sfrost@snowman.net>2014-08-26 23:08:41 -0400
commite414ba93add966dfe03e22994764e718ed89ee98 (patch)
tree4646165a70331bbd1d57c7672360a0806dc8b412 /src
parent8e484bc4abccc03d49af25d32a5ffaecd3c6cf2d (diff)
downloadpostgresql-e414ba93add966dfe03e22994764e718ed89ee98.tar.gz
postgresql-e414ba93add966dfe03e22994764e718ed89ee98.zip
Fix Var handling for security barrier views
In some cases, not all Vars were being correctly marked as having been modified for updatable security barrier views, which resulted in invalid plans (eg: when security barrier views were created over top of inheiritance structures). In passing, be sure to update both varattno and varonattno, as _equalVar won't consider the Vars identical otherwise. This isn't known to cause any issues with updatable security barrier views, but was noticed as missing while working on RLS and makes sense to get fixed. Back-patch to 9.4 where updatable security barrier views were introduced.
Diffstat (limited to 'src')
-rw-r--r--src/backend/optimizer/prep/prepsecurity.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/src/backend/optimizer/prep/prepsecurity.c b/src/backend/optimizer/prep/prepsecurity.c
index dd7f9003a28..2420f97a219 100644
--- a/src/backend/optimizer/prep/prepsecurity.c
+++ b/src/backend/optimizer/prep/prepsecurity.c
@@ -398,7 +398,9 @@ security_barrier_replace_vars_walker(Node *node,
((Var *) tle->expr)->varcollid == var->varcollid)
{
/* Map the variable onto this subquery targetlist entry */
- var->varattno = attno;
+ var->varattno = var->varoattno = attno;
+ /* Mark this var as having been processed */
+ context->vars_processed = lappend(context->vars_processed, var);
return false;
}
}
@@ -444,7 +446,7 @@ security_barrier_replace_vars_walker(Node *node,
makeString(pstrdup(attname)));
/* Update the outer query's variable */
- var->varattno = attno;
+ var->varattno = var->varoattno = attno;
/* Remember this Var so that we don't process it again */
context->vars_processed = lappend(context->vars_processed, var);