@@ -42,6 +42,7 @@ import (
4242 "github.com/pingcap/tidb/privilege/privileges"
4343 "github.com/pingcap/tidb/session"
4444 "github.com/pingcap/tidb/sessionctx"
45+ "github.com/pingcap/tidb/sessionctx/stmtctx"
4546 "github.com/pingcap/tidb/sessionctx/variable"
4647 "github.com/pingcap/tidb/store/copr"
4748 "github.com/pingcap/tidb/store/mockstore"
@@ -4139,3 +4140,63 @@ func TestSQLModeOp(t *testing.T) {
41394140 a = mysql .SetSQLMode (s , mysql .ModeAllowInvalidDates )
41404141 require .Equal (t , mysql .ModeNoBackslashEscapes | mysql .ModeOnlyFullGroupBy | mysql .ModeAllowInvalidDates , a )
41414142}
4143+
4144+ func TestPrepareExecuteWithSQLHints (t * testing.T ) {
4145+ store := testkit .CreateMockStore (t )
4146+ tk := testkit .NewTestKit (t , store )
4147+ se := tk .Session ()
4148+ se .SetConnectionID (1 )
4149+ tk .MustExec ("use test" )
4150+ tk .MustExec ("create table t(a int primary key)" )
4151+
4152+ type hintCheck struct {
4153+ hint string
4154+ check func (* stmtctx.StmtHints )
4155+ }
4156+
4157+ hintChecks := []hintCheck {
4158+ {
4159+ hint : "MEMORY_QUOTA(1024 MB)" ,
4160+ check : func (stmtHint * stmtctx.StmtHints ) {
4161+ require .True (t , stmtHint .HasMemQuotaHint )
4162+ require .Equal (t , int64 (1024 * 1024 * 1024 ), stmtHint .MemQuotaQuery )
4163+ },
4164+ },
4165+ {
4166+ hint : "READ_CONSISTENT_REPLICA()" ,
4167+ check : func (stmtHint * stmtctx.StmtHints ) {
4168+ require .True (t , stmtHint .HasReplicaReadHint )
4169+ require .Equal (t , byte (kv .ReplicaReadFollower ), stmtHint .ReplicaRead )
4170+ },
4171+ },
4172+ {
4173+ hint : "MAX_EXECUTION_TIME(1000)" ,
4174+ check : func (stmtHint * stmtctx.StmtHints ) {
4175+ require .True (t , stmtHint .HasMaxExecutionTime )
4176+ require .Equal (t , uint64 (1000 ), stmtHint .MaxExecutionTime )
4177+ },
4178+ },
4179+ {
4180+ hint : "USE_TOJA(TRUE)" ,
4181+ check : func (stmtHint * stmtctx.StmtHints ) {
4182+ require .True (t , stmtHint .HasAllowInSubqToJoinAndAggHint )
4183+ require .True (t , stmtHint .AllowInSubqToJoinAndAgg )
4184+ },
4185+ },
4186+ }
4187+
4188+ for i , check := range hintChecks {
4189+ // common path
4190+ tk .MustExec (fmt .Sprintf ("prepare stmt%d from 'select /*+ %s */ * from t'" , i , check .hint ))
4191+ for j := 0 ; j < 10 ; j ++ {
4192+ tk .MustQuery (fmt .Sprintf ("execute stmt%d" , i ))
4193+ check .check (& tk .Session ().GetSessionVars ().StmtCtx .StmtHints )
4194+ }
4195+ // fast path
4196+ tk .MustExec (fmt .Sprintf ("prepare fast%d from 'select /*+ %s */ * from t where a = 1'" , i , check .hint ))
4197+ for j := 0 ; j < 10 ; j ++ {
4198+ tk .MustQuery (fmt .Sprintf ("execute fast%d" , i ))
4199+ check .check (& tk .Session ().GetSessionVars ().StmtCtx .StmtHints )
4200+ }
4201+ }
4202+ }
0 commit comments