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

Commita5987fb

Browse files
committed
Merge branch picky_nodes into picky_nodes_hash (resolve conflicts)
2 parents1f9d176 +fa9d209 commita5987fb

File tree

5 files changed

+349
-77
lines changed

5 files changed

+349
-77
lines changed

‎src/hooks.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,7 @@ pathman_planner_hook(Query *parse, int cursorOptions, ParamListInfo boundParams)
377377
{
378378
caseCMD_SELECT:
379379
disable_inheritance(parse);
380+
rowmark_add_tableoids(parse);/* add attributes for rowmarks */
380381
break;
381382

382383
caseCMD_UPDATE:
@@ -410,6 +411,16 @@ pathman_planner_hook(Query *parse, int cursorOptions, ParamListInfo boundParams)
410411
else
411412
result=standard_planner(parse,cursorOptions,boundParams);
412413

414+
if (pg_pathman_enable)
415+
{
416+
ListCell*lc;
417+
418+
/* Give rowmark-related attributes correct names */
419+
postprocess_lock_rows(result->rtable,result->planTree);
420+
foreach (lc,result->subplans)
421+
postprocess_lock_rows(result->rtable, (Plan*)lfirst(lc));
422+
}
423+
413424
returnresult;
414425
}
415426

‎src/partition_filter.c

Lines changed: 33 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ init_partition_filter_static_data(void)
4242

4343
Plan*
4444
make_partition_filter(Plan*subplan,Oidpartitioned_table,
45-
OnConflictActionconflict_action)
45+
OnConflictActionconflict_action)
4646
{
4747
CustomScan*cscan=makeNode(CustomScan);
4848

@@ -327,78 +327,44 @@ pfilter_build_tlist(List *tlist)
327327
}
328328

329329
/*
330-
* Add PartitionFilter nodes to the plan tree
330+
* Add partition filters to ModifyTable node's children
331+
*
332+
* 'context' should point to the PlannedStmt->rtable
331333
*/
332-
void
333-
add_partition_filters(List*rtable,Plan*plan)
334+
staticvoid
335+
partition_filter_visitor(Plan*plan,void*context)
334336
{
335-
ListCell*l;
337+
List*rtable= (List*)context;
338+
ModifyTable*modify_table= (ModifyTable*)plan;
339+
ListCell*lc1,
340+
*lc2;
341+
342+
Assert(rtable&&IsA(rtable,List));
336343

337-
if (plan==NULL|| !pg_pathman_enable_partition_filter)
344+
/* Skip if not ModifyTable with 'INSERT' command */
345+
if (!IsA(modify_table,ModifyTable)||modify_table->operation!=CMD_INSERT)
338346
return;
339347

340-
/* Plan-type-specific fixes*/
341-
switch (nodeTag(plan))
348+
forboth (lc1,modify_table->plans,lc2,modify_table->resultRelations)
342349
{
343-
caseT_SubqueryScan:
344-
add_partition_filters(rtable, ((SubqueryScan*)plan)->subplan);
345-
break;
346-
347-
caseT_CustomScan:
348-
foreach(l, ((CustomScan*)plan)->custom_plans)
349-
add_partition_filters(rtable, (Plan*)lfirst(l));
350-
break;
351-
352-
/*
353-
* Add proxy PartitionFilter nodes
354-
* to subplans of ModifyTable node
355-
*/
356-
caseT_ModifyTable:
357-
{
358-
ModifyTable*modify_table= ((ModifyTable*)plan);
359-
ListCell*lc1,
360-
*lc2;
361-
362-
if (modify_table->operation!=CMD_INSERT)
363-
break;
364-
365-
forboth (lc1,modify_table->plans,lc2,modify_table->resultRelations)
366-
{
367-
Indexrindex=lfirst_int(lc2);
368-
Oidrelid=getrelid(rindex,rtable);
369-
PartRelationInfo*prel=get_pathman_relation_info(relid,NULL);
370-
371-
add_partition_filters(rtable, (Plan*)lfirst(lc1));
372-
373-
if (prel)
374-
lfirst(lc1)=make_partition_filter((Plan*)lfirst(lc1),
375-
relid,
376-
modify_table->onConflictAction);
377-
}
378-
}
379-
break;
380-
381-
/* Since they look alike */
382-
caseT_MergeAppend:
383-
caseT_Append:
384-
foreach(l, ((Append*)plan)->appendplans)
385-
add_partition_filters(rtable, (Plan*)lfirst(l));
386-
break;
387-
388-
caseT_BitmapAnd:
389-
foreach(l, ((BitmapAnd*)plan)->bitmapplans)
390-
add_partition_filters(rtable, (Plan*)lfirst(l));
391-
break;
392-
393-
caseT_BitmapOr:
394-
foreach(l, ((BitmapOr*)plan)->bitmapplans)
395-
add_partition_filters(rtable, (Plan*)lfirst(l));
396-
break;
397-
398-
default:
399-
break;
350+
Indexrindex=lfirst_int(lc2);
351+
Oidrelid=getrelid(rindex,rtable);
352+
PartRelationInfo*prel=get_pathman_relation_info(relid,NULL);
353+
354+
/* Check that table is partitioned */
355+
if (prel)
356+
lfirst(lc1)=make_partition_filter((Plan*)lfirst(lc1),
357+
relid,
358+
modify_table->onConflictAction);
400359
}
360+
}
401361

