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

Commitc6a1aa4

Browse files
committed
PGPRO-1175: Do not set so->isVoidRes for ordering keys
1 parent0dbe01d commitc6a1aa4

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 = rumrum_validaterum_hash ruminv timestamp orderby orderby_hash\
27+
altorderaltorder_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 opcJOIN pg_am amONam.oid= opcmethod
6-
WHERE amname='rum'
7-
ORDER BY opcname;
8-
93
CREATETABLEtest_rum( ttext, a tsvector );
104

115
CREATETRIGGERtsvectorupdate
126
BEFOREUPDATEOR INSERTON test_rum
137
FOR EACH ROW EXECUTE PROCEDURE tsvector_update_trigger('a','pg_catalog.english','t');
148
CREATEINDEXrumidxON test_rum USING rum (a rum_tsvector_ops);
159

16-
-- Access method properties
17-
SELECTa.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-
WHEREa.amname='rum'ORDER BYa.amname;
20-
21-
-- Index properties
22-
SELECTp.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-
SELECTp.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
CREATEINDEXfailed_rumidxON 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 opcJOIN pg_am amONam.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+
SELECTa.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+
WHEREa.amname='rum'ORDER BYa.amname;
19+
20+
-- Index properties
21+
SELECTp.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+
SELECTp.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+
DROPINDEX rumidx;
33+
34+
-- Check incorrect operator class
35+
CREATEOPERATOR CLASSrum_tsvector_norm_ops
36+
FOR TYPE tsvector USING rum
37+
AS
38+
OPERATOR1 @@ (tsvector, tsquery),
39+
OPERATOR2<=> (tsvector, rum_distance_query) FORORDER BYpg_catalog.float_ops,
40+
FUNCTION1 gin_cmp_tslexeme(text,text),
41+
FUNCTION2 rum_extract_tsvector(tsvector,internal,internal,internal,internal),
42+
FUNCTION3 rum_extract_tsquery(tsquery,internal,smallint,internal,internal,internal,internal),
43+
FUNCTION4 rum_tsquery_consistent(internal,smallint,tsvector,int,internal,internal,internal,internal),
44+
FUNCTION5 gin_cmp_prefix(text,text,smallint,internal),
45+
FUNCTION6 rum_tsvector_config(internal),
46+
FUNCTION7 rum_tsquery_pre_consistent(internal,smallint,tsvector,int,internal,internal,internal,internal),
47+
FUNCTION8 rum_tsquery_distance(internal,smallint,tsvector,int,internal,internal,internal,internal,internal),
48+
FUNCTION10 rum_ts_join_pos(internal, internal),
49+
STORAGEtext;
50+
51+
CREATEINDEXrum_norm_idxON 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)

[8]ページ先頭

©2009-2025 Movatter.jp