1. 15 Mar, 2007 1 commit
  2. 14 Mar, 2007 4 commits
    • unknown's avatar
      Manual merge from 5.0-runtime to 5.1-runtime · 2fad8ac2
      unknown authored
      2fad8ac2
    • unknown's avatar
      Merge weblab.(none):/home/marcsql/TREE/mysql-5.0-runtime · 34a0de58
      unknown authored
      into  weblab.(none):/home/marcsql/TREE/mysql-5.1-26503-merge
      
      
      mysql-test/t/sp-error.test:
        Auto merged
      sql/handler.cc:
        Auto merged
      sql/item.cc:
        Auto merged
      sql/item.h:
        Auto merged
      sql/item_func.cc:
        Auto merged
      sql/item_subselect.cc:
        Auto merged
      sql/log_event.cc:
        Auto merged
      sql/sp_head.cc:
        Auto merged
      sql/sp_head.h:
        Auto merged
      sql/sql_base.cc:
        Auto merged
      sql/sql_show.cc:
        Auto merged
      sql/sql_table.cc:
        Auto merged
      sql/sql_yacc.yy:
        Auto merged
      34a0de58
    • unknown's avatar
      Merge malff@bk-internal.mysql.com:/home/bk/mysql-5.0-runtime · cfcd27b3
      unknown authored
      into  weblab.(none):/home/marcsql/TREE/mysql-5.0-26503
      
      
      cfcd27b3
    • unknown's avatar
      Bug#26503 (Illegal SQL exception handler code causes the server to crash) · 79344c7b
      unknown authored
      Before this fix, the parser would accept illegal code in SQL exceptions
      handlers, that later causes the runtime to crash when executing the code,
      due to memory violations in the exception handler stack.
      
      The root cause of the problem is instructions within an exception handler
      that jumps to code located outside of the handler. This is illegal according
      to the SQL 2003 standard, since labels located outside the handler are not
      supposed to be visible (they are "out of scope"), so any instruction that
      jumps to these labels, like ITERATE or LEAVE, should not parse.
      
      The section of the standard that is relevant for this is :
        SQL:2003 SQL/PSM (ISO/IEC 9075-4:2003)
        section 13.1 <compound statement>,
        syntax rule 4
      <quote>
        The scope of the <beginning label> is CS excluding every <SQL schema
        statement> contained in CS and excluding every
        <local handler declaration list> contained in CS. <beginning label> shall
        not be equivalent to any other <beginning label>s within that scope.
      </quote>
      
      With this fix, the C++ class sp_pcontext, which represent the "parsing
      context" tree (a.k.a symbol table) of a stored procedure, has been changed
      as follows:
      - constructors have been cleaned up, so that only building a root node for
      the tree is public; building nodes inside a tree is not public.
      - a new member, m_label_scope, indicates if a given syntactic context
      belongs to a DECLARE HANDLER block,
      - label resolution, in the method find_label(), has been changed to
      implement the restriction of scope regarding labels used in a compound
      statement.
      
      The actions in the parser, when parsing the body of a SQL exception handler,
      have been changed as follows:
      - the implementation of an exception handler (DECLARE HANDLER) now creates
      explicitly a new sp_pcontext, to isolate the code inside the handler from
      the containing compound statement context.
      - registering exception handlers as a result occurs in the parent context,
      see the rule sp_hcond_element
      - the code in sp_hcond_list has been cleaned up, to avoid code duplication
      
      In addition, the flags IN_SIMPLE_CASE and IN_HANDLER, declared in sp_head.h
      have been removed, since they are unused and broken by design (as seen with
      Bug 19194 (Right recursion in parser for CASE causes excessive stack usage,
      limitation), representing a stack in a single flag is not possible.
      
      Tests in sp-error have been added to show that illegal constructs are now
      rejected.
      
      Tests in sp have been added for code coverage, to show that ITERATE or LEAVE
      statements are legal when jumping to a label in scope, inside the body of
      an exception handler.
      
      
      mysql-test/r/sp-error.result:
        SQL Exception handlers define a parsing context for label resolution.
      mysql-test/r/sp.result:
        SQL Exception handlers define a parsing context for label resolution.
      mysql-test/t/sp-error.test:
        SQL Exception handlers define a parsing context for label resolution.
      mysql-test/t/sp.test:
        SQL Exception handlers define a parsing context for label resolution.
      sql/sp_head.cc:
        Minor cleanup
      sql/sp_head.h:
        Minor cleanup
      sql/sp_pcontext.cc:
        SQL Exception handlers define a parsing context for label resolution.
      sql/sp_pcontext.h:
        SQL Exception handlers define a parsing context for label resolution.
      sql/sql_yacc.yy:
        SQL Exception handlers define a parsing context for label resolution.
      79344c7b
  3. 13 Mar, 2007 1 commit
    • unknown's avatar
      Fix the bug introduced with the push of the fix for bug#18326: Do not · fa57a563
      unknown authored
      lock table for writing during prepare of statement.
      
      When single call open_normal_and_derived_tables() was used, we never
      set table_count to the right value.  This patch reverts the part of
      the old code that does open_tables() (and sets table_count), then
      checks if table_list->multitable_view is set (and returns if so, using
      table_count value), and only then it does mysql_handle_derived().
      
      
      fa57a563
  4. 09 Mar, 2007 8 commits
    • unknown's avatar
      Merge moonlight.home:/home/tomash/src/mysql_ab/mysql-5.1 · fa2791a3
      unknown authored
      into  moonlight.home:/home/tomash/src/mysql_ab/mysql-5.1-bug16425
      
      
      mysql-test/r/view.result:
        Auto merged
      mysql-test/t/view.test:
        Auto merged
      sql/sql_yacc.yy:
        Auto merged
      fa2791a3
    • unknown's avatar
      Fix for BUG#735 "Prepared Statements: there is no support for Query · dca006df
      unknown authored
      Cache".
      WL#1569 "Prepared Statements: implement support of Query Cache".
      Prepared SELECTs did not look up in the query cache, and their results
      were not stored in the query cache. This made them slower than
      non-prepared SELECTs in some cases.
      The fix is to re-use the expanded query (the prepared query where
      "?" placeholders are replaced by their values, at execution time)
      for searching/storing in the query cache.
      It works fine for statements prepared via mysql_stmt_prepare(), which
      are the most commonly used and were the scope of this bugfix and WL.
      It works less fine for statements prepared via the SQL command
      PREPARE...FROM, which are still not using the query cache if they
      have at least one parameter (because then the expanded query contains
      names of user variables, and user variables don't work with the
      query cache, even in non-prepared queries).
      Note that results from prepared SELECTs, which are in the binary
      protocol, and results from normal SELECTs, which are in the text
      protocol, ignore each other in the query cache, because a result in the
      binary protocol should never be served to a SELECT expecting the text
      protocol and vice-versa.
      Note, after this patch, bug 25843 starts applying to query cache
      ("changing default database between PREPARE and EXECUTE of statement
      breaks binlog"), we need to fix it.
      
      
      mysql-test/include/have_query_cache.inc:
        Now prepared statements work with the query cache, so don't disable
        prep stmts by default when doing a query cache test. All tests which
        include this file will now be really tested against prepared
        statements (in particular, query_cache.test).
      mysql-test/r/query_cache.result:
        result update
      mysql-test/t/grant_cache.test:
        Cannot enable this test in ps-protocol, because in normal protocol,
        a SELECT failing due to insufficient privileges increments
        Qcache_not_cached, while in ps-protocol, no.
        In detail: in normal protocol,
        the "access denied" errors on SELECT are issued at (stack trace):
        mysql_parse/mysql_execute_command/execute_sqlcom_select/handle_select/
        mysql_select/JOIN::prepare/setup_wild/insert_fields/
        check_grant_all_columns/my_error/my_message_sql, which then calls
        push_warning/query_cache_abort: at this moment,
        query_cache_store_query() has been called, so query exists in cache,
        so thd->net.query_cache_query!=NULL, so query_cache_abort() removes
        the query from cache, which causes a query_cache.refused++ (thus,
        a Qcache_not_cached++).
        While in ps-protocol, the error is issued at prepare time;
        for this mysql_test_select() is called, not execute_sqlcom_select()
        (and that also leads to JOIN::prepare/etc). Thus, as
        query_cache_store_query() has not been called,
        thd->net.query_cache_query==NULL, so query_cache_abort() does nothing:
        Qcache_not_cached is not incremented.
        As this test prints Qcache_not_cached after SELECT failures,
        we cannot enable this test in ps-protocol.
      mysql-test/t/ndb_cache_multi2.test:
        The principle of this test is: two mysqlds connected to one cluster,
        both using their query cache. Queries are cached in server1
        ("select a!=3 from t1", "select * from t1"),
        table t1 is modified in server2, we want to see that this invalidates
        the query cache of server1. Invalidation with NDB works like this:
        when a query is found in the query cache, NDB is asked if the tables
        have changed. In this test, ha_ndbcluster calls NDB every millisecond
        to collect change information about tables.
        Due to this millisecond delay, there is need for a loop ("while...")
        in this test, which waits until a query1 ("select a!=3 from t1") is
        invalidated (which is equivalent to it returning
        up-to-date results), and then expects query2 ("select * from t1")
        to have been invalidated (see up-to-date results).
        But when enabling --ps-protocol in this test, the logic breaks,
        because query1 is still done via mysql_real_query() (see mysqltest.c:
        eval_expr() always uses mysql_real_query()). So, query1 returning
        up-to-date results is not a sign of it being invalidated in the cache,
        because it was NOT in the cache ("select a!=3 from t1" on line 39
        was done with prep stmts, while `select a!=3 from t1` is not,
        thus the second does not see the first in the cache). Thus, we may run
        query2 when cache still has not been invalidated.
        The solution is to make the initial "select a!=3 from t1" run
        as a normal query, this repairs the broken logic.
        But note, "select * from t1" is still using prepared statements
        which was the goal of this test with --ps-protocol.
      mysql-test/t/query_cache.test:
        now that prepared statements work with the query cache, we check
        that results in binary protocol (prepared statements) and in text
        protocol (normal queries) don't mix in the query cache even though
        the text of the statement/query are identical.
      sql/mysql_priv.h:
        In class Query_cache_flags, we add a bit to say if the result
        is in binary or text format (because, a result in binary format
        should never be served to a query expecting text format, and vice-
        versa).
        A macro to emphasize that we read the size of the query cache
        without mutex ("maybe" word).
        A macro which gives a first indication of if a query is cache-able
        (first indication - it does not consider the query cache's state).
      sql/protocol.cc:
        indentation.
      sql/protocol.h:
        Children classes of Protocol report their type (currently,
        text or binary). Query cache needs to know that.
      sql/sql_cache.cc:
        When we store a result in the query cache, we need to remember if it's
        in binary or text format. And when we search for a result in the query
        cache, we need to select only those results which are in the format
        which the current statement expects (binary or text).
      sql/sql_prepare.cc:
        Enabling use of the query cache by prepared statements.
        1) Prep stmts are of two types:
          a) prepared via the mysql_stmt_prepare() API call
          b) prepared via the SQL PREPARE...FROM statement.
        2) We already, when executing a prepared statement, sometimes built an
        "expanded" statement. For a), "?" placeholders were replaced by their
        values. For b), by names of the user variables containing the values.
        We did that only when we needed to write the query to logs.
        We now use this expanded query also for storing/searching
        in the query cache.
        Assume a query "SELECT * FROM T WHERE c=?", and the parameter is 10.
        For a), the expanded query is "SELECT * FROM T WHERE c=10", we look
        for "SELECT * FROM T WHERE c=10" in the query cache, and store that
        query's result in the query cache.
        For b), the expanded query is "SELECT * FROM T WHERE c=@somevar", and
        user variables don't work with the query cache (even inside non-
        prepared queries), so we don't enable query caching for SQL PREPARE'd
        statements if they have at least one parameter (see
        "if (stmt->param_count > 0)" in the patch).
        3) If query cache is enabled and this is a SELECT, we build the
        expanded query (as an optimisation, we don't want to build this
        expanded query if the query cache is disabled or this is not a SELECT).
        As the decision of building the expanded query or not is taken
        at prepare time (setup_set_params()), if query cache is disabled
        at prepare time, we won't build the expanded query at all next
        executions, thus shouldn't use this query for query cacheing.
        To ensure that we don't, we set safe_to_cache_query to FALSE.
        Note that we read the size of the query cache without mutex, which is
        ok: if we see it 0 but that cache has just been enlarged, no big deal,
        just our statement will not use the query cache; if we see it >0 but
        that cache has just been made destroyed, we'll build the expanded
        query at all executions, but query_cache_store_query() and
        query_cache_send_result_to_client() will read the size with a mutex
        and so properly decide to cache or not cache.
        4) Some functions in this file were named "withlog", others "with_log",
        now using "with_log" for all.
      tests/mysql_client_test.c:
        Testing of how prepared statements enter and hit the query cache.
        test_ps_query_cache() is inspired from test_ps_conj_select().
        It creates data, a prepared SELECT statement, executes it once,
        then a second time with the same parameter value, to see that cache
        is hit, then a 3rd time with another parameter value to see that cache
        is not hit. Then, same from another connection, expecting hits.
        Then, tests border cases (enables query cache at prepare and disables
        at execute and vice-versa).
        It checks all results of SELECTs, cache hits and misses.
      mysql-test/r/query_cache_sql_prepare.result:
        result of new test: we see hits when there is no parameter,
        no hit when there is a parameter.
      mysql-test/t/query_cache_sql_prepare.test:
        new test to see if SQL PREPARE'd statements enter/hit the query cache:
        - if having at least one parameter, they should not
        - if having zero parameters, they should.
      dca006df
    • unknown's avatar
      manual merge · dfd93a8f
      unknown authored
      
      libmysqld/lib_sql.cc:
        Auto merged
      sql/protocol.cc:
        Auto merged
      sql/protocol.h:
        Auto merged
      sql/set_var.cc:
        Auto merged
      sql/sql_class.cc:
        Auto merged
      sql/sql_class.h:
        Auto merged
      sql/sql_prepare.cc:
        merge
      dfd93a8f
    • unknown's avatar
      Resolve one shift/reduce conflict introduced with the push of the fix · febb6b92
      unknown authored
      for bug#16425: Events: no DEFINER clause.  The problem was that there
      were two rules
      
        ALTER view_algorithm_opt definer ... VIEW ...
        ALTER definer EVENT ...
      
      so when there was 'ALTER definer' in the input it was unclear if empty
      view_algorithm_opt should be executed or not.
      
      We solve this by introducing three distinct rules
      
        ALTER view_algorithm definer ... VIEW ...
        ALTER definer ... VIEW ...
        ALTER definer EVENT ...
      
      that remove the ambiguity.
      
      
      mysql-test/r/view.result:
        Add result for the test of ALTER ALGORITHM= DEFINER= VIEW.
      mysql-test/t/view.test:
        Add test case for ALTER ALGORITHM= DEFINER= VIEW.
      febb6b92
    • unknown's avatar
      Merge moonlight.home:/home/tomash/src/mysql_ab/mysql-5.1 · b311d870
      unknown authored
      into  moonlight.home:/home/tomash/src/mysql_ab/mysql-5.1-bug9953
      
      
      mysql-test/r/sp-error.result:
        Auto merged
      mysql-test/r/view.result:
        Auto merged
      sql/item_timefunc.cc:
        Auto merged
      sql/lock.cc:
        Auto merged
      sql/log_event.cc:
        Auto merged
      sql/mysql_priv.h:
        Auto merged
      sql/set_var.cc:
        Auto merged
      sql/sp.cc:
        Auto merged
      sql/sql_base.cc:
        Auto merged
      sql/sql_help.cc:
        Auto merged
      sql/sql_lex.cc:
        Auto merged
      sql/sql_lex.h:
        Auto merged
      sql/sql_parse.cc:
        Auto merged
      sql/sql_show.cc:
        Auto merged
      sql/sql_view.cc:
        Auto merged
      sql/table.cc:
        Auto merged
      sql/tztime.cc:
        Auto merged
      storage/myisam/ha_myisam.cc:
        Auto merged
      sql/sql_yacc.yy:
        SCCS merged
      b311d870
    • unknown's avatar
      BUG#9953: CONVERT_TZ requires mysql.time_zone_name to be locked · 0ea47f3e
      unknown authored
      The problem was that some facilities (like CONVERT_TZ() function or
      server HELP statement) may require implicit access to some tables in
      'mysql' database.  This access was done by ordinary means of adding
      such tables to the list of tables the query is going to open.
      However, if we issued LOCK TABLES before that, we would get "table
      was not locked" error trying to open such implicit tables.
      
      The solution is to treat certain tables as MySQL system tables, like
      we already do for mysql.proc.  Such tables may be opened for reading
      at any moment regardless of any locks in effect.  The cost of this is
      that system table may be locked for writing only together with other
      system tables, it is disallowed to lock system tables for writing and
      have any other lock on any other table.
      
      After this patch the following tables are treated as MySQL system
      tables:
        mysql.help_category
        mysql.help_keyword
        mysql.help_relation
        mysql.help_topic
        mysql.proc (it already was)
        mysql.time_zone
        mysql.time_zone_leap_second
        mysql.time_zone_name
        mysql.time_zone_transition
        mysql.time_zone_transition_type
      
      These tables are now opened with open_system_tables_for_read() and
      closed with close_system_tables(), or one table may be opened with
      open_system_table_for_update() and closed with close_thread_tables()
      (the latter is used for mysql.proc table, which is updated as part of
      normal MySQL server operation).  These functions may be used when
      some tables were opened and locked already.
      
      NOTE: online update of time zone tables is not possible during
      replication, because there's no time zone cache flush neither on LOCK
      TABLES, nor on FLUSH TABLES, so the master may serve stale time zone
      data from cache, while on slave updated data will be loaded from the
      time zone tables.
      
      
      mysql-test/r/help.result:
        Update result.
      mysql-test/r/lock.result:
        Update result.
      mysql-test/r/sp-error.result:
        Update result.
      mysql-test/r/timezone2.result:
        Add result for bug#9953: CONVERT_TZ requires mysql.time_zone_name
        to be locked.
      mysql-test/r/view.result:
        Update result: use table t3 rather than utilize MySQL system table.
      mysql-test/t/help.test:
        Test that we can use HELP even under LOCK TABLES.
      mysql-test/t/lock.test:
        Test LOCK TABLE on system tables.
      mysql-test/t/timezone2.test:
        Add test case for bug#9953: CONVERT_TZ requires mysql.time_zone_name
        to be locked.
      mysql-test/t/view.test:
        Update test: use table t3 rather that utilize MySQL system table.
      sql/handler.h:
        Fix comment for 'count' parameter of check_if_locking_is_allowed().
        Add 'current' and 'system_count' parameters.
      sql/item_create.cc:
        We no longer have LEX::add_time_zone_tables_to_query_tables().
      sql/item_timefunc.cc:
        We no longer have LEX::time_zone_tables_used, so
        Item_func_convert_tz::fix_fields() became the same as base
        Item_date_func::fix_fields().
        
        my_tz_find() no longer takes table list, but takes THD pointer now.
      sql/item_timefunc.h:
        Remove dead field and method.
      sql/lock.cc:
        Pass values for 'current' and 'system_count' to
        check_if_locking_is_allowed().
      sql/log_event.cc:
        We no longer have my_tz_find_with_opening_tz_tables(), its functions is
        performed by my_tz_find().
      sql/mysql_priv.h:
        Add functions to work with MySQL system tables.
      sql/set_var.cc:
        my_tz_find() no longer takes table list, but takes THD pointer now.
      sql/sp.cc:
        Remove close_proc_table().  Use close_system_tables() instead.
        
        Use open_system_tables_for_read() and open_system_table_for_update().
      sql/sp.h:
        Remove close_proc_table() declaration.
      sql/sql_base.cc:
        Add implementation of open_system_tables_for_read(),
        close_system_tables(), open_system_table_for_update().
      sql/sql_help.cc:
        Operate on MySQL system tables mysql.help_* with
        open_system_tables_for_read() and close_system_tables() to allow the
        usage of HELP statement under LOCK TABLES.
      sql/sql_lex.cc:
        Remove LEX::time_zone_tables_used and
        LEX::add_time_zone_tables_to_query_tables() which are no longer used.
      sql/sql_lex.h:
        Remove LEX::time_zone_tables_used and
        LEX::add_time_zone_tables_to_query_tables() which are no longer used.
      sql/sql_parse.cc:
        Remove references to LEX::time_zone_tables_used and
        my_tz_check_n_skip_implicit_tables() which are no longer used.
      sql/sql_show.cc:
        Use close_system_tables() instead of removed close_proc_table().
      sql/sql_view.cc:
        LEX::time_zone_tables_used is no longer there.
      sql/sql_yacc.yy:
        LEX::add_time_zone_tables_to_query_tables() is no longer there.
      sql/table.cc:
        Add more tables that should be treated as MySQL system tables.
      sql/share/errmsg.txt:
        Change the error message, as now we allow write-locking of several
        system tables if not mixed with ordinary tables.
      sql/tztime.cc:
        Do not add time zone tables to the list of query tables in
        tz_init_table_list().
        
        Remove fake_time_zone_tables_list and my_tz_get_tables_list().
        
        In my_tz_init(), open mysql.time_zone_leap_second with
        simple_open_n_lock_tables(), but pass time zone name to my_tz_find(),
        which will open and close time zone tables as necessary.
        
        In tz_load_from_open_tables() do not call table->use_all_columns(), as
        this was already done in open_system_tables_for_read().
        
        my_tz_find() takes THD pointer instead of table list, and calls
        open_system_tables_for_read() and close_system_tables() as necessary.
        
        Remove my_tz_find_with_opening_tz_tables().
      sql/tztime.h:
        Remove declarations of my_tz_get_table_list(),
        my_tz_find_with_opening_tz_tables(), fake_time_zone_tables_list,
        definition of my_tz_check_n_skip_implicit_tables().
        Update prototype for my_tz_find().
      storage/csv/ha_tina.cc:
        Add new parameters to check_if_locking_is_allowed().
      storage/csv/ha_tina.h:
        Add new parameters to check_if_locking_is_allowed().
      storage/myisam/ha_myisam.cc:
        Add new parameters to check_if_locking_is_allowed().  In this
        function we count system tables.  If there are system tables, but
        there are also non-system tables, we report an error.
      storage/myisam/ha_myisam.h:
        Add new parameters to check_if_locking_is_allowed().
      0ea47f3e
    • unknown's avatar
      Fix typo. · 264bcedd
      unknown authored
      264bcedd
    • unknown's avatar
      Polishing: use constants instead of magic numbers. · a0521cd7
      unknown authored
      
      include/my_global.h:
        Introduce constants to be used instead of magic numbers.
      sql/field.cc:
        Polishing: use contants instead of magic numbers.
      sql/ha_innodb.cc:
        Polishing: use contants instead of magic numbers.
      sql/handler.cc:
        Polishing: use contants instead of magic numbers.
      sql/item.cc:
        Polishing: use contants instead of magic numbers.
      sql/item.h:
        Polishing: use contants instead of magic numbers.
      sql/item_func.cc:
        Polishing: use contants instead of magic numbers.
      sql/item_subselect.cc:
        Polishing: use contants instead of magic numbers.
      sql/log_event.cc:
        Polishing: use contants instead of magic numbers.
      sql/sql_base.cc:
        Polishing: use contants instead of magic numbers.
      sql/sql_select.cc:
        Polishing: use contants instead of magic numbers.
      sql/sql_show.cc:
        Polishing: use contants instead of magic numbers.
      sql/sql_table.cc:
        Polishing: use contants instead of magic numbers.
      a0521cd7
  5. 08 Mar, 2007 3 commits
  6. 07 Mar, 2007 11 commits
    • unknown's avatar
      Merge weblab.(none):/home/marcsql/TREE/mysql-5.0-runtime · b841c9eb
      unknown authored
      into  weblab.(none):/home/marcsql/TREE/mysql-5.1-8407-cleanup
      
      
      sql/sp_head.cc:
        Auto merged
      sql/sp_head.h:
        Auto merged
      b841c9eb
    • unknown's avatar
      babe2aa4
    • unknown's avatar
      · a6131b85
      unknown authored
      Bug 8407, post review cleanup: use instr::get_cont_dest() to get the instruction
      continuation instruction, for CONTINUE exception handlers.
      
      
      sql/sp_head.cc:
        Post review cleanup: use instr::get_cont_dest() to get the instruction
        continuation instruction, for CONTINUE exception handlers.
      sql/sp_head.h:
        Post review cleanup: use instr::get_cont_dest() to get the instruction
        continuation instruction, for CONTINUE exception handlers.
      a6131b85
    • unknown's avatar
      Merge moonlight.home:/home/tomash/src/mysql_ab/mysql-5.1 · ed1c2dc4
      unknown authored
      into  moonlight.home:/home/tomash/src/mysql_ab/mysql-5.1-bug18326
      
      
      mysql-test/r/ps.result:
        Auto merged
      mysql-test/t/ps.test:
        Auto merged
      sql/sql_prepare.cc:
        Auto merged
      ed1c2dc4
    • unknown's avatar
      BUG#18326: Do not lock table for writing during prepare of statement · 3b288b24
      unknown authored
      During statement prepare phase the tables were locked as if the
      statement is being executed, however this is not necessary.
      
      The solution is to not lock tables on statement prepare phase.
      Opening tables is enough to prevent DDL on them, and during statement
      prepare we do not access nor modify any data.
      
      
      mysql-test/r/ps.result:
        Add result for bug#18326: Do not lock table for writing during
        prepare of statement.
      mysql-test/t/ps.test:
        Add test case for bug#18326: Do not lock table for writing during
        prepare of statement.
      sql/sql_prepare.cc:
        Do not lock tables on statement prepare phase.  Opening tables is
        enough to prevent DDL on them, and during statement prepare we do not
        access nor modify any data.
        
        Use open_normal_and_derived_tables() for table opening on prepare.
      3b288b24
    • unknown's avatar
      A post merge fix. · d203b18e
      unknown authored
      d203b18e
    • unknown's avatar
      Merge bodhi.local:/opt/local/work/mysql-5.0-runtime · db3e45e6
      unknown authored
      into  bodhi.local:/opt/local/work/mysql-5.1-runtime
      
      
      sql/sql_lex.cc:
        Auto merged
      db3e45e6
    • unknown's avatar
      A fix for the windows build (harmless warning). · 4d6e16f2
      unknown authored
      
      sql/sql_lex.cc:
        A fix for the windows build.
      4d6e16f2
    • unknown's avatar
      Merge bodhi.local:/opt/local/work/mysql-5.0-26750 · 676b59cf
      unknown authored
      into  bodhi.local:/opt/local/work/mysql-5.1-runtime
      
      
      mysql-test/r/trigger.result:
        Auto merged
      mysql-test/r/view.result:
        Auto merged
      mysql-test/t/trigger.test:
        Auto merged
      sql/log_event.cc:
        Auto merged
      sql/mysqld.cc:
        Auto merged
      sql/sp_head.cc:
        Auto merged
      sql/sp_head.h:
        Auto merged
      sql/sql_base.cc:
        Auto merged
      sql/sql_lex.cc:
        Auto merged
      sql/sql_lex.h:
        Auto merged
      sql/sql_trigger.cc:
        Auto merged
      sql/sql_update.cc:
        Auto merged
      sql/table.cc:
        Auto merged
      sql/table.h:
        Auto merged
      sql/sql_class.cc:
        Manual merge.
      sql/sql_class.h:
        Manual merge.
      sql/sql_parse.cc:
        Manual merge.
      sql/sql_prepare.cc:
        Manual merge.
      sql/sql_yacc.yy:
        Manual merge.
      676b59cf
    • unknown's avatar
      Merge bk-internal.mysql.com:/home/bk/mysql-5.0-runtime · 7f69b747
      unknown authored
      into  bodhi.local:/opt/local/work/mysql-5.0-26750
      
      
      sql/mysqld.cc:
        Auto merged
      sql/sql_class.cc:
        Auto merged
      sql/sql_parse.cc:
        Auto merged
      sql/sql_class.h:
        Manual merge.
      7f69b747
    • unknown's avatar
      A fix for Bug#26750 "valgrind leak in sp_head" (and post-review · 053c6c01
      unknown authored
      fixes).
      
      The legend: on a replication slave, in case a trigger creation
      was filtered out because of application of replicate-do-table/
      replicate-ignore-table rule, the parsed definition of a trigger was not 
      cleaned up properly. LEX::sphead member was left around and leaked 
      memory. Until the actual implementation of support of 
      replicate-ignore-table rules for triggers by the patch for Bug 24478 it 
      was never the case that "case SQLCOM_CREATE_TRIGGER"
      was not executed once a trigger was parsed,
      so the deletion of lex->sphead there worked and the memory did not leak.
      
      The fix: 
      
      The real cause of the bug is that there is no 1 or 2 places where
      we can clean up the main LEX after parse. And the reason we 
      can not have just one or two places where we clean up the LEX is
      asymmetric behaviour of MYSQLparse in case of success or error. 
      
      One of the root causes of this behaviour is the code in Item::Item()
      constructor. There, a newly created item adds itself to THD::free_list
      - a single-linked list of Items used in a statement. Yuck. This code
      is unaware that we may have more than one statement active at a time,
      and always assumes that the free_list of the current statement is
      located in THD::free_list. One day we need to be able to explicitly
      allocate an item in a given Query_arena.
      Thus, when parsing a definition of a stored procedure, like
      CREATE PROCEDURE p1() BEGIN SELECT a FROM t1; SELECT b FROM t1; END;
      we actually need to reset THD::mem_root, THD::free_list and THD::lex
      to parse the nested procedure statement (SELECT *).
      The actual reset and restore is implemented in semantic actions
      attached to sp_proc_stmt grammar rule.
      The problem is that in case of a parsing error inside a nested statement
      Bison generated parser would abort immediately, without executing the
      restore part of the semantic action. This would leave THD in an 
      in-the-middle-of-parsing state.
      This is why we couldn't have had a single place where we clean up the LEX
      after MYSQLparse - in case of an error we needed to do a clean up
      immediately, in case of success a clean up could have been delayed.
      This left the door open for a memory leak.
      
      One of the following possibilities were considered when working on a fix:
      - patch the replication logic to do the clean up. Rejected
      as breaks module borders, replication code should not need to know the
      gory details of clean up procedure after CREATE TRIGGER.
      - wrap MYSQLparse with a function that would do a clean up.
      Rejected as ideally we should fix the problem when it happens, not
      adjust for it outside of the problematic code.
      - make sure MYSQLparse cleans up after itself by invoking the clean up
      functionality in the appropriate places before return. Implemented in 
      this patch.
      - use %destructor rule for sp_proc_stmt to restore THD - cleaner
      than the prevoius approach, but rejected
      because needs a careful analysis of the side effects, and this patch is 
      for 5.0, and long term we need to use the next alternative anyway
      - make sure that sp_proc_stmt doesn't juggle with THD - this is a 
      large work that will affect many modules.
      
      Cleanup: move main_lex and main_mem_root from Statement to its
      only two descendants Prepared_statement and THD. This ensures that
      when a Statement instance was created for purposes of statement backup,
      we do not involve LEX constructor/destructor, which is fairly expensive.
      In order to track that the transformation produces equivalent 
      functionality please check the respective constructors and destructors
      of Statement, Prepared_statement and THD - these members were
      used only there.
      This cleanup is unrelated to the patch.
      
      
      sql/log_event.cc:
        THD::main_lex is private and should not be used.
      sql/mysqld.cc:
        Move MYSQLerror to sql_yacc.yy as it depends on LEX headers now.
      sql/sql_class.cc:
        Cleanup: move main_lex and main_mem_root to THD and Prepared_statement
      sql/sql_class.h:
        Cleanup: move main_lex and main_mem_root to THD and Prepared_statement
      sql/sql_lex.cc:
        Implement st_lex::restore_lex()
      sql/sql_lex.h:
        Declare st_lex::restore_lex().
      sql/sql_parse.cc:
        Consolidate the calls to unit.cleanup() and deletion of lex->sphead
        in mysql_parse (COM_QUERY handler)
      sql/sql_prepare.cc:
        No need to delete lex->sphead to restore memory roots now in case of a 
        parse error - this is done automatically inside MYSQLparse
      sql/sql_trigger.cc:
        This code could lead to double deletion apparently, as in case
        of an error lex.sphead was never reset.
      sql/sql_yacc.yy:
        Trap all returns from the parser to ensure that MySQL-specific cleanup
        is invoked: we need to restore the global state of THD and LEX in 
        case of a parsing error. In case of a parsing success this happens as 
        part of normal grammar reduction process.
      053c6c01
  7. 06 Mar, 2007 9 commits
    • unknown's avatar
      Manual merge · f7414b28
      unknown authored
      f7414b28
    • unknown's avatar
      Merge malff@bk-internal.mysql.com:/home/bk/mysql-5.1-runtime · 0ac63815
      unknown authored
      into  weblab.(none):/home/marcsql/TREE/mysql-5.1-8407-merge
      
      
      sql/sp_head.cc:
        Auto merged
      sql/sql_class.cc:
        Auto merged
      sql/sql_base.cc:
        Manual merge
      0ac63815
    • unknown's avatar
      Manual merge · 71f90b7e
      unknown authored
      71f90b7e
    • unknown's avatar
      Post-merge fixes. · 9528ed5b
      unknown authored
      
      mysql-test/r/subselect.result:
        A post-merge fix: update test results.
      sql/sql_yacc.yy:
        Update to the number of conflicts in 5.1
      9528ed5b
    • unknown's avatar
      Merge malff@bk-internal.mysql.com:/home/bk/mysql-5.0-runtime · 307c9f1e
      unknown authored
      into  weblab.(none):/home/marcsql/TREE/mysql-5.0-8407_b
      
      
      mysql-test/r/view.result:
        Auto merged
      sql/mysqld.cc:
        Auto merged
      sql/sp_head.cc:
        Auto merged
      sql/sp_head.h:
        Auto merged
      sql/sql_class.cc:
        Auto merged
      sql/sql_class.h:
        Auto merged
      sql/sql_update.cc:
        Auto merged
      sql/table.cc:
        Auto merged
      sql/table.h:
        Auto merged
      sql/sql_base.cc:
        Manual merge
      307c9f1e
    • unknown's avatar
      Merge weblab.(none):/home/marcsql/TREE/mysql-5.0-8407_b · 0708859b
      unknown authored
      into  weblab.(none):/home/marcsql/TREE/mysql-5.1-8407-merge
      
      
      mysql-test/r/information_schema_db.result:
        Auto merged
      mysql-test/r/view.result:
        Auto merged
      mysql-test/t/sp.test:
        Auto merged
      sql/lock.cc:
        Auto merged
      sql/mysqld.cc:
        Auto merged
      sql/sp_head.cc:
        Auto merged
      sql/sp_head.h:
        Auto merged
      sql/sql_base.cc:
        Auto merged
      sql/sql_class.cc:
        Auto merged
      sql/sql_update.cc:
        Auto merged
      sql/table.cc:
        Auto merged
      sql/table.h:
        Auto merged
      0708859b
    • unknown's avatar
      Merge bodhi.local:/opt/local/work/mysql-5.0-runtime · d45be4aa
      unknown authored
      into  bodhi.local:/opt/local/work/mysql-5.1-runtime-merge
      
      
      BitKeeper/deleted/.del-ha_berkeley.cc:
        Auto merged
      cmd-line-utils/readline/xmalloc.c:
        Auto merged
      include/my_dbug.h:
        Auto merged
      mysql-test/mysql-test-run.pl:
        Auto merged
      mysql-test/t/disabled.def:
        Auto merged
      server-tools/instance-manager/instance_options.cc:
        Auto merged
      server-tools/instance-manager/mysqlmanager.cc:
        Auto merged
      sql/item_cmpfunc.cc:
        Auto merged
      sql/item_cmpfunc.h:
        Auto merged
      sql/item_func.cc:
        Auto merged
      sql/item_subselect.cc:
        Auto merged
      sql/item_subselect.h:
        Auto merged
      sql/log.cc:
        Auto merged
      sql/slave.cc:
        Auto merged
      sql/sp_head.cc:
        Auto merged
      sql/sql_class.cc:
        Auto merged
      sql/sql_lex.cc:
        Auto merged
      sql/sql_lex.h:
        Auto merged
      sql/sql_parse.cc:
        Auto merged
      sql/sql_repl.cc:
        Auto merged
      mysql-test/r/subselect.result:
        Use local.
      sql/ha_ndbcluster.cc:
        Use local
      storage/archive/ha_archive.cc:
        Use local.
      support-files/compiler_warnings.supp:
        Use local
      client/mysql_upgrade.c:
        Manual merge.
      client/mysqltest.c:
        Manual merge.
      mysql-test/t/subselect.test:
        Manual merge.
      sql/field.cc:
        Manual merge.
      sql/sql_base.cc:
        Manual merge.
      sql/sql_yacc.yy:
        Manual merge.
      d45be4aa
    • unknown's avatar
      Merge bk-internal.mysql.com:/home/bk/mysql-5.1-new-rpl · c155c66d
      unknown authored
      into  bodhi.local:/opt/local/work/mysql-5.1-runtime-merge
      
      
      mysql-test/t/disabled.def:
        Auto merged
      sql/handler.cc:
        Auto merged
      sql/item_func.cc:
        Auto merged
      sql/mysql_priv.h:
        Auto merged
      sql/mysqld.cc:
        Auto merged
      sql/sp_head.cc:
        Auto merged
      sql/sql_class.cc:
        Auto merged
      sql/sql_parse.cc:
        Auto merged
      sql/sql_yacc.yy:
        Auto merged
      sql/table.h:
        Auto merged
      mysql-test/r/show_check.result:
        Manual merge.
      mysql-test/t/show_check.test:
        Manual merge.
      c155c66d
    • 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
  8. 05 Mar, 2007 1 commit
  9. 02 Mar, 2007 2 commits