• unknown's avatar
    A fix and a test case for Bug#29050 Creation of a legal stored procedure · e8966dee
    unknown authored
    fails if a database is not selected prior.
    
    The problem manifested itself when a user tried to
    create a routine that had non-fully-qualified identifiers in its bodies
    and there was no current database selected.
    
    This is a regression introduced by the fix for Bug 19022:
    
    The patch for Bug 19022 changes the code to always produce a warning
    if we can't resolve the current database in the parser. 
    In this case this was not necessary, since even though the produced
    parsed tree was incorrect, we never re-use sphead
    that was obtained at first parsing of CREATE PROCEDURE.
    The sphead that is anyhow used is always obtained through db_load_routine,
    and there we change the current database to sphead->m_db before
    calling yyparse.
    
    The idea of the fix is to resolve the current database directly using 
    lex->sphead->m_db member when parsing a stored routine body, when
    such is present.
    
    This patch removes the need to reset the current database
    when loading a trigger or routine definition into SP cache.
    The redundant code will be removed in 5.1.
    
    
    mysql-test/r/sp.result:
      Update test results (Bug#29050)
    mysql-test/r/trigger.result:
      Update results.
    mysql-test/t/sp.test:
      Add a test case for Bug#29050
    mysql-test/t/trigger.test:
      Fix wrong behavior covered with tests.
    sql/sql_lex.cc:
      Implement st_lex::copy_db_to().
    sql/sql_lex.h:
      Declare st_lex::copy_db_to().
    sql/sql_parse.cc:
      Use st_lex::copy_db_to() in add_table_to_list, rather than
      THD::copy_db_to(). The former will use the database of the sphead,
      if we're parsing a stored routine, not the default database in
      THD. The default database is needed to initialize tables->db
      when the database part was not explicitly specified in the identifier.
    sql/sql_yacc.yy:
      Use st_lex::copy_db_to() in the parser, rather than
      THD::copy_db_to(). The former will use the database of the sphead,
      if we're parsing a stored routine, not the default database in
      THD.
    e8966dee
sql_lex.h 41.2 KB