• Dmitry Shulga's avatar
    MDEV-25108: Running of the EXPLAIN EXTENDED statement produces extra warning... · f8bf2a01
    Dmitry Shulga authored
    MDEV-25108: Running of the EXPLAIN EXTENDED statement produces extra warning in case it is executed in PS (prepared statement) mode
    
    The EXPLAIN EXTENDED statement run as a prepared statement can produce extra
    warning comparing with a case when EXPLAIN EXTENDED statement is run as
    a regular statement. For example, the following test case
      CREATE TABLE t1 (c int);
      CREATE TABLE t2 (d int);
      EXPLAIN EXTENDED SELECT (SELECT 1 FROM t2 WHERE d = c) FROM t1;
    
    produces the extra warning
      "Field or reference 'c' of SELECT #2 was resolved in SELECT #1"
    in case the above mentioned "EXPLAIN EXTENDED" statement is executed
    in PS mode, that is by submitting the following statements:
       PREPARE stmt FROM "EXPLAIN EXTENDED SELECT (SELECT 1 FROM t2 WHERE d = c) FROM t1";
       EXECUTE stmt;
    
    The reason of the extra warning emittion is in a way items
    are handled (being fixed) during execution of the JOIN::prepare() method.
    The method Item_field::fix_fields() calls the find_field_in_tables()
    function in case a field hasn't been associated yet with the item.
    Implementation of the find_field_in_tables() function first checks whether
    a table containing the required field was already opened and cached.
    It is done by checking the data member item->cached_table. This data member
    is set on handling the PRERARE FROM statement and checked on executing
    the EXECUTE statement. If the data member item->cached_table is set
    the find_field_in_tables() function invoked and the
    mark_select_range_as_dependent() function called if the field
    is an outer referencee. The mark_select_range_as_dependent() function
    calls the mark_as_dependent() function that finally invokes
    the push_warning_printf() function that produces extra warning.
    
    To fix the issue, calling of push_warning_printf() is elimited in case
    it was run indirectly in result of hanlding already opened table from
    the Item_field::fix_fields() method.
    f8bf2a01
item.cc 297 KB