This commit is contained in:
Lunny Xiao 2020-02-24 23:57:03 +08:00
parent dd8dc7dd2c
commit 499098db4e
No known key found for this signature in database
GPG Key ID: C3B7C91B632F738A
4 changed files with 77 additions and 6 deletions

View File

@ -22,7 +22,24 @@ type QuoteFilter struct {
func (s *QuoteFilter) Do(sql string, dialect Dialect, table *schemas.Table) string {
quoter := dialect.Quoter()
return quoter.Quote(sql)
if quoter.IsEmpty() {
return sql
}
prefix, suffix := quoter[0][0], quoter[1][0]
raw := []byte(sql)
for i, cnt := 0, 0; i < len(raw); i = i + 1 {
if raw[i] == '`' {
if cnt%2 == 0 {
raw[i] = prefix
} else {
raw[i] = suffix
}
cnt++
}
}
return string(raw)
}
// SeqFilter filter SQL replace ?, ? ... to $1, $2 ...

View File

@ -193,10 +193,7 @@ func (engine *Engine) SupportInsertMany() bool {
func (engine *Engine) quoteColumns(columnStr string) string {
columns := strings.Split(columnStr, ",")
for i := 0; i < len(columns); i++ {
columns[i] = engine.Quote(strings.TrimSpace(columns[i]))
}
return strings.Join(columns, ",")
return engine.dialect.Quoter().Join(columns, ",")
}
// Quote Use QuoteStr quote the string sql

View File

@ -5,6 +5,7 @@
package schemas
import (
"fmt"
"strings"
)
@ -24,6 +25,37 @@ func (q Quoter) Quote(s string) string {
return buf.String()
}
func (q Quoter) Replace(sql string, newQuoter Quoter) string {
if q.IsEmpty() {
return sql
}
if newQuoter.IsEmpty() {
var buf strings.Builder
for i := 0; i < len(sql); i = i + 1 {
if sql[i] != q[0][0] && sql[i] != q[1][0] {
_ = buf.WriteByte(sql[i])
}
}
return buf.String()
}
prefix, suffix := newQuoter[0][0], newQuoter[1][0]
var buf strings.Builder
for i, cnt := 0, 0; i < len(sql); i = i + 1 {
if cnt == 0 && sql[i] == q[0][0] {
_ = buf.WriteByte(prefix)
cnt = 1
} else if cnt == 1 && sql[i] == q[1][0] {
_ = buf.WriteByte(suffix)
cnt = 0
} else {
_ = buf.WriteByte(sql[i])
}
}
return buf.String()
}
func (q Quoter) ReverseQuote(s string) string {
reverseQuoter := Quoter{q[1], q[0]}
return reverseQuoter.Quote(s)
@ -44,8 +76,31 @@ func (q Quoter) Trim(s string) string {
return s
}
func TrimSpaceJoin(a []string, sep string) string {
switch len(a) {
case 0:
return ""
case 1:
return a[0]
}
n := len(sep) * (len(a) - 1)
for i := 0; i < len(a); i++ {
n += len(a[i])
}
var b strings.Builder
b.Grow(n)
b.WriteString(strings.TrimSpace(a[0]))
for _, s := range a[1:] {
b.WriteString(sep)
b.WriteString(strings.TrimSpace(s))
}
return b.String()
}
func (q Quoter) Join(s []string, splitter string) string {
return q.Quote(strings.Join(s, q.ReverseQuote(splitter)))
//return fmt.Sprintf("%s%s%s", q[0], TrimSpaceJoin(s, fmt.Sprintf("%s%s%s", q[1], splitter, q[0])), q[1])
return q.Quote(TrimSpaceJoin(s, fmt.Sprintf("%s%s%s", q[1], splitter, q[0])))
}
func (q Quoter) QuoteTo(buf *strings.Builder, value string) {

View File

@ -38,6 +38,8 @@ func TestQuoteTo(t *testing.T) {
test(t, "[message_user] AS [sender]", "`message_user` AS `sender`")
assert.EqualValues(t, "[a],[b]", quoter.Join([]string{"a", " b"}, ","))
buf := &strings.Builder{}
quoter = Quoter{"", ""}
quoter.QuoteTo(buf, "noquote")