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

Commit51893ea

Browse files
akorotkovzilder
authored andcommitted
Rework index ranges.
1 parent91a1d98 commit51893ea

File tree

3 files changed

+165
-122
lines changed

3 files changed

+165
-122
lines changed

‎contrib/pathman/pathman.c

Lines changed: 27 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include"pathman.h"
22
#include"postgres.h"
33
#include"fmgr.h"
4+
#include"nodes/nodeFuncs.h"
45
#include"nodes/pg_list.h"
56
#include"nodes/relation.h"
67
#include"nodes/primnodes.h"
@@ -59,6 +60,7 @@ static void change_varnos_in_restrinct_info(RestrictInfo *rinfo, Oid old_varno,
5960
staticvoidchange_varnos(Node*node,Oidold_varno,Oidnew_varno);
6061
staticboolchange_varno_walker(Node*node,change_varno_context*context);
6162

63+
/* callbacks */
6264
PG_FUNCTION_INFO_V1(on_partitions_created );
6365
PG_FUNCTION_INFO_V1(on_partitions_updated );
6466
PG_FUNCTION_INFO_V1(on_partitions_removed );
@@ -173,15 +175,15 @@ my_hook(PlannerInfo *root, RelOptInfo *rel, Index rti, RangeTblEntry *rte)
173175
// // children = lappend_int(children, prel->children[i]);
174176
// children = lappend_int(children, dsm_arr[i]);
175177

176-
ranges=list_make1_int(make_range(0,prel->children_count-1));
178+
ranges=list_make1_int(make_irange(0,prel->children_count-1, false));
177179

178180
/* Run over restrictions and collect children partitions */
179181
ereport(LOG, (errmsg("Checking restrictions")));
180182
foreach(lc,rel->baserestrictinfo)
181183
{
182184
RestrictInfo*rinfo= (RestrictInfo*)lfirst(lc);
183185
List*ret=walk_expr_tree(rinfo->clause,prel,&all);
184-
ranges=intersect_ranges(ranges,ret);
186+
ranges=irange_list_intersect(ranges,ret);
185187

186188
// if (!all)
187189
// {
@@ -194,7 +196,7 @@ my_hook(PlannerInfo *root, RelOptInfo *rel, Index rti, RangeTblEntry *rte)
194196
{
195197
inti;
196198
IndexRangerange= (IndexRange)lfirst(lc);
197-
for (i=range_min(range);i<=range_max(range);i++)
199+
for (i=irange_lower(range);i <=irange_upper(range);i++)
198200
children=lappend_int(children,dsm_arr[i]);
199201
}
200202

@@ -341,7 +343,7 @@ append_child_relation(PlannerInfo *root, RelOptInfo *rel, Index rti, RangeTblEnt
341343
childrel->baserestrictinfo=NIL;
342344
foreach(lc,rel->baserestrictinfo)
343345
{
344-
RestrictInfo*new_rinfo;
346+
Node*new_rinfo;
345347

346348
node= (Node*)lfirst(lc);
347349
new_rinfo=copyObject(node);
@@ -351,9 +353,6 @@ append_child_relation(PlannerInfo *root, RelOptInfo *rel, Index rti, RangeTblEnt
351353

352354
childrel->baserestrictinfo=lappend(childrel->baserestrictinfo,
353355
new_rinfo);
354-
355-
/* TODO: temporarily commented out */
356-
// reconstruct_restrictinfo((Node *) new_rinfo, prel, childOID);
357356
}
358357

359358
/* Build an AppendRelInfo for this parent and child */
@@ -435,7 +434,6 @@ change_varnos_in_restrinct_info(RestrictInfo *rinfo, Oid old_varno, Oid new_varn
435434
}
436435
}
437436

438-
439437
/*
440438
* Recursive function to walk through conditions tree
441439
*/
@@ -473,12 +471,15 @@ handle_binary_opexpr(const PartRelationInfo *prel, const OpExpr *expr,
473471
constVar*v,constConst*c)
474472
{
475473
HashRelationKeykey;
476-
HashRelation*hashrel;
477474
RangeRelation*rangerel;
478475
intint_value;
479476
Datumvalue;
480-
inti,j;
481-
intstartidx,endidx;
477+
inti,
478+
startidx,
479+
endidx;
480+
FmgrInfo*cmp_func;
481+
482+
*all= false;
482483

483484
/* determine operator type */
484485
TypeCacheEntry*tce=lookup_type_cache(v->vartype,
@@ -493,7 +494,7 @@ handle_binary_opexpr(const PartRelationInfo *prel, const OpExpr *expr,
493494
int_value=DatumGetInt32(c->constvalue);
494495
key.hash=make_hash(prel,int_value);
495496

496-
returnlist_make1_int(make_range(key.hash,key.hash));
497+
returnlist_make1_irange(make_irange(key.hash,key.hash, true));
497498

498499
// key.parent_oid = prel->oid;
499500
// hashrel = (HashRelation *)
@@ -572,7 +573,7 @@ handle_binary_opexpr(const PartRelationInfo *prel, const OpExpr *expr,
572573
{
573574
caseOP_STRATEGY_LT:
574575
startidx=0;
575-
endidx=(re->min==value) ?i-1 :i;
576+
endidx=check_eq(cmp_func,re->min,value) ?i-1 :i;
576577
break;
577578
caseOP_STRATEGY_LE:
578579
startidx=0;
@@ -581,19 +582,19 @@ handle_binary_opexpr(const PartRelationInfo *prel, const OpExpr *expr,
581582
caseBTEqualStrategyNumber:
582583
// return list_make1_int(re->child_oid);
583584
// return list_make1_int(make_range(prel->oid, prel->oid));
584-
returnlist_make1_int(make_range(i,i));
585+
returnlist_make1_irange(make_irange(i,i, true));
585586
caseBTGreaterEqualStrategyNumber:
586587
startidx=i;
587588
endidx=rangerel->nranges-1;
588589
break;
589-
caseOP_STRATEGY_GT:
590-
startidx=(re->max==value) ?i+1 :i;
590+
caseBTGreaterStrategyNumber:
591+
startidx=check_eq(cmp_func,re->max,value) ?i+1 :i;
591592
endidx=rangerel->nranges-1;
592593
}
593594
// for (j=startidx; j<=endidx; j++)
594595
// children = lappend_int(children, ranges[j].child_oid);
595596
*all= false;
596-
returnlist_make1_int(make_range(startidx,endidx));
597+
returnlist_make1_irange(make_irange(startidx,endidx, true));
597598

598599
// return children;
599600
}
@@ -650,7 +651,7 @@ handle_boolexpr(const BoolExpr *expr, const PartRelationInfo *prel)
650651
List*b=ALL;
651652

652653
if (expr->boolop==AND_EXPR)
653-
ret=list_make1_int(make_range(0,RANGE_INFINITY));
654+
ret=list_make1_irange(make_irange(0,RANGE_INFINITY, false));
654655

655656
foreach (lc,expr->args)
656657
{
@@ -691,11 +692,11 @@ handle_boolexpr(const BoolExpr *expr, const PartRelationInfo *prel)
691692
// break;
692693

693694
caseOR_EXPR:
694-
ret=unite_ranges(ret,b);
695+
ret=irange_list_union(ret,b);
695696
// list_free(b);
696697
break;
697698
caseAND_EXPR:
698-
ret=intersect_ranges(ret,b);
699+
ret=irange_list_intersect(ret,b);
699700
// list_free(b);
700701
break;
701702
default:
@@ -715,7 +716,6 @@ handle_arrexpr(const ScalarArrayOpExpr *expr, const PartRelationInfo *prel)
715716
Node*varnode= (Node*)linitial(expr->args);
716717
Node*arraynode= (Node*)lsecond(expr->args);
717718
HashRelationKeykey;
718-
HashRelation*hashrel;
719719

720720
if (varnode==NULL|| !IsA(varnode,Var))
721721
returnALL;
@@ -730,8 +730,8 @@ handle_arrexpr(const ScalarArrayOpExpr *expr, const PartRelationInfo *prel)
730730
intnum_elems;
731731
Datum*elem_values;
732732
bool*elem_nulls;
733-
inti;
734-
List*oids=NIL;
733+
inti;
734+
List*ret=NIL;
735735

736736
/* extract values from array */
737737
arrayval=DatumGetArrayTypeP(((Const*)arraynode)->constvalue);
@@ -743,7 +743,7 @@ handle_arrexpr(const ScalarArrayOpExpr *expr, const PartRelationInfo *prel)
743743
&elem_values,&elem_nulls,&num_elems);
744744

745745
/* construct OIDs list */
746-
for (i=0;i<num_elems;i++)
746+
for (i=0;i<num_elems;i++)
747747
{
748748
key.hash=make_hash(prel,elem_values[i]);
749749
// key.parent_oid = prel->oid;
@@ -753,14 +753,15 @@ handle_arrexpr(const ScalarArrayOpExpr *expr, const PartRelationInfo *prel)
753753
// if (hashrel != NULL)
754754
// oids = list_append_unique_int(oids, hashrel->child_oid);
755755

756-
oids=list_append_unique_int(oids,make_range(key.hash,key.hash));
756+
ret=list_append_unique_int(ret,make_irange(key.hash,key.hash, true));
757757
}
758758

759759
/* free resources */
760760
pfree(elem_values);
761761
pfree(elem_nulls);
762762

763-
returnoids;
763+
*all= false;
764+
returnret;
764765
}
765766
returnALL;
766767
}

‎contrib/pathman/pathman.h

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
#ifndefPATHMAN_H
2+
#definePATHMAN_H
3+
14
#include"postgres.h"
25
#include"utils/date.h"
36
#include"utils/hsearch.h"
@@ -133,23 +136,34 @@ typedef struct RangeRelation
133136

134137

135138
typedefintIndexRange;
136-
#defineRANGE_INFINITY 0xFFFF
139+
#defineRANGE_INFINITY 0x7FFF
140+
#defineRANGE_LOSSY 0x80000000
141+
142+
#definemake_irange(lower,upper,lossy) \
143+
(((lower) & RANGE_INFINITY) << 15 | ((upper) & RANGE_INFINITY) | ((lossy) ? RANGE_LOSSY : 0))
144+
145+
#defineirange_lower(irange) \
146+
(((irange) >> 15) & RANGE_INFINITY)
137147

138-
#definemake_range(min,max) \
139-
((min) << 16 | ((max) & 0x0000FFFF))
148+
#defineirange_upper(irange) \
149+
((irange) & RANGE_INFINITY)
140150

141-
#definerange_min(range) \
142-
((range) >> 16)
151+
#defineirange_is_lossy(irange) \
152+
((irange) & RANGE_LOSSY)
143153

144-
#definerange_max(range) \
145-
((range) & 0x0000FFFF)
154+
#definelfirst_irange(lc)((IndexRange)(lc)->data.int_value)
155+
#definelappend_irange(list,irange)(lappend_int((list), (int)(irange)))
156+
#definelist_make1_irange(irange)lcons_int((int)(irange), NIL)
157+
158+
159+
/* rangeset.c */
160+
boolirange_intersects(IndexRangea,IndexRangeb);
161+
boolirange_conjuncted(IndexRangea,IndexRangeb);
162+
IndexRangeirange_union(IndexRangea,IndexRangeb);
163+
IndexRangeirange_intersect(IndexRangea,IndexRangeb);
164+
List*irange_list_union(List*a,List*b);
165+
List*irange_list_intersect(List*a,List*b);
146166

147-
// Range make_range(int min, int max);
148-
// int range_min(Range range);
149-
// int range_max(Range range);
150-
List*append_range(List*a_lst,IndexRangeb);
151-
List*intersect_ranges(List*a,List*b);
152-
List*unite_ranges(List*a,List*b);
153167

154168
LWLock*load_config_lock;
155169
LWLock*dsm_init_lock;
@@ -182,3 +196,5 @@ void load_part_relations_hashtable(void);
182196
voidload_hash_restrictions(Oidrelid);
183197
voidload_range_restrictions(Oidrelid);
184198
voidremove_relation_info(Oidrelid);
199+
200+
#endif/* PATHMAN_H */

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp