From d1a0491949be85e5991ef026b455744976dae1f1 Mon Sep 17 00:00:00 2001 From: Andreas Lind Date: Wed, 19 Jun 2024 22:20:42 +0200 Subject: [PATCH v1 2/4] Wire it up in the planner --- src/backend/optimizer/path/equivclass.c | 4 +++- src/backend/optimizer/plan/createplan.c | 6 ++++-- src/backend/optimizer/util/restrictinfo.c | 5 +++-- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/backend/optimizer/path/equivclass.c b/src/backend/optimizer/path/equivclass.c index 441f12f6c50..3c72265b496 100644 --- a/src/backend/optimizer/path/equivclass.c +++ b/src/backend/optimizer/path/equivclass.c @@ -31,7 +31,9 @@ #include "optimizer/planmain.h" #include "optimizer/restrictinfo.h" #include "rewrite/rewriteManip.h" +#include "utils/acl.h" #include "utils/lsyscache.h" +#include "miscadmin.h" static EquivalenceMember *make_eq_member(EquivalenceClass *ec, @@ -203,7 +205,7 @@ process_equivalence(PlannerInfo *root, Assert(restrictinfo->right_ec == NULL); /* Reject if it is potentially postponable by security considerations */ - if (restrictinfo->security_level > 0 && !restrictinfo->leakproof) + if (restrictinfo->security_level > 0 && !(restrictinfo->leakproof || has_bypassleakproof_privilege(GetUserId()))) return false; /* Extract info from given clause */ diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c index a8f22a8c154..6318e635ca1 100644 --- a/src/backend/optimizer/plan/createplan.c +++ b/src/backend/optimizer/plan/createplan.c @@ -42,8 +42,9 @@ #include "parser/parsetree.h" #include "partitioning/partprune.h" #include "tcop/tcopprot.h" +#include "utils/acl.h" #include "utils/lsyscache.h" - +#include "miscadmin.h" /* * Flag bits that can appear in the flags argument of create_plan_recurse(). @@ -5394,7 +5395,8 @@ order_qual_clauses(PlannerInfo *root, List *clauses) * security level, which is not so great, but we can alleviate * that risk by applying the cost limit cutoff. */ - if (rinfo->leakproof && items[i].cost < 10 * cpu_operator_cost) + if ((rinfo->leakproof || has_bypassleakproof_privilege(GetUserId())) && + items[i].cost < 10 * cpu_operator_cost) items[i].security_level = 0; else items[i].security_level = rinfo->security_level; diff --git a/src/backend/optimizer/util/restrictinfo.c b/src/backend/optimizer/util/restrictinfo.c index a80083d2323..b9e0b4f7e43 100644 --- a/src/backend/optimizer/util/restrictinfo.c +++ b/src/backend/optimizer/util/restrictinfo.c @@ -19,7 +19,8 @@ #include "optimizer/clauses.h" #include "optimizer/optimizer.h" #include "optimizer/restrictinfo.h" - +#include "utils/acl.h" +#include "miscadmin.h" static Expr *make_sub_restrictinfos(PlannerInfo *root, Expr *clause, @@ -427,7 +428,7 @@ restriction_is_securely_promotable(RestrictInfo *restrictinfo, * would need to go before this one, *or* if this one is leakproof. */ if (restrictinfo->security_level <= rel->baserestrict_min_security || - restrictinfo->leakproof) + restrictinfo->leakproof || has_bypassleakproof_privilege(GetUserId())) return true; else return false; -- 2.39.2