sql/item.cc:
Auto merged
sql/item.h:
Auto merged
sql/mysql_priv.h:
Auto merged
sql/sql_base.cc:
Auto merged
sql/sql_delete.cc:
Auto merged
sql/sql_insert.cc:
Manual merge
sql/sql_update.cc:
Manual merge
#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).
Use local seach path for "mysql_priv.h"
mysqld.dsp:
Added the ARCHIVE storage engine to max
ha_archive.h:
VC6, but not VC7, needs a cast of byte[] to char* to make
the compile select the right conversion function in String
sql/examples/ha_archive.h:
VC6, but not VC7, needs a cast of byte[] to char* to make
the compile select the right conversion function in String
VC++Files/sql/mysqld.dsp:
Added the ARCHIVE storage engine to max
sql/examples/ha_archive.cc:
Use local seach path for "mysql_priv.h"
Only acquire necessary write lock for multi-delete
mysql-test/r/lock.result:
Test for Bug#7241
mysql-test/t/lock.test:
Test for Bug#7241
sql/sql_parse.cc:
Bug#7241
Don't acquire write lock on all tables.
Make sure to set lock_type on real table_list
into bk-internal.mysql.com:/data0/bk/mysql-5.0
BitKeeper/etc/gone:
auto-union
BitKeeper/etc/logging_ok:
auto-union
mysql-test/r/lowercase_table.result:
Auto merged
mysql-test/t/lowercase_table.test:
Auto merged
mysys/my_open.c:
Auto merged
Memory leak in locally evalutated expressions during SP execution fixed by
reusing allocated item slots when possible.
Note: No test case added, since the test is a stress test that tries to make
the machine to run out of memory.
Second attempt, now tested with debug build, valgrind build, max (optimized)
build, with and without --debug, --vagrind and --ps-protocol.
Errors in trigger and view test with --debug in debug build where present
before this patch, and likewise for valgrind warnings for view test in
valgrind build with --ps-protocol.
sql/item.cc:
Init rsize in Item (for SP item reusal).
sql/item.h:
Addes special new operator for reuse of Items, for SP internal use only.
sql/sp_head.cc:
Reuse items assigned internally in SPs when possible.
sql/sp_rcontext.cc:
Reuse items assigned internally in SPs when possible.
Moved the local variable assignment here (from sp_head) to avoid
duplicated code.
sql/sp_rcontext.h:
New arg to sp_rcontext::set_item_eval() (and some coding style).
sql/sql_class.cc:
Adjusted call to new set_item_eval().
fixups of test case and comment formatting
BitKeeper/deleted/.del-reserved_win_names-master.opt~e56da049a7ce9a5b:
***MISSING TEXT***
mysql-test/r/lowercase_table.result:
added my test for bug #9148 to this test case
mysql-test/t/lowercase_table.test:
added my test for bug #9148 to this test case
mysys/my_fopen.c:
reformatted comments
mysys/my_open.c:
reformatted comments
Added BLACKHOLE and FEDERATED storage engines for max builds
Some preparations for including yaSSL
ha_federated.cc:
Use local seach path for "mysql_priv.h"
sql/ha_federated.cc:
Use local seach path for "mysql_priv.h"
VC++Files/sql/mysqld.dsp:
Added BLACKHOLE and FEDERATED storage engines for max builds
Some preparations for including yaSSL
into neptunus.(none):/home/msvensson/mysql/mysql-5.0-tmp
include/my_global.h:
Auto merged
ndb/src/cw/cpcd/Process.cpp:
Auto merged
strings/my_vsnprintf.c:
Auto merged
include/my_global.h:
Auto merged
ndb/src/cw/cpcd/Process.cpp:
Auto merged
ndb/src/kernel/blocks/ndbfs/AsyncFile.cpp:
Auto merged
strings/my_vsnprintf.c:
Auto merged
This final cset is to fix a syntax problem in ha_myisammrg.cc where a / was left out of a format string.
It also adds a check in has_path to avoid a possible redundant comparison.
ha_myisammrg.cc:
Replaced missing / in format string
my_getwd.c:
Added test to see if FN_LIBCHAR != '/' before doing comparison to avoid redundant comparison
mysys/my_getwd.c:
Added test to see if FN_LIBCHAR != '/' before doing comparison to avoid redundant comparison
sql/ha_myisammrg.cc:
Replaced missing / in format string
This cset is to roll out the cset applied earlier from Ingo.
This bug has been fixed with a different cset.
sql/ha_myisammrg.cc:
removed the patch applied earlier
strings/my_vsnprintf.c:
removed the patch applied earlier. The patch was to add %c ability.
Monty has already done this.
into neptunus.(none):/home/msvensson/mysql/mysql-5.0-tmp
VC++Files/mysys/mysys.dsp:
Auto merged
include/my_global.h:
Auto merged
myisam/rt_split.c:
Auto merged
sql/field_conv.cc:
Auto merged
sql/sql_delete.cc:
Auto merged
sql/sql_select.cc:
Auto merged
strings/my_vsnprintf.c:
Auto merged
include/my_global.h:
icc does not define __ICC when emulating gcc. Use __INTEL_COMPILER to check for icc.
ndb/src/cw/cpcd/Process.cpp:
Remove rlimit64
ndb/src/kernel/blocks/ndbfs/AsyncFile.cpp:
Remove dirent64
This is a replacement for the original patch given by Ingo. This one comes
from Monty.
The problem is that merge files now use unix style pathnames on all
platforms. The merge file open code was not properly converting those
pathnames back to non-unix when necessary.
myisammrg/myrg_open.c:
use fn_format to convert pathnames if the files in the merge file have a pathname
mysys/my_getwd.c:
add a test for '/' in the code that determines if a string inlucdes a pathname
Check _LONGLONG_TYPE as well, to define 'word64', to make it
work on Solaris 10 x86_64.
Can't assume all x86_64 share the same assembler syntax.
For now disabled assembler for x86_64 and Solaris.
extra/yassl/taocrypt/include/misc.hpp:
Check _LONGLONG_TYPE as well, to define 'word64', to make it
work on Solaris 10 x86_64.
Can't assume all x86_64 share the same assembler syntax.
For now disabled assembler for x86_64 and Solaris.
Use MY_STAT to declare argument to my_fstat()
des_key_file.cc:
Use local seach path for "mysql_priv.h"
mysys.dsp, libmysqld.dsp, libmysql.dsp:
New file needed, "../mysys/default_modify.c"
VC++Files/libmysql/libmysql.dsp:
New file needed, "../mysys/default_modify.c"
VC++Files/libmysqld/libmysqld.dsp:
New file needed, "../mysys/default_modify.c"
VC++Files/mysys/mysys.dsp:
New file needed, "../mysys/default_modify.c"
sql/des_key_file.cc:
Use local seach path for "mysql_priv.h"
mysys/default_modify.c:
Use MY_STAT to declare argument to my_fstat()
This is a second patch needing another review. The first patch didn't solve
the entire problem. open and fopen on Windows will still open
files like "com1.sym" when they shouldn't. This patch
checks that the file exists before trying to open it.
mysys/my_fopen.c:
on Windows, if we are not creating a file the we call my_access to make sure the
file exists before trying to open it.
mysys/my_open.c:
on Windows, if we are not creating a file the we call my_access to make sure the
file exists before trying to open it.
The natural InnoDB type for NEWDECIMAL is FIXBINARY, not BINARY, since there probably is no benefit from stripping trailing bytes 0x20; note that tables created with 5.0.6 and containing DECIMAL do not need to be rebuilt, as BINARY works as well; note that because of Jani's fix to bug 10465, tables created with 5.0.? - 5.0.5 DO NEED TO BE REBUILT if they contain DECIMAL
sql/ha_innodb.cc:
The natural InnoDB type for NEWDECIMAL is FIXBINARY, not BINARY, since there probably is no benefit from stripping trailing bytes 0x20; note that tables created with 5.0.6 and containing DECIMAL do not need to be rebuilt, as BINARY works as well; note that because of Jani's fix to bug 10465, tables created with 5.0.? - 5.0.5 DO NEED TO BE REBUILT if they contain DECIMAL
Added test cases for optimization request #10561.
opt_range.cc, sql_select.cc:
Fixed bug #10561: an optimization request to allow
range analysis for NOT IN and NOT BETWEEN.
sql/sql_select.cc:
Fixed bug #10561: an optimization request to allow
range analysis for NOT IN and NOT BETWEEN.
sql/opt_range.cc:
Fixed bug #10561: an optimization request to allow
range analysis for NOT IN and NOT BETWEEN.
mysql-test/t/range.test:
Added test cases for optimization request #10561.
mysql-test/r/range.result:
Added test cases for optimization request #10561.