@@ -205,8 +205,6 @@ type session struct {
205
205
206
206
store kv.Storage
207
207
208
- parserPool * sync.Pool
209
-
210
208
preparedPlanCache * kvcache.SimpleLRUCache
211
209
212
210
sessionVars * variable.SessionVars
@@ -225,8 +223,12 @@ type session struct {
225
223
226
224
// indexUsageCollector collects index usage information.
227
225
idxUsageCollector * handle.SessionIndexUsageCollector
226
+
227
+ cache [1 ]ast.StmtNode
228
228
}
229
229
230
+ var parserPool = & sync.Pool {New : func () interface {} { return parser .New () }}
231
+
230
232
// AddTableLock adds table lock to the session lock map.
231
233
func (s * session ) AddTableLock (locks []model.TableLockTpInfo ) {
232
234
for _ , l := range locks {
@@ -1241,11 +1243,19 @@ func (s *session) ParseSQL(ctx context.Context, sql, charset, collation string)
1241
1243
}
1242
1244
defer trace .StartRegion (ctx , "ParseSQL" ).End ()
1243
1245
1244
- p := s . parserPool .Get ().(* parser.Parser )
1245
- defer s . parserPool .Put (p )
1246
+ p := parserPool .Get ().(* parser.Parser )
1247
+ defer parserPool .Put (p )
1246
1248
p .SetSQLMode (s .sessionVars .SQLMode )
1247
1249
p .SetParserConfig (s .sessionVars .BuildParserConfig ())
1248
- return p .Parse (sql , charset , collation )
1250
+ tmp , warn , err := p .Parse (sql , charset , collation )
1251
+ // The []ast.StmtNode is referenced by the parser, to reuse the parser, make a copy of the result.
1252
+ if len (tmp ) == 1 {
1253
+ s .cache [0 ] = tmp [0 ]
1254
+ return s .cache [:], warn , err
1255
+ }
1256
+ res := make ([]ast.StmtNode , len (tmp ))
1257
+ copy (res , tmp )
1258
+ return res , warn , err
1249
1259
}
1250
1260
1251
1261
func (s * session ) SetProcessInfo (sql string , t time.Time , command byte , maxExecutionTime uint64 ) {
@@ -1861,7 +1871,7 @@ func (s *session) preparedStmtExec(ctx context.Context,
1861
1871
}
1862
1872
}
1863
1873
sessionExecuteCompileDurationGeneral .Observe (time .Since (s .sessionVars .StartTime ).Seconds ())
1864
- logQuery (st . OriginText () , s )
1874
+ logGeneralQuery (st , s , true )
1865
1875
return runStmt (ctx , s , st )
1866
1876
}
1867
1877
@@ -1901,7 +1911,7 @@ func (s *session) cachedPlanExec(ctx context.Context,
1901
1911
stmtCtx .OriginalSQL = stmt .Text
1902
1912
stmtCtx .InitSQLDigest (prepareStmt .NormalizedSQL , prepareStmt .SQLDigest )
1903
1913
stmtCtx .SetPlanDigest (prepareStmt .NormalizedPlan , prepareStmt .PlanDigest )
1904
- logQuery (stmt . GetTextToLog () , s )
1914
+ logGeneralQuery (stmt , s , false )
1905
1915
1906
1916
if ! s .isInternal () && config .GetGlobalConfig ().EnableTelemetry {
1907
1917
telemetry .CurrentExecuteCount .Inc ()
@@ -2637,7 +2647,6 @@ func createSessionWithOpt(store kv.Storage, opt *Opt) (*session, error) {
2637
2647
}
2638
2648
s := & session {
2639
2649
store : store ,
2640
- parserPool : & sync.Pool {New : func () interface {} { return parser .New () }},
2641
2650
sessionVars : variable .NewSessionVars (),
2642
2651
ddlOwnerChecker : dom .DDL ().OwnerManager (),
2643
2652
client : store .GetClient (),
@@ -2671,7 +2680,6 @@ func createSessionWithOpt(store kv.Storage, opt *Opt) (*session, error) {
2671
2680
func CreateSessionWithDomain (store kv.Storage , dom * domain.Domain ) (* session , error ) {
2672
2681
s := & session {
2673
2682
store : store ,
2674
- parserPool : & sync.Pool {New : func () interface {} { return parser .New () }},
2675
2683
sessionVars : variable .NewSessionVars (),
2676
2684
client : store .GetClient (),
2677
2685
mppClient : store .GetMPPClient (),
@@ -2894,13 +2902,20 @@ func logStmt(execStmt *executor.ExecStmt, s *session) {
2894
2902
zap .Stringer ("user" , user ))
2895
2903
}
2896
2904
default :
2897
- logQuery (execStmt . GetTextToLog () , s )
2905
+ logGeneralQuery (execStmt , s , false )
2898
2906
}
2899
2907
}
2900
2908
2901
- func logQuery ( query string , s * session ) {
2909
+ func logGeneralQuery ( execStmt * executor. ExecStmt , s * session , isPrepared bool ) {
2902
2910
vars := s .GetSessionVars ()
2903
2911
if variable .ProcessGeneralLog .Load () && ! vars .InRestrictedSQL {
2912
+ var query string
2913
+ if isPrepared {
2914
+ query = execStmt .OriginText ()
2915
+ } else {
2916
+ query = execStmt .GetTextToLog ()
2917
+ }
2918
+
2904
2919
query = executor .QueryReplacer .Replace (query )
2905
2920
if ! vars .EnableRedactLog {
2906
2921
query += vars .PreparedParams .String ()
0 commit comments