diff --git a/pkg/bindinfo/BUILD.bazel b/pkg/bindinfo/BUILD.bazel index 55b8c67a178c9..fc81b0958b6b9 100644 --- a/pkg/bindinfo/BUILD.bazel +++ b/pkg/bindinfo/BUILD.bazel @@ -45,6 +45,7 @@ go_library( "//pkg/util/table-filter", "@com_github_pingcap_errors//:errors", "@com_github_pingcap_failpoint//:failpoint", + "@com_github_pkg_errors//:errors", "@org_golang_x_sync//singleflight", "@org_uber_go_zap//:zap", ], diff --git a/pkg/bindinfo/binding.go b/pkg/bindinfo/binding.go index 447e80dd8f778..8f3586f676175 100644 --- a/pkg/bindinfo/binding.go +++ b/pkg/bindinfo/binding.go @@ -23,6 +23,7 @@ import ( "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/hint" + "github.com/pkg/errors" ) const ( @@ -130,7 +131,13 @@ func HasAvailableBinding(br Bindings) bool { // prepareHints builds ID and Hint for Bindings. If sctx is not nil, we check if // the BindSQL is still valid. -func prepareHints(sctx sessionctx.Context, binding *Binding) error { +func prepareHints(sctx sessionctx.Context, binding *Binding) (rerr error) { + defer func() { + if r := recover(); r != nil { + rerr = errors.Errorf("panic when preparing hints for binding %v, panic: %v", binding.BindSQL, r) + } + }() + p := parser.New() if (binding.Hint != nil && binding.ID != "") || binding.Status == deleted { return nil