1. 24 May, 2005 1 commit
    • unknown's avatar
      Fix for bugs: · 1fa7c69d
      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).
      1fa7c69d
  2. 12 May, 2005 5 commits
    • unknown's avatar
      Fixed bug 10465. · 4acfc0b6
      unknown authored
      4acfc0b6
    • unknown's avatar
      --default-extra-file handling code fix. · 7b36ac48
      unknown authored
      
      mysys/default.c:
        if we check for error, we should set it.
      7b36ac48
    • unknown's avatar
      fix (Bug #8295 and #8296: varchar and varbinary conversion) · 362a340d
      unknown authored
      select, gis & gis-tree tests fails at the moment, but
      I will push this CS because it was tested before and I'm absolutely
      sure it's right.
      
      
      mysql-test/r/strict.result:
        fix (Bugs #8295 and #8296: varchar and varbinary conversion)
      mysql-test/r/type_blob.result:
        fix (Bugs #8295 and #8296: varchar and varbinary conversion)
      mysql-test/t/strict.test:
        fix (Bugs #8295 and #8296: varchar and varbinary conversion)
      sql/sql_table.cc:
        fix (Bugs #8295 and #8296: varchar and varbinary conversion):
        1. fon't convert datatypes if it's strict mode;
        2. better warning.
      362a340d
    • unknown's avatar
      Merge bk-internal.mysql.com:/home/bk/mysql-5.0 · c572e469
      unknown authored
      into mysql.com:/media/sda1/mysql/mysql-5.0-9478
      
      
      sql/sql_prepare.cc:
        Auto merged
      sql/sql_select.cc:
        Auto merged
      c572e469
    • unknown's avatar
      A fix and test case for Bug#9478 "mysql_stmt_attr_set mysql_stmt_execute" · 2a8556f3
      unknown authored
      (crash on attempt to re-execute a statement with an open cursor) + 
      post-review fixes.
      
      
      include/errmsg.h:
        Add a special error message when we attempt to mysql_stmt_fetch
        from a statement which has no result set.
      libmysql/errmsg.c:
        Error message text for CR_NO_RESULT_SET
      libmysql/libmysql.c:
        Move the code which frees result sets on client and closes the cursor
        on server, resets long data state on client and server.
        This makes one function out of two (mysql_stmt_reset and
        mysql_stmt_free_result), thus aggregating all related reset work
        in one place.
      sql-common/client.c:
        Fix one place where we flushed the pending result set of a statement,
        but didn't set unbuffered_fetch_cancelled flag.
      sql/share/errmsg.txt:
        Fix format of ER_UNKNOWN_STMT_HANDLER error message (needs to
        be fixed separately in 4.1). Add two new error messages 
        for the case when we fetch from when there is no cursor
        and for the case when we attempt to execute a statement while there is
        a cursor.
      sql/sql_prepare.cc:
        Return error when we fetch while there is no open cursor and
        when we call execute while there is a pending cursor.
        Fix mysql_stmt_reset to close the open cursor if there is any.
      sql/sql_select.cc:
        free_items and free_root moved to Cursor::close().
      sql/sql_select.h:
        A comment added.
      tests/mysql_client_test.c:
        A test case for Bug#9478, test the case of mysql_stmt_reset
        called for client-side cached result set and for the case with open cursor.
        All strcpy replaced with strmov (review request).
      2a8556f3
  3. 10 May, 2005 14 commits
    • unknown's avatar
      Manual merge · 62344496
      unknown authored
      
      sql/sql_base.cc:
        Auto merged
      sql/sql_insert.cc:
        Auto merged
      sql/sql_parse.cc:
        Auto merged
      sql/sql_prepare.cc:
        Auto merged
      sql/sql_select.cc:
        Auto merged
      sql/sql_view.cc:
        Auto merged
      sql/table.cc:
        Auto merged
      sql/table.h:
        Auto merged
      62344496
    • unknown's avatar
      Many files: · e02416c5
      unknown authored
        Fixed bug #8528.
        Representation for single-table views was made similar to
        representation for multi-table views.
      view.test:
        Added test case for bug #8528.
      view.result:
        Added test case for bug #8528. Fixed other test cases.
      
      
      mysql-test/r/view.result:
        Added test case for bug #8528. Fixed other test cases.
      mysql-test/t/view.test:
        Added test case for bug #8528.
      sql/sql_base.cc:
        Fixed bug #8528.
        Representation for single-table views was made similar to
        representation for multi-table views.
      sql/sql_delete.cc:
        Fixed bug #8528.
        Representation for single-table views was made similar to
        representation for multi-table views.
      sql/sql_insert.cc:
        Fixed bug #8528.
        Representation for single-table views was made similar to
        representation for multi-table views.
      sql/sql_parse.cc:
        Fixed bug #8528.
        Representation for single-table views was made similar to
        representation for multi-table views.
      sql/sql_prepare.cc:
        Fixed bug #8528.
        Representation for single-table views was made similar to
        representation for multi-table views.
      sql/sql_select.cc:
        Fixed bug #8528.
        Representation for single-table views was made similar to
        representation for multi-table views.
      sql/sql_update.cc:
        Fixed bug #8528.
        Representation for single-table views was made similar to
        representation for multi-table views.
      sql/sql_view.cc:
        Fixed bug #8528.
        Representation for single-table views was made similar to
        representation for multi-table views.
      sql/table.cc:
        Fixed bug #8528.
        Representation for single-table views was made similar to
        representation for multi-table views.
      sql/table.h:
        Fixed bug #8528.
        Representation for single-table views was made similar to
        representation for multi-table views.
      e02416c5
    • unknown's avatar
      Merge gbichot@bk-internal.mysql.com:/home/bk/mysql-5.0 · edcdc57b
      unknown authored
      into quadita2.mysql.com:/nfstmp1/guilhem/mysql-5.0-4ita
      
      
      edcdc57b
    • unknown's avatar
      Merge sgluhov@bk-internal.mysql.com:/home/bk/mysql-5.0 · 525f5847
      unknown authored
      into mysql.com:/home/gluh/MySQL/Devel/mysql-5.0
      
      
      sql/sql_show.cc:
        Auto merged
      525f5847
    • unknown's avatar
      Bug#10018: use INFORMATION_SCHEMA works, but show tables in it returns error · 4653d7e1
      unknown authored
        additional fix after review
      
      
      4653d7e1
    • unknown's avatar
      comment change (post-review of "replication of triggers"). Btw date_formats... · ba7cf8ca
      unknown authored
      comment change (post-review of "replication of triggers"). Btw date_formats segfaults with --ps-protocol - not caused by my changes though; I'll file a bug report.
      
      
      sql/sql_trigger.h:
        changing comment
      ba7cf8ca
    • unknown's avatar
      Merge gbichot@bk-internal.mysql.com:/home/bk/mysql-5.0 · d3697c75
      unknown authored
      into quadita2.mysql.com:/nfstmp1/guilhem/mysql-5.0-4ita
      
      
      d3697c75
    • unknown's avatar
      Merge jamppa@bk-internal.mysql.com:/home/bk/mysql-5.0 · 68768185
      unknown authored
      into ibmlab.site:/home/my/bk/mysql-5.0
      
      
      68768185
    • unknown's avatar
      Merge · a3f07269
      unknown authored
      
      BitKeeper/etc/logging_ok:
        auto-union
      include/my_global.h:
        Auto merged
      ndb/src/kernel/blocks/dbtc/Dbtc.hpp:
        Auto merged
      ndb/src/kernel/blocks/dbtc/DbtcMain.cpp:
        Auto merged
      ndb/src/mgmapi/mgmapi.cpp:
        Auto merged
      ndb/src/ndbapi/NdbIndexOperation.cpp:
        Auto merged
      ndb/src/ndbapi/ndberror.c:
        Auto merged
      ndb/test/ndbapi/testNodeRestart.cpp:
        Auto merged
      ndb/test/run-test/Makefile.am:
        Auto merged
      sql/item.h:
        Auto merged
      sql/item_func.h:
        Auto merged
      sql/item_sum.h:
        Auto merged
      sql/sql_udf.h:
        Auto merged
      ndb/src/ndbapi/ClusterMgr.cpp:
        SCCS merged
      a3f07269
    • unknown's avatar
      Merge gbichot@bk-internal.mysql.com:/home/bk/mysql-5.0 · 387bc8b5
      unknown authored
      into quadita2.mysql.com:/nfstmp1/guilhem/mysql-5.0-4ita
      
      
      387bc8b5
    • unknown's avatar
      Merge neptunus.(none):/home/msvensson/mysql/mysql-4.1 · b69cd35a
      unknown authored
      into neptunus.(none):/home/msvensson/mysql/mysql-5.0
      
      
      mysql-test/t/range.test:
        Auto merged
      sql/item_strfunc.h:
        Auto merged
      b69cd35a
    • unknown's avatar
      Merge bk-internal.mysql.com:/home/bk/mysql-4.1 · d7e49743
      unknown authored
      into neptunus.(none):/home/msvensson/mysql/mysql-4.1
      
      
      d7e49743
    • unknown's avatar
      Remove testcode · 31d79228
      unknown authored
      
      sql/item_strfunc.h:
        Remove the testcode
      31d79228
    • unknown's avatar
      Fixed Bug#10232: update with subquery, precision math, · 6037cd17
      unknown authored
      another column gets rotten value.
      
      
      mysql-test/r/type_newdecimal.result:
        Added a test case for Bug#10232: update with subquery, precision math,
        another column gets rotten value.
      mysql-test/t/type_newdecimal.test:
        Added a test case for Bug#10232: update with subquery, precision math,
        another column gets rotten value.
      6037cd17
  4. 09 May, 2005 20 commits