• Michael Widenius's avatar
    Fix for MDEV-5531: double call procedure in one session - hard shutdown the server · d15b3386
    Michael Widenius authored
    Main fix was to not cache derivied tables as they may be temporary tables that are deleted before the next query.
    This was a bit tricky as Item_field::fix_fields depended on cached_tables to be set to resolve some columns.
    
    
    
    mysql-test/r/sp-bugs.result:
      Added test case
    mysql-test/t/sp-bugs.test:
      Added test case
    sql/item.cc:
      Fixed fix_outer_field to handle case where found field did not have in cached_table
      Idea is that if cached_table is not avaliable, use from_field->table->pos_in_table_list instead
    sql/records.cc:
      Also accept INTERNAL_TMP_TABLE for memmap
    sql/sql_base.cc:
      More DBUG_PRINT
      Fixed that setup_natural_join_row_types() is not run twice.
      Original code modified context->first_name_resolution_table also for second executions.
      This was wrong as this could give wrong results if some joins had been optimized away between calls.
    sql/sql_derived.cc:
      Mark derived tables as internal temporary tables (INTERNAL_TMP_TABLE), not as NON_TRANSACTIONAL_TMP_TABLE.
      This is more correct as the tables are not visible by the end user.
    sql/sql_insert.cc:
      Reset pos_in_table_list before calling fix_fields.
      One of the consequences of the change of not caching all generated tables in Item_ident is that
      pos_in_table_list needs to be correct in calls to fix_fields.
    sql/sql_lex.cc:
      More DBUG_PRINT
    sql/sql_parse.cc:
      Don't cache derivied tables as they may be temporary tables that are deleted before the next query
    sql/sql_select.cc:
      Reset table_vector. This was required as some code checked the vector to see if temporary tables had already been created.
    sql/table.cc:
      Mark tables with field translations as cacheable (as these will not disapper between stmt executions.
    d15b3386
item.cc 264 KB