From a4aa3e72e6b8622fab608f8eb9c238aa0dcf3a07 Mon Sep 17 00:00:00 2001 From: wink Date: Thu, 15 Oct 2015 15:49:29 +0800 Subject: [PATCH] parser/parser.y: add StringType OptCharset OptCollate support to support sql like "Create Table test(a CHAR(10) CHARACTER SET utf8)", see details: "https://dev.mysql.com/doc/refman/5.0/en/create-table.html", data_type: ... | CHAR[(length)] [BINARY] [CHARACTER SET charset_name] [COLLATE collation_name] --- parser/parser.y | 8 ++++++-- parser/parser_test.go | 5 +++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/parser/parser.y b/parser/parser.y index 0f9801ffca..a9b7059067 100644 --- a/parser/parser.y +++ b/parser/parser.y @@ -3861,21 +3861,25 @@ BitValueType: } StringType: - NationalOpt "CHAR" FieldLen OptBinary + NationalOpt "CHAR" FieldLen OptBinary OptCharset OptCollate { x := types.NewFieldType(mysql.TypeString) x.Flen = $3.(int) if $4.(bool) { x.Flag |= mysql.BinaryFlag } + x.Charset = $5.(string) + x.Collate = $6.(string) $$ = x } -| NationalOpt "CHAR" OptBinary +| NationalOpt "CHAR" OptBinary OptCharset OptCollate { x := types.NewFieldType(mysql.TypeString) if $3.(bool) { x.Flag |= mysql.BinaryFlag } + x.Charset = $4.(string) + x.Collate = $5.(string) $$ = x } | NationalOpt "VARCHAR" FieldLen OptBinary OptCharset OptCollate diff --git a/parser/parser_test.go b/parser/parser_test.go index 12677906ef..28fae5e330 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -442,6 +442,11 @@ func (s *testParserSuite) TestDDL(c *C) { {"CREATE TABLE foo (a SMALLINT UNSIGNED, b INT UNSIGNED) // foo", true}, {"CREATE TABLE foo (a SMALLINT UNSIGNED, b INT UNSIGNED) /* foo */", true}, {"CREATE TABLE foo /* foo */ (a SMALLINT UNSIGNED, b INT UNSIGNED) /* foo */", true}, + {"CREATE TABLE foo (name CHAR(50) BINARY)", true}, + {"CREATE TABLE foo (name CHAR(50) COLLATE utf8_bin)", true}, + {"CREATE TABLE foo (name CHAR(50) CHARACTER SET utf8)", true}, + {"CREATE TABLE foo (name CHAR(50) BINARY CHARACTER SET utf8 COLLATE utf8_bin)", true}, + {"CREATE TABLE foo (a.b, b);", false}, {"CREATE TABLE foo (a, b.c);", false}, // For table option