Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 4576208

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 parent 603b732 commit 4576208

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
BlockNumber rightblkno;
463463

464+
AttrNumber entryAttnum;
465+
464466
/* Entry options */
465-
OffsetNumber entryAttnum;
466467
Datum entryKey;
467468
RumNullCategory entryCategory;
468469
IndexTuple entry;
469470
bool isDelete;
470471

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

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

503504
/* rumdatapage.c */
504505
extern int rumCompareItemPointers(const ItemPointerData *a, const ItemPointerData *b);
505-
extern int compareRumKey(RumState * state, const RumKey * a, const RumKey * b);
506+
extern int compareRumKey(RumState * state, const AttrNumber attno,
507+
const RumKey * a, const RumKey * b);
506508
extern void convertIndexToKey(RumDataLeafItemIndex *src, RumKey *dst);
507509
extern Pointer rumPlaceToDataPageLeaf(Pointer ptr, OffsetNumber attnum,
508510
RumKey * item, ItemPointer prev, RumState * rumstate);
509511
extern Size rumCheckPlaceToDataPageLeaf(OffsetNumber attnum,
510512
RumKey * item, ItemPointer prev, RumState * rumstate, Size size);
511-
extern uint32 rumMergeItemPointers(RumState * rumstate, RumKey * dst,
512-
RumKey * a, uint32 na, RumKey * b, uint32 nb);
513+
extern uint32 rumMergeItemPointers(RumState * rumstate, AttrNumber attno,
514+
RumKey * dst,
515+
RumKey * a, uint32 na,
516+
RumKey * b, uint32 nb);
513517
extern void RumDataPageAddItem(Page page, void *data, OffsetNumber offset);
514518
extern void RumPageDeletePostingItem(Page page, OffsetNumber offset);
515519

@@ -579,6 +583,7 @@ typedef struct RumScanKeyData
579583
StrategyNumber strategy;
580584
int32 searchMode;
581585
OffsetNumber attnum;
586+
OffsetNumber attnumOrig;
582587

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

598606
typedef struct RumScanEntryData
@@ -605,6 +613,7 @@ typedef struct RumScanEntryData
605613
StrategyNumber strategy;
606614
int32 searchMode;
607615
OffsetNumber attnum;
616+
OffsetNumber attnumOrig;
608617

609618
/* Current page in posting tree */
610619
Buffer buffer;
@@ -613,6 +622,7 @@ typedef struct RumScanEntryData
613622
RumKey curRumKey;
614623

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

654-
RumScanKey keys; /* one per scan qualifier expr */
664+
RumScanKey *keys; /* one per scan qualifier expr */
655665
uint32 nkeys;
656666
int norderbys;
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
return res;
261261
}
262262

263+
static AttrNumber AttrNumberQsort = 0;
264+
263265
static int
264266
qsortCompareRumKey(const void *a, const void *b, void *arg)
265267
{
266-
return compareRumKey(arg, a, b);
268+
return compareRumKey(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, const RumKey * a, const RumKey * b)
320+
compareRumKey(RumState * state, const AttrNumber attno,
321+
const RumKey * a, const RumKey * 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, AttrNumber attno, RumKey * dst,
361362
RumKey * a, uint32 na, RumKey * b, uint32 nb)
362363
{
363364
RumKey *dptr = dst;
@@ -368,7 +369,7 @@ rumMergeItemPointers(RumState * rumstate, RumKey * dst,
368369
{
369370
int cmp;
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
RumKey k;
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
RumKey item;
977979
int totalCount = 0;
978980
int maxItemIndex = btree->curitem;
979-
int freespace;
980-
981981
static char lpageCopy[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)