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

Commit7dc0118

Browse files
committed
change IndexRange's implementation
1 parent073cf4c commit7dc0118

File tree

6 files changed

+80
-80
lines changed

6 files changed

+80
-80
lines changed

‎src/hooks.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ pathman_rel_pathlist_hook(PlannerInfo *root, RelOptInfo *rel, Index rti, RangeTb
220220

221221
rte->inh= true;
222222
dsm_arr= (Oid*)dsm_array_get_pointer(&prel->children);
223-
ranges=list_make1_int(make_irange(0,prel->children_count-1, false));
223+
ranges=list_make1_irange(make_irange(0,prel->children_count-1, false));
224224

225225
/* Make wrappers over restrictions and collect final rangeset */
226226
context.prel=prel;
@@ -282,7 +282,7 @@ pathman_rel_pathlist_hook(PlannerInfo *root, RelOptInfo *rel, Index rti, RangeTb
282282
{
283283
IndexRangeirange=lfirst_irange(lc);
284284

285-
for (i=irange_lower(irange);i <=irange_upper(irange);i++)
285+
for (i=irange.ir_lower;i <=irange.ir_upper;i++)
286286
append_child_relation(root,rel,rti,rte,i,dsm_arr[i],wrappers);
287287
}
288288

‎src/nodes_common.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -217,8 +217,8 @@ get_partition_oids(List *ranges, int *n, PartRelationInfo *prel)
217217
foreach (range_cell,ranges)
218218
{
219219
inti;
220-
inta=irange_lower(lfirst_irange(range_cell));
221-
intb=irange_upper(lfirst_irange(range_cell));
220+
inta=lfirst_irange(range_cell).ir_lower;
221+
intb=lfirst_irange(range_cell).ir_upper;
222222

223223
for (i=a;i <=b;i++)
224224
{
@@ -498,7 +498,7 @@ rescan_append_common(CustomScanState *node)
498498
intnparts;
499499
WalkerContextwcxt;
500500

501-
ranges=list_make1_int(make_irange(0,prel->children_count-1, false));
501+
ranges=list_make1_irange(make_irange(0,prel->children_count-1, false));
502502

503503
wcxt.prel=prel;
504504
wcxt.econtext=econtext;

‎src/partition_filter.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@ partition_filter_exec(CustomScanState *node)
173173
elseif (nparts==0)
174174
selected_partid=add_missing_partition(state->partitioned_table,
175175
&state->temp_const);
176+
176177
else
177178
selected_partid=parts[0];
178179

‎src/pathman.h

Lines changed: 35 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -139,27 +139,46 @@ extern PathmanState *pmstate;
139139

140140
#definePATHMAN_GET_DATUM(value,by_val) ( (by_val) ? (value) : PointerGetDatum(&value) )
141141

142-
typedefuint32IndexRange;
143-
#defineRANGE_INFINITY0x7FFF
144-
#defineRANGE_LOSSY0x80000000
142+
typedefstruct {
143+
boolir_valid :1;
144+
boolir_lossy :1;
145+
uint32ir_lower :31;
146+
uint32ir_upper :31;
147+
}IndexRange;
145148

146-
#definemake_irange(lower,upper,lossy) \
147-
(((lower) & RANGE_INFINITY) << 15 | ((upper) & RANGE_INFINITY) | ((lossy) ? RANGE_LOSSY : 0))
149+
#defineRANGE_MASK0xEFFFFFFF
148150

149-
#defineirange_lower(irange) \
150-
(((irange) >> 15) & RANGE_INFINITY)
151+
#defineInvalidIndexRange{ false, false, 0, 0 }
151152

152-
#defineirange_upper(irange) \
153-
((irange) & RANGE_INFINITY)
153+
inlinestaticIndexRange
154+
make_irange(uint32lower,uint32upper,boollossy)
155+
{
156+
IndexRangeresult;
157+
158+
result.ir_valid= true;
159+
result.ir_lossy=lossy;
160+
result.ir_lower= (lower&RANGE_MASK);
161+
result.ir_upper= (upper&RANGE_MASK);
162+
163+
returnresult;
164+
}
165+
166+
inlinestaticIndexRange*
167+
alloc_irange(IndexRangeirange)
168+
{
169+
IndexRange*result= (IndexRange*)palloc(sizeof(IndexRange));
170+
171+
memcpy((void*)result, (void*)&irange,sizeof(IndexRange));
154172

155-
#defineirange_is_lossy(irange) \
156-
((irange) & RANGE_LOSSY)
173+
returnresult;
174+
}
157175

158-
#definelfirst_irange(lc)((IndexRange)(lc)->data.int_value)
159-
#definelappend_irange(list,irange)(lappend_int((list), (int)(irange)))
160-
#definelcons_irange(irange,list)lcons_int((int)(irange), (list))
161-
#definelist_make1_irange(irange)lcons_int((int)(irange), NIL)
162-
#definellast_irange(l)(IndexRange)lfirst_int(list_tail(l))
176+
#definelfirst_irange(lc)( *(IndexRange *) lfirst(lc) )
177+
#definelappend_irange(list,irange)( lappend((list), alloc_irange(irange)) )
178+
#definelcons_irange(irange,list)( lcons(alloc_irange(irange), (list)) )
179+
#definelist_make1_irange(irange)( lcons(alloc_irange(irange), NIL) )
180+
#definellast_irange(list)( lfirst_irange(list_tail(list)) )
181+
#definelinitial_irange(list)( lfirst_irange(list_head(list)) )
163182

164183
/* rangeset.c */
165184
boolirange_intersects(IndexRangea,IndexRangeb);

‎src/pg_pathman.c

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,7 @@ handle_modification_query(Query *parse)
304304
return;
305305

306306
/* Parse syntax tree and extract partition ranges */
307-
ranges=list_make1_int(make_irange(0,prel->children_count-1, false));
307+
ranges=list_make1_irange(make_irange(0,prel->children_count-1, false));
308308
expr= (Expr*)eval_const_expressions(NULL,parse->jointree->quals);
309309
if (!expr)
310310
return;
@@ -322,11 +322,11 @@ handle_modification_query(Query *parse)
322322
/* If only one partition is affected then substitute parent table with partition */
323323
if (irange_list_length(ranges)==1)
324324
{
325-
IndexRangeirange=(IndexRange)linitial_oid(ranges);
326-
if (irange_lower(irange)==irange_upper(irange))
325+
IndexRangeirange=linitial_irange(ranges);
326+
if (irange.ir_lower==irange.ir_upper)
327327
{
328328
Oid*children= (Oid*)dsm_array_get_pointer(&prel->children);
329-
rte->relid=children[irange_lower(irange)];
329+
rte->relid=children[irange.ir_lower];
330330
rte->inh= false;
331331
}
332332
}
@@ -1143,12 +1143,13 @@ search_range_partition_eq(const Datum value,
11431143
}
11441144
else
11451145
{
1146-
IndexRangeirange=lfirst_irange(list_head(result.rangeset));
1146+
IndexRangeirange=linitial_irange(result.rangeset);
11471147

11481148
Assert(list_length(result.rangeset)==1);
1149-
Assert(irange_lower(irange)==irange_upper(irange));
1149+
Assert(irange.ir_lower==irange.ir_upper);
1150+
Assert(irange.ir_valid);
11501151

1151-
*part_idx=irange_lower(irange);
1152+
*part_idx=irange.ir_lower;
11521153
returnSEARCH_RANGEREL_FOUND;
11531154
}
11541155
}

‎src/rangeset.c

Lines changed: 31 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -13,58 +13,37 @@
1313
bool
1414
irange_intersects(IndexRangea,IndexRangeb)
1515
{
16-
return (irange_lower(a) <=irange_upper(b))&&
17-
(irange_lower(b) <=irange_upper(a));
16+
return (a.ir_lower <=b.ir_upper)&&
17+
(b.ir_lower <=a.ir_upper);
1818
}
1919

2020
/* Check if two ranges are conjuncted */
2121
bool
2222
irange_conjuncted(IndexRangea,IndexRangeb)
2323
{
24-
return (irange_lower(a)-1 <=irange_upper(b))&&
25-
(irange_lower(b)-1 <=irange_upper(a));
24+
return (a.ir_lower-1 <=b.ir_upper)&&
25+
(b.ir_lower-1 <=a.ir_upper);
2626
}
2727

2828
/* Make union of two ranges. They should have the same lossiness. */
2929
IndexRange
3030
irange_union(IndexRangea,IndexRangeb)
3131
{
32-
Assert(irange_is_lossy(a)==irange_is_lossy(b));
33-
returnmake_irange(Min(irange_lower(a),irange_lower(b)),
34-
Max(irange_upper(a),irange_upper(b)),
35-
irange_is_lossy(a));
32+
Assert(a.ir_lossy==b.ir_lossy);
33+
returnmake_irange(Min(a.ir_lower,b.ir_lower),
34+
Max(a.ir_upper,b.ir_upper),
35+
a.ir_lossy);
3636
}
3737

3838
/* Get intersection of two ranges */
3939
IndexRange
4040
irange_intersect(IndexRangea,IndexRangeb)
4141
{
42-
returnmake_irange(Max(irange_lower(a),irange_lower(b)),
43-
Min(irange_upper(a),irange_upper(b)),
44-
irange_is_lossy(a)||irange_is_lossy(b));
42+
returnmake_irange(Max(a.ir_lower,b.ir_lower),
43+
Min(a.ir_upper,b.ir_upper),
44+
a.ir_lossy||b.ir_lossy);
4545
}
4646

47-
#ifdefNOT_USED
48-
/* Print range list in debug purposes */
49-
staticchar*
50-
print_irange(List*l)
51-
{
52-
ListCell*c;
53-
StringInfoDatastr;
54-
55-
initStringInfo(&str);
56-
57-
foreach (c,l)
58-
{
59-
IndexRangeir=lfirst_irange(c);
60-
61-
appendStringInfo(&str,"[%d,%d]%c ",irange_lower(ir),irange_upper(ir),
62-
irange_is_lossy(ir) ?'l' :'e');
63-
}
64-
returnstr.data;
65-
}
66-
#endif
67-
6847
/*
6948
* Make union of two index rage lists.
7049
*/
@@ -74,20 +53,20 @@ irange_list_union(List *a, List *b)
7453
ListCell*ca,
7554
*cb;
7655
List*result=NIL;
77-
IndexRangecur=0;
56+
IndexRangecur=InvalidIndexRange;
7857
boolhave_cur= false;
7958

8059
ca=list_head(a);
8160
cb=list_head(b);
8261

8362
while (ca||cb)
8463
{
85-
IndexRangenext=0;
64+
IndexRangenext=InvalidIndexRange;
8665

8766
/* Fetch next range with lesser lower bound */
8867
if (ca&&cb)
8968
{
90-
if (irange_lower(lfirst_irange(ca)) <=irange_lower(lfirst_irange(cb)))
69+
if (lfirst_irange(ca).ir_lower <=lfirst_irange(cb).ir_lower)
9170
{
9271
next=lfirst_irange(ca);
9372
ca=lnext(ca);
@@ -122,25 +101,25 @@ irange_list_union(List *a, List *b)
122101
/*
123102
* Ranges are conjuncted, try to unify them.
124103
*/
125-
if (irange_is_lossy(next)==irange_is_lossy(cur))
104+
if (next.ir_lossy==cur.ir_lossy)
126105
{
127106
cur=irange_union(next,cur);
128107
}
129108
else
130109
{
131-
if (!irange_is_lossy(cur))
110+
if (!cur.ir_lossy)
132111
{
133112
result=lappend_irange(result,cur);
134-
cur=make_irange(irange_upper(cur)+1,
135-
irange_upper(next),
136-
irange_is_lossy(next));
113+
cur=make_irange(cur.ir_upper+1,
114+
next.ir_upper,
115+
next.ir_lossy);
137116
}
138117
else
139118
{
140-
result=lappend_irange(result,
141-
make_irange(irange_lower(cur),
142-
irange_lower(next)-1,
143-
irange_is_lossy(cur)));
119+
result=lappend_irange(result,
120+
make_irange(cur.ir_lower,
121+
next.ir_lower-1,
122+
cur.ir_lossy));
144123
cur=next;
145124
}
146125
}
@@ -196,10 +175,10 @@ irange_list_intersect(List *a, List *b)
196175
if (result!=NIL)
197176
{
198177
last=llast_irange(result);
199-
if (irange_conjuncted(last,intersect)&&
200-
irange_is_lossy(last)==irange_is_lossy(intersect))
178+
if (irange_conjuncted(last,intersect)&&
179+
last.ir_lossy==intersect.ir_lossy)
201180
{
202-
llast_int(result)=irange_union(last,intersect);
181+
llast(result)=alloc_irange(irange_union(last,intersect));
203182
}
204183
else
205184
{
@@ -217,9 +196,9 @@ irange_list_intersect(List *a, List *b)
217196
* which lists to fetch, since lower bound of next range is greater (or
218197
* equal) to upper bound of current.
219198
*/
220-
if (irange_upper(ra) <=irange_upper(rb))
199+
if (ra.ir_upper <=rb.ir_upper)
221200
ca=lnext(ca);
222-
if (irange_upper(ra) >=irange_upper(rb))
201+
if (ra.ir_upper >=rb.ir_upper)
223202
cb=lnext(cb);
224203
}
225204
returnresult;
@@ -235,7 +214,7 @@ irange_list_length(List *rangeset)
235214
foreach (lc,rangeset)
236215
{
237216
IndexRangeirange=lfirst_irange(lc);
238-
result+=irange_upper(irange)-irange_lower(irange)+1;
217+
result+=irange.ir_upper-irange.ir_lower+1;
239218
}
240219
returnresult;
241220
}
@@ -249,10 +228,10 @@ irange_list_find(List *rangeset, int index, bool *lossy)
249228
foreach (lc,rangeset)
250229
{
251230
IndexRangeirange=lfirst_irange(lc);
252-
if (index >=irange_lower(irange)&&index <=irange_upper(irange))
231+
if (index >=irange.ir_lower&&index <=irange.ir_upper)
253232
{
254233
if (lossy)
255-
*lossy=irange_is_lossy(irange) ? true : false;
234+
*lossy=irange.ir_lossy;
256235
return true;
257236
}
258237
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp