• Jon Olav Hauglid's avatar
    Bug #56678 Valgrind warnings from binlog.binlog_unsafe · 68f87c72
    Jon Olav Hauglid authored
    After the patch for Bug#54579, multi inserts done with INSERT DELAYED
    are binlogged as normal INSERT. During processing of the statement,
    a new query string without the DELAYED keyword is made. The problem
    was that this new string was incorrectly made when the INSERT DELAYED
    was part of a prepared statement - data was read outside the allocated
    buffer.
    
    The reason for this bug was that a pointer to the position of the
    DELAYED keyword inside the query string was stored when parsing the
    statement. This pointer was then later (at runtime) used (via pointer
    subtraction) to find the number of characters to skip when making a
    new query string without DELAYED. But when the statement was re-executed
    as part of a prepared statement, the original pointer would be invalid
    and the pointer subtraction would give a wrong/random result.
    
    This patch fixes the problem by instead storing the offsets from the
    beginning of the query string to the start and end of the DELAYED 
    keyword. These values will not depend on the memory position
    of the query string at runtime and therefore not give wrong results
    when the statement is executed in a prepared statement.
    
    This bug was a regression introduced by the patch for Bug#54579.
    
    No test case added as this bug is already covered by the existing
    binlog.binlog_unsafe test case when running with valgrind.
    68f87c72
sql_yacc.yy 431 KB