• Aleksey Midenkov's avatar
    MDEV-24176 Server crashes after insert in the table with virtual · 08c7ab40
    Aleksey Midenkov authored
    column generated using date_format() and if()
    
    vcol_info->expr is allocated on expr_arena at parsing stage. Since
    expr item is allocated on expr_arena all its containee items must be
    allocated on expr_arena too. Otherwise fix_session_expr() will
    encounter prematurely freed item.
    
    When table is reopened from cache vcol_info contains stale
    expression. We refresh expression via TABLE::vcol_fix_exprs() but
    first we must prepare a proper context (Vcol_expr_context) which meets
    some requirements:
    
    1. As noted above expr update must be done on expr_arena as there may
    be new items created. It was a bug in fix_session_expr_for_read() and
    was just not reproduced because of no second refix. Now refix is done
    for more cases so it does reproduce. Tests affected: vcol.binlog
    
    2. Also name resolution context must be narrowed to the single table.
    Tested by: vcol.update main.default vcol.vcol_syntax gcol.gcol_bugfixes
    
    3. sql_mode must be clean and not fail expr update.
    
    sql_mode such as MODE_NO_BACKSLASH_ESCAPES, MODE_NO_ZERO_IN_DATE, etc
    must not affect vcol expression update. If the table was created
    successfully any further evaluation must not fail. Tests affected:
    main.func_like
    
    Reviewed by: Sergei Golubchik <serg@mariadb.org>
    08c7ab40
field.cc 331 KB