Skip to content

Commit dfbffd8

Browse files
committed
Add filtering feature. Fix bug introduced 8972219cd708f4ef654379efc86162ed7e10ef99
1 parent 9b69c4b commit dfbffd8

File tree

4 files changed

+137
-24
lines changed

4 files changed

+137
-24
lines changed

expected/orderby.out

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,3 +277,83 @@ SELECT id, d FROM tsts WHERE t @@ 'wr&qh' AND d >= '2016-05-16 14:21:25' ORDER
277277
496 | Sun May 22 11:21:22.326724 2016
278278
(8 rows)
279279

280+
SET enable_bitmapscan=OFF;
281+
EXPLAIN (costs off)
282+
SELECT id, d FROM tsts WHERE t @@ 'wr&qh' AND d <= '2016-05-16 14:21:25' ORDER BY d;
283+
QUERY PLAN
284+
----------------------------------------------------------------------------------------------------------------------------
285+
Sort
286+
Sort Key: d
287+
-> Index Scan using tsts_idx on tsts
288+
Index Cond: ((t @@ '''wr'' & ''qh'''::tsquery) AND (d <= 'Mon May 16 14:21:25 2016'::timestamp without time zone))
289+
(4 rows)
290+
291+
SELECT id, d FROM tsts WHERE t @@ 'wr&qh' AND d <= '2016-05-16 14:21:25' ORDER BY d;
292+
id | d
293+
-----+---------------------------------
294+
16 | Mon May 02 11:21:22.326724 2016
295+
39 | Tue May 03 10:21:22.326724 2016
296+
71 | Wed May 04 18:21:22.326724 2016
297+
135 | Sat May 07 10:21:22.326724 2016
298+
168 | Sun May 08 19:21:22.326724 2016
299+
232 | Wed May 11 11:21:22.326724 2016
300+
252 | Thu May 12 07:21:22.326724 2016
301+
354 | Mon May 16 13:21:22.326724 2016
302+
355 | Mon May 16 14:21:22.326724 2016
303+
(9 rows)
304+
305+
EXPLAIN (costs off)
306+
SELECT id, d FROM tsts WHERE t @@ 'wr&qh' AND d >= '2016-05-16 14:21:25' ORDER BY d;
307+
QUERY PLAN
308+
----------------------------------------------------------------------------------------------------------------------------
309+
Sort
310+
Sort Key: d
311+
-> Index Scan using tsts_idx on tsts
312+
Index Cond: ((t @@ '''wr'' & ''qh'''::tsquery) AND (d >= 'Mon May 16 14:21:25 2016'::timestamp without time zone))
313+
(4 rows)
314+
315+
SELECT id, d FROM tsts WHERE t @@ 'wr&qh' AND d >= '2016-05-16 14:21:25' ORDER BY d;
316+
id | d
317+
-----+---------------------------------
318+
371 | Tue May 17 06:21:22.326724 2016
319+
406 | Wed May 18 17:21:22.326724 2016
320+
415 | Thu May 19 02:21:22.326724 2016
321+
428 | Thu May 19 15:21:22.326724 2016
322+
457 | Fri May 20 20:21:22.326724 2016
323+
458 | Fri May 20 21:21:22.326724 2016
324+
484 | Sat May 21 23:21:22.326724 2016
325+
496 | Sun May 22 11:21:22.326724 2016
326+
(8 rows)
327+
328+
SELECT id, d FROM tsts WHERE t @@ 'wr&qh' AND d <= '2016-05-16 14:21:25' ORDER BY d ASC LIMIT 3;
329+
id | d
330+
----+---------------------------------
331+
16 | Mon May 02 11:21:22.326724 2016
332+
39 | Tue May 03 10:21:22.326724 2016
333+
71 | Wed May 04 18:21:22.326724 2016
334+
(3 rows)
335+
336+
SELECT id, d FROM tsts WHERE t @@ 'wr&qh' AND d <= '2016-05-16 14:21:25' ORDER BY d DESC LIMIT 3;
337+
id | d
338+
-----+---------------------------------
339+
355 | Mon May 16 14:21:22.326724 2016
340+
354 | Mon May 16 13:21:22.326724 2016
341+
252 | Thu May 12 07:21:22.326724 2016
342+
(3 rows)
343+
344+
SELECT id, d FROM tsts WHERE t @@ 'wr&qh' AND d >= '2016-05-16 14:21:25' ORDER BY d ASC LIMIT 3;
345+
id | d
346+
-----+---------------------------------
347+
371 | Tue May 17 06:21:22.326724 2016
348+
406 | Wed May 18 17:21:22.326724 2016
349+
415 | Thu May 19 02:21:22.326724 2016
350+
(3 rows)
351+
352+
SELECT id, d FROM tsts WHERE t @@ 'wr&qh' AND d >= '2016-05-16 14:21:25' ORDER BY d DESC LIMIT 3;
353+
id | d
354+
-----+---------------------------------
355+
496 | Sun May 22 11:21:22.326724 2016
356+
484 | Sat May 21 23:21:22.326724 2016
357+
458 | Fri May 20 21:21:22.326724 2016
358+
(3 rows)
359+

