Files
tidb/pkg/bindinfo/binding_plan_generation_test.go

116 lines
3.9 KiB
Go

// Copyright 2025 PingCAP, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package bindinfo
import (
"math"
"testing"
"github.com/pingcap/tidb/pkg/planner/util/fixcontrol"
"github.com/pingcap/tidb/pkg/sessionctx/vardef"
"github.com/stretchr/testify/require"
)
func roundTo4Decimal(num float64) float64 {
return math.Round(num*1e4) / 1e4
}
func TestAdjustFixes(t *testing.T) {
v, err := adjustFix(fixcontrol.Fix44855, "on")
require.NoError(t, err)
require.Equal(t, v, vardef.Off)
v, err = adjustFix(fixcontrol.Fix44855, "off ")
require.NoError(t, err)
require.Equal(t, v, vardef.On)
v, err = adjustFix(fixcontrol.Fix45132, "1000")
require.NoError(t, err)
require.Equal(t, v, "500")
v, err = adjustFix(fixcontrol.Fix45132, "30")
require.NoError(t, err)
require.Equal(t, v, "15")
v, err = adjustFix(fixcontrol.Fix45132, "8")
require.NoError(t, err)
require.Equal(t, v, "8")
}
func TestAdjustVars(t *testing.T) {
// adjust cost factor
v, err := adjustVar(vardef.TiDBOptIndexScanCostFactor, 1.0)
require.NoError(t, err)
require.Equal(t, v, 5.0)
v, err = adjustVar(vardef.TiDBOptIndexScanCostFactor, 5.0)
require.NoError(t, err)
require.Equal(t, v, 25.0)
v, err = adjustVar(vardef.TiDBOptIndexScanCostFactor, 1e5)
require.NoError(t, err)
require.Equal(t, v, 5e5)
v, err = adjustVar(vardef.TiDBOptIndexScanCostFactor, 2e6)
require.NoError(t, err)
require.Equal(t, v, 2e6)
v, err = adjustVar(vardef.TiDBOptOrderingIdxSelRatio, -1.0)
require.NoError(t, err)
require.Equal(t, roundTo4Decimal(v.(float64)), 0.1)
v, err = adjustVar(vardef.TiDBOptOrderingIdxSelRatio, 0.2)
require.NoError(t, err)
require.Equal(t, roundTo4Decimal(v.(float64)), 0.3)
v, err = adjustVar(vardef.TiDBOptOrderingIdxSelRatio, 0.55)
require.NoError(t, err)
require.Equal(t, roundTo4Decimal(v.(float64)), 0.65)
v, err = adjustVar(vardef.TiDBOptOrderingIdxSelRatio, 0.95)
require.NoError(t, err)
require.Equal(t, roundTo4Decimal(v.(float64)), 0.95)
_, err = adjustVar(vardef.TiFlashReplicaRead, -1.0)
require.Error(t, err) // unsupported
}
func TestStartState(t *testing.T) {
vars := []string{
vardef.TiDBOptIndexScanCostFactor,
vardef.TiDBOptIndexReaderCostFactor,
vardef.TiDBOptTableReaderCostFactor,
vardef.TiDBOptTableFullScanCostFactor,
vardef.TiDBOptTableRangeScanCostFactor,
vardef.TiDBOptTableRowIDScanCostFactor,
vardef.TiDBOptTableTiFlashScanCostFactor,
vardef.TiDBOptIndexLookupCostFactor,
vardef.TiDBOptIndexMergeCostFactor,
vardef.TiDBOptSortCostFactor,
vardef.TiDBOptTopNCostFactor,
vardef.TiDBOptLimitCostFactor,
vardef.TiDBOptStreamAggCostFactor,
vardef.TiDBOptHashAggCostFactor,
vardef.TiDBOptMergeJoinCostFactor,
vardef.TiDBOptHashJoinCostFactor,
vardef.TiDBOptIndexJoinCostFactor,
vardef.TiDBOptOrderingIdxSelRatio,
vardef.TiDBOptRiskEqSkewRatio,
vardef.TiDBOptRiskRangeSkewRatio,
vardef.TiDBOptRiskGroupNDVSkewRatio,
vardef.TiDBOptSelectivityFactor,
vardef.TiDBOptPreferRangeScan,
vardef.TiDBOptEnableNoDecorrelateInSelect,
vardef.TiDBOptEnableSemiJoinRewrite,
vardef.TiDBOptCartesianJoinOrderThreshold,
}
fixes := []uint64{fixcontrol.Fix44855, fixcontrol.Fix45132, fixcontrol.Fix52869}
state, err := getStartState(vars, fixes)
require.NoError(t, err)
require.Equal(t, state.Encode(), "1.0000,1.0000,1.0000,1.0000,1.0000,1.0000,1.0000,1.0000,1.0000,1.0000,1.0000,1.0000,1.0000,1.0000,1.0000,1.0000,1.0000,0.0100,0.0000,0.0000,0.0000,0.8000,true,false,false,0.0000,OFF,1000,OFF")
}