summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <evgen@moonbone.local>2005-12-02 22:07:10 +0300
committerunknown <evgen@moonbone.local>2005-12-02 22:07:10 +0300
commit93e597c12c1b1970ab14c82bb2b84964729d3178 (patch)
tree823cf67ae571577d85fdd19a3ca23785738e26ba
parent176f36fa55345f050ec9a6381238c6c5af658ffe (diff)
parent04ea656dbae4fda31372043a47fb25b6fd565a2c (diff)
downloadmariadb-git-93e597c12c1b1970ab14c82bb2b84964729d3178.tar.gz
Merge moonbone.local:/work/15028-bug-5.0-mysql
into moonbone.local:/work/15028-bug-5.1-new-mysql configure.in: Auto merged mysql-test/r/query_cache.result: Auto merged mysql-test/t/query_cache.test: Auto merged sql/sql_cache.cc: Auto merged sql/sql_update.cc: Auto merged storage/ndb/src/kernel/blocks/backup/Backup.cpp: Auto merged storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp: Auto merged
-rw-r--r--mysql-test/r/query_cache.result25
-rw-r--r--mysql-test/r/update.result13
-rw-r--r--mysql-test/t/query_cache.test14
-rw-r--r--mysql-test/t/update.test17
-rw-r--r--sql/sql_cache.cc37
-rw-r--r--sql/sql_update.cc13
-rw-r--r--storage/ndb/src/kernel/blocks/backup/Backup.cpp15
7 files changed, 110 insertions, 24 deletions
diff --git a/mysql-test/r/query_cache.result b/mysql-test/r/query_cache.result
index 44493cd25d4..e790c8589d0 100644
--- a/mysql-test/r/query_cache.result
+++ b/mysql-test/r/query_cache.result
@@ -1024,6 +1024,31 @@ Variable_name Value
Qcache_hits 1
drop table t1;
create table t1 (a int);
+flush status;
+(select a from t1) union (select a from t1);
+a
+show status like "Qcache_queries_in_cache";
+Variable_name Value
+Qcache_queries_in_cache 1
+show status like "Qcache_inserts";
+Variable_name Value
+Qcache_inserts 1
+show status like "Qcache_hits";
+Variable_name Value
+Qcache_hits 0
+(select a from t1) union (select a from t1);
+a
+show status like "Qcache_queries_in_cache";
+Variable_name Value
+Qcache_queries_in_cache 1
+show status like "Qcache_inserts";
+Variable_name Value
+Qcache_inserts 1
+show status like "Qcache_hits";
+Variable_name Value
+Qcache_hits 1
+drop table t1;
+create table t1 (a int);
insert into t1 values (1),(2);
CREATE PROCEDURE `p1`()
begin
diff --git a/mysql-test/r/update.result b/mysql-test/r/update.result
index aeb44fa4e6c..abeade5df0c 100644
--- a/mysql-test/r/update.result
+++ b/mysql-test/r/update.result
@@ -345,3 +345,16 @@ f1
2000-01-01
2002-02-02
drop table t1;
+create table t1 (f1 int);
+create table t2 (f2 int);
+insert into t1 values(1),(2);
+insert into t2 values(1),(1);
+update t1,t2 set f1=3,f2=3 where f1=f2 and f1=1;
+affected rows: 3
+info: Rows matched: 3 Changed: 3 Warnings: 0
+update t2 set f2=1;
+update t1 set f1=1 where f1=3;
+update t2,t1 set f1=3,f2=3 where f1=f2 and f1=1;
+affected rows: 3
+info: Rows matched: 3 Changed: 3 Warnings: 0
+drop table t1,t2;
diff --git a/mysql-test/t/query_cache.test b/mysql-test/t/query_cache.test
index fc0b2f471d2..44ece1be64d 100644
--- a/mysql-test/t/query_cache.test
+++ b/mysql-test/t/query_cache.test
@@ -747,6 +747,20 @@ show status like "Qcache_hits";
drop table t1;
#
+# BUG#14652: Queries with leading '(' characters.
+#
+create table t1 (a int);
+flush status;
+(select a from t1) union (select a from t1);
+show status like "Qcache_queries_in_cache";
+show status like "Qcache_inserts";
+show status like "Qcache_hits";
+(select a from t1) union (select a from t1);
+show status like "Qcache_queries_in_cache";
+show status like "Qcache_inserts";
+show status like "Qcache_hits";
+drop table t1;
+
# SP cursors and selects with query cache (BUG#9715)
#
create table t1 (a int);
diff --git a/mysql-test/t/update.test b/mysql-test/t/update.test
index 2a151f0dd38..d0496b48c7a 100644
--- a/mysql-test/t/update.test
+++ b/mysql-test/t/update.test
@@ -270,4 +270,21 @@ insert into t1 values('2000-01-01'),('0000-00-00');
update t1 set f1='2002-02-02' where f1 is null;
select * from t1;
drop table t1;
+
+#
+# Bug#15028 Multitable update returns different numbers of matched rows
+# depending on table order
+create table t1 (f1 int);
+create table t2 (f2 int);
+insert into t1 values(1),(2);
+insert into t2 values(1),(1);
+--enable_info
+update t1,t2 set f1=3,f2=3 where f1=f2 and f1=1;
+--disable_info
+update t2 set f2=1;
+update t1 set f1=1 where f1=3;
+--enable_info
+update t2,t1 set f1=3,f2=3 where f1=f2 and f1=1;
+--disable_info
+drop table t1,t2;
# End of 4.1 tests
diff --git a/sql/sql_cache.cc b/sql/sql_cache.cc
index 0f45b348d11..61a45ebb4d6 100644
--- a/sql/sql_cache.cc
+++ b/sql/sql_cache.cc
@@ -977,21 +977,32 @@ Query_cache::send_result_to_client(THD *thd, char *sql, uint query_length)
goto err;
}
- /*
- Test if the query is a SELECT
- (pre-space is removed in dispatch_command).
+ {
+ uint i= 0;
+ /*
+ Skip '(' characters in queries like following:
+ (select a from t1) union (select a from t1);
+ */
+ while (sql[i]=='(')
+ i++;
- First '/' looks like comment before command it is not
- frequently appeared in real lihe, consequently we can
- check all such queries, too.
- */
- if ((my_toupper(system_charset_info, sql[0]) != 'S' ||
- my_toupper(system_charset_info, sql[1]) != 'E' ||
- my_toupper(system_charset_info,sql[2]) !='L') &&
+
+ /*
+ Test if the query is a SELECT
+ (pre-space is removed in dispatch_command).
+
+ First '/' looks like comment before command it is not
+ frequently appeared in real lihe, consequently we can
+ check all such queries, too.
+ */
+ if ((my_toupper(system_charset_info, sql[i]) != 'S' ||
+ my_toupper(system_charset_info, sql[i + 1]) != 'E' ||
+ my_toupper(system_charset_info, sql[i + 2]) != 'L') &&
sql[0] != '/')
- {
- DBUG_PRINT("qcache", ("The statement is not a SELECT; Not cached"));
- goto err;
+ {
+ DBUG_PRINT("qcache", ("The statement is not a SELECT; Not cached"));
+ goto err;
+ }
}
STRUCT_LOCK(&structure_guard_mutex);
diff --git a/sql/sql_update.cc b/sql/sql_update.cc
index 79e6a4766a5..359475827b1 100644
--- a/sql/sql_update.cc
+++ b/sql/sql_update.cc
@@ -1396,22 +1396,23 @@ bool multi_update::send_data(List<Item> &not_used_values)
int error;
TABLE *tmp_table= tmp_tables[offset];
fill_record(thd, tmp_table->field+1, *values_for_table[offset], 1);
- found++;
/* Store pointer to row */
memcpy((char*) tmp_table->field[0]->ptr,
(char*) table->file->ref, table->file->ref_length);
/* Write row, ignoring duplicated updates to a row */
- if ((error= tmp_table->file->write_row(tmp_table->record[0])) &&
- (error != HA_ERR_FOUND_DUPP_KEY &&
- error != HA_ERR_FOUND_DUPP_UNIQUE))
+ if (error= tmp_table->file->write_row(tmp_table->record[0]))
{
- if (create_myisam_from_heap(thd, tmp_table, tmp_table_param + offset,
- error, 1))
+ if (error != HA_ERR_FOUND_DUPP_KEY &&
+ error != HA_ERR_FOUND_DUPP_UNIQUE &&
+ create_myisam_from_heap(thd, tmp_table,
+ tmp_table_param + offset, error, 1))
{
do_update=0;
DBUG_RETURN(1); // Not a table_is_full error
}
}
+ else
+ found++;
}
}
DBUG_RETURN(0);
diff --git a/storage/ndb/src/kernel/blocks/backup/Backup.cpp b/storage/ndb/src/kernel/blocks/backup/Backup.cpp
index ac74b0aa40f..87b4bdb4a5d 100644
--- a/storage/ndb/src/kernel/blocks/backup/Backup.cpp
+++ b/storage/ndb/src/kernel/blocks/backup/Backup.cpp
@@ -802,13 +802,17 @@ Backup::checkNodeFail(Signal* signal,
pos= &ref->nodeId - signal->getDataPtr();
break;
}
+ case GSN_WAIT_GCP_REQ:
+ case GSN_DROP_TRIG_REQ:
case GSN_CREATE_TRIG_REQ:
case GSN_ALTER_TRIG_REQ:
- case GSN_WAIT_GCP_REQ:
+ ptr.p->setErrorCode(AbortBackupOrd::BackupFailureDueToNodeFail);
+ return;
case GSN_UTIL_SEQUENCE_REQ:
case GSN_UTIL_LOCK_REQ:
- case GSN_DROP_TRIG_REQ:
return;
+ default:
+ ndbrequire(false);
}
for(Uint32 i = 0; (i = mask.find(i+1)) != NdbNodeBitmask::NotFound; )
@@ -1820,7 +1824,7 @@ Backup::execBACKUP_FRAGMENT_CONF(Signal* signal)
const Uint32 nodeId = refToNode(signal->senderBlockRef());
const Uint32 noOfBytes = conf->noOfBytes;
const Uint32 noOfRecords = conf->noOfRecords;
-
+
BackupRecordPtr ptr;
c_backupPool.getPtr(ptr, ptrI);
@@ -1897,7 +1901,7 @@ Backup::execBACKUP_FRAGMENT_REF(Signal* signal)
}
}
}
- ndbrequire(false);
+ goto err;
done:
ptr.p->masterData.sendCounter--;
@@ -1909,7 +1913,8 @@ done:
masterAbort(signal, ptr);
return;
}//if
-
+
+err:
AbortBackupOrd *ord = (AbortBackupOrd*)signal->getDataPtrSend();
ord->backupId = ptr.p->backupId;
ord->backupPtr = ptr.i;