summaryrefslogtreecommitdiff
path: root/sql/log_event.cc
diff options
context:
space:
mode:
authorunknown <gbichot@production.mysql.com>2005-03-29 17:26:38 +0200
committerunknown <gbichot@production.mysql.com>2005-03-29 17:26:38 +0200
commit0f3183cc38dbe2283cf01130bfd455f728b4bf6e (patch)
tree8cff12ae63ec47203661b5e369092699891011f9 /sql/log_event.cc
parent8b6b6d2c49e24479d6b189bb6b989113c667246e (diff)
downloadmariadb-git-0f3183cc38dbe2283cf01130bfd455f728b4bf6e.tar.gz
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).
Diffstat (limited to 'sql/log_event.cc')
-rw-r--r--sql/log_event.cc32
1 files changed, 24 insertions, 8 deletions
diff --git a/sql/log_event.cc b/sql/log_event.cc
index cf145e33d1e..0747e2740a3 100644
--- a/sql/log_event.cc
+++ b/sql/log_event.cc
@@ -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
Q_AUTO_INCREMENT*, Q_CHARSET and so replication will fail silently in
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
- 5.0.3<->5.0.4. If replication is from older to new, the new won't find
- the catalog and will have the same problems.
+ they are not exactly the same version, with example of 5.0.3->5.0.2 and
+ 5.0.4->5.0.3. If replication is from older to new, the new will
+ recognize Q_CATALOG_CODE and have no problem.
*/
}
if (auto_increment_increment != 1)
@@ -1195,6 +1195,7 @@ Query_log_event::Query_log_event(const char* buf, uint event_len,
uint8 common_header_len, post_header_len;
char *start;
const char *end;
+ bool catalog_nz= 1;
DBUG_ENTER("Query_log_event::Query_log_event(char*,...)");
common_header_len= description_event->common_header_len;
@@ -1286,11 +1287,17 @@ Query_log_event::Query_log_event(const char* buf, uint event_len,
pos+= time_zone_len+1;
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:
/* 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\
code: %u), skipping the rest of them", (uint) *(pos-1)));
- pos= (const uchar*) end; // Break look
+ pos= (const uchar*) end; // Break loop
}
}
@@ -1300,10 +1307,19 @@ Query_log_event::Query_log_event(const char* buf, uint event_len,
DBUG_VOID_RETURN;
if (catalog_len) // If catalog is given
{
- memcpy(start, catalog, catalog_len);
- catalog= start;
- start+= catalog_len;
- *start++= 0;
+ if (likely(catalog_nz)) // true except if event comes from 5.0.0|1|2|3.
+ {
+ memcpy(start, catalog, catalog_len);
+ catalog= start;
+ start+= catalog_len;
+ *start++= 0;
+ }
+ else
+ {
+ memcpy(start, catalog, catalog_len+1); // copy end 0
+ catalog= start;
+ start+= catalog_len+1;
+ }
}
if (time_zone_len)
{