• unknown's avatar
    Fixed bug#19077: A nested materialized derived table is used before being populated. · 1c6beaee
    unknown authored
    The convert_constant_item() function converts constant items to ints on
    prepare phase to optimize execution speed. In this case it tries to evaluate
    subselect which contains a derived table and is contained in a derived table. 
    All derived tables are filled only after all derived tables are prepared.
    So evaluation of subselect with derived table at the prepare phase will
    return a wrong result.
    
    A new flag with_subselect is added to the Item class. It indicates that
    expression which this item represents is a subselect or contains a subselect.
    It is set to 0 by default. It is set to 1 in the Item_subselect constructor
    for subselects.
    For Item_func and Item_cond derived classes it is set after fixing any argument
    in Item_func::fix_fields() and Item_cond::fix_fields accordingly.
    The convert_constant_item() function now doesn't convert a constant item
    if the with_subselect flag set in it. 
    
    
    mysql-test/t/view.test:
      Added test case for bug#19077: A nested materialized derived table is used before being populated.
    mysql-test/t/subselect.test:
      Added test case for bug#19077: A nested materialized derived table is used before being populated.
    mysql-test/r/view.result:
      Added test case for bug#19077: A nested materialized derived table is used before being populated.
    mysql-test/r/subselect.result:
      Added test case for bug#19077: A nested materialized derived table is used before being populated.
    sql/item_subselect.cc:
      Fixed bug#19077: A nested materialized derived table is used before being populated.
      The Item_subselect class constructor sets new with_subselect flag to 1.
    sql/item_func.cc:
      Fixed bug#19077: A nested materialized derived table is used before being populated.
      
      The Item_func::fix_fields() sets new with_subselect flag from with_subselect flags of its arguments.
    sql/item_cmpfunc.cc:
      Fixed bug#19077: A nested materialized derived table is used before being populated.
      The convert_constant_item() function now doesn't convert a constant item
      with the with_subselect flag set.
      The Item_cond::fix_fields() sets new with_subselect flag from with_subselect flags of its arguments.
    sql/item.cc:
      Fixed bug#19077: A nested materialized derived table is used before being populated.
      Set new with_subselect flag to default value - 0 in the Item constructor.
    sql/item.h:
      Fixed bug#19077: A nested materialized derived table is used before being populated.
      A new flag with_subselect is added to the Item class. It indicates that
      expression which this item represents is a subselect or contains a subselect.
      It is set to 0 by default.
    1c6beaee
subselect.test 84.8 KB