• Sergei Petrunia's avatar
    MDEV-21383: Possible range plan is not used under certain conditions · 7e8a5802
    Sergei Petrunia authored
    [Variant 2 of the fix: collect the attached conditions]
    
    Problem:
    make_join_select() has a section of code which starts with
     "We plan to scan all rows. Check again if we should use an index."
    
    the code in that section will [unnecessarily] re-run the range
    optimizer using this condition:
    
      condition_attached_to_current_table AND current_table's_ON_expr
    
    Note that the original invocation of range optimizer in
    make_join_statistics was done using the whole select's WHERE condition.
    Taking the whole select's WHERE condition and using multiple-equalities
    allowed the range optimizer to infer more range restrictions.
    
    The fix:
    - Do range optimization using a condition that is an AND of this table's
    condition and all of the previous tables' conditions.
    - Also, fix the range optimizer to prefer SEL_ARGs with type=KEY_RANGE
    over SEL_ARGS with type=MAYBE_KEY, regardless of the key part.
    Computing
    key_and(
      SEL_ARG(type=MAYBE_KEY key_part=1),
      SEL_ARG(type=KEY_RANGE, key_part=2)
    )
    will now produce the SEL_ARG with type=KEY_RANGE.
    7e8a5802
sql_select.cc 902 KB