diff options
author | Robert Haas <rhaas@postgresql.org> | 2011-11-22 16:16:26 -0500 |
---|---|---|
committer | Robert Haas <rhaas@postgresql.org> | 2011-11-22 16:16:26 -0500 |
commit | f1b4aa2a84732255bd8a34fc9c7994a04409b77a (patch) | |
tree | 750c149500d4c90fc8c2c93cf553621954f4b997 /src/backend/executor/execMain.c | |
parent | 766948beddef66dd89563f465919eca6e131861c (diff) | |
download | postgresql-f1b4aa2a84732255bd8a34fc9c7994a04409b77a.tar.gz postgresql-f1b4aa2a84732255bd8a34fc9c7994a04409b77a.zip |
Check for INSERT privileges in SELECT INTO / CREATE TABLE AS.
In the normal course of events, this matters only if ALTER DEFAULT
PRIVILEGES has been used to revoke default INSERT permission. Whether
or not the new behavior is more or less likely to be what the user wants
when dealing only with the built-in privilege facilities is arguable,
but it's clearly better when using a loadable module such as sepgsql
that may use the hook in ExecCheckRTPerms to enforce additional
permissions checks.
KaiGai Kohei, reviewed by Albe Laurenz
Diffstat (limited to 'src/backend/executor/execMain.c')
-rw-r--r-- | src/backend/executor/execMain.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c index fd7a9ed0339..708831a5c34 100644 --- a/src/backend/executor/execMain.c +++ b/src/backend/executor/execMain.c @@ -2395,6 +2395,8 @@ OpenIntoRel(QueryDesc *queryDesc) Datum reloptions; Oid intoRelationId; DR_intorel *myState; + RangeTblEntry *rte; + AttrNumber attnum; static char *validnsps[] = HEAP_RELOPT_NAMESPACES; Assert(into); @@ -2517,6 +2519,21 @@ OpenIntoRel(QueryDesc *queryDesc) intoRelationDesc = heap_open(intoRelationId, AccessExclusiveLock); /* + * check INSERT permission on the constructed table. + */ + rte = makeNode(RangeTblEntry); + rte->rtekind = RTE_RELATION; + rte->relid = intoRelationId; + rte->relkind = RELKIND_RELATION; + rte->requiredPerms = ACL_INSERT; + + for (attnum = 1; attnum <= queryDesc->tupDesc->natts; attnum++) + rte->modifiedCols = bms_add_member(rte->modifiedCols, + attnum - FirstLowInvalidHeapAttributeNumber); + + ExecCheckRTPerms(list_make1(rte), true); + + /* * Now replace the query's DestReceiver with one for SELECT INTO */ queryDesc->dest = CreateDestReceiver(DestIntoRel); |