• Monty's avatar
    Derived tables and union can now create distinct keys · 5e5a8eda
    Monty authored
    The idea is that instead of marking all select_lex's with DISTINCT, we
    only mark those that really need distinct result.
    
    Benefits of this change:
    - Temporary tables used with derived tables, UNION, IN are now smaller
      as duplicates are removed already on the insert phase.
    - The optimizer can now produce better plans with EQ_REF. This can be
      seen from the tests where several queries does not anymore materialize
      derived tables twice.
    - Queries affected by 'in_predicate_conversion_threshold' where large IN
      lists are converted to sub query produces better plans.
    
    Other things:
    - Removed on duplicate call to sel->init_select() in
      LEX::add_primary_to_query_expression_body()
    - I moved the testing of
      tab->table->pos_in_table_list->is_materialized_derived()
      in join_read_const_table() to the caller as it caused problems for
      derived tables that could be proven to be const tables.
      This also is likely to fix some bugs as if join_read_const_table()
      was aborted, the table was left marked as JT_CONST, which cannot
      be good.  I added an ASSERT there for now that can be removed when
      the code has been properly tested.
    5e5a8eda
sql_union.cc 82.9 KB