In certain cases AFTER UPDATE/DELETE triggers on NDB tables that referenced
subject table didn't see the results of operation which caused invocation
of those triggers. In other words AFTER trigger invoked as result of update
(or deletion) of particular row saw version of this row before update (or
deletion).
The problem occured because NDB handler in those cases postponed actual
update/delete operations to be able to perform them later as one batch.
This fix solves the problem by disabling this optimization for particular
operation if subject table has AFTER trigger for this operation defined.
To achieve this we introduce two new flags for handler::extra() method:
HA_EXTRA_DELETE_CANNOT_BATCH and HA_EXTRA_UPDATE_CANNOT_BATCH.
These are called if there exists AFTER DELETE/UPDATE triggers during a
statement that potentially can generate calls to delete_row()/update_row().
This includes multi_delete/multi_update statements as well as insert statements
that do delete/update as part of an ON DUPLICATE statement.
include/my_base.h:
Added HA_EXTRA_DELETE_CANNOT_BATCH and HA_EXTRA_UPDATE_CANNOT_BATCH to inform handler when batching of delete/update is not possible.
mysql-test/r/ndb_trigger.result:
Bug #26242 UPDATE with subquery and triggers failing with cluster tables
---
Added new test cases
mysql-test/t/ndb_trigger.test:
Bug #26242 UPDATE with subquery and triggers failing with cluster tables
---
Added new test cases
sql/ha_ndbcluster.cc:
Bug #26242 UPDATE with subquery and triggers failing with cluster tables: Use HA_EXTRA_DELETE_CANNOT_BATCH and HA_EXTRA_UPDATE_CANNOT_BATCH to inform handler when batching of delete/update is not possible
sql/ha_ndbcluster.h:
Bug #26242 UPDATE with subquery and triggers failing with cluster tables: Added member variables for handling of HA_EXTRA_DELETE_CANNOT_BATCH and HA_EXTRA_UPDATE_CANNOT_BATCH to inform handler when batching of delete/update is not possible
sql/mysql_priv.h:
Added new method prepare_triggers_for_insert_stmt to check if batching of delete/update must be disallowed.
sql/sql_delete.cc:
Use HA_EXTRA_DELETE_CANNOT_BATCH to inform handler when batching of delete is not possible
sql/sql_insert.cc:
Added method prepare_triggers_for_insert_stmt to check if batching of delete/update must be dissallowed.
Use HA_EXTRA_DELETE_CANNOT_BATCH and HA_EXTRA_UPDATE_CANNOT_BATCH to inform handler
when batching of delete/update is not possible
sql/sql_load.cc:
Call prepare_triggers_for_insert_stmt to check if batching of delete/update must be dissallowed and
mark fields used by triggers for the insert statement.
sql/sql_trigger.h:
Added has_triggers to support what particular triggers exist on a table.
sql/sql_update.cc:
Use HA_EXTRA_UPDATE_CANNOT_BATCH to inform handler when batching of update is not possible
util thread wasn't behaving correctly after 241 error due to get_table_statistics
not properly returning an error code
sql/ha_ndbcluster.cc:
correctly call ndb_get_table_statistics in get_commitcount (don't report error)
but also return an error code from get_table_statistics so that util thread
gets error code
fixes for ndb_* tests broken by previous fix
be more careful in ndb about setting errors on failure of info call (especially
in open)
sql/ha_ndbcluster.cc:
fix some ndb* tests failing due to fix for 19914
be more careful about setting errors on failure of info call
sql/ha_ndbcluster.h:
fix some ndb* tests failing due to fix for 19914
be more careful about setting errors on failure of info call
this changes lock taken during peek, to decrease likelyhood of transaction abort
sql/ha_ndbcluster.cc:
use exclusive lock in peek, as peek is used just before insert/update
into mysql.com:/windows/Linux_space/MySQL/mysql-5.0
mysql-test/r/ndb_charset.result:
Auto merged
mysql-test/r/ndb_index_unique.result:
Auto merged
mysql-test/r/ndb_update.result:
Auto merged
sql/ha_ndbcluster.cc:
Merg
sql/handler.cc:
Merge
into willster.(none):/home/stewart/Documents/MySQL/5.0/bug19914-mk2-merge
sql/ha_berkeley.cc:
Auto merged
sql/ha_berkeley.h:
Auto merged
BitKeeper/deleted/.del-ha_isam.cc~4dce65904db2675e:
Auto merged
BitKeeper/deleted/.del-ha_isam.h~bf53d533be3d3927:
Auto merged
BitKeeper/deleted/.del-ha_isammrg.cc~dc682e4755d77a2e:
Auto merged
BitKeeper/deleted/.del-ha_isammrg.h~66fd2e5bfe7207dc:
Auto merged
sql/ha_archive.cc:
Auto merged
sql/ha_archive.h:
Auto merged
sql/ha_blackhole.cc:
Auto merged
sql/ha_blackhole.h:
Auto merged
sql/ha_heap.cc:
Auto merged
sql/ha_heap.h:
Auto merged
sql/ha_innodb.cc:
Auto merged
sql/ha_innodb.h:
Auto merged
sql/ha_myisam.cc:
Auto merged
sql/ha_myisam.h:
Auto merged
sql/ha_myisammrg.cc:
Auto merged
sql/ha_myisammrg.h:
Auto merged
sql/item_sum.cc:
Auto merged
sql/opt_sum.cc:
Auto merged
sql/sql_delete.cc:
Auto merged
sql/examples/ha_example.cc:
Auto merged
sql/examples/ha_example.h:
Auto merged
sql/examples/ha_tina.cc:
Auto merged
sql/examples/ha_tina.h:
Auto merged
sql/sql_union.cc:
Auto merged
sql/ha_ndbcluster.cc:
merge
sql/ha_ndbcluster.h:
merge
sql/handler.h:
merge
sql/sql_select.cc:
merge
into perch.ndb.mysql.com:/home/jonas/src/mysql-5.0-ndb
mysql-test/r/ctype_utf8.result:
Auto merged
mysql-test/t/ctype_utf8.test:
Auto merged
ndb/src/kernel/blocks/dbdih/DbdihMain.cpp:
Auto merged
sql/ha_ndbcluster.cc:
Auto merged
sql/sql_base.cc:
Auto merged
sql/sql_lex.h:
Auto merged
sql/sql_view.cc:
Auto merged
sql/table.cc:
Auto merged
into willster.(none):/home/stewart/Documents/MySQL/4.1/bug19914-mk2
sql/ha_ndbcluster.cc:
Auto merged
sql/ha_ndbcluster.h:
Auto merged
sql/sql_select.cc:
Auto merged
into april.(none):/home/svoj/devel/mysql/merge/mysql-5.0-engines
mysql-test/r/myisam.result:
Auto merged
mysql-test/t/myisam.test:
Auto merged
sql/ha_ndbcluster.cc:
Auto merged
sql/opt_range.cc:
Auto merged
sql/share/errmsg.txt:
SCCS merged
into mysql.com:/windows/Linux_space/MySQL/mysql-5.0
mysql-test/r/ndb_multi.result:
Auto merged
mysql-test/t/ndb_multi.test:
Auto merged
sql/ha_ndbcluster.cc:
Auto merged
In 5.0 we made LOAD DATA INFILE autocommit in all engines, while
only NDB wanted that. Users and trainers complained that it affected
InnoDB and was a change compared to 4.1 where only NDB autocommitted.
To revert to the behaviour of 4.1, we move the autocommit logic out of mysql_load() into
ha_ndbcluster::external_lock().
The result is that LOAD DATA INFILE commits all uncommitted changes
of NDB if this is an NDB table, its own changes if this is an NDB
table, but does not affect other engines.
Note: even though there is no "commit the full transaction at end"
anymore, LOAD DATA INFILE stays disabled in routines (re-entrency
problems per a comment of Pem).
Note: ha_ndbcluster::has_transactions() does not give reliable results
because it says "yes" even if transactions are disabled in this engine...
sql/ha_ndbcluster.cc:
NDB wants to do autocommit if this is LOAD DATA INFILE.
For this to not affect all other engines, we move the logic
inside ha_ndbcluster.
sql/sql_load.cc:
This ha_enable_transaction() in mysql_load() forced an autocommit
in all engines, while only NDB wants to do that.
So we move the logic inside ha_ndbcluster.cc.
mysql-test/include/loaddata_autocom.inc:
test for engines to see if they autocommit or not in LOAD DATA INFILE
mysql-test/r/loaddata_autocom_innodb.result:
result for InnoDB (no autocommit)
mysql-test/r/loaddata_autocom_ndb.result:
result for NDB (autocommit)
mysql-test/r/rpl_ndb_innodb_trans.result:
result for InnoDB+NDB transactions. Observe that when ROLLBACK
cannot rollback the LOAD DATA INFILE in NDB it issues warning 1196
as appropriate.
mysql-test/t/loaddata_autocom_innodb.test:
test that InnoDB does not autocommit in LOAD DATA INFILE.
mysql-test/t/loaddata_autocom_ndb.test:
test that NDB does autocommit in LOAD DATA INFIL
mysql-test/t/rpl_ndb_innodb_trans-slave.opt:
need to tell the slave to use innodb
mysql-test/t/rpl_ndb_innodb_trans.test:
test of transactions mixing NDB and InnoDB. To see if ROLLBACK
rolls back in both engines, with the exception of LOAD DATA INFILE
which does not roll back NDB: we see that a LOAD DATA INFILE in NDB
commits all what has been done in NDB so far, commits its changes,
but does not commit in other engines.
"strict mode: inserts autogenerated auto_increment value bigger than max"
Strict mode should fail if autoincrement value is out of range
include/my_base.h:
Add new handler error codes
sql/ha_berkeley.cc:
handle error in update_auto_increment()
sql/ha_heap.cc:
handle error in update_auto_increment()
sql/ha_innodb.cc:
handle error in update_auto_increment()
sql/ha_myisam.cc:
handle error in update_auto_increment()
sql/ha_myisammrg.cc:
handle error in update_auto_increment()
sql/ha_ndbcluster.cc:
handle error in update_auto_increment()
sql/handler.cc:
return error from handler::update_auto_increment()
sql/handler.h:
change return type of handler::update_auto_increment() to int
sql/share/errmsg.txt:
new error message for auto-increment
mysql-test/include/strict_autoinc.inc:
New BitKeeper file ``mysql-test/include/strict_autoinc.inc''
mysql-test/r/strict_autoinc_1myisam.result:
New BitKeeper file ``mysql-test/r/strict_autoinc_1myisam.result''
mysql-test/r/strict_autoinc_2innodb.result:
New BitKeeper file ``mysql-test/r/strict_autoinc_2innodb.result''
mysql-test/r/strict_autoinc_3heap.result:
New BitKeeper file ``mysql-test/r/strict_autoinc_3heap.result''
mysql-test/r/strict_autoinc_4bdb.result:
New BitKeeper file ``mysql-test/r/strict_autoinc_4bdb.result''
mysql-test/r/strict_autoinc_5ndb.result:
New BitKeeper file ``mysql-test/r/strict_autoinc_5ndb.result''
mysql-test/t/strict_autoinc_1myisam.test:
New BitKeeper file ``mysql-test/t/strict_autoinc_1myisam.test''
mysql-test/t/strict_autoinc_2innodb.test:
New BitKeeper file ``mysql-test/t/strict_autoinc_2innodb.test''
mysql-test/t/strict_autoinc_3heap.test:
New BitKeeper file ``mysql-test/t/strict_autoinc_3heap.test''
mysql-test/t/strict_autoinc_4bdb.test:
New BitKeeper file ``mysql-test/t/strict_autoinc_4bdb.test''
mysql-test/t/strict_autoinc_5ndb.test:
New BitKeeper file ``mysql-test/t/strict_autoinc_5ndb.test''
into dev3-138.dev.cn.tlan:/home/zhl/mysql/mysql-5.0/mysql-5.0-ndb-bj
ndb/src/mgmclient/CommandInterpreter.cpp:
Auto merged
ndb/src/ndbapi/ndberror.c:
Auto merged
sql/ha_ndbcluster.cc:
Auto merged
sql/sql_base.cc:
Auto merged
sql/sql_view.cc:
Auto merged
into mysql.com:/windows/Linux_space/MySQL/mysql-5.0
mysql-test/r/ndb_lock.result:
Auto merged
mysql-test/t/ndb_lock.test:
Auto merged
ndb/include/ndbapi/NdbTransaction.hpp:
Merge
sql/ha_ndbcluster.cc:
Merge
sql/ha_ndbcluster.h:
Merge
bug #18184 SELECT ... FOR UPDATE does not work..: New test case
ha_ndbcluster.h, ha_ndbcluster.cc, NdbConnection.hpp:
Fix for bug #21059 Server crashes on join query with large dataset with NDB tables: Releasing operation for each intermediate batch, before next call to trans->execute(NoCommit);
mysql-test/r/ndb_lock.result:
bug #18184 SELECT ... FOR UPDATE does not work..: New test case
mysql-test/t/ndb_lock.test:
bug #18184 SELECT ... FOR UPDATE does not work..: New test case
ndb/include/ndbapi/NdbConnection.hpp:
Fix for bug #21059 Server crashes on join query with large dataset with NDB tables: Releasing operation for each intermediate batch, before next call to trans->execute(NoCommit);
sql/ha_ndbcluster.cc:
Fix for bug #21059 Server crashes on join query with large dataset with NDB tables: Releasing operation for each intermediate batch, before next call to trans->execute(NoCommit);
sql/ha_ndbcluster.h:
Fix for bug #21059 Server crashes on join query with large dataset with NDB tables: Releasing operation for each intermediate batch, before next call to trans->execute(NoCommit);
allow handler::info to return an error code (that will be returned to the user)
sql/ha_berkeley.cc:
update handler::info interface to return int
sql/ha_berkeley.h:
update handler::info interface to return int
sql/ha_heap.cc:
update handler::info interface to return int
sql/ha_heap.h:
update handler::info interface to return int
sql/ha_innodb.cc:
update handler::info interface to return int
sql/ha_innodb.h:
update handler::info interface to return int
sql/ha_myisam.cc:
update handler::info interface to return int
sql/examples/ha_archive.cc:
update handler::info interface to return int
sql/examples/ha_archive.h:
update handler::info interface to return int
sql/examples/ha_example.cc:
update handler::info interface to return int
sql/examples/ha_example.h:
update handler::info interface to return int
sql/examples/ha_tina.cc:
update handler::info interface to return int
sql/examples/ha_tina.h:
update handler::info interface to return int
sql/ha_myisam.h:
update handler::info interface to return int
sql/ha_myisammrg.cc:
update handler::info interface to return int
sql/ha_myisammrg.h:
update handler::info interface to return int
sql/ha_ndbcluster.cc:
update handler::info interface to return int
sql/ha_ndbcluster.h:
update handler::info interface to return int
sql/handler.h:
update handler::info interface to return int
sql/opt_sum.cc:
If we get an error when using handler::info to get count(*),
print and return the error.
sql/sql_select.cc:
if error, set fatal error.
into bodhi.local:/opt/local/work/mysql-5.0-runtime
sql/ha_ndbcluster.cc:
Auto merged
sql/item.cc:
Auto merged
sql/mysql_priv.h:
Auto merged
sql/sql_parse.cc:
Auto merged
sql/sql_table.cc:
Auto merged
sql/sql_yacc.yy:
Auto merged
sql/sql_update.cc:
Manual merge.
into mysql.com:/home/dlenev/mysql-5.0-bg18437-3
mysql-test/t/federated.test:
Auto merged
sql/ha_ndbcluster.cc:
Auto merged
sql/item.cc:
Auto merged
sql/mysql_priv.h:
Auto merged
sql/sql_delete.cc:
Auto merged
sql/sql_insert.cc:
Auto merged
sql/sql_parse.cc:
Auto merged
sql/sql_table.cc:
Auto merged
sql/sql_trigger.cc:
Auto merged
sql/sql_update.cc:
Auto merged
mysql-test/r/federated.result:
Manual merge.