Skip to content

Commit c6a1aa4

Browse files
committed
PGPRO-1175: Do not set so->isVoidRes for ordering keys
1 parent 0dbe01d commit c6a1aa4

File tree

6 files changed

+189
-109
lines changed

6 files changed

+189
-109
lines changed

Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ RELATIVE_INCLUDES = $(addprefix src/, $(INCLUDES))
2323

2424
LDFLAGS_SL += $(filter -lm, $(LIBS))
2525

26-
REGRESS = rum rum_hash ruminv timestamp orderby orderby_hash altorder \
27-
altorder_hash limits \
26+
REGRESS = rum rum_validate rum_hash ruminv timestamp orderby orderby_hash \
27+
altorder altorder_hash limits \
2828
int2 int4 int8 float4 float8 money oid \
2929
time timetz date interval \
3030
macaddr inet cidr text varchar char bytea bit varbit \

expected/rum.out

Lines changed: 0 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -1,91 +1,9 @@
11
CREATE EXTENSION rum;
2-
-- First validate operator classes
3-
SELECT opcname, amvalidate(opc.oid)
4-
FROM pg_opclass opc JOIN pg_am am ON am.oid = opcmethod
5-
WHERE amname = 'rum'
6-
ORDER BY opcname;
7-
opcname | amvalidate
8-
-----------------------------------+------------
9-
rum_anyarray_addon_ops | t
10-
rum_anyarray_ops | t
11-
rum_bit_ops | t
12-
rum_bytea_ops | t
13-
rum_char_ops | t
14-
rum_cidr_ops | t
15-
rum_date_ops | t
16-
rum_float4_ops | t
17-
rum_float8_ops | t
18-
rum_inet_ops | t
19-
rum_int2_ops | t
20-
rum_int4_ops | t
21-
rum_int8_ops | t
22-
rum_interval_ops | t
23-
rum_macaddr_ops | t
24-
rum_money_ops | t
25-
rum_numeric_ops | t
26-
rum_oid_ops | t
27-
rum_text_ops | t
28-
rum_time_ops | t
29-
rum_timestamp_ops | t
30-
rum_timestamptz_ops | t
31-
rum_timetz_ops | t
32-
rum_tsquery_ops | t
33-
rum_tsvector_addon_ops | t
34-
rum_tsvector_hash_addon_ops | t
35-
rum_tsvector_hash_ops | t
36-
rum_tsvector_hash_timestamp_ops | t
37-
rum_tsvector_hash_timestamptz_ops | t
38-
rum_tsvector_ops | t
39-
rum_tsvector_timestamp_ops | t
40-
rum_tsvector_timestamptz_ops | t
41-
rum_varbit_ops | t
42-
rum_varchar_ops | t
43-
(34 rows)
44-
452
CREATE TABLE test_rum( t text, a tsvector );
463
CREATE TRIGGER tsvectorupdate
474
BEFORE UPDATE OR INSERT ON test_rum
485
FOR EACH ROW EXECUTE PROCEDURE tsvector_update_trigger('a', 'pg_catalog.english', 't');
496
CREATE INDEX rumidx ON test_rum USING rum (a rum_tsvector_ops);
50-
-- Access method properties
51-
SELECT a.amname, p.name, pg_indexam_has_property(a.oid,p.name)
52-
FROM pg_am a, unnest(array['can_order','can_unique','can_multi_col','can_exclude']) p(name)
53-
WHERE a.amname = 'rum' ORDER BY a.amname;
54-
amname | name | pg_indexam_has_property
55-
--------+---------------+-------------------------
56-
rum | can_order | f
57-
rum | can_unique | f
58-
rum | can_multi_col | t
59-
rum | can_exclude | t
60-
(4 rows)
61-
62-
-- Index properties
63-
SELECT p.name, pg_index_has_property('rumidx'::regclass,p.name)
64-
FROM unnest(array['clusterable','index_scan','bitmap_scan','backward_scan']) p(name);
65-
name | pg_index_has_property
66-
---------------+-----------------------
67-
clusterable | f
68-
index_scan | t
69-
bitmap_scan | t
70-
backward_scan | f
71-
(4 rows)
72-
73-
-- Index column properties
74-
SELECT p.name, pg_index_column_has_property('rumidx'::regclass,1,p.name)
75-
FROM unnest(array['asc','desc','nulls_first','nulls_last','orderable','distance_orderable','returnable','search_array','search_nulls']) p(name);
76-
name | pg_index_column_has_property
77-
--------------------+------------------------------
78-
asc | f
79-
desc | f
80-
nulls_first | f
81-
nulls_last | f
82-
orderable | f
83-
distance_orderable | t
84-
returnable | f
85-
search_array | f
86-
search_nulls | f
87-
(9 rows)
88-
897
\copy test_rum(t) from 'data/rum.data';
908
CREATE INDEX failed_rumidx ON test_rum USING rum (a rum_tsvector_addon_ops);
919
ERROR: additional information attribute "a" is not found in index

