1. 12 Dec, 2007 1 commit
    • unknown's avatar
      Bug#32395 Alter table under a impending global read lock causes a server crash · e5a397e2
      unknown authored
      The problem is that some DDL statements (ALTER TABLE, CREATE
      TRIGGER, FLUSH TABLES, ...) when under LOCK TABLES need to
      momentarily drop the lock, reopen the table and grab the write
      lock again (using reopen_tables). When grabbing the lock again,
      reopen_tables doesn't pass a flag to mysql_lock_tables in
      order to ignore the impending global read lock, which causes a
      assertion because LOCK_open is being hold. Also dropping the
      lock must not signal to any threads that the table has been
      relinquished (related to the locking/flushing protocol).
      
      The solution is to correct the way the table is reopenned
      and the locks grabbed. When reopening the table and under
      LOCK TABLES, the table version should be set to 0 so other
      threads have to wait for the table. When grabbing the lock,
      any other flush should be ignored because it's theoretically
      a atomic operation. The chosen solution also fixes a potential
      discrepancy between binlog and GRL (global read lock) because
      table placeholders were being ignored, now a FLUSH TABLES WITH
      READ LOCK will properly for table with open placeholders.
      
      It's also important to mention that this patch doesn't fix
      a potential deadlock if one uses two GRLs under LOCK TABLES
      concurrently.
      
      
      mysql-test/r/lock_multi.result:
        Add test case result for Bug#32395
      mysql-test/r/trigger_notembedded.result:
        Add test case result for Bug#32395
      mysql-test/t/lock_multi.test:
        Add test case for Bug#32395
      mysql-test/t/trigger_notembedded.test:
        Enable test case for Bug#32395
      sql/ha_ndbcluster.cc:
        Update close_cached_tables usage.
      sql/ha_ndbcluster_binlog.cc:
        Update close_cached_tables usage.
      sql/mysql_priv.h:
        Update close_cache_tables prototype.
      sql/set_var.cc:
        Update close_cached_tables usage and set flag to wait for
        tables with placeholders. This is one of the places where
        a GRL can be obtained.
      sql/sql_base.cc:
        Preserve old version for write locked tables and ignore
        pending flushes and update close_cache_tables to take
        into account name locked tables.
      sql/sql_parse.cc:
        Update close_cached_tables usage and pass flag so that
        name locked tables are waited for.
      sql/sql_table.cc:
        Protect the table against a impending GRL if under LOCK TABLES.
      e5a397e2
  2. 10 Dec, 2007 5 commits
  3. 07 Dec, 2007 1 commit
    • unknown's avatar
      Bug #27440 read_only allows create and drop database · 5826a5c4
      unknown authored
      When read_only option was enabled, a user without SUPER privilege could
      perform CREATE DATABASE and DROP DATABASE operations.
      
      This patch adds a check to make sure this isn't possible. It also attempts to 
      simplify the logic used to determine if relevant tables are updated,
      making it more human readable.
      
      
      mysql-test/r/read_only.result:
        Updated result file
      mysql-test/t/read_only.test:
        A test case is added which shows that it is not possible to drop or create a
        database in read-only mode despite having the GRANT permissions to do so,
        SUPER user excepted.
      sql/sql_parse.cc:
        - Simplified complex predicate by grouping it in a read friendly way.
        - Added predicate to fail on database updates while running in read-only
          mode.
      5826a5c4
  4. 05 Dec, 2007 2 commits
  5. 04 Dec, 2007 2 commits
  6. 30 Nov, 2007 6 commits
    • unknown's avatar
      Merge bk-internal.mysql.com:/home/bk/mysql-5.1-runtime · 6923c36a
      unknown authored
      into  mysql.com:/Users/davi/mysql/mysql-5.1-runtime
      
      
      6923c36a
    • unknown's avatar
      Merge mysql.com:/Users/davi/mysql/bugs/22312-5.1 · e0770a08
      unknown authored
      into  mysql.com:/Users/davi/mysql/mysql-5.1-runtime
      
      
      e0770a08
    • unknown's avatar
      A patch for BUG#32148: killing a query may be ineffective. · 4b954cc0
      unknown authored
      The problem was that THD::killed was reset after a command was
      read from the socket, but before it was actually handled. That lead
      to a race: if another KILL statement was issued for this connection
      in the middle of reading from the socket and processing a command,
      THD::killed state would be cleaned.
      
      The fix is to move this cleanup into net_send_error() function.
      
      A sample test case exists in binlog_killed.test:
        - connection 1: start a new transaction on table t1;
        - connection 2: send query to the server (w/o waiting for the
          result) to update data in table t1 -- this query will be blocked
          since there is unfinished transaction;
        - connection 1: kill query in connection 2 and finish the transaction;
        - connection 2: get result of the previous query -- it should be
          the "query-killed" error.
      
      This test however contains race condition, which can not be fixed
      with the current protocol: there is no way to guarantee, that the
      server will receive and start processing the query in connection 2
      (which is intended to get blocked) before the KILL command (sent in
      the connection 1) will arrive. In other words, there is no way to
      ensure that the following sequence will not happen:
      
        - connection 1: start a new transaction on table t1;
        - connection 1: kill query in connection 2 and finish the transaction;
        - connection 2: send query to the server (w/o waiting for the
          result) to update data in table t1 -- this query will be blocked
          since there is unfinished transaction;
        - connection 2: get result of the previous query -- the query will
          succeed.
      
      So, there is no test case for this bug, since it's impossible
      to write a reliable test case under the current circumstances.
      
      
      sql/protocol.cc:
        Move thd->killed cleanup from dispatch_command() to net_send_error().
      sql/sql_parse.cc:
        Move thd->killed cleanup from dispatch_command() to net_send_error().
      4b954cc0
    • unknown's avatar
      BUG#32723 (grant3.test fails) can not be reproduced. · 90477e23
      unknown authored
      Enabling the test case.
      
      
      mysql-test/t/disabled.def:
        Enable grant3.test.
      90477e23
    • unknown's avatar
      Bug#22312 Syntax error in expression with INTERVAL() · cdc382e7
      unknown authored
      Parser rejects valid INTERVAL() expressions when associated with
      arithmetic operators. The problem is the way in which the expression
      and interval grammar rules were organized caused shift/reduce conflicts.
      
      The solution is to tweak the interval rules to avoid shift/reduce
      conflicts by removing the broken interval_expr rule and explicitly
      specify it's content where necessary.
      
      Original fix by Davi Arnaut, revised and improved rules by Marc Alff
      
      
      mysql-test/r/parser.result:
        Add test case result for Bug#22312
      mysql-test/t/parser.test:
        Add test case for Bug#22312
      sql/sql_yacc.yy:
        Resolve shift/reduce conflicts by reorganizing the interval
        expression rules.
      cdc382e7
    • unknown's avatar
      A test case for BUG#26676: VIEW using old table schema in a session. · 9395421a
      unknown authored
      The following clarification should be made in The Manual:
      
      Standard SQL is quite clear that, if new columns are added
      to a table after a view on that table is created with
      "select *", the new columns will not become part of the view.
      In all cases, the view definition (view structure) is frozen
      at CREATE time, so changes to the underlying tables do not
      affect the view structure.
      
      
      mysql-test/r/view.result:
        Update result file.
      mysql-test/t/view.test:
        Add a test case for BUG#26676: VIEW using old table schema in a session.
      9395421a
  7. 29 Nov, 2007 1 commit
    • unknown's avatar
      Bug#23713 LOCK TABLES + CREATE TRIGGER + FLUSH TABLES WITH READ LOCK = deadlock · 87143063
      unknown authored
      This bug is actually two bugs in one, one of which is CREATE TRIGGER under
      LOCK TABLES and the other is CREATE TRIGGER under LOCK TABLES simultaneous
      to a FLUSH TABLES WITH READ LOCK (global read lock). Both situations could
      lead to a server crash or deadlock.
      
      The first problem arises from the fact that when under LOCK TABLES, if the
      table is in the set of locked tables, the table is already open and it doesn't
      need to be reopened (not a placeholder). Also in this case, if the table is
      not write locked, a exclusive lock can't be acquired because of a possible
      deadlock with another thread also holding a (read) lock on the table. The
      second issue arises from the fact that one should never wait for a global
      read lock if it's holding any locked tables, because the global read lock
      is waiting for these tables and this leads to a circular wait deadlock.
      
      The solution for the first case is to check if the table is write locked
      and upgraded the write lock to a exclusive lock and fail otherwise for non
      write locked tables. Grabbin the exclusive lock in this case also means
      to ensure that the table is opened only by the calling thread. The second
      issue is partly fixed by not waiting for the global read lock if the thread
      is holding any locked tables.
      
      The second issue is only partly addressed in this patch because it turned
      out to be much wider and also affects other DDL statements. Reported as
      Bug#32395
      
      
      mysql-test/r/trigger.result:
        Add test case result for Bug#23713
      mysql-test/r/trigger_notembedded.result:
        Add test case result for Bug#23713
      mysql-test/t/trigger.test:
        Add test case for Bug#23713
      mysql-test/t/trigger_notembedded.test:
        Add test case for Bug#23713
      sql/mysql_priv.h:
        Locally export wait_while_table_is_used and name_lock_locked_table
        and add flag to mysql_ha_rm_tables to signal that LOCK_open is locked.
      sql/sql_base.cc:
        Introduce name_lock_locked_table function and match
        close_old_data_files function declaration and definition.
      sql/sql_handler.cc:
        Add flag to mysql_ha_rm_tables to signal that LOCK_open is locked.
      sql/sql_rename.cc:
        Fix mysql_ha_rm_tables caller.
      sql/sql_table.cc:
        Export wait_while_table_is_used and assert that LOCK_open is locked
        and fix mysql_ha_rm_tables caller.
      sql/sql_trigger.cc:
        Upgrade write locked tables to a exclusive lock and fail if
        the table is not write locked. Also, don't wait for the global
        read lock if under LOCK TABLES.
      87143063
  8. 28 Nov, 2007 13 commits
  9. 27 Nov, 2007 9 commits