@@ -31,6 +31,7 @@ import (
3131 "github.com/cockroachdb/cockroach/pkg/sql/contentionpb"
3232 "github.com/cockroachdb/cockroach/pkg/sql/execinfra"
3333 "github.com/cockroachdb/cockroach/pkg/sql/execstats"
34+ "github.com/cockroachdb/cockroach/pkg/sql/hints"
3435 "github.com/cockroachdb/cockroach/pkg/sql/isql"
3536 "github.com/cockroachdb/cockroach/pkg/sql/opt/cat"
3637 "github.com/cockroachdb/cockroach/pkg/sql/opt/exec/explain"
@@ -383,12 +384,16 @@ func (ex *connExecutor) execStmtInOpenState(
383384
384385 isExtendedProtocol := prepared != nil
385386 stmtFingerprintFmtMask := tree .FmtHideConstants | tree .FmtFlags (tree .QueryFormattingForFingerprintsMask .Get (& ex .server .cfg .Settings .SV ))
387+ var statementHintsCache * hints.StatementHintsCache
388+ if ex .executorType != executorTypeInternal {
389+ statementHintsCache = ex .server .cfg .StatementHintsCache
390+ }
386391
387392 var stmt Statement
388393 if isExtendedProtocol {
389- stmt = makeStatementFromPrepared (prepared , queryID )
394+ stmt = makeStatementFromPrepared (ctx , prepared , queryID , stmtFingerprintFmtMask , statementHintsCache )
390395 } else {
391- stmt = makeStatement (parserStmt , queryID , stmtFingerprintFmtMask )
396+ stmt = makeStatement (ctx , parserStmt , queryID , stmtFingerprintFmtMask , statementHintsCache )
392397 }
393398
394399 if len (stmt .QueryTags ) > 0 {
@@ -557,6 +562,10 @@ func (ex *connExecutor) execStmtInOpenState(
557562 stmt .ExpectedTypes = ps .Columns
558563 stmt .StmtNoConstants = ps .StatementNoConstants
559564 stmt .StmtSummary = ps .StatementSummary
565+ stmt .Hints = ps .Hints
566+ stmt .HintIDs = ps .HintIDs
567+ stmt .HintsGeneration = ps .HintsGeneration
568+ stmt .ReloadHintsIfStale (ctx , stmtFingerprintFmtMask , statementHintsCache )
560569 res .ResetStmtType (ps .AST )
561570
562571 if e .DiscardRows {
@@ -888,7 +897,12 @@ func (ex *connExecutor) execStmtInOpenState(
888897 typeHints [i ] = resolved
889898 }
890899 }
900+ var statementHintsCache * hints.StatementHintsCache
901+ if ex .executorType != executorTypeInternal {
902+ statementHintsCache = ex .server .cfg .StatementHintsCache
903+ }
891904 prepStmt := makeStatement (
905+ ctx ,
892906 statements.Statement [tree.Statement ]{
893907 // We need the SQL string just for the part that comes after
894908 // "PREPARE ... AS",
@@ -901,6 +915,7 @@ func (ex *connExecutor) execStmtInOpenState(
901915 },
902916 ex .server .cfg .GenerateID (),
903917 tree .FmtFlags (tree .QueryFormattingForFingerprintsMask .Get (& ex .server .cfg .Settings .SV )),
918+ statementHintsCache ,
904919 )
905920 var rawTypeHints []oid.Oid
906921
@@ -1252,11 +1267,15 @@ func (ex *connExecutor) execStmtInOpenStateWithPausablePortal(
12521267
12531268 isExtendedProtocol := portal != nil && portal .Stmt != nil
12541269 stmtFingerprintFmtMask := tree .FmtHideConstants | tree .FmtFlags (tree .QueryFormattingForFingerprintsMask .Get (& ex .server .cfg .Settings .SV ))
1270+ var statementHintsCache * hints.StatementHintsCache
1271+ if ex .executorType != executorTypeInternal {
1272+ statementHintsCache = ex .server .cfg .StatementHintsCache
1273+ }
12551274
12561275 if isExtendedProtocol {
1257- vars .stmt = makeStatementFromPrepared (portal .Stmt , queryID )
1276+ vars .stmt = makeStatementFromPrepared (ctx , portal .Stmt , queryID , stmtFingerprintFmtMask , statementHintsCache )
12581277 } else {
1259- vars .stmt = makeStatement (parserStmt , queryID , stmtFingerprintFmtMask )
1278+ vars .stmt = makeStatement (ctx , parserStmt , queryID , stmtFingerprintFmtMask , statementHintsCache )
12601279 }
12611280
12621281 var queryTimeoutTicker * time.Timer
@@ -1443,6 +1462,10 @@ func (ex *connExecutor) execStmtInOpenStateWithPausablePortal(
14431462 vars .stmt .ExpectedTypes = ps .Columns
14441463 vars .stmt .StmtNoConstants = ps .StatementNoConstants
14451464 vars .stmt .StmtSummary = ps .StatementSummary
1465+ vars .stmt .Hints = ps .Hints
1466+ vars .stmt .HintIDs = ps .HintIDs
1467+ vars .stmt .HintsGeneration = ps .HintsGeneration
1468+ vars .stmt .ReloadHintsIfStale (ctx , stmtFingerprintFmtMask , statementHintsCache )
14461469 res .ResetStmtType (ps .AST )
14471470
14481471 if e .DiscardRows {
@@ -1852,7 +1875,12 @@ func (ex *connExecutor) execStmtInOpenStateWithPausablePortal(
18521875 typeHints [i ] = resolved
18531876 }
18541877 }
1878+ var statementHintsCache * hints.StatementHintsCache
1879+ if ex .executorType != executorTypeInternal {
1880+ statementHintsCache = ex .server .cfg .StatementHintsCache
1881+ }
18551882 prepStmt := makeStatement (
1883+ ctx ,
18561884 statements.Statement [tree.Statement ]{
18571885 // We need the SQL string just for the part that comes after
18581886 // "PREPARE ... AS",
@@ -1865,6 +1893,7 @@ func (ex *connExecutor) execStmtInOpenStateWithPausablePortal(
18651893 },
18661894 ex .server .cfg .GenerateID (),
18671895 tree .FmtFlags (tree .QueryFormattingForFingerprintsMask .Get (& ex .server .cfg .Settings .SV )),
1896+ statementHintsCache ,
18681897 )
18691898 var rawTypeHints []oid.Oid
18701899
@@ -3463,8 +3492,11 @@ func (ex *connExecutor) execStmtInNoTxnState(
34633492 }
34643493
34653494 p := & ex .planner
3466- stmt := makeStatement (parserStmt , ex .server .cfg .GenerateID (),
3467- tree .FmtFlags (tree .QueryFormattingForFingerprintsMask .Get (& ex .server .cfg .Settings .SV )))
3495+ stmt := makeStatement (
3496+ ctx , parserStmt , ex .server .cfg .GenerateID (),
3497+ tree .FmtFlags (tree .QueryFormattingForFingerprintsMask .Get (& ex .server .cfg .Settings .SV )),
3498+ nil , /* statementHintsCache */
3499+ )
34683500 p .stmt = stmt
34693501 p .semaCtx .Annotations = tree .MakeAnnotations (stmt .NumAnnotations )
34703502 p .extendedEvalCtx .Annotations = & p .semaCtx .Annotations
0 commit comments