@@ -198,8 +198,12 @@ append_part_attr_to_tlist(List *tlist, Index relno, const PartRelationInfo *prel
198
198
199
199
foreach (lc , vars_not_found )
200
200
{
201
- Var * var = (Var * ) lfirst (lc );
202
201
Index last_item = list_length (tlist ) + 1 ;
202
+ Var * var = (Var * ) copyObject ((Node * ) lfirst (lc ));
203
+
204
+ /* other fields except 'varno' should be correct */
205
+ var -> varno = relno ;
206
+
203
207
tlist = lappend (tlist , makeTargetEntry ((Expr * ) var ,
204
208
last_item ,
205
209
NULL , false));
@@ -612,12 +616,35 @@ end_append_common(CustomScanState *node)
612
616
hash_destroy (scan_state -> children_table );
613
617
}
614
618
619
+ /* Find first Var with varno == INDEX_VAR, and returns its varnoold */
620
+ static bool
621
+ find_varnoold (Node * node , int * varnoold )
622
+ {
623
+ if (node == NULL )
624
+ return false;
625
+
626
+ if (IsA (node , Var ))
627
+ {
628
+ Var * var = (Var * ) node ;
629
+ if (var -> varno == INDEX_VAR )
630
+ {
631
+ /* we found it */
632
+ * varnoold = var -> varnoold ;
633
+ return true;
634
+ }
635
+ return false;
636
+ }
637
+
638
+ return expression_tree_walker (node , find_varnoold , (void * ) varnoold );
639
+ }
640
+
615
641
/*
616
- * This function is similar to ChangeVarNodes, but changes only
617
- * varno attributes, but doesn't change varnoold attribute
642
+ * To check equality we need to modify partitioning expression's Vars like
643
+ * they appear in custom_exprs, it means that varno should be equal to
644
+ * INDEX_VAR and varnoold should be changed according to query
618
645
*/
619
646
static bool
620
- change_only_varnos (Node * node , const int * idx )
647
+ prepare_vars (Node * node , const int * varnoold )
621
648
{
622
649
if (node == NULL )
623
650
return false;
@@ -626,11 +653,12 @@ change_only_varnos(Node *node, const int *idx)
626
653
{
627
654
Var * var = (Var * ) node ;
628
655
Assert (var -> varno == 1 );
629
- var -> varno = * idx ;
656
+ var -> varno = INDEX_VAR ;
657
+ var -> varnoold = * varnoold ;
630
658
return false;
631
659
}
632
660
633
- return expression_tree_walker (node , change_only_varnos , (void * ) idx );
661
+ return expression_tree_walker (node , prepare_vars , (void * ) varnoold );
634
662
}
635
663
636
664
void
@@ -646,14 +674,22 @@ rescan_append_common(CustomScanState *node)
646
674
int nparts ;
647
675
Node * prel_expr ;
648
676
649
- const int index_var = INDEX_VAR ;
677
+ int varnoold = -100 ; /* not possible number */
650
678
651
679
prel = get_pathman_relation_info (scan_state -> relid );
652
680
Assert (prel );
653
681
654
- /* Prepare expression */
682
+ /* Prepare expression. Copy and modify 'varno' and 'varnoold' attributes */
655
683
prel_expr = copyObject (prel -> expr );
656
- change_only_varnos (prel_expr , & index_var );
684
+ foreach (lc , scan_state -> custom_exprs )
685
+ {
686
+ find_varnoold ((Node * ) lfirst (lc ), & varnoold );
687
+ if (varnoold != -100 )
688
+ break ;
689
+ }
690
+
691
+ if (varnoold != -100 )
692
+ prepare_vars (prel_expr , & varnoold );
657
693
658
694
/* First we select all available partitions... */
659
695
ranges = list_make1_irange (make_irange (0 , PrelLastChild (prel ), IR_COMPLETE ));
0 commit comments