Skip to content
53 changes: 18 additions & 35 deletions pkg/planner/core/physical_plan_trace_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -146,47 +146,30 @@ func TestPhysicalOptimizerTrace(t *testing.T) {
otrace := sctx.GetSessionVars().StmtCtx.OptimizeTracer.Physical
require.NotNil(t, otrace)
elements := map[int]string{
26: "TableFullScan",
30: "TableReader",
29: "TableFullScan",
22: "HashAgg",
32: "TableReader",
8: "Projection",
28: "HashAgg",
16: "HashJoin",
18: "HashJoin",
17: "HashJoin",
14: "HashAgg",
10: "Sort",
27: "HashAgg",
28: "TableReader",
11: "Sort",
15: "HashAgg",
27: "TableFullScan",
29: "TableReader",
20: "HashAgg",
31: "TableFullScan",
16: "HashJoin",
8: "Projection",
}
final := map[int]struct{}{
26: {},
20: {},
28: {},
27: {},
31: {},
32: {},
17: {},
14: {},
10: {},
8: {},
24: "TableFullScan",
25: "HashAgg",
30: "TableFullScan",
23: "HashAgg",
21: "HashAgg",
31: "TableReader",
32: "TableFullScan",
33: "TableReader",
}
for _, c := range otrace.Candidates {
tp, ok := elements[c.ID]
if !ok || tp != c.TP {
t.FailNow()
}
}
require.Len(t, otrace.Candidates, len(elements))
for _, p := range otrace.Final {
_, ok := final[p.ID]
if !ok {
t.FailNow()
}
require.Truef(t, ok, "ID: %d not found in elements", c.ID)
require.Equalf(t, tp, c.TP, "ID: %d, expected TP: %s, got TP: %s", c.ID, tp, c.TP)
}
require.Len(t, otrace.Final, len(final))
}

func TestPhysicalOptimizerTraceChildrenNotDuplicated(t *testing.T) {
Expand Down
2 changes: 1 addition & 1 deletion pkg/planner/core/testdata/plan_suite_unexported_out.json
Original file line number Diff line number Diff line change
Expand Up @@ -1140,7 +1140,7 @@
"handle cols: test.t3._tidb_rowid:0"
]
],
"InsidePlan": "TableReader(Table(t3)->Sel([eq(test.t3.b, 1)]))->Projection"
"InsidePlan": "TableReader(Table(t3)->Sel([eq(test.t3.b, 1)])->Projection)"
},
{
"SQL": "",
Expand Down
5 changes: 4 additions & 1 deletion pkg/sessionctx/variable/session.go
Original file line number Diff line number Diff line change
Expand Up @@ -2183,7 +2183,7 @@ func NewSessionVars(hctx HookContext) *SessionVars {
AllowCartesianBCJ: vardef.DefOptCartesianBCJ,
MPPOuterJoinFixedBuildSide: vardef.DefOptMPPOuterJoinFixedBuildSide,
BroadcastJoinThresholdSize: vardef.DefBroadcastJoinThresholdSize,
BroadcastJoinThresholdCount: vardef.DefBroadcastJoinThresholdSize,
BroadcastJoinThresholdCount: vardef.DefBroadcastJoinThresholdCount,
OptimizerSelectivityLevel: vardef.DefTiDBOptimizerSelectivityLevel,
EnableOuterJoinReorder: vardef.DefTiDBEnableOuterJoinReorder,
RetryLimit: vardef.DefTiDBRetryLimit,
Expand Down Expand Up @@ -2290,7 +2290,10 @@ func NewSessionVars(hctx HookContext) *SessionVars {
CostModelVersion: vardef.DefTiDBCostModelVer,
OptimizerEnableNAAJ: vardef.DefTiDBEnableNAAJ,
OptOrderingIdxSelRatio: vardef.DefTiDBOptOrderingIdxSelRatio,
RegardNULLAsPoint: vardef.DefTiDBRegardNULLAsPoint,
AllowProjectionPushDown: vardef.DefOptEnableProjectionPushDown,
}
vars.TiFlashFineGrainedShuffleBatchSize = vardef.DefTiFlashFineGrainedShuffleBatchSize
vars.status.Store(uint32(mysql.ServerStatusAutocommit))
vars.StmtCtx.ResourceGroupName = resourcegroup.DefaultResourceGroupName
vars.KVVars = tikvstore.NewVariables(&vars.SQLKiller.Signal)
Expand Down
1 change: 1 addition & 0 deletions pkg/util/ranger/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ go_library(
"//pkg/util/collate",
"//pkg/util/dbterror/plannererrors",
"//pkg/util/hack",
"//pkg/util/intest",
"//pkg/util/ranger/context",
"@com_github_pingcap_errors//:errors",
],
Expand Down
7 changes: 7 additions & 0 deletions pkg/util/ranger/detacher.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import (
"github.com/pingcap/tidb/pkg/types"
"github.com/pingcap/tidb/pkg/util/chunk"
"github.com/pingcap/tidb/pkg/util/collate"
"github.com/pingcap/tidb/pkg/util/intest"
rangerctx "github.com/pingcap/tidb/pkg/util/ranger/context"
)

Expand Down Expand Up @@ -137,6 +138,12 @@ func getPotentialEqOrInColOffset(sctx *rangerctx.RangerContext, expr expression.
}
if constVal, ok := f.GetArgs()[1].(*expression.Constant); ok {
val, err := constVal.Eval(evalCtx, chunk.Row{})
intest.AssertFunc(func() bool {
if sctx.ExprCtx.ConnectionID() == 0 {
return sctx.RegardNULLAsPoint
}
return true
})
if err != nil || (!sctx.RegardNULLAsPoint && val.IsNull()) || (f.FuncName.L == ast.NullEQ && val.IsNull()) {
// treat col<=>null as range scan instead of point get to avoid incorrect results
// when nullable unique index has multiple matches for filter x is null
Expand Down