From 11529774812844a0aa2953fde0d16de287c7d131 Mon Sep 17 00:00:00 2001 From: Guillermo Prandi Date: Mon, 4 Nov 2019 21:11:21 -0300 Subject: [PATCH 1/7] Rewrite QuoteTo to accept multi-part identifiers --- engine.go | 35 ++++++++++++++++++++++++++++------- engine_test.go | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 7 deletions(-) create mode 100644 engine_test.go diff --git a/engine.go b/engine.go index 69f310ef..abb024e2 100644 --- a/engine.go +++ b/engine.go @@ -207,25 +207,46 @@ func (engine *Engine) QuoteTo(buf *strings.Builder, value string) { return } - quotePair := engine.dialect.Quote("") + quoteTo(buf, value, engine.dialect.Quote("")) +} - 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++ { + i := 0 + for i < len(value) { + // start of a token; might be already quoted if value[i] == '.' { - _ = buf.WriteByte(suffix) _ = 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 { - _ = buf.WriteByte(value[i]) + // Requires quotes + _ = buf.WriteByte(prefix) + for ; i < len(value) && value[i] != '.'; i++ { + _ = buf.WriteByte(value[i]) + } + _ = buf.WriteByte(suffix) } } - _ = buf.WriteByte(suffix) } } diff --git a/engine_test.go b/engine_test.go new file mode 100644 index 00000000..65ee8541 --- /dev/null +++ b/engine_test.go @@ -0,0 +1,41 @@ +// Copyright 2018 The Xorm Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package xorm + +import ( + "strings" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestQuoteTo(t *testing.T) { + + test := func(t *testing.T, expected string, value string) { + buf := &strings.Builder{} + quoteTo(buf, "[]", value) + assert.EqualValues(t, expected, buf.String()) + } + + test(t, "[mytable]", "mytable") + test(t, "[mytable]", "`mytable`") + test(t, "[mytable]", `[mytable]`) + + test(t, `["mytable"]`, `"mytable"`) + + test(t, "[myschema].[mytable]", "myschema.mytable") + test(t, "[myschema].[mytable]", "`myschema`.mytable") + test(t, "[myschema].[mytable]", "myschema.`mytable`") + test(t, "[myschema].[mytable]", "`myschema`.`mytable`") + test(t, "[myschema].[mytable]", `[myschema].mytable`) + test(t, "[myschema].[mytable]", `myschema.[mytable]`) + test(t, "[myschema].[mytable]", `[myschema].[mytable]`) + + test(t, `["myschema].[mytable"]`, `"myschema.mytable"`) + + buf := &strings.Builder{} + quoteTo(buf, "", "noquote") + assert.EqualValues(t, "noquote", buf.String()) +} -- 2.40.1 From 18104fbcb5f1311d2a8599bd499103bec020bd3e Mon Sep 17 00:00:00 2001 From: Guillermo Prandi Date: Mon, 4 Nov 2019 23:50:33 -0300 Subject: [PATCH 2/7] Fix parameter order --- engine.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engine.go b/engine.go index abb024e2..a1111147 100644 --- a/engine.go +++ b/engine.go @@ -207,7 +207,7 @@ func (engine *Engine) QuoteTo(buf *strings.Builder, value string) { return } - quoteTo(buf, value, engine.dialect.Quote("")) + quoteTo(buf, engine.dialect.Quote(""), value) } func quoteTo(buf *strings.Builder, quotePair string, value string) { -- 2.40.1 From 57fa3c2c702a7a0e950eca5973880253ce7ff971 Mon Sep 17 00:00:00 2001 From: Guillermo Prandi Date: Mon, 4 Nov 2019 23:51:45 -0300 Subject: [PATCH 3/7] Fix copyright --- engine_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engine_test.go b/engine_test.go index 65ee8541..50522f5f 100644 --- a/engine_test.go +++ b/engine_test.go @@ -1,4 +1,4 @@ -// Copyright 2018 The Xorm Authors. All rights reserved. +// Copyright 2019 The Xorm Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -- 2.40.1 From fa4e15e3ae078a07534ed699e93a14585726138a Mon Sep 17 00:00:00 2001 From: Guillermo Prandi Date: Mon, 11 Nov 2019 11:27:26 -0300 Subject: [PATCH 5/7] Remove unnecessary else --- engine.go | 58 +++++++++++++++++++++++++++---------------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/engine.go b/engine.go index a1111147..a7e52ea4 100644 --- a/engine.go +++ b/engine.go @@ -214,38 +214,38 @@ 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] + } + + 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++ + 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 { - // Requires quotes - _ = buf.WriteByte(prefix) - for ; i < len(value) && value[i] != '.'; i++ { - _ = buf.WriteByte(value[i]) - } - _ = buf.WriteByte(suffix) + 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) } } } -- 2.40.1