|
25 | 25 |
|
26 | 26 |
|
27 | 27 | staticboolclause_contains_params_walker(Node*node,void*context); |
28 | | -staticvoidchange_varnos_in_restrinct_info(RestrictInfo*rinfo,change_varno_context*context); |
| 28 | +staticvoidchange_varnos_in_restrinct_info(RestrictInfo*rinfo, |
| 29 | +change_varno_context*context); |
29 | 30 | staticboolchange_varno_walker(Node*node,change_varno_context*context); |
30 | 31 | staticList*get_tableoids_list(List*tlist); |
31 | 32 | staticvoidlock_rows_visitor(Plan*plan,void*context); |
@@ -440,6 +441,43 @@ change_varno_walker(Node *node, change_varno_context *context) |
440 | 441 | returnexpression_tree_walker(node,change_varno_walker, (void*)context); |
441 | 442 | } |
442 | 443 |
|
| 444 | +staticvoid |
| 445 | +change_varnos_in_restrinct_info(RestrictInfo*rinfo,change_varno_context*context) |
| 446 | +{ |
| 447 | +ListCell*lc; |
| 448 | + |
| 449 | +change_varno_walker((Node*)rinfo->clause,context); |
| 450 | +if (rinfo->left_em) |
| 451 | +change_varno_walker((Node*)rinfo->left_em->em_expr,context); |
| 452 | + |
| 453 | +if (rinfo->right_em) |
| 454 | +change_varno_walker((Node*)rinfo->right_em->em_expr,context); |
| 455 | + |
| 456 | +if (rinfo->orclause) |
| 457 | +foreach(lc, ((BoolExpr*)rinfo->orclause)->args) |
| 458 | +{ |
| 459 | +Node*node= (Node*)lfirst(lc); |
| 460 | +change_varno_walker(node,context); |
| 461 | +} |
| 462 | + |
| 463 | +/* TODO: find some elegant way to do this */ |
| 464 | +if (bms_is_member(context->old_varno,rinfo->clause_relids)) |
| 465 | +{ |
| 466 | +rinfo->clause_relids=bms_del_member(rinfo->clause_relids,context->old_varno); |
| 467 | +rinfo->clause_relids=bms_add_member(rinfo->clause_relids,context->new_varno); |
| 468 | +} |
| 469 | +if (bms_is_member(context->old_varno,rinfo->left_relids)) |
| 470 | +{ |
| 471 | +rinfo->left_relids=bms_del_member(rinfo->left_relids,context->old_varno); |
| 472 | +rinfo->left_relids=bms_add_member(rinfo->left_relids,context->new_varno); |
| 473 | +} |
| 474 | +if (bms_is_member(context->old_varno,rinfo->right_relids)) |
| 475 | +{ |
| 476 | +rinfo->right_relids=bms_del_member(rinfo->right_relids,context->old_varno); |
| 477 | +rinfo->right_relids=bms_add_member(rinfo->right_relids,context->new_varno); |
| 478 | +} |
| 479 | +} |
| 480 | + |
443 | 481 | Oid |
444 | 482 | str_to_oid(constchar*cstr) |
445 | 483 | { |
@@ -477,10 +515,6 @@ plan_tree_walker(Plan *plan, |
477 | 515 | plan_tree_walker((Plan*)lfirst(l),visitor,context); |
478 | 516 | break; |
479 | 517 |
|
480 | | -/* |
481 | | - * Add proxy PartitionFilter nodes |
482 | | - * to subplans of ModifyTable node |
483 | | - */ |
484 | 518 | caseT_ModifyTable: |
485 | 519 | foreach (l, ((ModifyTable*)plan)->plans) |
486 | 520 | plan_tree_walker((Plan*)lfirst(l),visitor,context); |
@@ -510,47 +544,10 @@ plan_tree_walker(Plan *plan, |
510 | 544 | plan_tree_walker(plan->lefttree,visitor,context); |
511 | 545 | plan_tree_walker(plan->righttree,visitor,context); |
512 | 546 |
|
| 547 | +/* Apply visitor to the current node */ |
513 | 548 | visitor(plan,context); |
514 | 549 | } |
515 | 550 |
|
516 | | - |
517 | | -staticvoid |
518 | | -change_varnos_in_restrinct_info(RestrictInfo*rinfo,change_varno_context*context) |
519 | | -{ |
520 | | -ListCell*lc; |
521 | | - |
522 | | -change_varno_walker((Node*)rinfo->clause,context); |
523 | | -if (rinfo->left_em) |
524 | | -change_varno_walker((Node*)rinfo->left_em->em_expr,context); |
525 | | - |
526 | | -if (rinfo->right_em) |
527 | | -change_varno_walker((Node*)rinfo->right_em->em_expr,context); |
528 | | - |
529 | | -if (rinfo->orclause) |
530 | | -foreach(lc, ((BoolExpr*)rinfo->orclause)->args) |
531 | | -{ |
532 | | -Node*node= (Node*)lfirst(lc); |
533 | | -change_varno_walker(node,context); |
534 | | -} |
535 | | - |
536 | | -/* TODO: find some elegant way to do this */ |
537 | | -if (bms_is_member(context->old_varno,rinfo->clause_relids)) |
538 | | -{ |
539 | | -rinfo->clause_relids=bms_del_member(rinfo->clause_relids,context->old_varno); |
540 | | -rinfo->clause_relids=bms_add_member(rinfo->clause_relids,context->new_varno); |
541 | | -} |
542 | | -if (bms_is_member(context->old_varno,rinfo->left_relids)) |
543 | | -{ |
544 | | -rinfo->left_relids=bms_del_member(rinfo->left_relids,context->old_varno); |
545 | | -rinfo->left_relids=bms_add_member(rinfo->left_relids,context->new_varno); |
546 | | -} |
547 | | -if (bms_is_member(context->old_varno,rinfo->right_relids)) |
548 | | -{ |
549 | | -rinfo->right_relids=bms_del_member(rinfo->right_relids,context->old_varno); |
550 | | -rinfo->right_relids=bms_add_member(rinfo->right_relids,context->new_varno); |
551 | | -} |
552 | | -} |
553 | | - |
554 | 551 | /* |
555 | 552 | * Add missing 'TABLEOID_STR%u' junk attributes for inherited partitions |
556 | 553 | * |
|