expected/rum_validate.out

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
--
2+
-- Various sanity tests
3+
--
4+
-- First validate operator classes
5+
SELECT opcname, amvalidate(opc.oid)
6+
FROM pg_opclass opc JOIN pg_am am ON am.oid = opcmethod
7+
WHERE amname = 'rum'
8+
ORDER BY opcname;
9+
opcname | amvalidate
10+
-----------------------------------+------------
11+
rum_anyarray_addon_ops | t
12+
rum_anyarray_ops | t
13+
rum_bit_ops | t
14+
rum_bytea_ops | t
15+
rum_char_ops | t
16+
rum_cidr_ops | t
17+
rum_date_ops | t
18+
rum_float4_ops | t
19+
rum_float8_ops | t
20+
rum_inet_ops | t
21+
rum_int2_ops | t
22+
rum_int4_ops | t
23+
rum_int8_ops | t
24+
rum_interval_ops | t
25+
rum_macaddr_ops | t
26+
rum_money_ops | t
27+
rum_numeric_ops | t
28+
rum_oid_ops | t
29+
rum_text_ops | t
30+
rum_time_ops | t
31+
rum_timestamp_ops | t
32+
rum_timestamptz_ops | t
33+
rum_timetz_ops | t
34+
rum_tsquery_ops | t
35+
rum_tsvector_addon_ops | t
36+
rum_tsvector_hash_addon_ops | t
37+
rum_tsvector_hash_ops | t
38+
rum_tsvector_hash_timestamp_ops | t
39+
rum_tsvector_hash_timestamptz_ops | t
40+
rum_tsvector_ops | t
41+
rum_tsvector_timestamp_ops | t
42+
rum_tsvector_timestamptz_ops | t
43+
rum_varbit_ops | t
44+
rum_varchar_ops | t
45+
(34 rows)
46+
47+
--
48+
-- Test access method and 'rumidx' index properties
49+
--
50+
-- Access method properties
51+
SELECT a.amname, p.name, pg_indexam_has_property(a.oid,p.name)
52+
FROM pg_am a, unnest(array['can_order','can_unique','can_multi_col','can_exclude']) p(name)
53+
WHERE a.amname = 'rum' ORDER BY a.amname;
54+
amname | name | pg_indexam_has_property
55+
--------+---------------+-------------------------
56+
rum | can_order | f
57+
rum | can_unique | f
58+
rum | can_multi_col | t
59+
rum | can_exclude | t
60+
(4 rows)
61+
62+
-- Index properties
63+
SELECT p.name, pg_index_has_property('rumidx'::regclass,p.name)
64+
FROM unnest(array['clusterable','index_scan','bitmap_scan','backward_scan']) p(name);
65+
name | pg_index_has_property
66+
---------------+-----------------------
67+
clusterable | f
68+
index_scan | t
69+
bitmap_scan | t
70+
backward_scan | f
71+
(4 rows)
72+
73+
-- Index column properties
74+
SELECT p.name, pg_index_column_has_property('rumidx'::regclass,1,p.name)
75+
FROM unnest(array['asc','desc','nulls_first','nulls_last','orderable','distance_orderable','returnable','search_array','search_nulls']) p(name);
76+
name | pg_index_column_has_property
77+
--------------------+------------------------------
78+
asc | f
79+
desc | f
80+
nulls_first | f
81+
nulls_last | f
82+
orderable | f
83+
distance_orderable | t
84+
returnable | f
85+
search_array | f
86+
search_nulls | f
87+
(9 rows)
88+
89+
--
90+
-- Check incorrect operator class
91+
--
92+
DROP INDEX rumidx;
93+
-- Check incorrect operator class
94+
CREATE OPERATOR CLASS rum_tsvector_norm_ops
95+
FOR TYPE tsvector USING rum
96+
AS
97+
OPERATOR 1 @@ (tsvector, tsquery),
98+
OPERATOR 2 <=> (tsvector, rum_distance_query) FOR ORDER BY pg_catalog.float_ops,
99+
FUNCTION 1 gin_cmp_tslexeme(text, text),
100+
FUNCTION 2 rum_extract_tsvector(tsvector,internal,internal,internal,internal),
101+
FUNCTION 3 rum_extract_tsquery(tsquery,internal,smallint,internal,internal,internal,internal),
102+
FUNCTION 4 rum_tsquery_consistent(internal,smallint,tsvector,int,internal,internal,internal,internal),
103+
FUNCTION 5 gin_cmp_prefix(text,text,smallint,internal),
104+
FUNCTION 6 rum_tsvector_config(internal),
105+
FUNCTION 7 rum_tsquery_pre_consistent(internal,smallint,tsvector,int,internal,internal,internal,internal),
106+
FUNCTION 8 rum_tsquery_distance(internal,smallint,tsvector,int,internal,internal,internal,internal,internal),
107+
FUNCTION 10 rum_ts_join_pos(internal, internal),
108+
STORAGE text;
109+
CREATE INDEX rum_norm_idx ON test_rum USING rum(a rum_tsvector_norm_ops);
110+
SET enable_seqscan=off;
111+
SET enable_bitmapscan=off;
112+
SET enable_indexscan=on;
113+
SELECT a
114+
FROM test_rum
115+
WHERE a @@ to_tsquery('pg_catalog.english', 'bar')
116+
ORDER BY a <=> (to_tsquery('pg_catalog.english', 'bar'),0)
117+
a
118+
------------------------------
119+
'bar':2,8 'foo':1,3,6 'qq':7
120+
(1 row)
121+

