An error occurred fetching the project authors.
  1. 26 Aug, 2008 1 commit
  2. 22 Aug, 2008 1 commit
    • Alexey Botchkov's avatar
      Bug#32167 another privilege bypass with DATA/INDEX DIRECTORY. · ec524d50
      Alexey Botchkov authored
                  
                  test_if_data_home_dir fixed to look into real path.
                  Checks added to mi_open for symlinks into data home directory.
      
      per-file messages:
              include/my_sys.h
                Bug#32167 another privilege bypass with DATA/INDEX DIRECTORY.
                
                my_is_symlink interface added
              include/myisam.h
                Bug#32167 another privilege bypass with DATA/INDEX DIRECTORY.
                
                myisam_test_invalid_symlink interface added
              myisam/mi_check.c
                Bug#32167 another privilege bypass with DATA/INDEX DIRECTORY.
                
                mi_open_datafile calls modified
              myisam/mi_open.c
                Bug#32167 another privilege bypass with DATA/INDEX DIRECTORY.
                
                code added to mi_open to check for symlinks into data home directory.
                mi_open_datafile now accepts 'original' file path to check if it's
                an allowed symlink.
              myisam/mi_static.c
                Bug#32167 another privilege bypass with DATA/INDEX DIRECTORY.
                
                myisam_test_invlaid_symlink defined
              myisam/myisamchk.c
                Bug#32167 another privilege bypass with DATA/INDEX DIRECTORY.
                
                mi_open_datafile call modified
              myisam/myisamdef.h
                Bug#32167 another privilege bypass with DATA/INDEX DIRECTORY.
                
                mi_open_datafile interface modified - 'real_path' parameter added
              mysql-test/r/symlink.test
                Bug#32167 another privilege bypass with DATA/INDEX DIRECTORY.
                
                error codes corrected as some patch now rejected pointing inside datahome
              mysql-test/r/symlink.result
                Bug#32167 another privilege bypass with DATA/INDEX DIRECTORY.
                
                error messages corrected in the result
              mysys/my_symlink.c
                Bug#32167 another privilege bypass with DATA/INDEX DIRECTORY.
                
                my_is_symlink() implementsd
                my_realpath() now returns the 'realpath' even if a file isn't a symlink
              sql/mysql_priv.h
                Bug#32167 another privilege bypass with DATA/INDEX DIRECTORY.
                
                test_if_data_home_dir interface
              sql/mysqld.cc
                Bug#32167 another privilege bypass with DATA/INDEX DIRECTORY.
                
                myisam_test_invalid_symlik set with the 'test_if_data_home_dir'
              sql/sql_parse.cc
                Bug#32167 another privilege bypass with DATA/INDEX DIRECTORY.
                
                error messages corrected
                test_if_data_home_dir code fixed
      ec524d50
  3. 19 Aug, 2008 1 commit
    • Mats Kindahl's avatar
      Bug #34707: Row based replication: slave creates table within wrong database · 5cd9d96a
      Mats Kindahl authored
      The failure was caused by executing a CREATE-SELECT statement that creates a
      table in another database than the current one. In row-based logging, the
      CREATE statement was written to the binary log without the database, hence
      creating the table in the wrong database, causing the following inserts to
      fail since the table didn't exist in the given database.
      
      Fixed the bug by adding a parameter to store_create_info() that will make
      the function print the database name before the table name and used that
      in the calls that write the CREATE statement to the binary log. The database
      name is only printed if it is different than the currently selected database.
      
      The output of SHOW CREATE TABLE has not changed and is still printed without
      the database name.
      
      mysql-test/suite/rpl/r/rpl_row_create_table.result:
        Result file change.
      mysql-test/suite/rpl/t/rpl_row_create_table.test:
        Added test to check that CREATE-SELECT into another database than the
        current one replicates.
      sql/sql_insert.cc:
        Adding parameter to calls to store_create_info().
      sql/sql_show.cc:
        Adding parameter to calls to store_create_info().
        
        Extending store_create_info() with parameter 'show_database' that will cause
        the database to be written before the table name.
      sql/sql_show.h:
        Adding parameter to call to store_create_info() to tell if the database should be shown or not.
      sql/sql_table.cc:
        Adding parameter to calls to store_create_info().
      5cd9d96a
  4. 15 Aug, 2008 1 commit
    • Davi Arnaut's avatar
      Bug#38560: valgrind warnings on PB due to query profiling · 02cd7856
      Davi Arnaut authored
      Fix for a valgrind warning due to a jump on a uninitialized
      variable. The problem was that the sql profile preparation
      function wasn't being called for all possible code paths
      of query execution.
      
      The solution is to ensure that query profiling is always
      started before dispatch_command function is called and to
      explicitly call the profile preparation function on bootstrap.
      
      
      
      sql/sql_parse.cc:
        Finish query profiling properly when executing bootstrap commands.
        Add query profiling to execute_init_command as it calls dispatch_command.
      02cd7856
  5. 07 Aug, 2008 1 commit
  6. 31 Jul, 2008 1 commit
    • He Zhenxing's avatar
      BUG#37051 Replication rules not evaluated correctly · a018e98c
      He Zhenxing authored
      The problem of this bug is that we need to get the list of tables
      to be updated for a multi-table update statement, which requires to
      open all the tables referenced by the statement and resolve all
      the fields involved in update in order to figure out the list of
      tables for update. However if there are replicate filter rules,
      some tables might not exist on slave and result in a failure
      before we could examine the filter rules.
      
      I think the whole problem can not be solved on slave alone,
      the master must record and send the information of tables
      involved for update to slave, so that the slave do not need to
      open all the tables referenced by the multi-table update statement to
      figure out which tables are involved for update.
      
      So a status variable is added to Query_log event to store the
      value of table map for update on master. And on slave, it will
      try to get the value of this variable and use it to examine
      filter rules without opening any tables on slave, if this values
      is not available, the old approach is used and thus the bug will
      still occur for when replicating from old masters.
      
      
      sql/sql_class.h:
        add member table_map_for_update to THD
      sql/sql_parse.cc:
        check filter rules by using table_map_for_update value
      sql/sql_update.cc:
        save the value of table_map_for_update
      a018e98c
  7. 14 Jul, 2008 1 commit
    • Marc Alff's avatar
      Bug#35577 (CREATE PROCEDURE causes either crash or syntax error depending on · e73e7bb9
      Marc Alff authored
      build)
      
      The crash was caused by freeing the internal parser stack during the parser
      execution.
      This occured only for complex stored procedures, after reallocating the parser
      stack using my_yyoverflow(), with the following C call stack:
      - MYSQLparse()
      - any rule calling sp_head::restore_lex()
      - lex_end()
      - x_free(lex->yacc_yyss), xfree(lex->yacc_yyvs)
      
      The root cause is the implementation of stored procedures, which breaks the
      assumption from 4.1 that there is only one LEX structure per parser call.
      
      The solution is to separate the LEX structure into:
      - attributes that represent a statement (the current LEX structure),
      - attributes that relate to the syntax parser itself (Yacc_state),
      so that parsing multiple statements in stored programs can create multiple
      LEX structures while not changing the unique Yacc_state.
      
      Now, Yacc_state and the existing Lex_input_stream are aggregated into
      Parser_state, a structure that represent the complete state of the (Lexical +
      Syntax) parser.
      
      
      mysql-test/r/parser_stack.result:
        Bug#35577 (CREATE PROCEDURE causes either crash or syntax error depending on
        build)
      mysql-test/t/parser_stack.test:
        Bug#35577 (CREATE PROCEDURE causes either crash or syntax error depending on
        build)
      sql/sp.cc:
        Bug#35577 (CREATE PROCEDURE causes either crash or syntax error depending on
        build)
      sql/sp_head.cc:
        Bug#35577 (CREATE PROCEDURE causes either crash or syntax error depending on
        build)
      sql/sql_class.cc:
        Bug#35577 (CREATE PROCEDURE causes either crash or syntax error depending on
        build)
      sql/sql_class.h:
        Bug#35577 (CREATE PROCEDURE causes either crash or syntax error depending on
        build)
      sql/sql_lex.cc:
        Bug#35577 (CREATE PROCEDURE causes either crash or syntax error depending on
        build)
      sql/sql_lex.h:
        Bug#35577 (CREATE PROCEDURE causes either crash or syntax error depending on
        build)
      sql/sql_parse.cc:
        Bug#35577 (CREATE PROCEDURE causes either crash or syntax error depending on
        build)
      sql/sql_prepare.cc:
        Bug#35577 (CREATE PROCEDURE causes either crash or syntax error depending on
        build)
      sql/sql_trigger.cc:
        Bug#35577 (CREATE PROCEDURE causes either crash or syntax error depending on
        build)
      sql/sql_view.cc:
        Bug#35577 (CREATE PROCEDURE causes either crash or syntax error depending on
        build)
      sql/sql_yacc.yy:
        Bug#35577 (CREATE PROCEDURE causes either crash or syntax error depending on
        build)
      e73e7bb9
  8. 07 Jul, 2008 1 commit
    • Marc Alff's avatar
      Bug#26030 (Parsing fails for stored routine w/multi-statement execution · c7724872
      Marc Alff authored
      enabled)
      
      Before this fix, the lexer and parser would treat the ';' character as a
      different token (either ';' or END_OF_INPUT), based on convoluted logic,
      which failed in simple cases where a stored procedure is implemented as a
      single statement, and used in a multi query.
      
      With this fix:
      - the character ';' is always parsed as a ';' token in the lexer,
      - parsing multi queries is implemented in the parser, in the 'query:' rules,
      - the value of thd->client_capabilities, which is the capabilities
        negotiated between the client and the server during bootstrap,
        is immutable and not arbitrarily modified during parsing (which was the
        root cause of the bug)
      
      c7724872
  9. 18 Jun, 2008 1 commit
    • Kristofer Pettersson's avatar
      Bug#21226 FLUSH PRIVILEGES does not provided feedback when it fails. · 12db5ab0
      Kristofer Pettersson authored
        
      If during a FLUSH PRIVILEGES the server fails to load the new privilege
      tables, the error message is lost. This patch is a back port from 5.1 which
      adresses this issue by setting the server in an error state if a failure
      occurrs.
        
      This patch also corrects an incorrect variable assignment which might
      cause an error state to be reverted by coincidence.
      
      sql/sql_parse.cc:
        * Set error state if acl_reload or grant_reload fails.
        * Fix bad variable assignment which cancels previous error status.
      12db5ab0
  10. 20 May, 2008 1 commit
    • unknown's avatar
      Bug#27430 "Crash in subquery code when in PS and table DDL changed after · 02c901ee
      unknown authored
       PREPARE", review fixes:
      - make the patch follow the specification of WL#4166 and remove  
      the new error that was originally introduced.
      Now the client never gets an error from reprepare, unless it failed.
      I.e. even if the statement at hand returns a completely different
      result set, this is not considered a server error.
      The C API library, that can not handle this situation, was modified to
      return a client error.
      Added additional test coverage.
      
      
      include/errmsg.h:
        Add a new client side error: now when we automatically
        reprepare a statement, the new result set may contain a different
        number of columns.
      include/mysql_com.h:
        Add a new server status to be sent to the client if the 
        number of columns in the result set is different.
      libmysql/errmsg.c:
        Add a new error message.
      libmysql/libmysql.c:
        Make the client library robust against a result set that
        contains a different number of columns from prepare time.
        Previously that could never happen, and we simply had an assert.
        That means in particular that all clients are advised to upgrade
        with transition to 5.1, if they are using prepared statements C API.
        Make mysql_stmt_store_result() and mysql_stmt_execute() robust against 
        "broken" statement handles (those that have an error).
      sql/sql_parse.cc:
        Clear transient server status flags at start of statement more 
        systematically.
      sql/share/errmsg.txt:
        Remove an error that is unused and is not part of any public release.
      sql/sql_prepare.cc:
        Instead of returning an error in case the number of result set columns
        has changed, simply update the client in server status.
        That will allow modern clients automatically recover from an error.
      tests/mysql_client_test.c:
        Add additional coverage to the cases when the number of result
        set columns changed as a result of reprepare.
        Cover conversion and truncation of result set columns.
      02c901ee
  11. 09 May, 2008 1 commit
    • unknown's avatar
      Bug#35997 Event scheduler seems to let the server crash, if it is embedded. · 3cf9e6eb
      unknown authored
      The event scheduler was not designed to work in embedded mode. This
      patch disables and excludes the event scheduler when the server is
      compiled for embedded build.
      
      
      libmysqld/Makefile.am:
        Reduce the amount of event code in an embedded build.
      mysql-test/t/events_trans.test:
        Disable test if run in embedded mode.
      sql/Makefile.am:
        Introduce definition HAVE_EVENT_SCHEDULER and one new source file.
      sql/event_data_objects.cc:
        Refactor Event_parse_data to new file.
      sql/event_data_objects.h:
        Refactor Event_parse_data to new file.
        Move global definitions to new file.
      sql/event_queue.cc:
        Move all parsed items to Event_parse_data for easier modularization.
      sql/events.cc:
        Move all parsed items to Event_parse_data for easier modularization.
      sql/mysqld.cc:
        Disable the event schedular subsystem if the server is compiled in
        embedded mode.
      sql/set_var.cc:
        Disable the event schedular subsystem if the server is compiled in
        embedded mode.
      sql/set_var.h:
        Disable the event schedular subsystem if the server is compiled in
        embedded mode.
      sql/sql_db.cc:
        Disable the event schedular subsystem if the server is compiled in
        embedded mode.
      sql/sql_parse.cc:
        Disable the event schedular subsystem if the server is compiled in
        embedded mode.
      sql/sql_show.cc:
        Disable the event schedular subsystem if the server is compiled in
        embedded mode.
      sql/sql_test.cc:
        Disable the event schedular subsystem if the server is compiled in
        embedded mode.
      sql/sql_yacc.yy:
        Only include event-code needed for parsing to reduce impact on embedded
        build.
        Move all constants to Event_parse_data class.
      mysql-test/r/events_embedded.result:
        Add test case to make sure the 'event_scheduler' can't be activated
        in embedded mode.
      mysql-test/r/is_embedded.require:
        Add test case to make sure the 'event_scheduler' can't be activated
        in embedded mode.
      mysql-test/t/events_embedded.test:
        Add test case to make sure the 'event_scheduler' can't be activated
        in embedded mode.
      sql/event_parse_data.cc:
        New file. Extracted Event_parse data into a new file.
      sql/event_parse_data.h:
        New file. Extracted Event_parse data into a new file.
      3cf9e6eb
  12. 29 Apr, 2008 1 commit
    • unknown's avatar
      Backport kostja's fix for Bug#32724 "innodb_mysql.test fails randomly". · f4bd5105
      unknown authored
      Enable back the disabled test case.
      
      
      mysql-test/include/mix1.inc:
        Fix a race condition in the test, causing a sporadic failure.
      mysql-test/r/innodb_mysql.result:
        Update test case result.
      mysql-test/t/disabled.def:
        Enable the test case innodb_mysql.
      sql/sql_parse.cc:
        Fix the random failure of innodb_mysql test. The failure is not
        random any more after a patch for Bug 12713 added asserts around
        handler commit.
      f4bd5105
  13. 16 Apr, 2008 1 commit
    • unknown's avatar
      WL#4165 "Prepared statements: validation". · bd2a7328
      unknown authored
      Add metadata validation to ~20 more SQL commands. Make sure that
      these commands actually work in ps-protocol, since until now they
      were enabled, but not carefully tested.
      Fixes the ml003 bug found by Matthias during internal testing of the
      patch.
      
      
      mysql-test/r/ps_ddl.result:
        Update test results (WL#4165)
      mysql-test/t/ps_ddl.test:
        Cover with tests metadata validation of 26 SQL statements.
      sql/mysql_priv.h:
        Fix the name in the comment.
      sql/sp_head.cc:
        Changed the way the observer is removed in case of stored procedures
        to support validation prepare stmt from "call p1(<expr>)": whereas
        tables used in the expression must be validated, substatements
        of p1 must not.
        The previous scheme used to silence the observer only in stored
        functions and triggers.
      sql/sql_class.cc:
        Now the observer is silenced in sp_head::execute(). Remove it from
        Sub_statement_state.
      sql/sql_class.h:
        Now the observer is silenced in sp_head::execute(). Remove it from
        Sub_statement_state.
      sql/sql_parse.cc:
        Add CF_REEXECUTION_FRAGILE to 20 more SQLCOMs that need it.
      sql/sql_prepare.cc:
        Add metadata validation to ~20 new SQLCOMs that need it.
        Fix memory leaks with expressions used in SHOW DATABASES and CALL
        (and prepared statements).
        We need to fix all expressions at prepare, since if these expressions
        use subqueries, there are one-time transformations of the parse
        tree that must be done at prepare. 
        List of fixed commands includes: SHOW TABLES, SHOW DATABASES,
        SHOW TRIGGERS, SHOW EVENTS, SHOW OPEN TABLES,SHOW KEYS, SHOW FIELDS, 
        SHOW COLLATIONS, SHOW CHARSETS, SHOW VARIABLES, SHOW TATUS, SHOW TABLE
        STATUS, SHOW PROCEDURE STATUS, SHOW FUNCTION STATUS, CALL.
        Add comment to set_parameters().
      sql/table.h:
        Update comments.
      bd2a7328
  14. 08 Apr, 2008 2 commits
    • unknown's avatar
      Remove dead code. · 2ca62496
      unknown authored
      sql/sp.h:
        Remove unused code.
      2ca62496
    • unknown's avatar
      Tentative implementation of · a63dde5a
      unknown authored
      WL#4165 Prepared statements: validation 
      WL#4166 Prepared statements: automatic re-prepare
      Fixes
      Bug#27430 Crash in subquery code when in PS and table DDL changed after PREPARE
      Bug#27690 Re-execution of prepared statement after table was replaced with a view crashes
      Bug#27420 A combination of PS and view operations cause error + assertion on shutdown
      
      The basic idea of the patch is to keep track of table metadata between
      prepared statement prepare and execute. If some table used in the statement
      has changed, the prepared statement is re-prepared before execution.
      
      See WL#4165 and WL#4166 contents and comments in the code for details
      of the implementation.
      
      
      include/my_global.h:
        Remove 'register' keyword to avoid warnings when swapping large structures
        that don't fit into a register. Any modern compiler is capable of placing
        a variable in a register when that would benefit performance.
      mysql-test/r/ps_1general.result:
        Update test results: since now we re-prepare automatically,
        more correct results are produced in prepare-ddl-execute scenario.
      mysql-test/r/query_cache_merge.result:
        Ensure that the table definition cache is large enough for
        the test to pass in --ps-protocol
      mysql-test/r/trigger.result:
        Update test results to reflect automatic statement reprepare.
      mysql-test/t/disabled.def:
        Enable ps_ddl.test, which now passes.
      mysql-test/t/ps_1general.test:
        Since now we re-execute prepared statements after DDL successfully,
        change the test to produce repeatable results. Remove expectancy of
        an error in one place where now we automatically reprepare the prepared
        statement.
      mysql-test/t/query_cache_merge.test:
        Ensure the table definition cache is large enough for the test to pass
        in --ps-protocol
      mysql-test/t/trigger.test:
        Sinc
      sql/item.cc:
        Implement Item_param "copy" functionality, used at re-prepare of
        a prepared statement.
        We copy the type of the original parameter, and move the assigned value,
        if any. Sic, the value is "moved", since it can be quite big --
        e.g. in case we deal with a LONG DATA parameter.
        It's essential to move the value from the old parameter since
        at the time of re-prepare the client packet with the necessary information
        may be not available.
      sql/item.h:
        Declare a new method used for reprepare.
      sql/my_decimal.h:
        Implement "swap()" functionality of class my_decimal to be
        able to easily swap two decimal values.
      sql/mysql_priv.h:
        Declare enum_metadata_type.
      sql/mysqld.cc:
        Implement a status variable for the number of reprepared statements.
      sql/sql_base.cc:
        Implement metadata version validation.
      sql/share/errmsg.txt:
        Add two new error messages: ER_NEED_REPREPARE and ER_PS_REBIND.
        The first error (theoretically) never reaches the user.
        It is issued by the metadata validation framework when a metadata version
        has changed between prepare and execute. Later on it's intercepted
        and the statement is automatically re-prepared. Only if the error
        has occurred repeatedly MAX_REPREPARE_ATTEMTS (3) times do we
        return it to the user.
        
        The second error is issued when after re-prepare we discover
        that the metadata we sent over to the client using the binary
        protocol differs drammatically from the new result set metadata 
        that the reprepared statement produces (e.g. number of result
        set columns is different).
      sql/sql_class.cc:
        Implement metadata version validation framework.
      sql/sql_class.h:
        Declarations for metadata version validation framework.
      sql/sql_parse.cc:
        Mark commands for which we must invalidate and reprepare a prepared
        statement when metadata has changed.
      sql/sql_prepare.cc:
        Implement WL#4165 and WL#4166 (limited support of metadata validation
        and re-prepare).
      sql/table.h:
        Implement metadata validation.
      tests/mysql_client_test.c:
        Add a test case for WL#4166
      a63dde5a
  15. 07 Apr, 2008 1 commit
    • unknown's avatar
      A fix for Bug#32724 "innodb_mysql.test fails randomly". · 17ec1c3c
      unknown authored
      Enable back the disabled test case.
      
      
      mysql-test/t/disabled.def:
        Enable the test case innodb_mysql.
      sql/sql_parse.cc:
        Fix the random failure of innodb_mysql test. The failure is not
        random any more after a patch for Bug 12713 added asserts around
        handler commit.
      17ec1c3c
  16. 25 Mar, 2008 1 commit
    • unknown's avatar
      BUG#34789 - drop server/create server leaks memory ! · 811fb145
      unknown authored
      BUG#34790 - 'create server' doesn't handle out of memory scenario
                  well enough
      
      This is an addition to fixes for these bugs, which makes gcov
      happy.
      
      
      mysql-test/r/federated.result:
        CREATE SERVER is only tested by federated_server.test, which requires
        big-test option. Added dummy test case to make gcov happy.
      mysql-test/t/federated.test:
        CREATE SERVER is only tested by federated_server.test, which requires
        big-test option. Added dummy test case to make gcov happy.
      sql/sql_parse.cc:
        Make gcov happy.
      811fb145
  17. 21 Mar, 2008 1 commit
    • unknown's avatar
      Bug #26461: Intrinsic data type bool (1 byte) redefined to BOOL (4 bytes) · cebb6727
      unknown authored
      The bool data type was redefined to BOOL (4 bytes on windows).
      Removed the #define and fixed some of the warnings that were uncovered
      by this.
      Note that the fix also disables 2 warnings :
      4800 : 'type' : forcing value to bool 'true' or 'false' (performance warning)
      4805: 'operation' : unsafe mix of type 'type' and type 'type' in operation
      
      These warnings will be handled in a separate bug, as they are performance related or bogus.
      
      Fixed to int the return type of functions that return more than 
      2 distinct values.
      
      
      CMakeLists.txt:
        Bug #26461: disable the C4800 and C4805 warnings temporarily
      include/config-win.h:
        Bug #26461: 
         - no need for this define for Windows.
         - windows C++ compilers have a bool type
      include/my_global.h:
        Bug #26461: removed bool_defined (no longer needed)
      sql/handler.h:
        Bug #26461: bool functions must return boolean values
      sql/mysql_priv.h:
        Bug #26461: fixed return type of functions that return more than
        2 distinct values.
      sql/procedure.h:
        Bug #26461: fixed return type of functions that return more than
        2 distinct values.
      sql/sql_acl.cc:
        Bug #26461: fixed return type of functions that return more than
        2 distinct values.
      sql/sql_acl.h:
        Bug #26461: fixed return type of functions that return more than
        2 distinct values.
      sql/sql_analyse.cc:
        Bug #26461: fixed return type of functions that return more than
        2 distinct values.
      sql/sql_analyse.h:
        Bug #26461: fixed return type of functions that return more than
        2 distinct values.
      sql/sql_base.cc:
        Bug #26461: fixed return type of functions that return more than
        2 distinct values.
      sql/sql_db.cc:
        Bug #26461: fixed return type of functions that return more than
        2 distinct values.
      sql/sql_delete.cc:
        Bug #26461: fixed return type of functions that return more than
        2 distinct values.
      sql/sql_load.cc:
        Bug #26461: fixed return type of functions that return more than
        2 distinct values.
      sql/sql_parse.cc:
        Bug #26461: fixed return type of functions that return more than
        2 distinct values.
      sql/sql_prepare.cc:
        Bug #26461: fixed return type of functions that return more than
        2 distinct values.
      sql/sql_update.cc:
        Bug #26461: fixed return type of functions that return more than
        2 distinct values.
      cebb6727
  18. 20 Mar, 2008 1 commit
    • unknown's avatar
      BUG#34789 - drop server/create server leaks memory ! · b31a1622
      unknown authored
      When CREATE SERVER is issued, it allocates memory on memory root
      to store cached server structure. When DROP SERVER is issued,
      it doesn't release this memory, as it is impossible with the
      memory root.
      
      We use the same allocation strategy for plugins and acl. The problem
      here that there was no way (except for the server restart) to force
      'servers' code to release this memory.
      
      With this fix it is possible to release unused server cache memory
      by FLUSH PRIVILEGES.
      
      No test case for this fix.
      
      
      sql/sql_parse.cc:
        Reload servers table on FLUSH PRIVILEGES.
      sql/sql_servers.cc:
        Instead of just marking memory blocks as unused, release memory
        used by servers cache and initialize new memory root.
        
        This is needed for FLUSH PRIVILEGES to release unused memory
        blocks.
      b31a1622
  19. 17 Mar, 2008 1 commit
    • unknown's avatar
      Bug#35305: partition_symlink test failures · 166357b5
      unknown authored
      Updated the test due to bug 32167
      
      Corrected spelling of error message
      
      
      mysql-test/r/partition_not_windows.result:
        Updated test result due to test case changes and corrected spelling error
      mysql-test/r/partition_symlink.result:
        Bug#35305: partition_symlink test failure
        
        Updated test result due to test case changes
      mysql-test/r/symlink.result:
        Updated test result due to test case changes and corrected spelling error
      mysql-test/t/disabled.def:
        Bug#35305: partition_symlink test failure
        
        Enable the test after it has been fixed
      mysql-test/t/partition_not_windows.test:
        Removed disable/enable_query_log for better result files
      mysql-test/t/partition_symlink.test:
        Bug#35305: partition_symlink test failure
        
        Changes due to bug 32167
      mysql-test/t/symlink.test:
        using replace_result instead of disable_query_log
      sql/partition_info.cc:
        corrected spelling
      sql/sql_parse.cc:
        corrected spelling
      166357b5
  20. 29 Feb, 2008 2 commits
    • unknown's avatar
      wrong merge fix · 4e7c4ab9
      unknown authored
      4e7c4ab9
    • unknown's avatar
      Bug#32167 another privilege bypass with DATA/INDEX DIRECORY(ver 4.1,5.0) · ab604259
      unknown authored
      added new function test_if_data_home_dir() which checks that
      path does not contain mysql data home directory.
      Using of mysql data home directory in
      DATA DIRECTORY & INDEX DIRECTORY is disallowed.
      
      
      mysql-test/r/symlink.result:
        test result
      mysql-test/t/symlink.test:
        test case
      sql/mysql_priv.h:
        new variable mysql_unpacked_real_data_home
      sql/mysqld.cc:
        new variable mysql_unpacked_real_data_home
      sql/sql_parse.cc:
        added new function test_if_data_home_dir() which checks that
        path does not contain mysql data home directory.
        Using of mysql data home directory in
        DATA DIRECTORY & INDEX DIRECTORY is disallowed.
      ab604259
  21. 28 Feb, 2008 1 commit
    • unknown's avatar
      Bug#32167 another privilege bypass with DATA/INDEX DIRECORY(3rd version for 5.1) · 1af41943
      unknown authored
      added new function test_if_data_home_dir() which checks that
      path does not contain mysql data home directory.
      Using of 'mysql data home'/'any db name' in
      DATA DIRECTORY & INDEX DIRECTORY is disallowed
      
      
      mysql-test/r/partition.result:
        test result
      mysql-test/r/partition_not_windows.result:
        result fix
      mysql-test/r/partition_symlink.result:
        result fix
      mysql-test/r/symlink.result:
        test result update
      mysql-test/t/partition.test:
        test case
      mysql-test/t/partition_not_windows.test:
        test case update
      mysql-test/t/partition_symlink.test:
        test case update
      mysql-test/t/symlink.test:
        test case
      sql/mysql_priv.h:
        new variable mysql_unpacked_real_data_home
      sql/mysqld.cc:
        new variable mysql_unpacked_real_data_home
      sql/partition_info.cc:
        new check_partition_dirs() which checks
        data directory and index directory for partition elements
      sql/partition_info.h:
        new check_partition_dirs() which checks
        data directory and index directory for partition elements
      sql/sql_parse.cc:
        added new function test_if_data_home_dir() which checks that
        path does not contain mysql data home directory.
        Using of 'mysql data home'/'any db name' in
        DATA DIRECTORY & INDEX DIRECTORY is disallowed
      1af41943
  22. 24 Feb, 2008 1 commit
    • unknown's avatar
      Bug#32757: hang with sql_mode set when setting some global variables · 9bd3b854
      unknown authored
      If setting a system-variable provided by a plug-in failed, no OK or
      error was sent in some cases, hanging the client. We now send an error
      in the case from the ticket (integer-argument out of range in STRICT
      mode). We also provide a semi-generic fallback message for possible
      future cases like this where an error is signalled, but no message is
      sent to the client. The error/warning handling is unified so it's the
      same again for variables provided by plugins and those in the server
      proper.
      
      
      mysql-test/r/plugin.result:
        show that on out-of-range values, plugin interface throws errors
        in STRICT mode and warnings otherwise.
      mysql-test/t/plugin.test:
        show that on out-of-range values, plugin interface throws errors
        in STRICT mode and warnings otherwise.
      sql/set_var.cc:
        - handle signedness of values used in warnings
        - in STRICT mode, throw errors rather than warnings
      sql/sql_parse.cc:
        If sql_set_variables() returns with an error but no message
        was sent to the client, send a semi-generic one so the session
        won't hang and we won't fail silently.
      sql/sql_plugin.cc:
        throw a warning if more than just block-size was corrected
        (or an error in STRICT mode). use functions from set_var
        for uniform behaviour of server- and plug-in variables.
      storage/example/ha_example.cc:
        Add a ULONG system variable to example plugin so
        we can test integers in the plugin-interface without
        having to depend on the presence of innobase.
      9bd3b854
  23. 22 Feb, 2008 2 commits
    • unknown's avatar
      Bug #34053: normal users can enable innodb_monitor logging · 482d6008
      unknown authored
      The check_global_access() function was made available to InnoDB, but
      was not defined in the embedded server library.  InnoDB, as a plugin,
      is not recompiled when the embedded server is built.  This caused a
      link failure when compiling applications which use the embedded server.
      
      The fix here is to always define check_global_access() externally; in
      the embedded server case, it is defined to just return OK.
      
      Also, don't run the test case for this bug in embedded server.
      
      
      mysql-test/t/innodb_bug34053.test:
        Disable this test on embedded server - it tests privilege
        checks which are not in place there.
      sql/mysql_priv.h:
        Since check_global_access() may be used from some storage engine plugins
        (InnoDB, currently), and the plugins are not recompiled for the embedded
        server, it must be defined externally even for NO_EMBEDDED_ACCESS_CHECKS.
      sql/sql_parse.cc:
        Since check_global_access() may be used from some storage engine plugins
        (InnoDB, currently), and the plugins are not recompiled for the embedded
        server, it must be defined externally even for NO_EMBEDDED_ACCESS_CHECKS.
      482d6008
    • unknown's avatar
      Fix for Bug#30217: Views: changes in metadata behaviour · a3e83048
      unknown authored
      between 5.0 and 5.1.
        
      The problem was that in the patch for Bug#11986 it was decided
      to store original query in UTF8 encoding for the INFORMATION_SCHEMA.
      This approach however turned out to be quite difficult to implement
      properly. The main problem is to preserve the same IS-output after
      dump/restore.
        
      So, the fix is to rollback to the previous functionality, but also
      to fix it to support multi-character-set-queries properly. The idea
      is to generate INFORMATION_SCHEMA-query from the item-tree after
      parsing view declaration. The IS-query should:
        - be completely in UTF8;
        - not contain character set introducers.
        
      For more information, see WL4052.
      
      
      mysql-test/include/ddl_i18n.check_views.inc:
        Add a test case for Bug#30217.
      mysql-test/r/ddl_i18n_koi8r.result:
        Update result file.
      mysql-test/r/ddl_i18n_utf8.result:
        Update result file.
      mysql-test/r/information_schema.result:
        Update result file.
      mysql-test/r/information_schema_db.result:
        Update result file.
      mysql-test/r/mysqldump.result:
        Update result file.
      mysql-test/r/show_check.result:
        Update result file.
      mysql-test/t/ddl_i18n_koi8r.test:
        Add a test case for Bug#30217.
      mysql-test/t/ddl_i18n_utf8.test:
        Add a test case for Bug#30217.
      mysql-test/t/mysqldump.test:
        Add a test case for Bug#30217.
      sql/ha_ndbcluster.cc:
        Add a parameter to print().
      sql/item.cc:
        1. Add a parameter to print().
        2. Item_string::print():
              - Do not append character set introducer to the text literal
                if we're building a query for INFORMATION_SCHEMA;
              - Convert text literal to UTF8 if we're building a query
                for INFORMATION_SCHEMA.
      sql/item.h:
        Add a parameter to print().
      sql/item_cmpfunc.cc:
        Add a parameter to print().
      sql/item_cmpfunc.h:
        Add a parameter to print().
      sql/item_func.cc:
        Add a parameter to print().
      sql/item_func.h:
        Add a parameter to print().
      sql/item_geofunc.h:
        Add a parameter to print().
      sql/item_row.cc:
        Add a parameter to print().
      sql/item_row.h:
        Add a parameter to print().
      sql/item_strfunc.cc:
        Add a parameter to print().
      sql/item_strfunc.h:
        Add a parameter to print().
      sql/item_subselect.cc:
        Add a parameter to print().
      sql/item_subselect.h:
        Add a parameter to print().
      sql/item_sum.cc:
        Add a parameter to print().
      sql/item_sum.h:
        Add a parameter to print().
      sql/item_timefunc.cc:
        Add a parameter to print().
      sql/item_timefunc.h:
        Add a parameter to print().
      sql/mysql_priv.h:
        Add a parameter to print().
      sql/sp_head.cc:
        Add a parameter to print().
      sql/sql_lex.cc:
        Add a parameter to print().
      sql/sql_lex.h:
        Add a parameter to print().
      sql/sql_parse.cc:
        Add a parameter to print().
      sql/sql_select.cc:
        Add a parameter to print().
      sql/sql_show.cc:
        Add a parameter to print().
      sql/sql_test.cc:
        Add a parameter to print().
      sql/sql_view.cc:
        Build INFORMATION_SCHEMA query from Item-tree.
      sql/sql_yacc.yy:
        Build INFORMATION_SCHEMA query from Item-tree.
      sql/table.h:
        Add a parameter to print().
      a3e83048
  24. 21 Feb, 2008 1 commit
    • unknown's avatar
      Fix for Bug#33065: Mysql not writing general query logs after · d8c8fd5b
      unknown authored
      sending SIGHUP.
      
      There were two problems:
        - after some recent fix, the server started to crash after
          receiving SIGHUP. That happened because LEX of new THD-object
          was not properly initialized.
        - user-specified log options were ignored when logs were reopened.
      
      The fix is to 1) initialize LEX and 2) take user-specified options
      into account.
      
      There is no test case in this CS, because our test suite does not
      support sending SIGHUP to the server.
      
      
      sql/mysqld.cc:
        Use proper logging after SIGHUP.
      sql/sql_parse.cc:
        Initialize LEX of new THD -- it is required to avoid crash
        in SIGHUP handling.
      d8c8fd5b
  25. 19 Feb, 2008 4 commits
    • unknown's avatar
    • unknown's avatar
      Rename send_ok to my_ok. Similarly to my_error, it only records the status, · 14021c96
      unknown authored
      does not send it to the client.
      
      
      14021c96
    • unknown's avatar
      A fix and a test case for Bug#12713 "Error in a stored function called from · 526798db
      unknown authored
      a SELECT doesn't cause ROLLBACK of statem".
      
      The idea of the fix is to ensure that we always commit the current
      statement at the end of dispatch_command(). In order to not issue
      redundant disc syncs, an optimization of the two-phase commit
      protocol is implemented to bypass the two phase commit if
      the transaction is read-only.
      
      
      mysql-test/suite/binlog/r/binlog_row_mix_innodb_myisam.result:
        Update test results.
      mysql-test/suite/binlog/r/binlog_stm_mix_innodb_myisam.result:
        Update test results.
      mysql-test/suite/rpl_ndb/t/disabled.def:
        Disable the tests, for which this changeset reveals a bug:
        the injector thread does not always add 'statement commit' to the
        rows injected in circular replication set up.
        To be investigated separately.
      sql/ha_ndbcluster_binlog.cc:
        Add close_thread_tables() to run_query: this ensures
        that all tables are closed and there is no pending statement transaction.
      sql/handler.cc:
        Implement optimisation of read-only transactions.
        If a transaction consists only of DML statements that do not change
        data, we do not perform a two-phase commit for it 
        (run one phase commit only).
      sql/handler.h:
        Implement optimisation of read-only transactions.
        If a transaction consists only of DML statements that do not change
        data, we do not perform a two-phase commit for it 
        (run one phase commit only).
      sql/log.cc:
        Mark the binlog transaction read-write whenever it's started.
        We never read from binlog, so it's safe and least intrusive to add
        this mark up here.
      sql/log_event.cc:
        Update to the new layout of thd->transaction.
      sql/rpl_injector.cc:
        Always commit statement transaction before committing the global one.
      sql/sp.cc:
        Ad comments.
      sql/sp_head.cc:
        Add comments.
      sql/sql_base.cc:
        Commit transaction at the end of the statement. Always.
      sql/sql_class.cc:
        Update thd_ha_data to return the right pointer in the new layout.
        
        Fix select_dumpvar::send_data to properly return operation status.
        A test case from commit.inc would lead to an assertion failure in the 
        diagnostics area (double assignment). Not test otherwise by the test suite.
      sql/sql_class.h:
        Implement a new layout of storage engine transaction info in which 
        it is easy to access all members related to the handlerton only
        based on ht->slot.
      sql/sql_cursor.cc:
        Update to the new layout of thd->transaction.
      sql/sql_delete.cc:
        Remove wrong and now redundant calls to ha_autocommit_or_rollback.
        The transaction is committed in one place, at the end of the statement.
        Remove calls to mysql_unlock_tables, since some engines count locks
        and commit statement transaction in unlock_tables(), which essentially
        equates mysql_unlock_tables to ha_autocommit_or_rollback.
        Previously it was necessary to unlock tables soon because we wanted
        to avoid sending of 'ok' packet to the client under locked tables.
        This is no longer necessary, since OK packet is also sent from one place
        at the end of transaction.
      sql/sql_do.cc:
        Add DO always clears the error, we must rollback the current
        statement before this happens. Otherwise the statement will be committed,
        and not rolled back in the end.
      sql/sql_insert.cc:
        Remove wrong and now redundant calls to ha_autocommit_or_rollback.
        The transaction is committed in one place, at the end of the statement.
        Remove calls to mysql_unlock_tables, since some engines count locks
        and commit statement transaction in unlock_tables(), which essentially
        equates mysql_unlock_tables to ha_autocommit_or_rollback.
        Previously it was necessary to unlock tables soon because we wanted
        to avoid sending of 'ok' packet to the client under locked tables.
        This is no longer necessary, since OK packet is also sent from one place
        at the end of transaction.
      sql/sql_load.cc:
        Remove wrong and now redundant calls to ha_autocommit_or_rollback.
        The transaction is committed in one place, at the end of the statement.
        Remove calls to mysql_unlock_tables, since some engines count locks
        and commit statement transaction in unlock_tables(), which essentially
        equates mysql_unlock_tables to ha_autocommit_or_rollback.
        Previously it was necessary to unlock tables soon because we wanted
        to avoid sending of 'ok' packet to the client under locked tables.
        This is no longer necessary, since OK packet is also sent from one place
        at the end of transaction.
      sql/sql_parse.cc:
        Implement optimisation of read-only transactions: bypass 2-phase
        commit for them.
        Always commit statement transaction before commiting the global one.
        Fix an unrelated crash in check_table_access, when called from 
        information_schema.
      sql/sql_partition.cc:
        Partitions commit at the end of a DDL operation.
        Make sure that send_ok() is done only if the commit has succeeded.
      sql/sql_table.cc:
        Use ha_autocommit_or_rollback and end_active_trans everywhere.
        Add end_trans to mysql_admin_table, so that it leaves no pending
        transaction.
      sql/sql_udf.cc:
        Remvove a redundant call to close_thread_tables()
      sql/sql_update.cc:
        Remove wrong and now redundant calls to ha_autocommit_or_rollback.
        The transaction is committed in one place, at the end of the statement.
        Remove calls to mysql_unlock_tables, since some engines count locks
        and commit statement transaction in unlock_tables(), which essentially
        equates mysql_unlock_tables to ha_autocommit_or_rollback.
        Previously it was necessary to unlock tables soon because we wanted
        to avoid sending of 'ok' packet to the client under locked tables.
        This is no longer necessary, since OK packet is also sent from one place
        at the end of transaction.
      mysql-test/include/commit.inc:
        New BitKeeper file ``mysql-test/include/commit.inc''
      mysql-test/r/commit_1innodb.result:
        New BitKeeper file ``mysql-test/r/commit_1innodb.result''
      mysql-test/t/commit_1innodb.test:
        New BitKeeper file ``mysql-test/t/commit_1innodb.test''
      526798db
    • unknown's avatar
      Bug#31745 - crash handler does not work on Windows · 721d2412
      unknown authored
      - Replace per-thread signal()'s with  SetUnhandledExceptionFilter(). 
        The only remaining signal() is for SIGABRT (default abort()
        handler in VS2005 is broken, i.e removes user exception filter)
      - remove MessageBox()'es  from error handling code
      - Windows port for print_stacktrace() and write_core() 
      - Cleanup, removed some unused functions
      
      
      sql/CMakeLists.txt:
        Implement stack tracing on and generating crash dumps on Windows
      sql/mysqld.cc:
        Correct signal handling on Windows. 
        - For console events, like CTRL-C use SetConsoleCtrlHandler
        - For exceptions like access violation, use SetUnhandledExceptionFilter
        - For SIGABRT generate exception via __debugbreak() intrinsic
          if built with VS2005 and later , since default SIGABRT handler 
          replaces unhandled exception filter specified by user
        - make provisions to debug exception filter, as it is not trivial 
        (should be compiled with /DDEBUG_UNHANDLED_EXCEPTION_FILTER)
      sql/sql_parse.cc:
        Remove message box from windows signal handler.
        The only thread specific handler left is for SIGABRT,
        which is broken on VS2005 and later (user specified unhandled exception 
        filter gets overwritten)
      sql/stacktrace.c:
        Stack tracing and generating crash dumps on Windows
      sql/stacktrace.h:
        Implement print_stacktrace and write_core on Windows
      721d2412
  26. 06 Feb, 2008 1 commit
    • unknown's avatar
      Bug#32710: SHOW INNODB STATUS requires SUPER · 3616b913
      unknown authored
      Changed "SHOW ENGINE ... STATUS" and "SHOW ENGINE ... MUTEX"
      to require the PROCESS privilege, instead of SUPER.
      
      Fixed by Damien Katz
      
      
      mysql-test/r/show_check.result:
        Add test case result for Bug#32710
      mysql-test/t/show_check.test:
        Add test case for Bug#32710
      sql/sql_parse.cc:
        Require PROCESS privilege instead of SUPER.
      3616b913
  27. 30 Jan, 2008 1 commit
    • unknown's avatar
      A fix and a test case for Bug#34166 Server crash in SHOW OPEN TABLES and · 39509d64
      unknown authored
      pre-locking.
      
      The crash was caused by an implicit assumption in check_table_access() that
      table_list parameter is always a part of lex->query_tables.
      
      When iterating over the passed list of tables, check_table_access() used
      to stop only when lex->query_tables_last_not_own was reached. 
      In case of pre-locking, lex->query_tables_last_own is not NULL and points
      to some element of lex->query_tables. When the parameter
      of check_table_access() was not part of lex->query_tables, loop invariant
      could never be violated and a crash would happen when the current table
      pointer would point beyond the end of the provided list.
      
      The fix is to change the signature of check_table_access() to also accept
      a numeric limit of loop iterations, similarly to check_grant(), and 
      supply this limit in all places when we want to check access of tables
      that are outside lex->query_tables, or just want to check access to one table.
      
      
      mysql-test/r/information_schema.result:
        Update test results (Bug#34166).
      mysql-test/t/information_schema.test:
        Add a test case for Bug#34166.
      sql/mysql_priv.h:
        Change signature of check_table_access() to accept a numeric limit
        of tables to check.
      sql/sp_head.cc:
        Update to the new signature of check_table_access().
      sql/sql_acl.cc:
        Improve code clarity: if there is a numeric limit, we should not need
        to look at first_not_own_table.
      sql/sql_base.cc:
        Update to the new signature of check_table_access().
      sql/sql_cache.cc:
        Update to the new signature of check_table_access().
      sql/sql_parse.cc:
        Update to the new signature of check_table_access().
        Change check_table_access() to accept an optional numeric limit of tables
        to check. A crash would happen when check_table_access() was
        passed a list of tables that is not part of lex->query_tables and
        lex->query_tables_last_own was not NULL.
      sql/sql_plugin.cc:
        Update to the new signature of check_table_access().
      sql/sql_prepare.cc:
        Update to the new signature of check_table_access().
      sql/sql_show.cc:
        Update to the new signature of check_table_access().
        Ensure that check_table_access() only checks access to the first
        table in the table list when called from list_open_tables().
        list_open_tables() supplies a table list that is created on stack,
        whereas check_table_access() used to assume that the supplied list is a part
        of thd->lex.
      sql/sql_trigger.cc:
        Update to the new signature of check_table_access().
      sql/sql_view.cc:
        Update to the new signature of check_table_access().
      39509d64
  28. 29 Jan, 2008 1 commit
    • unknown's avatar
      BUG#26489 Corruption in relay logs · 5a039fa2
      unknown authored
      Here is the scenario that causes the failure.(by Mats)
      
      1. The to-be corrupt log event (let's call it X), is split into two
         packets B and C on the network level (net_write_buff()). The parts
         are X = (x',x''). The part x' ends up in packet B and part x''
         ends up in packet C. Prior to the corrupt event X, the event Y has
         been written successfully, but has been split into two packets as
         well, which we call (y',y'').
      2. The master sends packet A = (y'',x') to the slave, increases the
         packet sequence number, the slave receives the packet, but fails
         to reply before the master gets a timeout.
      3. Since the master got a timeout, it reports failure, and aborts
         sending the binary log by exiting mysql_binlog_send(). However, it
         leaves the buffer intact, still holding y'' (but not x', since the
         write_pos is not increased).
      4. After exiting mysql_binlog_send(), the master does a
         disconnection of the client thread, which involves sending an
         error message e to the client (i.e., the slave).
      5. In this case, net_write_buff() is used again, but this time the
         old contents of the packet is used so that the new packet is
         D = (y'',e). Note that this will use a new packet sequence number,
         since the packet number was increased in step 2.
      6. The slave receives the tail y'' of the Y log event, concatenates
         this with x' (which it already received), and writes the event
         (x',y'') it to the relay log since it hasn't noticed anything is
         amiss.
      7. It then tries to read more bytes, which is either e (if the length
         given for X just happened to match the length given for Y, or just
         plain garbage because the slave is out of sync with what is
         actually sent.
      8. After a while, the SQL thread tries to execute the event (x',y''),
         which is very likely to be just nonsense.
      
      The problem can be fixed by not resetting net->error after the call of 
      mysql_binlog_send, so the error message will not be sent and the connection
      will be closed.
      
      
      sql/sql_parse.cc:
        Do not reset net->error, if net->error == 2, we should not try to use the connection again
      5a039fa2
  29. 13 Dec, 2007 1 commit
  30. 12 Dec, 2007 2 commits
    • unknown's avatar
      Bug#32395 Alter table under a impending global read lock causes a server crash · e5a397e2
      unknown authored
      The problem is that some DDL statements (ALTER TABLE, CREATE
      TRIGGER, FLUSH TABLES, ...) when under LOCK TABLES need to
      momentarily drop the lock, reopen the table and grab the write
      lock again (using reopen_tables). When grabbing the lock again,
      reopen_tables doesn't pass a flag to mysql_lock_tables in
      order to ignore the impending global read lock, which causes a
      assertion because LOCK_open is being hold. Also dropping the
      lock must not signal to any threads that the table has been
      relinquished (related to the locking/flushing protocol).
      
      The solution is to correct the way the table is reopenned
      and the locks grabbed. When reopening the table and under
      LOCK TABLES, the table version should be set to 0 so other
      threads have to wait for the table. When grabbing the lock,
      any other flush should be ignored because it's theoretically
      a atomic operation. The chosen solution also fixes a potential
      discrepancy between binlog and GRL (global read lock) because
      table placeholders were being ignored, now a FLUSH TABLES WITH
      READ LOCK will properly for table with open placeholders.
      
      It's also important to mention that this patch doesn't fix
      a potential deadlock if one uses two GRLs under LOCK TABLES
      concurrently.
      
      
      mysql-test/r/lock_multi.result:
        Add test case result for Bug#32395
      mysql-test/r/trigger_notembedded.result:
        Add test case result for Bug#32395
      mysql-test/t/lock_multi.test:
        Add test case for Bug#32395
      mysql-test/t/trigger_notembedded.test:
        Enable test case for Bug#32395
      sql/ha_ndbcluster.cc:
        Update close_cached_tables usage.
      sql/ha_ndbcluster_binlog.cc:
        Update close_cached_tables usage.
      sql/mysql_priv.h:
        Update close_cache_tables prototype.
      sql/set_var.cc:
        Update close_cached_tables usage and set flag to wait for
        tables with placeholders. This is one of the places where
        a GRL can be obtained.
      sql/sql_base.cc:
        Preserve old version for write locked tables and ignore
        pending flushes and update close_cache_tables to take
        into account name locked tables.
      sql/sql_parse.cc:
        Update close_cached_tables usage and pass flag so that
        name locked tables are waited for.
      sql/sql_table.cc:
        Protect the table against a impending GRL if under LOCK TABLES.
      e5a397e2
    • unknown's avatar
      Bug#12713 "Error in a stored function called from a SELECT doesn't · 2a0d2fef
      unknown authored
      cause ROLLBACK of statement", part 1. Review fixes.
      
      Do not send OK/EOF packets to the client until we reached the end of 
      the current statement.
      This is a consolidation, to keep the functionality that is shared by all 
      SQL statements in one place in the server.
      Currently this functionality includes:
      - close_thread_tables()
      - log_slow_statement().
      
      After this patch and the subsequent patch for Bug#12713, it shall also include:
      - ha_autocommit_or_rollback()
      - net_end_statement()
      - query_cache_end_of_result().
      
      In future it may also include:
      - mysql_reset_thd_for_next_command().
      
      
      include/mysql_com.h:
        Rename now unused members of NET: no_send_ok, no_send_error, report_error.
        These were server-specific variables related to the client/server
        protocol. They have been made obsolete by this patch.
        
        Previously the same members of NET were used to store the error message
        both on the client and on the server. 
        The error message was stored in net.last_error (client: mysql->net.last_error,
        server: thd->net.last_error).
        The error code was stored in net.last_errno (client: mysql->net.last_errno,
        server: thd->net.last_errno).
        The server error code and message are now stored elsewhere 
        (in the Diagnostics_area), thus NET members are no longer used by the
        server.
        Rename last_error to client_last_error, last_errno to client_last_errno
        to avoid potential bugs introduced by merges.
      include/mysql_h.ic:
        Update the ABI file to reflect a rename. 
        Renames do not break the binary compatibility.
      libmysql/libmysql.c:
        Rename last_error to client_last_error, last_errno to client_last_errno.
        This is necessary to ensure no unnoticed bugs introduced by merged
        changesets.
        
        Remove net.report_error, net.no_send_ok, net.no_send_error.
      libmysql/manager.c:
        Rename net.last_errno to net.client_last_errno.
      libmysqld/lib_sql.cc:
        Rename net.last_errno to net.client_last_errno.
        
        Update the embedded implementation of the client-server protocol to
        reflect the refactoring of protocol.cc.
      libmysqld/libmysqld.c:
        Rename net.last_errno to net.client_last_errno.
      mysql-test/r/events.result:
        Update to reflect the change in mysql_rm_db(). Now we drop stored
        routines and events for a given database name only if there
        is a directory for this database name. ha_drop_database() and
        query_cache_invalidate() are called likewise. 
        Previously we would attempt to drop routines/events even if database
        directory was not found (it worked, since routines and events are stored
        in tables). This fixes Bug 29958 "Weird message on DROP DATABASE if mysql.proc
        does not exist".
        The change was done because the previous code used to call send_ok()
        twice, which led to an assertion failure when asserts against it were
        added by this patch.
      mysql-test/r/grant.result:
        Fix the patch for Bug 16470, now FLUSH PRIVILEGES produces an error 
        if mysql.procs_priv is missing.
        This fixes the assert that send_ok() must not called after send_error()
        (the original patch for Bug 16470 was prone to this).
      mysql-test/suite/rpl/r/rpl_row_tabledefs_2myisam.result:
        Produce a more detailed error message.
      mysql-test/suite/rpl/r/rpl_row_tabledefs_3innodb.result:
        Produce a more detailed error message.
      mysql-test/t/grant.test:
        Update the test, now FLUSH PRIVILEGES returns an error if mysql.procs_priv
        is missing.
      server-tools/instance-manager/mysql_connection.cc:
        Rename net.last_errno to net.client_last_errno.
      sql/ha_ndbcluster_binlog.cc:
        Add asserts. 
        
        Use getters to access statement status information.
        
        Add a comment why run_query() is broken. Reset the diagnostics area
        in the end of run_query() to fulfill the invariant that the diagnostics_area
        is never assigned twice per statement (see the comment in the code
        when this can happen). We still do not clear thd->is_fatal_error and
        thd->is_slave_error, which may lead to bugs, I consider the whole affair
        as something to be dealt with separately.
      sql/ha_partition.cc:
        fatal_error() doesn't set an error by itself. Perhaps we should
        remove this method altogether and instead add a flag to my_error 
        to set thd->is_fatal_error property.
        
        Meanwhile, this change is a part of inspection made to the entire source
        code with the goal to ensure that fatal_error()
        is always accompanied by my_error().
      sql/item_func.cc:
        There is no net.last_error anymore. Remove the obsolete assignment.
      sql/log_event.cc:
        Use getters to access statement error status information.
      sql/log_event_old.cc:
        Use getters to access statement error status information.
      sql/mysqld.cc:
        Previously, if a continue handler for an error was found, my_message_sql() 
        would not set an error in THD. Since the current statement
        must be aborted in any case, find_handler() had a hack to assign 
        thd->net.report_error to 1.
        
        Remove this hack. Set an error in my_message_sql() even if the continue
        handler is found. The error will be cleared anyway when the handler
        is executed. This is one action among many in this patch to ensure the 
        invariant that whenever thd->is_error() is TRUE, we have a message in 
        thd->main_da.message().
      sql/net_serv.cc:
        Use a full-blown my_error() in net_serv.cc to report an error,
        instead of just setting net->last_errno. This ensures the invariant that
        whenever thd->is_error() returns TRUE, we have a message in 
        thd->main_da.message().
        
        Remove initialization of removed NET members.
      sql/opt_range.cc:
        Use my_error() instead of just raising thd->net.report_error. 
        This ensures the invariant that whenever thd->is_error() returns TRUE, 
        there is a message in thd->main_da.message().
      sql/opt_sum.cc:
        Move invocation of fatal_error() right next to the place where
        we set the error message. That makes it easier to track that whenever
        fatal_error() is called, there is a message in THD.
      sql/protocol.cc:
        Rename send_ok() and send_eof() to net_send_ok() and net_send_eof() 
        respectively. These functions write directly to the network and are not 
        for use anywhere outside the client/server protocol code. 
        
        Remove the code that was responsible for cases when either there is 
        no error code, or no error message, or both.
        Instead the calling code ensures that they are always present. Asserts
        are added to enforce the invariant.
        
        Instead of a direct access to thd->server_status and thd->total_warn_count
        use function parameters, since these from now on don't always come directly
        from THD.
        
        Introduce net_end_statement(), the single-entry-point replacement API for 
        send_ok(), send_eof() and net_send_error().
        
        Implement Protocol::end_partial_result_set to use in select_send::abort()
        when there is a continue handler.
      sql/protocol.h:
        Update declarations.
      sql/repl_failsafe.cc:
        Use getters to access statement status information in THD.
        Rename net.last_error to net.client_last_error.
      sql/rpl_record.cc:
        Set an error message in prepare_record() if there is no default
        value for the field -- later we do print this message to the client.
      sql/rpl_rli.cc:
        Use getters to access statement status information in THD.
      sql/slave.cc:
        In create_table_from_dump() (a common function that is used in 
        LOAD MASTER TABLE SQL statement and COM_LOAD_MASTER_DATA), instead of hacks
        with no_send_ok, clear the diagnostics area when mysql_rm_table() succeeded.
        
        Update has_temporary_error() to work correctly when no error is set.
        This is the case when Incident_log_event is executed: it always returns
        an error but does not set an error message.
        
        Use getters to access error status information.
      sql/sp_head.cc:
        Instead of hacks with no_send_error, work through the diagnostics area 
        interface to suppress sending of OK/ERROR packets to the client.
        
        Move query_cache_end_of_result before log_slow_statement(), similarly
        to how it's done in dispatch_command().
      sql/sp_rcontext.cc:
        Remove hacks with assignment of thd->net.report_error, they are not
        necessary any more (see the changes in mysqld.cc).
      sql/sql_acl.cc:
        Use getters to access error status information in THD.
      sql/sql_base.cc:
        Access thd->main_da.sql_errno() only if there is an error. This fixes
        a bug when auto-discovery, that was effectively disabled under pre-locking.
      sql/sql_binlog.cc:
        Remove hacks with no_send_ok/no_send_error, they are not necessary 
        anymore: the caller is responsible for network communication.
      sql/sql_cache.cc:
        Disable sending of OK/ERROR/EOF packet in the end of dispatch_command
        if the response has been served from the query cache. This raises the 
        question whether we should store EOF packet in the query cache at all,
        or generate it anew for each statement (we should generate it anew), but
        this is to be addressed separately.
      sql/sql_class.cc:
        Implement class Diagnostics_area. Please see comments in sql_class.h
        for details.
        
        Fix a subtle coding mistake in select_send::send_data: when on slave, 
        an error in Item::send() was ignored.
        The problem became visible due to asserts that the diagnostics area is
        never double assigned.
        
        Remove initialization of removed NET members.
        
        In select_send::abort() do not call select_send::send_eof(). This is
        not inheritance-safe. Even if a stored procedure continue handler is
        found, the current statement is aborted, not succeeded.
        Instead introduce a Protocol API to send the required response, 
        Protocol::end_partial_result_set().
        
        This simplifies implementation of select_send::send_eof(). No need
        to add more asserts that there is no error, there is an assert inside
        Diagnostics_area::set_ok_status() already.
        
        Leave no trace of no_send_* in the code.
      sql/sql_class.h:
        Declare class Diagnostics_area. 
        
        Remove the hack with no_send_ok from
        Substatement_state.
        
        Provide inline implementations of send_ok/send_eof.
        
        Add commetns.
      sql/sql_connect.cc:
        Remove hacks with no_send_error. 
        
        Since now an error in THD is always set if net->error, it's not necessary
        to check both net->error and thd->is_error() in the do_command loop.
        
        Use thd->main_da.message() instead of net->last_errno.
        
        Remove the hack with is_slave_error in sys_init_connect. Since now we do not
        reset the diagnostics area in net_send_error (it's reset at the beginning
        of the next statement), we can access it safely even after 
        execute_init_command.
      sql/sql_db.cc:
        Update the code to satisfy the invariant that the diagnostics area is never
        assigned twice.
        Incidentally, this fixes Bug 29958 "Weird message on DROP DATABASE if 
        mysql.proc does not exist".
      sql/sql_delete.cc:
        Change multi-delete to abort in abort(), as per select_send protocol.
        Fixes the merge error with the test for Bug 29136
      sql/sql_derived.cc:
        Use getters to access error information.
      sql/sql_insert.cc:
        Use getters to access error information.
      sql-common/client.c:
        Rename last_error to client_last_error, last_errno to client_last_errno.
      sql/sql_parse.cc:
        Remove hacks with no_send_error. Deploy net_end_statement().
        
        The story of COM_SHUTDOWN is interesting. Long story short, the server 
        would become on its death's door, and only no_send_ok/no_send_error assigned
        by send_ok()/net_send_error() would hide its babbling from the client.
        
        First of all, COM_QUIT does not require a response. So, the comment saying
        "Let's send a response to possible COM_QUIT" is not only groundless 
        (even mysqladmin shutdown/mysql_shutdown() doesn't send COM_QUIT after 
        COM_SHUTDOWN), it's plainly incorrect.
        
        Secondly, besides this additional 'OK' packet to respond to a hypothetical
        COM_QUIT, there was the following code in dispatch_command():
        
        if (thd->killed)
          thd->send_kill_message();
        if (thd->is_error()
          net_send_error(thd);
        
        This worked out really funny for the thread through which COM_SHUTDOWN
        was delivered: we would get COM_SHUTDOWN, say okay, say okay again, 
        kill everybody, get the kill signal ourselves, and then attempt to say 
        "Server shutdown in progress" to the client that is very likely long gone.
        
        This all became visible when asserts were added that the Diagnostics_area
        is not assigned twice.
        
        Move query_cache_end_of_result() to the end of dispatch_command(), since
        net_send_eof() has been moved there. This is safe, query_cache_end_of_result()
        is a no-op if there is no started query in the cache.
        
        Consistently use select_send interface to call abort() or send_eof()
        depending on the operation result.
        
        Remove thd->fatal_error() from reset_master(), it was a no-op. 
        in hacks with no_send_error woudl save us
        from complete breakage of the client/server protocol.
        
        Consistently use select_send::abort() whenever there is an error, 
        and select_send::send_eof() in case of success.
        The issue became visible due to added asserts.
      sql/sql_partition.cc:
        Always set an error in THD whenever there is a call to fatal_error().
      sql/sql_prepare.cc:
        Deploy class Diagnostics_area.
        Remove the unnecessary juggling with the protocol in 
        Select_fetch_protocol_binary::send_eof(). EOF packet format is 
        protocol-independent.
      sql/sql_select.cc:
        Call fatal_error() directly in opt_sum_query.
        Call my_error() whenever we call thd->fatal_error().
      sql/sql_servers.cc:
        Use getters to access error information in THD.
      sql/sql_show.cc:
        Use getters to access error information in THD.
        
        Add comments.
        
        Call my_error() whenever we call fatal_error().
      sql/sql_table.cc:
        Replace hacks with no_send_ok with the interface of the diagnostics area.
        
        Clear the error if ENOENT error in ha_delete_table().
      sql/sql_update.cc:
        Introduce multi_update::abort(), which is the proper way to abort a
        multi-update. This fixes the merge conflict between this patch and
        the patch for Bug 29136.
      sql/table.cc:
        Use a getter to access error information in THD.
      sql/tztime.cc:
        Use a getter to access error information in THD.
      2a0d2fef
  31. 07 Dec, 2007 2 commits
    • unknown's avatar
      Bug #27440 read_only allows create and drop database · 5826a5c4
      unknown authored
      When read_only option was enabled, a user without SUPER privilege could
      perform CREATE DATABASE and DROP DATABASE operations.
      
      This patch adds a check to make sure this isn't possible. It also attempts to 
      simplify the logic used to determine if relevant tables are updated,
      making it more human readable.
      
      
      mysql-test/r/read_only.result:
        Updated result file
      mysql-test/t/read_only.test:
        A test case is added which shows that it is not possible to drop or create a
        database in read-only mode despite having the GRANT permissions to do so,
        SUPER user excepted.
      sql/sql_parse.cc:
        - Simplified complex predicate by grouping it in a read friendly way.
        - Added predicate to fail on database updates while running in read-only
          mode.
      5826a5c4
    • unknown's avatar
      BUG#25677 - With --skip-symbolic-links option on, DATA DIRECTORY · 510bda4b
      unknown authored
                  clause is silently ignored
      
      When symbolic links are disabled by command line option or
      NO_DIR_IN_CREATE sql mode, CREATE TABLE silently ignores
      DATA/INDEX DIRECTORY options.
      
      With this fix a warning is issued when symbolic links are disabled.
      
      
      mysql-test/r/symlink.result:
        A test case for BUG#25677.
      mysql-test/t/symlink.test:
        A test case for BUG#25677.
      sql/sql_parse.cc:
        Moved handling of situation when mysqld is compiled without
        HAVE_READLINK to mysql_create_table_no_lock().
      sql/sql_table.cc:
        Issue a warning in case DATA/INDEX DIRECTORY is specified and:
        - server is compiled without HAVE_READLINK;
        - using symbolic links is disabled by command line option;
        - using symbolic links is disabled by NO_DIR_IN_CREATE sql mode.
      510bda4b
  32. 30 Nov, 2007 1 commit
    • unknown's avatar
      Bug#32775 problems with SHOW EVENTS and Information_Schema · ff7e7fcb
      unknown authored
      removed unnecessary privilege checks for I_S schema
      
      
      mysql-test/r/information_schema.result:
        test result
      mysql-test/t/information_schema.test:
        test case
      sql/events.cc:
        There is no events in I_S so we don't need to execute check_access here.
      sql/sql_parse.cc:
        removed unnecessary check
      ff7e7fcb