mirror of
https://github.com/postgres/postgres.git
synced 2025-07-18 17:42:25 +03:00
Support column-level privileges, as required by SQL standard.
Stephen Frost, with help from KaiGai Kohei and others
This commit is contained in:
@ -17,13 +17,14 @@
|
||||
* Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $PostgreSQL: pgsql/src/backend/parser/analyze.c,v 1.387 2009/01/08 13:42:33 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/parser/analyze.c,v 1.388 2009/01/22 20:16:04 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#include "postgres.h"
|
||||
|
||||
#include "access/sysattr.h"
|
||||
#include "catalog/pg_type.h"
|
||||
#include "nodes/makefuncs.h"
|
||||
#include "nodes/nodeFuncs.h"
|
||||
@ -422,6 +423,7 @@ transformInsertStmt(ParseState *pstate, InsertStmt *stmt)
|
||||
* bugs of just that nature...)
|
||||
*/
|
||||
sub_pstate->p_rtable = sub_rtable;
|
||||
sub_pstate->p_joinexprs = NIL; /* sub_rtable has no joins */
|
||||
sub_pstate->p_relnamespace = sub_relnamespace;
|
||||
sub_pstate->p_varnamespace = sub_varnamespace;
|
||||
|
||||
@ -629,7 +631,9 @@ transformInsertStmt(ParseState *pstate, InsertStmt *stmt)
|
||||
|
||||
/*
|
||||
* Generate query's target list using the computed list of expressions.
|
||||
* Also, mark all the target columns as needing insert permissions.
|
||||
*/
|
||||
rte = pstate->p_target_rangetblentry;
|
||||
qry->targetList = NIL;
|
||||
icols = list_head(icolumns);
|
||||
attnos = list_head(attrnos);
|
||||
@ -637,17 +641,22 @@ transformInsertStmt(ParseState *pstate, InsertStmt *stmt)
|
||||
{
|
||||
Expr *expr = (Expr *) lfirst(lc);
|
||||
ResTarget *col;
|
||||
AttrNumber attr_num;
|
||||
TargetEntry *tle;
|
||||
|
||||
col = (ResTarget *) lfirst(icols);
|
||||
Assert(IsA(col, ResTarget));
|
||||
attr_num = (AttrNumber) lfirst_int(attnos);
|
||||
|
||||
tle = makeTargetEntry(expr,
|
||||
(AttrNumber) lfirst_int(attnos),
|
||||
attr_num,
|
||||
col->name,
|
||||
false);
|
||||
qry->targetList = lappend(qry->targetList, tle);
|
||||
|
||||
rte->modifiedCols = bms_add_member(rte->modifiedCols,
|
||||
attr_num - FirstLowInvalidHeapAttributeNumber);
|
||||
|
||||
icols = lnext(icols);
|
||||
attnos = lnext(attnos);
|
||||
}
|
||||
@ -1129,8 +1138,8 @@ transformSetOperationStmt(ParseState *pstate, SelectStmt *stmt)
|
||||
List *targetvars,
|
||||
*targetnames,
|
||||
*sv_relnamespace,
|
||||
*sv_varnamespace,
|
||||
*sv_rtable;
|
||||
*sv_varnamespace;
|
||||
int sv_rtable_length;
|
||||
RangeTblEntry *jrte;
|
||||
int tllen;
|
||||
|
||||
@ -1254,16 +1263,15 @@ transformSetOperationStmt(ParseState *pstate, SelectStmt *stmt)
|
||||
* "ORDER BY upper(foo)" will draw the right error message rather than
|
||||
* "foo not found".
|
||||
*/
|
||||
jrte = addRangeTableEntryForJoin(NULL,
|
||||
sv_rtable_length = list_length(pstate->p_rtable);
|
||||
|
||||
jrte = addRangeTableEntryForJoin(pstate,
|
||||
targetnames,
|
||||
JOIN_INNER,
|
||||
targetvars,
|
||||
NULL,
|
||||
false);
|
||||
|
||||
sv_rtable = pstate->p_rtable;
|
||||
pstate->p_rtable = list_make1(jrte);
|
||||
|
||||
sv_relnamespace = pstate->p_relnamespace;
|
||||
pstate->p_relnamespace = NIL; /* no qualified names allowed */
|
||||
|
||||
@ -1283,7 +1291,7 @@ transformSetOperationStmt(ParseState *pstate, SelectStmt *stmt)
|
||||
&qry->targetList,
|
||||
false /* no unknowns expected */ );
|
||||
|
||||
pstate->p_rtable = sv_rtable;
|
||||
pstate->p_rtable = list_truncate(pstate->p_rtable, sv_rtable_length);
|
||||
pstate->p_relnamespace = sv_relnamespace;
|
||||
pstate->p_varnamespace = sv_varnamespace;
|
||||
|
||||
@ -1618,6 +1626,7 @@ static Query *
|
||||
transformUpdateStmt(ParseState *pstate, UpdateStmt *stmt)
|
||||
{
|
||||
Query *qry = makeNode(Query);
|
||||
RangeTblEntry *target_rte;
|
||||
Node *qual;
|
||||
ListCell *origTargetList;
|
||||
ListCell *tl;
|
||||
@ -1675,6 +1684,7 @@ transformUpdateStmt(ParseState *pstate, UpdateStmt *stmt)
|
||||
pstate->p_next_resno = pstate->p_target_relation->rd_rel->relnatts + 1;
|
||||
|
||||
/* Prepare non-junk columns for assignment to target table */
|
||||
target_rte = pstate->p_target_rangetblentry;
|
||||
origTargetList = list_head(stmt->targetList);
|
||||
|
||||
foreach(tl, qry->targetList)
|
||||
@ -1715,6 +1725,10 @@ transformUpdateStmt(ParseState *pstate, UpdateStmt *stmt)
|
||||
origTarget->indirection,
|
||||
origTarget->location);
|
||||
|
||||
/* Mark the target column as requiring update permissions */
|
||||
target_rte->modifiedCols = bms_add_member(target_rte->modifiedCols,
|
||||
attrno - FirstLowInvalidHeapAttributeNumber);
|
||||
|
||||
origTargetList = lnext(origTargetList);
|
||||
}
|
||||
if (origTargetList != NULL)
|
||||
|
Reference in New Issue
Block a user