sql/rum.sql

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,12 @@
11
CREATE EXTENSION rum;
22

3-
-- First validate operator classes
4-
SELECT opcname, amvalidate(opc.oid)
5-
FROM pg_opclass opc JOIN pg_am am ON am.oid = opcmethod
6-
WHERE amname = 'rum'
7-
ORDER BY opcname;
8-
93
CREATE TABLE test_rum( t text, a tsvector );
104

115
CREATE TRIGGER tsvectorupdate
126
BEFORE UPDATE OR INSERT ON test_rum
137
FOR EACH ROW EXECUTE PROCEDURE tsvector_update_trigger('a', 'pg_catalog.english', 't');
148
CREATE INDEX rumidx ON test_rum USING rum (a rum_tsvector_ops);
159

16-
-- Access method properties
17-
SELECT a.amname, p.name, pg_indexam_has_property(a.oid,p.name)
18-
FROM pg_am a, unnest(array['can_order','can_unique','can_multi_col','can_exclude']) p(name)
19-
WHERE a.amname = 'rum' ORDER BY a.amname;
20-
21-
-- Index properties
22-
SELECT p.name, pg_index_has_property('rumidx'::regclass,p.name)
23-
FROM unnest(array['clusterable','index_scan','bitmap_scan','backward_scan']) p(name);
24-
25-
-- Index column properties
26-
SELECT p.name, pg_index_column_has_property('rumidx'::regclass,1,p.name)
27-
FROM unnest(array['asc','desc','nulls_first','nulls_last','orderable','distance_orderable','returnable','search_array','search_nulls']) p(name);
28-
2910
\copy test_rum(t) from 'data/rum.data';
3011

3112
CREATE INDEX failed_rumidx ON test_rum USING rum (a rum_tsvector_addon_ops);

