]> granicus.if.org Git - postgresql/commitdiff
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 10202504905eabad481eb23028a71398130aacb3..df28b270e1de9751a4643e18554e23a7cd9a0ba0 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++;
                        }
                }