diff options
Diffstat (limited to 'vendor/xorm.io/xorm/engine.go')
-rw-r--r-- | vendor/xorm.io/xorm/engine.go | 47 |
1 files changed, 34 insertions, 13 deletions
diff --git a/vendor/xorm.io/xorm/engine.go b/vendor/xorm.io/xorm/engine.go index 4ed0f77a92..a7e52ea484 100644 --- a/vendor/xorm.io/xorm/engine.go +++ b/vendor/xorm.io/xorm/engine.go @@ -207,25 +207,46 @@ func (engine *Engine) QuoteTo(buf *strings.Builder, value string) { return } - quotePair := engine.dialect.Quote("") + quoteTo(buf, engine.dialect.Quote(""), value) +} - if value[0] == '`' || len(quotePair) < 2 || value[0] == quotePair[0] { // no quote +func quoteTo(buf *strings.Builder, quotePair string, value string) { + if len(quotePair) < 2 { // no quote _, _ = buf.WriteString(value) return - } else { - prefix, suffix := quotePair[0], quotePair[1] - - _ = buf.WriteByte(prefix) - for i := 0; i < len(value); i++ { - if value[i] == '.' { - _ = buf.WriteByte(suffix) - _ = buf.WriteByte('.') - _ = buf.WriteByte(prefix) + } + + prefix, suffix := quotePair[0], quotePair[1] + + i := 0 + for i < len(value) { + // start of a token; might be already quoted + if value[i] == '.' { + _ = buf.WriteByte('.') + i++ + } else if value[i] == prefix || value[i] == '`' { + // Has quotes; skip/normalize `name` to prefix+name+sufix + var ch byte + if value[i] == prefix { + ch = suffix } else { + ch = '`' + } + i++ + _ = buf.WriteByte(prefix) + for ; i < len(value) && value[i] != ch; i++ { + _ = buf.WriteByte(value[i]) + } + _ = buf.WriteByte(suffix) + i++ + } else { + // Requires quotes + _ = buf.WriteByte(prefix) + for ; i < len(value) && value[i] != '.'; i++ { _ = buf.WriteByte(value[i]) } + _ = buf.WriteByte(suffix) } - _ = buf.WriteByte(suffix) } } @@ -330,7 +351,7 @@ func (engine *Engine) Ping() error { return session.Ping() } -// logging sql +// logSQL save sql func (engine *Engine) logSQL(sqlStr string, sqlArgs ...interface{}) { if engine.showSQL && !engine.showExecTime { if len(sqlArgs) > 0 { |