sql/rum_validate.sql

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
--
2+
-- Various sanity tests
3+
--
4+
5+
-- First validate operator classes
6+
SELECT opcname, amvalidate(opc.oid)
7+
FROM pg_opclass opc JOIN pg_am am ON am.oid = opcmethod
8+
WHERE amname = 'rum'
9+
ORDER BY opcname;
10+
11+
--
12+
-- Test access method and 'rumidx' index properties
13+
--
14+
15+
-- Access method properties
16+
SELECT a.amname, p.name, pg_indexam_has_property(a.oid,p.name)
17+
FROM pg_am a, unnest(array['can_order','can_unique','can_multi_col','can_exclude']) p(name)
18+
WHERE a.amname = 'rum' ORDER BY a.amname;
19+
20+
-- Index properties
21+
SELECT p.name, pg_index_has_property('rumidx'::regclass,p.name)
22+
FROM unnest(array['clusterable','index_scan','bitmap_scan','backward_scan']) p(name);
23+
24+
-- Index column properties
25+
SELECT p.name, pg_index_column_has_property('rumidx'::regclass,1,p.name)
26+
FROM unnest(array['asc','desc','nulls_first','nulls_last','orderable','distance_orderable','returnable','search_array','search_nulls']) p(name);
27+
28+
--
29+
-- Check incorrect operator class
30+
--
31+
32+
DROP INDEX rumidx;
33+
34+
-- Check incorrect operator class
35+
CREATE OPERATOR CLASS rum_tsvector_norm_ops
36+
FOR TYPE tsvector USING rum
37+
AS
38+
OPERATOR 1 @@ (tsvector, tsquery),
39+
OPERATOR 2 <=> (tsvector, rum_distance_query) FOR ORDER BY pg_catalog.float_ops,
40+
FUNCTION 1 gin_cmp_tslexeme(text, text),
41+
FUNCTION 2 rum_extract_tsvector(tsvector,internal,internal,internal,internal),
42+
FUNCTION 3 rum_extract_tsquery(tsquery,internal,smallint,internal,internal,internal,internal),
43+
FUNCTION 4 rum_tsquery_consistent(internal,smallint,tsvector,int,internal,internal,internal,internal),
44+
FUNCTION 5 gin_cmp_prefix(text,text,smallint,internal),
45+
FUNCTION 6 rum_tsvector_config(internal),
46+
FUNCTION 7 rum_tsquery_pre_consistent(internal,smallint,tsvector,int,internal,internal,internal,internal),
47+
FUNCTION 8 rum_tsquery_distance(internal,smallint,tsvector,int,internal,internal,internal,internal,internal),
48+
FUNCTION 10 rum_ts_join_pos(internal, internal),
49+
STORAGE text;
50+
51+
CREATE INDEX rum_norm_idx ON test_rum USING rum(a rum_tsvector_norm_ops);
52+
53+
SET enable_seqscan=off;
54+
SET enable_bitmapscan=off;
55+
SET enable_indexscan=on;
56+
57+
SELECT a
58+
FROM test_rum
59+
WHERE a @@ to_tsquery('pg_catalog.english', 'bar')
60+
ORDER BY a <=> (to_tsquery('pg_catalog.english', 'bar'),0)

src/rumscan.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -383,7 +383,9 @@ initScanKey(RumScanOpaque so, ScanKey skey, bool *hasPartialMatch)
383383
*/
384384
if (skey->sk_flags & SK_ISNULL)
385385
{
386-
so->isVoidRes = true;
386+
/* Do not set isVoidRes for order keys */
387+
if ((skey->sk_flags & SK_ORDER_BY) == 0)
388+
so->isVoidRes = true;
387389
return;
388390
}
389391

@@ -415,7 +417,9 @@ initScanKey(RumScanOpaque so, ScanKey skey, bool *hasPartialMatch)
415417
{
416418
if (searchMode == GIN_SEARCH_MODE_DEFAULT)
417419
{
418-
so->isVoidRes = true;
420+
/* Do not set isVoidRes for order keys */
421+
if ((skey->sk_flags & SK_ORDER_BY) == 0)
422+
so->isVoidRes = true;
419423
return;
420424
}
421425
nQueryValues = 0; /* ensure sane value */
@@ -612,11 +616,7 @@ rumNewScanKey(IndexScanDesc scan)
612616
}
613617

614618
for (i = 0; i < scan->numberOfOrderBys; i++)
615-
{
616619
initScanKey(so, &scan->orderByData[i], NULL);
617-
if (so->isVoidRes)
618-
break;
619-
}
620620

621621
/*
622622
* Fill markAddInfo if possible

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