diff --git a/executor/prepared.go b/executor/prepared.go index d2821417a77a0..28445b1c770da 100644 --- a/executor/prepared.go +++ b/executor/prepared.go @@ -114,7 +114,11 @@ func (e *PrepareExec) Next(ctx context.Context, chk *chunk.Chunk) error { } else { p := parser.New() p.EnableWindowFunc(vars.EnableWindowFunction) - stmts, err = p.Parse(e.sqlText, charset, collation) + var warns []error + stmts, warns, err = p.Parse(e.sqlText, charset, collation) + for _, warn := range warns { + e.ctx.GetSessionVars().StmtCtx.AppendWarning(warn) + } } if err != nil { return errors.Trace(err) diff --git a/expression/integration_test.go b/expression/integration_test.go index 1e6b24702f599..5e5f73d7770f9 100644 --- a/expression/integration_test.go +++ b/expression/integration_test.go @@ -3697,6 +3697,16 @@ func (s *testIntegrationSuite) TestDecimalMul(c *C) { res.Check(testkit.Rows("0.55125221922461136")) } +func (s *testIntegrationSuite) TestUnknowHintIgnore(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("USE test") + tk.MustExec("create table t(a int)") + tk.MustQuery("select /*+ unkown_hint(c1)*/ 1").Check(testkit.Rows("1")) + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1105 line 1 column 28 near \" 1\" (total length 30)")) + _, err := tk.Exec("select 1 from /*+ test1() */ t") + c.Assert(err, NotNil) +} + func (s *testIntegrationSuite) TestValuesInNonInsertStmt(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec(`use test;`) diff --git a/expression/simple_rewriter.go b/expression/simple_rewriter.go index d0674fb87b33f..7172b699e85ee 100644 --- a/expression/simple_rewriter.go +++ b/expression/simple_rewriter.go @@ -37,7 +37,10 @@ type simpleRewriter struct { // The expression string must only reference the column in table Info. func ParseSimpleExprWithTableInfo(ctx sessionctx.Context, exprStr string, tableInfo *model.TableInfo) (Expression, error) { exprStr = "select " + exprStr - stmts, err := parser.New().Parse(exprStr, "", "") + stmts, warns, err := parser.New().Parse(exprStr, "", "") + for _, warn := range warns { + ctx.GetSessionVars().StmtCtx.AppendWarning(warn) + } if err != nil { return nil, err } @@ -72,7 +75,10 @@ func RewriteSimpleExprWithTableInfo(ctx sessionctx.Context, tbl *model.TableInfo // The expression string must only reference the column in the given schema. func ParseSimpleExprsWithSchema(ctx sessionctx.Context, exprStr string, schema *Schema) ([]Expression, error) { exprStr = "select " + exprStr - stmts, err := parser.New().Parse(exprStr, "", "") + stmts, warns, err := parser.New().Parse(exprStr, "", "") + for _, warn := range warns { + ctx.GetSessionVars().StmtCtx.AppendWarning(warn) + } if err != nil { return nil, err } diff --git a/go.mod b/go.mod index 6fa2dae0af852..f5a6c0a7d7b19 100644 --- a/go.mod +++ b/go.mod @@ -49,7 +49,7 @@ require ( github.com/pingcap/gofail v0.0.0-20181217135706-6a951c1e42c3 github.com/pingcap/goleveldb v0.0.0-20171020122428-b9ff6c35079e github.com/pingcap/kvproto v0.0.0-20181105061835-1b5d69cd1d26 - github.com/pingcap/parser v0.0.0-20181218071912-deacf026787e + github.com/pingcap/parser v0.0.0-20181221050948-947d4ab3052f github.com/pingcap/pd v2.1.0-rc.4+incompatible github.com/pingcap/tidb-tools v2.1.1-0.20181218072513-b2235d442b06+incompatible github.com/pingcap/tipb v0.0.0-20181012112600-11e33c750323 diff --git a/go.sum b/go.sum index 7aea00b386ac4..f30d7e601d11e 100644 --- a/go.sum +++ b/go.sum @@ -125,8 +125,8 @@ github.com/pingcap/goleveldb v0.0.0-20171020122428-b9ff6c35079e h1:P73/4dPCL96rG github.com/pingcap/goleveldb v0.0.0-20171020122428-b9ff6c35079e/go.mod h1:O17XtbryoCJhkKGbT62+L2OlrniwqiGLSqrmdHCMzZw= github.com/pingcap/kvproto v0.0.0-20181105061835-1b5d69cd1d26 h1:JK4VLNYbSn36QSbCnqALi2ySXdH0DfcMssT/zmLf4Ls= github.com/pingcap/kvproto v0.0.0-20181105061835-1b5d69cd1d26/go.mod h1:0gwbe1F2iBIjuQ9AH0DbQhL+Dpr5GofU8fgYyXk+ykk= -github.com/pingcap/parser v0.0.0-20181218071912-deacf026787e h1:jKibIs55HR7OMo62uhjA6Bfx3GK+rbHK4Gfd4/8aTzk= -github.com/pingcap/parser v0.0.0-20181218071912-deacf026787e/go.mod h1:1FNvfp9+J0wvc4kl8eGNh7Rqrxveg15jJoWo/a0uHwA= +github.com/pingcap/parser v0.0.0-20181221050948-947d4ab3052f h1:X2ZRYBERoJ5VDp7CdtXWfwbKqbeYn2kkdGA0b5/VwJ8= +github.com/pingcap/parser v0.0.0-20181221050948-947d4ab3052f/go.mod h1:1FNvfp9+J0wvc4kl8eGNh7Rqrxveg15jJoWo/a0uHwA= github.com/pingcap/pd v2.1.0-rc.4+incompatible h1:/buwGk04aHO5odk/+O8ZOXGs4qkUjYTJ2UpCJXna8NE= github.com/pingcap/pd v2.1.0-rc.4+incompatible/go.mod h1:nD3+EoYes4+aNNODO99ES59V83MZSI+dFbhyr667a0E= github.com/pingcap/tidb-tools v2.1.1-0.20181218072513-b2235d442b06+incompatible h1:Bsd+NHosPVowEGB3BCx+2d8wUQGDTXSSC5ljeNS6cXo= diff --git a/session/session.go b/session/session.go index 1838880eaeff8..814da0c20de46 100644 --- a/session/session.go +++ b/session/session.go @@ -810,7 +810,7 @@ func (s *session) SetGlobalSysVar(name, value string) error { return errors.Trace(err) } -func (s *session) ParseSQL(ctx context.Context, sql, charset, collation string) ([]ast.StmtNode, error) { +func (s *session) ParseSQL(ctx context.Context, sql, charset, collation string) ([]ast.StmtNode, []error, error) { if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { span1 := span.Tracer().StartSpan("session.ParseSQL", opentracing.ChildOf(span.Context())) defer span1.Finish() @@ -885,7 +885,7 @@ func (s *session) execute(ctx context.Context, sql string) (recordSets []sqlexec // Step1: Compile query string to abstract syntax trees(ASTs). startTS := time.Now() - stmtNodes, err := s.ParseSQL(ctx, sql, charsetInfo, collation) + stmtNodes, warns, err := s.ParseSQL(ctx, sql, charsetInfo, collation) if err != nil { s.rollbackOnError(ctx) log.Warnf("con:%d parse error:\n%v\n%s", connID, err, sql) @@ -922,6 +922,10 @@ func (s *session) execute(ctx context.Context, sql string) (recordSets []sqlexec // return the first recordset if client doesn't support ClientMultiResults. recordSets = recordSets[:1] } + + for _, warn := range warns { + s.sessionVars.StmtCtx.AppendWarning(warn) + } return recordSets, nil } diff --git a/session/tidb.go b/session/tidb.go index 7ef039281bf0b..3df30dc955367 100644 --- a/session/tidb.go +++ b/session/tidb.go @@ -125,7 +125,10 @@ func Parse(ctx sessionctx.Context, src string) ([]ast.StmtNode, error) { p := parser.New() p.EnableWindowFunc(ctx.GetSessionVars().EnableWindowFunction) p.SetSQLMode(ctx.GetSessionVars().SQLMode) - stmts, err := p.Parse(src, charset, collation) + stmts, warns, err := p.Parse(src, charset, collation) + for _, warn := range warns { + ctx.GetSessionVars().StmtCtx.AppendWarning(warn) + } if err != nil { log.Warnf("compiling %s, error: %v", src, err) return nil, errors.Trace(err) diff --git a/table/tables/gen_expr.go b/table/tables/gen_expr.go index 85ea540eac85b..ba11e7e7b4ab3 100644 --- a/table/tables/gen_expr.go +++ b/table/tables/gen_expr.go @@ -61,7 +61,7 @@ func (nr *nameResolver) Leave(inNode ast.Node) (node ast.Node, ok bool) { func parseExpression(expr string) (node ast.ExprNode, err error) { expr = fmt.Sprintf("select %s", expr) charset, collation := charset.GetDefaultCharsetAndCollate() - stmts, err := parser.New().Parse(expr, charset, collation) + stmts, _, err := parser.New().Parse(expr, charset, collation) if err == nil { node = stmts[0].(*ast.SelectStmt).Fields.Fields[0].Expr }