rumget.c

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,10 +106,39 @@ callConsistentFn(RumState * rumstate, RumScanKey key)
106106
* long-lived memory context and, somehow, freeed. Seems, the
107107
* last is real problem
108108
*/
109-
key->outerAddInfo = key->addInfo[0];
109+
key->outerAddInfo = key->addInfo[i];
110110
break;
111111
}
112112
}
113+
114+
if (key->addInfoKeys)
115+
{
116+
if (key->outerAddInfoIsNull)
117+
res = false; /* assume strict operator */
118+
119+
for(i = 0; res && i < key->addInfoNKeys; i++)
120+
{
121+
RumScanKey subkey = key->addInfoKeys[i];
122+
int j;
123+
124+
for(j=0; res && j<subkey->nentries; j++)
125+
{
126+
RumScanEntry scanSubEntry = subkey->scanEntry[j];
127+
int cmp =
128+
DatumGetInt32(FunctionCall4Coll(
129+
&rumstate->comparePartialFn[scanSubEntry->attnumOrig - 1],
130+
rumstate->supportCollation[scanSubEntry->attnumOrig - 1],
131+
scanSubEntry->queryKey,
132+
key->outerAddInfo,
133+
UInt16GetDatum(scanSubEntry->strategy),
134+
PointerGetDatum(scanSubEntry->extra_data)
135+
));
136+
137+
if (cmp != 0)
138+
res = false;
139+
}
140+
}
141+
}
113142
}
114143

115144
return res;
@@ -1631,7 +1660,7 @@ scanPage(RumState * rumstate, RumScanEntry entry, RumKey *item, Page page,
16311660
else
16321661
cmp = rumCompareItemPointers(&index->iptr, &item->iptr);
16331662

1634-
if (cmp < 0 || (cmp <= 0 && equalOk))
1663+
if (cmp < 0 || (cmp <= 0 && !equalOk))
16351664
{
16361665
ptr = RumDataPageGetData(page) + index->pageOffset;
16371666
first = index->offsetNumer;
@@ -1986,6 +2015,7 @@ scanGetItemFast(IndexScanDesc scan, RumKey *advancePast,
19862015
key->addInfoIsNull[j] = true;
19872016
}
19882017
}
2018+
19892019
if (!callConsistentFn(&so->rumstate, key))
19902020
{
19912021
consistentResult = false;

rumscan.c

Lines changed: 10 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,7 @@ initScanKey(RumScanOpaque so, ScanKey skey, bool *hasNullQuery)
307307
Datum *queryValues;
308308
int32 nQueryValues = 0;
309309
bool *partial_matches = NULL;
310-
Pointer *extra_data = NULL;
310+
Pointer *extra_data = NULL;
311311
bool *nullFlags = NULL;
312312
int32 searchMode = GIN_SEARCH_MODE_DEFAULT;
313313

@@ -550,13 +550,15 @@ rumNewScanKey(IndexScanDesc scan)
550550
/*
551551
* Fill markAddInfo if possible
552552
*/
553-
for (i = 0; so->rumstate.useAlternativeOrder && i < so->nkeys; i++)
553+
for (i = 0; i < so->nkeys; i++)
554554
{
555555
RumScanKey key = so->keys[i];
556556

557-
if (key->orderBy && key->useAddToColumn &&
557+
if (so->rumstate.useAlternativeOrder &&
558+
key->orderBy && key->useAddToColumn &&
558559
key->attnum == so->rumstate.attrnAddToColumn)
559560
fillMarkAddInfo(so, key);
561+
560562
if (key->orderBy == false)
561563
{
562564
if (key->attnumOrig == so->rumstate.attrnAddToColumn)
@@ -570,27 +572,14 @@ rumNewScanKey(IndexScanDesc scan)
570572
(hasAddOnFilter & haofHasAddOnRestriction))
571573
{
572574
RumScanKey *keys = palloc(sizeof(*keys) * so->nkeys);
573-
int nkeys = 0;
574-
#ifdef ADD_INFO_FILTER
575+
int nkeys = 0,
576+
j;
575577
RumScanKey addToKey = NULL;
576-
#endif
577578

578579
for(i=0; i<so->nkeys; i++)
579580
{
580581
RumScanKey key = so->keys[i];
581582

582-
#ifndef ADD_INFO_FILTER
583-
if (key->orderBy == false &&
584-
key->attnumOrig == so->rumstate.attrnAddToColumn)
585-
{
586-
int j;
587-
588-
for(j = 0; j<key->nentries; j++)
589-
key->scanEntry[j]->forceUseBitmap = true;
590-
591-
keys[nkeys++] = key;
592-
}
593-
#else
594583
if (key->orderBy == false &&
595584
key->attnumOrig == so->rumstate.attrnOrderByColumn)
596585
{
@@ -605,11 +594,10 @@ rumNewScanKey(IndexScanDesc scan)
605594
}
606595

607596
if (addToKey == NULL)
608-
elog(ERROR,"could not find add_to column");
609-
610-
addToKey->addInfoKeys[ addToKey->addInfoNKeys++ ] = key;
597+
keys[nkeys++] = key;
598+
else
599+
addToKey->addInfoKeys[ addToKey->addInfoNKeys++ ] = key;
611600
}
612-
#endif
613601
else
614602
{
615603
keys[nkeys++] = key;

sql/orderby.sql

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,3 +61,18 @@ SELECT id, d FROM tsts WHERE t @@ 'wr&qh' AND d <= '2016-05-16 14:21:25' ORDER
6161
EXPLAIN (costs off)
6262
SELECT id, d FROM tsts WHERE t @@ 'wr&qh' AND d >= '2016-05-16 14:21:25' ORDER BY d;
6363
SELECT id, d FROM tsts WHERE t @@ 'wr&qh' AND d >= '2016-05-16 14:21:25' ORDER BY d;
64+
65+
SET enable_bitmapscan=OFF;
66+
67+
EXPLAIN (costs off)
68+
SELECT id, d FROM tsts WHERE t @@ 'wr&qh' AND d <= '2016-05-16 14:21:25' ORDER BY d;
69+
SELECT id, d FROM tsts WHERE t @@ 'wr&qh' AND d <= '2016-05-16 14:21:25' ORDER BY d;
70+
EXPLAIN (costs off)
71+
SELECT id, d FROM tsts WHERE t @@ 'wr&qh' AND d >= '2016-05-16 14:21:25' ORDER BY d;
72+
SELECT id, d FROM tsts WHERE t @@ 'wr&qh' AND d >= '2016-05-16 14:21:25' ORDER BY d;
73+
74+
75+
SELECT id, d FROM tsts WHERE t @@ 'wr&qh' AND d <= '2016-05-16 14:21:25' ORDER BY d ASC LIMIT 3;
76+
SELECT id, d FROM tsts WHERE t @@ 'wr&qh' AND d <= '2016-05-16 14:21:25' ORDER BY d DESC LIMIT 3;
77+
SELECT id, d FROM tsts WHERE t @@ 'wr&qh' AND d >= '2016-05-16 14:21:25' ORDER BY d ASC LIMIT 3;
78+
SELECT id, d FROM tsts WHERE t @@ 'wr&qh' AND d >= '2016-05-16 14:21:25' ORDER BY d DESC LIMIT 3;

0 commit comments

Comments
 (0)