Commit d09c4f6e authored by unknown's avatar unknown

Merge paul@bk-internal.mysql.com:/home/bk/mysql-4.1

into  frost.snake.net:/Volumes/frost2/MySQL/bk/mysql-4.1
parents 4fca19b3 c61fa49c
......@@ -97,7 +97,22 @@ tags:
support-files/build-tags
.PHONY: init-db bin-dist
# Test installation
# Test installation. Ports are configurable from the environment.
MYSQL_TEST_MANAGER_PORT = 9305
MYSQL_TEST_MASTER_PORT = 9306
MYSQL_TEST_SLAVE_PORT = 9308
MYSQL_TEST_NDB_PORT = 9350
test:
cd mysql-test; perl mysql-test-run.pl && perl mysql-test-run.pl --ps-protocol
cd mysql-test ; \
./mysql-test-run.pl \
--manager-port=$(MYSQL_TEST_MANAGER_PORT) \
--master_port=$(MYSQL_TEST_MASTER_PORT) \
--slave_port=$(MYSQL_TEST_SLAVE_PORT) \
--ndbcluster_port=$(MYSQL_TEST_NDB_PORT) && \
./mysql-test-run.pl --ps-protocol \
--manager-port=$(MYSQL_TEST_MANAGER_PORT) \
--master_port=$(MYSQL_TEST_MASTER_PORT) \
--slave_port=$(MYSQL_TEST_SLAVE_PORT) \
--ndbcluster_port=$(MYSQL_TEST_NDB_PORT)
......@@ -993,6 +993,18 @@ select * from t1 where a like "%abc\d%";
a
abcd
drop table t1;
set names utf8;
create table t1 (a char(3), b varchar(10));
insert into t1 values ('bar','kostja');
prepare my_stmt from "select * from t1 where a=?";
set @a:='bar';
execute my_stmt using @a;
a b
bar kostja
set @a:=NULL;
execute my_stmt using @a;
a b
drop table t1;
CREATE TABLE t1 (
a varchar(255) NOT NULL default '',
KEY a (a)
......
......@@ -831,6 +831,20 @@ select * from t1 where a like "%abc\d%";
drop table t1;
#
# Bug #12371 executing prepared statement fails (illegal mix of collations)
#
set names utf8;
create table t1 (a char(3), b varchar(10));
insert into t1 values ('bar','kostja');
prepare my_stmt from "select * from t1 where a=?";
set @a:='bar';
execute my_stmt using @a;
set @a:=NULL;
execute my_stmt using @a;
drop table t1;
#
# Bug#9557 MyISAM utf8 table crash
#
......
......@@ -79,6 +79,7 @@ NdbOut& operator<<(NdbOut& no, const CommitTransactionRecord& ctr) {
no << "----------COMMIT TRANSACTION RECORD------------" << endl << endl;
printOut("Record type:", ctr.m_recordType);
printOut("TableId", ctr.m_tableId);
printOut("SchemaVersion:", ctr.m_schemaVersion);
printOut("FfragmentId", ctr.m_fragmentId);
printOut("File no. of Prep. Op.", ctr.m_fileNumberOfPrepareOperation);
printOut("Start page no. of Prep. Op.", ctr.m_startPageNumberOfPrepareOperation);
......@@ -127,7 +128,7 @@ bool PrepareOperationRecord::check() {
if (m_operationType == 3 && m_attributeLength != 0)
return false;
if (m_logRecordSize != (m_attributeLength + m_keyLength + 7))
if (m_logRecordSize != (m_attributeLength + m_keyLength + 6))
return false;
return true;
......@@ -142,7 +143,6 @@ NdbOut& operator<<(NdbOut& no, const PrepareOperationRecord& por) {
printOut("Record type:", por.m_recordType);
printOut("logRecordSize:", por.m_logRecordSize);
printOut("hashValue:", por.m_hashValue);
printOut("schemaVersion:", por.m_schemaVersion);
switch (por.m_operationType) {
case 0:
ndbout_c("%-30s%-12u%-6s", "operationType:",
......
......@@ -36,7 +36,7 @@
#define NO_PAGES_IN_MBYTE 32
#define NO_MBYTE_IN_FILE 16
#define COMMITTRANSACTIONRECORDSIZE 8
#define COMMITTRANSACTIONRECORDSIZE 9
#define COMPLETEDGCIRECORDSIZE 2
#define PAGEHEADERSIZE 32
#define FILEDESCRIPTORHEADERSIZE 3
......@@ -89,7 +89,6 @@ protected:
Uint32 m_recordType;
Uint32 m_logRecordSize;
Uint32 m_hashValue;
Uint32 m_schemaVersion;
Uint32 m_operationType; // 0 READ, 1 UPDATE, 2 INSERT, 3 DELETE
Uint32 m_attributeLength;
Uint32 m_keyLength;
......@@ -190,6 +189,7 @@ public:
protected:
Uint32 m_recordType;
Uint32 m_tableId;
Uint32 m_schemaVersion;
Uint32 m_fragmentId;
Uint32 m_fileNumberOfPrepareOperation;
Uint32 m_startPageNumberOfPrepareOperation;
......
......@@ -105,6 +105,7 @@ NDB_COMMAND(redoLogFileReader, "redoLogFileReader", "redoLogFileReader", "Read
if (thePrintFlag) ndbout << (*thePageHeader);
if (theCheckFlag) {
if(!thePageHeader->check()) {
ndbout << "Error in thePageHeader->check()" << endl;
doExit();
}
......@@ -146,6 +147,7 @@ NDB_COMMAND(redoLogFileReader, "redoLogFileReader", "redoLogFileReader", "Read
if (thePrintFlag) ndbout << (*fdRecord);
if (theCheckFlag) {
if(!fdRecord->check()) {
ndbout << "Error in fdRecord->check()" << endl;
doExit();
}
}
......@@ -163,6 +165,7 @@ NDB_COMMAND(redoLogFileReader, "redoLogFileReader", "redoLogFileReader", "Read
if (thePrintFlag) ndbout << (*nlRecord);
if (theCheckFlag) {
if(!nlRecord->check()) {
ndbout << "Error in nlRecord->check()" << endl;
doExit();
}
}
......@@ -176,6 +179,7 @@ NDB_COMMAND(redoLogFileReader, "redoLogFileReader", "redoLogFileReader", "Read
if (thePrintFlag) ndbout << (*cGCIrecord);
if (theCheckFlag) {
if(!cGCIrecord->check()) {
ndbout << "Error in cGCIrecord->check()" << endl;
doExit();
}
}
......@@ -189,6 +193,7 @@ NDB_COMMAND(redoLogFileReader, "redoLogFileReader", "redoLogFileReader", "Read
if (thePrintFlag) ndbout << (*poRecord);
if (theCheckFlag) {
if(!poRecord->check()) {
ndbout << "Error in poRecord->check()" << endl;
doExit();
}
}
......@@ -205,6 +210,7 @@ NDB_COMMAND(redoLogFileReader, "redoLogFileReader", "redoLogFileReader", "Read
if (thePrintFlag) ndbout << (*ctRecord);
if (theCheckFlag) {
if(!ctRecord->check()) {
ndbout << "Error in ctRecord->check()" << endl;
doExit();
}
}
......@@ -221,6 +227,7 @@ NDB_COMMAND(redoLogFileReader, "redoLogFileReader", "redoLogFileReader", "Read
if (thePrintFlag) ndbout << (*ictRecord);
if (theCheckFlag) {
if(!ictRecord->check()) {
ndbout << "Error in ictRecord->check()" << endl;
doExit();
}
}
......@@ -243,6 +250,7 @@ NDB_COMMAND(redoLogFileReader, "redoLogFileReader", "redoLogFileReader", "Read
if (thePrintFlag) ndbout << (*atRecord);
if (theCheckFlag) {
if(!atRecord->check()) {
ndbout << "Error in atRecord->check()" << endl;
doExit();
}
}
......@@ -329,6 +337,7 @@ Uint32 readRecordOverPageBoundary(Uint32 *pagePtr, Uint32 pageIndex, Uint32 old
if (recordSize < (PAGESIZE - PAGEHEADERSIZE)) {
if (theCheckFlag) {
if(!poRecord->check()) {
ndbout << "Error in poRecord->check() (readRecordOverPageBoundary)" << endl;
doExit();
}
}
......@@ -344,6 +353,7 @@ Uint32 readRecordOverPageBoundary(Uint32 *pagePtr, Uint32 pageIndex, Uint32 old
if (recordSize < (PAGESIZE - PAGEHEADERSIZE)) {
if (theCheckFlag) {
if(!ctRecord->check()) {
ndbout << "Error in ctRecord->check() (readRecordOverPageBoundary)" << endl;
doExit();
}
}
......@@ -359,6 +369,7 @@ Uint32 readRecordOverPageBoundary(Uint32 *pagePtr, Uint32 pageIndex, Uint32 old
if (recordSize < (PAGESIZE - PAGEHEADERSIZE)) {
if (theCheckFlag) {
if(!ictRecord->check()) {
ndbout << "Error in ictRecord->check() (readRecordOverPageBoundary)" << endl;
doExit();
}
}
......
......@@ -284,6 +284,32 @@ Item *Item_string::safe_charset_converter(CHARSET_INFO *tocs)
}
Item *Item_param::safe_charset_converter(CHARSET_INFO *tocs)
{
if (const_item())
{
Item_string *conv;
uint conv_errors;
char buf[MAX_FIELD_WIDTH];
String tmp(buf, sizeof(buf), &my_charset_bin);
String cstr, *ostr= val_str(&tmp);
/*
As safe_charset_converter is not executed for
a parameter bound to NULL, ostr should never be 0.
*/
cstr.copy(ostr->ptr(), ostr->length(), ostr->charset(), tocs, &conv_errors);
if (conv_errors || !(conv= new Item_string(cstr.ptr(), cstr.length(),
cstr.charset(),
collation.derivation)))
return NULL;
conv->str_value.copy();
conv->str_value.shrink_to_length();
return conv;
}
return NULL;
}
bool Item_string::eq(const Item *item, bool binary_cmp) const
{
if (type() == item->type() && item->basic_const_item())
......
......@@ -618,6 +618,7 @@ class Item_param :public Item
basic_const_item returned TRUE.
*/
Item *new_item();
Item *safe_charset_converter(CHARSET_INFO *tocs);
/*
Implement by-value equality evaluation if parameter value
is set and is a basic constant (integer, real or string).
......
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