An error occurred fetching the project authors.
  1. 13 Aug, 2010 1 commit
    • Jon Olav Hauglid's avatar
      Bug #54105 assert in MDL_context::release_locks_stored_before · 99b1d5ea
      Jon Olav Hauglid authored
      The problem was that SHOW CREATE EVENT released all metadata locks
      held by the current transaction. This made any exisiting savepoints
      invalid, triggering the assert when ROLLBACK TO SAVEPOINT later
      was executed.
      
      This patch fixes the problem by making sure SHOW CREATE EVENT only
      releases metadata locks acquired by the statement itself.
      
      Test case added to event_trans.test.
      99b1d5ea
  2. 27 Jul, 2010 1 commit
    • Konstantin Osipov's avatar
      A pre-requisite patch for the fix for Bug#52044. · 36290c09
      Konstantin Osipov authored
      This patch also fixes Bug#55452 "SET PASSWORD is
      replicated twice in RBR mode".
      
      The goal of this patch is to remove the release of 
      metadata locks from close_thread_tables().
      This is necessary to not mistakenly release
      the locks in the course of a multi-step
      operation that involves multiple close_thread_tables()
      or close_tables_for_reopen().
      
      On the same token, move statement commit outside 
      close_thread_tables().
      
      Other cleanups:
      Cleanup COM_FIELD_LIST.
      Don't call close_thread_tables() in COM_SHUTDOWN -- there
      are no open tables there that can be closed (we leave
      the locked tables mode in THD destructor, and this
      close_thread_tables() won't leave it anyway).
      
      Make open_and_lock_tables() and open_and_lock_tables_derived()
      call close_thread_tables() upon failure.
      Remove the calls to close_thread_tables() that are now
      unnecessary.
      
      Simplify the back off condition in Open_table_context.
      
      Streamline metadata lock handling in LOCK TABLES 
      implementation.
      
      Add asserts to ensure correct life cycle of 
      statement transaction in a session.
      
      Remove a piece of dead code that has also become redundant
      after the fix for Bug 37521.
      
      mysql-test/r/variables.result:
        Update results: set @@autocommit and statement transaction/
        prelocked mode.
      mysql-test/r/view.result:
        A harmless change in CHECK TABLE <view> status for a broken view.
        If previously a failure to prelock all functions used in a view 
        would leave the connection in LTM_PRELOCKED mode, now we call
        close_thread_tables() from open_and_lock_tables()
        and leave prelocked mode, thus some check in mysql_admin_table() that
        works only in prelocked/locked tables mode is no longer activated.
      mysql-test/suite/rpl/r/rpl_row_implicit_commit_binlog.result:
        Fixed Bug#55452 "SET PASSWORD is replicated twice in
        RBR mode": extra binlog events are gone from the
        binary log.
      mysql-test/t/variables.test:
        Add a test case: set autocommit and statement transaction/prelocked
        mode.
      sql/event_data_objects.cc:
        Simplify code in Event_job_data::execute().
        Move sp_head memory management to lex_end().
      sql/event_db_repository.cc:
        Move the release of metadata locks outside
        close_thread_tables().
        Make sure we call close_thread_tables() when
        open_and_lock_tables() fails and remove extra
        code from the events data dictionary.
        Use close_mysql_tables(), a new internal
        function to properly close mysql.* tables
        in the data dictionary.
        Contract Event_db_repository::drop_events_by_field,
        drop_schema_events into one function.
        When dropping all events in a schema,
        make sure we don't mistakenly release all
        locks acquired by DROP DATABASE. These
        include locks on the database name
        and the global intention exclusive
        metadata lock.
      sql/event_db_repository.h:
        Function open_event_table() does not require an instance 
        of Event_db_repository.
      sql/events.cc:
        Use close_mysql_tables() instead of close_thread_tables()
        to bootstrap events, since the latter no longer
        releases metadata locks.
      sql/ha_ndbcluster.cc:
        - mysql_rm_table_part2 no longer releases
        acquired metadata locks. Do it in the caller.
      sql/ha_ndbcluster_binlog.cc:
        Deploy the new protocol for closing thread
        tables in run_query() and ndb_binlog_index
        code.
      sql/handler.cc:
        Assert that we never call ha_commit_trans/
        ha_rollback_trans in sub-statement, which
        is now the case.
      sql/handler.h:
        Add an accessor to check whether THD_TRANS object
        is empty (has no transaction started).
      sql/log.cc:
        Update a comment.
      sql/log_event.cc:
        Since now we commit/rollback statement transaction in 
        mysql_execute_command(), we need a mechanism to communicate
        from Query_log_event::do_apply_event() to mysql_execute_command()
        that the statement transaction should be rolled back, not committed.
        Ideally it would be a virtual method of THD. I hesitate
        to make THD a virtual base class in this already large patch.
        Use a thd->variables.option_bits for now.
        
        Remove a call to close_thread_tables() from the slave IO
        thread. It doesn't open any tables, and the protocol
        for closing thread tables is more complicated now.
        
        Make sure we properly close thread tables, however, 
        in Load_data_log_event, which doesn't
        follow the standard server execution procedure
        with mysql_execute_command().
        @todo: this piece should use Server_runnable
        framework instead.
        Remove an unnecessary call to mysql_unlock_tables().
      sql/rpl_rli.cc:
        Update Relay_log_info::slave_close_thread_tables()
        to follow the new close protocol.
      sql/set_var.cc:
        Remove an unused header.
      sql/slave.cc:
        Remove an unnecessary call to
        close_thread_tables().
      sql/sp.cc:
        Remove unnecessary calls to close_thread_tables()
        from SP DDL implementation. The tables will
        be closed by the caller, in mysql_execute_command().
        When dropping all routines in a database, make sure
        to not mistakenly drop all metadata locks acquired
        so far, they include the scoped lock on the schema.
      sql/sp_head.cc:
        Correct the protocol that closes thread tables
        in an SP instruction.
        Clear lex->sphead before cleaning up lex
        with lex_end to make sure that we don't
        delete the sphead twice. It's considered
        to be "cleaner" and more in line with
        future changes than calling delete lex->sphead
        in other places that cleanup the lex.
      sql/sp_head.h:
        When destroying m_lex_keeper of an instruction,
        don't delete the sphead that all lex objects
        share. 
        @todo: don't store a reference to routine's sp_head
        instance in instruction's lex.
      sql/sql_acl.cc:
        Don't call close_thread_tables() where the caller will
        do that for us.
        Fix Bug#55452 "SET PASSWORD is replicated twice in RBR 
        mode" by disabling RBR replication in change_password()
        function.
        Use close_mysql_tables() in bootstrap and ACL reload
        code to make sure we release all metadata locks.
      sql/sql_base.cc:
        This is the main part of the patch:
        - remove manipulation with thd->transaction
        and thd->mdl_context from close_thread_tables().
        Now this function is only responsible for closing
        tables, nothing else.
        This is necessary to be able to easily use
        close_thread_tables() in procedures, that
        involve multiple open/close tables, which all
        need to be protected continuously by metadata
        locks.
        Add asserts ensuring that TABLE object
        is only used when is protected by a metadata lock.
        Simplify the back off condition of Open_table_context,
        we no longer need to look at the autocommit mode.
        Make open_and_lock_tables() and open_normal_and_derived_tables()
        close thread tables and release metadata locks acquired so-far 
        upon failure. This simplifies their usage.
        Implement close_mysql_tables().
      sql/sql_base.h:
        Add declaration for close_mysql_tables().
      sql/sql_class.cc:
        Remove a piece of dead code that has also become redundant
        after the fix for Bug 37521.
        The code became dead when my_eof() was made a non-protocol method,
        but a method that merely modifies the diagnostics area.
        The code became redundant with the fix for Bug#37521, when 
        we started to cal close_thread_tables() before
        Protocol::end_statement().
      sql/sql_do.cc:
        Do nothing in DO if inside a substatement
        (the assert moved out of trans_rollback_stmt).
      sql/sql_handler.cc:
        Add comments.
      sql/sql_insert.cc:
        Remove dead code. 
        Release metadata locks explicitly at the
        end of the delayed insert thread.
      sql/sql_lex.cc:
        Add destruction of lex->sphead to lex_end(),
        lex "reset" method called at the end of each statement.
      sql/sql_parse.cc:
        Move close_thread_tables() and other related
        cleanups to mysql_execute_command()
        from dispatch_command(). This has become
        possible after the fix for Bug#37521.
        Mark federated SERVER statements as DDL.
        
        Next step: make sure that we don't store
        eof packet in the query cache, and move
        the query cache code outside mysql_parse.
        
        Brush up the code of COM_FIELD_LIST.
        Remove unnecessary calls to close_thread_tables().
        
        When killing a query, don't report "OK"
        if it was a suicide.
      sql/sql_parse.h:
        Remove declaration of a function that is now static.
      sql/sql_partition.cc:
        Remove an unnecessary call to close_thread_tables().
      sql/sql_plugin.cc:
        open_and_lock_tables() will clean up
        after itself after a failure.
        Move close_thread_tables() above
        end: label, and replace with close_mysql_tables(),
        which will also release the metadata lock
        on mysql.plugin.
      sql/sql_prepare.cc:
        Now that we no longer release locks in close_thread_tables()
        statement prepare code has become more straightforward.
        Remove the now redundant check for thd->killed() (used
        only by the backup project) from Execute_server_runnable.
        Reorder code to take into account that now mysql_execute_command()
        performs lex->unit.cleanup() and close_thread_tables().
      sql/sql_priv.h:
        Add a new option to server options to interact
        between the slave SQL thread and execution
        framework (hack). @todo: use a virtual
        method of class THD instead.
      sql/sql_servers.cc:
        Due to Bug 25705 replication of 
        DROP/CREATE/ALTER SERVER is broken.
        Make sure at least we do not attempt to 
        replicate these statements using RBR,
        as this violates the assert in close_mysql_tables().
      sql/sql_table.cc:
        Do not release metadata locks in mysql_rm_table_part2,
        this is done by the caller.
        Do not call close_thread_tables() in mysql_create_table(),
        this is done by the caller. 
        Fix a bug in DROP TABLE under LOCK TABLES when,
        upon error in wait_while_table_is_used() we would mistakenly
        release the metadata lock on a non-dropped table.
        Explicitly release metadata locks when doing an implicit
        commit.
      sql/sql_trigger.cc:
        Now that we delete lex->sphead in lex_end(),
        zero the trigger's sphead in lex after loading
        the trigger, to avoid double deletion.
      sql/sql_udf.cc:
        Use close_mysql_tables() instead of close_thread_tables().
      sql/sys_vars.cc:
        Remove code added in scope of WL#4284 which would
        break when we perform set @@session.autocommit along
        with setting other variables and using tables or functions.
        A test case added to variables.test.
      sql/transaction.cc:
        Add asserts.
      sql/tztime.cc:
        Use close_mysql_tables() rather than close_thread_tables().
      36290c09
  3. 31 Mar, 2010 1 commit
    • Mats Kindahl's avatar
      WL#5030: Split and remove mysql_priv.h · 23d8586d
      Mats Kindahl authored
      This patch:
      
      - Moves all definitions from the mysql_priv.h file into
        header files for the component where the variable is
        defined
      - Creates header files if the component lacks one
      - Eliminates all include directives from mysql_priv.h
      - Eliminates all circular include cycles
      - Rename time.cc to sql_time.cc
      - Rename mysql_priv.h to sql_priv.h
      23d8586d
  4. 28 Mar, 2010 1 commit
    • unknown's avatar
      Bug #50095 Multi statement including CREATE EVENT causes rotten binlog entry · 47756010
      unknown authored
      The log event of 'CREATE EVENT' was being binlogged with garbage
      at the end of the query if 'CREATE EVENT' is followed by another SQL statement
      and they were executed as one command.
      for example:
          DELIMITER |;
          CREATE EVENT e1 ON EVERY DAY DO SELECT 1; SELECT 'a';
          DELIMITER ;|
      When binlogging 'CREATE EVENT', we always create a new statement with definer
      and write it into the log event. The new statement is made from cpp_buf(preprocessed buffer).
      which is not a c string(end with '\0'), but it is copied as a c string.
      
      In this patch, cpp_buf is copied with its length.
      47756010
  5. 15 Mar, 2010 1 commit
    • Jon Olav Hauglid's avatar
      Bug #51160 Deadlock around SET GLOBAL EVENT_SCHEDULER = ON|OFF · c7c1f219
      Jon Olav Hauglid authored
      This deadlock could occour betweeen one connection executing
      SET GLOBAL EVENT_SCHEDULER= ON and another executing SET GLOBAL
      EVENT_SCHEDULER= OFF. The bug was introduced by WL#4738.
      
      The first connection would hold LOCK_event_metadata (protecting
      the global variable) while trying to lock LOCK_global_system_variables
      starting the event scheduler thread (in THD:init()).
      
      The second connection would hold LOCK_global_system_variables
      while trying to get LOCK_event_scheduler after stopping the event
      scheduler inside event_scheduler_update().
      
      This patch fixes the problem by not using LOCK_event_metadata to
      protect the event_scheduler variable. It is still protected using
      LOCK_global_system_variables. This fixes the deadlock as it removes 
      one of the two mutexes used to produce it.
      
      However, this patch opens up the possibility that the event_scheduler
      variable and the real event_scheduler state can become out of sync
      (e.g. variable = OFF, but scheduler running). But this can only
      happen under very unlikely conditions - two concurrent SET GLOBAL
      statments, with one thread interrupted at the exact wrong moment.
      This is preferable to having the possibility of a deadlock.
      
      This patch also fixes a bug where it was possible to exit create_event()
      without releasing LOCK_event_metadata if running out of memory during
      its exection.
      
      No test case added since a repeatable test case would have required
      excessive use of new sync points. Instead we rely on the fact that
      this bug was easily reproduceable using RGQ tests.
      c7c1f219
  6. 10 Feb, 2010 1 commit
  7. 09 Feb, 2010 1 commit
    • Luis Soares's avatar
      BUG#51021: current_stmt_binlog_row_based not removed in next-mr · 06df9b07
      Luis Soares authored
      As part of BUG@39934 fix, the public:
       - THD::current_stmt_binlog_row_based 
      variable had been removed and replaced by a private variable:
       - THD::current_stmt_binlog_format. 
      
      THD was refactored and some modifiers and accessors were
      implemented for the new variable.
      
      However, due to a bad merge, the
      THD::current_stmt_binlog_row_based variable is back as a public
      member of THD. This in itself is already potentially
      harmful. What's even worse is that while merging some more
      patches and resolving conflicts, the variable started being used
      again, which is obviously wrong.
      
      To fix this we:
        1. remove the extraneous variable from sql_class.h
        2. revert a bad merge for BUG#49132
        3. merge BUG#49132 properly again (actually, making use of the
           cset used to merge the original patch to mysql-pe).
      06df9b07
  8. 04 Feb, 2010 1 commit
    • Konstantin Osipov's avatar
      Merge next-mr -> next-4284. · 00dc9a6e
      Konstantin Osipov authored
      Cherry-pick a fix Bug#37148 from next-mr, to preserve
      file ids of the added files, and ensure that all the necessary
      changes have been pulled.
      
      Since initially Bug#37148 was null-merged into 6.0,
      the changeset that is now being cherry-picked was likewise
      null merged into next-4284.
      
      Now that Bug#37148 has been reapplied to 6.0, try to make
      it work with next-4284. This is also necessary to be able
      to pull other changes from 5.1-rep into next-4284.
      
      To resolve the merge issues use this changeset applied
      to 6.0:
      revid:jperkin@sun.com-20091216103628-ylhqf7s6yegui2t9
      revno: 3776.1.1
      committer: He Zhenxing <zhenxing.he@sun.com>
      branch nick: 6.0-codebase-bugfixing
      timestamp: Thu 2009-12-17 17:02:50 +0800
      message:
        Fix merge problem with Bug#37148
      
      
      
      00dc9a6e
  9. 02 Feb, 2010 1 commit
    • Alexander Nozdrin's avatar
      Revert a patch for Bug#48231, which introduced valgrind warnings. · 59f1be1b
      Alexander Nozdrin authored
      Original revision:
      ------------------------------------------------------------
      revision-id: li-bing.song@sun.com-20100130124925-o6sfex42b6noyc6x
      parent: joro@sun.com-20100129145427-0n79l9hnk0q43ajk
      committer: <Li-Bing.Song@sun.com>
      branch nick: mysql-5.1-bugteam
      timestamp: Sat 2010-01-30 20:49:25 +0800
      message:
        Bug #48321  CURRENT_USER() incorrectly replicated for DROP/RENAME USER;
                    REVOKE/GRANT; ALTER EVENT.
        
        The following statements support the CURRENT_USER() where a user is needed.
          DROP USER 
          RENAME USER CURRENT_USER() ...
          GRANT ... TO CURRENT_USER()
          REVOKE ... FROM CURRENT_USER()
          ALTER DEFINER = CURRENT_USER() EVENT
        but, When these statements are binlogged, CURRENT_USER() just is binlogged
        as 'CURRENT_USER()', it is not expanded to the real user name. When slave 
        executes the log event, 'CURRENT_USER()' is expand to the user of slave 
        SQL thread, but SQL thread's user name always NULL. This breaks the replication.
        
        After this patch, All above statements are rewritten when they are binlogged.
        The CURRENT_USER() is expanded to the real user's name and host.
      ------------------------------------------------------------
      59f1be1b
  10. 30 Jan, 2010 1 commit
    • unknown's avatar
      Bug #48321 CURRENT_USER() incorrectly replicated for DROP/RENAME USER; · d9e9a73e
      unknown authored
                  REVOKE/GRANT; ALTER EVENT.
      
      The following statements support the CURRENT_USER() where a user is needed.
        DROP USER 
        RENAME USER CURRENT_USER() ...
        GRANT ... TO CURRENT_USER()
        REVOKE ... FROM CURRENT_USER()
        ALTER DEFINER = CURRENT_USER() EVENT
      but, When these statements are binlogged, CURRENT_USER() just is binlogged
      as 'CURRENT_USER()', it is not expanded to the real user name. When slave 
      executes the log event, 'CURRENT_USER()' is expand to the user of slave 
      SQL thread, but SQL thread's user name always NULL. This breaks the replication.
      
      After this patch, All above statements are rewritten when they are binlogged.
      The CURRENT_USER() is expanded to the real user's name and host.
      d9e9a73e
  11. 24 Jan, 2010 1 commit
  12. 22 Jan, 2010 2 commits
    • Sergey Glukhov's avatar
      Bug#49501 Inefficient information_schema check (system collation), addon · 4a10f7b4
      Sergey Glukhov authored
      removed wrongly introduced strlen calls
      
      
      sql/events.cc:
        removed wrongly introduced strlen calls
      sql/mysql_priv.h:
        removed wrongly introduced strlen calls
      sql/repl_failsafe.cc:
        removed wrongly introduced strlen calls
      sql/sql_db.cc:
        removed wrongly introduced strlen calls
      sql/sql_parse.cc:
        removed wrongly introduced strlen calls
      sql/sql_show.cc:
        removed wrongly introduced strlen calls
      4a10f7b4
    • unknown's avatar
      Bug #49132 Replication failure on temporary table + DDL · 3cae7d11
      unknown authored
      In RBR, DDL statement will change binlog format to non row-based
      format before it is binlogged, but the binlog format was not be
      restored, and then manipulating a temporary table can not reset binlog
      format to row-based format rightly. So that the manipulated statement
      is binlogged with statement-based format.
      
      To fix the problem, restore the state of binlog format after the DDL
      statement is binlogged.
      
      mysql-test/extra/rpl_tests/rpl_tmp_table_and_DDL.test:
        Added the test file to verify if executing DDL statement before
        trying to manipulate a temporary table causes row-based replication
        to break with error 'table does not exist'.
      mysql-test/suite/binlog/r/binlog_row_mix_innodb_myisam.result:
        Correct the test result, all the above binlog event
        should be row-based after the bug49132 is fixed IN RBR.
      mysql-test/suite/ndb/r/ndb_tmp_table_and_DDL.result:
        Test result for bug#49132 base on ndb engine.
      mysql-test/suite/ndb/t/ndb_tmp_table_and_DDL.test:
        Added the test file to verify if executing DDL statement before
        trying to manipulate a temporary table causes row-based replication
        to break with error 'table does not exist' base on ndb engine.
      mysql-test/suite/rpl/r/rpl_tmp_table_and_DDL.result:
        Test result for bug#49132 base on myisam engine.
      mysql-test/suite/rpl/t/rpl_tmp_table_and_DDL.test:
        Added the test file to verify if executing DDL statement before
        trying to manipulate a temporary table causes row-based replication
        to break with error 'table does not exist' base on myisam engine.
      sql/event_db_repository.cc:
        Added code to restore the state of binlog format after the DDL
        statement is binlogged.
      sql/events.cc:
        Added code to restore the state of binlog format after the DDL
        statement is binlogged.
      sql/sp.cc:
        Added code to restore the state of binlog format after the DDL
        statement is binlogged.
      sql/sql_acl.cc:
        Added code to restore the state of binlog format after the DDL
        statement is binlogged.
      sql/sql_udf.cc:
        Added code to restore the state of binlog format after the DDL
        statement is binlogged.
      3cae7d11
  13. 21 Jan, 2010 1 commit
    • Dmitry Lenev's avatar
      Patch that changes metadata locking subsystem to use mutex per lock and · 6ddd01c2
      Dmitry Lenev authored
      condition variable per context instead of one mutex and one conditional
      variable for the whole subsystem.
      
      This should increase concurrency in this subsystem.
      
      It also opens the way for further changes which are necessary to solve
      such bugs as bug #46272 "MySQL 5.4.4, new MDL: unnecessary deadlock"
      and bug #37346 "innodb does not detect deadlock between update and alter
      table".
      
      Two other notable changes done by this patch:
      
      - MDL subsystem no longer implicitly acquires global intention exclusive
        metadata lock when per-object metadata lock is acquired. Now this has
        to be done by explicit calls outside of MDL subsystem.
      - Instead of using separate MDL_context for opening system tables/tables
        for purposes of I_S we now create MDL savepoint in the main context
        before opening tables and rollback to this savepoint after closing
        them. This means that it is now possible to get ER_LOCK_DEADLOCK error
        even not inside a transaction. This might happen in unlikely case when
        one runs DDL on one of system tables while also running DDL on some
        other tables. Cases when this ER_LOCK_DEADLOCK error is not justified
        will be addressed by advanced deadlock detector for MDL subsystem which
        we plan to implement.
      
      mysql-test/include/handler.inc:
        Adjusted handler_myisam.test and handler_innodb.test to the fact that
        exclusive metadata locks on tables are now acquired according to
        alphabetical order of fully qualified table names instead of order
        in which tables are mentioned in statement.
      mysql-test/r/handler_innodb.result:
        Adjusted handler_myisam.test and handler_innodb.test to the fact that
        exclusive metadata locks on tables are now acquired according to
        alphabetical order of fully qualified table names instead of order
        in which tables are mentioned in statement.
      mysql-test/r/handler_myisam.result:
        Adjusted handler_myisam.test and handler_innodb.test to the fact that
        exclusive metadata locks on tables are now acquired according to
        alphabetical order of fully qualified table names instead of order
        in which tables are mentioned in statement.
      mysql-test/r/mdl_sync.result:
        Adjusted mdl_sync.test to the fact that exclusive metadata locks on
        tables are now acquired according to alphabetical order of fully
        qualified table names instead of order in which tables are mentioned
        in statement.
      mysql-test/t/mdl_sync.test:
        Adjusted mdl_sync.test to the fact that exclusive metadata locks on
        tables are now acquired according to alphabetical order of fully
        qualified table names instead of order in which tables are mentioned
        in statement.
      sql/events.cc:
        Instead of using separate MDL_context for opening system tables we now
        create MDL savepoint in the main context before opening such tables
        and rollback to this savepoint after closing them. To support this
        change methods of THD responsible for saving/restoring open table
        state were changed to use Open_tables_backup class which in addition
        to Open_table_state has a member for this savepoint. As result code
        opening/closing system tables was changed to use Open_tables_backup
        instead of Open_table_state class as well.
      sql/ha_ndbcluster.cc:
        Since manipulations with open table state no longer install proxy
        MDL_context it does not make sense to perform them in order to
        satisfy assert in mysql_rm_tables_part2(). Removed them per agreement
        with Cluster team. This has not broken test suite since scenario in
        which deadlock can occur and assertion fails is not covered by tests.
      sql/lock.cc:
        MDL subsystem no longer implicitly acquires global intention exclusive
        metadata lock when per-object exclusive metadata lock is acquired.
        Now this has to be done by explicit calls outside of MDL subsystem.
      sql/log.cc:
        Instead of using separate MDL_context for opening system tables we now
        create MDL savepoint in the main context before opening such tables
        and rollback to this savepoint after closing them. To support this
        change methods of THD responsible for saving/restoring open table
        state were changed to use Open_tables_backup class which in addition
        to Open_table_state has a member for this savepoint. As result code
        opening/closing system tables was changed to use Open_tables_backup
        instead of Open_table_state class as well.
      sql/mdl.cc:
        Changed metadata locking subsystem to use mutex per lock and condition
        variable per context instead of one mutex and one conditional variable
        for the whole subsystem.
        Changed approach to handling of global metadata locks. Instead of
        implicitly acquiring intention exclusive locks when user requests
        per-object upgradeable or exclusive locks now we require them to be
        acquired explicitly in the same way as ordinary metadata locks.
        In fact global lock are now ordinary metadata locks in new GLOBAL
        namespace.
        
        To implement these changes:
        - Removed LOCK_mdl mutex and COND_mdl condition variable.
        - Introduced MDL_lock::m_mutex mutexes which protect individual lock
          objects.
        - Replaced mdl_locks hash with MDL_map class, which has hash for
          MDL_lock objects as a member and separate mutex which protects this
          hash. Methods of this class allow to find(), find_or_create() or
          remove() MDL_lock objects in concurrency-friendly fashion (i.e.
          for most common operation, find_or_create(), we don't acquire
          MDL_lock::m_mutex while holding MDL_map::m_mutex. Thanks to MikaelR
          for this idea and benchmarks!). Added three auxiliary members to
          MDL_lock class (m_is_destroyed, m_ref_usage, m_ref_release) to
          support this concurrency-friendly behavior.
        - Introduced MDL_context::m_ctx_wakeup_cond condition variable to be
          used for waiting until this context's pending request can be
          satisfied or its thread has to perform actions to resolve potential
          deadlock. Context which want to wait add ticket corresponding to the
          request to an appropriate queue of waiters in MDL_lock object so
          they can be noticed when other contexts change state of lock and be
          awaken by them by signalling on MDL_context::m_ctx_wakeup_cond.
          As consequence MDL_ticket objects has to be used for any waiting
          in metadata locking subsystem including one which happens in
          MDL_context::wait_for_locks() method.
          Another consequence is that MDL_context is no longer copyable and
          can't be saved/restored when working with system tables.
        - Made MDL_lock an abstract class, which delegates specifying exact
          compatibility matrix to its descendants. Added MDL_global_lock child
          class for global lock (The old is_lock_type_compatible() method
          became can_grant_lock() method of this class). Added MDL_object_lock
          class to represent per-object lock (The old MDL_lock::can_grant_lock()
          became its method). Choice between two classes happens based on MDL
          namespace in MDL_lock::create() method.
        - Got rid of MDL_lock::type member as its meaning became ambigous for
          global locks.
        - To simplify waking up of contexts waiting for lock split waiting queue
          in MDL_lock class in two queues. One for pending requests for exclusive
          (including intention exclusive) locks and another for requests for
          shared locks.
        - Added virtual wake_up_waiters() method to MDL_lock, MDL_global_lock and
          MDL_object_lock classes which allows to wake up waiting contexts after
          state of lock changes. Replaced old duplicated code with calls to this
          method.
        - Adjusted MDL_context::try_acquire_shared_lock()/exclusive_lock()/
          global_shared_lock(), MDL_ticket::upgrade_shared_lock_to_exclusive_lock()
          and MDL_context::release_ticket() methods to use MDL_map and
          MDL_lock::m_mutex instead of single LOCK_mdl mutex and wake up
          waiters according to the approach described above. The latter method
          also was renamed to MDL_context::release_lock().
        - Changed MDL_context::try_acquire_shared_lock()/exclusive_lock() and
          release_lock() not to handle global locks. They are now supposed to
          be taken explicitly like ordinary metadata locks.
        - Added helper MDL_context::try_acquire_global_intention_exclusive_lock()
          and acquire_global_intention_exclusive_lock() methods.
        - Moved common code from MDL_context::acquire_global_shared_lock() and
          acquire_global_intention_exclusive_lock() to new method -
          MDL_context::acquire_lock_impl().
        - Moved common code from MDL_context::try_acquire_shared_lock(),
          try_acquire_global_intention_exclusive_lock()/exclusive_lock()
          to MDL_context::try_acquire_lock_impl().
        - Since acquiring of several exclusive locks can no longer happen under
          single LOCK_mdl mutex the approach to it had to be changed. Now we do
          it in one by one fashion. This is done in alphabetical order to avoid
          deadlocks. Changed MDL_context::acquire_exclusive_locks() accordingly
          (as part of this change moved code responsible for acquiring single
          exclusive lock to new MDL_context::acquire_exclusive_lock_impl()
          method).
        - Since we no longer have single LOCK_mdl mutex which protects all
          MDL_context::m_is_waiting_in_mdl members using these members to
          determine if we have really awaken context holding conflicting
          shared lock became inconvinient. Got rid of this member and changed
          notify_shared_lock() helper function and process of acquiring
          of/upgrading to exclusive lock not to rely on such information.
          Now in MDL_context::acquire_exclusive_lock_impl() and
          MDL_ticket::upgrade_shared_lock_to_exclusive_lock() we simply
          re-try to wake up threads holding conflicting shared locks after
          small time out.
        - Adjusted MDL_context::can_wait_lead_to_deadlock() and
          MDL_ticket::has_pending_conflicting_lock() to use per-lock
          mutexes instead of LOCK_mdl. To do this introduced
          MDL_lock::has_pending_exclusive_lock() method.
      sql/mdl.h:
        Changed metadata locking subsystem to use mutex per lock and condition
        variable per context instead of one mutex and one conditional variable
        for the whole subsystem. In order to implement this change:
        
        - Added MDL_key::cmp() method to be able to sort MDL_key objects
          alphabetically. Changed length fields in MDL_key class to uint16
          as 16-bit is enough for length of any key.
        - Changed MDL_ticket::get_ctx() to return pointer to non-const
          object in order to be able to use MDL_context::awake() method
          for such contexts.
        - Got rid of unlocked versions of can_wait_lead_to_deadlock()/
          has_pending_conflicting_lock() methods in MDL_context and
          MDL_ticket. We no longer has single mutex which protects all
          locks. Thus one always has to use versions of these methods
          which acquire per-lock mutexes.
        - MDL_request_list type of list now counts its elements.
        - Added MDL_context::m_ctx_wakeup_cond condition variable to be used
          for waiting until this context's pending request can be satisfied
          or its thread has to perform actions to resolve potential deadlock.
          Added awake() method to wake up context from such wait.
          Addition of condition variable made MDL_context uncopyable.
          As result we no longer can save/restore MDL_context when working
          with system tables. Instead we create MDL savepoint before opening
          those tables and rollback to it once they are closed.
        - MDL_context::release_ticket() became release_lock() method.
        - Added auxiliary MDL_context::acquire_exclusive_lock_impl() method
          which does all necessary work to acquire exclusive lock on one object
          but should not be used directly as it does not enforce any asserts
          ensuring that no deadlocks are possible.
        - Since we no longer need to know if thread trying to acquire exclusive
          lock managed to wake up any threads having conflicting shared locks
          (as, anyway, we will try to wake up such threads again shortly)
        - MDL_context::m_is_waiting_in_mdl member became unnecessary and
          notify_shared_lock() no longer needs to be friend of MDL_context.
        
        Changed approach to handling of global metadata locks. Instead of
        implicitly acquiring intention exclusive locks when user requests
        per-object upgradeable or exclusive locks now we require them to be
        acquired explicitly in the same way as ordinary metadata locks.
        
        - Added new GLOBAL namespace for such locks.
        - Added new type of lock to be requested MDL_INTENTION_EXCLISIVE.
        - Added MDL_context::try_acquire_global_intention_exclusive_lock()
          and acquire_global_intention_exclusive_lock() methods.
        - Moved common code from MDL_context::acquire_global_shared_lock()
          and acquire_global_intention_exclusive_lock() to new method -
          MDL_context::acquire_lock_impl().
        - Moved common code from MDL_context::try_acquire_shared_lock(),
          try_acquire_global_intention_exclusive_lock()/exclusive_lock()
          to MDL_context::try_acquire_lock_impl().
        - Added helper MDL_context::is_global_lock_owner() method to be
          able easily to find what kind of global lock this context holds.
        - MDL_context::m_has_global_shared_lock became unnecessary as
          global read lock is now represented by ordinary ticket.
        - Removed assert in MDL_context::set_lt_or_ha_sentinel() which became
          false for cases when we execute LOCK TABLES under global read lock
          mode.
      sql/mysql_priv.h:
        Instead of using separate MDL_context for opening system tables we now
        create MDL savepoint in the main context before opening such tables
        and rollback to this savepoint after closing them. To support this
        change methods of THD responsible for saving/restoring open table
        state were changed to use Open_tables_backup class which in addition
        to Open_table_state has a member for this savepoint. As result calls
        opening/closing system tables were changed to use Open_tables_backup
        instead of Open_table_state class as well.
      sql/sp.cc:
        Instead of using separate MDL_context for opening system tables we now
        create MDL savepoint in the main context before opening such tables
        and rollback to this savepoint after closing them. To support this
        change methods of THD responsible for saving/restoring open table
        state were changed to use Open_tables_backup class which in addition
        to Open_table_state has a member for this savepoint. As result code
        opening/closing system tables was changed to use Open_tables_backup
        instead of Open_table_state class as well.
      sql/sp.h:
        Instead of using separate MDL_context for opening system tables we now
        create MDL savepoint in the main context before opening such tables
        and rollback to this savepoint after closing them. To support this
        change methods of THD responsible for saving/restoring open table
        state were changed to use Open_tables_backup class which in addition
        to Open_table_state has a member for this savepoint. As result code
        opening/closing system tables was changed to use Open_tables_backup
        instead of Open_table_state class as well.
      sql/sql_base.cc:
        close_thread_tables():
          Since we no longer use separate MDL_context for opening system
          tables we need to avoid releasing all transaction locks when
          closing system table. Releasing metadata lock on system table
          is now responsibility of THD::restore_backup_open_tables_state().
        open_table_get_mdl_lock(),
        Open_table_context::recover_from_failed_open():
          MDL subsystem no longer implicitly acquires global intention exclusive
          metadata lock when per-object upgradable or exclusive metadata lock is
          acquired. So this have to be done explicitly from these calls.
          Changed Open_table_context class to store MDL_request object for
          global intention exclusive lock acquired when opening tables.
        open_table():
          Do not release metadata lock if we have failed to open table as
          this lock might have been acquired by one of previous statements
          in transaction, and therefore should not be released.
        open_system_tables_for_read()/close_system_tables()/
        open_performance_schema_table():
          Instead of using separate MDL_context for opening system tables we now
          create MDL savepoint in the main context before opening such tables
          and rollback to this savepoint after closing them. To support this
          change methods of THD responsible for saving/restoring open table
          state were changed to use Open_tables_backup class which in addition
          to Open_table_state has a member for this savepoint. As result code
          opening/closing system tables was changed to use Open_tables_backup
          instead of Open_table_state class as well.
        close_performance_schema_table():
          Got rid of duplicated code.
      sql/sql_class.cc:
        Instead of using separate MDL_context for opening system tables we now
        create MDL savepoint in the main context before opening such tables
        and rollback to this savepoint after closing them. To support this
        change methods of THD responsible for saving/restoring open table
        state were changed to use Open_tables_backup class which in addition
        to Open_table_state has a member for this savepoint. Also releasing
        metadata lock on system table is now responsibility of
        THD::restore_backup_open_tables_state().
        Adjusted assert in THD::cleanup() to take into account fact that now
        we also use MDL sentinel for global read lock.
      sql/sql_class.h:
        Instead of using separate MDL_context for opening system tables we now
        create MDL savepoint in the main context before opening such tables
        and rollback to this savepoint after closing them. As result:
        - 'mdl_context' member was moved out of Open_tables_state to THD class.
          enter_locked_tables_mode()/leave_locked_tables_mode() had to follow.
        - Methods of THD responsible for saving/restoring open table state were
          changed to use Open_tables_backup class which in addition to
          Open_table_state has a member for this savepoint.
        Changed Open_table_context class to store MDL_request object for
        global intention exclusive lock acquired when opening tables.
      sql/sql_delete.cc:
        MDL subsystem no longer implicitly acquires global intention exclusive
        metadata lock when per-object exclusive metadata lock is acquired.
        Now this has to be done by explicit calls outside of MDL subsystem.
      sql/sql_help.cc:
        Instead of using separate MDL_context for opening system tables we now
        create MDL savepoint in the main context before opening such tables
        and rollback to this savepoint after closing them. To support this
        change methods of THD responsible for saving/restoring open table
        state were changed to use Open_tables_backup class which in addition
        to Open_table_state has a member for this savepoint. As result code
        opening/closing system tables was changed to use Open_tables_backup
        instead of Open_table_state class as well.
      sql/sql_parse.cc:
        Adjusted assert reload_acl_and_cache() to the fact that global read
        lock now takes full-blown metadata lock.
      sql/sql_plist.h:
        Added support for element counting to I_P_List list template.
        One can use policy classes to specify if such counting is needed
        or not needed for particular list.
      sql/sql_show.cc:
        Instead of using separate MDL_context for opening tables for I_S
        purposes we now create MDL savepoint in the main context before
        opening tables and rollback to this savepoint after closing them.
        To support this and similar change for system tables methods of
        THD responsible for saving/restoring open table state were changed
        to use Open_tables_backup class which in addition to Open_table_state
        has a member for this savepoint. As result code opening/closing tables
        for I_S purposes was changed to use Open_tables_backup instead of
        Open_table_state class as well.
      sql/sql_table.cc:
        mysql_rm_tables_part2():
          Since now global intention exclusive metadata lock is ordinary
          metadata lock we no longer can rely that by releasing MDL locks
          on all tables we will release all locks acquired by this routine.
          So in non-LOCK-TABLES mode we have to release all locks acquired
          explicitly.
        prepare_for_repair(), mysql_alter_table():
          MDL subsystem no longer implicitly acquires global intention
          exclusive metadata lock when per-object exclusive metadata lock
          is acquired. Now this has to be done by explicit calls outside of
          MDL subsystem.
      sql/tztime.cc:
        Instead of using separate MDL_context for opening system tables we now
        create MDL savepoint in the main context before opening such tables
        and rollback to this savepoint after closing them. To support this
        change methods of THD responsible for saving/restoring open table
        state were changed to use Open_tables_backup class which in addition
        to Open_table_state has a member for this savepoint. As result code
        opening/closing system tables was changed to use Open_tables_backup
        instead of Open_table_state class as well.
        Also changed code not to use special mechanism for open system tables
        when it is not really necessary.
      6ddd01c2
  14. 19 Jan, 2010 1 commit
    • Sergey Glukhov's avatar
      Bug#49501 Inefficient information_schema check (system collation) · 81391bd0
      Sergey Glukhov authored
      added check_length optimization for I_S_NAME comparison
      
      
      sql/event_data_objects.cc:
        added check_length optimization for I_S_NAME comparison
      sql/events.cc:
        added check_length optimization for I_S_NAME comparison
      sql/mysql_priv.h:
        added check_length optimization for I_S_NAME comparison
      sql/repl_failsafe.cc:
        added check_length optimization for I_S_NAME comparison
      sql/sql_db.cc:
        added check_length optimization for I_S_NAME comparison
      sql/sql_parse.cc:
        added check_length optimization for I_S_NAME comparison
      sql/sql_show.cc:
        added check_length optimization for I_S_NAME comparison
      sql/sql_view.cc:
        added check_length optimization for I_S_NAME comparison
      sql/table.cc:
        added check_length optimization for I_S_NAME comparison
      81391bd0
  15. 07 Jan, 2010 1 commit
  16. 22 Dec, 2009 1 commit
    • Sergei Golubchik's avatar
      WL#4738 streamline/simplify @@variable creation process · 1ad5bb1a
      Sergei Golubchik authored
      Bug#16565 mysqld --help --verbose does not order variablesBug#20413 sql_slave_skip_counter is not shown in show variables
      Bug#20415 Output of mysqld --help --verbose is incomplete
      Bug#25430 variable not found in SELECT @@global.ft_max_word_len;
      Bug#32902 plugin variables don't know their names
      Bug#34599 MySQLD Option and Variable Reference need to be consistent in formatting!
      Bug#34829 No default value for variable and setting default does not raise error
      Bug#34834 ? Is accepted as a valid sql mode
      Bug#34878 Few variables have default value according to documentation but error occurs  
      Bug#34883 ft_boolean_syntax cant be assigned from user variable to global var.
      Bug#37187 `INFORMATION_SCHEMA`.`GLOBAL_VARIABLES`: inconsistent status
      Bug#40988 log_output_basic.test succeeded though syntactically false.
      Bug#41010 enum-style command-line options are not honoured (maria.maria-recover fails)
      Bug#42103 Setting key_buffer_size to a negative value may lead to very large allocations 
      Bug#44691 Some plugins configured as MYSQL_PLUGIN_MANDATORY in can be disabled
      Bug#44797 plugins w/o command-line options have no disabling option in --help
      Bug#46314 string system variables don't support expressions
      Bug#46470 sys_vars.max_binlog_cache_size_basic_32 is broken
      Bug#46586 When using the plugin interface the type "set" for options caused a crash.
      Bug#47212 Crash in DBUG_PRINT in mysqltest.cc when trying to print octal number
      Bug#48758 mysqltest crashes on sys_vars.collation_server_basic in gcov builds
      Bug#49417 some complaints about mysqld --help --verbose output
      Bug#49540 DEFAULT value of binlog_format isn't the default value
      Bug#49640 ambiguous option '--skip-skip-myisam' (double skip prefix)
      Bug#49644 init_connect and \0
      Bug#49645 init_slave and multi-byte characters
      Bug#49646 mysql --show-warnings crashes when server dies
      
      
      CMakeLists.txt:
        Bug#44691 Some plugins configured as MYSQL_PLUGIN_MANDATORY in can be disabled
      client/mysql.cc:
        don't crash with --show-warnings when mysqld dies
      config/ac-macros/plugins.m4:
        Bug#44691 Some plugins configured as MYSQL_PLUGIN_MANDATORY in can be disabled
      include/my_getopt.h:
        comments
      include/my_pthread.h:
        fix double #define
      mysql-test/mysql-test-run.pl:
        run sys_vars suite by default
        properly recognize envirinment variables (e.g. MTR_MAX_SAVE_CORE) set to 0
        escape gdb command line arguments
      mysql-test/suite/sys_vars/r/rpl_init_slave_func.result:
        init_slave+utf8 bug
      mysql-test/suite/sys_vars/t/rpl_init_slave_func.test:
        init_slave+utf8 bug
      mysys/my_getopt.c:
        Bug#34599 MySQLD Option and Variable Reference need to be consistent in formatting!
        Bug#46586 When using the plugin interface the type "set" for options caused a crash.
        Bug#49640 ambiguous option '--skip-skip-myisam' (double skip prefix)
      mysys/typelib.c:
        support for flagset
      sql/ha_ndbcluster.cc:
        backport from telco tree
      sql/item_func.cc:
        Bug#49644 init_connect and \0
        Bug#49645 init_slave and multi-byte characters
      sql/sql_builtin.cc.in:
        Bug#44691 Some plugins configured as MYSQL_PLUGIN_MANDATORY in can be disabled
      sql/sql_plugin.cc:
        Bug#44691 Some plugins configured as MYSQL_PLUGIN_MANDATORY in can be disabled
        Bug#32902 plugin variables don't know their names
        Bug#44797 plugins w/o command-line options have no disabling option in --help
      sql/sys_vars.cc:
        all server variables are defined here
      storage/myisam/ft_parser.c:
        remove unnecessary updates of param->quot
      storage/myisam/ha_myisam.cc:
        myisam_* variables belong here
      strings/my_vsnprintf.c:
        %o and %llx
      unittest/mysys/my_vsnprintf-t.c:
        %o and %llx tests
      vio/viosocket.c:
        bugfix: fix @@wait_timeout to work with socket timeouts (vs. alarm thread)
      1ad5bb1a
  17. 03 Dec, 2009 1 commit
    • Konstantin Osipov's avatar
      Backport of: · 3543d255
      Konstantin Osipov authored
      ------------------------------------------------------------
      revno: 2630.13.16
      committer: Davi Arnaut <Davi.Arnaut@Sun.COM>
      branch nick: WL#4284
      timestamp: Sat 2008-07-26 13:38:20 -0300
      message:
      WL#4284: Transactional DDL locking
      
      SQL statements' effect on transactions.
      
      Currently the MySQL server and its storage engines are not
      capable of rolling back operations that define or modify data
      structures (also known as DDL statements) or operations that
      alter any of the system tables (the mysql database). Allowing
      these group of statements to participate in transactions
      is unfeasible at this time (since rollback has no effect
      whatsoever on them) and goes against the design of our metadata
      locking subsystem.
      
      The solution is to issue implicit commits before and after
      those statements execution. This effectively confines each of
      those statements to its own special transaction and ensures
      that metadata locks taken during this special transaction
      are not leaked into posterior statements/transactions.
      
      
      mysql-test/include/commit.inc:
        Alter table rename was not committing the normal transaction at the
        end of its execution, and as a consequence, the commit was being
        issued in the next DDL command (rename table) that happened to end
        the active transaction. Other changes are to take into account the
        implicit commits issued before and after the DDL command execution.
      mysql-test/include/implicit_commit_helper.inc:
        Add auxiliary test that shows if a statement issued a 
        implicit commit.
      mysql-test/r/commit_1innodb.result:
        
        Update test case result.
      mysql-test/r/implicit_commit.result:
        Test implicit commit behavior of some SQL commands.
      mysql-test/t/implicit_commit.test:
        Test implicit commit behavior of some SQL commands.
      sql/events.cc:
        Transaction is now ended before the command execution.
      sql/mysql_priv.h:
        Add flags array for server commands and remove historical 
        left over.
      sql/sql_class.h:
        Add flags to control when to issue implicit commits before and
        after a command execution.
      sql/sql_delete.cc:
        A implicit commit is issued at the end of truncate
        statements.
      sql/sql_parse.cc:
        Mark commands that need implicit commits before and
        after their executions. The implicit commits of the
        statement and the normal transaction are now issued
        regardless of the user access privileges.
      sql/sql_table.cc:
        A implicit commit is now issued before admin commands.
      tests/mysql_client_test.c:
        Test that COM_REFRESH issues a implicit commit.
      3543d255
  18. 21 Nov, 2009 1 commit
    • He Zhenxing's avatar
      BUG#37148 Most callers of mysql_bin_log.write ignore the return result · dd383cad
      He Zhenxing authored
      This is the non-ndb part of the patch.
      
      The return value of mysql_bin_log.write was ignored by most callers,
      which may lead to inconsistent on master and slave if the transaction
      was committed while the binlog was not correctly written. If
      my_error() is call in mysql_bin_log.write, this could also lead to
      assertion issue if my_ok() or my_error() is called after.
      
      This fixed the problem by let the caller to check and handle the
      return value of mysql_bin_log.write. This patch only adresses the
      simple cases.
      
      
      mysql-test/include/binlog_inject_error.inc:
        inject binlog write error when doing a query
      mysql-test/suite/binlog/t/binlog_write_error.test:
        Simple test case to check if proper error is reported when injecting binlog write errors.
      sql/events.cc:
        check return value of mysql_bin_log.write
      sql/log.cc:
        check return value of mysql_bin_log.write
      sql/log_event.cc:
        check return value of mysql_bin_log.write
      sql/log_event_old.cc:
        check return value of mysql_bin_log.write
      sql/mysql_priv.h:
        Change write_bin_log to return int instead of void
      sql/rpl_injector.cc:
        check return value of writing binlog
      sql/sp.cc:
        check return value of writing binlog
      sql/sp_head.cc:
        return 1 if writing binlog failed
      sql/sql_acl.cc:
        check return value of writing binlog
      sql/sql_base.cc:
        check return value of writing binlog
      sql/sql_class.h:
        Change binlog_show_create_table to return int
      sql/sql_db.cc:
        Change write_to_binlog to return int
        check return value of writing binlog
      sql/sql_delete.cc:
        check return value of writing binlog
      sql/sql_insert.cc:
        check return value of writing binlog
      sql/sql_load.cc:
        check return value of writing binlog
      sql/sql_parse.cc:
        check return value of writing binlog
      sql/sql_partition.cc:
        check return value of writing binlog
      sql/sql_rename.cc:
        check return value of writing binlog
      sql/sql_repl.cc:
        check return value of writing binlog
      sql/sql_table.cc:
        Change write_bin_log to return int, and return 1 if there was error writing binlog
      sql/sql_tablespace.cc:
        check return value of writing binlog
      sql/sql_trigger.cc:
        check return value of writing binlog
      sql/sql_udf.cc:
        check return value of writing binlog
      sql/sql_update.cc:
        check return value of writing binlog
      sql/sql_view.cc:
        check return value of writing binlog
      dd383cad
  19. 19 Nov, 2009 1 commit
    • Mattias Jonsson's avatar
      Bug#32115: Bad use of Name_resolution_context from current LEX in partitioning · 176cabc1
      Mattias Jonsson authored
      port from mysql-next (5.4) to mysql-next-mr-bugfixing (5.5/5.6?)
      
      2755 Konstantin Osipov	2008-11-27
      Bug#32115 will remove the pre-requisite to initialize LEX to open tables.
      This dependency was added in 5.1 and was supposed to be removed in 6.0.
      Remove asserts and initialization of LEX in places where we don't deal
      with partitioned tables.
      
      sql/sp_head.cc:
        Fix a typo.
      176cabc1
  20. 21 Oct, 2009 1 commit
    • Konstantin Osipov's avatar
      Backport of revno 2630.28.10, 2630.28.31, 2630.28.26, 2630.33.1, · 8ec23470
      Konstantin Osipov authored
      2630.39.1, 2630.28.29, 2630.34.3, 2630.34.2, 2630.34.1, 2630.29.29,
      2630.29.28, 2630.31.1, 2630.28.13, 2630.28.10, 2617.23.14 and
      some other minor revisions.
      
      This patch implements: 
      
      WL#4264 "Backup: Stabilize Service Interface" -- all the
      server prerequisites except si_objects.{h,cc} themselves (they can
      be just copied over, when needed).
      
      WL#4435: Support OUT-parameters in prepared statements.
      
      (and all issues in the initial patches for these two
      tasks, that were discovered in pushbuild and during testing).
      
      Bug#39519: mysql_stmt_close() should flush all data
      associated with the statement.
      
      After execution of a prepared statement, send OUT parameters of the invoked
      stored procedure, if any, to the client.
      
      When using the binary protocol, send the parameters in an additional result
      set over the wire.  When using the text protocol, assign out parameters to
      the user variables from the CALL(@var1, @var2, ...) specification.
      
      The following refactoring has been made:
        - Protocol::send_fields() was renamed to Protocol::send_result_set_metadata();
        - A new Protocol::send_result_set_row() was introduced to incapsulate
          common functionality for sending row data.
        - Signature of Protocol::prepare_for_send() was changed: this operation
          does not need a list of items, the number of items is fully sufficient.
      
      The following backward incompatible changes have been made:
        - CLIENT_MULTI_RESULTS is now enabled by default in the client;
        - CLIENT_PS_MULTI_RESUTLS is now enabled by default in the client.
      
      include/mysql.h:
        Add a new flag to MYSQL_METHODS::flush_use_result
        function pointer. This flag determines if all results
        should be flushed or only the first one:
            
        - if flush_all_results is TRUE, then cli_flush_use_result()
          will read/flush all pending results. I.e. it will read
          all packets while server status attribute indicates that
          there are more results. This is a new semantic, required
          to fix the bug.
                    
        - if flush_all_results is FALSE, the old sematic
          is preserved -- i.e. cli_flush_use_result() reads data
          until first EOF-packet.
      include/mysql.h.pp:
        Update the ABI with new calls (compatible changes).
      include/mysql_com.h:
        Add CLIENT_PS_OUT_PARAMS -- a client capability indicating that the client supportsю
      libmysql/libmysql.c:
        Add mysql_stmt_next_result() -- analogue of mysql_next_result() for binary protocol.
        Fix a minor bug in alloc_fields() -- not all members were copied over,
        and some only shallow-copied (catalog).
        Flush all results in mysql_stmt_close() (Bug#39519).
      libmysqld/lib_sql.cc:
        Rename send_fields() -> send_result_set_metadata().
        Refactoring: change prepare_for_send() so that it accepts only 
        what it really needs -- a number of elements in the list.
      mysql-test/r/ps.result:
        Update results: WL#4435.
      mysql-test/t/ps.test:
        WL#4435: A test case for an SQL-part of the problem.
      sql-common/client.c:
        Bug#39519.
        Implement new functionality in cli_flush_use_result():
        if flush_all_delete is TRUE, then it should read/flush
        all pending results.
      sql/Makefile.am:
        Add a new header sql_prepare.h to the list
        of build headers.
      sql/events.cc:
        Rename: Protocol::send_fields() -> 
        Protocol::send_result_set_metadata().
      sql/handler.cc:
        Rename: Protocol::send_fields() -> 
        Protocol::send_result_set_metadata().
      sql/mysql_priv.h:
        Move sql_prepare.cc-specific declarations to a new
        header - sql_prepare.h.
      sql/procedure.h:
        Rename: Protocol::send_fields() -> 
        Protocol::send_result_set_metadata().
      sql/protocol.cc:
        Move the logic responsible for sending of one result
        set row to the Protocol class. Define a template
        for end-of-statement action. 
        Refactoring: change prepare_for_send() so that it accepts 
        only what it really needs -- a number of elements in the list.
        Rename send_fields() to send_result_set_metadata().
      sql/protocol.h:
        Update with new declarations (WL#4435).
        Rename send_fields() -> send_result_set_metadata().
        prepare_for_send() only needs the number of columns to send,
        and doesn't use the item list - update signature to require
        only what's needed.
        Add a new protocol type -- Protocol_local.
      sql/repl_failsafe.cc:
        Rename: Protocol::send_fields() -> 
        Protocol::send_result_set_metadata().
      sql/slave.cc:
        Rename: Protocol::send_fields() -> 
        Protocol::send_result_set_metadata().
      sql/sql_acl.cc:
        Rename: Protocol::send_fields() -> 
        Protocol::send_result_set_metadata().
      sql/sql_base.cc:
        Include sql_prepare.h (for Reprepare_observer).
      sql/sql_cache.cc:
        Extend the query cache flags block to be able
        to store a numeric id for the result format,
        not just a flag binary/non-binary.
      sql/sql_class.cc:
        Update to use the rename of Protocol::send_fields()
        to Protocol::send_result_set_metadata().
        Use Protocol::send_one_result_set_row().
      sql/sql_class.h:
        Move the declaration of Reprepare_observer to the 
        new header - sql_prepare.h.
        Update to the new signature of class Protocol::send_fields().
      sql/sql_connect.cc:
        Use a protocol template method instead of
        raw NET layer API at the end of a statement.
      sql/sql_cursor.cc:
        Rename: Protocol::send_fields() -> 
        Protocol::send_result_set_metadata().
      sql/sql_error.cc:
        Rename: Protocol::send_fields() -> 
        Protocol::send_result_set_metadata().
      sql/sql_handler.cc:
        Rename: Protocol::send_fields() -> 
        Protocol::send_result_set_metadata().
        Use new method Protocol::send_one_result_set_row().
      sql/sql_help.cc:
        Rename: Protocol::send_fields() -> 
        Protocol::send_result_set_metadata().
      sql/sql_lex.cc:
        Initialize multi_statements variable.
        Add a handy constant for empty lex
        string.
      sql/sql_lex.h:
        Add a separate member for a standalone
        parsing option - multi-statements support.
      sql/sql_list.cc:
        sql_list.h is a standalone header now, 
        no need to include mysql_priv.h.
      sql/sql_list.h:
        Make sql_list.h a stand-alone header.
      sql/sql_parse.cc:
        Include sql_prepare.h for prepared
        statements- related declarations.
        Use a new Protocol template method to end
        each statement (send OK, EOF or ERROR to
        the client).
      sql/sql_prepare.cc:
        Implement Execute Direct API (WL#4264), 
        currently unused. It will be used by the service
        interface (Backup).
        Use a new header - sql_prepare.h.
        Add support for OUT parameters in the 
        binary and text protocol (prepared statements 
        only).
      sql/sql_prepare.h:
        Add a new header to contain (for now)
        all prepared statement- external
        related declarations.
      sql/sql_profile.cc:
        Rename: Protocol::send_fields() -> 
        Protocol::send_result_set_metadata().
      sql/sql_repl.cc:
        Rename: Protocol::send_fields() -> 
        Protocol::send_result_set_metadata().
      sql/sql_select.cc:
        Rename: Protocol::send_fields() -> 
        Protocol::send_result_set_metadata().
      sql/sql_show.cc:
        Rename: Protocol::send_fields() -> 
        Protocol::send_result_set_metadata().
      sql/sql_string.h:
        Add a way to convert a String to LEX_STRING.
      sql/sql_table.cc:
        Rename: Protocol::send_fields() -> 
        Protocol::send_result_set_metadata().
      sql/sql_update.cc:
        Remove an extraneous my_error(). The error
        is already reported in update_non_unique_table_error().
      sql/sql_yacc.yy:
        Support for multi-statements is an independent
        property of parsing, not derived from 
        the protocol type.
      tests/mysql_client_test.c:
        Add tests for WL#4435 (binary protocol).
      8ec23470
  21. 16 Oct, 2009 1 commit
    • Georgi Kodinov's avatar
      Bug #40877: multi statement execution fails in 5.1.30 · 7b4ef910
      Georgi Kodinov authored
            
      Implemented the server infrastructure for the fix:
      
      1. Added a function LEX_STRING *thd_query_string(THD) to return
      a LEX_STRING structure instead of char *.
      This is the function that must be called in innodb instead of 
      thd_query()
      
      2. Did some encapsulation in THD : aggregated thd_query and 
      thd_query_length into a LEX_STRING and made accessor and mutator 
      methods for easy code updating. 
      
      3. Updated the server code to use the new methods where applicable.
      7b4ef910
  22. 29 Aug, 2009 1 commit
    • unknown's avatar
      Bug #44331 Restore of database with events produces warning in replication · f32c08bd
      unknown authored
      If an EVENT is created without the DEFINER clause set explicitly or with it set  
      to CURRENT_USER, the master and slaves become inconsistent. This issue stems from 
      the fact that in both cases, the DEFINER is set to the CURRENT_USER of the current 
      thread. On the master, the CURRENT_USER is the mysqld's user, while on the slave,  
      the CURRENT_USER is empty for the SQL Thread which is responsible for executing 
      the statement.
      
      To fix the problem, we do what follows. If the definer is not set explicitly,  
      a DEFINER clause is added when writing the query into binlog; if 'CURRENT_USER' is 
      used as the DEFINER, it is replaced with the value of the current user before 
      writing to binlog.
      
      mysql-test/suite/rpl/r/rpl_create_if_not_exists.result:
        Updated the result file after fixing bug#44331
      mysql-test/suite/rpl/r/rpl_drop_if_exists.result:
        Updated the result file after fixing bug#44331
      mysql-test/suite/rpl/r/rpl_events.result:
        Test result of Bug#44331
      mysql-test/suite/rpl/r/rpl_innodb_mixed_dml.result:
        Updated the result file after fixing bug#44331
      mysql-test/suite/rpl/t/rpl_events.test:
        Added test to verify if the definer is consistent between master and slave
        when the event is created without the DEFINER clause set explicitly or the
        DEFINER is set to CURRENT_USER
      sql/events.cc:
        The "create_query_string" function is added to create a new query string 
        for removing executable comments.
      sql/sql_yacc.yy:
        The remember_name token was added for recording the offset of EVENT_SYM.
      f32c08bd
  23. 24 Jul, 2009 1 commit
  24. 14 Jul, 2009 1 commit
    • Sven Sandberg's avatar
      BUG#39934: Slave stops for engine that only support row-based logging · 41783de5
      Sven Sandberg authored
      General overview:
      The logic for switching to row format when binlog_format=MIXED had
      numerous flaws. The underlying problem was the lack of a consistent
      architecture.
      General purpose of this changeset:
      This changeset introduces an architecture for switching to row format
      when binlog_format=MIXED. It enforces the architecture where it has
      to. It leaves some bugs to be fixed later. It adds extensive tests to
      verify that unsafe statements work as expected and that appropriate
      errors are produced by problems with the selection of binlog format.
      It was not practical to split this into smaller pieces of work.
      
      Problem 1:
      To determine the logging mode, the code has to take several parameters
      into account (namely: (1) the value of binlog_format; (2) the
      capabilities of the engines; (3) the type of the current statement:
      normal, unsafe, or row injection). These parameters may conflict in
      several ways, namely:
       - binlog_format=STATEMENT for a row injection
       - binlog_format=STATEMENT for an unsafe statement
       - binlog_format=STATEMENT for an engine only supporting row logging
       - binlog_format=ROW for an engine only supporting statement logging
       - statement is unsafe and engine does not support row logging
       - row injection in a table that does not support statement logging
       - statement modifies one table that does not support row logging and
         one that does not support statement logging
      Several of these conflicts were not detected, or were detected with
      an inappropriate error message. The problem of BUG#39934 was that no
      appropriate error message was written for the case when an engine
      only supporting row logging executed a row injection with
      binlog_format=ROW. However, all above cases must be handled.
      Fix 1:
      Introduce new error codes (sql/share/errmsg.txt). Ensure that all
      conditions are detected and handled in decide_logging_format()
      
      Problem 2:
      The binlog format shall be determined once per statement, in
      decide_logging_format(). It shall not be changed before or after that.
      Before decide_logging_format() is called, all information necessary to
      determine the logging format must be available. This principle ensures
      that all unsafe statements are handled in a consistent way.
      However, this principle is not followed:
      thd->set_current_stmt_binlog_row_based_if_mixed() is called in several
      places, including from code executing UPDATE..LIMIT,
      INSERT..SELECT..LIMIT, DELETE..LIMIT, INSERT DELAYED, and
      SET @@binlog_format. After Problem 1 was fixed, that caused
      inconsistencies where these unsafe statements would not print the
      appropriate warnings or errors for some of the conflicts.
      Fix 2:
      Remove calls to THD::set_current_stmt_binlog_row_based_if_mixed() from
      code executed after decide_logging_format(). Compensate by calling the
      set_current_stmt_unsafe() at parse time. This way, all unsafe statements
      are detected by decide_logging_format().
      
      Problem 3:
      INSERT DELAYED is not unsafe: it is logged in statement format even if
      binlog_format=MIXED, and no warning is printed even if
      binlog_format=STATEMENT. This is BUG#45825.
      Fix 3:
      Made INSERT DELAYED set itself to unsafe at parse time. This allows
      decide_logging_format() to detect that a warning should be printed or
      the binlog_format changed.
      
      Problem 4:
      LIMIT clause were not marked as unsafe when executed inside stored
      functions/triggers/views/prepared statements. This is
      BUG#45785.
      Fix 4:
      Make statements containing the LIMIT clause marked as unsafe at
      parse time, instead of at execution time. This allows propagating
      unsafe-ness to the view.
      
      
      mysql-test/extra/rpl_tests/create_recursive_construct.inc:
        Added auxiliary file used by binlog_unsafe.test to create and
        execute recursive constructs
        (functions/procedures/triggers/views/prepared statements).
      mysql-test/extra/rpl_tests/rpl_foreign_key.test:
        removed unnecessary set @@session.binlog_format
      mysql-test/extra/rpl_tests/rpl_insert_delayed.test:
        Filter out table id from table map events in binlog listing.
        Got rid of $binlog_format_statement.
      mysql-test/extra/rpl_tests/rpl_ndb_apply_status.test:
        disable warnings around call to unsafe procedure
      mysql-test/include/rpl_udf.inc:
        Disabled warnings for code that generates warnings
        for some binlog formats. That would otherwise cause
        inconsistencies in the result file.
      mysql-test/r/mysqldump.result:
        Views are now unsafe if they contain a LIMIT clause.
        That fixed BUG#45831. Due to BUG#45832, a warning is
        printed for the CREATE VIEW statement.
      mysql-test/r/sp_trans.result:
        Unsafe statements in stored procedures did not give a warning if
        binlog_format=statement. This is BUG#45824. Now they do, so this
        result file gets a new warning.
      mysql-test/suite/binlog/r/binlog_multi_engine.result:
        Error message changed.
      mysql-test/suite/binlog/r/binlog_statement_insert_delayed.result:
        INSERT DELAYED didn't generate a warning when binlog_format=STATEMENT.
        That was BUG#45825. Now there is a warning, so result file needs to be
        updated.
      mysql-test/suite/binlog/r/binlog_stm_ps.result:
        Changed error message.
      mysql-test/suite/binlog/r/binlog_unsafe.result:
        updated result file:
         - error message changed
         - added test for most combinations of unsafe constructs invoked
           from recursive constructs
         - INSERT DELAYED now gives a warning (because BUG#45826 is fixed)
         - INSERT..SELECT..LIMIT now gives a warning from inside recursive
           constructs (because BUG#45785 was fixed)
         - When a recursive construct (e.g., stored proc or function)
           contains more than one statement, at least one of which is
           unsafe, then all statements in the recursive construct give
           warnings. This is a new bug introduced by this changeset.
           It will be addressed in a post-push fix.
      mysql-test/suite/binlog/t/binlog_innodb.test:
        Changed error code for innodb updates with READ COMMITTED or 
        READ UNCOMMITTED transaction isolation level and
        binlog_format=statement.
      mysql-test/suite/binlog/t/binlog_multi_engine.test:
        The error code has changed for statements where more than one
        engine is involved and one of them is self-logging.
      mysql-test/suite/binlog/t/binlog_unsafe-master.opt:
        Since binlog_unsafe now tests unsafe-ness of UDF's, we need an extra
        flag in the .opt file.
      mysql-test/suite/binlog/t/binlog_unsafe.test:
         - Clarified comment.
         - Rewrote first part of test. Now it tests not only unsafe variables
           and functions, but also unsafe-ness due to INSERT..SELECT..LIMIT,
           INSERT DELAYED, insert into two autoinc columns, use of UDF's, and
           access to log tables in the mysql database.
           Also, in addition to functions, procedures, triggers, and prepared
           statements, it now also tests views; and it constructs recursive
           calls in two levels by combining these recursive constructs.
           Part of the logic is in extra/rpl_tests/create_recursive_construct.inc.
         - added tests for all special system variables that should not be unsafe.
         - added specific tests for BUG#45785 and BUG#45825
      mysql-test/suite/rpl/r/rpl_events.result:
        updated result file
      mysql-test/suite/rpl/r/rpl_extraColmaster_innodb.result:
        updated result file
      mysql-test/suite/rpl/r/rpl_extraColmaster_myisam.result:
        updated result file
      mysql-test/suite/rpl/r/rpl_foreign_key_innodb.result:
        updated result file
      mysql-test/suite/rpl/r/rpl_idempotency.result:
        updated result file
      mysql-test/suite/rpl/r/rpl_mix_found_rows.result:
        Split rpl_found_rows.test into rpl_mix_found_rows.test (a new file) and
        rpl_stm_found_rows.test (renamed rpl_found_rows.test). This file equals
        the second half of the old rpl_found_rows.result, with the following
        modifications:
         - minor formatting changes
         - additional initialization
      mysql-test/suite/rpl/r/rpl_mix_insert_delayed.result:
        Moved out code operating in mixed mode from rpl_stm_insert_delayed
        (into rpl_mix_insert_delayed) and got rid of explicit setting of
        binlog format.
      mysql-test/suite/rpl/r/rpl_rbr_to_sbr.result:
        updated result file
      mysql-test/suite/rpl/r/rpl_row_idempotency.result:
        Moved the second half of rpl_idempotency.test, which only
        executed in row mode, to rpl_row_idempotency.test. This is
        the new result file.
      mysql-test/suite/rpl/r/rpl_row_insert_delayed.result:
        Got rid of unnecessary explicit setting of binlog format.
      mysql-test/suite/rpl/r/rpl_stm_found_rows.result:
        Split rpl_found_rows.test into rpl_mix_found_rows.test (a new file) and
        rpl_stm_found_rows.test (renamed rpl_found_rows.test). Changes in
        this file:
         - minor formatting changes
         - warning is now issued for unsafe statements inside procedures
           (since BUG#45824 is fixed)
         - second half of file is moved to rpl_mix_found_rows.result
      mysql-test/suite/rpl/r/rpl_stm_insert_delayed.result:
        Moved out code operating in mixed mode from rpl_stm_insert_delayed
        (into rpl_mix_insert_delayed) and got rid of explicit setting of
        binlog format.
      mysql-test/suite/rpl/r/rpl_stm_loadfile.result:
        error message changed
      mysql-test/suite/rpl/r/rpl_temporary_errors.result:
        updated result file
      mysql-test/suite/rpl/r/rpl_udf.result:
        Remove explicit set of binlog format (and triplicate test execution)
        and rely on test system executing the test in all binlog formats.
      mysql-test/suite/rpl/t/rpl_bug31076.test:
        Test is only valid in mixed or row mode since it generates row events.
      mysql-test/suite/rpl/t/rpl_events.test:
        Removed explicit set of binlog_format and removed duplicate testing.
        Instead, we rely on the test system to try all binlog formats.
      mysql-test/suite/rpl/t/rpl_extraColmaster_innodb.test:
        Removed triplicate testing and instead relying on test system.
        Test is only relevant for row format since statement-based replication
        cannot handle extra columns on master.
      mysql-test/suite/rpl/t/rpl_extraColmaster_myisam.test:
        Removed triplicate testing and instead relying on test system.
        Test is only relevant for row format since statement-based replication
        cannot handle extra columns on master.
      mysql-test/suite/rpl/t/rpl_idempotency-slave.opt:
        Removed .opt file to avoid server restarts.
      mysql-test/suite/rpl/t/rpl_idempotency.test:
        - Moved out row-only tests to a new test file, rpl_row_idempotency.test.
          rpl_idempotency now only contains tests that execute in all
          binlog_formats.
        - While I was here, also removed .opt file to avoid server restarts.
          The slave_exec_mode is now set inside the test instead.
      mysql-test/suite/rpl/t/rpl_mix_found_rows.test:
        Split rpl_found_rows.test into rpl_mix_found_rows.test (a new file) and
        rpl_stm_found_rows.test (renamed rpl_found_rows.test). This file
        contains the second half of the original rpl_found_rows.test with the
        follwing changes:
         - initialization
         - removed SET_BINLOG_FORMAT and added have_binlog_format_mixed.inc
         - minor formatting changes
      mysql-test/suite/rpl/t/rpl_mix_insert_delayed.test:
        Moved out code operating in mixed mode from rpl_stm_insert_delayed
        (into rpl_mix_insert_delayed) and got rid of explicit setting of
        binlog format.
      mysql-test/suite/rpl/t/rpl_rbr_to_sbr.test:
        Test cannot execute in statement mode, since we no longer
        switch to row format when binlog_format=statement.
        Enforced mixed mode throughout the test.
      mysql-test/suite/rpl/t/rpl_row_idempotency.test:
        Moved the second half of rpl_idempotency.test, which only
        executed in row mode, to this new file. We now rely on the
        test system to set binlog format.
      mysql-test/suite/rpl/t/rpl_row_insert_delayed.test:
         - Got rid of unnecessary explicit setting of binlog format.
         - extra/rpl_tests/rpl_insert_delayed.test does not need the
           $binlog_format_statement variable any more, so that was
           removed.
      mysql-test/suite/rpl/t/rpl_slave_skip.test:
        The test switches binlog_format internally and master generates both
        row and statement events. Hence, the slave must be able to log in both
        statement and row format. Hence test was changed to only execute in
        mixed mode.
      mysql-test/suite/rpl/t/rpl_stm_found_rows.test:
        Split rpl_found_rows.test into rpl_mix_found_rows.test (a new file) and
        rpl_stm_found_rows.test (renamed rpl_found_rows.test). Changes in
        this file:
         - minor formatting changes
         - added have_binlog_format_statement and removed SET BINLOG_FORMAT.
         - second half of file is moved to rpl_mix_found_rows.test
         - added cleanup code
      mysql-test/suite/rpl/t/rpl_stm_insert_delayed.test:
        Moved out code operating in mixed mode from rpl_stm_insert_delayed
        (into rpl_mix_insert_delayed) and got rid of explicit setting of
        binlog format.
      mysql-test/suite/rpl/t/rpl_switch_stm_row_mixed.test:
        The test switches binlog_format internally and master generates both
        row and statement events. Hence, the slave must be able to log in both
        statement and row format. Hence test was changed to only execute in
        mixed mode on slave.
      mysql-test/suite/rpl/t/rpl_temporary_errors.test:
        Removed explicit set of binlog format. Instead, the test now only
        executes in row mode.
      mysql-test/suite/rpl/t/rpl_udf.test:
        Remove explicit set of binlog format (and triplicate test execution)
        and rely on test system executing the test in all binlog formats.
      mysql-test/suite/rpl_ndb/combinations:
        Added combinations file for rpl_ndb.
      mysql-test/suite/rpl_ndb/r/rpl_ndb_binlog_format_errors.result:
        new result file
      mysql-test/suite/rpl_ndb/r/rpl_ndb_circular_simplex.result:
        updated result file
      mysql-test/suite/rpl_ndb/t/rpl_ndb_2innodb.test:
        The test needs slave to be able to switch to row mode, so the
        test was changed to only execute in mixed and row mode.
      mysql-test/suite/rpl_ndb/t/rpl_ndb_2myisam.test:
        The test needs slave to be able to switch to row mode, so the
        test was changed to only execute in mixed and row mode.
      mysql-test/suite/rpl_ndb/t/rpl_ndb_basic.test:
        The test needs slave to be able to switch to row mode, so the
        test was changed to only execute in mixed and row mode.
      mysql-test/suite/rpl_ndb/t/rpl_ndb_binlog_format_errors-master.opt:
        new option file
      mysql-test/suite/rpl_ndb/t/rpl_ndb_binlog_format_errors-slave.opt:
        new option file
      mysql-test/suite/rpl_ndb/t/rpl_ndb_binlog_format_errors.test:
        New test case to verify all errors and warnings generated by
        decide_logging_format.
      mysql-test/suite/rpl_ndb/t/rpl_ndb_blob.test:
        The test needs slave to be able to switch to row mode, so the
        test was changed to only execute in mixed and row mode.
      mysql-test/suite/rpl_ndb/t/rpl_ndb_blob2.test:
        The test needs slave to be able to switch to row mode, so the
        test was changed to only execute in mixed and row mode.
      mysql-test/suite/rpl_ndb/t/rpl_ndb_circular.test:
        The test needs slave to be able to switch to row mode, so the
        test was changed to only execute in mixed and row mode.
      mysql-test/suite/rpl_ndb/t/rpl_ndb_circular_simplex.test:
        The test needs slave to be able to switch to row mode, so the
        test was changed to only execute in mixed and row mode.
        While I was here, also made the test clean up after itself.
      mysql-test/suite/rpl_ndb/t/rpl_ndb_commit_afterflush.test:
        The test needs slave to be able to switch to row mode, so the
        test was changed to only execute in mixed and row mode.
      mysql-test/suite/rpl_ndb/t/rpl_ndb_ctype_ucs2_def.test:
        The test needs slave to be able to switch to row mode, so the
        test was changed to only execute in mixed and row mode.
      mysql-test/suite/rpl_ndb/t/rpl_ndb_delete_nowhere.test:
        The test needs slave to be able to switch to row mode, so the
        test was changed to only execute in mixed and row mode.
      mysql-test/suite/rpl_ndb/t/rpl_ndb_do_db.test:
        The test needs slave to be able to switch to row mode, so the
        test was changed to only execute in mixed and row mode.
      mysql-test/suite/rpl_ndb/t/rpl_ndb_do_table.test:
        The test needs slave to be able to switch to row mode, so the
        test was changed to only execute in mixed and row mode.
      mysql-test/suite/rpl_ndb/t/rpl_ndb_func003.test:
        The test needs slave to be able to switch to row mode, so the
        test was changed to only execute in mixed and row mode.
      mysql-test/suite/rpl_ndb/t/rpl_ndb_innodb_trans.test:
        The test needs slave to be able to switch to row mode, so the
        test was changed to only execute in mixed and row mode.
      mysql-test/suite/rpl_ndb/t/rpl_ndb_insert_ignore.test:
        The test needs slave to be able to switch to row mode, so the
        test was changed to only execute in mixed and row mode.
      mysql-test/suite/rpl_ndb/t/rpl_ndb_mixed_engines_transactions.test:
        The test needs slave to be able to switch to row mode, so the
        test was changed to only execute in mixed and row mode.
      mysql-test/suite/rpl_ndb/t/rpl_ndb_multi_update3.test:
        The test needs slave to be able to switch to row mode, so the
        test was changed to only execute in mixed and row mode.
      mysql-test/suite/rpl_ndb/t/rpl_ndb_rep_ignore.test:
        The test needs slave to be able to switch to row mode, so the
        test was changed to only execute in mixed and row mode.
      mysql-test/suite/rpl_ndb/t/rpl_ndb_row_001.test:
        The test needs slave to be able to switch to row mode, so the
        test was changed to only execute in mixed and row mode.
      mysql-test/suite/rpl_ndb/t/rpl_ndb_sp003.test:
        The test needs slave to be able to switch to row mode, so the
        test was changed to only execute in mixed and row mode.
      mysql-test/suite/rpl_ndb/t/rpl_ndb_sp006.test:
        The test needs slave to be able to switch to row mode, so the
        test was changed to only execute in mixed and row mode.
      mysql-test/suite/rpl_ndb/t/rpl_ndb_trig004.test:
        The test needs slave to be able to switch to row mode, so the
        test was changed to only execute in mixed and row mode.
      mysql-test/t/partition_innodb_stmt.test:
        Changed error code for innodb updates with READ COMMITTED or 
        READ UNCOMMITTED transaction isolation level and
        binlog_format=statement.
      sql/event_db_repository.cc:
        Use member function to read current_stmt_binlog_row_based.
      sql/events.cc:
        Use member function to read current_stmt_binlog_row_based.
      sql/ha_ndbcluster_binlog.cc:
        reset_current_stmt_binlog_row_based() is not a no-op for the ndb_binlog
        thread any more. Instead, the ndb_binlog thread now forces row mode both
        initially and just after calling mysql_parse.  (mysql_parse() is the only
        place where reset_current_stmt_binlog_row_based() may be called from
        the ndb_binlog thread, so these are the only two places that need to
        change.)
      sql/ha_partition.cc:
        Use member function to read current_stmt_binlog_row_based.
      sql/handler.cc:
        Use member function to read current_stmt_binlog_row_based.
      sql/item_create.cc:
        Added DBUG_ENTER to some functions, to be able to trace when
        set_stmt_unsafe is called.
      sql/log.cc:
        Use member function to read current_stmt_binlog_row_based.
      sql/log_event.cc:
         - Moved logic for changing to row format out of do_apply_event (and into
           decide_logging_format).
         - Added @todo comment for post-push cleanup.
      sql/log_event_old.cc:
        Move logic for changing to row format out of do_apply_event (and into
        decide_logging_format).
      sql/mysql_priv.h:
        Make decide_logging_format() a member of the THD class, for two reasons:
         - It is natural from an object-oriented perspective.
         - decide_logging_format() needs to access private members of THD
           (specifically, the new binlog_warning_flags field).
      sql/rpl_injector.cc:
        Removed call to set_current_stmt_binlog_row_based().
        From now on, only decide_logging_fromat is allowed to modify
        current_stmt_binlog_row_based. This call is from the ndb_binlog
        thread, mostly executing code in ha_ndbcluster_binlog.cc.
        This call can be safely removed, because:
         - current_stmt_binlog_row_based is initialized for the ndb_binlog
           thread's THD object when the THD object is created. So we're
           not going to read uninitialized memory.
         - The behavior of ndb_binlog thread does not use the state of the
           current_stmt_binlog_row_based. It is conceivable that the
           ndb_binlog thread would rely on the current_stmt_binlog_format
           in two situations:
            (1) when it calls mysql_parse;
            (2) when it calls THD::binlog_query.
           In case (1), it always clears THD::options&OPTION_BIN_LOG (because
           run_query() in ha_ndbcluster_binlog.cc is only called with
           disable_binlogging = TRUE).
           In case (2), it always uses qtype=STMT_QUERY_TYPE.
      sql/set_var.cc:
        Added @todo comment for post-push cleanup.
      sql/share/errmsg.txt:
        Added new error messages and clarified ER_BINLOG_UNSAFE_STATEMENT.
      sql/sp.cc:
        Added DBUG_ENTER, to be able to trace when set_stmt_unsafe is called.
        Got rid of MYSQL_QUERY_TYPE: it was equivalent to STMT_QUERY_TYPE.
      sql/sp_head.cc:
        Use member function to read current_stmt_binlog_row_based.
      sql/sp_head.h:
        Added DBUG_ENTER, to be able to trace when set_stmt_unsafe is called.
      sql/sql_acl.cc:
        Got rid of MYSQL_QUERY_TYPE: it was equivalent to STMT_QUERY_TYPE.
      sql/sql_base.cc:
         - Made decide_logging_format take care of all logic for deciding the
           logging format, and for determining the related warnings and errors.
           See comment above decide_logging_format for details.
         - Made decide_logging_format a member function of THD, since it needs
           to access private members of THD and since its purpose is to update
           the state of a THD object.
         - Added DBUG_ENTER, to be able to trace when set_stmt_unsafe is called.
      sql/sql_class.cc:
        - Moved logic for determining unsafe warnings away from THD::binlog_query
          (and into decide_logging_format()). Now, it works like this:
          1. decide_logging_format detects that the current statement shall
             produce a warning, if it ever makes it to the binlog
          2. decide_logging_format sets a flag of THD::binlog_warning_flags.
          3. THD::binlog_query reads the flag. If the flag is set, it generates
             a warning.
        - Use member function to read current_stmt_binlog_row_based.
      sql/sql_class.h:
        - Added THD::binlog_warning_flags (see sql_class.cc for explanation).
        - Made decide_logging_format() and reset_for_next_command() member
          functions of THD (instead of standalone functions). This was needed
          for two reasons: (1) the functions need to access the private member
          THD::binlog_warning_flags; (2) the purpose of these functions is to
          update the staet of a THD object, so from an object-oriented point
          of view they should be member functions.
        - Encapsulated current_stmt_binlog_row_based, so it is now private and
          can only be accessed from a member function. Also changed the
          data type to an enumeration instead of a bool.
        - Removed MYSQL_QUERY_TYPE, because it was equivalent to
          STMT_QUERY_TYPE anyways.
        - When reset_current_stmt_binlog_row_based was called from the
          ndb_binlog thread, it would behave as a no-op. This special
          case has been removed, and the behavior of
          reset_current_stmt_binlog_row_based does not depend on which thread
          calls it any more. The special case did not serve any purpose,
          since the ndb binlog thread did not take the
          current_stmt_binlog_row_based flag into account anyways.
      sql/sql_delete.cc:
        - Moved logic for setting row format for DELETE..LIMIT away from
          mysql_prepare_delete.
          (Instead, we mark the statement as unsafe at parse time (sql_yacc.yy)
          and rely on decide_logging_format() (sql_class.cc) to set row format.)
          This is part of the fix for BUG#45831.
        - Use member function to read current_stmt_binlog_row_based.
      sql/sql_insert.cc:
         - Removed unnecessary calls to thd->lex->set_stmt_unsafe() and
           thd->set_current_stmt_binlog_row_based_if_mixed() from
           handle_delayed_insert(). The calls are unnecessary because they
           have already been made; they were made in the constructor of
           the `di' object.
         - Since decide_logging_format() is now a member function of THD, code
           that calls decide_logging_format() had to be updated.
         - Added DBUG_ENTER call, to be able to trace when set_stmt_unsafe is
           called.
         - Moved call to set_stmt_unsafe() for INSERT..SELECT..LIMIT away from
           mysql_insert_select_prepare() (and into decide_logging_format).
           This is part of the fix for BUG#45831.
         - Use member function to read current_stmt_binlog_row_based.
      sql/sql_lex.h:
         - Added the flag BINLOG_STMT_FLAG_ROW_INJECTION to enum_binlog_stmt_flag.
           This was necessary so that a statement can identify itself as a row
           injection.
         - Added appropriate setter and getter functions for the new flag.
         - Added or clarified some comments.
         - Added DBUG_ENTER()
      sql/sql_load.cc:
        Use member function to read current_stmt_binlog_row_based.
      sql/sql_parse.cc:
         - Made mysql_reset_thd_for_next_command() clear thd->binlog_warning_flags.
         - Since thd->binlog_warning_flags is private, it must be set in a
           member function of THD. Hence, moved the body of
           mysql_reset_thd_for_next_command() to the new member function
           THD::reset_thd_for_next_command(), and made
           mysql_reset_thd_for_next_command() call
           THD::reset_thd_for_next_command().
         - Removed confusing comment.
         - Use member function to read current_stmt_binlog_row_based.
      sql/sql_repl.cc:
        Use member function to read current_stmt_binlog_row_based.
      sql/sql_table.cc:
        Use member function to read current_stmt_binlog_row_based.
      sql/sql_udf.cc:
        Use member function to read current_stmt_binlog_row_based.
      sql/sql_update.cc:
        Moved logic for setting row format for UPDATE..LIMIT away from
        mysql_prepare_update.
        (Instead, we mark the statement as unsafe at parse time (sql_yacc.yy)
        and rely on decide_logging_format() (sql_class.cc) to set row format.)
        This is part of the fix for BUG#45831.
      sql/sql_yacc.yy:
        Made INSERT DELAYED, INSERT..SELECT..LIMIT, UPDATE..LIMIT, and
        DELETE..LIMIT mark themselves as unsafe at parse time (instead
        of at execution time).
        This is part of the fixes BUG#45831 and BUG#45825.
      storage/example/ha_example.cc:
        Made exampledb accept inserts. This was needed by the new test case
        rpl_ndb_binlog_format_errors, because it needs an engine that
        is statement-only (and accepts inserts).
      storage/example/ha_example.h:
        Made exampledb a statement-only engine instead of a row-only engine.
        No existing test relied exampledb's row-only capabilities. The new
        test case rpl_ndb_binlog_format_errors needs an engine that is
        statement-only.
      storage/innobase/handler/ha_innodb.cc:
        - Changed error error code and message given by innodb when 
          binlog_format=STATEMENT and transaction isolation level is
          READ COMMITTED or READ UNCOMMITTED.
        - While I was here, also simplified the condition for
          checking when to give the error.
      41783de5
  25. 09 Apr, 2009 1 commit
    • He Zhenxing's avatar
      Post fix of BUG#37145 · caaa8531
      He Zhenxing authored
      Binlog the CREATE EVENT unless the created event been successfully dropped
      
      Modified Query_log_event constructor to make sure that error_code
      is not set to ER_SERVER_SHUTDOWN or ER_QUERY_INTERRUPTED errors
      when NOT_KILLED
      
      sql/events.cc:
        binlog the create event unless it's been successfully dropped
      sql/log_event.cc:
        Modified Query_log_event constructor to make sure that error_code
        is not set to ER_SERVER_SHUTDOWN or ER_QUERY_INTERRUPTED errors
        when NOT_KILLED
      caaa8531
  26. 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
  27. 22 Feb, 2008 1 commit
    • unknown's avatar
      Fix for bug#22738 Events: After stop and start disabled events could reside in the queue · 5d6ca9c2
      unknown authored
      Disabled events weren't removed from the memory queue after the scheduler has been
      re-enabled. After recalculation of next execution time of an event, it might get disabled.
      
      
      sql/event_queue.cc:
        Sort the event queue in a way that the disabled events will always be
        at the end. We will use this for cleaning it, starting from the end.
        
        After recalculating times in the queue, after the scheduler has been enabled
        after disabled state, the queue should be cleaned from DISABLED events.
        The queue is sorted in a way such that the disabled events are at the end.
        Thus, we can start from the end of the queue and remove all DISABLED till we
        find the first with different state.
      sql/events.cc:
        Add a comment about possible problem with replication of events,
        disabled events and server restarts.
      5d6ca9c2
  28. 19 Feb, 2008 1 commit
  29. 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
  30. 05 Nov, 2007 1 commit
    • unknown's avatar
      Bug#31210 - INSERT DELAYED crashes server when used on · e5b2745e
      unknown authored
                  partitioned table
      
      Trying INSERT DELAYED on a partitioned table, that has not been
      used right before, crashes the server. When a table is used for
      select or update, it is kept open for some time. This period I
      mean with "right before".
      
      Information about partitioning of a table is stored in form of
      a string in the .frm file. Parsing of this string requires a
      correctly set up lexical analyzer (lex). The partitioning code
      uses a new temporary instance of a lex. But it does still refer
      to the previously active lex. The delayd insert thread does not
      initialize its lex though...
      
      Added initialization for thd->lex before open table in the delayed
      thread and at all other places where it is necessary to call
      lex_start() if all tables would be partitioned and need to parse
      the .frm file.
      
      
      mysql-test/r/partition_hash.result:
        Bug#31210 - INSERT DELAYED crashes server when used on
                    partitioned table
        Added test result
      mysql-test/t/partition_hash.test:
        Bug#31210 - INSERT DELAYED crashes server when used on
                    partitioned table
        Added test
      sql/event_scheduler.cc:
        Bug#31210 - INSERT DELAYED crashes server when used on
                    partitioned table
        Initialized lex for later use in open_table().
      sql/events.cc:
        Bug#31210 - INSERT DELAYED crashes server when used on
                    partitioned table
        Initialized lex for later use in open_table().
      sql/ha_ndbcluster_binlog.cc:
        Bug#31210 - INSERT DELAYED crashes server when used on
                    partitioned table
        Initialized lex for later use in open_table().
      sql/slave.cc:
        Bug#31210 - INSERT DELAYED crashes server when used on
                    partitioned table
        Initialized lex for later use in open_table().
      sql/sql_acl.cc:
        Bug#31210 - INSERT DELAYED crashes server when used on
                    partitioned table
        Initialized lex for later use in open_table().
      sql/sql_base.cc:
        Bug#31210 - INSERT DELAYED crashes server when used on
                    partitioned table
        Asserted that lex is initialized in open_table().
      sql/sql_connect.cc:
        Bug#31210 - INSERT DELAYED crashes server when used on
                    partitioned table
        Initialized lex for later use in open_table().
      sql/sql_insert.cc:
        Bug#31210 - INSERT DELAYED crashes server when used on
                    partitioned table
        Added initialization for thd->lex before open table.
      sql/sql_lex.cc:
        Bug#31210 - INSERT DELAYED crashes server when used on
                    partitioned table
        Added 'is_lex_started' to test if lex is initialized.
      sql/sql_lex.h:
        Bug#31210 - INSERT DELAYED crashes server when used on
                    partitioned table
        Added 'is_lex_started' to test if lex is initialized.
      sql/sql_plugin.cc:
        Bug#31210 - INSERT DELAYED crashes server when used on
                    partitioned table
        Initialized lex for later use in open_table().
      sql/sql_servers.cc:
        Bug#31210 - INSERT DELAYED crashes server when used on
                    partitioned table
        Initialized lex for later use in open_table().
      sql/sql_udf.cc:
        Bug#31210 - INSERT DELAYED crashes server when used on
                    partitioned table
        Initialized lex for later use in open_table().
      sql/table.cc:
        Bug#31210 - INSERT DELAYED crashes server when used on
                    partitioned table
        Asserted that lex is initialized in open_table_from_share().
      sql/tztime.cc:
        Bug#31210 - INSERT DELAYED crashes server when used on
                    partitioned table
        Initialized lex for later use in open_table().
      e5b2745e
  31. 22 Oct, 2007 1 commit
    • unknown's avatar
      Bug #31332 --event-scheduler option misbehaving · c6e00be9
      unknown authored
        
      Changed the behaviour of the --event-scheduler option when used without an arguments. It
      now turns the option on.
      
      
      mysql-test/r/events_bugs.result:
        Test that --event-scheduler with no options in events_bugs-master.opt turns the option
        on.
      mysql-test/t/events_bugs.test:
        Test that --event-scheduler with no options in events_bugs-master.opt turns the option
        on.
      sql/events.cc:
        Changed the behaviour of the --event-scheduler option when used without an arguments.
        It now turns the option on.
      mysql-test/t/events_bugs-master.opt:
        Test that --event-scheduler with no options in events_bugs-master.opt turns the option
        on.
      c6e00be9
  32. 19 Oct, 2007 1 commit
    • unknown's avatar
      Patch for BUG#31111: --read-only crashes MySQL (events fail to load). · 66cd6d0c
      unknown authored
      There actually were several problems here:
        - WRITE-lock is required to load events from the mysql.event table,
          but in the read-only mode an ordinary user can not acquire it;
        - Security_context::master_access attribute was not properly
          initialized in Security_context::init(), which led to differences
          in behavior with and without debug configure options.
        - if the server failed to load events from mysql.event, it forgot to
          close the mysql.event table, that led to the coredump, described
          in the bug report.
      
      The patch is to fix all these problems:
        - Use the super-user to acquire WRITE-lock on the mysql.even table;
        - The WRITE-lock is acquired by the event scheduler in two cases:
          - on initial loading of events from the database;
          - when an event has been executed, so its attributes should
            be updated.
          Other cases when WRITE-lock is needed for the mysql.event table
          happen under the user account. So, nothing should be changed there
          for the read-only mode. The user is able to create/update/drop
          an event only if he is a super-user.
        - Initialize Security_context::master_access;
        - Close the mysql.event table in case something went wrong.
      
      
      mysql-test/r/events_bugs.result:
        Update result file.
      mysql-test/t/events_bugs.test:
        A test case for BUG#31111: --read-only crashes MySQL (events fail
        to load).
      sql/event_data_objects.cc:
        When the worker thread is going to drop event after the execution
        we should do it under the super-user privileges in order to be able
        to lock the mysql.event table for writing in the read-only mode.
        
        This is a system operation, where user SQL can not be executed.
        So, there is no risk in compromising security by dropping an event
        under the super-user privileges.
      sql/event_db_repository.cc:
        1. Close tables if something went wrong in simple_open_n_lock_tables();
        2. As soon as the system event scheduler thread is running under
           the super-user privileges, we should always be able to acquire
           WRITE-lock on the mysql.event table. However, let's have an assert
           to check this.
      sql/event_scheduler.cc:
        Run the system event scheduler thread under the super-user privileges.
        In particular, this is needed to be able to lock the mysql.event table
        for writing when the server is running in the read-only mode.
        
        The event scheduler executes only system operations and does not
        execute user SQL (this is what the worker threads for). So, there
        is no risk in compromising security by running the event scheduler
        under the super-user privileges.
      sql/events.cc:
        Open the mysql.event table as the super user to be able to acquire
        WRITE-lock in the read-only mode.
      sql/sql_class.cc:
        Initialize Security_context::master_acces.
      66cd6d0c
  33. 15 Aug, 2007 2 commits
    • unknown's avatar
      Provide initial module structure to Doxygen. · 7691bbbf
      unknown authored
      sql/event_data_objects.cc:
        Add module comments.
      sql/event_data_objects.h:
        Add module comments.
      sql/event_db_repository.cc:
        Add module comments.
      sql/event_db_repository.h:
        Add module comments.
      sql/event_queue.cc:
        Add module comments.
      sql/event_queue.h:
        Add module comments.
      sql/event_scheduler.cc:
        Add module comments.
      sql/event_scheduler.h:
        Add module comments.
      sql/events.cc:
        Add module comments.
      sql/events.h:
        Add module comments.
      sql/lock.cc:
        Add module comments.
      sql/sp_head.h:
        Add module comments.
      sql/sql_base.cc:
        Add module comments.
      sql/sql_lex.h:
        Add module comments.
      sql/sql_parse.cc:
        Add module comments.
      sql/sql_select.cc:
        Add module comments.
      sql/sql_yacc.yy:
        Add module comments.
      7691bbbf
    • unknown's avatar
      Fix doxygen warnings. · c514373c
      unknown authored
      client/mysqldump.c:
        Fix doxygen warnings
      mysys/test_charset.c:
        Fix doxygen warnings
      sql/event_db_repository.cc:
        Fix doxygen warnings
      sql/events.cc:
        Fix doxygen warnings
      sql/events.h:
        Fix doxygen warnings
      sql/item_create.cc:
        Fix doxygen warnings, style.
      sql/item_create.h:
        Fix coding style.
      sql/item_subselect.cc:
        Fix doxygen warnings
      sql/lock.cc:
        Fix doxygen warnings
      sql/sp.cc:
        Fix doxygen warnings
      sql/sp_head.h:
        Fix doxygen warnings
      sql/sql_analyse.cc:
        Fix doxygen warnings
      sql/sql_analyse.h:
        Fix doxygen warnings
      sql/sql_base.cc:
        Fix doxygen warnings
      sql/sql_db.cc:
        Fix doxygen warnings
      sql/sql_lex.cc:
        Fix doxygen warnings
      sql/sql_lex.h:
        Fix doxygen warnings
      sql/sql_parse.cc:
        Fix doxygen warnings
      sql/sql_plugin.cc:
        Fix doxygen warnings
      sql/sql_prepare.cc:
        Fix doxygen warnings
      sql/sql_show.cc:
        Fix doxygen warnings
      sql/sql_trigger.cc:
        Fix doxygen warnings
      sql/sql_update.cc:
        Fix doxygen warnings
      sql/table.h:
        Fix doxygen warnings
      c514373c
  34. 12 Jul, 2007 1 commit
    • unknown's avatar
      Fix for 5.1 for BUG#10491: Server returns data as charset binary · 6ba23b0a
      unknown authored
      SHOW CREATE TABLE or SELECT FROM I_S.
      
      This is the last patch for this bug, which depends on the big
      CS patch and was pending.
      
      The problem was that SHOW CREATE statements returned original
      queries in the binary character set. That could cause the query
      to be unreadable.
      
      The fix is to use original character_set_client when sending
      the original query to the client. In order to preserve the query
      in mysqldump, 'binary' character set results should be set when
      issuing SHOW CREATE statement. If either source or destination
      character set is 'binary' , no conversion is performed.
      The idea is that since the source character set is no longer
      'binary', we fix the destination character set to still produce
      valid dumps.
      
      
      client/mysqldump.c:
        Switch character_set_results of mysqldump-connection before
        calling SHOW CREATE statements for the objects.
      mysql-test/r/show_check.result:
        Result file.
      mysql-test/t/show_check.test:
        Add test case for the part of BUG#10491.
      sql/events.cc:
        Send original query in the original character set.
      sql/sp_head.cc:
        Send original query in the original character set.
      sql/sql_show.cc:
        Send original query in the original character set.
      6ba23b0a
  35. 28 Jun, 2007 1 commit
    • unknown's avatar
      Patch for the following bugs: · 405f82d3
      unknown authored
        - BUG#11986: Stored routines and triggers can fail if the code
          has a non-ascii symbol
        - BUG#16291: mysqldump corrupts string-constants with non-ascii-chars
        - BUG#19443: INFORMATION_SCHEMA does not support charsets properly
        - BUG#21249: Character set of SP-var can be ignored
        - BUG#25212: Character set of string constant is ignored (stored routines)
        - BUG#25221: Character set of string constant is ignored (triggers)
      
      There were a few general problems that caused these bugs:
      1. Character set information of the original (definition) query for views,
         triggers, stored routines and events was lost.
      2. mysqldump output query in client character set, which can be
         inappropriate to encode definition-query.
      3. INFORMATION_SCHEMA used strings with mixed encodings to display object
         definition;
      
      1. No query-definition-character set.
      
      In order to compile query into execution code, some extra data (such as
      environment variables or the database character set) is used. The problem
      here was that this context was not preserved. So, on the next load it can
      differ from the original one, thus the result will be different.
      
      The context contains the following data:
        - client character set;
        - connection collation (character set and collation);
        - collation of the owner database;
      
      The fix is to store this context and use it each time we parse (compile)
      and execute the object (stored routine, trigger, ...).
      
      2. Wrong mysqldump-output.
      
      The original query can contain several encodings (by means of character set
      introducers). The problem here was that we tried to convert original query
      to the mysqldump-client character set.
      
      Moreover, we stored queries in different character sets for different
      objects (views, for one, used UTF8, triggers used original character set).
      
      The solution is
        - to store definition queries in the original character set;
        - to change SHOW CREATE statement to output definition query in the
          binary character set (i.e. without any conversion);
        - introduce SHOW CREATE TRIGGER statement;
        - to dump special statements to switch the context to the original one
          before dumping and restore it afterwards.
      
      Note, in order to preserve the database collation at the creation time,
      additional ALTER DATABASE might be used (to temporary switch the database
      collation back to the original value). In this case, ALTER DATABASE
      privilege will be required. This is a backward-incompatible change.
      
      3. INFORMATION_SCHEMA showed non-UTF8 strings
      
      The fix is to generate UTF8-query during the parsing, store it in the object
      and show it in the INFORMATION_SCHEMA.
      
      Basically, the idea is to create a copy of the original query convert it to
      UTF8. Character set introducers are removed and all text literals are
      converted to UTF8.
      
      This UTF8 query is intended to provide user-readable output. It must not be
      used to recreate the object.  Specialized SHOW CREATE statements should be
      used for this.
      
      The reason for this limitation is the following: the original query can
      contain symbols from several character sets (by means of character set
      introducers).
      
      Example:
      
        - original query:
          CREATE VIEW v1 AS SELECT _cp1251 'Hello' AS c1;
      
        - UTF8 query (for INFORMATION_SCHEMA):
          CREATE VIEW v1 AS SELECT 'Hello' AS c1;
      
      
      client/mysqldump.c:
        Set original character set and collation before dumping definition query.
      include/my_sys.h:
        Move out-parameter to the end of list.
      mysql-test/lib/mtr_report.pl:
        Ignore server-warnings during the test case.
      mysql-test/r/create.result:
        Update result file.
      mysql-test/r/ctype_cp932_binlog_stm.result:
        Update result file.
      mysql-test/r/events.result:
        Update result file.
      mysql-test/r/events_bugs.result:
        Update result file.
      mysql-test/r/events_grant.result:
        Update result file.
      mysql-test/r/func_in.result:
        Update result file.
      mysql-test/r/gis.result:
        Update result file.
      mysql-test/r/grant.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/lowercase_view.result:
        Update result file.
      mysql-test/r/mysqldump.result:
        Update result file.
      mysql-test/r/ndb_sp.result:
        Update result file.
      mysql-test/r/ps.result:
        Update result file.
      mysql-test/r/rpl_replicate_do.result:
        Update result file.
      mysql-test/r/rpl_sp.result:
        Update result file.
      mysql-test/r/rpl_trigger.result:
        Update result file.
      mysql-test/r/rpl_view.result:
        Update result file.
      mysql-test/r/show_check.result:
        Update result file.
      mysql-test/r/skip_grants.result:
        Update result file.
      mysql-test/r/sp-destruct.result:
        Update result file.
      mysql-test/r/sp-error.result:
        Update result file.
      mysql-test/r/sp-security.result:
        Update result file.
      mysql-test/r/sp.result:
        Update result file.
      mysql-test/r/sql_mode.result:
        Update result file.
      mysql-test/r/system_mysql_db.result:
        Update result file.
      mysql-test/r/temp_table.result:
        Update result file.
      mysql-test/r/trigger-compat.result:
        Update result file.
      mysql-test/r/trigger-grant.result:
        Update result file.
      mysql-test/r/trigger.result:
        Update result file.
      mysql-test/r/view.result:
        Update result file.
      mysql-test/r/view_grant.result:
        Update result file.
      mysql-test/t/events.test:
        Update test case (new columns added).
      mysql-test/t/information_schema.test:
        Update test case (new columns added).
      mysql-test/t/show_check.test:
        Test case for SHOW CREATE TRIGGER in prepared statements and
        stored routines.
      mysql-test/t/sp-destruct.test:
        Update test case (new columns added).
      mysql-test/t/sp.test:
        Update test case (new columns added).
      mysql-test/t/view.test:
        Update test.
      mysys/charset.c:
        Move out-parameter to the end of list.
      scripts/mysql_system_tables.sql:
        Add new columns to mysql.proc and mysql.event.
      scripts/mysql_system_tables_fix.sql:
        Add new columns to mysql.proc and mysql.event.
      sql/event_data_objects.cc:
        Support new attributes for events.
      sql/event_data_objects.h:
        Support new attributes for events.
      sql/event_db_repository.cc:
        Support new attributes for events.
      sql/event_db_repository.h:
        Support new attributes for events.
      sql/events.cc:
        Add new columns to SHOW CREATE event resultset.
      sql/mysql_priv.h:
        1. Introduce Object_creation_ctx;
        2. Introduce SHOW CREATE TRIGGER;
        3. Introduce auxilary functions.
      sql/sp.cc:
        Add support for new store routines attributes.
      sql/sp_head.cc:
        Add support for new store routines attributes.
      sql/sp_head.h:
        Add support for new store routines attributes.
      sql/sql_lex.cc:
        Generate UTF8-body on parsing/lexing.
      sql/sql_lex.h:
        1. Generate UTF8-body on parsing/lexing.
        2. Introduce SHOW CREATE TRIGGER.
      sql/sql_parse.cc:
        Introduce SHOW CREATE TRIGGER.
      sql/sql_partition.cc:
        Update parse_sql().
      sql/sql_prepare.cc:
        Update parse_sql().
      sql/sql_show.cc:
        Support new attributes for views
      sql/sql_trigger.cc:
        Support new attributes for views
      sql/sql_trigger.h:
        Support new attributes for views
      sql/sql_view.cc:
        Support new attributes for views
      sql/sql_yacc.yy:
        1. Add SHOW CREATE TRIGGER statement.
        2. Generate UTF8-body for views, stored routines, triggers and events.
      sql/table.cc:
        Introduce Object_creation_ctx.
      sql/table.h:
        Introduce Object_creation_ctx.
      sql/share/errmsg.txt:
        Add new errors.
      mysql-test/include/ddl_i18n.check_events.inc:
        Aux file for test suite.
      mysql-test/include/ddl_i18n.check_sp.inc:
        Aux file for test suite.
      mysql-test/include/ddl_i18n.check_triggers.inc:
        Aux file for test suite.
      mysql-test/include/ddl_i18n.check_views.inc:
        Aux file for test suite.
      mysql-test/include/have_cp1251.inc:
        Aux file for test suite.
      mysql-test/include/have_cp866.inc:
        Aux file for test suite.
      mysql-test/include/have_koi8r.inc:
        Aux file for test suite.
      mysql-test/include/have_utf8.inc:
        Aux file for test suite.
      mysql-test/r/ddl_i18n_koi8r.result:
        Result file.
      mysql-test/r/ddl_i18n_utf8.result:
        Result file.
      mysql-test/r/have_cp1251.require:
        Aux file for test suite.
      mysql-test/r/have_cp866.require:
        Aux file for test suite.
      mysql-test/r/have_koi8r.require:
        Aux file for test suite.
      mysql-test/r/have_utf8.require:
        Aux file for test suite.
      mysql-test/t/ddl_i18n_koi8r.test:
        Complete koi8r test case for the CS patch.
      mysql-test/t/ddl_i18n_utf8.test:
        Complete utf8 test case for the CS patch.
      405f82d3
  36. 19 Jun, 2007 1 commit
    • unknown's avatar
      Bug #26418: Slave out of sync after · fe593bf1
      unknown authored
       CREATE/DROP TEMPORARY TABLE + ROLLBACK on master
      
      The transaction ability of the storage engines of
      the tables on the replication master and the replication
      slave must generally be the same.
      When the storage engine type of the slave is 
      non-transactional then transactions on the master that 
      mix update of transactional and non-transactional tables
      should be avoided because they will cause inconsistency of
      the data between the master's transactional table and the
      slave's non-transactional table.
      
      The effect described by this bug is actually expected.
      A detailed test case is added (to be merged later to
      the updated rpl_ddl.test), as there was no coverage 
      by the existing tests. 
      Some code cleanup is also added by this change.
      
      
      mysql-test/r/rpl_innodb.result:
        Bug #26418: test case
      mysql-test/t/rpl_innodb.test:
        Bug #26418: test case
      sql/events.cc:
        Bug #26418: replace repeating code with a function call
      sql/sp.cc:
        Bug #26418: replace repeating code with a function call
      sql/sql_acl.cc:
        Bug #26418: replace repeating code with a function call
      sql/sql_class.cc:
        Bug #26418: remove dead code
      sql/sql_class.h:
        Bug #26418: remove dead code
      sql/sql_delete.cc:
        Bug #26418: replace repeating code with a function call
      sql/sql_parse.cc:
        Bug #26418: replace repeating code with a function call
      sql/sql_rename.cc:
        Bug #26418: replace repeating code with a function call
      sql/sql_tablespace.cc:
        Bug #26418: replace repeating code with a function call
      sql/sql_trigger.cc:
        Bug #26418: replace repeating code with a function call
      sql/sql_udf.cc:
        Bug #26418: replace repeating code with a function call
      sql/sql_view.cc:
        Bug #26418: replace repeating code with a function call
      fe593bf1
  37. 14 Apr, 2007 1 commit
    • unknown's avatar
      Fix rpl_events test failure in the runtime tree. · ab59263b
      unknown authored
      mysql-test/r/rpl_events.result:
        Now ON COMPLETION NOT PRESERVE events are also dropped on the
        slave, since DROP EVENT command that is invoked for all such commands
        gets invoked on the slave.
      sql/event_data_objects.cc:
        Fix the failing rpl_events test after the patch for Bug#27733.
        At the time Events::drop_event got invoked inside
        Event_job_data::execute() thd->query pointed to CREATE PROCEDURE
        statement. This statement was written to the binary log
        from inside Events::drop_event (under assumption that this is a
        DROP EVENT statement that needs to be replicated), and caused
        creation of this procedure on the slave (and a subsequent failure
        when a procedure with the same name already exist).
        
        The patch ensures that thd->query points at the right query text
        for DROP EVENT executed when dropping ON COMPLETION NOT PRESERVE 
        events.
      sql/event_data_objects.h:
        Update a  declaration.
      sql/events.cc:
        Change if () to an assert: thd->query now always points at a valid
        query.
      ab59263b
  38. 05 Apr, 2007 1 commit
    • unknown's avatar
      A fix for events_trans.test failure on many hosts (5.1-runtime) · a06ff976
      unknown authored
      sql/event_data_objects.cc:
        Disable an event if its data in the table is corrupted.
      sql/events.cc:
        A fix for events_trans failure on most of the hosts.
        A better error message if the event table is old
        (don't suggest it's corrupted, it may simply have bad data).
      a06ff976