• unknown's avatar
    Bug#21513 (SP having body starting with quoted label rendered unusable) · 1700feaa
    unknown authored
    Before this fix, the parser would sometime change where a token starts by
    altering Lex_input_string::tok_start, which later confused the code in
    sql_yacc.yy that needs to capture the source code of a SQL statement,
    like to represent the body of a stored procedure.
    
    This line of code in sql_lex.cc :
    
    case MY_LEX_USER_VARIABLE_DELIMITER:
      lip->tok_start= lip->ptr; // Skip first `
    
    would <skip the first back quote> ... and cause the bug reported.
    
    In general, the responsibility of sql_lex.cc is to *find* where token are
    in the SQL text, but is *not* to make up fake or incomplete tokens.
    With a quoted label like `my_label`, the token starts on the first quote.
    Extracting the token value should not change that (it did).
    
    With this fix, the lexical analysis has been cleaned up to not change
    lip->tok_start (in the case found for this bug).
    
    The functions get_token() and get_quoted_token() now have an extra
    parameters, used when some characters from the beginning of the token need
    to be skipped when extracting a token value, like when extracting 'AB' from
    '0xAB', for example, for a HEX_NUM token.
    
    This exposed a bad assumption in Item_hex_string and Item_bin_string,
    which has been fixed:
    
    The assumption was that the string given, 'AB', was in fact preceded in
    memory by '0x', which might be false (it can be preceded by "x'" and
    followed by "'" -- or not be preceded by valid memory at all)
    
    If a name is needed for Item_hex_string or Item_bin_string, the name is
    taken from the original and true source code ('0xAB'), and assigned in
    the select_item rule, instead of relying on assumptions related to how
    memory is used.
    
    
    mysql-test/r/sp.result:
      Lex_input_stream::tok_start must point at the real start of a token.
    mysql-test/t/sp.test:
      Lex_input_stream::tok_start must point at the real start of a token.
    sql/item.cc:
      Lex_input_stream::tok_start must point at the real start of a token.
    sql/sql_lex.cc:
      Lex_input_stream::tok_start must point at the real start of a token.
    sql/sql_yacc.yy:
      Lex_input_stream::tok_start must point at the real start of a token.
    1700feaa
sql_yacc.yy 257 KB