Skip to content

Commit 1fcb199

Browse files
hawkingreizeminzhou
authored andcommitted
generatedexpr: reuse parser to improve performance (pingcap#59304)
close pingcap#59303
1 parent b95d7ec commit 1fcb199

File tree

1 file changed

+6
-1
lines changed

1 file changed

+6
-1
lines changed

pkg/util/generatedexpr/generated_expr.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ package generatedexpr
1616

1717
import (
1818
"fmt"
19+
"sync"
1920

2021
"github.com/pingcap/errors"
2122
"github.com/pingcap/tidb/pkg/meta/model"
@@ -53,14 +54,18 @@ func (nr *nameResolver) Leave(inNode ast.Node) (node ast.Node, ok bool) {
5354
return inNode, true
5455
}
5556

57+
var parserPool = &sync.Pool{New: func() any { return parser.New() }}
58+
5659
// ParseExpression parses an ExprNode from a string.
5760
// When TiDB loads infoschema from TiKV, `GeneratedExprString`
5861
// of `ColumnInfo` is a string field, so we need to parse
5962
// it into ast.ExprNode. This function is for that.
6063
func ParseExpression(expr string) (node ast.ExprNode, err error) {
6164
expr = fmt.Sprintf("select %s", expr)
6265
charset, collation := charset.GetDefaultCharsetAndCollate()
63-
stmts, _, err := parser.New().ParseSQL(expr,
66+
parse := parserPool.Get().(*parser.Parser)
67+
defer parserPool.Put(parse)
68+
stmts, _, err := parse.ParseSQL(expr,
6469
parser.CharsetConnection(charset),
6570
parser.CollationConnection(collation))
6671
if err == nil {

0 commit comments

Comments
 (0)