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
pull/32/head
Tom Lane 8 years ago
parent d25c2ee9c0
commit 8bf358c18e
  1. 25
      src/backend/tsearch/dicts/hunspell_sample_long.affix
  2. 3
      src/backend/tsearch/dicts/hunspell_sample_long.dict
  3. 8
      src/backend/tsearch/dicts/hunspell_sample_num.affix
  4. 3
      src/backend/tsearch/dicts/hunspell_sample_num.dict
  5. 9
      src/backend/tsearch/spell.c
  6. 30
      src/test/regress/expected/tsdicts.out
  7. 5
      src/test/regress/sql/tsdicts.sql

@ -1,15 +1,23 @@
FLAG long
AF 7
AF 11
AF cZ #1
AF cL #2
AF sGsJpUsS #3
AF sSpB #4
AF cZsS #5
AF sScZs\ #6
AF sScZs\sE #6
AF sA #7
AF CaCp #8
AF CcCp #9
AF sD #10
AF sB #11
COMPOUNDFLAG cZ
COMPOUNDBEGIN Ca
COMPOUNDMIDDLE Cb
COMPOUNDEND Cc
COMPOUNDPERMITFLAG Cp
ONLYINCOMPOUND cL
PFX pB Y 1
@ -28,7 +36,18 @@ SFX sS Y 1
SFX sS 0 S [^SXZHY]
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\ 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]

@ -1,4 +1,5 @@
book/3
book/11
booking/4
footballklubber
foot/5
@ -6,3 +7,5 @@ football/1
ball/6
klubber/1
sky/7
ex-/8
machina/9

@ -18,6 +18,14 @@ SFX 302 0 ING [^E]
SFX 303 Y 1
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 IES [^AEIOU]Y

@ -1,8 +1,9 @@
book/302,301,202,303
book/306
booking/303,201
footballklubber
foot/101,303
football/101
ball/303,101,305
klubber/101
sky/304
sky/304,307

@ -1303,7 +1303,7 @@ NIImportOOAffixes(IspellDict *Conf, const char *filename)
{
Conf->useFlagAliases = true;
naffix = atoi(sflag);
if (naffix == 0)
if (naffix <= 0)
ereport(ERROR,
(errcode(ERRCODE_CONFIG_FILE_ERROR),
errmsg("invalid number of flag vector aliases")));
@ -1318,7 +1318,7 @@ NIImportOOAffixes(IspellDict *Conf, const char *filename)
Conf->AffixData[curaffix] = VoidString;
curaffix++;
}
/* Other lines is aliases */
/* Other lines are aliases */
else
{
if (curaffix < naffix)
@ -1326,6 +1326,11 @@ NIImportOOAffixes(IspellDict *Conf, const char *filename)
Conf->AffixData[curaffix] = cpstrdup(Conf, sflag);
curaffix++;
}
else
ereport(ERROR,
(errcode(ERRCODE_CONFIG_FILE_ERROR),
errmsg("number of aliases exceeds specified number %d",
naffix - 1)));
}
goto nextline;
}

@ -263,6 +263,12 @@ SELECT ts_lexize('hunspell_long', 'unbook');
{book}
(1 row)
SELECT ts_lexize('hunspell_long', 'booked');
ts_lexize
-----------
{book}
(1 row)
SELECT ts_lexize('hunspell_long', 'footklubber');
ts_lexize
----------------
@ -281,12 +287,24 @@ SELECT ts_lexize('hunspell_long', 'ballyklubber');
{ball,klubber}
(1 row)
SELECT ts_lexize('hunspell_long', 'ballsklubber');
ts_lexize
----------------
{ball,klubber}
(1 row)
SELECT ts_lexize('hunspell_long', 'footballyklubber');
ts_lexize
---------------------
{foot,ball,klubber}
(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
CREATE TEXT SEARCH DICTIONARY hunspell_num (
Template=ispell,
@ -299,6 +317,12 @@ SELECT ts_lexize('hunspell_num', 'skies');
{sky}
(1 row)
SELECT ts_lexize('hunspell_num', 'sk');
ts_lexize
-----------
{sky}
(1 row)
SELECT ts_lexize('hunspell_num', 'bookings');
ts_lexize
----------------
@ -359,6 +383,12 @@ SELECT ts_lexize('hunspell_num', 'unbook');
{book}
(1 row)
SELECT ts_lexize('hunspell_num', 'booked');
ts_lexize
-----------
{book}
(1 row)
SELECT ts_lexize('hunspell_num', 'footklubber');
ts_lexize
----------------

@ -66,11 +66,14 @@ SELECT ts_lexize('hunspell_long', 'rebook');
SELECT ts_lexize('hunspell_long', 'unbookings');
SELECT ts_lexize('hunspell_long', 'unbooking');
SELECT ts_lexize('hunspell_long', 'unbook');
SELECT ts_lexize('hunspell_long', 'booked');
SELECT ts_lexize('hunspell_long', 'footklubber');
SELECT ts_lexize('hunspell_long', 'footballklubber');
SELECT ts_lexize('hunspell_long', 'ballyklubber');
SELECT ts_lexize('hunspell_long', 'ballsklubber');
SELECT ts_lexize('hunspell_long', 'footballyklubber');
SELECT ts_lexize('hunspell_long', 'ex-machina');
-- Test ISpell dictionary with hunspell affix file with FLAG num parameter
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', 'sk');
SELECT ts_lexize('hunspell_num', 'bookings');
SELECT ts_lexize('hunspell_num', 'booking');
SELECT ts_lexize('hunspell_num', 'foot');
@ -90,6 +94,7 @@ SELECT ts_lexize('hunspell_num', 'rebook');
SELECT ts_lexize('hunspell_num', 'unbookings');
SELECT ts_lexize('hunspell_num', 'unbooking');
SELECT ts_lexize('hunspell_num', 'unbook');
SELECT ts_lexize('hunspell_num', 'booked');
SELECT ts_lexize('hunspell_num', 'footklubber');
SELECT ts_lexize('hunspell_num', 'footballklubber');

Loading…
Cancel
Save