From 9aaf95c0eb3d154bce19edb4ccfbba89ca49231d Mon Sep 17 00:00:00 2001 From: Nikolai Antonov Date: Tue, 18 Jan 2022 22:29:30 +0300 Subject: [PATCH] Add MysqlGTIDSet.Add() and Minus() methods * fix off-by-one error --- mysql/mysql_gtid.go | 27 ++++++++++++--------------- mysql/mysql_test.go | 3 +++ 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/mysql/mysql_gtid.go b/mysql/mysql_gtid.go index 2a10ae257..623278281 100644 --- a/mysql/mysql_gtid.go +++ b/mysql/mysql_gtid.go @@ -5,6 +5,7 @@ import ( "encoding/binary" "fmt" "io" + "math" "sort" "strconv" "strings" @@ -234,11 +235,15 @@ func (s *UUIDSet) MinusInterval(in IntervalSlice) { i, j := 0, 0 var minuend Interval var subtrahend Interval - for j < len(in) && i < len(s.Intervals) { + for i < len(s.Intervals) { if minuend.Stop != s.Intervals[i].Stop { // `i` changed? minuend = s.Intervals[i] } - subtrahend = in[j] + if j < len(in) { + subtrahend = in[j] + } else { + subtrahend = Interval{math.MaxInt64, math.MaxInt64} + } if minuend.Stop <= subtrahend.Start { // no overlapping @@ -248,33 +253,25 @@ func (s *UUIDSet) MinusInterval(in IntervalSlice) { // no overlapping j++ } else { - if minuend.Start < subtrahend.Start && minuend.Stop < subtrahend.Stop { + if minuend.Start < subtrahend.Start && minuend.Stop <= subtrahend.Stop { n = append(n, Interval{minuend.Start, subtrahend.Start}) i++ - } else if minuend.Start > subtrahend.Start && minuend.Stop > subtrahend.Stop { + } else if minuend.Start >= subtrahend.Start && minuend.Stop > subtrahend.Stop { minuend = Interval{subtrahend.Stop, minuend.Stop} j++ } else if minuend.Start >= subtrahend.Start && minuend.Stop <= subtrahend.Stop { // minuend is completely removed i++ - } else { + } else if minuend.Start < subtrahend.Start && minuend.Stop > subtrahend.Stop { n = append(n, Interval{minuend.Start, subtrahend.Start}) minuend = Interval{subtrahend.Stop, minuend.Stop} j++ + } else { + panic("should never be here") } } } - lastSub := in[len(in)-1] - for ; i < len(s.Intervals); i++ { - minuend = s.Intervals[i] - if minuend.Start < lastSub.Stop { - n = append(n, Interval{lastSub.Stop, minuend.Stop}) - } else { - n = append(n, s.Intervals[i]) - } - } - s.Intervals = n.Normalize() } diff --git a/mysql/mysql_test.go b/mysql/mysql_test.go index 62b24f758..ca7172ffe 100644 --- a/mysql/mysql_test.go +++ b/mysql/mysql_test.go @@ -180,6 +180,9 @@ func (t *mysqlTestSuite) TestMysqlGTIDMinus(c *check.C) { {"3E11FA47-71CA-11E1-9E33-C80AA9429562:20-57:60-90", "3E11FA47-71CA-11E1-9E33-C80AA9429562:23", "3E11FA47-71CA-11E1-9E33-C80AA9429562:20-22:24-57:60-90"}, {"3E11FA47-71CA-11E1-9E33-C80AA9429562:20-57:60-90", "3E11FA47-71CA-11E1-9E33-C80AA9429562:22-70", "3E11FA47-71CA-11E1-9E33-C80AA9429562:20-21:71-90"}, {"3E11FA47-71CA-11E1-9E33-C80AA9429562:28-57", "3E11FA47-71CA-11E1-9E33-C80AA9429562:28-57", ""}, + {"3E11FA47-71CA-11E1-9E33-C80AA9429562:20-21", "3E11FA47-71CA-11E1-9E33-C80AA9429562:21", "3E11FA47-71CA-11E1-9E33-C80AA9429562:20"}, + {"582A11ED-786C-11EC-ACCC-E0356662B76E:1-209692", "582A11ED-786C-11EC-ACCC-E0356662B76E:1-146519", "582A11ED-786C-11EC-ACCC-E0356662B76E:146520-209692"}, + {"582A11ED-786C-11EC-ACCC-E0356662B76E:1-209692", "582A11ED-786C-11EC-ACCC-E0356662B76E:2-146519", "582A11ED-786C-11EC-ACCC-E0356662B76E:1:146520-209692"}, } for _, tc := range testCases {