diff --git a/parser/misc.go b/parser/misc.go index 08b03472f6..f817c6f305 100644 --- a/parser/misc.go +++ b/parser/misc.go @@ -532,6 +532,7 @@ var tokenMap = map[string]int{ "YEAR": yearType, "CHAR": charType, "VARCHAR": varcharType, + "NVARCHAR": nvarcharType, "BINARY": binaryType, "VARBINARY": varbinaryType, "TINYBLOB": tinyblobType, diff --git a/parser/parser.y b/parser/parser.y index 4c8b874244..985e42f963 100644 --- a/parser/parser.y +++ b/parser/parser.y @@ -167,6 +167,7 @@ import ( noWriteToBinLog "NO_WRITE_TO_BINLOG" null "NULL" numericType "NUMERIC" + nvarcharType "NVARCHAR" oct "OCT" octetLength "OCTET_LENGTH" on "ON" @@ -854,6 +855,7 @@ import ( RegexpSym "REGEXP or RLIKE" IntoOpt "INTO or EmptyString" ValueSym "Value or Values" + Varchar "{NATIONAL VARCHAR|VARCHAR|NVARCHAR}" TimeUnit "Time unit for 'DATE_ADD', 'DATE_SUB', 'ADDDATE', 'SUBDATE', 'EXTRACT'" TimestampUnit "Time unit for 'TIMESTAMPADD' and 'TIMESTAMPDIFF'" DeallocateSym "Deallocate or drop" @@ -2457,7 +2459,7 @@ ReservedKeyword: | "HOUR_SECOND" | "IF" | "IGNORE" | "IN" | "INDEX" | "INFILE" | "INNER" | "INSERT" | "INT" | "INTO" | "INTEGER" | "INTERVAL" | "IS" | "JOIN" | "KEY" | "KEYS" | "KILL" | "LEADING" | "LEFT" | "LIKE" | "LIMIT" | "LINES" | "LOAD" | "LOCALTIME" | "LOCALTIMESTAMP" | "LOCK" | "LONGBLOB" | "LONGTEXT" | "MAXVALUE" | "MEDIUMBLOB" | "MEDIUMINT" | "MEDIUMTEXT" -| "MINUTE_MICROSECOND" | "MINUTE_SECOND" | "MOD" | "NOT" | "NO_WRITE_TO_BINLOG" | "NULL" | "NUMERIC" +| "MINUTE_MICROSECOND" | "MINUTE_SECOND" | "MOD" | "NOT" | "NO_WRITE_TO_BINLOG" | "NULL" | "NUMERIC" | "NVARCHAR" | "ON" | "OPTION" | "OR" | "ORDER" | "OUTER" | "PARTITION" | "PRECISION" | "PRIMARY" | "PROCEDURE" | "RANGE" | "READ" | "REAL" | "REFERENCES" | "REGEXP" | "RENAME" | "REPEAT" | "REPLACE" | "RESTRICT" | "REVOKE" | "RIGHT" | "RLIKE" | "SCHEMA" | "SCHEMAS" | "SECOND_MICROSECOND" | "SELECT" | "SET" | "SHOW" | "SMALLINT" @@ -6038,13 +6040,13 @@ StringType: } $$ = x } -| NationalOpt "VARCHAR" FieldLen OptBinary OptCharset OptCollate +| Varchar FieldLen OptBinary OptCharset OptCollate { x := types.NewFieldType(mysql.TypeVarchar) - x.Flen = $3.(int) - x.Charset = $5.(string) - x.Collate = $6.(string) - if $4.(bool) { + x.Flen = $2.(int) + x.Charset = $4.(string) + x.Collate = $5.(string) + if $3.(bool) { x.Flag |= mysql.BinaryFlag } $$ = x @@ -6114,6 +6116,12 @@ NationalOpt: {} | "NATIONAL" +Varchar: +"NATIONAL" "VARCHAR" +| "VARCHAR" +| "NVARCHAR" + + BlobType: "TINYBLOB" { diff --git a/parser/parser_test.go b/parser/parser_test.go index 44d90529a8..82c067580a 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -169,6 +169,11 @@ func (s *testParserSuite) TestSimple(c *C) { c.Assert(cs.Cols[0].Options, HasLen, 1) c.Assert(cs.Cols[0].Options[0].Tp, Equals, ast.ColumnOptionPrimaryKey) + // for issue #4497 + src = "create table t1(a NVARCHAR(100));" + _, err = parser.ParseOneStmt(src, "", "") + c.Assert(err, IsNil) + // for issue 2803 src = "use quote;" _, err = parser.ParseOneStmt(src, "", "")