• unknown's avatar
    Bug#36570: Parse error of CREATE PROCEDURE stmt with comments on \ · 4a3c5ef3
    unknown authored
    	slave
    
    The stored-routine code took the contents of the (lowest) parser
    and copied it directly to the binlog, which causes problems if there
    is a special case of interpretation at the parser level -- which 
    there is, in the "/*!VER */" comments.  The trailing "*/" caused
    errors on the slave, naturally.
    
    Now, since by that point we have /properly/ created parse-tree (as 
    the rest of the server should do!) for the stored-routine CREATE, we
    can construct a perfect statement from that information, instead of
    writing uncertain information from an unknown parser state.  
    Fortunately, there's already a function nearby that does exactly 
    that.
    ---
    Update for Bug#36570.  Qualify routine names with db name when
    writing to the binlog ONLY if the source text is qualified.
    
    
    mysql-test/r/binlog_innodb.result:
      Offsets changed due to quoting.
      ---
      New offset to account for db-qualified names.
    mysql-test/r/ctype_cp932_binlog.result:
      Offsets changed due to quoting.
      ---
      Qualify routine names with DB.  Offsets change also.
    mysql-test/r/mysqlbinlog.result:
      Case changed in result due to interpretation of data instead of 
      literal recitation.
      ---
      Qualify procedure name with db.
    mysql-test/r/rpl_sp.result:
      Offsets changed due to quoting.  Added tests.
      ---
      Qualify routine names with DB if qualified in query.  Offsets change also.
    mysql-test/t/rpl_sp.test:
      Add version-limiting quotes to exercise bug#36570.  Test that 
      backtick-quoted identifiers and labels work also.
      ---
      Use different db to show qualification works.  Qualify routine names
      with DB if qualified in query.
    sql/sp.cc:
      In create_string, we may not have a sp_name parameter yet, so
      instead pass the char* and length of the only member we'd get out
      of it.
      
      Having done that, we can use the same function to write the 
      CREATE (FUNC|TRIG|PROC) statement to the binlog as we always used
      to display the statement to the user.
      ---
      Make the db name part of the CREATE string if it is specified.
      
      Specify it in part of writing to the binlog when creating a new
      routine.
    sql/sp_head.cc:
      Set the sp_head m_explicit_name member as the sp_name member is set.  
      We can not peek at this later, as the sp_name is gone by then.
    sql/sp_head.h:
      Add a member to track whether the name is qualified with the 
      database.
    4a3c5ef3
sp_head.h 30 KB