• unknown's avatar
    Implementation of WL#2486 - · 7517d7e1
    unknown authored
    "Process NATURAL and USING joins according to SQL:2003".
    
    * Some of the main problems fixed by the patch:
      - in "select *" queries the * expanded correctly according to
        ANSI for arbitrary natural/using joins
      - natural/using joins are correctly transformed into JOIN ... ON
        for any number/nesting of the joins.
      - column references are correctly resolved against natural joins
        of any nesting and combined with arbitrary other joins.
    
    * This patch also contains a fix for name resolution of items
      inside the ON condition of JOIN ... ON - in this case items must
      be resolved only against the JOIN operands. To support such
      'local' name resolution, the patch introduces a stack of
      name resolution contexts used at parse time.
    
    NOTICE:
    - This patch is not complete in the sense that
      - there are 2 test cases that still do not pass -
        one in join.test, one in select.test. Both are marked
        with a comment "TODO: WL#2486".
      - it does not include a new test specific for the task
    
    
    mysql-test/include/ps_query.inc:
      Adjusted according to standard NATURAL/USING join semantics.,
    mysql-test/r/bdb.result:
      Adjusted according to standard NATURAL/USING join semantics.
    mysql-test/r/derived.result:
      Adjusted according to standard NATURAL/USING join semantics.
    mysql-test/r/errors.result:
      The column as a whole cannot be resolved, so different error message.
    mysql-test/r/fulltext.result:
      Adjusted according to standard JOIN ... ON semantics =>
      the ON condition can refer only to the join operands.
    mysql-test/r/fulltext_order_by.result:
      More detailed error message.
    mysql-test/r/innodb.result:
      Adjusted according to standard NATURAL/USING join semantics.
      This test doesn't pass completetly yet!
    mysql-test/r/insert_select.result:
      More detailed error message.
    mysql-test/r/join.result:
      Adjusted according to standard NATURAL/USING join semantics.
      
      NOTICE: there is one test case that still fails, and it is
      commeted out and marked with WL#2486 in the test file.
    mysql-test/r/join_crash.result:
      Adjusted according to standard NATURAL/USING join semantics.
    mysql-test/r/join_nested.result:
      Adjusted according to standard NATURAL/USING join semantics.
    mysql-test/r/join_outer.result:
      Adjusted according to standard NATURAL/USING join semantics.
    mysql-test/r/multi_update.result:
      Adjusted according to standard NATURAL/USING join semantics.
    mysql-test/r/null_key.result:
      Adjusted according to standard NATURAL/USING join semantics.
    mysql-test/r/order_by.result:
      Adjusted according to standard NATURAL/USING join semantics.
    mysql-test/r/ps_2myisam.result:
      Adjusted according to standard NATURAL/USING join semantics.
    mysql-test/r/ps_3innodb.result:
      Adjusted according to standard NATURAL/USING join semantics.
    mysql-test/r/ps_4heap.result:
      Adjusted according to standard NATURAL/USING join semantics.
    mysql-test/r/ps_5merge.result:
      Adjusted according to standard NATURAL/USING join semantics.
    mysql-test/r/ps_6bdb.result:
      Adjusted according to standard NATURAL/USING join semantics.
    mysql-test/r/ps_7ndb.result:
      Adjusted according to standard NATURAL/USING join semantics.
    mysql-test/r/select.result:
      Adjusted according to standard NATURAL/USING join semantics.
      
      NOTICE: there is one failing test case which is commented with
      WL#2486 in the test file.
    mysql-test/r/subselect.result:
      Adjusted according to standard NATURAL/USING join semantics.
    mysql-test/r/type_ranges.result:
      Adjusted according to standard NATURAL/USING join semantics.
    mysql-test/r/union.result:
      More detailed error message.
    mysql-test/t/bdb.test:
      Adjusted according to standard NATURAL/USING join semantics.
    mysql-test/t/errors.test:
      Adjusted according to standard NATURAL/USING join semantics.
    mysql-test/t/fulltext.test:
      Adjusted according to standard JOIN ... ON semantics =>
      the ON condition can refer only to the join operands.
    mysql-test/t/fulltext_order_by.test:
      More detailed error message.
    mysql-test/t/innodb.test:
      Adjusted according to standard NATURAL/USING join semantics.
      This test doesn't pass completetly yet!
    mysql-test/t/insert_select.test:
      More detailed error message.
    mysql-test/t/join.test:
      Adjusted according to standard NATURAL/USING join semantics.
      
      NOTICE: there is one test case that still fails, and it is
      commeted out and marked with WL#2486 in the test file.
    mysql-test/t/join_crash.test:
      Adjusted according to standard NATURAL/USING join semantics.
    mysql-test/t/join_nested.test:
      Adjusted according to standard NATURAL/USING join semantics.
    mysql-test/t/join_outer.test:
      Adjusted according to standard NATURAL/USING join semantics.
    mysql-test/t/null_key.test:
      Adjusted according to standard NATURAL/USING join semantics.
    mysql-test/t/order_by.test:
      Adjusted according to standard NATURAL/USING join semantics.
    mysql-test/t/select.test:
      Adjusted according to standard NATURAL/USING join semantics.
      
      NOTICE: there is one test case that still fails, and it is
      commeted out and marked with WL#2486 in the test file.
    mysql-test/t/subselect.test:
      Adjusted according to standard NATURAL/USING join semantics.
    mysql-test/t/type_ranges.test:
      Adjusted according to standard NATURAL/USING join semantics.
    mysql-test/t/union.test:
      More detailed error message.
    sql/item.cc:
      - extra parameter to find_field_in_tables
      - find_field_in_real_table renamed to find_field_in_table
      - fixed comments/typos
    sql/item.h:
      - added [first | last]_name_resolution_table to class
        Name_resolution_context
      - commented old code
      - standardized formatting
    sql/mysql_priv.h:
      - refactored the find_field_in_XXX procedures,
      - added a new procedure for natural join table references,
      - renamed the find_field_in_XXX procedures to clearer names
    sql/sp.cc:
      - pass the top-most list of the FROM clause to setup_tables
      - extra parameter to find_field_in_tables
    sql/sql_acl.cc:
      - renamed find_field_in_table => find_field_in_table_ref
      - extra parameter to find_field_in_table_ref
      - commented old code
    sql/sql_base.cc:
      This file contains the core of the implementation of the processing
      of NATURAL/USING joins (WL#2486).
      - added many comments to old code
      - refactored the group of find_field_in_XXX procedures, and added a
        new procedure for natural joins. There is one find_field_in_XXX procedure
        per each type of table reference (stored table, merge view, or natural
        join); one meta-procedure that selects the correct one depeneding on the
        table reference; and one procedure that goes over a list of table
        referenes.
      - NATURAL/USING joins are processed through the procedures:
          mark_common_columns, store_natural_using_join_columns,
          store_top_level_join_columns, setup_natural_join_row_types.
        The entry point to processing NATURAL/USING joins is the
        procedure 'setup_natural_join_row_types'.
      - Replaced the specialized Field_iterator_XXX iterators with one
        generic iterator over the fields of a table reference.
      - Simplified 'insert_fields' and 'setup_conds' due to encapsulation of
        the processing of natural joins in a separate set of procedures.
    sql/sql_class.h:
      - Commented old code.
    sql/sql_delete.cc:
      - Pass the FROM clause to setup_tables.
    sql/sql_help.cc:
      - pass the end name resolution table to find_field_in_tables
      - adjust the list of tables for name resolution
    sql/sql_insert.cc:
      - Changed the code that saves and restores the current context to
        support the list of tables for name resolution -
        context->first_name_resolution_table, and
        table_list->next_name_resolution_table.
        Needed to support an ugly trick to resolve inserted columns only in
        the first table.
      - Added Name_resolution_context::[first | last]_name_resolution_table.
      - Commented old code
    sql/sql_lex.cc:
      - set select_lex.parent_lex correctly
      - set correct state of the current name resolution context
    sql/sql_lex.h:
      - Added a stack of name resolution contexts to support local
        contexts for JOIN ... ON conditions.
      - Commented old code.
    sql/sql_load.cc:
      - Pass the FROM clause to setup_tables.
    sql/sql_olap.cc:
      - Pass the FROM clause to setup_tables.
    sql/sql_parse.cc:
      - correctly set SELECT_LEX::parent_lex
      - set the first table of the current name resoltion context
      - added support for NATURAL/USING joins
      - commented old code
    sql/sql_select.cc:
      - Pass the FROM clause to setup_tables.
      - Pass the end table to find_field_in_tables
      - Improved comments
    sql/sql_show.cc:
      - Set SELECT_LEX::parent_lex.
    sql/sql_update.cc:
      - Pass the FROM clause to setup_tables.
    sql/sql_yacc.yy:
      - Added support for a stack of name resolution contexts needed to
        implement name resolution for JOIN ... ON. A context is pushed
        for each new JOIN ... ON, and popped afterwards.
      - Added support for NATURAL/USING joins.
    sql/table.cc:
      - Added new class Natural_join_column to hide the heterogeneous
        representation of column references for stored tables and for
        views.
      - Added a new list TABLE_LIST::next_name_resolution_table to
        support name resolution with NATURAL/USING joins. Also added
        other members to TABLE_LIST to support NATURAL/USING joins.
      - Added a generic iterator over the fields of table references
        of various types - class Field_iterator_table_ref
    sql/table.h:
      - Added new class Natural_join_column to hide the heterogeneous
        representation of column references for stored tables and for
        views.
      - Added a new list TABLE_LIST::next_name_resolution_table to
        support name resolution with NATURAL/USING joins. Also added
        other members to TABLE_LIST to support NATURAL/USING joins.
      - Added a generic iterator over the fields of table references
        of various types - class Field_iterator_table_ref
    tests/mysql_client_test.c:
      Adjusted according to standard NATURAL JOIN syntax.
    7517d7e1
select.test 129 KB