Commit 36fcc9c6 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 ee4db475 8d0275b3
...@@ -97,7 +97,22 @@ tags: ...@@ -97,7 +97,22 @@ tags:
support-files/build-tags support-files/build-tags
.PHONY: init-db bin-dist .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: 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%"; ...@@ -993,6 +993,18 @@ select * from t1 where a like "%abc\d%";
a a
abcd abcd
drop table t1; 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 ( CREATE TABLE t1 (
a varchar(255) NOT NULL default '', a varchar(255) NOT NULL default '',
KEY a (a) KEY a (a)
......
...@@ -831,6 +831,20 @@ select * from t1 where a like "%abc\d%"; ...@@ -831,6 +831,20 @@ select * from t1 where a like "%abc\d%";
drop table t1; 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 # Bug#9557 MyISAM utf8 table crash
# #
......
...@@ -79,6 +79,7 @@ NdbOut& operator<<(NdbOut& no, const CommitTransactionRecord& ctr) { ...@@ -79,6 +79,7 @@ NdbOut& operator<<(NdbOut& no, const CommitTransactionRecord& ctr) {
no << "----------COMMIT TRANSACTION RECORD------------" << endl << endl; no << "----------COMMIT TRANSACTION RECORD------------" << endl << endl;
printOut("Record type:", ctr.m_recordType); printOut("Record type:", ctr.m_recordType);
printOut("TableId", ctr.m_tableId); printOut("TableId", ctr.m_tableId);
printOut("SchemaVersion:", ctr.m_schemaVersion);
printOut("FfragmentId", ctr.m_fragmentId); printOut("FfragmentId", ctr.m_fragmentId);
printOut("File no. of Prep. Op.", ctr.m_fileNumberOfPrepareOperation); printOut("File no. of Prep. Op.", ctr.m_fileNumberOfPrepareOperation);
printOut("Start page no. of Prep. Op.", ctr.m_startPageNumberOfPrepareOperation); printOut("Start page no. of Prep. Op.", ctr.m_startPageNumberOfPrepareOperation);
...@@ -127,7 +128,7 @@ bool PrepareOperationRecord::check() { ...@@ -127,7 +128,7 @@ bool PrepareOperationRecord::check() {
if (m_operationType == 3 && m_attributeLength != 0) if (m_operationType == 3 && m_attributeLength != 0)
return false; return false;
if (m_logRecordSize != (m_attributeLength + m_keyLength + 7)) if (m_logRecordSize != (m_attributeLength + m_keyLength + 6))
return false; return false;
return true; return true;
...@@ -142,7 +143,6 @@ NdbOut& operator<<(NdbOut& no, const PrepareOperationRecord& por) { ...@@ -142,7 +143,6 @@ NdbOut& operator<<(NdbOut& no, const PrepareOperationRecord& por) {
printOut("Record type:", por.m_recordType); printOut("Record type:", por.m_recordType);
printOut("logRecordSize:", por.m_logRecordSize); printOut("logRecordSize:", por.m_logRecordSize);
printOut("hashValue:", por.m_hashValue); printOut("hashValue:", por.m_hashValue);
printOut("schemaVersion:", por.m_schemaVersion);
switch (por.m_operationType) { switch (por.m_operationType) {
case 0: case 0:
ndbout_c("%-30s%-12u%-6s", "operationType:", ndbout_c("%-30s%-12u%-6s", "operationType:",
......
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
#define NO_PAGES_IN_MBYTE 32 #define NO_PAGES_IN_MBYTE 32
#define NO_MBYTE_IN_FILE 16 #define NO_MBYTE_IN_FILE 16
#define COMMITTRANSACTIONRECORDSIZE 8 #define COMMITTRANSACTIONRECORDSIZE 9
#define COMPLETEDGCIRECORDSIZE 2 #define COMPLETEDGCIRECORDSIZE 2
#define PAGEHEADERSIZE 32 #define PAGEHEADERSIZE 32
#define FILEDESCRIPTORHEADERSIZE 3 #define FILEDESCRIPTORHEADERSIZE 3
...@@ -89,7 +89,6 @@ protected: ...@@ -89,7 +89,6 @@ protected:
Uint32 m_recordType; Uint32 m_recordType;
Uint32 m_logRecordSize; Uint32 m_logRecordSize;
Uint32 m_hashValue; Uint32 m_hashValue;
Uint32 m_schemaVersion;
Uint32 m_operationType; // 0 READ, 1 UPDATE, 2 INSERT, 3 DELETE Uint32 m_operationType; // 0 READ, 1 UPDATE, 2 INSERT, 3 DELETE
Uint32 m_attributeLength; Uint32 m_attributeLength;
Uint32 m_keyLength; Uint32 m_keyLength;
...@@ -190,6 +189,7 @@ public: ...@@ -190,6 +189,7 @@ public:
protected: protected:
Uint32 m_recordType; Uint32 m_recordType;
Uint32 m_tableId; Uint32 m_tableId;
Uint32 m_schemaVersion;
Uint32 m_fragmentId; Uint32 m_fragmentId;
Uint32 m_fileNumberOfPrepareOperation; Uint32 m_fileNumberOfPrepareOperation;
Uint32 m_startPageNumberOfPrepareOperation; Uint32 m_startPageNumberOfPrepareOperation;
......
...@@ -105,6 +105,7 @@ NDB_COMMAND(redoLogFileReader, "redoLogFileReader", "redoLogFileReader", "Read ...@@ -105,6 +105,7 @@ NDB_COMMAND(redoLogFileReader, "redoLogFileReader", "redoLogFileReader", "Read
if (thePrintFlag) ndbout << (*thePageHeader); if (thePrintFlag) ndbout << (*thePageHeader);
if (theCheckFlag) { if (theCheckFlag) {
if(!thePageHeader->check()) { if(!thePageHeader->check()) {
ndbout << "Error in thePageHeader->check()" << endl;
doExit(); doExit();
} }
...@@ -146,6 +147,7 @@ NDB_COMMAND(redoLogFileReader, "redoLogFileReader", "redoLogFileReader", "Read ...@@ -146,6 +147,7 @@ NDB_COMMAND(redoLogFileReader, "redoLogFileReader", "redoLogFileReader", "Read
if (thePrintFlag) ndbout << (*fdRecord); if (thePrintFlag) ndbout << (*fdRecord);
if (theCheckFlag) { if (theCheckFlag) {
if(!fdRecord->check()) { if(!fdRecord->check()) {
ndbout << "Error in fdRecord->check()" << endl;
doExit(); doExit();
} }
} }
...@@ -163,6 +165,7 @@ NDB_COMMAND(redoLogFileReader, "redoLogFileReader", "redoLogFileReader", "Read ...@@ -163,6 +165,7 @@ NDB_COMMAND(redoLogFileReader, "redoLogFileReader", "redoLogFileReader", "Read
if (thePrintFlag) ndbout << (*nlRecord); if (thePrintFlag) ndbout << (*nlRecord);
if (theCheckFlag) { if (theCheckFlag) {
if(!nlRecord->check()) { if(!nlRecord->check()) {
ndbout << "Error in nlRecord->check()" << endl;
doExit(); doExit();
} }
} }
...@@ -176,6 +179,7 @@ NDB_COMMAND(redoLogFileReader, "redoLogFileReader", "redoLogFileReader", "Read ...@@ -176,6 +179,7 @@ NDB_COMMAND(redoLogFileReader, "redoLogFileReader", "redoLogFileReader", "Read
if (thePrintFlag) ndbout << (*cGCIrecord); if (thePrintFlag) ndbout << (*cGCIrecord);
if (theCheckFlag) { if (theCheckFlag) {
if(!cGCIrecord->check()) { if(!cGCIrecord->check()) {
ndbout << "Error in cGCIrecord->check()" << endl;
doExit(); doExit();
} }
} }
...@@ -189,6 +193,7 @@ NDB_COMMAND(redoLogFileReader, "redoLogFileReader", "redoLogFileReader", "Read ...@@ -189,6 +193,7 @@ NDB_COMMAND(redoLogFileReader, "redoLogFileReader", "redoLogFileReader", "Read
if (thePrintFlag) ndbout << (*poRecord); if (thePrintFlag) ndbout << (*poRecord);
if (theCheckFlag) { if (theCheckFlag) {
if(!poRecord->check()) { if(!poRecord->check()) {
ndbout << "Error in poRecord->check()" << endl;
doExit(); doExit();
} }
} }
...@@ -205,6 +210,7 @@ NDB_COMMAND(redoLogFileReader, "redoLogFileReader", "redoLogFileReader", "Read ...@@ -205,6 +210,7 @@ NDB_COMMAND(redoLogFileReader, "redoLogFileReader", "redoLogFileReader", "Read
if (thePrintFlag) ndbout << (*ctRecord); if (thePrintFlag) ndbout << (*ctRecord);
if (theCheckFlag) { if (theCheckFlag) {
if(!ctRecord->check()) { if(!ctRecord->check()) {
ndbout << "Error in ctRecord->check()" << endl;
doExit(); doExit();
} }
} }
...@@ -221,6 +227,7 @@ NDB_COMMAND(redoLogFileReader, "redoLogFileReader", "redoLogFileReader", "Read ...@@ -221,6 +227,7 @@ NDB_COMMAND(redoLogFileReader, "redoLogFileReader", "redoLogFileReader", "Read
if (thePrintFlag) ndbout << (*ictRecord); if (thePrintFlag) ndbout << (*ictRecord);
if (theCheckFlag) { if (theCheckFlag) {
if(!ictRecord->check()) { if(!ictRecord->check()) {
ndbout << "Error in ictRecord->check()" << endl;
doExit(); doExit();
} }
} }
...@@ -243,6 +250,7 @@ NDB_COMMAND(redoLogFileReader, "redoLogFileReader", "redoLogFileReader", "Read ...@@ -243,6 +250,7 @@ NDB_COMMAND(redoLogFileReader, "redoLogFileReader", "redoLogFileReader", "Read
if (thePrintFlag) ndbout << (*atRecord); if (thePrintFlag) ndbout << (*atRecord);
if (theCheckFlag) { if (theCheckFlag) {
if(!atRecord->check()) { if(!atRecord->check()) {
ndbout << "Error in atRecord->check()" << endl;
doExit(); doExit();
} }
} }
...@@ -329,6 +337,7 @@ Uint32 readRecordOverPageBoundary(Uint32 *pagePtr, Uint32 pageIndex, Uint32 old ...@@ -329,6 +337,7 @@ Uint32 readRecordOverPageBoundary(Uint32 *pagePtr, Uint32 pageIndex, Uint32 old
if (recordSize < (PAGESIZE - PAGEHEADERSIZE)) { if (recordSize < (PAGESIZE - PAGEHEADERSIZE)) {
if (theCheckFlag) { if (theCheckFlag) {
if(!poRecord->check()) { if(!poRecord->check()) {
ndbout << "Error in poRecord->check() (readRecordOverPageBoundary)" << endl;
doExit(); doExit();
} }
} }
...@@ -344,6 +353,7 @@ Uint32 readRecordOverPageBoundary(Uint32 *pagePtr, Uint32 pageIndex, Uint32 old ...@@ -344,6 +353,7 @@ Uint32 readRecordOverPageBoundary(Uint32 *pagePtr, Uint32 pageIndex, Uint32 old
if (recordSize < (PAGESIZE - PAGEHEADERSIZE)) { if (recordSize < (PAGESIZE - PAGEHEADERSIZE)) {
if (theCheckFlag) { if (theCheckFlag) {
if(!ctRecord->check()) { if(!ctRecord->check()) {
ndbout << "Error in ctRecord->check() (readRecordOverPageBoundary)" << endl;
doExit(); doExit();
} }
} }
...@@ -359,6 +369,7 @@ Uint32 readRecordOverPageBoundary(Uint32 *pagePtr, Uint32 pageIndex, Uint32 old ...@@ -359,6 +369,7 @@ Uint32 readRecordOverPageBoundary(Uint32 *pagePtr, Uint32 pageIndex, Uint32 old
if (recordSize < (PAGESIZE - PAGEHEADERSIZE)) { if (recordSize < (PAGESIZE - PAGEHEADERSIZE)) {
if (theCheckFlag) { if (theCheckFlag) {
if(!ictRecord->check()) { if(!ictRecord->check()) {
ndbout << "Error in ictRecord->check() (readRecordOverPageBoundary)" << endl;
doExit(); doExit();
} }
} }
......
...@@ -284,6 +284,32 @@ Item *Item_string::safe_charset_converter(CHARSET_INFO *tocs) ...@@ -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 bool Item_string::eq(const Item *item, bool binary_cmp) const
{ {
if (type() == item->type() && item->basic_const_item()) if (type() == item->type() && item->basic_const_item())
......
...@@ -618,6 +618,7 @@ public: ...@@ -618,6 +618,7 @@ public:
basic_const_item returned TRUE. basic_const_item returned TRUE.
*/ */
Item *new_item(); Item *new_item();
Item *safe_charset_converter(CHARSET_INFO *tocs);
/* /*
Implement by-value equality evaluation if parameter value Implement by-value equality evaluation if parameter value
is set and is a basic constant (integer, real or string). 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