• Alexander Barkov's avatar
    MDEV-16117 SP with a single FOR statement creates but further fails to load · fc63c1e1
    Alexander Barkov authored
    The code in the "sp_tail" rule in sql_yacc.yy always
    used YYLIP->get_cpp_tok_start() as the start of the body,
    and did not check for possible lookahead which happens
    for keywords "FOR", "VALUES" and "WITH" for LALR(2)
    resolution in Lex_input_stream::lex_token().
    
    In case of the lookahead token presence,
    get_tok_start_prev() should have been used instead
    of get_cpp_tok_start() as the beginning of the SP body.
    
    Change summary:
    
    This patch hides the implementation of the lookahead
    token completely inside Lex_input_stream.
    The users of Lex_input_stream now just get token-by-token
    transparently and should not care about lookahead any more.
    Now external users of Lex_input_stream
    are not aware of the lookahead token at all.
    
    Change details:
    
    - Moving Lex_input_stream::has_lookahead() into the "private" section.
    
    - Removing Lex_input_stream::get_tok_start_prev() and
      Lex_input_stream::get_cpp_start_prev().
    
    - Fixing the external code to call get_tok_start() and get_cpp_tok_start()
      in all places where get_tok_start_prev() and get_cpp_start_prev()
      where used.
    
    - Adding a test for has_lookahead() right inside
      get_tok_start() and get_cpp_tok_start().
      If there is a lookahead token, these methods now
      return the position of the previous token automatically:
    
       const char *get_tok_start()
       {
         return has_lookahead() ? m_tok_start_prev : m_tok_start;
       }
    
       const char *get_cpp_tok_start()
       {
        return has_lookahead() ? m_cpp_tok_start_prev : m_cpp_tok_start;
       }
    
    - Fixing the internal code inside Lex_input_stream methods
      to use m_tok_start and m_cpp_tok_start directly,
      instead of calling get_tok_start() and get_cpp_tok_start(),
      to make sure to access to the *current* token position
      (independently of a lookahead token presence).
    fc63c1e1
sql_class.h 207 KB