Commit ef7154ed authored by unknown's avatar unknown

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
parents 487f5536 a1e0125a
...@@ -1024,6 +1024,31 @@ Variable_name Value ...@@ -1024,6 +1024,31 @@ Variable_name Value
Qcache_hits 1 Qcache_hits 1
drop table t1; drop table t1;
create table t1 (a int); 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); insert into t1 values (1),(2);
CREATE PROCEDURE `p1`() CREATE PROCEDURE `p1`()
begin begin
......
...@@ -345,3 +345,16 @@ f1 ...@@ -345,3 +345,16 @@ f1
2000-01-01 2000-01-01
2002-02-02 2002-02-02
drop table t1; 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;
...@@ -747,6 +747,20 @@ show status like "Qcache_hits"; ...@@ -747,6 +747,20 @@ show status like "Qcache_hits";
drop table t1; 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) # SP cursors and selects with query cache (BUG#9715)
# #
create table t1 (a int); create table t1 (a int);
......
...@@ -270,4 +270,21 @@ insert into t1 values('2000-01-01'),('0000-00-00'); ...@@ -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; update t1 set f1='2002-02-02' where f1 is null;
select * from t1; select * from t1;
drop table 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 # End of 4.1 tests
...@@ -977,21 +977,32 @@ Query_cache::send_result_to_client(THD *thd, char *sql, uint query_length) ...@@ -977,21 +977,32 @@ Query_cache::send_result_to_client(THD *thd, char *sql, uint query_length)
goto err; goto err;
} }
/* {
Test if the query is a SELECT uint i= 0;
(pre-space is removed in dispatch_command). /*
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. Test if the query is a SELECT
*/ (pre-space is removed in dispatch_command).
if ((my_toupper(system_charset_info, sql[0]) != 'S' ||
my_toupper(system_charset_info, sql[1]) != 'E' || First '/' looks like comment before command it is not
my_toupper(system_charset_info,sql[2]) !='L') && 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] != '/') sql[0] != '/')
{ {
DBUG_PRINT("qcache", ("The statement is not a SELECT; Not cached")); DBUG_PRINT("qcache", ("The statement is not a SELECT; Not cached"));
goto err; goto err;
}
} }
STRUCT_LOCK(&structure_guard_mutex); STRUCT_LOCK(&structure_guard_mutex);
......
...@@ -1396,22 +1396,23 @@ bool multi_update::send_data(List<Item> &not_used_values) ...@@ -1396,22 +1396,23 @@ bool multi_update::send_data(List<Item> &not_used_values)
int error; int error;
TABLE *tmp_table= tmp_tables[offset]; TABLE *tmp_table= tmp_tables[offset];
fill_record(thd, tmp_table->field+1, *values_for_table[offset], 1); fill_record(thd, tmp_table->field+1, *values_for_table[offset], 1);
found++;
/* Store pointer to row */ /* Store pointer to row */
memcpy((char*) tmp_table->field[0]->ptr, memcpy((char*) tmp_table->field[0]->ptr,
(char*) table->file->ref, table->file->ref_length); (char*) table->file->ref, table->file->ref_length);
/* Write row, ignoring duplicated updates to a row */ /* Write row, ignoring duplicated updates to a row */
if ((error= tmp_table->file->write_row(tmp_table->record[0])) && if (error= tmp_table->file->write_row(tmp_table->record[0]))
(error != HA_ERR_FOUND_DUPP_KEY &&
error != HA_ERR_FOUND_DUPP_UNIQUE))
{ {
if (create_myisam_from_heap(thd, tmp_table, tmp_table_param + offset, if (error != HA_ERR_FOUND_DUPP_KEY &&
error, 1)) error != HA_ERR_FOUND_DUPP_UNIQUE &&
create_myisam_from_heap(thd, tmp_table,
tmp_table_param + offset, error, 1))
{ {
do_update=0; do_update=0;
DBUG_RETURN(1); // Not a table_is_full error DBUG_RETURN(1); // Not a table_is_full error
} }
} }
else
found++;
} }
} }
DBUG_RETURN(0); DBUG_RETURN(0);
......
...@@ -802,13 +802,17 @@ Backup::checkNodeFail(Signal* signal, ...@@ -802,13 +802,17 @@ Backup::checkNodeFail(Signal* signal,
pos= &ref->nodeId - signal->getDataPtr(); pos= &ref->nodeId - signal->getDataPtr();
break; break;
} }
case GSN_WAIT_GCP_REQ:
case GSN_DROP_TRIG_REQ:
case GSN_CREATE_TRIG_REQ: case GSN_CREATE_TRIG_REQ:
case GSN_ALTER_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_SEQUENCE_REQ:
case GSN_UTIL_LOCK_REQ: case GSN_UTIL_LOCK_REQ:
case GSN_DROP_TRIG_REQ:
return; return;
default:
ndbrequire(false);
} }
for(Uint32 i = 0; (i = mask.find(i+1)) != NdbNodeBitmask::NotFound; ) for(Uint32 i = 0; (i = mask.find(i+1)) != NdbNodeBitmask::NotFound; )
...@@ -1820,7 +1824,7 @@ Backup::execBACKUP_FRAGMENT_CONF(Signal* signal) ...@@ -1820,7 +1824,7 @@ Backup::execBACKUP_FRAGMENT_CONF(Signal* signal)
const Uint32 nodeId = refToNode(signal->senderBlockRef()); const Uint32 nodeId = refToNode(signal->senderBlockRef());
const Uint32 noOfBytes = conf->noOfBytes; const Uint32 noOfBytes = conf->noOfBytes;
const Uint32 noOfRecords = conf->noOfRecords; const Uint32 noOfRecords = conf->noOfRecords;
BackupRecordPtr ptr; BackupRecordPtr ptr;
c_backupPool.getPtr(ptr, ptrI); c_backupPool.getPtr(ptr, ptrI);
...@@ -1897,7 +1901,7 @@ Backup::execBACKUP_FRAGMENT_REF(Signal* signal) ...@@ -1897,7 +1901,7 @@ Backup::execBACKUP_FRAGMENT_REF(Signal* signal)
} }
} }
} }
ndbrequire(false); goto err;
done: done:
ptr.p->masterData.sendCounter--; ptr.p->masterData.sendCounter--;
...@@ -1909,7 +1913,8 @@ Backup::execBACKUP_FRAGMENT_REF(Signal* signal) ...@@ -1909,7 +1913,8 @@ Backup::execBACKUP_FRAGMENT_REF(Signal* signal)
masterAbort(signal, ptr); masterAbort(signal, ptr);
return; return;
}//if }//if
err:
AbortBackupOrd *ord = (AbortBackupOrd*)signal->getDataPtrSend(); AbortBackupOrd *ord = (AbortBackupOrd*)signal->getDataPtrSend();
ord->backupId = ptr.p->backupId; ord->backupId = ptr.p->backupId;
ord->backupPtr = ptr.i; ord->backupPtr = ptr.i;
......
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