• unknown's avatar
    Fix for BUG#16211: Stored function return type for strings is ignored. · 3c108584
    unknown authored
    Fix for BUG#16676: Database CHARSET not used for stored procedures
    
    The problem in BUG#16211 is that CHARSET-clause of the return type for
    stored functions is just ignored.
    
    The problem in BUG#16676 is that if character set is not explicitly
    specified for sp-variable, the server character set is used instead
    of the database one.
    
    The fix has two parts:
    
      - always store CHARSET-clause of the return type along with the
        type definition in mysql.proc.returns column. "Always" means that
        CHARSET-clause is appended even if it has not been explicitly
        specified in CREATE FUNCTION statement (this affects BUG#16211 only).
    
        Storing CHARSET-clause if it is not specified is essential to avoid
        changing character set if the database character set is altered in
        the future.
    
        NOTE: this change is not backward compatible with the previous releases.
    
      - use database default character set if CHARSET-clause is not explicitly
        specified (this affects both BUG#16211 and BUG#16676).
    
        NOTE: this also breaks backward compatibility.
    
    
    mysql-test/r/mysqldump.result:
      Updated result file.
    mysql-test/r/sp.result:
      Updated result file.
    mysql-test/t/sp.test:
      Provided test cases for BUG#16211, BUG#16676.
    sql/mysql_priv.h:
      Added two convenient functions for work with databases.
    sql/sp.cc:
      1. Add CHARSET-clause to CREATE-statement if it has been explicitly specified.
      2. Polishing -- provided some comments.
    sql/sp_head.cc:
      Use database charset as default charset of sp-variable.
    sql/sp_head.h:
      Move init_sp_name() out of init_strings().
    sql/sql_db.cc:
      Two new functions created:
        - load_db_opt_by_name();
        - check_db_dir_existence();
    sql/sql_show.cc:
      Eliminate duplicated code by using
      check_db_dir_existence() and load_db_opt_by_name()
    sql/sql_table.cc:
      Eliminate duplicated code by using
      check_db_dir_existence() and load_db_opt_by_name()
    sql/sql_yacc.yy:
      Call sp_head::init_sp_name() to initialize stored routine name.
    3c108584
sp.cc 54.6 KB