Skip to content

Commit 04f7d97

Browse files
fix
1 parent d168754 commit 04f7d97

File tree

1 file changed

+47
-0
lines changed

1 file changed

+47
-0
lines changed

replication/row_event.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1363,8 +1363,55 @@ func supportsSmartQuotes(enc encoding.Encoding) bool {
13631363
return false
13641364
}
13651365

1366+
func replaceUnsupportedCharacters(data []byte, length int) []byte {
1367+
if len(data) == 0 {
1368+
return data
1369+
}
1370+
1371+
var content []byte
1372+
var prefix []byte
1373+
var contentLength int
1374+
var prefixLen int
1375+
1376+
if length > 255 {
1377+
// 2-byte length prefix (LittleEndian)
1378+
prefixLen = 2
1379+
contentLength = int(binary.LittleEndian.Uint16(data[:2]))
1380+
if contentLength > len(data)-prefixLen {
1381+
contentLength = len(data) - prefixLen
1382+
}
1383+
content = data[prefixLen : prefixLen+contentLength]
1384+
} else {
1385+
// 1-byte length prefix
1386+
prefixLen = 1
1387+
contentLength = int(data[0])
1388+
if contentLength > len(data)-prefixLen {
1389+
contentLength = len(data) - prefixLen
1390+
}
1391+
content = data[prefixLen : prefixLen+contentLength]
1392+
}
1393+
1394+
// Replace unsupported characters
1395+
content = normalizeSmartQuotes(content)
1396+
1397+
// Rebuild prefix with new length
1398+
if prefixLen == 2 {
1399+
prefix = make([]byte, 2)
1400+
binary.LittleEndian.PutUint16(prefix, uint16(len(content)))
1401+
} else {
1402+
prefix = []byte{byte(len(content))}
1403+
}
1404+
1405+
return append(prefix, content...)
1406+
}
1407+
13661408
func decodeStringWithEncoder(data []byte, length int, enc encoding.Encoding) (v string, n int) {
1409+
// Define the Latin1 decoder
13671410
decoder := enc.NewDecoder()
1411+
if !supportsSmartQuotes(enc) {
1412+
data = replaceUnsupportedCharacters(data, length)
1413+
}
1414+
13681415
if length < 256 {
13691416
// If the length is smaller than 256, extract the length from the first byte
13701417
length = int(data[0])

0 commit comments

Comments
 (0)