1. 06 Mar, 2007 1 commit
    • unknown's avatar
      Bug#8407 (Stored functions/triggers ignore exception handler) · 266a7fff
      unknown authored
      Bug 18914 (Calling certain SPs from triggers fail)
      Bug 20713 (Functions will not not continue for SQLSTATE VALUE '42S02')
      Bug 21825 (Incorrect message error deleting records in a table with a
        trigger for inserting)
      Bug 22580 (DROP TABLE in nested stored procedure causes strange dependency
        error)
      Bug 25345 (Cursors from Functions)
      
      
      This fix resolves a long standing issue originally reported with bug 8407,
      which affect the behavior of Stored Procedures, Stored Functions and Trigger
      in many different ways, causing symptoms reported by all the bugs listed.
      In all cases, the root cause of the problem traces back to 8407 and how the
      server locks tables involved with sub statements.
      
      Prior to this fix, the implementation of stored routines would:
      - compute the transitive closure of all the tables referenced by a top level
      statement
      - open and lock all the tables involved
      - execute the top level statement
      "transitive closure of tables" means collecting:
      - all the tables,
      - all the stored functions,
      - all the views,
      - all the table triggers
      - all the stored procedures
      involved, and recursively inspect these objects definition to find more
      references to more objects, until the list of every object referenced does
      not grow any more.
      This mechanism is known as "pre-locking" tables before execution.
      The motivation for locking all the tables (possibly) used at once is to
      prevent dead locks.
      
      One problem with this approach is that, if the execution path the code
      really takes during runtime does not use a given table, and if the table is
      missing, the server would not execute the statement.
      This in particular has a major impact on triggers, since a missing table
      referenced by an update/delete trigger would prevent an insert trigger to run.
      
      Another problem is that stored routines might define SQL exception handlers
      to deal with missing tables, but the server implementation would never give
      user code a chance to execute this logic, since the routine is never
      executed when a missing table cause the pre-locking code to fail.
      
      With this fix, the internal implementation of the pre-locking code has been
      relaxed of some constraints, so that failure to open a table does not
      necessarily prevent execution of a stored routine.
      
      In particular, the pre-locking mechanism is now behaving as follows:
      
      1) the first step, to compute the transitive closure of all the tables
      possibly referenced by a statement, is unchanged.
      
      2) the next step, which is to open all the tables involved, only attempts
      to open the tables added by the pre-locking code, but silently fails without
      reporting any error or invoking any exception handler is the table is not
      present. This is achieved by trapping internal errors with
      Prelock_error_handler
      
      3) the locking step only locks tables that were successfully opened.
      
      4) when executing sub statements, the list of tables used by each statements
      is evaluated as before. The tables needed by the sub statement are expected
      to be already opened and locked. Statement referencing tables that were not
      opened in step 2) will fail to find the table in the open list, and only at
      this point will execution of the user code fail.
      
      5) when a runtime exception is raised at 4), the instruction continuation
      destination (the next instruction to execute in case of SQL continue
      handlers) is evaluated.
      This is achieved with sp_instr::exec_open_and_lock_tables()
      
      6) if a user exception handler is present in the stored routine, that
      handler is invoked as usual, so that ER_NO_SUCH_TABLE exceptions can be
      trapped by stored routines. If no handler exists, then the runtime execution
      will fail as expected.
      
      With all these changes, a side effect is that view security is impacted, in
      two different ways.
      
      First, a view defined as "select stored_function()", where the stored
      function references a table that may not exist, is considered valid.
      The rationale is that, because the stored function might trap exceptions
      during execution and still return a valid result, there is no way to decide
      when the view is created if a missing table really cause the view to be invalid.
      
      Secondly, testing for existence of tables is now done later during
      execution. View security, which consist of trapping errors and return a
      generic ER_VIEW_INVALID (to prevent disclosing information) was only
      implemented at very specific phases covering *opening* tables, but not
      covering the runtime execution. Because of this existing limitation,
      errors that were previously trapped and converted into ER_VIEW_INVALID are
      not trapped, causing table names to be reported to the user.
      This change is exposing an existing problem, which is independent and will
      be resolved separately.
      
      
      mysql-test/r/information_schema_db.result:
        Revised the pre-locking code implementation, aligned the tests.
      mysql-test/r/sp-error.result:
        Revised the pre-locking code implementation, aligned the tests.
      mysql-test/r/sp.result:
        Revised the pre-locking code implementation, aligned the tests.
      mysql-test/r/trigger.result:
        Revised the pre-locking code implementation, aligned the tests.
      mysql-test/r/view.result:
        Revised the pre-locking code implementation, aligned the tests.
      mysql-test/t/sp-error.test:
        Revised the pre-locking code implementation, aligned the tests.
      mysql-test/t/sp.test:
        Revised the pre-locking code implementation, aligned the tests.
      mysql-test/t/trigger.test:
        Revised the pre-locking code implementation, aligned the tests.
      sql/lock.cc:
        table->placeholder now checks for schema_table
      sql/mysqld.cc:
        my_message_sql(): invoke internal exception handlers
      sql/sp_head.cc:
        exec_open_and_lock_tables(): open and lock tables, or return the
        continuation destination of this instruction
      sql/sp_head.h:
        exec_open_and_lock_tables(): open and lock tables, or return the
        continuation destination of this instruction
      sql/sql_base.cc:
        Prelock_error_handler: delay open table errors until execution
      sql/sql_class.cc:
        THD: add internal error handler, as an exception mechanism.
      sql/sql_class.h:
        THD: add internal error handler, as an exception mechanism.
      sql/sql_update.cc:
        table->placeholder now checks for schema_table
      sql/table.cc:
        st_table_list::hide_view_error(): masked more errors for view security
      sql/table.h:
        table->placeholder now checks for schema_table, and unopened tables
      266a7fff
  2. 25 Jan, 2007 3 commits
    • unknown's avatar
      Merge moonlight.home:/home/tomash/src/mysql_ab/mysql-5.0 · 74ac969d
      unknown authored
      into  moonlight.home:/home/tomash/src/mysql_ab/mysql-5.0-bug23527
      
      
      sql/sql_cache.cc:
        Auto merged
      74ac969d
    • unknown's avatar
      BUG#23527: set global query_cache_size can crash the server under · ef013268
      unknown authored
                 high load
      
      MySQL server could crash if two or more threads would initiate query
      cache resize at the moments very close in time.
      
      The problem was introduced with the fix of bug 21051 in 5.0 and 5.1:
      simultaneous query cache resizes would wait for the first one in
      progress, but then each thread would try to finish the operation,
      accessing the data that was already reset (attempt to dereference
      'bins' pointer, which may be NULL already).
      
      The solution is to check after synchronization if another thread has
      done the reset already (test 'query_cache_size > 0' again).
      
      No test case is provided because the bug is a subject to a race.
      
      
      sql/sql_cache.cc:
        We release 'structure_guard_mutex' in flush_cache(), so after the
        call we check if another thread had reset the cache before us.
      ef013268
    • unknown's avatar
      Merge bk-internal.mysql.com:/home/bk/mysql-5.0 · ea41474b
      unknown authored
      into  mockturtle.local:/home/dlenev/src/mysql-5.0-merge
      
      
      ea41474b
  3. 24 Jan, 2007 16 commits
  4. 23 Jan, 2007 12 commits
    • unknown's avatar
      Merge bk-internal.mysql.com:/home/bk/mysql-4.1-engines · 1f4d8ba0
      unknown authored
      into  chilla.local:/home/mydev/mysql-4.1-bug24607
      
      
      mysql-test/r/myisam.result:
        Auto merged
      mysql-test/t/myisam.test:
        Auto merged
      1f4d8ba0
    • unknown's avatar
      Merge bk-internal.mysql.com:/home/bk/mysql-5.0-engines · 4bec8b03
      unknown authored
      into  chilla.local:/home/mydev/mysql-5.0-bug24607
      
      
      mysql-test/r/myisam.result:
        Auto merged
      mysql-test/t/myisam.test:
        Auto merged
      4bec8b03
    • unknown's avatar
      Merge pnousiainen@bk-internal.mysql.com:/home/bk/mysql-5.0-ndb · 964f502c
      unknown authored
      into  clam.ndb.mysql.com:/export/space/pekka/ndb/version/my50-ndb
      
      
      964f502c
    • unknown's avatar
      Merge willster.(none):/home/stewart/Documents/MySQL/5.0/ndb · a7174850
      unknown authored
      into  willster.(none):/home/stewart/Documents/MySQL/5.0/bug25487
      
      
      a7174850
    • unknown's avatar
      Merge bk-internal.mysql.com:/home/bk/mysql-5.0-runtime · 5f544ed0
      unknown authored
      into  mockturtle.local:/home/dlenev/src/mysql-5.0-bg24491
      
      
      sql/item.h:
        Auto merged
      mysql-test/r/ps.result:
        Manual merge.
      mysql-test/t/ps.test:
        Manual merge.
      5f544ed0
    • unknown's avatar
      Merge mysql.com:/home/svoj/devel/mysql/BUG24401/mysql-4.1-engines · 2244a361
      unknown authored
      into  mysql.com:/home/svoj/devel/mysql/BUG24401/mysql-5.0-engines
      
      
      myisam/mi_open.c:
        Auto merged
      2244a361
    • unknown's avatar
      Proposed fix for bug#24491 "using alias from source table in insert ... · 1dead07d
      unknown authored
      on duplicate key".
      
      INSERT ... SELECT ... ON DUPLICATE KEY UPDATE which was used in
      stored routine or as prepared statement and which in its ON DUPLICATE
      KEY clause erroneously tried to assign value to a column mentioned only
      in its SELECT part was properly emitting error on the first execution
      but succeeded on the second and following executions.
      
      Code which is responsible for name resolution of fields mentioned in
      UPDATE clause (e.g. see select_insert::prepare()) modifies table list
      and Name_resolution_context used in this process. It uses
      Name_resolution_context_state::save_state/restore_state() to revert
      these modifications. Unfortunately those two methods failed to revert
      properly modifications to TABLE_LIST::next_name_resolution_table
      and this broke name resolution process for successive executions.
      
      This patch fixes Name_resolution_context_state::save_state/restore_state()
      in such way that it properly handles TABLE_LIST::next_name_resolution_table.
      
      
      mysql-test/r/ps.result:
        Added test case for bug#24491 "using alias from source table in insert ...
        on duplicate key"
      mysql-test/r/sp-error.result:
        Added test case for bug#24491 "using alias from source table in insert ...
        on duplicate key"
      mysql-test/t/ps.test:
        Added test case for bug#24491 "using alias from source table in insert ...
        on duplicate key"
      mysql-test/t/sp-error.test:
        Added test case for bug#24491 "using alias from source table in insert ...
        on duplicate key"
      sql/item.h:
        Name_resolution_context::save_state/restore_state():
          At the moment these methods are used only by code implementing
          INSERT and INSERT ... SELECT statements. This code doesn't modify
         'next_name_resolution_table' member of table list element
          corresponding to the first table of SELECT clause (pointed by
          'first_name_resolution_table'). But it modifies table list element
          corresponding to the target table of INSERT (pointed by 'table_list')
          So these methods were changed to reflect this.
      1dead07d
    • unknown's avatar
      ndb - bug#25562 use byte-size max_data_length() when setting blob part size · 25fb32ef
      unknown authored
      
      sql/ha_ndbcluster.cc:
        bug#25562 use byte-size max_data_length() when setting blob part size
      25fb32ef
    • unknown's avatar
      round up Transporter connect timeout · 68ab0996
      unknown authored
      
      ndb/src/common/transporter/Transporter.cpp:
        change so timeout is rounded up to nearest second
      68ab0996
    • unknown's avatar
      Bug #25487 deleting ndb_cluster_connection object takes long time · 8deeb2f9
      unknown authored
        
        aim is to:
        a) if set_connect_timeout called, timeout connect attempt (for retry on
        next call) after timeout period
        b) preserve existing blocking behaviour otherwise (for, e.g. mgmapi)
        
        Related to customer issue with long time deleting ndb_cluster_connection
        object. believe we're hanging on the connect(2) call until timeout (when
        we then realise we should exit the thread).
      
      
      ndb/include/mgmapi/mgmapi.h:
        add ndb_mgm_set_connect_timeout
      ndb/include/util/SocketClient.hpp:
        add timeout (seconds) for max time to wait for connection
      ndb/src/common/transporter/Transporter.cpp:
        set limit on amount of time we'll wait for tcp connect
      ndb/src/common/util/SocketClient.cpp:
        only try to connect for a maximum of timeout time
      ndb/src/mgmapi/mgmapi.cpp:
        add ndb_mgm_set_connect_timeout
      8deeb2f9
    • unknown's avatar
      ndb - bug#22013 · ab8355fa
      unknown authored
          Fix bug in event handling wrt early node shutdown
      
      
      ndb/src/mgmsrv/MgmtSrvr.cpp:
        Fix bug in event handling wrt early node shutdown
      ndb/src/ndbapi/ClusterMgr.cpp:
        Fix reportNodeFailed if only connected wo/ having received any API_REGCONF
      ndb/src/ndbapi/ClusterMgr.hpp:
        Fix reportNodeFailed if only connected wo/ having received any API_REGCONF
      ndb/src/ndbapi/SignalSender.cpp:
        Fix memleak
      ab8355fa
    • unknown's avatar
      bug#25746 ndb: 4209 error with 2 VARCHAR primary keys · 188899cd
      unknown authored
      - post review changes
      
      
      188899cd
  5. 22 Jan, 2007 8 commits