diff --git a/parser/ast/ast.go b/parser/ast/ast.go old mode 100644 new mode 100755 index 6681bf799ade8..6c3c05bb206c4 --- a/parser/ast/ast.go +++ b/parser/ast/ast.go @@ -18,6 +18,7 @@ package ast import ( "io" + . "github.com/pingcap/parser/format" "github.com/pingcap/parser/model" "github.com/pingcap/parser/types" ) diff --git a/parser/ast/ddl.go b/parser/ast/ddl.go old mode 100644 new mode 100755 index 3556cd3d58a33..aff213c973962 --- a/parser/ast/ddl.go +++ b/parser/ast/ddl.go @@ -16,6 +16,7 @@ package ast import ( "github.com/pingcap/errors" "github.com/pingcap/parser/auth" + . "github.com/pingcap/parser/format" "github.com/pingcap/parser/model" "github.com/pingcap/parser/types" ) diff --git a/parser/ast/dml.go b/parser/ast/dml.go old mode 100644 new mode 100755 index 05dc733a92d7b..5ce524221330f --- a/parser/ast/dml.go +++ b/parser/ast/dml.go @@ -18,6 +18,7 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/parser/auth" + . "github.com/pingcap/parser/format" "github.com/pingcap/parser/model" "github.com/pingcap/parser/mysql" ) diff --git a/parser/ast/expressions.go b/parser/ast/expressions.go old mode 100644 new mode 100755 index a5f767ce60ee0..9808114e6d091 --- a/parser/ast/expressions.go +++ b/parser/ast/expressions.go @@ -20,6 +20,7 @@ import ( "strings" "github.com/pingcap/errors" + . "github.com/pingcap/parser/format" "github.com/pingcap/parser/model" "github.com/pingcap/parser/opcode" ) diff --git a/parser/ast/functions.go b/parser/ast/functions.go old mode 100644 new mode 100755 index d1008eb854240..ab1bec9d692b0 --- a/parser/ast/functions.go +++ b/parser/ast/functions.go @@ -18,6 +18,7 @@ import ( "io" "github.com/pingcap/errors" + . "github.com/pingcap/parser/format" "github.com/pingcap/parser/model" "github.com/pingcap/parser/types" ) diff --git a/parser/ast/misc.go b/parser/ast/misc.go old mode 100644 new mode 100755 index 28c484cbde675..cc19e9a0798ac --- a/parser/ast/misc.go +++ b/parser/ast/misc.go @@ -20,6 +20,7 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/parser/auth" + . "github.com/pingcap/parser/format" "github.com/pingcap/parser/model" "github.com/pingcap/parser/mysql" ) diff --git a/parser/ast/stats.go b/parser/ast/stats.go old mode 100644 new mode 100755 index 8146720683508..5af5b1bfb4af1 --- a/parser/ast/stats.go +++ b/parser/ast/stats.go @@ -15,6 +15,7 @@ package ast import ( "github.com/pingcap/errors" + . "github.com/pingcap/parser/format" "github.com/pingcap/parser/model" ) diff --git a/parser/ast/util.go b/parser/ast/util.go old mode 100644 new mode 100755 index c8d36d75cc1fe..84075ffe37103 --- a/parser/ast/util.go +++ b/parser/ast/util.go @@ -13,12 +13,6 @@ package ast -import ( - "fmt" - "io" - "strings" -) - // IsReadOnly checks whether the input ast is readOnly. func IsReadOnly(node Node) bool { switch st := node.(type) { @@ -65,152 +59,3 @@ func (checker *readOnlyChecker) Enter(in Node) (out Node, skipChildren bool) { func (checker *readOnlyChecker) Leave(in Node) (out Node, ok bool) { return in, checker.readOnly } - -//RestoreFlag mark the Restore format -type RestoreFlags uint64 - -// Mutually exclusive group of `RestoreFlags`: -// [RestoreStringSingleQuotes, RestoreStringDoubleQuotes] -// [RestoreKeyWordUppercase, RestoreKeyWordLowercase] -// [RestoreNameUppercase, RestoreNameLowercase] -// [RestoreNameDoubleQuotes, RestoreNameBackQuotes] -// The flag with the left position in each group has a higher priority. -const ( - RestoreStringSingleQuotes RestoreFlags = 1 << iota - RestoreStringDoubleQuotes - RestoreStringEscapeBackslash - - RestoreKeyWordUppercase - RestoreKeyWordLowercase - - RestoreNameUppercase - RestoreNameLowercase - RestoreNameDoubleQuotes - RestoreNameBackQuotes -) - -const ( - DefaultRestoreFlags = RestoreStringSingleQuotes | RestoreKeyWordUppercase | RestoreNameBackQuotes -) - -func (rf RestoreFlags) has(flag RestoreFlags) bool { - return rf&flag != 0 -} - -// HasStringSingleQuotesFlag returns a boolean indicating when `rf` has `RestoreStringSingleQuotes` flag. -func (rf RestoreFlags) HasStringSingleQuotesFlag() bool { - return rf.has(RestoreStringSingleQuotes) -} - -// HasStringDoubleQuotesFlag returns a boolean indicating whether `rf` has `RestoreStringDoubleQuotes` flag. -func (rf RestoreFlags) HasStringDoubleQuotesFlag() bool { - return rf.has(RestoreStringDoubleQuotes) -} - -// HasStringEscapeBackslashFlag returns a boolean indicating whether `rf` has `RestoreStringEscapeBackslash` flag. -func (rf RestoreFlags) HasStringEscapeBackslashFlag() bool { - return rf.has(RestoreStringEscapeBackslash) -} - -// HasKeyWordUppercaseFlag returns a boolean indicating whether `rf` has `RestoreKeyWordUppercase` flag. -func (rf RestoreFlags) HasKeyWordUppercaseFlag() bool { - return rf.has(RestoreKeyWordUppercase) -} - -// HasKeyWordLowercaseFlag returns a boolean indicating whether `rf` has `RestoreKeyWordLowercase` flag. -func (rf RestoreFlags) HasKeyWordLowercaseFlag() bool { - return rf.has(RestoreKeyWordLowercase) -} - -// HasNameUppercaseFlag returns a boolean indicating whether `rf` has `RestoreNameUppercase` flag. -func (rf RestoreFlags) HasNameUppercaseFlag() bool { - return rf.has(RestoreNameUppercase) -} - -// HasNameLowercaseFlag returns a boolean indicating whether `rf` has `RestoreNameLowercase` flag. -func (rf RestoreFlags) HasNameLowercaseFlag() bool { - return rf.has(RestoreNameLowercase) -} - -// HasNameDoubleQuotesFlag returns a boolean indicating whether `rf` has `RestoreNameDoubleQuotes` flag. -func (rf RestoreFlags) HasNameDoubleQuotesFlag() bool { - return rf.has(RestoreNameDoubleQuotes) -} - -// HasNameBackQuotesFlag returns a boolean indicating whether `rf` has `RestoreNameBackQuotes` flag. -func (rf RestoreFlags) HasNameBackQuotesFlag() bool { - return rf.has(RestoreNameBackQuotes) -} - -// RestoreCtx is `Restore` context to hold flags and writer. -type RestoreCtx struct { - Flags RestoreFlags - In io.Writer - JoinLevel int -} - -// NewRestoreCtx returns a new `RestoreCtx`. -func NewRestoreCtx(flags RestoreFlags, in io.Writer) *RestoreCtx { - return &RestoreCtx{flags, in, 0} -} - -// WriteKeyWord writes the `keyWord` into writer. -// `keyWord` will be converted format(uppercase and lowercase for now) according to `RestoreFlags`. -func (ctx *RestoreCtx) WriteKeyWord(keyWord string) { - switch { - case ctx.Flags.HasKeyWordUppercaseFlag(): - keyWord = strings.ToUpper(keyWord) - case ctx.Flags.HasKeyWordLowercaseFlag(): - keyWord = strings.ToLower(keyWord) - } - fmt.Fprint(ctx.In, keyWord) -} - -// WriteString writes the string into writer -// `str` may be wrapped in quotes and escaped according to RestoreFlags. -func (ctx *RestoreCtx) WriteString(str string) { - if ctx.Flags.HasStringEscapeBackslashFlag() { - str = strings.Replace(str, `\`, `\\`, -1) - } - quotes := "" - switch { - case ctx.Flags.HasStringSingleQuotesFlag(): - str = strings.Replace(str, `'`, `''`, -1) - quotes = `'` - case ctx.Flags.HasStringDoubleQuotesFlag(): - str = strings.Replace(str, `"`, `""`, -1) - quotes = `"` - } - fmt.Fprint(ctx.In, quotes, str, quotes) -} - -// WriteName writes the name into writer -// `name` maybe wrapped in quotes and escaped according to RestoreFlags. -func (ctx *RestoreCtx) WriteName(name string) { - switch { - case ctx.Flags.HasNameUppercaseFlag(): - name = strings.ToUpper(name) - case ctx.Flags.HasNameLowercaseFlag(): - name = strings.ToLower(name) - } - quotes := "" - switch { - case ctx.Flags.HasNameDoubleQuotesFlag(): - name = strings.Replace(name, `"`, `""`, -1) - quotes = `"` - case ctx.Flags.HasNameBackQuotesFlag(): - name = strings.Replace(name, "`", "``", -1) - quotes = "`" - } - fmt.Fprint(ctx.In, quotes, name, quotes) -} - -// WritePlain writes the plain text into writer without any handling. -func (ctx *RestoreCtx) WritePlain(plainText string) { - fmt.Fprint(ctx.In, plainText) -} - -// WritePlainf write the plain text into writer without any handling. -func (ctx *RestoreCtx) WritePlainf(format string, a ...interface{}) { - fmt.Fprintf(ctx.In, format, a...) -} diff --git a/parser/ast/util_test.go b/parser/ast/util_test.go old mode 100644 new mode 100755 index e8cf53255d0ab..4e34cba60a365 --- a/parser/ast/util_test.go +++ b/parser/ast/util_test.go @@ -20,11 +20,11 @@ import ( . "github.com/pingcap/check" "github.com/pingcap/parser" . "github.com/pingcap/parser/ast" + . "github.com/pingcap/parser/format" driver "github.com/pingcap/tidb/types/parser_driver" ) var _ = Suite(&testCacheableSuite{}) -var _ = Suite(&testRestoreCtxSuite{}) type testCacheableSuite struct { } @@ -83,43 +83,6 @@ func (checker *nodeTextCleaner) Leave(in Node) (out Node, ok bool) { return in, true } -type testRestoreCtxSuite struct { -} - -func (s *testRestoreCtxSuite) TestRestoreCtx(c *C) { - testCases := []struct { - flag RestoreFlags - expect string - }{ - {0, "key`.'\"Word\\ str`.'\"ing\\ na`.'\"Me\\"}, - {RestoreStringSingleQuotes, "key`.'\"Word\\ 'str`.''\"ing\\' na`.'\"Me\\"}, - {RestoreStringDoubleQuotes, "key`.'\"Word\\ \"str`.'\"\"ing\\\" na`.'\"Me\\"}, - {RestoreStringEscapeBackslash, "key`.'\"Word\\ str`.'\"ing\\\\ na`.'\"Me\\"}, - {RestoreKeyWordUppercase, "KEY`.'\"WORD\\ str`.'\"ing\\ na`.'\"Me\\"}, - {RestoreKeyWordLowercase, "key`.'\"word\\ str`.'\"ing\\ na`.'\"Me\\"}, - {RestoreNameUppercase, "key`.'\"Word\\ str`.'\"ing\\ NA`.'\"ME\\"}, - {RestoreNameLowercase, "key`.'\"Word\\ str`.'\"ing\\ na`.'\"me\\"}, - {RestoreNameDoubleQuotes, "key`.'\"Word\\ str`.'\"ing\\ \"na`.'\"\"Me\\\""}, - {RestoreNameBackQuotes, "key`.'\"Word\\ str`.'\"ing\\ `na``.'\"Me\\`"}, - {DefaultRestoreFlags, "KEY`.'\"WORD\\ 'str`.''\"ing\\' `na``.'\"Me\\`"}, - {RestoreStringSingleQuotes | RestoreStringDoubleQuotes, "key`.'\"Word\\ 'str`.''\"ing\\' na`.'\"Me\\"}, - {RestoreKeyWordUppercase | RestoreKeyWordLowercase, "KEY`.'\"WORD\\ str`.'\"ing\\ na`.'\"Me\\"}, - {RestoreNameUppercase | RestoreNameLowercase, "key`.'\"Word\\ str`.'\"ing\\ NA`.'\"ME\\"}, - {RestoreNameDoubleQuotes | RestoreNameBackQuotes, "key`.'\"Word\\ str`.'\"ing\\ \"na`.'\"\"Me\\\""}, - } - var sb strings.Builder - for _, testCase := range testCases { - sb.Reset() - ctx := NewRestoreCtx(testCase.flag, &sb) - ctx.WriteKeyWord("key`.'\"Word\\") - ctx.WritePlain(" ") - ctx.WriteString("str`.'\"ing\\") - ctx.WritePlain(" ") - ctx.WriteName("na`.'\"Me\\") - c.Assert(sb.String(), Equals, testCase.expect, Commentf("case: %#v", testCase)) - } -} - type NodeRestoreTestCase struct { sourceSQL string expectSQL string diff --git a/parser/format/format.go b/parser/format/format.go old mode 100644 new mode 100755 index 0a14a6d362650..ad6c800252ee1 --- a/parser/format/format.go +++ b/parser/format/format.go @@ -21,6 +21,7 @@ import ( "bytes" "fmt" "io" + "strings" ) const ( @@ -193,3 +194,152 @@ func OutputFormat(s string) string { return buf.String() } + +//RestoreFlag mark the Restore format +type RestoreFlags uint64 + +// Mutually exclusive group of `RestoreFlags`: +// [RestoreStringSingleQuotes, RestoreStringDoubleQuotes] +// [RestoreKeyWordUppercase, RestoreKeyWordLowercase] +// [RestoreNameUppercase, RestoreNameLowercase] +// [RestoreNameDoubleQuotes, RestoreNameBackQuotes] +// The flag with the left position in each group has a higher priority. +const ( + RestoreStringSingleQuotes RestoreFlags = 1 << iota + RestoreStringDoubleQuotes + RestoreStringEscapeBackslash + + RestoreKeyWordUppercase + RestoreKeyWordLowercase + + RestoreNameUppercase + RestoreNameLowercase + RestoreNameDoubleQuotes + RestoreNameBackQuotes +) + +const ( + DefaultRestoreFlags = RestoreStringSingleQuotes | RestoreKeyWordUppercase | RestoreNameBackQuotes +) + +func (rf RestoreFlags) has(flag RestoreFlags) bool { + return rf&flag != 0 +} + +// HasStringSingleQuotesFlag returns a boolean indicating when `rf` has `RestoreStringSingleQuotes` flag. +func (rf RestoreFlags) HasStringSingleQuotesFlag() bool { + return rf.has(RestoreStringSingleQuotes) +} + +// HasStringDoubleQuotesFlag returns a boolean indicating whether `rf` has `RestoreStringDoubleQuotes` flag. +func (rf RestoreFlags) HasStringDoubleQuotesFlag() bool { + return rf.has(RestoreStringDoubleQuotes) +} + +// HasStringEscapeBackslashFlag returns a boolean indicating whether `rf` has `RestoreStringEscapeBackslash` flag. +func (rf RestoreFlags) HasStringEscapeBackslashFlag() bool { + return rf.has(RestoreStringEscapeBackslash) +} + +// HasKeyWordUppercaseFlag returns a boolean indicating whether `rf` has `RestoreKeyWordUppercase` flag. +func (rf RestoreFlags) HasKeyWordUppercaseFlag() bool { + return rf.has(RestoreKeyWordUppercase) +} + +// HasKeyWordLowercaseFlag returns a boolean indicating whether `rf` has `RestoreKeyWordLowercase` flag. +func (rf RestoreFlags) HasKeyWordLowercaseFlag() bool { + return rf.has(RestoreKeyWordLowercase) +} + +// HasNameUppercaseFlag returns a boolean indicating whether `rf` has `RestoreNameUppercase` flag. +func (rf RestoreFlags) HasNameUppercaseFlag() bool { + return rf.has(RestoreNameUppercase) +} + +// HasNameLowercaseFlag returns a boolean indicating whether `rf` has `RestoreNameLowercase` flag. +func (rf RestoreFlags) HasNameLowercaseFlag() bool { + return rf.has(RestoreNameLowercase) +} + +// HasNameDoubleQuotesFlag returns a boolean indicating whether `rf` has `RestoreNameDoubleQuotes` flag. +func (rf RestoreFlags) HasNameDoubleQuotesFlag() bool { + return rf.has(RestoreNameDoubleQuotes) +} + +// HasNameBackQuotesFlag returns a boolean indicating whether `rf` has `RestoreNameBackQuotes` flag. +func (rf RestoreFlags) HasNameBackQuotesFlag() bool { + return rf.has(RestoreNameBackQuotes) +} + +// RestoreCtx is `Restore` context to hold flags and writer. +type RestoreCtx struct { + Flags RestoreFlags + In io.Writer + JoinLevel int +} + +// NewRestoreCtx returns a new `RestoreCtx`. +func NewRestoreCtx(flags RestoreFlags, in io.Writer) *RestoreCtx { + return &RestoreCtx{flags, in, 0} +} + +// WriteKeyWord writes the `keyWord` into writer. +// `keyWord` will be converted format(uppercase and lowercase for now) according to `RestoreFlags`. +func (ctx *RestoreCtx) WriteKeyWord(keyWord string) { + switch { + case ctx.Flags.HasKeyWordUppercaseFlag(): + keyWord = strings.ToUpper(keyWord) + case ctx.Flags.HasKeyWordLowercaseFlag(): + keyWord = strings.ToLower(keyWord) + } + fmt.Fprint(ctx.In, keyWord) +} + +// WriteString writes the string into writer +// `str` may be wrapped in quotes and escaped according to RestoreFlags. +func (ctx *RestoreCtx) WriteString(str string) { + if ctx.Flags.HasStringEscapeBackslashFlag() { + str = strings.Replace(str, `\`, `\\`, -1) + } + quotes := "" + switch { + case ctx.Flags.HasStringSingleQuotesFlag(): + str = strings.Replace(str, `'`, `''`, -1) + quotes = `'` + case ctx.Flags.HasStringDoubleQuotesFlag(): + str = strings.Replace(str, `"`, `""`, -1) + quotes = `"` + } + fmt.Fprint(ctx.In, quotes, str, quotes) +} + +// WriteName writes the name into writer +// `name` maybe wrapped in quotes and escaped according to RestoreFlags. +func (ctx *RestoreCtx) WriteName(name string) { + switch { + case ctx.Flags.HasNameUppercaseFlag(): + name = strings.ToUpper(name) + case ctx.Flags.HasNameLowercaseFlag(): + name = strings.ToLower(name) + } + quotes := "" + switch { + case ctx.Flags.HasNameDoubleQuotesFlag(): + name = strings.Replace(name, `"`, `""`, -1) + quotes = `"` + case ctx.Flags.HasNameBackQuotesFlag(): + name = strings.Replace(name, "`", "``", -1) + quotes = "`" + } + fmt.Fprint(ctx.In, quotes, name, quotes) +} + +// WritePlain writes the plain text into writer without any handling. +func (ctx *RestoreCtx) WritePlain(plainText string) { + fmt.Fprint(ctx.In, plainText) +} + +// WritePlainf write the plain text into writer without any handling. +func (ctx *RestoreCtx) WritePlainf(format string, a ...interface{}) { + fmt.Fprintf(ctx.In, format, a...) +} diff --git a/parser/format/format_test.go b/parser/format/format_test.go old mode 100644 new mode 100755 index 78cdcd72bb209..c831909321f86 --- a/parser/format/format_test.go +++ b/parser/format/format_test.go @@ -16,6 +16,7 @@ package format import ( "bytes" "io/ioutil" + "strings" "testing" . "github.com/pingcap/check" @@ -28,6 +29,7 @@ func TestT(t *testing.T) { } var _ = Suite(&testFormatSuite{}) +var _ = Suite(&testRestoreCtxSuite{}) type testFormatSuite struct { } @@ -58,3 +60,40 @@ z expect = "abc3%e x y z\n " checkFormat(c, f, buf, str, expect) } + +type testRestoreCtxSuite struct { +} + +func (s *testRestoreCtxSuite) TestRestoreCtx(c *C) { + testCases := []struct { + flag RestoreFlags + expect string + }{ + {0, "key`.'\"Word\\ str`.'\"ing\\ na`.'\"Me\\"}, + {RestoreStringSingleQuotes, "key`.'\"Word\\ 'str`.''\"ing\\' na`.'\"Me\\"}, + {RestoreStringDoubleQuotes, "key`.'\"Word\\ \"str`.'\"\"ing\\\" na`.'\"Me\\"}, + {RestoreStringEscapeBackslash, "key`.'\"Word\\ str`.'\"ing\\\\ na`.'\"Me\\"}, + {RestoreKeyWordUppercase, "KEY`.'\"WORD\\ str`.'\"ing\\ na`.'\"Me\\"}, + {RestoreKeyWordLowercase, "key`.'\"word\\ str`.'\"ing\\ na`.'\"Me\\"}, + {RestoreNameUppercase, "key`.'\"Word\\ str`.'\"ing\\ NA`.'\"ME\\"}, + {RestoreNameLowercase, "key`.'\"Word\\ str`.'\"ing\\ na`.'\"me\\"}, + {RestoreNameDoubleQuotes, "key`.'\"Word\\ str`.'\"ing\\ \"na`.'\"\"Me\\\""}, + {RestoreNameBackQuotes, "key`.'\"Word\\ str`.'\"ing\\ `na``.'\"Me\\`"}, + {DefaultRestoreFlags, "KEY`.'\"WORD\\ 'str`.''\"ing\\' `na``.'\"Me\\`"}, + {RestoreStringSingleQuotes | RestoreStringDoubleQuotes, "key`.'\"Word\\ 'str`.''\"ing\\' na`.'\"Me\\"}, + {RestoreKeyWordUppercase | RestoreKeyWordLowercase, "KEY`.'\"WORD\\ str`.'\"ing\\ na`.'\"Me\\"}, + {RestoreNameUppercase | RestoreNameLowercase, "key`.'\"Word\\ str`.'\"ing\\ NA`.'\"ME\\"}, + {RestoreNameDoubleQuotes | RestoreNameBackQuotes, "key`.'\"Word\\ str`.'\"ing\\ \"na`.'\"\"Me\\\""}, + } + var sb strings.Builder + for _, testCase := range testCases { + sb.Reset() + ctx := NewRestoreCtx(testCase.flag, &sb) + ctx.WriteKeyWord("key`.'\"Word\\") + ctx.WritePlain(" ") + ctx.WriteString("str`.'\"ing\\") + ctx.WritePlain(" ") + ctx.WriteName("na`.'\"Me\\") + c.Assert(sb.String(), Equals, testCase.expect, Commentf("case: %#v", testCase)) + } +} diff --git a/parser/go.mod1 b/parser/go.mod1 old mode 100644 new mode 100755 index cfc68ae2e2375..742485fffd146 --- a/parser/go.mod1 +++ b/parser/go.mod1 @@ -14,3 +14,5 @@ require ( github.com/sirupsen/logrus v1.2.0 golang.org/x/text v0.3.0 ) + +replace github.com/pingcap/tidb => github.com/feloxx/tidb v0.0.0-00000000000000-b06ddb2612bab3e92cc666dca7a50e6a6bbd4a7b diff --git a/parser/go.sum1 b/parser/go.sum1 old mode 100644 new mode 100755 index 02668a3f0423d..65ac8b114322e --- a/parser/go.sum1 +++ b/parser/go.sum1 @@ -43,6 +43,8 @@ github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385 h1:clC1lXBpe2kTj2VHdaI github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= github.com/etcd-io/gofail v0.0.0-20180808172546-51ce9a71510a h1:QNEenQIsGDEEfFNSnN+h6hE1OwnHqTg7Dl9gEk1Cko4= github.com/etcd-io/gofail v0.0.0-20180808172546-51ce9a71510a/go.mod h1:49H/RkXP8pKaZy4h0d+NW16rSLhyVBt4o6VLJbmOqDE= +github.com/feloxx/tidb v0.0.0-00000000000000-b06ddb2612bab3e92cc666dca7a50e6a6bbd4a7b h1:+m9CniXMNxrOvjf43cdSsdI7sn5PYf5TxgDvFSrX9wQ= +github.com/feloxx/tidb v0.0.0-00000000000000-b06ddb2612bab3e92cc666dca7a50e6a6bbd4a7b/go.mod h1:fFqJcMkGzv5vO7hNj9IxnFHmL3gCEndkcXunwGBU9No= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= diff --git a/parser/parser_test.go b/parser/parser_test.go old mode 100644 new mode 100755 index 160e871c769c2..2f2e4c8829e0c --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -23,6 +23,7 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/parser/ast" "github.com/pingcap/parser/charset" + . "github.com/pingcap/parser/format" "github.com/pingcap/parser/model" "github.com/pingcap/parser/mysql" "github.com/pingcap/parser/terror" @@ -278,7 +279,7 @@ func (s *testParserSuite) RunRestoreTest(c *C, sourceSQLs, expectSQLs string) { c.Assert(err, IsNil, comment) restoreSQLs := "" for _, stmt := range stmts { - err = stmt.Restore(ast.NewRestoreCtx(ast.DefaultRestoreFlags, &sb)) + err = stmt.Restore(NewRestoreCtx(DefaultRestoreFlags, &sb)) c.Assert(err, IsNil, comment) restoreSQL := sb.String() comment = Commentf("source %v; restore %v", sourceSQLs, restoreSQL)