Commit 0f3183cc authored by unknown's avatar unknown

making Q_CATALOG_CODE be understood by 5.0.4 slave, so that 5.0.3->5.0.4 repl...

making Q_CATALOG_CODE be understood by 5.0.4 slave, so that 5.0.3->5.0.4 repl can work (but 5.0.4->5.0.3 won't).


parent 8b6b6d2c
...@@ -1059,9 +1059,9 @@ bool Query_log_event::write(IO_CACHE* file) ...@@ -1059,9 +1059,9 @@ bool Query_log_event::write(IO_CACHE* file)
sees unknown Q_CATALOG_NZ_CODE; so it will not be able to read sees unknown Q_CATALOG_NZ_CODE; so it will not be able to read
Q_AUTO_INCREMENT*, Q_CHARSET and so replication will fail silently in Q_AUTO_INCREMENT*, Q_CHARSET and so replication will fail silently in
various ways. Documented that you should not mix alpha/beta versions if various ways. Documented that you should not mix alpha/beta versions if
they are not exactly the same version, with example of 5.0.2<->5.0.3 and they are not exactly the same version, with example of 5.0.3->5.0.2 and
5.0.3<->5.0.4. If replication is from older to new, the new won't find 5.0.4->5.0.3. If replication is from older to new, the new will
the catalog and will have the same problems. recognize Q_CATALOG_CODE and have no problem.
*/ */
} }
if (auto_increment_increment != 1) if (auto_increment_increment != 1)
...@@ -1195,6 +1195,7 @@ Query_log_event::Query_log_event(const char* buf, uint event_len, ...@@ -1195,6 +1195,7 @@ Query_log_event::Query_log_event(const char* buf, uint event_len,
uint8 common_header_len, post_header_len; uint8 common_header_len, post_header_len;
char *start; char *start;
const char *end; const char *end;
bool catalog_nz= 1;
DBUG_ENTER("Query_log_event::Query_log_event(char*,...)"); DBUG_ENTER("Query_log_event::Query_log_event(char*,...)");
common_header_len= description_event->common_header_len; common_header_len= description_event->common_header_len;
...@@ -1286,11 +1287,17 @@ Query_log_event::Query_log_event(const char* buf, uint event_len, ...@@ -1286,11 +1287,17 @@ Query_log_event::Query_log_event(const char* buf, uint event_len,
pos+= time_zone_len+1; pos+= time_zone_len+1;
break; break;
} }
case Q_CATALOG_CODE: /* for 5.0.x where 0<=x<=3 masters */
if ((catalog_len= *pos))
catalog= (char*) pos+1; // Will be copied later
pos+= catalog_len+2; // leap over end 0
catalog_nz= 0; // catalog has end 0 in event
break;
default: default:
/* That's why you must write status vars in growing order of code */ /* That's why you must write status vars in growing order of code */
DBUG_PRINT("info",("Query_log_event has unknown status vars (first has\ DBUG_PRINT("info",("Query_log_event has unknown status vars (first has\
code: %u), skipping the rest of them", (uint) *(pos-1))); code: %u), skipping the rest of them", (uint) *(pos-1)));
pos= (const uchar*) end; // Break look pos= (const uchar*) end; // Break loop
} }
} }
...@@ -1299,12 +1306,21 @@ Query_log_event::Query_log_event(const char* buf, uint event_len, ...@@ -1299,12 +1306,21 @@ Query_log_event::Query_log_event(const char* buf, uint event_len,
data_len + 1, MYF(MY_WME)))) data_len + 1, MYF(MY_WME))))
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
if (catalog_len) // If catalog is given if (catalog_len) // If catalog is given
{
if (likely(catalog_nz)) // true except if event comes from 5.0.0|1|2|3.
{ {
memcpy(start, catalog, catalog_len); memcpy(start, catalog, catalog_len);
catalog= start; catalog= start;
start+= catalog_len; start+= catalog_len;
*start++= 0; *start++= 0;
} }
else
{
memcpy(start, catalog, catalog_len+1); // copy end 0
catalog= start;
start+= catalog_len+1;
}
}
if (time_zone_len) if (time_zone_len)
{ {
memcpy(start, time_zone_str, time_zone_len); memcpy(start, time_zone_str, time_zone_len);
......
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