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

Commit4576208

Browse files
committed
Fixes:
- correct use of compareRumKey - select with both restrions on addto and orderby columns - rework scankeys placement to easify filtering of addinfo in future
1 parent603b732 commit4576208

File tree

7 files changed

+217
-97
lines changed

7 files changed

+217
-97
lines changed

‎rum.h

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -461,15 +461,16 @@ typedef struct RumBtreeData
461461

462462
BlockNumberrightblkno;
463463

464+
AttrNumberentryAttnum;
465+
464466
/* Entry options */
465-
OffsetNumberentryAttnum;
466467
DatumentryKey;
467468
RumNullCategoryentryCategory;
468469
IndexTupleentry;
469470
boolisDelete;
470471

471472
/* Data (posting tree) options */
472-
RumKey*items;
473+
RumKey*items;
473474

474475
uint32nitem;
475476
uint32curitem;
@@ -502,14 +503,17 @@ extern void checkLeafDataPage(RumState * rumstate, AttrNumber attrnum, Page page
502503

503504
/* rumdatapage.c */
504505
externintrumCompareItemPointers(constItemPointerData*a,constItemPointerData*b);
505-
externintcompareRumKey(RumState*state,constRumKey*a,constRumKey*b);
506+
externintcompareRumKey(RumState*state,constAttrNumberattno,
507+
constRumKey*a,constRumKey*b);
506508
externvoidconvertIndexToKey(RumDataLeafItemIndex*src,RumKey*dst);
507509
externPointerrumPlaceToDataPageLeaf(Pointerptr,OffsetNumberattnum,
508510
RumKey*item,ItemPointerprev,RumState*rumstate);
509511
externSizerumCheckPlaceToDataPageLeaf(OffsetNumberattnum,
510512
RumKey*item,ItemPointerprev,RumState*rumstate,Sizesize);
511-
externuint32rumMergeItemPointers(RumState*rumstate,RumKey*dst,
512-
RumKey*a,uint32na,RumKey*b,uint32nb);
513+
externuint32rumMergeItemPointers(RumState*rumstate,AttrNumberattno,
514+
RumKey*dst,
515+
RumKey*a,uint32na,
516+
RumKey*b,uint32nb);
513517
externvoidRumDataPageAddItem(Pagepage,void*data,OffsetNumberoffset);
514518
externvoidRumPageDeletePostingItem(Pagepage,OffsetNumberoffset);
515519

@@ -579,6 +583,7 @@ typedef struct RumScanKeyData
579583
StrategyNumberstrategy;
580584
int32searchMode;
581585
OffsetNumberattnum;
586+
OffsetNumberattnumOrig;
582587

583588
/*
584589
* Match status data. curItem is the TID most recently tested (could be a
@@ -593,6 +598,9 @@ typedef struct RumScanKeyData
593598
boolrecheckCurItem;
594599
boolisFinished;
595600
boolorderBy;
601+
602+
RumScanKey*addInfoKeys;
603+
intaddInfoNKeys;
596604
}RumScanKeyData;
597605

598606
typedefstructRumScanEntryData
@@ -605,6 +613,7 @@ typedef struct RumScanEntryData
605613
StrategyNumberstrategy;
606614
int32searchMode;
607615
OffsetNumberattnum;
616+
OffsetNumberattnumOrig;
608617

609618
/* Current page in posting tree */
610619
Bufferbuffer;
@@ -613,6 +622,7 @@ typedef struct RumScanEntryData
613622
RumKeycurRumKey;
614623

615624
/* for a partial-match or full-scan query, we accumulate all TIDs here */
625+
boolforceUseBitmap;
616626
TIDBitmap*matchBitmap;
617627
TBMIterator*matchIterator;
618628
TBMIterateResult*matchResult;
@@ -651,7 +661,7 @@ typedef struct RumScanOpaqueData
651661
MemoryContextkeyCtx;/* used to hold key and entry data */
652662
RumStaterumstate;
653663

654-
RumScanKeykeys;/* one per scan qualifier expr */
664+
RumScanKey*keys;/* one per scan qualifier expr */
655665
uint32nkeys;
656666
intnorderbys;
657667

‎rumbtree.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ rumReFindLeafPage(RumBtree btree, RumBtreeStack * stack)
9999
* that requested leaf page is in this subtree only when requested
100100
* item pointer is less than item pointer previous to rightmost.
101101
*/
102-
if (compareRumKey(btree->rumstate,
102+
if (compareRumKey(btree->rumstate,btree->entryAttnum,
103103
&(((PostingItem*)RumDataPageGetItem(page,maxoff-1))->key),
104104
&btree->items[btree->curitem]) >=0)
105105
{

‎rumbulk.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,10 +260,12 @@ qsortCompareItemPointers(const void *a, const void *b)
260260
returnres;
261261
}
262262

263+
staticAttrNumberAttrNumberQsort=0;
264+
263265
staticint
264266
qsortCompareRumKey(constvoid*a,constvoid*b,void*arg)
265267
{
266-
returncompareRumKey(arg,a,b);
268+
returncompareRumKey(arg,AttrNumberQsort,a,b);
267269
}
268270

269271
/* Prepare to read out the rbtree contents using rumGetBAEntry */
@@ -301,6 +303,8 @@ rumGetBAEntry(BuildAccumulator *accum,
301303

302304
if (entry->count>1)
303305
{
306+
AttrNumberQsort=entry->attnum;
307+
304308
if (accum->rumstate->useAlternativeOrder&&
305309
entry->attnum==accum->rumstate->attrnAddToColumn)
306310
qsort_arg(list,entry->count,sizeof(RumKey),

‎rumdatapage.c

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -317,9 +317,10 @@ rumCompareItemPointers(const ItemPointerData *a, const ItemPointerData *b)
317317
}
318318

319319
int
320-
compareRumKey(RumState*state,constRumKey*a,constRumKey*b)
320+
compareRumKey(RumState*state,constAttrNumberattno,
321+
constRumKey*a,constRumKey*b)
321322
{
322-
if (state->useAlternativeOrder)
323+
if (state->useAlternativeOrder&&attno==state->attrnAddToColumn)
323324
{
324325
/* assume NULL is less than any real value */
325326
if (a->addInfoIsNull== false&&b->addInfoIsNull== false)
@@ -357,7 +358,7 @@ compareRumKey(RumState * state, const RumKey * a, const RumKey * b)
357358
* Caller is responsible that there is enough space at *dst.
358359
*/
359360
uint32
360-
rumMergeItemPointers(RumState*rumstate,RumKey*dst,
361+
rumMergeItemPointers(RumState*rumstate,AttrNumberattno,RumKey*dst,
361362
RumKey*a,uint32na,RumKey*b,uint32nb)
362363
{
363364
RumKey*dptr=dst;
@@ -368,7 +369,7 @@ rumMergeItemPointers(RumState * rumstate, RumKey * dst,
368369
{
369370
intcmp;
370371

371-
cmp=compareRumKey(rumstate,aptr,bptr);
372+
cmp=compareRumKey(rumstate,attno,aptr,bptr);
372373

373374
if (cmp>0)
374375
{
@@ -412,6 +413,7 @@ dataIsMoveRight(RumBtree btree, Page page)
412413
return false;
413414

414415
res=compareRumKey(btree->rumstate,
416+
btree->entryAttnum,
415417
&btree->items[btree->curitem],
416418
RumDataPageGetRightBound(page));
417419

@@ -465,6 +467,7 @@ dataLocateItem(RumBtree btree, RumBtreeStack * stack)
465467
else
466468
{
467469
result=compareRumKey(btree->rumstate,
470+
btree->entryAttnum,
468471
&btree->items[btree->curitem],
469472
&pitem->key);
470473
}
@@ -545,7 +548,8 @@ findInLeafPage(RumBtree btree, Page page, OffsetNumber *offset,
545548
RumKeyk;
546549

547550
convertIndexToKey(index,&k);
548-
cmp=compareRumKey(btree->rumstate,&k,
551+
cmp=compareRumKey(btree->rumstate,
552+
btree->entryAttnum,&k,
549553
&btree->items[btree->curitem]);
550554

551555
}
@@ -577,7 +581,7 @@ findInLeafPage(RumBtree btree, Page page, OffsetNumber *offset,
577581
ptr=rumDataPageLeafRead(ptr,btree->entryAttnum,&item,
578582
btree->rumstate);
579583

580-
cmp=compareRumKey(btree->rumstate,
584+
cmp=compareRumKey(btree->rumstate,btree->entryAttnum,
581585
&btree->items[btree->curitem],&item);
582586

583587
if (cmp==0)
@@ -888,8 +892,7 @@ dataPlaceToPage(RumBtree btree, Page page, OffsetNumber off)
888892

889893
ptr=rumPlaceToDataPageLeaf(ptr,btree->entryAttnum,
890894
&btree->items[j],&iptr,btree->rumstate);
891-
freespace=RumDataPageFreeSpacePre(page,ptr);
892-
Assert(freespace >=0);
895+
Assert(RumDataPageFreeSpacePre(page,ptr) >=0);
893896

894897
iptr=btree->items[j].iptr;
895898
btree->curitem++;
@@ -906,8 +909,7 @@ dataPlaceToPage(RumBtree btree, Page page, OffsetNumber off)
906909
ptr=rumPlaceToDataPageLeaf(ptr,btree->entryAttnum,&copy_item,
907910
&iptr,btree->rumstate);
908911

909-
freespace=RumDataPageFreeSpacePre(page,ptr);
910-
Assert(freespace >=0);
912+
Assert(RumDataPageFreeSpacePre(page,ptr) >=0);
911913

912914
iptr=copy_item.iptr;
913915
}
@@ -976,8 +978,6 @@ dataSplitPageLeaf(RumBtree btree, Buffer lbuf, Buffer rbuf,
976978
RumKeyitem;
977979
inttotalCount=0;
978980
intmaxItemIndex=btree->curitem;
979-
intfreespace;
980-
981981
staticcharlpageCopy[BLCKSZ];
982982

983983
dataPrepareData(btree,newlPage,off);
@@ -1084,8 +1084,7 @@ dataSplitPageLeaf(RumBtree btree, Buffer lbuf, Buffer rbuf,
10841084
ptr=rumPlaceToDataPageLeaf(ptr,btree->entryAttnum,
10851085
&btree->items[btree->curitem],
10861086
&prevIptr,btree->rumstate);
1087-
freespace=RumDataPageFreeSpacePre(page,ptr);
1088-
Assert(freespace >=0);
1087+
Assert(RumDataPageFreeSpacePre(page,ptr) >=0);
10891088

10901089
prevIptr=btree->items[btree->curitem].iptr;
10911090
btree->curitem++;
@@ -1100,8 +1099,7 @@ dataSplitPageLeaf(RumBtree btree, Buffer lbuf, Buffer rbuf,
11001099
curIptr=item;
11011100
ptr=rumPlaceToDataPageLeaf(ptr,btree->entryAttnum,&item,
11021101
&prevIptr,btree->rumstate);
1103-
freespace=RumDataPageFreeSpacePre(page,ptr);
1104-
Assert(freespace >=0);
1102+
Assert(RumDataPageFreeSpacePre(page,ptr) >=0);
11051103

11061104
prevIptr=item.iptr;
11071105

@@ -1115,8 +1113,7 @@ dataSplitPageLeaf(RumBtree btree, Buffer lbuf, Buffer rbuf,
11151113
curIptr=btree->items[btree->curitem];
11161114
ptr=rumPlaceToDataPageLeaf(ptr,btree->entryAttnum,
11171115
&btree->items[btree->curitem],&prevIptr,btree->rumstate);
1118-
freespace=RumDataPageFreeSpacePre(page,ptr);
1119-
Assert(freespace >=0);
1116+
Assert(RumDataPageFreeSpacePre(page,ptr) >=0);
11201117

11211118
prevIptr=btree->items[btree->curitem].iptr;
11221119
btree->curitem++;

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp