]> granicus.if.org Git - postgresql/commitdiff
Fix merge affixes for numeric ones
authorTeodor Sigaev <teodor@sigaev.ru>
Fri, 11 Mar 2016 16:47:50 +0000 (19:47 +0300)
committerTeodor Sigaev <teodor@sigaev.ru>
Fri, 11 Mar 2016 16:47:50 +0000 (19:47 +0300)
Some dictionaries have duplicated base words with different affix set, we
just merge that sets into one set. But previously merging of sets of affixes
was actually a concatenation of strings but it's wrong for numeric
representation of affixes because such representation uses comma to
separate affixes.

Author: Artur Zakirov

src/backend/tsearch/spell.c

index 20097275d0fd6f60f4de4b5db0117637a6ed2cc6..304504e7d0c4bea0fd33a75ad77d3e0941f778e0 100644 (file)
@@ -1465,6 +1465,12 @@ MergeAffix(IspellDict *Conf, int a1, int a2)
 {
        char      **ptr;
 
+       /* Do not merge affix flags if one of affix flags is empty */
+       if (*Conf->AffixData[a1] == '\0')
+               return a2;
+       else if (*Conf->AffixData[a2] == '\0')
+               return a1;
+
        while (Conf->nAffixData + 1 >= Conf->lenAffixData)
        {
                Conf->lenAffixData *= 2;
@@ -1473,10 +1479,20 @@ MergeAffix(IspellDict *Conf, int a1, int a2)
        }
 
        ptr = Conf->AffixData + Conf->nAffixData;
-       *ptr = cpalloc(strlen(Conf->AffixData[a1]) +
-                                  strlen(Conf->AffixData[a2]) +
-                                  1 /* space */ + 1 /* \0 */ );
-       sprintf(*ptr, "%s %s", Conf->AffixData[a1], Conf->AffixData[a2]);
+       if (Conf->flagMode == FM_NUM)
+       {
+               *ptr = cpalloc(strlen(Conf->AffixData[a1]) +
+                                          strlen(Conf->AffixData[a2]) +
+                                          1 /* comma */ + 1 /* \0 */ );
+               sprintf(*ptr, "%s,%s", Conf->AffixData[a1], Conf->AffixData[a2]);
+       }
+       else
+       {
+               *ptr = cpalloc(strlen(Conf->AffixData[a1]) +
+                                          strlen(Conf->AffixData[a2]) +
+                                          1 /* \0 */ );
+               sprintf(*ptr, "%s%s", Conf->AffixData[a1], Conf->AffixData[a2]);
+       }
        ptr++;
        *ptr = NULL;
        Conf->nAffixData++;