Skip to content

Commit 44c3e0d

Browse files
committed
Fix runtime nodes tests
1 parent b31d607 commit 44c3e0d

File tree

1 file changed

+45
-9
lines changed

1 file changed

+45
-9
lines changed

src/nodes_common.c

Lines changed: 45 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -198,8 +198,12 @@ append_part_attr_to_tlist(List *tlist, Index relno, const PartRelationInfo *prel
198198

199199
foreach(lc, vars_not_found)
200200
{
201-
Var *var = (Var *) lfirst(lc);
202201
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+
203207
tlist = lappend(tlist, makeTargetEntry((Expr *) var,
204208
last_item,
205209
NULL, false));
@@ -612,12 +616,35 @@ end_append_common(CustomScanState *node)
612616
hash_destroy(scan_state->children_table);
613617
}
614618

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+
615641
/*
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
618645
*/
619646
static bool
620-
change_only_varnos(Node *node, const int *idx)
647+
prepare_vars(Node *node, const int *varnoold)
621648
{
622649
if (node == NULL)
623650
return false;
@@ -626,11 +653,12 @@ change_only_varnos(Node *node, const int *idx)
626653
{
627654
Var *var = (Var *) node;
628655
Assert(var->varno == 1);
629-
var->varno = *idx;
656+
var->varno = INDEX_VAR;
657+
var->varnoold = *varnoold;
630658
return false;
631659
}
632660

633-
return expression_tree_walker(node, change_only_varnos, (void *) idx);
661+
return expression_tree_walker(node, prepare_vars, (void *) varnoold);
634662
}
635663

636664
void
@@ -646,14 +674,22 @@ rescan_append_common(CustomScanState *node)
646674
int nparts;
647675
Node *prel_expr;
648676

649-
const int index_var = INDEX_VAR;
677+
int varnoold = -100; /* not possible number */
650678

651679
prel = get_pathman_relation_info(scan_state->relid);
652680
Assert(prel);
653681

654-
/* Prepare expression */
682+
/* Prepare expression. Copy and modify 'varno' and 'varnoold' attributes */
655683
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);
657693

658694
/* First we select all available partitions... */
659695
ranges = list_make1_irange(make_irange(0, PrelLastChild(prel), IR_COMPLETE));

0 commit comments

Comments
 (0)