Commit 6ac40453 authored by unknown's avatar unknown

Merge mysql.com:/home/kent/bk/mysql-5.1-release

into  mysql.com:/home/kent/bk/build/mysql-5.1-build

parents bfdff281 24d9bbad
...@@ -19,11 +19,24 @@ EXTRA_DIST = mysql.info INSTALL-BINARY @extra_docs@ ...@@ -19,11 +19,24 @@ EXTRA_DIST = mysql.info INSTALL-BINARY @extra_docs@
# automake only seems to take care of this automatically, # automake only seems to take care of this automatically,
# if we're building the info page from texi directly. # if we're building the info page from texi directly.
install-data-hook: $(srcdir)/mysql.info install-data-hook: $(srcdir)/mysql.info
$(mkinstalldirs) $(DESTDIR)$(infodir) if test `basename $(prefix)` = "mysql" ; then \
$(INSTALL_DATA) $(srcdir)/mysql.info $(DESTDIR)$(infodir) $(mkinstalldirs) $(DESTDIR)$(prefix)/docs ; \
$(INSTALL_DATA) $(srcdir)/mysql.info $(DESTDIR)$(prefix)/docs ; \
test ! -f $(top_srcdir)/ChangeLog || $(INSTALL_DATA) $(top_srcdir)/ChangeLog $(DESTDIR)$(prefix)/docs ; \
else \
$(mkinstalldirs) $(DESTDIR)$(infodir) $(DESTDIR)$(pkgdatadir) ; \
$(INSTALL_DATA) $(srcdir)/mysql.info $(DESTDIR)$(infodir) ; \
test ! -f $(top_srcdir)/ChangeLog || $(INSTALL_DATA) $(top_srcdir)/ChangeLog $(DESTDIR)$(pkgdatadir) ; \
fi
uninstall-local: uninstall-local:
@RM@ -f $(DESTDIR)$(infodir)/mysql.info if test `basename $(prefix)` = "mysql" ; then \
@RM@ -f $(DESTDIR)$(prefix)/docs/mysql.info ; \
@RM@ -f $(DESTDIR)$(prefix)/docs/ChangeLog ; \
else \
@RM@ -f $(DESTDIR)$(infodir)/mysql.info ; \
@RM@ -f $(DESTDIR)$(pkgdatadir)/ChangeLog ; \
fi
# Don't update the files from bitkeeper # Don't update the files from bitkeeper
%::SCCS/s.% %::SCCS/s.%
...@@ -132,45 +132,40 @@ test-bt: ...@@ -132,45 +132,40 @@ test-bt:
-cd mysql-test ; MTR_BUILD_THREAD=auto \ -cd mysql-test ; MTR_BUILD_THREAD=auto \
@PERL@ ./mysql-test-run.pl --comment=ps --force --timer \ @PERL@ ./mysql-test-run.pl --comment=ps --force --timer \
--skip-ndbcluster --ps-protocol --skip-ndbcluster --ps-protocol
-cd mysql-test ; MTR_BUILD_THREAD=auto \
@PERL@ ./mysql-test-run.pl --comment=normal+rowrepl --force --timer \
--skip-ndbcluster --mysqld=--binlog-format=row
-if [ -e bin/ndbd -o -e storage/ndb/src/kernel/ndbd ] ; then \ -if [ -e bin/ndbd -o -e storage/ndb/src/kernel/ndbd ] ; then \
cd mysql-test ; \ cd mysql-test ; \
MTR_BUILD_THREAD=auto \ MTR_BUILD_THREAD=auto \
@PERL@ ./mysql-test-run.pl --comment=ps+rowrepl+NDB --force --timer \ @PERL@ ./mysql-test-run.pl --comment=ndb+rpl_ndb+ps --force --timer \
--ps-protocol --mysqld=--binlog-format=row ; \ --ps-protocol --mysqld=--binlog-format=row --suite=ndb,rpl_ndb ; \
MTR_BUILD_THREAD=auto \ MTR_BUILD_THREAD=auto \
@PERL@ ./mysql-test-run.pl --comment=NDB --force --timer \ @PERL@ ./mysql-test-run.pl --comment=ndb --force --timer \
--with-ndbcluster-only ; \ --with-ndbcluster-only ; \
else \ else \
echo "no program found for 'ndbcluster' tests - skipped testing" ; \ echo "no program found for 'ndbcluster' tests - skipped testing" ; \
fi fi
-if [ -e bin/mysqltest_embedded -o -e libmysqld/examples/mysqltest_embedded ] ; then \
cd mysql-test ; MTR_BUILD_THREAD=auto \
@PERL@ ./mysql-test-run.pl --comment=embedded --force --timer \
--embedded-server --skip-rpl --skip-ndbcluster ; \
else \
echo "no program found for 'embedded' tests - skipped testing" ; \
fi
-cd mysql-test ; MTR_BUILD_THREAD=auto \ -cd mysql-test ; MTR_BUILD_THREAD=auto \
@PERL@ ./mysql-test-run.pl --force --comment=funcs1_ps --ps-protocol --suite=funcs_1 @PERL@ ./mysql-test-run.pl --force --comment=funcs1+ps --ps-protocol --suite=funcs_1
-cd mysql-test ; MTR_BUILD_THREAD=auto \ -cd mysql-test ; MTR_BUILD_THREAD=auto \
@PERL@ ./mysql-test-run.pl --force --comment=funcs2 --suite=funcs_2 @PERL@ ./mysql-test-run.pl --force --comment=funcs2 --suite=funcs_2
-cd mysql-test ; MTR_BUILD_THREAD=auto \
@PERL@ ./mysql-test-run.pl --force --comment=rpl --suite=rpl
-cd mysql-test ; MTR_BUILD_THREAD=auto \ -cd mysql-test ; MTR_BUILD_THREAD=auto \
@PERL@ ./mysql-test-run.pl --force --comment=partitions --suite=parts @PERL@ ./mysql-test-run.pl --force --comment=partitions --suite=parts
-cd mysql-test ; MTR_BUILD_THREAD=auto \
@PERL@ ./mysql-test-run.pl --force --comment=stress --suite=stress
-if [ -d mysql-test/suite/nist ] ; then \ -if [ -d mysql-test/suite/nist ] ; then \
cd mysql-test ; MTR_BUILD_THREAD=auto \ cd mysql-test ; MTR_BUILD_THREAD=auto \
@PERL@ ./mysql-test-run.pl --comment=NIST+normal --force --suite=nist ; \ @PERL@ ./mysql-test-run.pl --comment=nist --force --suite=nist ; \
fi fi
-if [ -d mysql-test/suite/nist ] ; then \ -if [ -d mysql-test/suite/nist ] ; then \
cd mysql-test ; MTR_BUILD_THREAD=auto \ cd mysql-test ; MTR_BUILD_THREAD=auto \
@PERL@ ./mysql-test-run.pl --comment=NIST+ps --force --suite=nist --ps-protocol ; \ @PERL@ ./mysql-test-run.pl --comment=nist+ps --force --suite=nist --ps-protocol ; \
fi
-if [ -e bin/mysqltest_embedded -o -e libmysqld/examples/mysqltest_embedded ] ; then \
cd mysql-test ; MTR_BUILD_THREAD=auto \
@PERL@ ./mysql-test-run.pl --comment=embedded --force --timer \
--embedded-server --skip-rpl --skip-ndbcluster ; \
else \
echo "no program found for 'embedded' tests - skipped testing" ; \
fi fi
-cd mysql-test ; MTR_BUILD_THREAD=auto \
@PERL@ ./mysql-test-run.pl --force --comment=stress --suite=stress
# Re-enable the "jp" suite when bug#28563 is fixed # Re-enable the "jp" suite when bug#28563 is fixed
# -cd mysql-test ; MTR_BUILD_THREAD=auto \ # -cd mysql-test ; MTR_BUILD_THREAD=auto \
......
...@@ -16,3 +16,33 @@ ERROR HY000: The MySQL server is running with the --read-only option so it canno ...@@ -16,3 +16,33 @@ ERROR HY000: The MySQL server is running with the --read-only option so it canno
set global read_only=0; set global read_only=0;
drop table table_11733 ; drop table table_11733 ;
drop user test@localhost; drop user test@localhost;
GRANT CREATE, SELECT, DROP ON *.* TO test@localhost;
CREATE TABLE t1(a INT) ENGINE=INNODB;
INSERT INTO t1 VALUES (0), (1);
SET GLOBAL read_only=1;
SELECT * FROM t1;
a
0
1
BEGIN;
SELECT * FROM t1;
a
0
1
COMMIT;
SET GLOBAL read_only=0;
FLUSH TABLES WITH READ LOCK;
SELECT * FROM t1;
a
0
1
BEGIN;
SELECT * FROM t1;
a
0
1
COMMIT;
UNLOCK TABLES;
DROP TABLE t1;
DROP USER test@localhost;
echo End of 5.1 tests
...@@ -417,3 +417,17 @@ Log_name Pos Event_type Server_id End_log_pos Info ...@@ -417,3 +417,17 @@ Log_name Pos Event_type Server_id End_log_pos Info
SELECT * FROM t2 ORDER BY a; SELECT * FROM t2 ORDER BY a;
a a
DROP TABLE t1,t2; DROP TABLE t1,t2;
CREATE TABLE t1 (a INT);
INSERT INTO t1 VALUES (1),(1);
CREATE TABLE t2 (a INT UNIQUE) ENGINE=INNODB SELECT * FROM t1;
ERROR 23000: Duplicate entry '1' for key 'a'
INSERT INTO t1 VALUES (2);
*** the proof of the fix:
select must show that the last insert performed on the slave ***
SELECT * FROM t1;
a
1
1
2
DROP TABLE t1;
end of the tests
...@@ -234,3 +234,30 @@ SELECT * FROM t2 ORDER BY a; ...@@ -234,3 +234,30 @@ SELECT * FROM t2 ORDER BY a;
connection master; connection master;
DROP TABLE t1,t2; DROP TABLE t1,t2;
sync_slave_with_master; sync_slave_with_master;
#
# bug#35762 Failing CREATE-SELECT produces bad binlog in row mode
#
connection master;
CREATE TABLE t1 (a INT);
INSERT INTO t1 VALUES (1),(1);
--error ER_DUP_ENTRY
CREATE TABLE t2 (a INT UNIQUE) ENGINE=INNODB SELECT * FROM t1;
INSERT INTO t1 VALUES (2);
sync_slave_with_master;
# connection slave;
--echo *** the proof of the fix:
--echo select must show that the last insert performed on the slave ***
SELECT * FROM t1;
connection master;
DROP TABLE t1;
sync_slave_with_master;
--echo end of the tests
...@@ -41,3 +41,45 @@ set global read_only=0; ...@@ -41,3 +41,45 @@ set global read_only=0;
drop table table_11733 ; drop table table_11733 ;
drop user test@localhost; drop user test@localhost;
disconnect con1;
#
# Bug #35732: read-only blocks SELECT statements in InnoDB
#
# Test 1: read only mode
GRANT CREATE, SELECT, DROP ON *.* TO test@localhost;
connect(con1, localhost, test, , test);
connection default;
CREATE TABLE t1(a INT) ENGINE=INNODB;
INSERT INTO t1 VALUES (0), (1);
SET GLOBAL read_only=1;
connection con1;
SELECT * FROM t1;
BEGIN;
SELECT * FROM t1;
COMMIT;
connection default;
SET GLOBAL read_only=0;
#
# Test 2: global read lock
#
FLUSH TABLES WITH READ LOCK;
connection con1;
SELECT * FROM t1;
BEGIN;
SELECT * FROM t1;
COMMIT;
connection default;
UNLOCK TABLES;
DROP TABLE t1;
DROP USER test@localhost;
disconnect con1;
--echo echo End of 5.1 tests
...@@ -433,7 +433,10 @@ ALTER TABLE db MODIFY Event_priv enum('N','Y') character set utf8 DEFAULT 'N' NO ...@@ -433,7 +433,10 @@ ALTER TABLE db MODIFY Event_priv enum('N','Y') character set utf8 DEFAULT 'N' NO
# #
ALTER TABLE event DROP PRIMARY KEY; ALTER TABLE event DROP PRIMARY KEY;
ALTER TABLE event ADD PRIMARY KEY(db, name); ALTER TABLE event ADD PRIMARY KEY(db, name);
ALTER TABLE event ADD sql_mode # Add sql_mode column just in case.
ALTER TABLE event ADD sql_mode set ('NOT_USED') AFTER on_completion;
# Update list of sql_mode values.
ALTER TABLE event MODIFY sql_mode
set('REAL_AS_FLOAT', set('REAL_AS_FLOAT',
'PIPES_AS_CONCAT', 'PIPES_AS_CONCAT',
'ANSI_QUOTES', 'ANSI_QUOTES',
......
...@@ -952,16 +952,21 @@ int ha_prepare(THD *thd) ...@@ -952,16 +952,21 @@ int ha_prepare(THD *thd)
A helper function to evaluate if two-phase commit is mandatory. A helper function to evaluate if two-phase commit is mandatory.
As a side effect, propagates the read-only/read-write flags As a side effect, propagates the read-only/read-write flags
of the statement transaction to its enclosing normal transaction. of the statement transaction to its enclosing normal transaction.
@retval TRUE we must run a two-phase commit. Returned If we have at least two engines with read-write changes we must
if we have at least two engines with read-write changes. run a two-phase commit. Otherwise we can run several independent
@retval FALSE Don't need two-phase commit. Even if we have two commits as the only transactional engine has read-write changes
transactional engines, we can run two independent and others are read-only.
commits if changes in one of the engines are read-only.
@retval 0 All engines are read-only.
@retval 1 We have the only engine with read-write changes.
@retval >1 More than one engine have read-write changes.
Note: return value might NOT be the exact number of
engines with read-write changes.
*/ */
static static
bool uint
ha_check_and_coalesce_trx_read_only(THD *thd, Ha_trx_info *ha_list, ha_check_and_coalesce_trx_read_only(THD *thd, Ha_trx_info *ha_list,
bool all) bool all)
{ {
...@@ -998,7 +1003,7 @@ ha_check_and_coalesce_trx_read_only(THD *thd, Ha_trx_info *ha_list, ...@@ -998,7 +1003,7 @@ ha_check_and_coalesce_trx_read_only(THD *thd, Ha_trx_info *ha_list,
break; break;
} }
} }
return rw_ha_count > 1; return rw_ha_count;
} }
...@@ -1061,19 +1066,30 @@ int ha_commit_trans(THD *thd, bool all) ...@@ -1061,19 +1066,30 @@ int ha_commit_trans(THD *thd, bool all)
#ifdef USING_TRANSACTIONS #ifdef USING_TRANSACTIONS
if (ha_info) if (ha_info)
{ {
bool must_2pc; uint rw_ha_count;
bool rw_trans;
DBUG_EXECUTE_IF("crash_commit_before", abort(););
/* Close all cursors that can not survive COMMIT */
if (is_real_trans) /* not a statement commit */
thd->stmt_map.close_transient_cursors();
if (is_real_trans && wait_if_global_read_lock(thd, 0, 0)) rw_ha_count= ha_check_and_coalesce_trx_read_only(thd, ha_info, all);
/* rw_trans is TRUE when we in a transaction changing data */
rw_trans= is_real_trans && (rw_ha_count > 0);
if (rw_trans &&
wait_if_global_read_lock(thd, 0, 0))
{ {
ha_rollback_trans(thd, all); ha_rollback_trans(thd, all);
DBUG_RETURN(1); DBUG_RETURN(1);
} }
if ( is_real_trans if (rw_trans &&
&& opt_readonly opt_readonly &&
&& ! (thd->security_ctx->master_access & SUPER_ACL) !(thd->security_ctx->master_access & SUPER_ACL) &&
&& ! thd->slave_thread !thd->slave_thread)
)
{ {
my_error(ER_OPTION_PREVENTS_STATEMENT, MYF(0), "--read-only"); my_error(ER_OPTION_PREVENTS_STATEMENT, MYF(0), "--read-only");
ha_rollback_trans(thd, all); ha_rollback_trans(thd, all);
...@@ -1081,15 +1097,7 @@ int ha_commit_trans(THD *thd, bool all) ...@@ -1081,15 +1097,7 @@ int ha_commit_trans(THD *thd, bool all)
goto end; goto end;
} }
DBUG_EXECUTE_IF("crash_commit_before", abort();); if (!trans->no_2pc && (rw_ha_count > 1))
/* Close all cursors that can not survive COMMIT */
if (is_real_trans) /* not a statement commit */
thd->stmt_map.close_transient_cursors();
must_2pc= ha_check_and_coalesce_trx_read_only(thd, ha_info, all);
if (!trans->no_2pc && must_2pc)
{ {
for (; ha_info && !error; ha_info= ha_info->next()) for (; ha_info && !error; ha_info= ha_info->next())
{ {
...@@ -1129,7 +1137,7 @@ int ha_commit_trans(THD *thd, bool all) ...@@ -1129,7 +1137,7 @@ int ha_commit_trans(THD *thd, bool all)
tc_log->unlog(cookie, xid); tc_log->unlog(cookie, xid);
DBUG_EXECUTE_IF("crash_commit_after", abort();); DBUG_EXECUTE_IF("crash_commit_after", abort(););
end: end:
if (is_real_trans) if (rw_trans)
start_waiting_global_read_lock(thd); start_waiting_global_read_lock(thd);
} }
#endif /* USING_TRANSACTIONS */ #endif /* USING_TRANSACTIONS */
......
...@@ -1533,6 +1533,7 @@ void start_waiting_global_read_lock(THD *thd) ...@@ -1533,6 +1533,7 @@ void start_waiting_global_read_lock(THD *thd)
if (unlikely(thd->global_read_lock)) if (unlikely(thd->global_read_lock))
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
(void) pthread_mutex_lock(&LOCK_global_read_lock); (void) pthread_mutex_lock(&LOCK_global_read_lock);
DBUG_ASSERT(protect_against_global_read_lock);
tmp= (!--protect_against_global_read_lock && tmp= (!--protect_against_global_read_lock &&
(waiting_for_read_lock || global_read_lock_blocks_commit)); (waiting_for_read_lock || global_read_lock_blocks_commit));
(void) pthread_mutex_unlock(&LOCK_global_read_lock); (void) pthread_mutex_unlock(&LOCK_global_read_lock);
......
...@@ -3720,7 +3720,7 @@ void select_create::abort() ...@@ -3720,7 +3720,7 @@ void select_create::abort()
select_insert::abort(); select_insert::abort();
thd->transaction.stmt.modified_non_trans_table= FALSE; thd->transaction.stmt.modified_non_trans_table= FALSE;
reenable_binlog(thd); reenable_binlog(thd);
thd->binlog_flush_pending_rows_event(TRUE);
if (m_plock) if (m_plock)
{ {
......
...@@ -341,7 +341,6 @@ BuildMySQL "--enable-shared \ ...@@ -341,7 +341,6 @@ BuildMySQL "--enable-shared \
%endif %endif
--with-archive-storage-engine \ --with-archive-storage-engine \
--with-csv-storage-engine \ --with-csv-storage-engine \
--with-example-storage-engine \
--with-blackhole-storage-engine \ --with-blackhole-storage-engine \
%if %{FEDERATED_BUILD} %if %{FEDERATED_BUILD}
--with-federated-storage-engine \ --with-federated-storage-engine \
...@@ -373,13 +372,16 @@ BuildMySQL "--enable-shared \ ...@@ -373,13 +372,16 @@ BuildMySQL "--enable-shared \
--with-innodb \ --with-innodb \
%if %{CLUSTER_BUILD} %if %{CLUSTER_BUILD}
--with-ndbcluster \ --with-ndbcluster \
%else
--without-ndbcluster \
%endif %endif
--with-archive-storage-engine \ --with-archive-storage-engine \
--with-csv-storage-engine \ --with-csv-storage-engine \
--with-example-storage-engine \
--with-blackhole-storage-engine \ --with-blackhole-storage-engine \
%if %{FEDERATED_BUILD} %if %{FEDERATED_BUILD}
--with-federated-storage-engine \ --with-federated-storage-engine \
%else
--without-federated-storage-engine \
%endif %endif
--with-partition \ --with-partition \
--with-embedded-server \ --with-embedded-server \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment