Fix QuoteTo

This commit is contained in:
Jinzhu
2023-08-16 17:47:56 +08:00
parent 397ec6fa8c
commit af1b82215d

View File

@@ -4,7 +4,6 @@ import (
"context" "context"
"database/sql" "database/sql"
"strconv" "strconv"
"strings"
"gorm.io/gorm/callbacks" "gorm.io/gorm/callbacks"
@@ -143,19 +142,51 @@ func (dialector Dialector) BindVarTo(writer clause.Writer, stmt *gorm.Statement,
} }
func (dialector Dialector) QuoteTo(writer clause.Writer, str string) { func (dialector Dialector) QuoteTo(writer clause.Writer, str string) {
writer.WriteByte('`') var (
if strings.Contains(str, ".") { underQuoted, selfQuoted bool
for idx, str := range strings.Split(str, ".") { continuousBacktick int8
if idx > 0 { shiftDelimiter int8
writer.WriteString(".`") )
for _, v := range []byte(str) {
switch v {
case '`':
continuousBacktick++
if continuousBacktick == 2 {
writer.WriteString("``")
continuousBacktick = 0
} }
writer.WriteString(str) case '.':
writer.WriteByte('`') if continuousBacktick > 0 || !selfQuoted {
shiftDelimiter = 0
underQuoted = false
continuousBacktick = 0
writer.WriteString("`")
} }
} else { writer.WriteByte(v)
writer.WriteString(str) continue
writer.WriteByte('`') default:
if shiftDelimiter-continuousBacktick <= 0 && !underQuoted {
writer.WriteString("`")
underQuoted = true
if selfQuoted = continuousBacktick > 0; selfQuoted {
continuousBacktick -= 1
} }
}
for ; continuousBacktick > 0; continuousBacktick -= 1 {
writer.WriteString("``")
}
writer.WriteByte(v)
}
shiftDelimiter++
}
if continuousBacktick > 0 && !selfQuoted {
writer.WriteString("``")
}
writer.WriteString("`")
} }
func (dialector Dialector) Explain(sql string, vars ...interface{}) string { func (dialector Dialector) Explain(sql string, vars ...interface{}) string {