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

Commit44c3e0d

Browse files
committed
Fix runtime nodes tests
1 parentb31d607 commit44c3e0d

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
Indexlast_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+
staticbool
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+
returnexpression_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
staticbool
620-
change_only_varnos(Node*node,constint*idx)
647+
prepare_vars(Node*node,constint*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-
returnexpression_tree_walker(node,change_only_varnos, (void*)idx);
661+
returnexpression_tree_walker(node,prepare_vars, (void*)varnoold);
634662
}
635663

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

649-
constintindex_var=INDEX_VAR;
677+
intvarnoold=-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)

[8]ページ先頭

©2009-2025 Movatter.jp