diff --git a/filter.go b/filter.go index aeea1223..7079b822 100644 --- a/filter.go +++ b/filter.go @@ -70,15 +70,30 @@ type SeqFilter struct { Start int } -func (s *SeqFilter) Do(sql string, dialect Dialect, table *Table) string { - segs := strings.Split(sql, "?") - size := len(segs) - res := "" - for i, c := range segs { - if i < size-1 { - res += c + fmt.Sprintf("%s%v", s.Prefix, i+s.Start) +func convertQuestionMark(sql, prefix string, start int) string { + var buf strings.Builder + var beginSingleQuote bool + var beginTransfer bool + var index = start + for _, c := range sql { + if !beginSingleQuote && c == '?' { + buf.WriteString(fmt.Sprintf("%s%v", prefix, index)) + index++ + } else { + if c == '\\' { + beginTransfer = true + } else { + if !beginTransfer && c == '\'' { + beginSingleQuote = !beginSingleQuote + } + beginTransfer = false + } + buf.WriteRune(c) } } - res += segs[size-1] - return res + return buf.String() +} + +func (s *SeqFilter) Do(sql string, dialect Dialect, table *Table) string { + return convertQuestionMark(sql, s.Prefix, s.Start) } diff --git a/filter_test.go b/filter_test.go index c9d836b9..54a1cf6a 100644 --- a/filter_test.go +++ b/filter_test.go @@ -23,3 +23,14 @@ func TestQuoteFilter_Do(t *testing.T) { res, ) } + +func TestSeqFilter(t *testing.T) { + var kases = map[string]string{ + "SELECT * FROM TABLE1 WHERE a=? AND b=?": "SELECT * FROM TABLE1 WHERE a=$1 AND b=$2", + "SELECT 1, '???', '2006-01-02 15:04:05' FROM TABLE1 WHERE a=? AND b=?": "SELECT 1, '???', '2006-01-02 15:04:05' FROM TABLE1 WHERE a=$1 AND b=$2", + "select '1\\'?' from issue": "select '1\\'?' from issue", + } + for sql, result := range kases { + assert.EqualValues(t, result, convertQuestionMark(sql, "$", 1)) + } +}