Skip to content

Commit c2b8f35

Browse files
Skip db name parsing if mts_accessed_dbs == 254 (#369)
I interpreted `mts_accessed_dbs` as db count in PR#360 (released in 0.27). However after reproducing kvitek's exception in Issue#278, I did some more research how it is set: https://github.com/mysql/mysql-server/blob/6846e6b2f72931991cc9fd589dc9946ea2ab58c9/sql/log_event.cc#L3598-L3602 (log_event.h /log_event.cc is responsible for writing low-level binlog, according to https://dev.mysql.com/doc/internals/en/source-files-related-to-the-binary-log.html) Turns out that if the value of the variables equals 254, the variable is no longer interpreted as the db count, but represent a following case: 1. db count equals 1 2. The name of the only db is blank. Therefore, I edited event.py so that after the value 254 is encountered, no further parsing is done regarding db names. So far I have reproduced the issue for `BeginEvent`. However, I have not yet figured out to incorporate into unittest. I will add tests ASAP.
1 parent 7fd706d commit c2b8f35

File tree

1 file changed

+11
-0
lines changed

1 file changed

+11
-0
lines changed

pymysqlreplication/event.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,17 @@ def _read_status_vars_value_for_key(self, key):
257257
self.host = self.packet.read(host_len)
258258
elif key == Q_UPDATED_DB_NAMES: # 0x0C
259259
mts_accessed_dbs = self.packet.read_uint8()
260+
"""
261+
mts_accessed_dbs < 254:
262+
`mts_accessed_dbs` is equal to the number of dbs
263+
acessed by the query event.
264+
mts_accessed_dbs == 254:
265+
This is the case where the number of dbs accessed
266+
is 1 and the name of the only db is ""
267+
Since no further parsing required(empty name), return.
268+
"""
269+
if mts_accessed_dbs == 254:
270+
return
260271
dbs = []
261272
for i in range(mts_accessed_dbs):
262273
db = self.packet.read_string()

0 commit comments

Comments
 (0)