Fix bogus affix-merging code.
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 12 Apr 2018 22:39:51 +0000 (18:39 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 12 Apr 2018 22:39:51 +0000 (18:39 -0400)
NISortAffixes() compared successive compound affixes incorrectly,
thus possibly failing to merge identical affixes, or (less likely)
merging ones that shouldn't be merged.  The user-visible effects
of this are unclear, to me anyway.

Per bug #15150 from Alexander Lakhin.  It's been broken for a long time,
so back-patch to all supported branches.

Arthur Zakirov

Discussion: https://postgr.es/m/152353327780.31225.13445405496721177988@wrigleys.postgresql.org

src/backend/tsearch/spell.c

index b9fdd77e198c3185629d628e8f0a1e6e06e2080e..65d99da292ac150f81c1588d08a035d8a2f8d504 100644 (file)
@@ -1963,8 +1963,10 @@ NISortAffixes(IspellDict *Conf)
        if ((Affix->flagflags & FF_COMPOUNDFLAG) && Affix->replen > 0 &&
            isAffixInUse(Conf, Affix->flag))
        {
+           bool        issuffix = (Affix->type == FF_SUFFIX);
+
            if (ptr == Conf->CompoundAffix ||
-               ptr->issuffix != (ptr - 1)->issuffix ||
+               issuffix != (ptr - 1)->issuffix ||
                strbncmp((const unsigned char *) (ptr - 1)->affix,
                         (const unsigned char *) Affix->repl,
                         (ptr - 1)->len))
@@ -1972,7 +1974,7 @@ NISortAffixes(IspellDict *Conf)
                /* leave only unique and minimals suffixes */
                ptr->affix = Affix->repl;
                ptr->len = Affix->replen;
-               ptr->issuffix = (Affix->type == FF_SUFFIX);
+               ptr->issuffix = issuffix;
                ptr++;
            }
        }