|
| 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 | + |