mirror of
https://github.com/glebarez/sqlite.git
synced 2025-10-05 23:56:59 +08:00
Fix QuoteTo
This commit is contained in:
53
sqlite.go
53
sqlite.go
@@ -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("`")
|
||||||
|
}
|
||||||
|
writer.WriteByte(v)
|
||||||
|
continue
|
||||||
|
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)
|
||||||
}
|
}
|
||||||
} else {
|
shiftDelimiter++
|
||||||
writer.WriteString(str)
|
|
||||||
writer.WriteByte('`')
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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 {
|
||||||
|
Reference in New Issue
Block a user