• Alexey Kopytov's avatar
    Bug #48131: crash group by with rollup, distinct, filesort, · b67cdaa3
    Alexey Kopytov authored
                with temporary tables
    
    There were two problems the test case from this bug was
    triggering:
    
    1. JOIN::rollup_init() was supposed to wrap all constant Items
    into another object for queries with the WITH ROLLUP modifier
    to ensure they are never considered as constants and therefore
    are written into temporary tables if the optimizer chooses to
    employ them for DISTINCT/GROUP BY handling.
    
    However, JOIN::rollup_init() was called before
    make_join_statistics(), so Items corresponding to fields in
    const tables could not be handled as intended, which was
    causing all kinds of problems later in the query execution. In
    particular, create_tmp_table() assumed all constant items
    except "hidden" ones to be removed earlier by remove_const()
    which led to improperly initialized Field objects for the
    temporary table being created. This is what was causing crashes
    and valgrind errors in storage engines.
    
    2. Even when the above problem had been fixed, the query from
    the test case produced incorrect results due to some
    DISTINCT/GROUP BY optimizations being performed by the
    optimizer that are inapplicable in the WITH ROLLUP case.
    
    Fixed by disabling inapplicable DISTINCT/GROUP BY optimizations
    when the WITH ROLLUP modifier is present, and splitting the
    const-wrapping part of JOIN::rollup_init() into a separate
    method which is now invoked after make_join_statistics() when
    the const tables are already known.
    
    mysql-test/r/olap.result:
      Added a test case for bug #48131.
    mysql-test/t/olap.test:
      Added a test case for bug #48131.
    sql/sql_select.cc:
      1. Disabled inapplicable DISTINCT/GROUP BY optimizations when
      the WITH ROLLUP modifier is present.
      2. Split the const-wrapping part of JOIN::rollup_init() into a
      separate method.
    sql/sql_select.h:
      Added rollup_process_const_fields() declaration.
    b67cdaa3
sql_select.h 22.5 KB