@@ -39,6 +39,7 @@ static void change_varnos_in_restrinct_info(RestrictInfo *rinfo,
39
39
static bool change_varno_walker (Node * node , change_varno_context * context );
40
40
static List * get_tableoids_list (List * tlist );
41
41
static void lock_rows_visitor (Plan * plan , void * context );
42
+ static bool rowmark_add_tableoids_walker (Node * node , void * context );
42
43
43
44
44
45
/*
@@ -492,6 +493,57 @@ plan_tree_walker(Plan *plan,
492
493
visitor (plan , context );
493
494
}
494
495
496
+ static bool
497
+ rowmark_add_tableoids_walker (Node * node , void * context )
498
+ {
499
+ if (node == NULL )
500
+ return false;
501
+
502
+ if (IsA (node , Query ))
503
+ {
504
+ Query * parse = (Query * ) node ;
505
+ ListCell * lc ;
506
+
507
+ /* Generate 'tableoid' for partitioned table rowmark */
508
+ foreach (lc , parse -> rowMarks )
509
+ {
510
+ RowMarkClause * rc = (RowMarkClause * ) lfirst (lc );
511
+ Oid parent = getrelid (rc -> rti , parse -> rtable );
512
+ Var * var ;
513
+ TargetEntry * tle ;
514
+ char resname [64 ];
515
+
516
+ /* Check that table is partitioned */
517
+ if (!get_pathman_relation_info (parent ))
518
+ continue ;
519
+
520
+ var = makeVar (rc -> rti ,
521
+ TableOidAttributeNumber ,
522
+ OIDOID ,
523
+ -1 ,
524
+ InvalidOid ,
525
+ 0 );
526
+
527
+ /* Use parent's Oid as TABLEOID_STR's key (%u) */
528
+ snprintf (resname , sizeof (resname ), TABLEOID_STR ("%u" ), parent );
529
+
530
+ tle = makeTargetEntry ((Expr * ) var ,
531
+ list_length (parse -> targetList ) + 1 ,
532
+ pstrdup (resname ),
533
+ true);
534
+
535
+ /* There's no problem here since new attribute is junk */
536
+ parse -> targetList = lappend (parse -> targetList , tle );
537
+ }
538
+
539
+ return query_tree_walker ((Query * ) node ,
540
+ rowmark_add_tableoids_walker ,
541
+ NULL , 0 );
542
+ }
543
+
544
+ return expression_tree_walker (node , rowmark_add_tableoids_walker , NULL );
545
+ }
546
+
495
547
/*
496
548
* Add missing 'TABLEOID_STR%u' junk attributes for inherited partitions
497
549
*
@@ -504,56 +556,7 @@ plan_tree_walker(Plan *plan,
504
556
void
505
557
rowmark_add_tableoids (Query * parse )
506
558
{
507
- ListCell * lc ;
508
-
509
- check_stack_depth ();
510
-
511
- foreach (lc , parse -> rtable )
512
- {
513
- RangeTblEntry * rte = (RangeTblEntry * ) lfirst (lc );
514
-
515
- switch (rte -> rtekind )
516
- {
517
- case RTE_SUBQUERY :
518
- rowmark_add_tableoids (rte -> subquery );
519
- break ;
520
-
521
- default :
522
- break ;
523
- }
524
- }
525
-
526
- /* Generate 'tableoid' for partitioned table rowmark */
527
- foreach (lc , parse -> rowMarks )
528
- {
529
- RowMarkClause * rc = (RowMarkClause * ) lfirst (lc );
530
- Oid parent = getrelid (rc -> rti , parse -> rtable );
531
- Var * var ;
532
- TargetEntry * tle ;
533
- char resname [64 ];
534
-
535
- /* Check that table is partitioned */
536
- if (!get_pathman_relation_info (parent ))
537
- continue ;
538
-
539
- var = makeVar (rc -> rti ,
540
- TableOidAttributeNumber ,
541
- OIDOID ,
542
- -1 ,
543
- InvalidOid ,
544
- 0 );
545
-
546
- /* Use parent's Oid as TABLEOID_STR's key (%u) */
547
- snprintf (resname , sizeof (resname ), TABLEOID_STR ("%u" ), parent );
548
-
549
- tle = makeTargetEntry ((Expr * ) var ,
550
- list_length (parse -> targetList ) + 1 ,
551
- pstrdup (resname ),
552
- true);
553
-
554
- /* There's no problem here since new attribute is junk */
555
- parse -> targetList = lappend (parse -> targetList , tle );
556
- }
559
+ rowmark_add_tableoids_walker ((Node * ) parse , NULL );
557
560
}
558
561
559
562
/*
0 commit comments