• unknown's avatar
    Fix Bug#9334 "PS API queries in log file" and · c0484a30
    unknown authored
    Bug#8367 "low log doesn't gives complete information about prepared 
    statements"
    Implement status variables for prepared statements commands (a port of
    the patch by Andrey Hristov).
    See details in comments to the changed files.
    No test case as there is no way to test slow log/general log in 
    mysqltest.
    
    
    mysql-test/r/ps_grant.result:
      Now execute is logged with tag 'Execute' (changed result file).
    sql/mysql_priv.h:
      - remove obsolete macro.
      - add declarations for new status variables.
      - export function log_slow_statement, which now is used in sql_prepare.cc
    sql/mysqld.cc:
      Add status variables for prepared statements API: now we record
      mysql_stmt_close, mysql_stmt_reset, mysql_stmt_prepare, mysql_stmt_execute
      mysql_stmt_send_long_data, PREPARE, EXECUTE, DEALLOCATE.
    sql/sql_parse.cc:
      - account DEALLOCATE prepare as a Com_stmt_close command (close of a
      prepared statement).
    sql/sql_prepare.cc:
      - fix a bug in SQL syntax for prepared statements + logging:
        if we use --log and EXECUTE stmt USING @no_such_variable;, the
        server crashed because the old code assumed that the variable 
        returned by get_var_with_binlog is never NULL.
      - account statistics for 
        mysql_stmt_{prepare,execute,close,reset,send_long_data} in
        Com_stmt_{prepare,execute,close,reset,send_long_data} correspondingly.
      - log slow statements into the slow log early, when thd->query
        points to a valid (with expanded placeholder values) query.
        The previous version was logging it in sql_parse, when thd->query
        is empty. Prevent the server from logging the statement twice by 
        setting thd->enable_slow_log= FALSE.
      - now in case of EXECUTE stmt in SQL syntax for prepared statements the 
        general log gets two queries, e.g.
        Query    EXECUTE stmt USING @A, @b, @c
        Execute  INSERT INTO t1 VALUES (1, 2, 3)
        This makes the behavior consistent with PREPARE command, which
        also logs the statement twice.
    c0484a30
mysqld.cc 238 KB