Commit 8bf358c1 authored by Tom Lane's avatar Tom Lane

Improve regression test coverage for src/backend/tsearch/spell.c.

In passing, throw an error if the AF count is too small, rather than
just silently discarding extra affix entries.

Note that the new regression test cases require installing the
updated src/backend/tsearch/dicts files.

Arthur Zakirov

Discussion: https://postgr.es/m/20180413113447.GA32474@zakirov.localdomain
parent d25c2ee9
FLAG long FLAG long
AF 7 AF 11
AF cZ #1 AF cZ #1
AF cL #2 AF cL #2
AF sGsJpUsS #3 AF sGsJpUsS #3
AF sSpB #4 AF sSpB #4
AF cZsS #5 AF cZsS #5
AF sScZs\ #6 AF sScZs\sE #6
AF sA #7 AF sA #7
AF CaCp #8
AF CcCp #9
AF sD #10
AF sB #11
COMPOUNDFLAG cZ COMPOUNDFLAG cZ
COMPOUNDBEGIN Ca
COMPOUNDMIDDLE Cb
COMPOUNDEND Cc
COMPOUNDPERMITFLAG Cp
ONLYINCOMPOUND cL ONLYINCOMPOUND cL
PFX pB Y 1 PFX pB Y 1
...@@ -28,7 +36,18 @@ SFX sS Y 1 ...@@ -28,7 +36,18 @@ SFX sS Y 1
SFX sS 0 S [^SXZHY] SFX sS 0 S [^SXZHY]
SFX sA Y 1 SFX sA Y 1
SFX sA Y IES [^AEIOU]Y SFX sA Y IES [^AEIOU]Y{1}
SFX sB Y 1
SFX sB 0 ED K{1}
# Affixes with compound flags
SFX s\ N 1 SFX s\ N 1
SFX s\ 0 Y/2 [^Y] SFX s\ 0 Y/2 [^Y]
SFX sE N 1
SFX sE 0 S/2 [^S]
# Check duplicate affixes
SFX sD N 1
SFX sD 0 S/2 [^S]
book/3 book/3
book/11
booking/4 booking/4
footballklubber footballklubber
foot/5 foot/5
...@@ -6,3 +7,5 @@ football/1 ...@@ -6,3 +7,5 @@ football/1
ball/6 ball/6
klubber/1 klubber/1
sky/7 sky/7
ex-/8
machina/9
\ No newline at end of file
...@@ -18,6 +18,14 @@ SFX 302 0 ING [^E] ...@@ -18,6 +18,14 @@ SFX 302 0 ING [^E]
SFX 303 Y 1 SFX 303 Y 1
SFX 303 0 S [^SXZHY] SFX 303 0 S [^SXZHY]
# Remove ED suffix from lexeme for base words with K ending
SFX 306 Y 1
SFX 306 0 ED K{1}
# Just add Y to lexeme for base words with Y ending
SFX 307 Y 1
SFX 307 Y 0 Y*
SFX 304 Y 1 SFX 304 Y 1
SFX 304 Y IES [^AEIOU]Y SFX 304 Y IES [^AEIOU]Y
......
book/302,301,202,303 book/302,301,202,303
book/306
booking/303,201 booking/303,201
footballklubber footballklubber
foot/101,303 foot/101,303
football/101 football/101
ball/303,101,305 ball/303,101,305
klubber/101 klubber/101
sky/304 sky/304,307
...@@ -1303,7 +1303,7 @@ NIImportOOAffixes(IspellDict *Conf, const char *filename) ...@@ -1303,7 +1303,7 @@ NIImportOOAffixes(IspellDict *Conf, const char *filename)
{ {
Conf->useFlagAliases = true; Conf->useFlagAliases = true;
naffix = atoi(sflag); naffix = atoi(sflag);
if (naffix == 0) if (naffix <= 0)
ereport(ERROR, ereport(ERROR,
(errcode(ERRCODE_CONFIG_FILE_ERROR), (errcode(ERRCODE_CONFIG_FILE_ERROR),
errmsg("invalid number of flag vector aliases"))); errmsg("invalid number of flag vector aliases")));
...@@ -1318,7 +1318,7 @@ NIImportOOAffixes(IspellDict *Conf, const char *filename) ...@@ -1318,7 +1318,7 @@ NIImportOOAffixes(IspellDict *Conf, const char *filename)
Conf->AffixData[curaffix] = VoidString; Conf->AffixData[curaffix] = VoidString;
curaffix++; curaffix++;
} }
/* Other lines is aliases */ /* Other lines are aliases */
else else
{ {
if (curaffix < naffix) if (curaffix < naffix)
...@@ -1326,6 +1326,11 @@ NIImportOOAffixes(IspellDict *Conf, const char *filename) ...@@ -1326,6 +1326,11 @@ NIImportOOAffixes(IspellDict *Conf, const char *filename)
Conf->AffixData[curaffix] = cpstrdup(Conf, sflag); Conf->AffixData[curaffix] = cpstrdup(Conf, sflag);
curaffix++; curaffix++;
} }
else
ereport(ERROR,
(errcode(ERRCODE_CONFIG_FILE_ERROR),
errmsg("number of aliases exceeds specified number %d",
naffix - 1)));
} }
goto nextline; goto nextline;
} }
......
...@@ -263,6 +263,12 @@ SELECT ts_lexize('hunspell_long', 'unbook'); ...@@ -263,6 +263,12 @@ SELECT ts_lexize('hunspell_long', 'unbook');
{book} {book}
(1 row) (1 row)
SELECT ts_lexize('hunspell_long', 'booked');
ts_lexize
-----------
{book}
(1 row)
SELECT ts_lexize('hunspell_long', 'footklubber'); SELECT ts_lexize('hunspell_long', 'footklubber');
ts_lexize ts_lexize
---------------- ----------------
...@@ -281,12 +287,24 @@ SELECT ts_lexize('hunspell_long', 'ballyklubber'); ...@@ -281,12 +287,24 @@ SELECT ts_lexize('hunspell_long', 'ballyklubber');
{ball,klubber} {ball,klubber}
(1 row) (1 row)
SELECT ts_lexize('hunspell_long', 'ballsklubber');
ts_lexize
----------------
{ball,klubber}
(1 row)
SELECT ts_lexize('hunspell_long', 'footballyklubber'); SELECT ts_lexize('hunspell_long', 'footballyklubber');
ts_lexize ts_lexize
--------------------- ---------------------
{foot,ball,klubber} {foot,ball,klubber}
(1 row) (1 row)
SELECT ts_lexize('hunspell_long', 'ex-machina');
ts_lexize
---------------
{ex-,machina}
(1 row)
-- Test ISpell dictionary with hunspell affix file with FLAG num parameter -- Test ISpell dictionary with hunspell affix file with FLAG num parameter
CREATE TEXT SEARCH DICTIONARY hunspell_num ( CREATE TEXT SEARCH DICTIONARY hunspell_num (
Template=ispell, Template=ispell,
...@@ -299,6 +317,12 @@ SELECT ts_lexize('hunspell_num', 'skies'); ...@@ -299,6 +317,12 @@ SELECT ts_lexize('hunspell_num', 'skies');
{sky} {sky}
(1 row) (1 row)
SELECT ts_lexize('hunspell_num', 'sk');
ts_lexize
-----------
{sky}
(1 row)
SELECT ts_lexize('hunspell_num', 'bookings'); SELECT ts_lexize('hunspell_num', 'bookings');
ts_lexize ts_lexize
---------------- ----------------
...@@ -359,6 +383,12 @@ SELECT ts_lexize('hunspell_num', 'unbook'); ...@@ -359,6 +383,12 @@ SELECT ts_lexize('hunspell_num', 'unbook');
{book} {book}
(1 row) (1 row)
SELECT ts_lexize('hunspell_num', 'booked');
ts_lexize
-----------
{book}
(1 row)
SELECT ts_lexize('hunspell_num', 'footklubber'); SELECT ts_lexize('hunspell_num', 'footklubber');
ts_lexize ts_lexize
---------------- ----------------
......
...@@ -66,11 +66,14 @@ SELECT ts_lexize('hunspell_long', 'rebook'); ...@@ -66,11 +66,14 @@ SELECT ts_lexize('hunspell_long', 'rebook');
SELECT ts_lexize('hunspell_long', 'unbookings'); SELECT ts_lexize('hunspell_long', 'unbookings');
SELECT ts_lexize('hunspell_long', 'unbooking'); SELECT ts_lexize('hunspell_long', 'unbooking');
SELECT ts_lexize('hunspell_long', 'unbook'); SELECT ts_lexize('hunspell_long', 'unbook');
SELECT ts_lexize('hunspell_long', 'booked');
SELECT ts_lexize('hunspell_long', 'footklubber'); SELECT ts_lexize('hunspell_long', 'footklubber');
SELECT ts_lexize('hunspell_long', 'footballklubber'); SELECT ts_lexize('hunspell_long', 'footballklubber');
SELECT ts_lexize('hunspell_long', 'ballyklubber'); SELECT ts_lexize('hunspell_long', 'ballyklubber');
SELECT ts_lexize('hunspell_long', 'ballsklubber');
SELECT ts_lexize('hunspell_long', 'footballyklubber'); SELECT ts_lexize('hunspell_long', 'footballyklubber');
SELECT ts_lexize('hunspell_long', 'ex-machina');
-- Test ISpell dictionary with hunspell affix file with FLAG num parameter -- Test ISpell dictionary with hunspell affix file with FLAG num parameter
CREATE TEXT SEARCH DICTIONARY hunspell_num ( CREATE TEXT SEARCH DICTIONARY hunspell_num (
...@@ -80,6 +83,7 @@ CREATE TEXT SEARCH DICTIONARY hunspell_num ( ...@@ -80,6 +83,7 @@ CREATE TEXT SEARCH DICTIONARY hunspell_num (
); );
SELECT ts_lexize('hunspell_num', 'skies'); SELECT ts_lexize('hunspell_num', 'skies');
SELECT ts_lexize('hunspell_num', 'sk');
SELECT ts_lexize('hunspell_num', 'bookings'); SELECT ts_lexize('hunspell_num', 'bookings');
SELECT ts_lexize('hunspell_num', 'booking'); SELECT ts_lexize('hunspell_num', 'booking');
SELECT ts_lexize('hunspell_num', 'foot'); SELECT ts_lexize('hunspell_num', 'foot');
...@@ -90,6 +94,7 @@ SELECT ts_lexize('hunspell_num', 'rebook'); ...@@ -90,6 +94,7 @@ SELECT ts_lexize('hunspell_num', 'rebook');
SELECT ts_lexize('hunspell_num', 'unbookings'); SELECT ts_lexize('hunspell_num', 'unbookings');
SELECT ts_lexize('hunspell_num', 'unbooking'); SELECT ts_lexize('hunspell_num', 'unbooking');
SELECT ts_lexize('hunspell_num', 'unbook'); SELECT ts_lexize('hunspell_num', 'unbook');
SELECT ts_lexize('hunspell_num', 'booked');
SELECT ts_lexize('hunspell_num', 'footklubber'); SELECT ts_lexize('hunspell_num', 'footklubber');
SELECT ts_lexize('hunspell_num', 'footballklubber'); SELECT ts_lexize('hunspell_num', 'footballklubber');
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment