From 0b9a23443283f9ffb17a39c25f74adefdb72cae1 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 5 May 2016 19:43:32 -0400 Subject: [PATCH] Rename tsvector delete() to ts_delete(), and filter() to ts_filter(). The similarity of the original names to SQL keywords seems like a bad idea. Rename them before we're stuck with 'em forever. In passing, minor code and docs cleanup. Discussion: <4875.1462210058@sss.pgh.pa.us> --- doc/src/sgml/func.sgml | 148 +++++++++++++------------- doc/src/sgml/textsearch.sgml | 3 +- src/backend/utils/adt/tsvector_op.c | 17 +-- src/include/catalog/catversion.h | 2 +- src/include/catalog/pg_proc.h | 12 +-- src/test/regress/expected/tstypes.out | 58 +++++----- src/test/regress/sql/tstypes.sql | 30 +++--- 7 files changed, 135 insertions(+), 135 deletions(-) diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index e1c3b48bf4..c8dd838d25 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -9177,6 +9177,18 @@ CREATE TYPE rainbow AS ENUM ('red', 'orange', 'yellow', 'green', 'blue', 'purple + + + + array_to_tsvector + + array_to_tsvector(text[]) + + tsvector + convert array of lexemes to tsvector + array_to_tsvector('{fat,cat,rat}'::text[]) + 'fat' 'cat' 'rat' + @@ -9267,10 +9279,10 @@ CREATE TYPE rainbow AS ENUM ('red', 'orange', 'yellow', 'green', 'blue', 'purple setweight setweight for specific lexeme(s) - setweight(vector tsvector, weight "char", lexemes "text"[]) + setweight(vector tsvector, weight "char", lexemes text[]) tsvector - assign weight to elements of vector that are listed in lexemes array + assign weight to elements of vector that are listed in lexemes setweight('fat:2,4 cat:3 rat:5B'::tsvector, 'A', '{cat,rat}') 'cat':3A 'fat':2,4 'rat':5A @@ -9286,79 +9298,6 @@ CREATE TYPE rainbow AS ENUM ('red', 'orange', 'yellow', 'green', 'blue', 'purple strip('fat:2,4 cat:3 rat:5A'::tsvector) 'cat' 'fat' 'rat' - - - - delete - delete lexeme(s) from tsvector - - delete(vector tsvector, lexeme text) - - tsvector - remove given lexeme from vector - delete('fat:2,4 cat:3 rat:5A'::tsvector, 'fat') - 'cat':3 'rat':5A - - - - - delete(vector tsvector, lexemes text[]) - - tsvector - remove any occurrence of lexemes in lexemes array from vector - delete('fat:2,4 cat:3 rat:5A'::tsvector, ARRAY['fat','rat']) - 'cat':3 - - - - - unnest - for tsvector - - unnest(tsvector, OUT lexeme text, OUT positions smallint[], OUT weights text) - - setof record - expand a tsvector to a set of rows - unnest('fat:2,4 cat:3 rat:5A'::tsvector) - (cat,{3},{D}) ... - - - - - tsvector_to_array - - tsvector_to_array(tsvector) - - text[] - convert tsvector to array of lexemes - tsvector_to_array('fat:2,4 cat:3 rat:5A'::tsvector) - {cat,fat,rat} - - - - - array_to_tsvector - - array_to_tsvector(text[]) - - tsvector - convert array of lexemes to tsvector - array_to_tsvector('{fat,cat,rat}'::text[]) - 'fat' 'cat' 'rat' - - - - - filter - for tsvector - - filter(vector tsvector, weights "char"[]) - - tsvector - Select only elements with given weights from vector - filter('fat:2,4 cat:3b rat:5A'::tsvector, '{a,b}') - 'cat':3B 'rat':5A - @@ -9383,6 +9322,40 @@ CREATE TYPE rainbow AS ENUM ('red', 'orange', 'yellow', 'green', 'blue', 'purple to_tsvector('english', 'The Fat Rats') 'fat':2 'rat':3 + + + + ts_delete + + ts_delete(vector tsvector, lexeme text) + + tsvector + remove given lexeme from vector + ts_delete('fat:2,4 cat:3 rat:5A'::tsvector, 'fat') + 'cat':3 'rat':5A + + + + + ts_delete(vector tsvector, lexemes text[]) + + tsvector + remove any occurrence of lexemes in lexemes from vector + ts_delete('fat:2,4 cat:3 rat:5A'::tsvector, ARRAY['fat','rat']) + 'cat':3 + + + + + ts_filter + + ts_filter(vector tsvector, weights "char"[]) + + tsvector + Select only elements with given weights from vector + ts_filter('fat:2,4 cat:3b rat:5A'::tsvector, '{a,b}') + 'cat':3B 'rat':5A + @@ -9459,6 +9432,18 @@ CREATE TYPE rainbow AS ENUM ('red', 'orange', 'yellow', 'green', 'blue', 'purple tsquery_phrase(to_tsquery('fat'), to_tsquery('cat'), 10) 'fat' <10> 'cat' + + + + tsvector_to_array + + tsvector_to_array(tsvector) + + text[] + convert tsvector to array of lexemes + tsvector_to_array('fat:2,4 cat:3 rat:5A'::tsvector) + {cat,fat,rat} + @@ -9483,6 +9468,19 @@ CREATE TYPE rainbow AS ENUM ('red', 'orange', 'yellow', 'green', 'blue', 'purple CREATE TRIGGER ... tsvector_update_trigger_column(tsvcol, configcol, title, body) + + + + unnest + for tsvector + + unnest(tsvector, OUT lexeme text, OUT positions smallint[], OUT weights text) + + setof record + expand a tsvector to a set of rows + unnest('fat:2,4 cat:3 rat:5A'::tsvector) + (cat,{3},{D}) ... + diff --git a/doc/src/sgml/textsearch.sgml b/doc/src/sgml/textsearch.sgml index 78eaf74867..bee1fbf174 100644 --- a/doc/src/sgml/textsearch.sgml +++ b/doc/src/sgml/textsearch.sgml @@ -1412,7 +1412,8 @@ FROM (SELECT id, body, q, ts_rank_cd(ti, q) AS rank - Full list of tsvector-related functions available in . + A full list of tsvector-related functions is available + in . diff --git a/src/backend/utils/adt/tsvector_op.c b/src/backend/utils/adt/tsvector_op.c index b138bf10ca..591e59cf99 100644 --- a/src/backend/utils/adt/tsvector_op.c +++ b/src/backend/utils/adt/tsvector_op.c @@ -506,7 +506,7 @@ tsvector_delete_by_indices(TSVector tsv, int *indices_to_delete, /* * Delete given lexeme from tsvector. - * Implementation of user-level delete(tsvector, text). + * Implementation of user-level ts_delete(tsvector, text). */ Datum tsvector_delete_str(PG_FUNCTION_ARGS) @@ -530,7 +530,7 @@ tsvector_delete_str(PG_FUNCTION_ARGS) /* * Delete given array of lexemes from tsvector. - * Implementation of user-level delete(tsvector, text[]). + * Implementation of user-level ts_delete(tsvector, text[]). */ Datum tsvector_delete_arr(PG_FUNCTION_ARGS) @@ -757,7 +757,7 @@ array_to_tsvector(PG_FUNCTION_ARGS) } /* - * Leave only elements with given weights from tsvector. + * ts_filter(): keep only lexemes with given weights in tsvector. */ Datum tsvector_filter(PG_FUNCTION_ARGS) @@ -771,15 +771,15 @@ tsvector_filter(PG_FUNCTION_ARGS) *dataout; Datum *dweights; bool *nulls; - int nweigths; + int nweights; int i, j; int cur_pos = 0; char mask = 0; deconstruct_array(weights, CHAROID, 1, true, 'c', - &dweights, &nulls, &nweigths); + &dweights, &nulls, &nweights); - for (i = 0; i < nweigths; i++) + for (i = 0; i < nweights; i++) { char char_weight; @@ -804,8 +804,9 @@ tsvector_filter(PG_FUNCTION_ARGS) mask = mask | 1; break; default: - /* internal error */ - elog(ERROR, "unrecognized weight: %c", char_weight); + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("unrecognized weight: \"%c\"", char_weight))); } } diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h index a5eba196e9..08867fb06a 100644 --- a/src/include/catalog/catversion.h +++ b/src/include/catalog/catversion.h @@ -53,6 +53,6 @@ */ /* yyyymmddN */ -#define CATALOG_VERSION_NO 201605031 +#define CATALOG_VERSION_NO 201605051 #endif diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h index 021ba500ab..d94943ba69 100644 --- a/src/include/catalog/pg_proc.h +++ b/src/include/catalog/pg_proc.h @@ -4539,18 +4539,18 @@ DESCR("set given weight for whole tsvector"); DATA(insert OID = 3320 ( setweight PGNSP PGUID 12 1 0 0 0 f f f f t f i s 3 0 3614 "3614 18 1009" _null_ _null_ _null_ _null_ _null_ tsvector_setweight_by_filter _null_ _null_ _null_ )); DESCR("set given weight for given lexemes"); DATA(insert OID = 3625 ( tsvector_concat PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 3614 "3614 3614" _null_ _null_ _null_ _null_ _null_ tsvector_concat _null_ _null_ _null_ )); -DATA(insert OID = 3321 ( delete PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 3614 "3614 25" _null_ _null_ _null_ _null_ _null_ tsvector_delete_str _null_ _null_ _null_ )); +DATA(insert OID = 3321 ( ts_delete PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 3614 "3614 25" _null_ _null_ _null_ _null_ _null_ tsvector_delete_str _null_ _null_ _null_ )); DESCR("delete lexeme"); -DATA(insert OID = 3323 ( delete PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 3614 "3614 1009" _null_ _null_ _null_ _null_ _null_ tsvector_delete_arr _null_ _null_ _null_ )); +DATA(insert OID = 3323 ( ts_delete PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 3614 "3614 1009" _null_ _null_ _null_ _null_ _null_ tsvector_delete_arr _null_ _null_ _null_ )); DESCR("delete given lexemes"); DATA(insert OID = 3322 ( unnest PGNSP PGUID 12 1 10 0 0 f f f f t t i s 1 0 2249 "3614" "{3614,25,1005,1009}" "{i,o,o,o}" "{tsvector,lexeme,positions,weights}" _null_ _null_ tsvector_unnest _null_ _null_ _null_ )); DESCR("expand tsvector to set of rows"); DATA(insert OID = 3326 ( tsvector_to_array PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 1009 "3614" _null_ _null_ _null_ _null_ _null_ tsvector_to_array _null_ _null_ _null_ )); -DESCR("convert to lexeme's array"); +DESCR("convert tsvector to array of lexemes"); DATA(insert OID = 3327 ( array_to_tsvector PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 3614 "1009" _null_ _null_ _null_ _null_ _null_ array_to_tsvector _null_ _null_ _null_ )); -DESCR("build tsvector from lexeme's array"); -DATA(insert OID = 3319 ( filter PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 3614 "3614 1002" _null_ _null_ _null_ _null_ _null_ tsvector_filter _null_ _null_ _null_ )); -DESCR("returns tsvector that contain only postings with given weights"); +DESCR("build tsvector from array of lexemes"); +DATA(insert OID = 3319 ( ts_filter PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 3614 "3614 1002" _null_ _null_ _null_ _null_ _null_ tsvector_filter _null_ _null_ _null_ )); +DESCR("delete lexemes that do not have one of the given weights"); DATA(insert OID = 3634 ( ts_match_vq PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "3614 3615" _null_ _null_ _null_ _null_ _null_ ts_match_vq _null_ _null_ _null_ )); DATA(insert OID = 3635 ( ts_match_qv PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "3615 3614" _null_ _null_ _null_ _null_ _null_ ts_match_qv _null_ _null_ _null_ )); diff --git a/src/test/regress/expected/tstypes.out b/src/test/regress/expected/tstypes.out index c8ca0624d4..64d6de6050 100644 --- a/src/test/regress/expected/tstypes.out +++ b/src/test/regress/expected/tstypes.out @@ -979,73 +979,73 @@ SELECT strip('base hidden rebel spaceship strike'::tsvector); 'base' 'hidden' 'rebel' 'spaceship' 'strike' (1 row) -SELECT delete(to_tsvector('english', 'Rebel spaceships, striking from a hidden base'), 'spaceship'); - delete +SELECT ts_delete(to_tsvector('english', 'Rebel spaceships, striking from a hidden base'), 'spaceship'); + ts_delete ------------------------------------------ 'base':7 'hidden':6 'rebel':1 'strike':3 (1 row) -SELECT delete('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector, 'base'); - delete +SELECT ts_delete('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector, 'base'); + ts_delete -------------------------------------------------------------- 'hidden':6 'rebel':1 'spaceship':2,33A,34B,35C,36 'strike':3 (1 row) -SELECT delete('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector, 'bas'); - delete +SELECT ts_delete('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector, 'bas'); + ts_delete ----------------------------------------------------------------------- 'base':7 'hidden':6 'rebel':1 'spaceship':2,33A,34B,35C,36 'strike':3 (1 row) -SELECT delete('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector, 'bases'); - delete +SELECT ts_delete('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector, 'bases'); + ts_delete ----------------------------------------------------------------------- 'base':7 'hidden':6 'rebel':1 'spaceship':2,33A,34B,35C,36 'strike':3 (1 row) -SELECT delete('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector, 'spaceship'); - delete +SELECT ts_delete('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector, 'spaceship'); + ts_delete ------------------------------------------ 'base':7 'hidden':6 'rebel':1 'strike':3 (1 row) -SELECT delete('base hidden rebel spaceship strike'::tsvector, 'spaceship'); - delete +SELECT ts_delete('base hidden rebel spaceship strike'::tsvector, 'spaceship'); + ts_delete ---------------------------------- 'base' 'hidden' 'rebel' 'strike' (1 row) -SELECT delete('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector, ARRAY['spaceship','rebel']); - delete +SELECT ts_delete('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector, ARRAY['spaceship','rebel']); + ts_delete -------------------------------- 'base':7 'hidden':6 'strike':3 (1 row) -SELECT delete('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector, ARRAY['spaceships','rebel']); - delete +SELECT ts_delete('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector, ARRAY['spaceships','rebel']); + ts_delete ------------------------------------------------------------- 'base':7 'hidden':6 'spaceship':2,33A,34B,35C,36 'strike':3 (1 row) -SELECT delete('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector, ARRAY['spaceshi','rebel']); - delete +SELECT ts_delete('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector, ARRAY['spaceshi','rebel']); + ts_delete ------------------------------------------------------------- 'base':7 'hidden':6 'spaceship':2,33A,34B,35C,36 'strike':3 (1 row) -SELECT delete('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector, ARRAY['spaceship','leya','rebel']); - delete +SELECT ts_delete('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector, ARRAY['spaceship','leya','rebel']); + ts_delete -------------------------------- 'base':7 'hidden':6 'strike':3 (1 row) -SELECT delete('base hidden rebel spaceship strike'::tsvector, ARRAY['spaceship','leya','rebel']); - delete +SELECT ts_delete('base hidden rebel spaceship strike'::tsvector, ARRAY['spaceship','leya','rebel']); + ts_delete -------------------------- 'base' 'hidden' 'strike' (1 row) -SELECT delete('base hidden rebel spaceship strike'::tsvector, ARRAY['spaceship','leya','rebel', NULL]); +SELECT ts_delete('base hidden rebel spaceship strike'::tsvector, ARRAY['spaceship','leya','rebel', NULL]); ERROR: lexeme array may not contain nulls SELECT unnest('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector); unnest @@ -1155,17 +1155,17 @@ SELECT setweight('a asd w:5,6,12B,13A zxc'::tsvector, 'c', '{a,zxc}'); SELECT setweight('a asd w:5,6,12B,13A zxc'::tsvector, 'c', ARRAY['a', 'zxc', NULL]); ERROR: lexeme array may not contain nulls -SELECT filter('base:7A empir:17 evil:15 first:11 galact:16 hidden:6A rebel:1A spaceship:2A strike:3A victori:12 won:9'::tsvector, '{a}'); - filter +SELECT ts_filter('base:7A empir:17 evil:15 first:11 galact:16 hidden:6A rebel:1A spaceship:2A strike:3A victori:12 won:9'::tsvector, '{a}'); + ts_filter ------------------------------------------------------------- 'base':7A 'hidden':6A 'rebel':1A 'spaceship':2A 'strike':3A (1 row) -SELECT filter('base hidden rebel spaceship strike'::tsvector, '{a}'); - filter --------- +SELECT ts_filter('base hidden rebel spaceship strike'::tsvector, '{a}'); + ts_filter +----------- (1 row) -SELECT filter('base hidden rebel spaceship strike'::tsvector, '{a,b,NULL}'); +SELECT ts_filter('base hidden rebel spaceship strike'::tsvector, '{a,b,NULL}'); ERROR: weight array may not contain nulls diff --git a/src/test/regress/sql/tstypes.sql b/src/test/regress/sql/tstypes.sql index ecc71c85e6..738ec824b9 100644 --- a/src/test/regress/sql/tstypes.sql +++ b/src/test/regress/sql/tstypes.sql @@ -193,19 +193,19 @@ SELECT strip('w:12B w:13* w:12,5,6 a:1,3* a:3 w asd:1dc asd'::tsvector); SELECT strip('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector); SELECT strip('base hidden rebel spaceship strike'::tsvector); -SELECT delete(to_tsvector('english', 'Rebel spaceships, striking from a hidden base'), 'spaceship'); -SELECT delete('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector, 'base'); -SELECT delete('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector, 'bas'); -SELECT delete('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector, 'bases'); -SELECT delete('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector, 'spaceship'); -SELECT delete('base hidden rebel spaceship strike'::tsvector, 'spaceship'); +SELECT ts_delete(to_tsvector('english', 'Rebel spaceships, striking from a hidden base'), 'spaceship'); +SELECT ts_delete('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector, 'base'); +SELECT ts_delete('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector, 'bas'); +SELECT ts_delete('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector, 'bases'); +SELECT ts_delete('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector, 'spaceship'); +SELECT ts_delete('base hidden rebel spaceship strike'::tsvector, 'spaceship'); -SELECT delete('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector, ARRAY['spaceship','rebel']); -SELECT delete('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector, ARRAY['spaceships','rebel']); -SELECT delete('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector, ARRAY['spaceshi','rebel']); -SELECT delete('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector, ARRAY['spaceship','leya','rebel']); -SELECT delete('base hidden rebel spaceship strike'::tsvector, ARRAY['spaceship','leya','rebel']); -SELECT delete('base hidden rebel spaceship strike'::tsvector, ARRAY['spaceship','leya','rebel', NULL]); +SELECT ts_delete('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector, ARRAY['spaceship','rebel']); +SELECT ts_delete('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector, ARRAY['spaceships','rebel']); +SELECT ts_delete('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector, ARRAY['spaceshi','rebel']); +SELECT ts_delete('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector, ARRAY['spaceship','leya','rebel']); +SELECT ts_delete('base hidden rebel spaceship strike'::tsvector, ARRAY['spaceship','leya','rebel']); +SELECT ts_delete('base hidden rebel spaceship strike'::tsvector, ARRAY['spaceship','leya','rebel', NULL]); SELECT unnest('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector); SELECT unnest('base hidden rebel spaceship strike'::tsvector); @@ -227,6 +227,6 @@ SELECT setweight('a:1,3A asd:1C w:5,6,12B,13A zxc:81,222A,567'::tsvector, 'c', ' SELECT setweight('a asd w:5,6,12B,13A zxc'::tsvector, 'c', '{a,zxc}'); SELECT setweight('a asd w:5,6,12B,13A zxc'::tsvector, 'c', ARRAY['a', 'zxc', NULL]); -SELECT filter('base:7A empir:17 evil:15 first:11 galact:16 hidden:6A rebel:1A spaceship:2A strike:3A victori:12 won:9'::tsvector, '{a}'); -SELECT filter('base hidden rebel spaceship strike'::tsvector, '{a}'); -SELECT filter('base hidden rebel spaceship strike'::tsvector, '{a,b,NULL}'); +SELECT ts_filter('base:7A empir:17 evil:15 first:11 galact:16 hidden:6A rebel:1A spaceship:2A strike:3A victori:12 won:9'::tsvector, '{a}'); +SELECT ts_filter('base hidden rebel spaceship strike'::tsvector, '{a}'); +SELECT ts_filter('base hidden rebel spaceship strike'::tsvector, '{a,b,NULL}');