From 91e605ebd76eb923fb59772edef3872f11a1f73e Mon Sep 17 00:00:00 2001 From: qiuyesuifeng Date: Mon, 14 Sep 2015 21:19:22 +0800 Subject: [PATCH 1/2] parser: cleanup parser/scanner error. --- parser/parser.y | 80 ++++++++++++++++++++++++------------------------ parser/scanner.l | 21 ++++++++----- 2 files changed, 53 insertions(+), 48 deletions(-) diff --git a/parser/parser.y b/parser/parser.y index 0ec23ac2dff2d..b5dd388dc5f8f 100644 --- a/parser/parser.y +++ b/parser/parser.y @@ -889,12 +889,12 @@ CreateIndexStmt: { indexName, tableIdent, colNameList := $4.(string), $6.(table.Ident), $8.([]*coldef.IndexColName) if strings.EqualFold(indexName, tableIdent.Name.O) { - yylex.(*lexer).err("", "index name collision: %s", indexName) + yylex.(*lexer).err(fmt.Sprintf("index name collision: %s", indexName)) return 1 } for _, colName := range colNameList { if indexName == colName.ColumnName { - yylex.(*lexer).err("", "index name collision: %s", indexName) + yylex.(*lexer).err(fmt.Sprintf("index name collision: %s", indexName)) return 1 } } @@ -966,7 +966,7 @@ CreateDatabaseStmt: ok := charset.ValidCharsetAndCollation(cs, co) if !ok { - yylex.(*lexer).err("", "Unknown character set %s or collate %s ", cs, co) + yylex.(*lexer).err(fmt.Sprintf("Unknown character set %s or collate %s ", cs, co)) } dbopt := &coldef.CharsetOpt{Chs: cs, Col: co} @@ -1008,7 +1008,7 @@ CharsetName: if charset.ValidCharsetAndCollation(c, "") { $$ = c } else { - yylex.(*lexer).err("", fmt.Sprintf("Unknown character set: '%s'", $1.(string))) + yylex.(*lexer).err(fmt.Sprintf("Unknown character set: '%s'", $1.(string))) return 1 } } @@ -1018,7 +1018,7 @@ CharsetName: if charset.ValidCharsetAndCollation(c, "") { $$ = c } else { - yylex.(*lexer).err("", fmt.Sprintf("Unknown character set: '%s'", $1.(string))) + yylex.(*lexer).err(fmt.Sprintf("Unknown character set: '%s'", $1.(string))) return 1 } } @@ -1072,7 +1072,7 @@ CreateTableStmt: } } if len(columnDefs) == 0 { - yylex.(*lexer).err("", "Column Definition List can't be empty.") + yylex.(*lexer).err("Column Definition List can't be empty.") return 1 } @@ -1444,7 +1444,7 @@ Factor1: var err error $$, err = expressions.NewBetween($1.(expression.Expression), $4.(expression.Expression), $6.(expression.Expression), $2.(bool)) if err != nil { - yylex.(*lexer).err("", "%v", err) + yylex.(*lexer).err(err) return 1 } } @@ -1755,7 +1755,7 @@ Operand: { l := yylex.(*lexer) if !l.prepare { - l.err("", "Can not accept placeholder when not parsing prepare sql") + l.err("Can not accept placeholder when not parsing prepare sql") } pm := &expressions.ParamMarker{} l.ParamList = append(l.ParamList, pm) @@ -1855,7 +1855,7 @@ FunctionCallConflict: var err error $$, err = expressions.NewCall($1.(string), $3.([]expression.Expression), false) if err != nil { - x.err("", "%v", err) + x.err(err) return 1 } } @@ -1884,7 +1884,7 @@ FunctionCallKeyword: $$, err = expressions.NewCall($1.(string), $4.([]expression.Expression), $3.(bool)) if err != nil { l := yylex.(*lexer) - l.err("", "%v", err) + l.err(err) return 1 } } @@ -1931,7 +1931,7 @@ FunctionCallKeyword: $$, err = expressions.NewCall($1.(string), args, false) if err != nil { l := yylex.(*lexer) - l.err("", "%v", err) + l.err(err) return 1 } } @@ -1946,7 +1946,7 @@ FunctionCallKeyword: $$, err = expressions.NewCall($1.(string), $3.([]expression.Expression), false) if err != nil { l := yylex.(*lexer) - l.err("", "%v", err) + l.err(err) return 1 } } @@ -1957,7 +1957,7 @@ FunctionCallKeyword: $$, err = expressions.NewCall($1.(string), args, false) if err != nil { l := yylex.(*lexer) - l.err("", "%v", err) + l.err(err) return 1 } } @@ -1969,7 +1969,7 @@ FunctionCallNonKeyword: $$, err = expressions.NewCall($1.(string), $3.([]expression.Expression), false) if err != nil { l := yylex.(*lexer) - l.err("", "%v", err) + l.err(err) return 1 } } @@ -1980,7 +1980,7 @@ FunctionCallNonKeyword: $$, err = expressions.NewCall($1.(string), args, false) if err != nil { l := yylex.(*lexer) - l.err("", "%v", err) + l.err(err) return 1 } } @@ -1990,7 +1990,7 @@ FunctionCallNonKeyword: $$, err = expressions.NewCall($1.(string), $3.([]expression.Expression), false) if err != nil { l := yylex.(*lexer) - l.err("", "%v", err) + l.err(err) return 1 } } @@ -2000,7 +2000,7 @@ FunctionCallNonKeyword: $$, err = expressions.NewCall($1.(string), $3.([]expression.Expression), false) if err != nil { l := yylex.(*lexer) - l.err("", "%v", err) + l.err(err) return 1 } } @@ -2011,7 +2011,7 @@ FunctionCallNonKeyword: $$, err = expressions.NewCall($1.(string), args, false) if err != nil { l := yylex.(*lexer) - l.err("", "%v", err) + l.err(err) return 1 } } @@ -2022,7 +2022,7 @@ FunctionCallNonKeyword: $$, err = expressions.NewCall($1.(string), args, false) if err != nil { l := yylex.(*lexer) - l.err("", "%v", err) + l.err(err) return 1 } } @@ -2033,7 +2033,7 @@ FunctionCallNonKeyword: $$, err = expressions.NewCall($1.(string), args, false) if err != nil { l := yylex.(*lexer) - l.err("", "%v", err) + l.err(err) return 1 } } @@ -2044,7 +2044,7 @@ FunctionCallNonKeyword: $$, err = expressions.NewCall($1.(string), args, false) if err != nil { l := yylex.(*lexer) - l.err("", "%v", err) + l.err(err) return 1 } } @@ -2055,7 +2055,7 @@ FunctionCallNonKeyword: $$, err = expressions.NewCall($1.(string), args, false) if err != nil { l := yylex.(*lexer) - l.err("", "%v", err) + l.err(err) return 1 } } @@ -2066,7 +2066,7 @@ FunctionCallNonKeyword: $$, err = expressions.NewCall($1.(string), args, false) if err != nil { l := yylex.(*lexer) - l.err("", "%v", err) + l.err(err) return 1 } } @@ -2076,7 +2076,7 @@ FunctionCallNonKeyword: $$, err = expressions.NewCall($1.(string), $3.([]expression.Expression), false) if err != nil { l := yylex.(*lexer) - l.err("", "%v", err) + l.err(err) return 1 } } @@ -2087,7 +2087,7 @@ FunctionCallNonKeyword: $$, err = expressions.NewCall($1.(string), args, false) if err != nil { l := yylex.(*lexer) - l.err("", "%v", err) + l.err(err) return 1 } } @@ -2098,7 +2098,7 @@ FunctionCallNonKeyword: $$, err = expressions.NewCall($1.(string), args, false) if err != nil { l := yylex.(*lexer) - l.err("", "%v", err) + l.err(err) return 1 } } @@ -2109,7 +2109,7 @@ FunctionCallNonKeyword: $$, err = expressions.NewCall($1.(string), args, false) if err != nil { l := yylex.(*lexer) - l.err("", "%v", err) + l.err(err) return 1 } } @@ -2120,7 +2120,7 @@ FunctionCallNonKeyword: $$, err = expressions.NewCall($1.(string), args, false) if err != nil { l := yylex.(*lexer) - l.err("", "%v", err) + l.err(err) return 1 } } @@ -2130,7 +2130,7 @@ FunctionCallNonKeyword: $$, err = expressions.NewCall($1.(string), $3.([]expression.Expression),false) if err != nil { l := yylex.(*lexer) - l.err("", "%v", err) + l.err(err) return 1 } } @@ -2140,7 +2140,7 @@ FunctionCallNonKeyword: $$, err = expressions.NewCall($1.(string), $3.([]expression.Expression), false) if err != nil { l := yylex.(*lexer) - l.err("", "%v", err) + l.err(err) return 1 } } @@ -2151,7 +2151,7 @@ FunctionCallNonKeyword: $$, err = expressions.NewCall($1.(string), args, false) if err != nil { l := yylex.(*lexer) - l.err("", "%v", err) + l.err(err) return 1 } } @@ -2192,7 +2192,7 @@ FunctionCallNonKeyword: $$, err = expressions.NewCall($1.(string), args, false) if err != nil { l := yylex.(*lexer) - l.err("", "%v", err) + l.err(err) return 1 } } @@ -2203,7 +2203,7 @@ FunctionCallNonKeyword: $$, err = expressions.NewCall($1.(string), args, false) if err != nil { l := yylex.(*lexer) - l.err("", "%v", err) + l.err(err) return 1 } } @@ -2213,7 +2213,7 @@ FunctionCallNonKeyword: $$, err = expressions.NewCall($1.(string), $3.([]expression.Expression),false) if err != nil { l := yylex.(*lexer) - l.err("", "%v", err) + l.err(err) return 1 } } @@ -2225,7 +2225,7 @@ FunctionCallAgg: $$, err = expressions.NewCall($1.(string), $4.([]expression.Expression), $3.(bool)) if err != nil { l := yylex.(*lexer) - l.err("", "%v", err) + l.err(err) return 1 } } @@ -2236,7 +2236,7 @@ FunctionCallAgg: $$, err = expressions.NewCall($1.(string), args, $3.(bool)) if err != nil { l := yylex.(*lexer) - l.err("", "%v", err) + l.err(err) return 1 } } @@ -2246,7 +2246,7 @@ FunctionCallAgg: $$, err = expressions.NewCall($1.(string), $4.([]expression.Expression),$3.(bool)) if err != nil { l := yylex.(*lexer) - l.err("", "%v", err) + l.err(err) return 1 } } @@ -2257,7 +2257,7 @@ FunctionCallAgg: $$, err = expressions.NewCall($1.(string), args, $3.(bool)) if err != nil { l := yylex.(*lexer) - l.err("", "%v", err) + l.err(err) return 1 } } @@ -2268,7 +2268,7 @@ FunctionCallAgg: $$, err = expressions.NewCall($1.(string), args, $3.(bool)) if err != nil { l := yylex.(*lexer) - l.err("", "%v", err) + l.err(err) return 1 } } @@ -2279,7 +2279,7 @@ FunctionCallAgg: $$, err = expressions.NewCall($1.(string), args, $3.(bool)) if err != nil { l := yylex.(*lexer) - l.err("", "%v", err) + l.err(err) return 1 } } diff --git a/parser/scanner.l b/parser/scanner.l index 3826f074036ba..87b48a2a7eb76 100644 --- a/parser/scanner.l +++ b/parser/scanner.l @@ -133,21 +133,26 @@ func (l *lexer) next() int { return l.c } -func (l *lexer) err0(ln, c int, args ...interface{}) { +func (l *lexer) err0(ln, c int, arg interface{}) { var argStr string - if len(args) > 0 { - argStr = fmt.Sprintf(" " + args[0].(string), args[1:]...) + switch x := arg.(type) { + case error: + argStr = " " + x.Error() + case string: + argStr = " " + x } + err := errors.New(fmt.Sprintf("line %d column %d near \"%s\"", ln, c, l.val) + argStr) l.errs = append(l.errs, err) } -func (l *lexer) err(s string, args ...interface{}) { - l.err0(l.line, l.col, args...) +func (l *lexer) err(arg interface{}) { + l.err0(l.line, l.col, arg) } func (l *lexer) Error(s string) { - l.err(s) + // Notice: ignore origin error info. + l.err(nil) } func (l *lexer) stmtText() string { @@ -874,7 +879,7 @@ func (l *lexer) trimIdent(idt string) string { func (l *lexer) int(lval *yySymType) int { n, err := strconv.ParseUint(string(l.val), 0, 64) if err != nil { - l.err("", "integer literal: %v", err) + l.err(fmt.Sprintf("integer literal: %v", err)) return int(unicode.ReplacementChar) } @@ -890,7 +895,7 @@ func (l *lexer) int(lval *yySymType) int { func (l *lexer) float(lval *yySymType) int { n, err := strconv.ParseFloat(string(l.val), 64) if err != nil { - l.err("", "float literal: %v", err) + l.err(fmt.Sprintf("float literal: %v", err)) return int(unicode.ReplacementChar) } From 7c5612473dee2f3524624008adb8f8849e128be6 Mon Sep 17 00:00:00 2001 From: qiuyesuifeng Date: Tue, 15 Sep 2015 10:15:22 +0800 Subject: [PATCH 2/2] parser: address comment. --- parser/parser.y | 10 +++++----- parser/scanner.l | 19 ++++++++++--------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/parser/parser.y b/parser/parser.y index b5dd388dc5f8f..0aedd851d2a4b 100644 --- a/parser/parser.y +++ b/parser/parser.y @@ -889,12 +889,12 @@ CreateIndexStmt: { indexName, tableIdent, colNameList := $4.(string), $6.(table.Ident), $8.([]*coldef.IndexColName) if strings.EqualFold(indexName, tableIdent.Name.O) { - yylex.(*lexer).err(fmt.Sprintf("index name collision: %s", indexName)) + yylex.(*lexer).errf("index name collision: %s", indexName) return 1 } for _, colName := range colNameList { if indexName == colName.ColumnName { - yylex.(*lexer).err(fmt.Sprintf("index name collision: %s", indexName)) + yylex.(*lexer).errf("index name collision: %s", indexName) return 1 } } @@ -966,7 +966,7 @@ CreateDatabaseStmt: ok := charset.ValidCharsetAndCollation(cs, co) if !ok { - yylex.(*lexer).err(fmt.Sprintf("Unknown character set %s or collate %s ", cs, co)) + yylex.(*lexer).errf("Unknown character set %s or collate %s ", cs, co) } dbopt := &coldef.CharsetOpt{Chs: cs, Col: co} @@ -1008,7 +1008,7 @@ CharsetName: if charset.ValidCharsetAndCollation(c, "") { $$ = c } else { - yylex.(*lexer).err(fmt.Sprintf("Unknown character set: '%s'", $1.(string))) + yylex.(*lexer).errf("Unknown character set: '%s'", $1.(string)) return 1 } } @@ -1018,7 +1018,7 @@ CharsetName: if charset.ValidCharsetAndCollation(c, "") { $$ = c } else { - yylex.(*lexer).err(fmt.Sprintf("Unknown character set: '%s'", $1.(string))) + yylex.(*lexer).errf("Unknown character set: '%s'", $1.(string)) return 1 } } diff --git a/parser/scanner.l b/parser/scanner.l index 87b48a2a7eb76..cb9fc7c01f97b 100644 --- a/parser/scanner.l +++ b/parser/scanner.l @@ -21,7 +21,6 @@ package parser import ( "fmt" "math" - "errors" "strconv" "unicode" "strings" @@ -135,14 +134,11 @@ func (l *lexer) next() int { func (l *lexer) err0(ln, c int, arg interface{}) { var argStr string - switch x := arg.(type) { - case error: - argStr = " " + x.Error() - case string: - argStr = " " + x + if arg != nil { + argStr = fmt.Sprintf(" %v", arg) } - err := errors.New(fmt.Sprintf("line %d column %d near \"%s\"", ln, c, l.val) + argStr) + err := fmt.Errorf("line %d column %d near \"%s\"%s", ln, c, l.val, argStr) l.errs = append(l.errs, err) } @@ -150,6 +146,11 @@ func (l *lexer) err(arg interface{}) { l.err0(l.line, l.col, arg) } +func (l *lexer) errf(format string, args ...interface{}) { + s := fmt.Sprintf(format, args...) + l.err0(l.line, l.col, s) +} + func (l *lexer) Error(s string) { // Notice: ignore origin error info. l.err(nil) @@ -879,7 +880,7 @@ func (l *lexer) trimIdent(idt string) string { func (l *lexer) int(lval *yySymType) int { n, err := strconv.ParseUint(string(l.val), 0, 64) if err != nil { - l.err(fmt.Sprintf("integer literal: %v", err)) + l.errf("integer literal: %v", err) return int(unicode.ReplacementChar) } @@ -895,7 +896,7 @@ func (l *lexer) int(lval *yySymType) int { func (l *lexer) float(lval *yySymType) int { n, err := strconv.ParseFloat(string(l.val), 64) if err != nil { - l.err(fmt.Sprintf("float literal: %v", err)) + l.errf("float literal: %v", err) return int(unicode.ReplacementChar) }