• unknown's avatar
    BUG#24342 - Incorrect results with query over MERGE table · 6866ca00
    unknown authored
    MERGE engine may return incorrect values when several representations
    of equal keys are present in the index. For example "groß" and "gross"
    or "gross" and "gross " (trailing space), which are considered equal,
    but have different lengths.
    
    The problem was that key length was not recalculated after key lookup.
    
    Only MERGE engine is affected.
    
    
    myisam/mi_rkey.c:
      info->lastkey gets rewritten by mi_search. Later we recalculate found lastkey
      length. This is done to make sure that mi_rnext_same gets true, found (not
      searched) lastkey length. Searched and found key lengths may be different,
      for example in case searched key is "groß" and found is "gross" or in case
      a key has trailing spaces.
      
      Unfortunately we recalculate found lastkey length only for first
      underlying table. To recalculate found key length for non-first underlying
      table we need to know how much key segments were used to create this key.
      
      When mi_rkey is called for first underlying table of a merge table, store
      offset to last used key segment.
      
      Restore last_used_keyseg variable when mi_rkey is called for non-first
      underlying table.
    myisam/myisamdef.h:
      Added last_used_keyseg variable to MI_INFO. It is used by merge engine to calculate
      key length.
    myisammrg/myrg_rkey.c:
      Pass last used key segment returned by first table key read to other
      table key reads.
    mysql-test/r/merge.result:
      A test case for bug#24342.
    mysql-test/t/merge.test:
      A test case for bug#24342.
    6866ca00
myisamdef.h 31 KB