An error occurred fetching the project authors.
  1. 27 Feb, 2006 1 commit
    • unknown's avatar
      Fix for trigger.test failures on pushbuild hosts introduced by fix for · fbd54ec2
      unknown authored
      bug #13525 "Rename table does not keep info of triggers".
      
      Now we use MYSQLTEST_VARDIR in order to be able to run this test in different
      vardir. Also improved cleanup after the test.
      
      
      mysql-test/t/trigger.test:
        Now we use MYSQLTEST_VARDIR in order to be able to run this test in different
        vardir. Also improved cleanup after the test.
      fbd54ec2
  2. 24 Feb, 2006 1 commit
    • unknown's avatar
      Fix for bug #13525 "Rename table does not keep info of triggers". · 925d168a
      unknown authored
      Let us transfer triggers associated with table when we rename it (but only if
      we are not changing database to which table belongs, in the latter case we will
      emit error).
      
      
      mysql-test/r/trigger.result:
        Added test for bug #13525 "Rename table does not keep info of triggers".
      mysql-test/t/trigger.test:
        Added test for bug #13525 "Rename table does not keep info of triggers".
      sql/sql_rename.cc:
        rename_tables():
          Now after renaming table's .FRM file and updating handler data we call
          Table_triggers_list::change_table_name() which is reponsible for
          updating .TRG and .TRN files.
      sql/sql_table.cc:
        mysql_alter_table():
          Now in case when ALTER should rename table we call
          Table_triggers_list::change_table_name() which is responsible
          for updating .TRG and .TRN files after renaming table.
      sql/sql_trigger.cc:
        Added Table_triggers_list::change_table_name() method and
        change_table_name_in_triggers()/trignames() methods responsible for updating
        .TRG and .TRN files for table during its renaming.
        
        Two small cleanups - removed versioning for .TRG files (since it was not working
        before anyway) and emphasized that type of lock specified in tables list is
        unimportant for DROP TABLE (since this statement uses name-locking).
      sql/sql_trigger.h:
        Table_triggers_list:
          Added on_table_names_list member to store pointers and lenghts of
          "ON table_name" parts in triggers' definitions to be able easily
          change them during RENAME TABLE.
          Added change_table_name() method and change_table_name_in_trignames/triggers()
          helper methods responsible for updating .TRG and .TRN files.
      sql/sql_yacc.yy:
        trigger_tail:
          To be able properly update triggers' definitions with new table names
          when renaming tables we need to know where in CREATE TRIGGER statement
          "ON db_name.table_name" part resides.
          Small cleanup - let us emphasize that for CREATE TRIGGER statement 
          lock type which is specified in table list is unimportant since
          name-locking is used.
      925d168a
  3. 28 Jan, 2006 1 commit
    • unknown's avatar
      Fix for bug #16829 "Firing trigger with RETURN crashes the server" · 40033029
      unknown authored
      We should disallow usage of RETURN statement in triggers and emit
      error at parsing time (instead of crashing when trigger is fired).
      
      
      mysql-test/r/trigger.result:
        Added test for bug #16829 "Firing trigger with RETURN crashes the server".
      mysql-test/t/trigger.test:
        Added test for bug #16829 "Firing trigger with RETURN crashes the server".
      sql/sql_yacc.yy:
        We should disallow usage of RETURN statement in triggers and emit
        error at parsing time (instead of crashing when trigger is fired).
      40033029
  4. 24 Jan, 2006 1 commit
    • unknown's avatar
      Make it possible to run mysql-test-run.pl with default test suite in different vardir. · 219af34a
      unknown authored
      mysql-test/include/have_outfile.inc:
        Use MYSQLTEST_VARDIR
      mysql-test/include/test_outfile.inc:
        Use MYSQLTEST_VARDIR
      mysql-test/mysql-test-run.pl:
        Create variable $MYSQLTEST_VARDIR that points to  the vardir
        Don't create a symlink from var/ to the physical vardir if it's somewhere else
        Setup a symlink(or copy dir on windows) for std_data so it is available in the physical vardir
        Use "../tmp" as slave-load-tmpdir, since the server is started in var/master-data and slave in var/slave-data they will both find the dumps in "../tmp"
      mysql-test/mysql-test-run.sh:
        Export MYSQLTEST_VARDIR, always pointing at mysql-test/var
      mysql-test/r/backup.result:
        Use MYSQLTEST_VARDIR
      mysql-test/r/blackhole.result:
        Use "../std_data_ln" to find std_data files
      mysql-test/r/loaddata.result:
        Use "../std_data_ln" to find std_data files
      mysql-test/r/mysqlbinlog.result:
        Use "../std_data_ln" to find std_data files
      mysql-test/r/mysqltest.result:
        Use MYSQLTEST_VARDIR
      mysql-test/r/outfile.result:
        Use MYSQLTEST_VARDIR
      mysql-test/r/query_cache.result:
        Add missing drop function
      mysql-test/r/rpl000001.result:
        Use "../std_data_ln" to find std_data files
      mysql-test/r/rpl000004.result:
        Use "../std_data_ln" to find std_data files
      mysql-test/r/rpl_innodb.result:
        Use "../std_data_ln" to find std_data files
      mysql-test/r/rpl_loaddata.result:
        Use "../std_data_ln" to find std_data files
      mysql-test/r/rpl_loaddata_rule_m.result:
        Use "../std_data_ln" to find std_data files
      mysql-test/r/rpl_loaddata_rule_s.result:
        Use "../std_data_ln" to find std_data files
      mysql-test/r/rpl_loaddatalocal.result:
        Use MYSQLTEST_VARDIR
      mysql-test/r/rpl_log.result:
        Use "../std_data_ln" to find std_data files
      mysql-test/r/rpl_misc_functions.result:
        Use MYSQLTEST_VARDIR
      mysql-test/r/rpl_replicate_do.result:
        Use "../std_data_ln" to find std_data files
      mysql-test/r/rpl_rewrite_db.result:
        Use "../std_data_ln" to find std_data files
      mysql-test/r/rpl_timezone.result:
        Use "../std_data_ln" to find std_data files
      mysql-test/r/symlink.result:
        Use MYSQLTEST_VARDIR
      mysql-test/r/trigger.result:
        Use "../std_data_ln" to find std_data files
      mysql-test/r/view.result:
        Use "../std_data_ln" to find std_data files
      mysql-test/r/warnings.result:
        Use "../std_data_ln" to find std_data files
      mysql-test/t/backup-master.sh:
        Use MYSQLTEST_VARDIR
      mysql-test/t/backup.test:
        Use MYSQLTEST_VARDIR
      mysql-test/t/blackhole.test:
        Use "../std_data_ln" to find std_data files
      mysql-test/t/ctype_ucs_binlog.test:
        Use MYSQLTEST_VARDIR
      mysql-test/t/im_daemon_life_cycle-im.opt:
        Use MYSQLTEST_VARDIR
      mysql-test/t/im_options_set.imtest:
        Use MYSQLTEST_VARDIR
      mysql-test/t/im_options_unset.imtest:
        Use MYSQLTEST_VARDIR
      mysql-test/t/loaddata.test:
        Use "../std_data_ln" to find std_data files
      mysql-test/t/myisam.test:
        Use MYSQLTEST_VARDIR
      mysql-test/t/mysqlbinlog.test:
        Use "../std_data_ln" to find std_data files
      mysql-test/t/mysqlbinlog2.test:
        Use MYSQLTEST_VARDIR
      mysql-test/t/mysqldump.test:
        Use MYSQLTEST_VARDIR
      mysql-test/t/mysqltest.test:
        Use MYSQLTEST_VARDIR
      mysql-test/t/ndb_autodiscover.test:
        Use MYSQLTEST_VARDIR
      mysql-test/t/outfile.test:
        Use MYSQLTEST_VARDIR
      mysql-test/t/query_cache.test:
        Add missing drop function
      mysql-test/t/repair.test:
        Use MYSQLTEST_VARDIR
      mysql-test/t/rpl000001.test:
        Use "../std_data_ln" to find std_data files
      mysql-test/t/rpl000004.test:
        Use "../std_data_ln" to find std_data files
      mysql-test/t/rpl000009.test:
        Use MYSQLTEST_VARDIR
      mysql-test/t/rpl000015-slave.sh:
        Use MYSQLTEST_VARDIR
      mysql-test/t/rpl000017-slave.sh:
        Use MYSQLTEST_VARDIR
      mysql-test/t/rpl_EE_error.test:
        Use MYSQLTEST_VARDIR
      mysql-test/t/rpl_charset.test:
        Use MYSQLTEST_VARDIR
      mysql-test/t/rpl_drop_db.test:
        Use MYSQLTEST_VARDIR
      mysql-test/t/rpl_flush_log_loop-master.opt:
        Use MYSQLTEST_VARDIR
      mysql-test/t/rpl_flush_log_loop-master.sh:
        Use MYSQLTEST_VARDIR
      mysql-test/t/rpl_flush_log_loop-slave.opt:
        Use MYSQLTEST_VARDIR
      mysql-test/t/rpl_flush_log_loop-slave.sh:
        Use MYSQLTEST_VARDIR
      mysql-test/t/rpl_innodb.test:
        Use "../std_data_ln" to find std_data files
      mysql-test/t/rpl_loaddata.test:
        Use "../std_data_ln" to find std_data files
      mysql-test/t/rpl_loaddata_rule_m.test:
        Use "../std_data_ln" to find std_data files
      mysql-test/t/rpl_loaddata_rule_s.test:
        Use "../std_data_ln" to find std_data files
      mysql-test/t/rpl_loaddatalocal.test:
        Use MYSQLTEST_VARDIR
      mysql-test/t/rpl_log.test:
        Use "../std_data_ln" to find std_data files
      mysql-test/t/rpl_misc_functions-slave.sh:
        Use MYSQLTEST_VARDIR
      mysql-test/t/rpl_misc_functions.test:
        Use MYSQLTEST_VARDIR
      mysql-test/t/rpl_replicate_do.test:
        Use "../std_data_ln" to find std_data files
      mysql-test/t/rpl_rewrite_db.test:
        Use "../std_data_ln" to find std_data files
      mysql-test/t/rpl_rotate_logs-slave.sh:
        Use MYSQLTEST_VARDIR
      mysql-test/t/rpl_rotate_logs.test:
        Use MYSQLTEST_VARDIR
      mysql-test/t/rpl_timezone.test:
        Use MYSQLTEST_VARDIR
      mysql-test/t/show_check.test:
        Use MYSQLTEST_VARDIR
      mysql-test/t/sp-destruct.test:
        Use MYSQLTEST_VARDIR
      mysql-test/t/symlink.test:
        Use MYSQLTEST_VARDIR
      mysql-test/t/temp_table-master.opt:
        Use MYSQLTEST_VARDIR
      mysql-test/t/trigger-compat.test:
        Use MYSQLTEST_VARDIR
      mysql-test/t/trigger-grant.test:
        Use MYSQLTEST_VARDIR
      mysql-test/t/trigger.test:
        Use "../std_data_ln" to find std_data files
      mysql-test/t/type_varchar.test:
        Use MYSQLTEST_VARDIR
      mysql-test/t/user_var-binlog.test:
        Use MYSQLTEST_VARDIR
      mysql-test/t/view.test:
        Use "../std_data_ln" to find std_data files
      mysql-test/t/warnings.test:
        Use "../std_data_ln" to find std_data files
      mysql-test/include/sourced.inc:
        New BitKeeper file ``mysql-test/include/sourced.inc''
      mysql-test/include/sourced1.inc:
        New BitKeeper file ``mysql-test/include/sourced1.inc''
      219af34a
  5. 05 Jan, 2006 1 commit
    • unknown's avatar
      Review fixes of new pushed code · 43886f1d
      unknown authored
      - Fixed tests
      - Optimized new code
      - Fixed some unlikely core dumps
      - Better bug fixes for:
        - #14397 - OPTIMIZE TABLE with an open HANDLER causes a crash
        - #14850 (ERROR 1062 when a quering a view using a Group By on a column that can be null
      
      
      mysql-test/r/create.result:
        Update results after removing wrong warnings for CREATE ... SELECT
        New tests
      mysql-test/r/handler.result:
        Drop used tables
      mysql-test/r/kill.result:
        Make test portable
      mysql-test/r/mysqlshow.result:
        Drop tables used by previous test
      mysql-test/r/trigger.result:
        Reuse old procedure name
      mysql-test/r/view.result:
        Extra tests
      mysql-test/t/create.test:
        New tests to test fix of removing wrong warnings for CREATE ... SELECT
      mysql-test/t/disabled.def:
        Enable 'kill' test (should now be portable)
      mysql-test/t/handler.test:
        Drop used tables
      mysql-test/t/kill.test:
        Make test portable even if kill doesn't work at once
      mysql-test/t/mysqlshow.test:
        Drop tables used by previous test
      mysql-test/t/trigger.test:
        Reuse old procedure name
      mysql-test/t/view.test:
        Extra tests
      sql/field.cc:
        Removed compiler warning
      sql/ha_federated.cc:
        my_snprintf -> strmake()
        (Simple optimization)
      sql/ha_ndbcluster.cc:
        Indentation cleanups and trival optimization
      sql/item.cc:
        Moved save_org_in_field() to item.cc to make it easier to test
        Remove setting of null_value as this is not needed
      sql/item.h:
        Moved save_org_in_field() to item.cc to make it easier to test
      sql/log_event.cc:
        Remove inline of slave_load_file_stem()
        Added 'extension' parameter to slave_load_file_stem() to get smaller code
        Removed not critical (or needed) DBUG_ASSERT()'s
        Cleaned up usage of slave_load_file_stem() to not depend on constant string lengths
        Indentation fixes
      sql/opt_range.cc:
        Moved code from declaration to function body
        (To make it more readable)
      sql/parse_file.cc:
        Fixed DBUG_PRINT
      sql/sp.cc:
        Simple cleanups
        - Removed not needed {} level
        - Ensure saved variables starts with old_
      sql/sp_head.cc:
        Indentation fixes
        Remove core dump when using --debug when m_next_cached_sp == 0
        Fixed compiler warnings
        Trivial optimizations
      sql/sp_head.h:
        Changed argument to set_definer() to const
        Added THD argument to recursion_level_error() to avoid call to current_thd
      sql/sql_acl.cc:
        Removed not needed test (first_not_own_table is the guard)
      sql/sql_base.cc:
        Removed extra empty line
      sql/sql_handler.cc:
        Don't test table version in mysql_ha_read() as this is already tested in lock_tables()
        Moved call to insert_fields to be after lock_table() to guard aganst reopen of tables
        (Better fix for Bug#14397 - OPTIMIZE TABLE with an open HANDLER causes a crash)
      sql/sql_insert.cc:
        Mark fields that are set in CREATE ... SELECT as used
        (Removed wrong warnings about field not having a default value)
      sql/sql_parse.cc:
        Removed not needed test of 'tables' (first_not_own_table is the guard)
        Simplify code
      sql/sql_select.cc:
        Use group->field to check if value is null instead of item called by 'save_org_in_field'
        This is a better bug fix for #14850 (ERROR 1062 when a quering a view using a Group By on a column that can be null)
      sql/sql_trigger.cc:
        Move sql_modes_parameters outside of function
        Indentation fixes
        Fixed compiler warning
        Ensure that thd->lex->query_tables_own_last is set properly before calling check_table_access()
        (This allows us to remove the extra test in check_grant() and check_table_access())
      43886f1d
  6. 11 Dec, 2005 1 commit
    • unknown's avatar
      Fix for bug #14863 "Triggers: crash if create and there is no current database". · 5b451f0c
      unknown authored
      Now when we create or drop trigger we check that both trigger name and trigger
      table always have database part specified. Thus we give an error if it they
      are not specified explicitly or implicitly via current database.
      
      
      mysql-test/r/trigger.result:
        Added test for bug #14863 "Triggers: crash if create and there is no current
        database".
      mysql-test/t/trigger.test:
        Added test for bug #14863 "Triggers: crash if create and there is no current
        database".
      sql/sql_trigger.cc:
        mysql_create_or_drop_trigger():
          Now we check that both trigger name and trigger table have database
          part specified (explicitly or implicitly via current database. Note
          that in latter case sp_name::m_db is already set by parser).
        Table_triggers_list::create_trigger()/::add_table_for_trigger():
          Simplified method/function's code since now they can assume that
          sp_name::m_db is always filled now.
        trigname_file_parameters:
          Removed comment which is no longer true.
      5b451f0c
  7. 22 Nov, 2005 2 commits
    • unknown's avatar
      Recursion support made for SP (BUG#10100). · d0645e35
      unknown authored
      client/mysqltest.c:
        An expected error messages hiding from the log if disable_result_log is in force.
      mysql-test/r/sp-dynamic.result:
        The test expanded for case of allowed/disalowed recursion.
      mysql-test/r/sp-error.result:
        Error messages changed.
        Test of bug11394() made with allowed recursion.
      mysql-test/r/sp.result:
        Tests for recursion.
      mysql-test/r/trigger.result:
        Check that triggers are not affected by this patch.
      mysql-test/r/variables.result:
        Test of max_sp_recursion_depth variable.
      mysql-test/t/sp-dynamic.test:
        The test expanded for case of allowed/disalowed recursion.
      mysql-test/t/sp-error.test:
        Error messages changed.
        Test of bug11394() made with allowed recursion.
      mysql-test/t/sp.test:
        Tests for recursion.
      mysql-test/t/trigger.test:
        Check that triggers are not affected by this patch.
      mysql-test/t/variables.test:
        Test of max_sp_recursion_depth variable.
      sql/item_func.cc:
        sp_find_function() and sp_find_procedure() joined to sp_find_routine()
          function as it was mentioned in TODO.
      sql/mysqld.cc:
        max_sp_recursion_depth variable added.
      sql/set_var.cc:
        max_sp_recursion_depth variable added.
      sql/share/errmsg.txt:
        An error message changed.
        An error message added.
      sql/sp.cc:
        sp_find_function() and sp_find_procedure() joined to sp_find_routine()
          function as it was mentioned in TODO.
        Temory LEX is allocated on a stack, not on a heap.
        Recursion support added for stored procedures.
      sql/sp.h:
        sp_find_function() and sp_find_procedure() joined to sp_find_routine()
          function as it was mentioned in TODO.
      sql/sp_head.cc:
        Initialization of new sp_head fields to get correct list of instances
          contained one instance only.
        Stack requirement for SP instruction is increased.
        Stack free space is checked before mem root initialisation to avoid
          memory leak.
        Pointer to the free instance management added before and after
          SP execution.
      sql/sp_head.h:
        New sp_head variables added to support inst of instances of SP
          for recursion and pointer on ths first free to use instance.
      sql/sql_base.cc:
        open_table() consume a lot of stack space so we check free stack space before it.
      sql/sql_class.h:
        max_sp_recursion_depth variable added.
      sql/sql_parse.cc:
        sp_find_function() and sp_find_procedure() joined to sp_find_routine()
          function as it was mentioned in TODO.
      d0645e35
    • unknown's avatar
      Fix for BUG#13549 "Server crash with nested stored procedures · 8152a78f
      unknown authored
      if inner routine has more local variables than outer one, and
      one of its last variables was used as argument to NOT operator".
      
      THD::spcont was non-0 when we were parsing stored routine/trigger
      definition during execution of another stored routine. This confused
      methods of Item_splocal and forced them use wrong runtime context.
      Fix ensures that we always have THD::spcont equal to zero during
      routine/trigger body parsing. This also allows to avoid problems
      with errors which occur during parsing and SQL exception handlers.
      
      
      mysql-test/r/sp.result:
        Test suite for bug#13549.
      mysql-test/r/trigger.result:
        Test suite for bug#13549.
      mysql-test/t/sp.test:
        Test suite for bug#13549.
      mysql-test/t/trigger.test:
        Test suite for bug#13549.
      sql/item.cc:
        Protection against using wrong context by SP local variable.
      sql/item.h:
        Protection against using wrong context by SP local variable.
      sql/protocol.cc:
        An incorrect macro name fixed.
      sql/protocol.h:
        An incorrect macro name fixed.
      sql/sp.cc:
        Do not allow SP which we are parsing to use other SP
        context (BUG#13549).
      sql/sp_head.cc:
        Protection against using wrong context by SP local variable.
      sql/sp_rcontext.h:
        Protection against using wrong context by SP local variable.
      sql/sql_cache.h:
        An incorrect macro name fixed.
      sql/sql_class.cc:
        Protection against using wrong context by SP local variable.
      sql/sql_class.h:
        Protection against using wrong context by SP local variable.
      sql/sql_trigger.cc:
        Do not allow Trigger which we are parsing to use
        other SP context (BUG#13549).
      sql/sql_yacc.yy:
        Protection against using wrong context by SP local variable.
      8152a78f
  8. 17 Nov, 2005 1 commit
    • unknown's avatar
      Fix for bug #13399 Crash when executing PS/SP which should activate trigger · e5c9ca83
      unknown authored
      which is now dropped" and bug #12329 "Bogus error msg when executing PS with
      stored procedure after SP was re-created".
      
      
      mysql-test/r/sp-error.result:
        Added test for bug #12329 "Bogus error msg when executing PS with stored
        procedure after SP was re-created".
      mysql-test/r/trigger.result:
        Added test for bug #13399 Crash when executing PS/SP which should activate
        trigger which is now dropped".
      mysql-test/t/sp-error.test:
        Added test for bug #12329 "Bogus error msg when executing PS with stored
        procedure after SP was re-created".
      mysql-test/t/trigger.test:
        Added test for bug #13399 Crash when executing PS/SP which should activate
        trigger which is now dropped".
      sql/sp_head.cc:
        sp_head::add_used_tables_to_table_list():
          We have to copy database/table names and alias to PS/SP memory since current
          instance of sp_head object can pass away before next execution of PS/SP for
          which tables are added to prelocking list.
          This will be fixed by introducing of proper invalidation mechanism once new
          TDC is ready.
      e5c9ca83
  9. 14 Sep, 2005 1 commit
    • unknown's avatar
      Fix for bug #12704 "Server crashes during trigger execution". · d8dea0bb
      unknown authored
      This bug occurs when some trigger for table used by DML statement is created
      or changed while statement was waiting in lock_tables(). In this situation
      prelocking set which we have calculated becames invalid which can easily lead
      to errors and even in some cases to crashes.
      
      With proposed patch we no longer silently reopen tables in lock_tables(),
      instead caller of lock_tables() becomes responsible for reopening tables and
      recalculation of prelocking set.
      
      
      mysql-test/t/trigger.test:
        Added tests for bug #12704 "Server crashes during trigger execution".
        Unfortunately these tests rely on the order in which tables are locked
        by statement so they are non-determenistic and therefore should be disabled.
      sql/lock.cc:
        mysql_lock_tables():
          Now instead of always reopening altered or dropped tables by itself
          mysql_lock_tables() can notify upper level and rely on caller doing this.
      sql/mysql_priv.h:
        Now mysql_lock_tables() can either reopen deleted or altered tables by itself
        or notify caller about such situation through 'need_reopen' argument and rely
        on it in this.
        Also lock_tables() has new 'need_reopen' out parameter through which it
        notifies caller that some tables were altered or dropped so he needs to reopen
        them (and rebuild prelocking set some triggers may change or simply appear).
      sql/sp.cc:
        sp_add_used_routine():
          To be able to restore LEX::sroutines_list to its state right after parsing
          we now adjust  LEX::sroutines_list_own_last/sroutines_list_own_elements when
          we add directly used routine.
        sp_remove_not_own_routines():
          Added procedure for restoring LEX::sroutines/sroutines_list to their state
          right after parsing (by throwing out non-directly used routines).
        sp_cache_routines_and_add_tables_for_view()/sp_update_stmt_used_routines():
          We should use LEX::sroutines_list instead of LEX::sroutines as source of
          routines used by view, since LEX::sroutines is not availiable for view
          on second attempt to open it (see comment in open_tables() about it).
      sql/sp.h:
        sp_remove_not_own_routines():
          Added procedure for restoring LEX::sroutines/sroutines_list to their state
          right after parsing (by throwing out non-directly used routines).
      sql/sp_head.cc:
        Removed assert which is no longer always true.
      sql/sql_base.cc:
        reopen_table():
          When we re-open table and do shallow copy of TABLE object we should adjust
          pointers to it in associated Table_triggers_list object. Removed nil
          operation.
        open_tables():
          Now this function is able to rebuild prelocking set for statement if it is
          needed. It also correctly handles FLUSH TABLES which may occur during its
          execution.
        lock_tables():
          Instead of allowing mysql_lock_tables() to silently reopen altered or dropped
          tables let us notify caller and rely on that it will do reopen itself.
          This solves the problem when trigger suddenly appears or changed during
          mysq_lock_tables().
        close_tables_for_reopen():
          Added routine for properly preparing for reopening of tables and recalculation
          of set of prelocked tables.
      sql/sql_handler.cc:
        Here we let mysql_lock_tables() to reopen dropped or altered tables by itself.
      sql/sql_insert.cc:
        Here we let mysql_lock_tables() to reopen dropped or altered tables by itself.
      sql/sql_lex.cc:
        LEX:
          Added 'sroutines_list_own_last' and 'sroutines_list_own_elements' members
          which are used for keeping state in which 'sroutines_list' was right after
          statement parsing (and for restoring of this list to this state).
      sql/sql_lex.h:
        LEX:
          Added 'sroutines_list_own_last' and 'sroutines_list_own_elements' members
          which are used for keeping state in which 'sroutines_list' was right after
          statement parsing (and for restoring of this list to this state).
          Added chop_off_not_own_tables() method to simplify throwing away list
          of implicitly used (prelocked) tables.
      sql/sql_prepare.cc:
        Now instead of silently reopening altered or dropped tables in
        lock_tables() we notify caller and rely on that the caller will
        reopen tables.
      sql/sql_table.cc:
        Here we let mysql_lock_tables() to reopen dropped or altered tables by itself.
      sql/sql_trigger.cc:
        Added Table_triggers_list::set_table() method to adjust Table_triggers_list
        to new pointer to TABLE instance.
      sql/sql_trigger.h:
        Added Table_triggers_list::set_table() method to adjust Table_triggers_list
        to new pointer to TABLE instance.
      sql/sql_update.cc:
        Now instead of silently reopening altered or dropped tables in
        lock_tables() we notify caller and rely on that the caller will
        reopen tables.
      d8dea0bb
  10. 02 Sep, 2005 1 commit
    • unknown's avatar
      Implement WL#2661 "Prepared Statements: Dynamic SQL in Stored Procedures". · 9fbcfd67
      unknown authored
      The idea of the patch is to separate statement processing logic,
      such as parsing, validation of the parsed tree, execution and cleanup, 
      from global query processing logic, such as logging, resetting
      priorities of a thread, resetting stored procedure cache, resetting
      thread count of errors and warnings.
      This makes PREPARE and EXECUTE behave similarly to the rest of SQL
      statements and allows their use in stored procedures.
      This patch contains a change in behaviour:
      until recently for each SQL prepared statement command, 2 queries
      were written to the general log, e.g.
      [Query]   prepare stmt from @stmt_text;
      [Prepare] select * from t1 <-- contents of @stmt_text
      The chagne was necessary to prevent [Prepare] commands from being written
      to the general log when executing a stored procedure with Dynamic SQL.
      We should consider whether the old behavior is preferrable and probably
      restore it.
      This patch refixes Bug#7115, Bug#10975 (partially), Bug#10605 (various bugs
      in Dynamic SQL reported before it was disabled).
      
      
      mysql-test/r/not_embedded_server.result:
        Since we don't want to log Dynamic SQL in stored procedures,
        now the general log gets only one log entry per SQL statement.
      mysql-test/r/sp-error.result:
        - remove obsolete tests
        - a better error message for the case when a stored procedure that
        returns a result set is called from a function
      mysql-test/r/trigger.result:
        - a better error message for the case when a stored procedure that
        returns a result set is called from a trigger
      mysql-test/t/sp-error.test:
        - a better error message for the case when a stored procedure that
          returns a result set is called from a function.
        - move the comment to its place (end of file).
      mysql-test/t/trigger.test:
        - a better error message for the case when a stored procedure that
        returns a result set is called from a trigger
      sql/item_func.cc:
        - we need to pass sql_command explicitly to get_var_with_binlog, because
        when creating a query for SQL prepared statement thd->lex->sql_command
        points at SQLCOM_EXECUTE, which is not listed in the list of update
        queries.
      sql/log_event.h:
        - remove an extra copy of the previous sentence
      sql/mysql_priv.h:
        - fix declarations of sql_prepare.cc API
      sql/share/errmsg.txt:
        - a new error message, when one attempts to execute a prepared statement
        which is currently being executed (this can happen only in Dynamic SQL
        at the moment).
      sql/sp_head.cc:
        - extend sp_multi_results_command to return different flags for a
        command (and rename it)
        - add support for SQLCOM_PREPARE,SQLCOM_EXECUTE, SQLCOM_DEALLOCATE
          to sp_get_flags_for_command
        - replace multiple boolean sp_head members with uint m_flags
        - a fix for a crash when user variables are used in a stored procedure
          and binlog is on. A temporary fix for Bug#12637 "SP crashes the server 
         if it has update query with user var & binlog is enabled", which actually
         stands for stored functions: now instead of a crash we break
         replication if a user variable is used in a stored function which 
         is executed in prelocked mode.
      sql/sp_head.h:
        - replace multiple boolean flags of sp_head with uint m_flags;
        - add flag CONTAINS_DYNAMIC_SQL
        - use this flag to error if a stored procedure with Dynamic SQL is
          called from a function or trigger.
      sql/sql_class.cc:
        - Statement_map::insert should not delete a statement if it exists,
          now it's done externally to be able to handle the case when the
          statement being deleted is in use.
        - remove extra code (free_list is already reset in free_items)
      sql/sql_lex.cc:
        - add lex->stmt_prepare_mode; we can't rely on thd->command any more,
          because we don't reset it any more (Dynamic SQL requirement is that
          PS are as little intrusive as possible).
      sql/sql_lex.h:
        - declare bool LEX::stmt_prepare_mode
      sql/sql_parse.cc:
        - move prepared statement code to sql_prepare.cc
        - change declarations (refactored code)
        - better error message when one attempts to use Dynamic SQL or a 
          stored procedure that returns a result set in a function or trigger.
      sql/sql_prepare.cc:
        - major refactoring to ensure PREPARE/EXECUTE commands do not reset global THD
          state and allow their use in stored procedures.
        - add Prepared_statement::flags and use it to ensure no recursive execution
          of a prepared statement is possible
        - better comments
      sql/sql_yacc.yy:
        - enable PREPARE/EXECUTE/DEALLOCATE in stored procedures
        - produce an error message on attempt to use PREPARE/EXECUTE/DEALLOCATE
          in a stored function or trigger
      mysql-test/r/sp-dynamic.result:
        - sp-dynamic.test results
      mysql-test/t/sp-dynamic.test:
        - a new test for PREPARE/EXECUTE/DEALLOCATE in stored procedures.
      9fbcfd67
  11. 18 Aug, 2005 1 commit
    • unknown's avatar
      Fix for bug #11896 "Partial locking in case of recursive trigger definitions". · fb431ecf
      unknown authored
      If we are in stored function or trigger we should ensure that we won't change
      table that is already used by calling statement (this can damage table or
      easily cause infinite loops). Particularly this means that recursive triggers
      should be disallowed.
      
      
      mysql-test/r/sp-error.result:
        Added tests checking that in functions we don't allow to update tables which
        are used by statements which invoke these functions.
      mysql-test/r/trigger.result:
        Added test for bug #11896 "Partial locking in case of recursive trigger
        definitions".
      mysql-test/t/sp-error.test:
        Added tests checking that in functions we don't allow to update tables which
        are used by statements which invoke these functions.
      mysql-test/t/trigger.test:
        Added test for bug #11896 "Partial locking in case of recursive trigger
        definitions".
      sql/share/errmsg.txt:
        Added error messages for complaining about situations when in function or
        trigger we try to change table which is used in statement invoking this
        function or trigger.
      sql/sql_base.cc:
        open_table():
          If we are in stored function or trigger we should ensure that
          we won't change table that is already used by calling statement
          (this can damage table or easily cause infinite loops).
          So if we are opening table for writing, we should check that it
          is not already open by some calling stamement.
      fb431ecf
  12. 15 Aug, 2005 2 commits
    • unknown's avatar
      Fixed typo in error numbers · b49978e3
      unknown authored
      b49978e3
    • unknown's avatar
      Save and clear run context before executing a stored function or trigger and restore it afterwards. · 262075d1
      unknown authored
      This allows us to use statement replication with functions and triggers
      The following things are fixed with this patch:
      - NOW() and automatic timestamps takes the value from the main event for functions and triggers (which allows these to replicate with statement level logging)
      - No side effects for triggers or functions with auto-increment values(), last_insert_id(), rand() or found_rows()
      - Triggers can't return result sets
      
      Fixes bugs:
      #12480: NOW() is not constant in a trigger
      #12481: Using NOW() in a stored function breaks statement based replication
      #12482: Triggers has side effects with auto_increment values
      #11587: trigger causes lost connection error
      
      
      mysql-test/r/trigger.result:
        Added test fpr big
      mysql-test/t/sp-error.test:
        Changed error message numbers
      mysql-test/t/trigger.test:
        Added test for trigger returning result (#11587)
      sql/item_func.cc:
        Store the first used seed value for RAND() value.
        (This makes rand() replicatable in functions and triggers)
        Save and clear run context before executing a stored function and restore it afterwards.
        This removes side effects of stored functions for RAND(), auto-increment values and NOW() and makes most stored function replicatable
      sql/share/errmsg.txt:
        Reuse error message also for triggers
      sql/sp_head.cc:
        If in function or trigger, don't change value of NOW()
        (This allows us to use statement replication with functions that directly or indirectly uses timestamps)
      sql/sql_class.cc:
        Added framework for storing and retrieving run context while exceuting triggers or stored functions.
      sql/sql_class.h:
        Added framework for storing and retrieving run context while exceuting triggers or stored functions.
      sql/sql_parse.cc:
        If in function or trigger, don't change value of NOW()
        (This allows us to use statement replication with functions that directly or indirectly uses timestamps)
      sql/sql_trigger.cc:
        Moved process_triggers function from sql_trigger.h
        Use reset/restore sub_statement_state while executing triggers to avoid side effects and make them replicatable
      sql/sql_trigger.h:
        Moved process_triggers function from sql_trigger.h
        Use reset/restore sub_statement_state while executing triggers to avoid side effects and make them replicatable
      sql/sql_yacc.yy:
        Give error message if trigger can return a result set (Bug #11587)
      tests/fork_big2.pl:
        Removed return from end of lines
      mysql-test/r/rpl_trigger.result:
        New BitKeeper file ``mysql-test/r/rpl_trigger.result''
      mysql-test/t/rpl_trigger.test:
        New BitKeeper file ``mysql-test/t/rpl_trigger.test''
      262075d1
  13. 10 Aug, 2005 1 commit
    • unknown's avatar
      Fix for bug #12280 "Triggers: crash if flush tables". · 8ae80c39
      unknown authored
      We should not allow FLUSH statement to be executed inside both triggers
      and stored functions.
      
      
      mysql-test/r/sp-error.result:
        Updated test after replacing error, which is thrown when one uses FLUSH
        statement inside of stored function, with more specific.
        Also now we issue more general error when we barking about USE command
        in stored routines.
      mysql-test/r/trigger.result:
        Added test for bug #12280 "Triggers: crash if flush tables"
      mysql-test/t/sp-error.test:
        Updated test after replacing error, which is thrown when one uses FLUSH
        statement inside of stored function, with more specific.
        Also now we issue more general error when we barking about USE command
        in stored routines.
      mysql-test/t/trigger.test:
        Added test for bug #12280 "Triggers: crash if flush tables"
      sql/share/errmsg.txt:
        Removed ER_SP_NO_USE error. Now we use more general ER_SP_BADSTATEMENT in this
        case. Instead added error message for barking about statements which should not
        be allowed inside of stored functions or triggers.
        It is safe to do this since it is highly unprobable that someone will upgrade
        first to the new 5.0 release and then downgrade back to the old one.
      sql/sql_parse.cc:
        reload_acl_and_cache():
          FLUSH TABLES and FLUSH PRIVILEGES should not be allowed if we are inside
          of stored function or trigger.
      sql/sql_yacc.yy:
        We should not allow FLUSH statement inside both triggers and stored
        functions. Replaced error which is thrown in this case with more
        specific.
        Also now we issue more general ER_SP_BADSTATEMENT error when one tries
        to use USE command inside of stored routine.
      8ae80c39
  14. 09 Aug, 2005 1 commit
    • unknown's avatar
      Clumsy but working fix for bug #11973 "SELECT .. INTO var_name; in trigger · 24895964
      unknown authored
      cause crash on update".
      
      Let us update "thd" pointer in LEX, all its units and in LEX::result before
      executing statement in trigger body, since triggers are associated with TABLE
      object and because of this can be used in different threads.
      
      
      mysql-test/r/trigger.result:
        Added test case for bug #11973 "SELECT .. INTO var_name; in trigger cause
        crash on update".
      mysql-test/t/trigger.test:
        Added test case for bug #11973 "SELECT .. INTO var_name; in trigger cause
        crash on update".
      sql/item_subselect.cc:
        subselect_engine:
          Moved implementation of set_thd() method to item_subselect.cc,
          since now it also sets "thd" for subselect_engine::result.
      sql/item_subselect.h:
        subselect_engine:
          Moved implementation of set_thd() method to item_subselect.cc,
          since now it also sets "thd" for subselect_engine::result.
      sql/sql_class.h:
        select_result:
          Added set_thd() method for updating select_result::thd value (we need this
          in cases when statement to which this select_result belongs will be used
          in different threads, as it happens for statements in trigger body).
        multi_delete/multi_update:
          Got rid of redundant "thd" member (we already have it in select_result).
      sql/sql_delete.cc:
        multi_delete:
          Got rid of redundant "thd" member (we already have it in select_result).
      sql/sql_lex.h:
        st_select_lex_unit:
          Added set_thd() method for updating st_select_lex_unit::thd value
          (we need this in cases when statement to which this unit belongs will
           be used in different threads, as it happens for statements in trigger body).
          We don't update thd of select_result pointed by st_select_lex_unit::result
          in this method, since it is either have too short lifetime (i.e. created for
          each execution) or is accessible via Item_subquery or LEX::result and thus
          already taken care of.
      sql/sql_parse.cc:
        multi_delete:
          Got rid of redundant "thd" member (we already have it in select_result).
      sql/sql_prepare.cc:
        reinit_stmt_before_use():
          We have to update "thd" pointer in LEX, all its units and in LEX::result,
          since statements which belong to trigger body are associated with TABLE
          object and because of this can be used in different threads.
      sql/sql_update.cc:
        multi_update:
          Got rid of redundant "thd" member (we already have it in select_result).
      24895964
  15. 30 Jul, 2005 1 commit
  16. 28 Jul, 2005 1 commit
    • unknown's avatar
      store/restore sql_mode which was in force during ctrigger creation (BUG#5891) · c630a7ba
      unknown authored
      other sql_mode fixes
      
      
      mysql-test/r/information_schema.result:
        changes in information schema
      mysql-test/r/trigger.result:
        storing and restoring sql modes for triggers
      mysql-test/t/trigger.test:
        storing and restoring parsing modes for triggers
      sql/mysqld.cc:
        add length of mode names
      sql/parse_file.cc:
        new type of list (ulonglong)
      sql/parse_file.h:
        new type of list (ulonglong)
      sql/set_var.cc:
        mode output made as static method
      sql/set_var.h:
        mode output made as static method
      sql/sp_head.cc:
        added sql_mode storing/restoring during SP execution
        optimised sql_mode printing
      sql/sp_head.h:
        comment fixed according this changes
      sql/sql_show.cc:
        added sql_mode field
      sql/sql_trigger.cc:
        store/restore sql_mode which was in force during ctrigger creation
      sql/sql_trigger.h:
        store/restore sql_mode which was in force during ctrigger creation
      sql/sql_view.cc:
        fixed sql_mode
      c630a7ba
  17. 19 Jul, 2005 2 commits
    • unknown's avatar
      After merge fix. · de1b1108
      unknown authored
      de1b1108
    • unknown's avatar
      Fix for bugs #5892/6182/8751/8758/10994 (based on Antony's patch) · e4bbce4f
      unknown authored
        "Triggers have the wrong namespace"
        "Triggers: duplicate names allowed"
        "Triggers: CREATE TRIGGER does not accept fully qualified names"
        "SHOW TRIGGERS"
      
      
      mysql-test/r/information_schema.result:
        Added tests for new INFORMATION_SCHEMA.TRIGGERS view and SHOW TRIGGERS command.
      mysql-test/r/information_schema_db.result:
        INFORMATION_SCHEMA.TRIGGERS view was added.
      mysql-test/r/rpl_sp.result:
        Now DROP TRIGGER interprets first part of trigger identifier as database
        name and not as table name. Adjusted tests properly.
      mysql-test/r/trigger.result:
        Now DROP TRIGGER interprets first part of trigger identifier as database
        name and not as table name. Adjusted tests properly.
        Added test checking that triggers have database wide namespace.
        Added test for bug #8791 "Triggers: Allowed to create triggers on a subject
        table in a different DB".
      mysql-test/r/view.result:
        Now DROP TRIGGER interprets first part of trigger identifier as database
        name and not as table name. Adjusted tests properly.
      mysql-test/t/information_schema.test:
        Added tests for new INFORMATION_SCHEMA.TRIGGERS view and SHOW TRIGGERS command.
      mysql-test/t/rpl_sp.test:
        Now DROP TRIGGER interprets first part of trigger identifier as database
        name and not as table name. Adjusted tests properly.
      mysql-test/t/trigger.test:
        Now DROP TRIGGER interprets first part of trigger identifier as database
        name and not as table name. Adjusted tests properly.
        Added test checking that triggers have database wide namespace.
        Added test for bug #8791 "Triggers: Allowed to create triggers on a subject
        table in a different DB".
      mysql-test/t/view.test:
        Now DROP TRIGGER interprets first part of trigger identifier as database
        name and not as table name. Adjusted tests properly.
      sql/handler.cc:
        Added .TRN tho the list of known file extensions assoicated with tables.
      sql/item.h:
        trg_action_time_type/trg_event_type enums:
          Added TRG_ACTION_MAX/TRG_EVENT_MAX elements which should be used instead of
          magical values in various loops where we iterate through all types of trigger
          action times or/and trigger event types.
      sql/lex.h:
        Added new symbol "TRIGGERS".
      sql/mysql_priv.h:
        Added declaration of constant holding extension for trigger name (.TRN) files.
      sql/mysqld.cc:
        Added statistical variable for SHOW TRIGGERS command.
      sql/share/errmsg.txt:
        Added error message saying that one attempts to create trigger in wrong schema.
      sql/sp.cc:
        Replaced magical values with TRG_EVENT_MAX/TRG_ACTION_MAX constants.
      sql/sql_base.cc:
        open_unireg_entry():
          Now Table_triggers_list::check_n_load() has one more argument which
          controls whether we should prepare Table_triggers_list with fully functional
          triggers or load only their names.
      sql/sql_lex.h:
        Added element for new SHOW TRIGGERS command to enum_sql_command enum.
      sql/sql_parse.cc:
        prepare_schema_table():
          Added support for SHOW TRIGGERS statement.
      sql/sql_show.cc:
        Added new INFORMATION_SCHEMA.TRIGGERS view and SHOW TRIGGERS command.
      sql/sql_table.cc:
        mysql_rm_table_part2():
          Replaced simple deletion of .TRG file with call to
          Table_triggers_list::drop_all_triggers which will also delete .TRN files
          for all triggers associated with table.
      sql/sql_trigger.cc:
        Now triggers have database wide namespace. To support it we create special .TRN
        file with same name as trigger for each trigger. This file contains name of
        trigger's table so one does not need to specify it explicitly in DROP TRIGGER.
        Moreover DROP TRIGGER treats first part of trigger identifier as database name
        now. Updated mysql_create_or_drop_trigger() routine and
        Table_triggers_list::create_trigger()/drop_trigger()/check_n_load() methods
        accordingly. Added add_table_for_trigger() routine and
        Table_triggers_list::drop_all_triggers() method.
        
        Added Table_triggers_list::get_trigger_info() for obtaining trigger metadata.
      sql/sql_trigger.h:
        Table_triggers_list:
          Use TRG_EVENT_MAX, TRG_ACTION_MAX instead of magic values.
          Added get_trigger_info() method for obtaining trigger's meta-data.
          Added drop_all_triggers() method which drops all triggers for table.
          Added declarations of trg_action_time_type_names/trg_event_type_names
          arrays which hold names of triggers action time types  and event types.
      sql/sql_yacc.yy:
        Changed grammar for CREATE/DROP TRIGGER to support database wide trigger
        namespace. Added new SHOW TRIGGERS statement.
      sql/table.h:
        enum enum_schema_tables:
          Added constant for new INFORMATION_SCHEMA.TRIGGERS view.
      e4bbce4f
  18. 13 Jul, 2005 2 commits
    • unknown's avatar
      Now when we create or drop trigger we will open only subject table and not · a6ad1c5e
      unknown authored
      all tables suggested by prelocking algorithm.
      Added test for bug #11889 "Server crashes when dropping trigger using stored
      routine" (which was fixed by previous patch).
      
      
      mysql-test/r/trigger.result:
        Since we are using open_ltable() now to open table for trigger creation, code
        for error when we try to create trigger on view has changed to equivalent one.
        Added test for bug #11889 "Server crashes when dropping trigger using stored
        routine".
      mysql-test/t/trigger.test:
        Since we are using open_ltable() now to open table for trigger creation, code
        for error when we try to create trigger on view has changed to equivalent one.
        Added test for bug #11889 "Server crashes when dropping trigger using stored
        routine".
      sql/sql_trigger.cc:
        mysql_create_or_drop_trigger():
          It is better to open only table for which we are going to create or drop
          trigger with open_ltable() since we don't really need working prelocking
          in this case.
      a6ad1c5e
    • unknown's avatar
      Fixed trigger.test after fixing bug #11554 "Server crashes on statement · cea87db2
      unknown authored
      indirectly using non-cached function".
      
      
      mysql-test/r/trigger.result:
        Fixed test case after fixing bug #11554 "Server crashes on statement
        indirectly using non-cached function".
      mysql-test/t/trigger.test:
        Fixed test case after fixing bug #11554 "Server crashes on statement
        indirectly using non-cached function".
      cea87db2
  19. 09 Jul, 2005 2 commits
    • unknown's avatar
      Manual fixes after merging patch for bug #8406 "Triggers crash if referencing · 22a3bb89
      unknown authored
      a table" with main tree.
      
      
      mysql-test/r/trigger.result:
        Temporalily disable part of test which exposes bug #11554 (work on which is in
        progress).
      mysql-test/t/sp-error.test:
        After merge fix.
          Fixed wrong delimiter command.
      mysql-test/t/trigger.test:
        Temporalily disable part of test which exposes bug #11554 (work on which is in
        progress).
      sql/sp.cc:
        After merge fix.
          Item_arena was renamed to Query_arena.
      sql/sp.h:
        After merge fix.
          Item_arena was renamed to Query_arena.
      sql/sql_lex.cc:
        After merge fix.
          LEX::spfuns/spprocs hashes were replaces with one LEX::sroutines hash.
      22a3bb89
    • unknown's avatar
      Enable support of access to tables from triggers. Thus fix bug #8406 "Triggers · f64f74cb
      unknown authored
      crash if referencing a table" and several other related bugs.
      Fix for bug #11834 "Re-execution of prepared statement with dropped function
      crashes server." which was spotted during work on previous bugs.
      
      Also couple of nice cleanups:
      - Replaced two separate hashes for stored routines used by statement with one.
      - Now instead of doing one pass through all routines used in statement for
        caching them and then doing another pass for adding their tables to table
        list, we do only one pass during which do both things.
      
      
      mysql-test/r/sp-error.result:
        Added test for bug #11834 "Re-execution of prepared statement with dropped
        function crashes server" also covering handling of prepared statements
        which use stored functions but does not require prelocking.
      mysql-test/r/sp.result:
        Updated test for LOCK TABLES with views in table list.
        (Old version of statement used in this test will work ok now, since prelocking
         algorithm was tuned and will lock only one multi-set of tables for each routine
         even if this routine is used in several different views).
      mysql-test/r/trigger.result:
        Added several tests for triggers using tables.
      mysql-test/t/sp-error.test:
        Added test for bug #11834 "Re-execution of prepared statement with dropped
        function crashes server" also covering handling of prepared statements
        which use stored functions but does not require prelocking.
      mysql-test/t/sp.test:
        Updated comment about recursive views to reflect current situation.
        Updated test for LOCK TABLES with views in table list.
        (Old version of statement used in this test will work ok now, since prelocking
         algorithm was tuned and will lock only one multi-set of tables for each routine
         even if this routine is used in several different views).
      mysql-test/t/trigger.test:
        Added several tests for triggers using tables.
      sql/item_func.cc:
        Item_func_sp::cleanup():
          By next statement execution stored function can be dropped or altered so
          we can't assume that sp_head object for it will be still valid.
      sql/sp.cc:
        - Added Sroutine_hash_entry structure that represents element in the set of
          stored routines used by statement or routine. We can't as before use
          LEX_STRING for this purprose because we want link all elements of this set
          in list.
        - Replaced sp_add_to_hash() with sp_add_used_routine() which takes into account
          that now we use one hash for stored routines used by statement instead of two
          and which mantains list linking all elelemnts in this hash.
        - Renamed sp_merge_hash() to sp_update_sp_used_routines().
        - Introduced sp_update_stmt_used_routines() for adding elements to the set of
          routines used by statement from another similar set for statement or routine.
          This function will also mantain list linking elements of destination set.
        - Now instead of one sp_cache_routines() function we have family of 
          sp_cache_routines_and_add_tables() functions which are also responsible for
          adding tables used by routines being cached to statement table list. Nice
          optimization - thanks to list linking all elements in the hash of routines
          used by statement we don't need to perform several iterations over this hash
          (as it was before in cases when we have added new elements to it).
      sql/sp.h:
        Added declarations of functions used for manipulations with set (hash) of stored
        routines used by statement.
      sql/sp_head.cc:
        sp_name::init_qname():
          Now sp_name also holds key identifying routine in the set (hash) of
          stored routines used by statement. 
        sp_head:
          Instead of two separate hashes sp_funs/m_spprocs representing sets of stored
          routines used by this routine we use one hash - m_sroutines. 
        sp_instr_set_trigger_field:
          Added support for subqueries in assignments to row accessors in triggers.
        Removed definition of sp_add_sp_tables_to_table_list() and auxilary functions 
        since now we don't have separate stage on which we add tables used by routines
        used by statement to table list for prelocking. We do it on the same stage as
        we load those routines in SP cache. So all this functionality moved to
        sp_cache_routines_and_add_tables() family of functions.
      sql/sp_head.h:
        sp_name:
          Now this class also holds key identifying routine in the set (hash) of stored
          routines used by statement. 
        sp_head:
          Instead of two separate hashes sp_funs/m_spprocs representing sets of stored
          routines used by this routine we use one hash - m_sroutines. 
        sp_instr_set_trigger_field:
          Added support for subqueries in assignments to row accessors in triggers.
        Removed declaration of sp_add_sp_tables_to_table_list() since now we don't have
        separate stage on which we add tables used by routines used by statement to
        table list for prelocking. We do it on the same stage as we load those routines
        in SP cache.
      sql/sql_base.cc:
        open_tables():
        - LEX::spfuns/spprocs hashes were replaced with one LEX::sroutines hash.
        - Now instead of doing one pass through all routines used in statement for
          caching them and then doing another pass for adding their tables to table
          list, we do only one pass during which do both things. It is easy to do
          since all routines in the set of routines used by statement are linked in
          the list. This also allows us to calculate table list for prelocking more
          precisely.
        - Now triggers properly inform prelocking algorithm about tables they use.
      sql/sql_lex.cc:
        lex_start():
          Replaced LEX::spfuns/spprocs with with one LEX::sroutines hash.
          Added LEX::sroutines_list list linking all elements in this hash.
        st_lex::st_lex():
          Moved definition of LEX constructor to sql_lex.cc file to be able
          use sp_sroutine_key declaration from sp.h in it.
      sql/sql_lex.h:
        LEX:
          Replaced two separate hashes for stored routines used by statement with one.
          Added list linking all elements in this hash to be able to iterate through all
          elements and add new elements to this hash at the same time.
          Moved constructor definition to sql_lex.cc.
      sql/sql_parse.cc:
        mysql_execute_command():
          Replaced LEX::spfuns/spprocs with one LEX::sroutines hash.
      sql/sql_trigger.cc:
        Added missing GNU GPL notice.
        Table_triggers_list::check_n_load()
          Added initialization of sroutines_key which stores key representing
          triggers of this table in the set (hash) of routines used by this statement.
      sql/sql_trigger.h:
        Added missing GNU GPL notice.
        Table_triggers_list:
          Added sroutines_key member to store key representing triggers of this
          table in the set (hash) of routines used by this statement.
          Declared sp_cache_routines_and_add_tables_for_triggers() as friend since
          it needs access to sroutines_key and trigger bodies.
      sql/sql_yacc.yy:
        - Now we use sp_add_used_routine() instead of sp_add_to_hash() for adding
          elements to the set of stored routines used in statement.
        - Enabled support of subqueries as right sides in assignments to triggers' row
          accessors.
      f64f74cb
  20. 29 Jun, 2005 1 commit
    • unknown's avatar
      Added test for bug #5893 "Triggers with dropped functions cause crashes" · 42073a5c
      unknown authored
      (The bug itself was fixed earlier by the patch that fixed bug #5860
       "Multi-table UPDATE does not activate update triggers" and several
       other bugs). 
      
      
      mysql-test/r/trigger.result:
        Added test for bug #5893 "Triggers with dropped functions cause crashes"
      mysql-test/t/trigger.test:
        Added test for bug #5893 "Triggers with dropped functions cause crashes"
      42073a5c
  21. 30 May, 2005 1 commit
    • unknown's avatar
      Added test for bug #5894 "Triggers with altered tables cause corrupt · 380a5d39
      unknown authored
      databases" and basic handling of errors which happen in triggers.
      (The bug itself was fixed by several previous patches).
      Fixed bug in multi-delete which were exposed by these tests.
      
      
      mysql-test/r/trigger.result:
        Added test for bug #5894 "Triggers with altered tables cause corrupt
        databases" and basic handling of errors which happen in triggers.
      mysql-test/t/trigger.test:
        Added test for bug #5894 "Triggers with altered tables cause corrupt
        databases" and basic handling of errors which happen in triggers.
      sql/sql_delete.cc:
        multi_delete::send_eof():
          Fixed bug which were exposed by testing of basic handling of errors
          in triggers. Error which happened in multi_delete::do_deletes() 
          was wiped out by thd->clear_error() and thus never sent to client
          (and this stalled client connection).
      380a5d39
  22. 24 May, 2005 1 commit
    • unknown's avatar
      Fix for bugs: · efc2479d
      unknown authored
       #5860 "Multi-table UPDATE does not activate update triggers"
       #6812 "Triggers are not activated for INSERT ... SELECT"
       #8755 "Trigger is not activated by LOAD DATA".
      This patch also implements proper handling of triggers for special forms
      of insert like REPLACE or INSERT ... ON DUPLICATE KEY UPDATE. 
      Also now we don't call after trigger in case when we have failed to
      inserted/update or delete row. Trigger failure should stop statement
      execution.
      
      I have not properly tested handling of errors which happen inside of
      triggers in this patch, since it is simplier to do this once we will be
      able to access tables from triggers.
      
      
      mysql-test/r/trigger.result:
        Added tests for triggers behavior for various non-standard forms of
        INSERT such as REPLACE and INSERT ... ON DUPLICATE KEY UPDATE.
        Also added tests for bugs #5860 "Multi-table UPDATE does not activate
        update triggers", #6812 "Triggers are not activated for INSERT ... SELECT"
        and #8755 "Trigger is not activated by LOAD DATA".
      mysql-test/t/trigger.test:
        Added tests for triggers behavior for various non-standard forms of
        INSERT such as REPLACE and INSERT ... ON DUPLICATE KEY UPDATE.
        Also added tests for bugs #5860 "Multi-table UPDATE does not activate
        update triggers", #6812 "Triggers are not activated for INSERT ... SELECT"
        and #8755 "Trigger is not activated by LOAD DATA".
      sql/item.cc:
        Since it turned out that at trigger loading time we can't say in which
        buffer TABLE::record[0] or record[1] old version of row will be stored
        we have to change our approach to binding of Item_trigger_field to
        Field instances.
        Now after trigger parsing (in Item_trigger_field::setup_table()) we only
        find index of proper Field in the TABLE::field array. Then before trigger
        is invoked we set Table_triggers_list::old_field/new_field so they point
        to arrays holding Field instances bound to buffers with proper row
        versions. And as last step in Item_trigger_field::fix_fields() we get
        pointer to Field from those arrays using saved field index.
        
        Item_trigger_field::setup_field()/fix_fields() were changed to implement
        this approach.
      sql/item.h:
        Since it turned out that at trigger loading time we can't say in which
        buffer TABLE::record[0] or record[1] old version of row will be stored
        we have to change our approach to binding of Item_trigger_field to
        Field instances.
        Now after trigger parsing (in Item_trigger_field::setup_table()) we only
        find index of proper Field in the TABLE::field array. Then before trigger
        is invoked we set Table_triggers_list::old_field/new_field so they point
        to arrays holding Field instances bound to buffers with proper row
        versions. And as last step in Item_trigger_field::fix_fields() we get
        pointer to Field from those arrays using saved field index.
        
        Item_trigger_field:
        - Added field_idx member to store index of Field object corresponding to
          this Item in TABLE::field array.
        - Added triggers member to be able to access to parent Table_trigger_list
          object from fix_fields() method.
        - setup_field() no longer needs to know for which type of event this
          trigger is, since it does not make decision Field for which buffer
          (record[0] or record[1] is appropriate for this Item_trigger_field)
      sql/mysql_priv.h:
        Added fill_record_n_invoke_before_triggers() methods. They are simple
        wrappers around fill_record() which invoke proper before trigger right
        after filling record with values.
      sql/sql_base.cc:
        Added fill_record_n_invoke_before_triggers() methods. They are simple
        wrappers around fill_record() which invoke proper before trigger right
        after filling record with values.
      sql/sql_delete.cc:
        mysql_delete():
          Now we stop statement execution if one of triggers failed, we also
          don't execute after delete trigger if we failed to delete row from
          the table (We also pass information about which buffer contains old
          version of row to process_triggers()).
        multi_delete::send_data()/do_deletes():
          Now we also invoke triggers in case of multi-delete.
      sql/sql_insert.cc:
        mysql_insert():
          Moved invocation of before triggers to fill_record_n_invoke_before_triggers()
          method. After triggers are now executed as part of write_record().
          (as nice side effect now we also stop statement execution if one of
          triggers fail).
        write_record():
          Invoke after insert trigger after performing insert. Also invoke proper
          triggers if insert is converted to update or conflicting row is deleted.
          Cleaned up error handling a bit - no sense to report error via
          handler::print_error if it was not generated by handler method and
          was reported before.
          Also now we will execute after trigger only if we really have written
          row to the table. 
        select_insert::send_data()/store_values():
          We should also execute INSERT triggers for INSERT ... SELECT statement.
      sql/sql_load.cc:
        read_fixed_length()/read_sep_field():
          We should execute INSERT triggers when processing LOAD DATA statement.
          Small cleanup in auto-increment related code. Also moved check for
          thd->killed which is used to abort LOAD DATA in case of problems
          in 'traditional' mode to better place..
      sql/sql_trigger.cc:
        Since it turned out that at trigger loading time we can't say in which
        buffer TABLE::record[0] or record[1] old version of row will be stored
        we have to change our approach to binding of Item_trigger_field to
        Field instances.
        Now after trigger parsing (in Item_trigger_field::setup_table()) we only
        find index of proper Field in the TABLE::field array. Then before trigger
        is invoked we set Table_triggers_list::old_field/new_field so they point
        to arrays holding Field instances bound to buffers with proper row
        versions. And as last step in Item_trigger_field::fix_fields() we get
        pointer to Field from those arrays using saved field index.
        
        Table_triggers_list methods were changed to implement this approach
        (see also comments for sql_trigger.h).
      sql/sql_trigger.h:
        Since it turned out that at trigger loading time we can't say in which
        buffer TABLE::record[0] or record[1] old version of row will be stored
        we have to change our approach to binding of Item_trigger_field to
        Field instances.
        Now after trigger parsing (in Item_trigger_field::setup_table()) we only
        find index of proper Field in the TABLE::field array. Then before trigger
        is invoked we set Table_triggers_list::old_field/new_field so they point
        to arrays holding Field instances bound to buffers with proper row
        versions. And as last step in Item_trigger_field::fix_fields() we get
        pointer to Field from those arrays using saved field index.
        
        Changed Table_triggers_list to implement this new approach:
        - Added record1_field member to store array of Field objects bound
          to TABLE::record[1] buffer (instead of existing old_field member)
        - Added new_field member and changed meaning of old_field member.
          During trigger execution they should point to arrays of Field objects
          bound to buffers holding new and old versions of row respectively.
        - Added 'table' member to be able to get access to TABLE instance
          (for which this trigger list object was created) from process_triggers()
          method.
        - Now process_triggers() method sets old_field and new_field members
          properly before executing triggers body (basing on new 
          old_row_is_record1 parameter value).
        - Renamed prepare_old_row_accessors_method() to prepare_record1_accessors()
        
        Also added has_before_update_triggers() method which allows to check
        whenever any before update triggers exist for table.
      sql/sql_update.cc:
        mysql_update():
          Now we invoke before triggers in fill_record_n_invoke_before_triggers()
          method. Also now we abort statement execution when one of triggers fail.
        safe_update_on_fly():
          When we are trying to understand if we can update first table in multi
          update on the fly we should take into account that BEFORE UPDATE
          trigger can change field values.
        multi_update::send_data()/do_updates()
          We should execute proper triggers when doing multi-update
          (in both cases when we do it on the fly and using temporary tables).
      efc2479d
  23. 27 Mar, 2005 1 commit
    • unknown's avatar
      Fix for bugs #5859 "DROP TABLE does not drop triggers" and · 64ed3d13
      unknown authored
      #6559 "DROP DATABASE forgets to drop triggers".
      
      If we drop table we should also drop all triggers associated with it.
      To do this we have to check for existence of .TRG file when we are 
      dropping table and delete it too.
      
      
      mysql-test/r/trigger.result:
        Added tests for bugs #5859 "DROP TABLE does not drop triggers"
        and #6559 "DROP DATABASE forgets to drop triggers".
      mysql-test/t/trigger.test:
        Added tests for bugs #5859 "DROP TABLE does not drop triggers"
        and #6559 "DROP DATABASE forgets to drop triggers".
      sql/handler.cc:
        Added .TRG to the list of known extensions of files associated with 
        tables.
      sql/mysql_priv.h:
        Added declaration of constant holding extension for trigger files.
      sql/sql_table.cc:
        mysql_rm_table_part2():
          If we drop table we should also drop all triggers associated with it.
          To do this we have to check for existence of .TRG file and delete it
          (until the moment when we will store trigger definitions in the same
           .FRM file as table description).
      sql/sql_trigger.cc:
        Made constant holding extension for trigger files externally visible.
      64ed3d13
  24. 04 Jan, 2005 1 commit
    • unknown's avatar
      After merge fixes · af8301ce
      unknown authored
      Add support for warnings for prepare of prepared statements
      Fixed test to work with --ps-protocol
      Fixed some test results
      
      
      libmysql/libmysql.c:
        Add support for warnings for prepare of prepared statements
      mysql-test/r/func_concat.result:
        After merge fixes
      mysql-test/r/select.result:
        Delete conflicting tables form previous tests
      mysql-test/r/view.result:
        New code from 4.1 fixed old error
      mysql-test/t/create.test:
        Ensure that --ps-protocol return same results as normal test
      mysql-test/t/func_group.test:
        Remove not needed --disable_ps_protocol
      mysql-test/t/func_time.test:
        Ensure that --ps-protocol return same results as normal test
      mysql-test/t/having.test:
        Ensure that --ps-protocol return same results as normal test
      mysql-test/t/insert_select.test:
        Remove not needed --disable_ps_protocol
      mysql-test/t/select.test:
        Ensure that --ps-protocol return same results as normal test
      mysql-test/t/sp.test:
        Fixed comment
      mysql-test/t/system_mysql_db_fix.test:
        Fix that results is same as from system_mysql_db.test
      mysql-test/t/trigger.test:
        Added comment
      mysql-test/t/type_blob.test:
        Remove not needed --disable_ps_protocol
      mysql-test/t/union.test:
        Run most of the test with --ps-protocol
      mysql-test/t/user_limits.test:
        Ensure that --ps-protocol return same results as normal test
      mysql-test/t/view.test:
        Removed --error as bug is now fixed
      mysql-test/t/warnings.test:
        Ensure that --ps-protocol return same results as normal test
      ndb/include/Makefile.am:
        Don't automaticly use SCCS files
      sql/ha_ndbcluster.cc:
        Removed compiler warning
      sql/log_event.cc:
        After merge fix
      sql/sql_class.h:
        After merge fix
      sql/sql_insert.cc:
        After merge fix
      sql/sql_load.cc:
        After merge fix
      sql/sql_prepare.cc:
        Add support for warnings for prepare of prepared statements
      sql/sql_update.cc:
        After merge fixes
      af8301ce
  25. 03 Jan, 2005 1 commit
    • unknown's avatar
      Remove clear_insert_values() because it was far from trivial to handle the cleanup in all cases · b76b2ba6
      unknown authored
      (Old code failed for INSERT ... ON DUPLICATE with prepared statements) 
      Instead, always reset table->insert_values on open.
      
      
      mysql-test/t/trigger.test:
        Fix test for --ps-protocol
      sql/sql_base.cc:
        Clear insert_values on open_table
      sql/sql_insert.cc:
        Remove clear_insert_values()
      sql/sql_parse.cc:
        Remove clear_insert_values()
      sql/sql_prepare.cc:
        Remove clear_insert_values()
      sql/table.cc:
        Remove clear_insert_values()
      sql/table.h:
        Remove clear_insert_values()
      b76b2ba6
  26. 24 Nov, 2004 1 commit
    • unknown's avatar
      Fix for bug #5888 "Triggers with nonexistent columns cause packets · 245fa6cb
      unknown authored
      out of order". (final version)
      
      Now instead of binding Item_trigger_field to TABLE objects during
      trigger definition parsing at table open, we perform pass through
      special list of all such objects in trigger. This allows easily check
      all references to fields in old/new version of row in trigger during
      execution of CREATE TRIGGER statement (this is more courtesy for users
      since we can't check everything anyway).
      We also report that such reference is bad by returning error from
      Item_trigger_field::fix_fields() method (instead of setup_field())
      This means that if trigger is broken we will bark during trigger
      execution instead of trigger definition parsing at table open.
      (i.e. now we allow to open tables with broken triggers).
      
      
      mysql-test/r/trigger.result:
        Added test which attempts to create trigger for table referencing to
        field which does not exist in this table.
      mysql-test/t/trigger.test:
        Added test which attempts to create trigger for table referencing to
        field which does not exist in this table.
      sql/item.cc:
        Item_trigger_field::setup_field() now returns void. If any error
        will occur we will report it at fix_fields() stage.
      sql/item.h:
        Item_trigger_field:
        - Added next_trg_field member for linking all such objects in trigger
          in one list.
        - Also setup_field() now returns void. If any error will occur we will
          report it at fix_fields() stage.
      sql/mysql_priv.h:
        Added SQL_LIST::push_back() method which allows to add another SQL_LIST
        to the end of this SQL_LIST.
      sql/sp_head.cc:
        sp_head::init()/reset_lex()/restore_lex():
         In order to fill global LEX::trg_table_fields (list of all 
         Item_trigger_field objects for trigger) we should init the same list
         in LEX of substatement before its parsing and merge it to global list
         after parsing.
      sql/sp_head.h:
        sp_instr_trigger_field:
          Made trigger_field member public to be able to add it more easily to
          global list of all Item_trigger_field objects in trigger.
      sql/sql_lex.cc:
        LEX::trg_table was removed.
      sql/sql_lex.h:
        Now we are binding Item_trigger_field's to TABLE object by passing
        through specially constructed list of all such objects in this trigger
        instead of doing this during trigger definition parsing at table open.
        So we no longer need LEX::trg_table, we use LEX::trg_table_fields list
        instead.
      sql/sql_parse.cc:
        mysql_execute_command():
          Since now we use trigger body for some checks in
          mysql_create_or_drop_trigger() we should destroy it only
          after calling this function.
      sql/sql_trigger.cc:
        Now instead of binding Item_trigger_field to TABLE objects during
        trigger definition parsing at table open, we perform pass through
        special list of all such objects in trigger. This allows easily check
        all references to fields in old/new version of row in trigger during
        execution of CREATE TRIGGER statement (this is more courtesy for users
        since we can't check everything anyway).
        We also report that such reference is bad by returning error from
        Item_trigger_field::fix_fields() method (instead of setup_field())
        This means that if trigger is broken we will bark during trigger
        execution instead of trigger definition parsing at table open.
        (i.e. now we allow to open tables with broken triggers).
        
        Table_triggers_list::prepare_old_row_accessors() method was added to be
        able to reuse code creating Field objects referencing TABLE::record[1]
        buffer instead of TABLE::record[0].
      sql/sql_trigger.h:
        Added Table_triggers_list::prepare_old_row_accessors() method to be
        able to reuse code creating Field objects referencing to TABLE::record[1]
        instead of record[0].
      sql/sql_yacc.yy:
        Now instead of performing binding of Item_trigger_field objects
        to TABLE object during trigger definition parsing at table open,
        we perform this binding by passing through specially constructed
        list of all such items in trigger.
        We also check value returned from memory allocation functions.
      245fa6cb
  27. 12 Nov, 2004 1 commit
    • unknown's avatar
      Fix for bug #5890 "Triggers fail for DELETE without WHERE". · 6827c26f
      unknown authored
      If we have DELETE with always true WHERE clause we should not use 
      optimized delete_all_rows() method for tables with DELETE triggers,
      because in this case we will lose side-effect of deletion.
      
      
      mysql-test/r/trigger.result:
        Added test for bug #5890 "Triggers fail for DELETE without WHERE".
      mysql-test/t/trigger.test:
        Added test for bug #5890 "Triggers fail for DELETE without WHERE".
      sql/sql_delete.cc:
        mysql_delete(): 
          We should not use optimized delete_all_rows() method for tables
          with DELETE triggers, because in this case we will lose side-effect
          of deletion.
      sql/sql_trigger.h:
        Added new Table_triggers_list::has_delete_triggers() method which
        allows to understand quickly if we have some DELETE triggers in
        our list.
      6827c26f
  28. 08 Oct, 2004 1 commit
    • unknown's avatar
      Fix for bug #5887 "Triggers with string literals cause errors" · a07de253
      unknown authored
      Fixed small error in new .FRM parser which caused it to handle 
      improperly escaped strings.
      
      
      mysql-test/r/trigger.result:
        Added test for bug #5887 "Triggers with string literals cause errors".
      mysql-test/t/trigger.test:
        Added test for bug #5887 "Triggers with string literals cause errors".
      sql/parse_file.cc:
        read_escaped_string(): We should not fail when we meet \' sequence 
        in escaped string.
      a07de253
  29. 09 Sep, 2004 1 commit
    • unknown's avatar
      After merge fixes for WL#1218 "Triggers" · c5357dd6
      unknown authored
      mysql-test/t/trigger.test:
        After merge fix, error codes corrected.
      sql/sp_head.cc:
        After mrege fix. Fixed typo.
      sql/sql_trigger.cc:
        After merge fix. wait_if_gloabl_read_lock has one more argument now.
      c5357dd6
  30. 08 Sep, 2004 1 commit
    • unknown's avatar
      WL#1218 "Triggers" · ccbcf94d
      unknown authored
      After review and after merge fixes.
      
      
      mysql-test/t/trigger.test:
        After merge fix. Updated error codes.
      sql/sp_head.cc:
        After merge fix.
        To give some chances for functions/triggers we have to close tables during sp_instr_* 
        execution only if we have opened them before.
      sql/sp_head.h:
        After merge fix. sp_instr constructor now takes one more argument.
      sql/sql_trigger.cc:
        After merge and review fixes.
        Some variable renaming and optimizations.
      sql/sql_yacc.yy:
        After merge fixes.
        sp_instr_* classes now require sp context as constructor parameter.
        Also we should be careful with adding table for which we are creating trigger to table 
        list. Some elements in trigger body can damage LEX::query_tables and so we should add this
        table to list only after parsing trigger body.
      ccbcf94d
  31. 07 Sep, 2004 1 commit
    • unknown's avatar
      WL#1218 "Triggers". Some very preliminary version of patch. · 960c429d
      unknown authored
      Mostly needed for Monty for him getting notion what needed for triggers 
      from new .FRM format. 
      
      Things to be done:
      - Right placement of trigger's invocations
      - Right handling of errors in triggers (including transaction rollback)
      - Support for priviliges
      - Right handling of DROP/RENAME table (hope that it will be handled automatically
        with merging of .TRG into .FRM file)
      - Saving/restoring some information critical for trigger creation and replication
        with their definitions (e.g. sql_mode, creator, ...)
      - Replication
      
      Already has some known bugs so probably not for general review.
      
      
      include/mysqld_error.h:
        Added trigger related error codes.
      sql/Makefile.am:
        Added sql_trigger.* files to list of sources from which mysqld is built.
      sql/item.cc:
        Added Item_trigger_field class representing field of new/old version of row which is 
        inserted/updated/deleted and for which trigger is invoked.
      sql/item.h:
        Added enums for describing trigger properties. (Here because of dependencies).
        Added Item_trigger_field class representing field of new/old version of row which is 
        inserted/updated/deleted and for which trigger is invoked.
      sql/item_func.cc:
        Added Item_func_set_user_var::print_as_stmt() for printing of assignment to ser variable
        from stored procedures.
        Added comment clarifying why we don't need set no_send_ok when calling stored functions.
      sql/item_func.h:
        Added Item_func_set_user_var::print_as_stmt() for printing of assignment to ser variable
        from stored procedures.
      sql/lex.h:
        Symbols used in statements defining triggers were added.
      sql/mysql_priv.h:
        Exported some functions needed for triggers implementation.
      sql/parse_file.cc:
        Cleaned up FILE_OPTIONS_STRLIST handling (needed for triggers).
      sql/parse_file.h:
        Cleaned up FILE_OPTIONS_STRLIST handling (needed for triggers).
      sql/share/czech/errmsg.txt:
        Added trigger related error messages.
      sql/share/danish/errmsg.txt:
        Added trigger related error messages.
      sql/share/dutch/errmsg.txt:
        Added trigger related error messages.
      sql/share/english/errmsg.txt:
        Added trigger related error messages.
      sql/share/estonian/errmsg.txt:
        Added trigger related error messages.
      sql/share/french/errmsg.txt:
        Added trigger related error messages.
      sql/share/german/errmsg.txt:
        Added trigger related error messages.
      sql/share/greek/errmsg.txt:
        Added trigger related error messages.
      sql/share/hungarian/errmsg.txt:
        Added trigger related error messages.
      sql/share/italian/errmsg.txt:
        Added trigger related error messages.
      sql/share/japanese/errmsg.txt:
        Added trigger related error messages.
      sql/share/korean/errmsg.txt:
        Added trigger related error messages.
      sql/share/norwegian-ny/errmsg.txt:
        Added trigger related error messages.
      sql/share/norwegian/errmsg.txt:
        Added trigger related error messages.
      sql/share/polish/errmsg.txt:
        Added trigger related error messages.
      sql/share/portuguese/errmsg.txt:
        Added trigger related error messages.
      sql/share/romanian/errmsg.txt:
        Added trigger related error messages.
      sql/share/russian/errmsg.txt:
        Added trigger related error messages.
      sql/share/serbian/errmsg.txt:
        Added trigger related error messages.
      sql/share/slovak/errmsg.txt:
        Added trigger related error messages.
      sql/share/spanish/errmsg.txt:
        Added trigger related error messages.
      sql/share/swedish/errmsg.txt:
        Added trigger related error messages.
      sql/share/ukrainian/errmsg.txt:
        Added trigger related error messages.
      sql/sp_head.cc:
        sp_head::init_strings(): added support for triggers 
          (we don't have most of strings for them)
        sp_head::execute_function(): triggers don't require RETURN
        sp_head::reset_lex(): added propagation of trigger properties to LEX used for 
         parsing of statements composing trigger body.
        Added two more SP instructions:
        - sp_instr_set_user_var for setting user variables in stored functions and triggers
          (we can't use sp_instr_stmt and "SET @A:=..." statement since it will close open 
          tables and thus break execution of calling statement.
        - sp_instr_set_trigger_field for assignment to fields of row being updated/inserted in
          triggers
      sql/sp_head.h:
        Added new type of sp_head object - TYPE_ENUM_TRIGGER
        Added two more SP instructions:
        - sp_instr_set_user_var for setting user variables in stored functions and triggers
          (we can't use sp_instr_stmt and "SET @A:=..." statement since it will close open 
          tables and thus break execution of calling statement.
        - sp_instr_set_trigger_field for assignment to fields of row being updated/inserted in
          triggers
      sql/sql_base.cc:
        Now freeing memory occupied by trigger related structures when closing tables.
        open_unireg_entry(): added loading of triggers for table.
        find_field_in_real_table() is now public since it required by Item_trigger_field in item.cc
      sql/sql_delete.cc:
        Added triggers invocation for DELETE (should be fixed for sure :))
      sql/sql_insert.cc:
        Added triggers invocation for INSERT (should be fixed for sure :))
      sql/sql_lex.cc:
        Added trg_new_row_fake_var variable pointer to which is used for distinguishing between
        assignment to NEW row field (when parsing trigger definition) and structured variable.
        Added initialization of LEX->trg_table to lex_start(). (When triggers are parsed during
        opening of table it points to table object.)
      sql/sql_lex.h:
        Added trigger related commands.
        Added st_trg_chistics structure describing properties of trigger being created
        (as struct and as LEX member).
        Added trg_new_row_fake_var variable pointer to which is used for
        distinguishing between assignment to NEW row field (when parsing trigger definition)
        and structured variable.
        Added LEX::trg_table which points to table being opened when we are parsing trigger
        definition while opening table.
      sql/sql_parse.cc:
        Added support for CREATE/DROP TRIGGER commands.
      sql/sql_table.cc:
        Cleanup. close_cached_table() always returns 0 and its result is not analyzed in most
        places so chenged its return type to void.
      sql/sql_update.cc:
        Added triggers invocation for UPDATE (should be fixed for sure :))
      sql/sql_yacc.yy:
        Added support for CREATE/DROP TRIGGER statements.
        Added support for OLD/NEW row identifiers in trigger.
        Made assignment to user variables not to break execution of stored function or trigger.
      sql/table.h:
        Added TABLE::triggers member representing triggers for this table.
      960c429d