Skip to content

Commit 455ed7d

Browse files
author
Aleksandr Parfenov
committed
FTS: Add ability to mix comma-separated syntax with other constructions
1 parent 5721101 commit 455ed7d

File tree

5 files changed

+65
-40
lines changed

5 files changed

+65
-40
lines changed

src/backend/parser/gram.y

Lines changed: 9 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -589,9 +589,9 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
589589

590590
%type <ival> dictionary_map_set_expr_operator
591591
%type <dmapelem> dictionary_map_dict dictionary_map_command_expr_paren
592-
dictionary_map_set_expr dictionary_map_case
592+
dictionary_config dictionary_map_case
593593
dictionary_map_action opt_dictionary_map_case_else
594-
dictionary_config dictionary_config_comma
594+
dictionary_config_comma
595595

596596
%type <node> merge_when_clause opt_and_condition
597597
%type <list> merge_when_list
@@ -10456,23 +10456,6 @@ dictionary_config_comma:
1045610456
}
1045710457
;
1045810458

10459-
dictionary_config:
10460-
dictionary_map_set_expr { $$ = $1; }
10461-
| dictionary_map_dict ',' dictionary_config_comma
10462-
{
10463-
DictMapExprElem *n = makeNode(DictMapExprElem);
10464-
DictMapElem *r = makeNode(DictMapElem);
10465-
10466-
n->left = $1;
10467-
n->oper = TSMAP_OP_COMMA;
10468-
n->right = $3;
10469-
10470-
r->kind = DICT_MAP_EXPRESSION;
10471-
r->data = n;
10472-
$$ = r;
10473-
}
10474-
;
10475-
1047610459
dictionary_map_action:
1047710460
KEEP
1047810461
{
@@ -10481,16 +10464,16 @@ dictionary_map_action:
1048110464
n->data = NULL;
1048210465
$$ = n;
1048310466
}
10484-
| dictionary_map_set_expr { $$ = $1; }
10467+
| dictionary_config { $$ = $1; }
1048510468
;
1048610469

1048710470
opt_dictionary_map_case_else:
10488-
ELSE dictionary_map_set_expr { $$ = $2; }
10471+
ELSE dictionary_config { $$ = $2; }
1048910472
| { $$ = NULL; }
1049010473
;
1049110474

1049210475
dictionary_map_case:
10493-
CASE dictionary_map_set_expr WHEN opt_dictionary_map_no MATCH THEN dictionary_map_action opt_dictionary_map_case_else END_P
10476+
CASE dictionary_config WHEN opt_dictionary_map_no MATCH THEN dictionary_map_action opt_dictionary_map_case_else END_P
1049410477
{
1049510478
DictMapCase *n = makeNode(DictMapCase);
1049610479
DictMapElem *r = makeNode(DictMapElem);
@@ -10513,9 +10496,9 @@ dictionary_map_set_expr_operator:
1051310496
| MAP { $$ = TSMAP_OP_MAP; }
1051410497
;
1051510498

10516-
dictionary_map_set_expr:
10499+
dictionary_config:
1051710500
dictionary_map_command_expr_paren { $$ = $1; }
10518-
| dictionary_map_set_expr dictionary_map_set_expr_operator dictionary_map_command_expr_paren
10501+
| dictionary_config dictionary_map_set_expr_operator dictionary_map_command_expr_paren
1051910502
{
1052010503
DictMapExprElem *n = makeNode(DictMapExprElem);
1052110504
DictMapElem *r = makeNode(DictMapElem);
@@ -10531,9 +10514,9 @@ dictionary_map_set_expr:
1053110514
;
1053210515

1053310516
dictionary_map_command_expr_paren:
10534-
'(' dictionary_map_set_expr ')' { $$ = $2; }
10535-
| dictionary_map_dict { $$ = $1; }
10517+
'(' dictionary_config ')' { $$ = $2; }
1053610518
| dictionary_map_case { $$ = $1; }
10519+
| dictionary_config_comma { $$ = $1; }
1053710520
;
1053810521

1053910522
dictionary_map_dict:

src/backend/tsearch/ts_configmap.c

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -150,8 +150,18 @@ static void
150150
TSMapPrintExpression(TSMapExpression *expression, StringInfo result)
151151
{
152152

153-
if (expression->left)
154-
TSMapPrintElement(expression->left, result);
153+
Assert(expression->left);
154+
if (expression->left->type == TSMAP_EXPRESSION &&
155+
expression->left->value.objectExpression->operator != expression->operator)
156+
{
157+
appendStringInfoChar(result, '(');
158+
}
159+
TSMapPrintElement(expression->left, result);
160+
if (expression->left->type == TSMAP_EXPRESSION &&
161+
expression->left->value.objectExpression->operator != expression->operator)
162+
{
163+
appendStringInfoChar(result, ')');
164+
}
155165

156166
switch (expression->operator)
157167
{
@@ -178,8 +188,18 @@ TSMapPrintExpression(TSMapExpression *expression, StringInfo result)
178188
break;
179189
}
180190

181-
if (expression->right)
182-
TSMapPrintElement(expression->right, result);
191+
Assert(expression->right);
192+
if (expression->right->type == TSMAP_EXPRESSION &&
193+
expression->right->value.objectExpression->operator != expression->operator)
194+
{
195+
appendStringInfoChar(result, '(');
196+
}
197+
TSMapPrintElement(expression->right, result);
198+
if (expression->right->type == TSMAP_EXPRESSION &&
199+
expression->right->value.objectExpression->operator != expression->operator)
200+
{
201+
appendStringInfoChar(result, ')');
202+
}
183203
}
184204

185205
/*

src/include/catalog/pg_ts_config_map.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,11 @@ CATALOG(pg_ts_config_map,3603) BKI_WITHOUT_OIDS
4141
{
4242
Oid mapcfg; /* OID of configuration owning this entry */
4343
int32 maptokentype; /* token type from parser */
44+
45+
/*
46+
* mapdicts is the only one variable-length field so it is safe to use
47+
* it directly, without hiding from C interface.
48+
*/
4449
jsonb mapdicts; /* dictionary map Jsonb representation */
4550
} FormData_pg_ts_config_map;
4651

src/test/regress/expected/tsdicts.out

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -679,13 +679,6 @@ SELECT to_tsvector('thesaurus_tst', 'Booking tickets is looking like a booking a
679679
'card':3,10 'invit':2,9 'like':6 'look':5 'order':1,8
680680
(1 row)
681681

682-
ALTER TEXT SEARCH CONFIGURATION thesaurus_tst ALTER MAPPING FOR asciiword WITH english_stem UNION simple;
683-
SELECT to_tsvector('thesaurus_tst', 'The Mysterious Rings of Supernova 1987A');
684-
to_tsvector
685-
--------------------------------------------------------------------------------------
686-
'1987a':6 'mysteri':2 'mysterious':2 'of':4 'ring':3 'rings':3 'supernova':5 'the':1
687-
(1 row)
688-
689682
ALTER TEXT SEARCH CONFIGURATION thesaurus_tst ALTER MAPPING FOR asciiword WITH CASE
690683
thesaurus WHEN MATCH THEN KEEP ELSE english_stem
691684
END;
@@ -826,6 +819,23 @@ SELECT to_tsvector('thesaurus_tst', 'one two books');
826819
'12':1 'book':2
827820
(1 row)
828821

822+
CREATE TEXT SEARCH CONFIGURATION operators_tst (
823+
COPY=thesaurus_tst
824+
);
825+
ALTER TEXT SEARCH CONFIGURATION operators_tst ALTER MAPPING FOR asciiword WITH english_stem UNION simple;
826+
SELECT to_tsvector('operators_tst', 'The Mysterious Rings of Supernova 1987A');
827+
to_tsvector
828+
--------------------------------------------------------------------------------------
829+
'1987a':6 'mysteri':2 'mysterious':2 'of':4 'ring':3 'rings':3 'supernova':5 'the':1
830+
(1 row)
831+
832+
ALTER TEXT SEARCH CONFIGURATION operators_tst ALTER MAPPING FOR asciiword WITH english_stem UNION (synonym, simple);
833+
SELECT to_tsvector('operators_tst', 'The Mysterious Rings of Supernova 1987A Postgres');
834+
to_tsvector
835+
-----------------------------------------------------------------------------------------------------------
836+
'1987a':6 'mysteri':2 'mysterious':2 'of':4 'pgsql':7 'postgr':7 'ring':3 'rings':3 'supernova':5 'the':1
837+
(1 row)
838+
829839
-- invalid: non-lowercase quoted identifiers
830840
CREATE TEXT SEARCH DICTIONARY tsdict_case
831841
(

src/test/regress/sql/tsdicts.sql

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -240,9 +240,6 @@ SELECT to_tsvector('thesaurus_tst', 'one postgres one two one two three one');
240240
SELECT to_tsvector('thesaurus_tst', 'Supernovae star is very new star and usually called supernovae (abbreviation SN)');
241241
SELECT to_tsvector('thesaurus_tst', 'Booking tickets is looking like a booking a tickets');
242242

243-
ALTER TEXT SEARCH CONFIGURATION thesaurus_tst ALTER MAPPING FOR asciiword WITH english_stem UNION simple;
244-
SELECT to_tsvector('thesaurus_tst', 'The Mysterious Rings of Supernova 1987A');
245-
246243
ALTER TEXT SEARCH CONFIGURATION thesaurus_tst ALTER MAPPING FOR asciiword WITH CASE
247244
thesaurus WHEN MATCH THEN KEEP ELSE english_stem
248245
END;
@@ -277,6 +274,16 @@ SELECT to_tsvector('thesaurus_tst', 'one two');
277274
SELECT to_tsvector('thesaurus_tst', 'one two three');
278275
SELECT to_tsvector('thesaurus_tst', 'one two books');
279276

277+
CREATE TEXT SEARCH CONFIGURATION operators_tst (
278+
COPY=thesaurus_tst
279+
);
280+
281+
ALTER TEXT SEARCH CONFIGURATION operators_tst ALTER MAPPING FOR asciiword WITH english_stem UNION simple;
282+
SELECT to_tsvector('operators_tst', 'The Mysterious Rings of Supernova 1987A');
283+
284+
ALTER TEXT SEARCH CONFIGURATION operators_tst ALTER MAPPING FOR asciiword WITH english_stem UNION (synonym, simple);
285+
SELECT to_tsvector('operators_tst', 'The Mysterious Rings of Supernova 1987A Postgres');
286+
280287
-- invalid: non-lowercase quoted identifiers
281288
CREATE TEXT SEARCH DICTIONARY tsdict_case
282289
(

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