From 9f204600aff90a950ec0b6bef7b8ad19e0cada59 Mon Sep 17 00:00:00 2001 From: Hanefi Onaldi Date: Mon, 21 Mar 2022 22:01:53 +0300 Subject: [PATCH] Allow all possible option types for text search objects (#5838) --- .../deparser/deparse_text_search.c | 30 +------- src/test/regress/expected/text_search.out | 77 +++++++++++++++++++ src/test/regress/sql/text_search.sql | 56 ++++++++++++++ 3 files changed, 137 insertions(+), 26 deletions(-) diff --git a/src/backend/distributed/deparser/deparse_text_search.c b/src/backend/distributed/deparser/deparse_text_search.c index aaa29163b..43d162678 100644 --- a/src/backend/distributed/deparser/deparse_text_search.c +++ b/src/backend/distributed/deparser/deparse_text_search.c @@ -12,6 +12,7 @@ #include "postgres.h" #include "catalog/namespace.h" +#include "commands/defrem.h" #include "utils/builtins.h" #include "distributed/citus_ruleutils.h" @@ -78,8 +79,6 @@ DeparseCreateTextSearchDictionaryStmt(Node *node) * AppendDefElemList is a helper to append a comma separated list of definitions to a * define statement. * - * Currently only supports String and TypeName entries. Will error on others. - * * The extra objectName parameter is used to create meaningful error messages. */ static void @@ -109,32 +108,11 @@ AppendDefElemList(StringInfo buf, List *defelems, char *objectName) continue; } - /* extract identifier from defelem */ - const char *identifier = NULL; - switch (nodeTag(defelem->arg)) - { - case T_String: - { - identifier = quote_identifier(strVal(defelem->arg)); - break; - } - - case T_TypeName: - { - TypeName *typeName = castNode(TypeName, defelem->arg); - identifier = NameListToQuotedString(typeName->names); - break; - } - - default: - { - ereport(ERROR, (errmsg("unexpected argument during deparsing of " - "TEXT SEARCH %s definition", objectName))); - } - } + /* extract value from defelem */ + const char *value = defGetString(defelem); /* stringify */ - appendStringInfo(buf, "%s = %s", defelem->defname, identifier); + appendStringInfo(buf, "%s = %s", defelem->defname, value); } } diff --git a/src/test/regress/expected/text_search.out b/src/test/regress/expected/text_search.out index c0eb92f88..7fe47105f 100644 --- a/src/test/regress/expected/text_search.out +++ b/src/test/regress/expected/text_search.out @@ -619,6 +619,83 @@ $$); ERROR: text search dictionary "my_turkish_dict" does not exist (3 rows) +-- test different templates that are used in dictionaries +CREATE TEXT SEARCH DICTIONARY simple_dict ( + TEMPLATE = pg_catalog.simple, + STOPWORDS = english, + accept = false +); +SELECT COUNT(DISTINCT result)=1 FROM run_command_on_all_nodes($$ + SELECT ROW(dictname, dictnamespace::regnamespace, dictowner::regrole, tmplname, dictinitoption) + FROM pg_ts_dict d JOIN pg_ts_template t ON ( d.dicttemplate = t.oid ) + WHERE dictname = 'simple_dict'; +$$); + ?column? +--------------------------------------------------------------------- + t +(1 row) + +CREATE TEXT SEARCH DICTIONARY synonym_dict ( + template=synonym, + synonyms='synonym_sample', + casesensitive=1 +); +SELECT COUNT(DISTINCT result)=1 FROM run_command_on_all_nodes($$ + SELECT ROW(dictname, dictnamespace::regnamespace, dictowner::regrole, tmplname, dictinitoption) + FROM pg_ts_dict d JOIN pg_ts_template t ON ( d.dicttemplate = t.oid ) + WHERE dictname = 'synonym_dict'; +$$); + ?column? +--------------------------------------------------------------------- + t +(1 row) + +CREATE TEXT SEARCH DICTIONARY thesaurus_dict ( + TEMPLATE = thesaurus, + DictFile = thesaurus_sample, + Dictionary = pg_catalog.english_stem +); +SELECT COUNT(DISTINCT result)=1 FROM run_command_on_all_nodes($$ + SELECT ROW(dictname, dictnamespace::regnamespace, dictowner::regrole, tmplname, dictinitoption) + FROM pg_ts_dict d JOIN pg_ts_template t ON ( d.dicttemplate = t.oid ) + WHERE dictname = 'thesaurus_dict'; +$$); + ?column? +--------------------------------------------------------------------- + t +(1 row) + +CREATE TEXT SEARCH DICTIONARY ispell_dict ( + TEMPLATE = ispell, + DictFile = ispell_sample, + AffFile = ispell_sample, + Stopwords = english +); +SELECT COUNT(DISTINCT result)=1 FROM run_command_on_all_nodes($$ + SELECT ROW(dictname, dictnamespace::regnamespace, dictowner::regrole, tmplname, dictinitoption) + FROM pg_ts_dict d JOIN pg_ts_template t ON ( d.dicttemplate = t.oid ) + WHERE dictname = 'ispell_dict'; +$$); + ?column? +--------------------------------------------------------------------- + t +(1 row) + +CREATE TEXT SEARCH DICTIONARY snowball_dict ( + TEMPLATE = snowball, + Language = english, + StopWords = english +); +SELECT COUNT(DISTINCT result)=1 FROM run_command_on_all_nodes($$ + SELECT ROW(dictname, dictnamespace::regnamespace, dictowner::regrole, tmplname, dictinitoption) + FROM pg_ts_dict d JOIN pg_ts_template t ON ( d.dicttemplate = t.oid ) + WHERE dictname = 'snowball_dict'; +$$); + ?column? +--------------------------------------------------------------------- + t +(1 row) + SET client_min_messages TO 'warning'; DROP SCHEMA text_search, text_search2, "Text Search Requiring Quote's" CASCADE; DROP ROLE text_search_owner; diff --git a/src/test/regress/sql/text_search.sql b/src/test/regress/sql/text_search.sql index 996c708be..ffc9236f8 100644 --- a/src/test/regress/sql/text_search.sql +++ b/src/test/regress/sql/text_search.sql @@ -345,6 +345,62 @@ SELECT result FROM run_command_on_all_nodes($$ SELECT 'my_turkish_dict'::regdictionary; $$); +-- test different templates that are used in dictionaries +CREATE TEXT SEARCH DICTIONARY simple_dict ( + TEMPLATE = pg_catalog.simple, + STOPWORDS = english, + accept = false +); +SELECT COUNT(DISTINCT result)=1 FROM run_command_on_all_nodes($$ + SELECT ROW(dictname, dictnamespace::regnamespace, dictowner::regrole, tmplname, dictinitoption) + FROM pg_ts_dict d JOIN pg_ts_template t ON ( d.dicttemplate = t.oid ) + WHERE dictname = 'simple_dict'; +$$); + +CREATE TEXT SEARCH DICTIONARY synonym_dict ( + template=synonym, + synonyms='synonym_sample', + casesensitive=1 +); +SELECT COUNT(DISTINCT result)=1 FROM run_command_on_all_nodes($$ + SELECT ROW(dictname, dictnamespace::regnamespace, dictowner::regrole, tmplname, dictinitoption) + FROM pg_ts_dict d JOIN pg_ts_template t ON ( d.dicttemplate = t.oid ) + WHERE dictname = 'synonym_dict'; +$$); + +CREATE TEXT SEARCH DICTIONARY thesaurus_dict ( + TEMPLATE = thesaurus, + DictFile = thesaurus_sample, + Dictionary = pg_catalog.english_stem +); +SELECT COUNT(DISTINCT result)=1 FROM run_command_on_all_nodes($$ + SELECT ROW(dictname, dictnamespace::regnamespace, dictowner::regrole, tmplname, dictinitoption) + FROM pg_ts_dict d JOIN pg_ts_template t ON ( d.dicttemplate = t.oid ) + WHERE dictname = 'thesaurus_dict'; +$$); + +CREATE TEXT SEARCH DICTIONARY ispell_dict ( + TEMPLATE = ispell, + DictFile = ispell_sample, + AffFile = ispell_sample, + Stopwords = english +); +SELECT COUNT(DISTINCT result)=1 FROM run_command_on_all_nodes($$ + SELECT ROW(dictname, dictnamespace::regnamespace, dictowner::regrole, tmplname, dictinitoption) + FROM pg_ts_dict d JOIN pg_ts_template t ON ( d.dicttemplate = t.oid ) + WHERE dictname = 'ispell_dict'; +$$); + +CREATE TEXT SEARCH DICTIONARY snowball_dict ( + TEMPLATE = snowball, + Language = english, + StopWords = english +); +SELECT COUNT(DISTINCT result)=1 FROM run_command_on_all_nodes($$ + SELECT ROW(dictname, dictnamespace::regnamespace, dictowner::regrole, tmplname, dictinitoption) + FROM pg_ts_dict d JOIN pg_ts_template t ON ( d.dicttemplate = t.oid ) + WHERE dictname = 'snowball_dict'; +$$); SET client_min_messages TO 'warning'; DROP SCHEMA text_search, text_search2, "Text Search Requiring Quote's" CASCADE;