@@ -770,6 +770,121 @@ func TestMPPHintsScope(t *testing.T) {
770
770
}
771
771
}
772
772
773
+ func TestMPPBCJModel (t * testing.T ) {
774
+ /*
775
+ if there are 3 mpp stores, planner won't choose broadcast join enven if `tidb_prefer_broadcast_join_by_exchange_data_size` is ON
776
+ broadcast exchange size:
777
+ Build: 2 * sizeof(Data)
778
+ Probe: 0
779
+ exchange size: Build = 2 * sizeof(Data)
780
+ hash exchange size:
781
+ Build: sizeof(Data) * 2 / 3
782
+ Probe: sizeof(Data) * 2 / 3
783
+ exchange size: Build + Probe = 4/3 * sizeof(Data)
784
+ */
785
+ store := testkit .CreateMockStore (t , internal .WithMockTiFlash (3 ))
786
+ {
787
+ cnt , err := store .GetMPPClient ().GetMPPStoreCount ()
788
+ require .Equal (t , cnt , 3 )
789
+ require .Nil (t , err )
790
+ }
791
+ tk := testkit .NewTestKit (t , store )
792
+ tk .MustExec ("use test" )
793
+ tk .MustExec ("create table t (a int, b int, c int, index idx_a(a), index idx_b(b))" )
794
+ tk .MustExec ("alter table t set tiflash replica 1" )
795
+ tb := external .GetTableByName (t , tk , "test" , "t" )
796
+ err := domain .GetDomain (tk .Session ()).DDL ().UpdateTableReplicaInfo (tk .Session (), tb .Meta ().ID , true )
797
+ require .NoError (t , err )
798
+
799
+ var input []string
800
+ var output []struct {
801
+ SQL string
802
+ Plan []string
803
+ Warn []string
804
+ }
805
+ planSuiteData := GetPlanSuiteData ()
806
+ planSuiteData .LoadTestCases (t , & input , & output )
807
+ for i , tt := range input {
808
+ testdata .OnRecord (func () {
809
+ output [i ].SQL = tt
810
+ })
811
+ if strings .HasPrefix (tt , "set" ) || strings .HasPrefix (tt , "UPDATE" ) {
812
+ tk .MustExec (tt )
813
+ continue
814
+ }
815
+ testdata .OnRecord (func () {
816
+ output [i ].SQL = tt
817
+ output [i ].Plan = testdata .ConvertRowsToStrings (tk .MustQuery (tt ).Rows ())
818
+ output [i ].Warn = testdata .ConvertSQLWarnToStrings (tk .Session ().GetSessionVars ().StmtCtx .GetWarnings ())
819
+ })
820
+ res := tk .MustQuery (tt )
821
+ res .Check (testkit .Rows (output [i ].Plan ... ))
822
+ require .Equal (t , output [i ].Warn , testdata .ConvertSQLWarnToStrings (tk .Session ().GetSessionVars ().StmtCtx .GetWarnings ()))
823
+ }
824
+ }
825
+
826
+ func TestMPPBCJModelOneTiFlash (t * testing.T ) {
827
+ /*
828
+ if there are 1 mpp stores, planner should choose broadcast join if `tidb_prefer_broadcast_join_by_exchange_data_size` is ON
829
+ broadcast exchange size:
830
+ Build: 0 * sizeof(Data)
831
+ Probe: 0
832
+ exchange size: Build = 0 * sizeof(Data)
833
+ hash exchange size:
834
+ Build: sizeof(Data) * 0 / 1
835
+ Probe: sizeof(Data) * 0 / 1
836
+ exchange size: Build + Probe = 0 * sizeof(Data)
837
+ */
838
+ store := testkit .CreateMockStore (t , internal .WithMockTiFlash (1 ))
839
+ tk := testkit .NewTestKit (t , store )
840
+ tk .MustExec ("use test" )
841
+ tk .MustExec ("create table t (a int, b int, c int, index idx_a(a), index idx_b(b))" )
842
+ tk .MustExec ("alter table t set tiflash replica 1" )
843
+ tb := external .GetTableByName (t , tk , "test" , "t" )
844
+ err := domain .GetDomain (tk .Session ()).DDL ().UpdateTableReplicaInfo (tk .Session (), tb .Meta ().ID , true )
845
+ require .NoError (t , err )
846
+ {
847
+ cnt , err := store .GetMPPClient ().GetMPPStoreCount ()
848
+ require .Equal (t , cnt , 1 )
849
+ require .Nil (t , err )
850
+ }
851
+ {
852
+ tk .MustExecToErr ("set @@session.tidb_prefer_broadcast_join_by_exchange_data_size=-1" )
853
+ tk .MustExecToErr ("set @@session.tidb_prefer_broadcast_join_by_exchange_data_size=2" )
854
+ }
855
+ {
856
+ // no BCJ if `tidb_prefer_broadcast_join_by_exchange_data_size` is OFF
857
+ tk .MustExec ("set @@session.tidb_broadcast_join_threshold_size=0" )
858
+ tk .MustExec ("set @@session.tidb_broadcast_join_threshold_count=0" )
859
+ }
860
+
861
+ var input []string
862
+ var output []struct {
863
+ SQL string
864
+ Plan []string
865
+ Warn []string
866
+ }
867
+ planSuiteData := GetPlanSuiteData ()
868
+ planSuiteData .LoadTestCases (t , & input , & output )
869
+ for i , tt := range input {
870
+ testdata .OnRecord (func () {
871
+ output [i ].SQL = tt
872
+ })
873
+ if strings .HasPrefix (tt , "set" ) || strings .HasPrefix (tt , "UPDATE" ) {
874
+ tk .MustExec (tt )
875
+ continue
876
+ }
877
+ testdata .OnRecord (func () {
878
+ output [i ].SQL = tt
879
+ output [i ].Plan = testdata .ConvertRowsToStrings (tk .MustQuery (tt ).Rows ())
880
+ output [i ].Warn = testdata .ConvertSQLWarnToStrings (tk .Session ().GetSessionVars ().StmtCtx .GetWarnings ())
881
+ })
882
+ res := tk .MustQuery (tt )
883
+ res .Check (testkit .Rows (output [i ].Plan ... ))
884
+ require .Equal (t , output [i ].Warn , testdata .ConvertSQLWarnToStrings (tk .Session ().GetSessionVars ().StmtCtx .GetWarnings ()))
885
+ }
886
+ }
887
+
773
888
func TestHintScope (t * testing.T ) {
774
889
store := testkit .CreateMockStore (t )
775
890
tk := testkit .NewTestKit (t , store )
0 commit comments