402-
add_partition_filters(rtable,plan->lefttree);
403-
add_partition_filters(rtable,plan->righttree);
362+
/*
363+
* Add PartitionFilter nodes to the plan tree
364+
*/
365+
void
366+
add_partition_filters(List*rtable,Plan*plan)
367+
{
368+
if (pg_pathman_enable_partition_filter)
369+
plan_tree_walker(plan,partition_filter_visitor,rtable);
404370
}

‎src/pg_pathman.c

Lines changed: 52 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include"optimizer/paths.h"
2222
#include"optimizer/pathnode.h"
2323
#include"optimizer/planner.h"
24+
#include"optimizer/prep.h"
2425
#include"optimizer/restrictinfo.h"
2526
#include"optimizer/cost.h"
2627
#include"parser/analyze.h"
@@ -33,6 +34,7 @@
3334
#include"utils/selfuncs.h"
3435
#include"access/heapam.h"
3536
#include"access/nbtree.h"
37+
#include"access/sysattr.h"
3638
#include"storage/ipc.h"
3739
#include"catalog/pg_type.h"
3840
#include"foreign/fdwapi.h"
@@ -196,7 +198,7 @@ disable_inheritance(Query *parse)
196198

197199
foreach(lc,parse->rtable)
198200
{
199-
rte= (RangeTblEntry*)lfirst(lc);
201+
rte= (RangeTblEntry*)lfirst(lc);
200202
switch(rte->rtekind)
201203
{
202204
caseRTE_RELATION:
@@ -369,13 +371,17 @@ int
369371
append_child_relation(PlannerInfo*root,RelOptInfo*rel,Indexrti,
370372
RangeTblEntry*rte,intindex,OidchildOid,List*wrappers)
371373
{
372-
RangeTblEntry*childrte;
373-
RelOptInfo*childrel;
374-
IndexchildRTindex;
375-
AppendRelInfo*appinfo;
376-
Node*node;
377-
ListCell*lc,*lc2;
378-
Relationnewrelation;
374+
RangeTblEntry*childrte;
375+
RelOptInfo*childrel;
376+
IndexchildRTindex;
377+
AppendRelInfo*appinfo;
378+
Node*node;
379+
ListCell*lc,
380+
*lc2;
381+
Relationnewrelation;
382+
PlanRowMark*parent_rowmark;
383+
PlanRowMark*child_rowmark;
384+
AttrNumberi;
379385

380386
newrelation=heap_open(childOid,NoLock);
381387

@@ -407,8 +413,18 @@ append_child_relation(PlannerInfo *root, RelOptInfo *rel, Index rti,
407413
childrel->reltargetlist=lappend(childrel->reltargetlist,new_target);
408414
}
409415

410-
/* Copy attr_needed (used in build_joinrel_tlist() function) */
411-
childrel->attr_needed=rel->attr_needed;
416+
/* Copy attr_needed & attr_widths */
417+
childrel->attr_needed= (Relids*)
418+
palloc0((rel->max_attr-rel->min_attr+1)*sizeof(Relids));
419+
childrel->attr_widths= (int32*)
420+
palloc0((rel->max_attr-rel->min_attr+1)*sizeof(int32));
421+
422+
for (i=0;i<rel->max_attr-rel->min_attr+1;i++)
423+
childrel->attr_needed[i]=bms_copy(rel->attr_needed[i]);
424+
425+
memcpy(childrel->attr_widths,rel->attr_widths,
426+
(rel->max_attr-rel->min_attr+1)*sizeof(int32));
427+
412428

413429
/* Copy restrictions */
414430
childrel->baserestrictinfo=NIL;
@@ -491,6 +507,32 @@ append_child_relation(PlannerInfo *root, RelOptInfo *rel, Index rti,
491507

492508
heap_close(newrelation,NoLock);
493509

510+
511+
/* Create rowmarks required for child rels */
512+
parent_rowmark=get_plan_rowmark(root->rowMarks,rti);
513+
if (parent_rowmark)
514+
{
515+
child_rowmark=makeNode(PlanRowMark);
516+
517+
child_rowmark->rti=childRTindex;
518+
child_rowmark->prti=rti;
519+
child_rowmark->rowmarkId=parent_rowmark->rowmarkId;
520+
/* Reselect rowmark type, because relkind might not match parent */
521+
child_rowmark->markType=select_rowmark_type(childrte,
522+
parent_rowmark->strength);
523+
child_rowmark->allMarkTypes= (1 <<child_rowmark->markType);
524+
child_rowmark->strength=parent_rowmark->strength;
525+
child_rowmark->waitPolicy=parent_rowmark->waitPolicy;
526+
child_rowmark->isParent= false;
527+
528+
/* Include child's rowmark type in parent's allMarkTypes */
529+
parent_rowmark->allMarkTypes |=child_rowmark->allMarkTypes;
530+
531+
root->rowMarks=lappend(root->rowMarks,child_rowmark);
532+
533+
parent_rowmark->isParent= true;
534+
}
535+
494536
returnchildRTindex;
495537
}
496538

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp