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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy