Skip to content

Commit

Permalink
Skip db name parsing if mts_accessed_dbs == 254 (#369)
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
dongwook-chan authored Apr 8, 2022
1 parent 7fd706d commit c2b8f35
Showing 1 changed file with 11 additions and 0 deletions.
11 changes: 11 additions & 0 deletions pymysqlreplication/event.py
Original file line number Diff line number Diff line change
Expand Up @@ -257,6 +257,17 @@ def _read_status_vars_value_for_key(self, key):
self.host = self.packet.read(host_len)
elif key == Q_UPDATED_DB_NAMES: # 0x0C
mts_accessed_dbs = self.packet.read_uint8()
"""
mts_accessed_dbs < 254:
`mts_accessed_dbs` is equal to the number of dbs
acessed by the query event.
mts_accessed_dbs == 254:
This is the case where the number of dbs accessed
is 1 and the name of the only db is ""
Since no further parsing required(empty name), return.
"""
if mts_accessed_dbs == 254:
return
dbs = []
for i in range(mts_accessed_dbs):
db = self.packet.read_string()
Expand Down

0 comments on commit c2b8f35

Please sign in to comment.