Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit2c8f483

Browse files
committed
Represent columns requiring insert and update privileges indentently.
Previously, relation range table entries used a single Bitmapset fieldrepresenting which columns required either UPDATE or INSERT privileges,despite the fact that INSERT and UPDATE privileges are separatelycataloged, and may be independently held. As statements so far requiredeither insert or update privileges but never both, that wassufficient. The required permission could be inferred from the top levelstatement run.The upcoming INSERT ... ON CONFLICT UPDATE feature needs toindependently check for both privileges in one statement though, so thatis not sufficient anymore.Bumps catversion as stored rules change.Author: Peter GeogheganReviewed-By: Andres Freund
1 parentdb5f98a commit2c8f483

File tree

18 files changed

+192
-124
lines changed

18 files changed

+192
-124
lines changed

‎contrib/postgres_fdw/postgres_fdw.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1205,7 +1205,7 @@ postgresPlanForeignModify(PlannerInfo *root,
12051205
intcol;
12061206

12071207
col=-1;
1208-
while ((col=bms_next_member(rte->modifiedCols,col)) >=0)
1208+
while ((col=bms_next_member(rte->updatedCols,col)) >=0)
12091209
{
12101210
/* bit numbers are offset by FirstLowInvalidHeapAttributeNumber */
12111211
AttrNumberattno=col+FirstLowInvalidHeapAttributeNumber;

‎contrib/sepgsql/dml.c

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,8 @@ fixup_inherited_columns(Oid parentId, Oid childId, Bitmapset *columns)
145145
staticbool
146146
check_relation_privileges(OidrelOid,
147147
Bitmapset*selected,
148-
Bitmapset*modified,
148+
Bitmapset*inserted,
149+
Bitmapset*updated,
149150
uint32required,
150151
boolabort_on_violation)
151152
{
@@ -231,8 +232,9 @@ check_relation_privileges(Oid relOid,
231232
* Check permissions on the columns
232233
*/
233234
selected=fixup_whole_row_references(relOid,selected);
234-
modified=fixup_whole_row_references(relOid,modified);
235-
columns=bms_union(selected,modified);
235+
inserted=fixup_whole_row_references(relOid,inserted);
236+
updated=fixup_whole_row_references(relOid,updated);
237+
columns=bms_union(selected,bms_union(inserted,updated));
236238

237239
while ((index=bms_first_member(columns)) >=0)
238240
{
@@ -241,13 +243,16 @@ check_relation_privileges(Oid relOid,
241243

242244
if (bms_is_member(index,selected))
243245
column_perms |=SEPG_DB_COLUMN__SELECT;
244-
if (bms_is_member(index,modified))
246+
if (bms_is_member(index,inserted))
245247
{
246-
if (required&SEPG_DB_TABLE__UPDATE)
247-
column_perms |=SEPG_DB_COLUMN__UPDATE;
248248
if (required&SEPG_DB_TABLE__INSERT)
249249
column_perms |=SEPG_DB_COLUMN__INSERT;
250250
}
251+
if (bms_is_member(index,updated))
252+
{
253+
if (required&SEPG_DB_TABLE__UPDATE)
254+
column_perms |=SEPG_DB_COLUMN__UPDATE;
255+
}
251256
if (column_perms==0)
252257
continue;
253258

@@ -304,7 +309,7 @@ sepgsql_dml_privileges(List *rangeTabls, bool abort_on_violation)
304309
required |=SEPG_DB_TABLE__INSERT;
305310
if (rte->requiredPerms&ACL_UPDATE)
306311
{
307-
if (!bms_is_empty(rte->modifiedCols))
312+
if (!bms_is_empty(rte->updatedCols))
308313
required |=SEPG_DB_TABLE__UPDATE;
309314
else
310315
required |=SEPG_DB_TABLE__LOCK;
@@ -333,23 +338,27 @@ sepgsql_dml_privileges(List *rangeTabls, bool abort_on_violation)
333338
{
334339
OidtableOid=lfirst_oid(li);
335340
Bitmapset*selectedCols;
336-
Bitmapset*modifiedCols;
341+
Bitmapset*insertedCols;
342+
Bitmapset*updatedCols;
337343

338344
/*
339345
* child table has different attribute numbers, so we need to fix
340346
* up them.
341347
*/
342348
selectedCols=fixup_inherited_columns(rte->relid,tableOid,
343349
rte->selectedCols);
344-
modifiedCols=fixup_inherited_columns(rte->relid,tableOid,
345-
rte->modifiedCols);
350+
insertedCols=fixup_inherited_columns(rte->relid,tableOid,
351+
rte->insertedCols);
352+
updatedCols=fixup_inherited_columns(rte->relid,tableOid,
353+
rte->updatedCols);
346354

347355
/*
348356
* check permissions on individual tables
349357
*/
350358
if (!check_relation_privileges(tableOid,
351359
selectedCols,
352-
modifiedCols,
360+
insertedCols,
361+
updatedCols,
353362
required,abort_on_violation))
354363
return false;
355364
}

‎src/backend/commands/copy.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -847,7 +847,7 @@ DoCopy(const CopyStmt *stmt, const char *queryString, uint64 *processed)
847847
FirstLowInvalidHeapAttributeNumber;
848848

849849
if (is_from)
850-
rte->modifiedCols=bms_add_member(rte->modifiedCols,attno);
850+
rte->insertedCols=bms_add_member(rte->insertedCols,attno);
851851
else
852852
rte->selectedCols=bms_add_member(rte->selectedCols,attno);
853853
}

‎src/backend/commands/createas.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -433,7 +433,7 @@ intorel_startup(DestReceiver *self, int operation, TupleDesc typeinfo)
433433
rte->requiredPerms=ACL_INSERT;
434434

435435
for (attnum=1;attnum <=intoRelationDesc->rd_att->natts;attnum++)
436-
rte->modifiedCols=bms_add_member(rte->modifiedCols,
436+
rte->insertedCols=bms_add_member(rte->insertedCols,
437437
attnum-FirstLowInvalidHeapAttributeNumber);
438438

439439
ExecCheckRTPerms(list_make1(rte), true);

‎src/backend/commands/trigger.c

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -66,13 +66,13 @@ intSessionReplicationRole = SESSION_REPLICATION_ROLE_ORIGIN;
6666
staticintMyTriggerDepth=0;
6767

6868
/*
69-
* Note thatthis macro also exists in executor/execMain.c. There does not
70-
* appear to be any good header to put it into, given the structures that
71-
*ituses, so we let them be duplicated. Be sure to update both if one needs
72-
*tobe changed, however.
69+
* Note thatsimilar macros also exists in executor/execMain.c. There does not
70+
* appear to be any good header to put it into, given the structures that it
71+
* uses, so we let them be duplicated. Be sure to update both if one needs to
72+
* be changed, however.
7373
*/
74-
#defineGetModifiedColumns(relinfo,estate) \
75-
(rt_fetch((relinfo)->ri_RangeTableIndex, (estate)->es_range_table)->modifiedCols)
74+
#defineGetUpdatedColumns(relinfo,estate) \
75+
(rt_fetch((relinfo)->ri_RangeTableIndex, (estate)->es_range_table)->updatedCols)
7676

7777
/* Local function prototypes */
7878
staticvoidConvertTriggerToFK(CreateTrigStmt*stmt,Oidfuncoid);
@@ -2347,7 +2347,7 @@ ExecBSUpdateTriggers(EState *estate, ResultRelInfo *relinfo)
23472347
TriggerDesc*trigdesc;
23482348
inti;
23492349
TriggerDataLocTriggerData;
2350-
Bitmapset*modifiedCols;
2350+
Bitmapset*updatedCols;
23512351

23522352
trigdesc=relinfo->ri_TrigDesc;
23532353

@@ -2356,7 +2356,7 @@ ExecBSUpdateTriggers(EState *estate, ResultRelInfo *relinfo)
23562356
if (!trigdesc->trig_update_before_statement)
23572357
return;
23582358

2359-
modifiedCols=GetModifiedColumns(relinfo,estate);
2359+
updatedCols=GetUpdatedColumns(relinfo,estate);
23602360

23612361
LocTriggerData.type=T_TriggerData;
23622362
LocTriggerData.tg_event=TRIGGER_EVENT_UPDATE |
@@ -2377,7 +2377,7 @@ ExecBSUpdateTriggers(EState *estate, ResultRelInfo *relinfo)
23772377
TRIGGER_TYPE_UPDATE))
23782378
continue;
23792379
if (!TriggerEnabled(estate,relinfo,trigger,LocTriggerData.tg_event,
2380-
modifiedCols,NULL,NULL))
2380+
updatedCols,NULL,NULL))
23812381
continue;
23822382

23832383
LocTriggerData.tg_trigger=trigger;
@@ -2402,7 +2402,7 @@ ExecASUpdateTriggers(EState *estate, ResultRelInfo *relinfo)
24022402
if (trigdesc&&trigdesc->trig_update_after_statement)
24032403
AfterTriggerSaveEvent(estate,relinfo,TRIGGER_EVENT_UPDATE,
24042404
false,NULL,NULL,NIL,
2405-
GetModifiedColumns(relinfo,estate));
2405+
GetUpdatedColumns(relinfo,estate));
24062406
}
24072407

24082408
TupleTableSlot*
@@ -2420,7 +2420,7 @@ ExecBRUpdateTriggers(EState *estate, EPQState *epqstate,
24202420
HeapTupleoldtuple;
24212421
TupleTableSlot*newSlot;
24222422
inti;
2423-
Bitmapset*modifiedCols;
2423+
Bitmapset*updatedCols;
24242424
Bitmapset*keyCols;
24252425
LockTupleModelockmode;
24262426

@@ -2429,10 +2429,10 @@ ExecBRUpdateTriggers(EState *estate, EPQState *epqstate,
24292429
* been modified, then we can use a weaker lock, allowing for better
24302430
* concurrency.
24312431
*/
2432-
modifiedCols=GetModifiedColumns(relinfo,estate);
2432+
updatedCols=GetUpdatedColumns(relinfo,estate);
24332433
keyCols=RelationGetIndexAttrBitmap(relinfo->ri_RelationDesc,
24342434
INDEX_ATTR_BITMAP_KEY);
2435-
if (bms_overlap(keyCols,modifiedCols))
2435+
if (bms_overlap(keyCols,updatedCols))
24362436
lockmode=LockTupleExclusive;
24372437
else
24382438
lockmode=LockTupleNoKeyExclusive;
@@ -2486,7 +2486,7 @@ ExecBRUpdateTriggers(EState *estate, EPQState *epqstate,
24862486
TRIGGER_TYPE_UPDATE))
24872487
continue;
24882488
if (!TriggerEnabled(estate,relinfo,trigger,LocTriggerData.tg_event,
2489-
modifiedCols,trigtuple,newtuple))
2489+
updatedCols,trigtuple,newtuple))
24902490
continue;
24912491

24922492
LocTriggerData.tg_trigtuple=trigtuple;
@@ -2556,7 +2556,7 @@ ExecARUpdateTriggers(EState *estate, ResultRelInfo *relinfo,
25562556

25572557
AfterTriggerSaveEvent(estate,relinfo,TRIGGER_EVENT_UPDATE,
25582558
true,trigtuple,newtuple,recheckIndexes,
2559-
GetModifiedColumns(relinfo,estate));
2559+
GetUpdatedColumns(relinfo,estate));
25602560
if (trigtuple!=fdw_trigtuple)
25612561
heap_freetuple(trigtuple);
25622562
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp