planner: add test for logical topN and logical tableDual's hash64 and equals (#57906)

ref pingcap/tidb#51664
This commit is contained in:
Arenatlx
2024-12-03 14:32:48 +08:00
committed by GitHub
parent 66661bd032
commit ec5b26e127
2 changed files with 123 additions and 1 deletions

View File

@ -8,7 +8,7 @@ go_test(
"logical_mem_table_predicate_extractor_test.go",
],
flaky = True,
shard_count = 31,
shard_count = 33,
deps = [
"//pkg/domain",
"//pkg/expression",

View File

@ -33,6 +33,128 @@ import (
"github.com/stretchr/testify/require"
)
func TestLogicalTopNHash64Equals(t *testing.T) {
col1 := &expression.Column{
ID: 1,
Index: 0,
RetType: types.NewFieldType(mysql.TypeLonglong),
}
col2 := &expression.Column{
ID: 2,
Index: 0,
RetType: types.NewFieldType(mysql.TypeLonglong),
}
ctx := mock.NewContext()
p1 := logicalop.LogicalTopN{}.Init(ctx, 1)
p1.ByItems = []*util.ByItems{{Expr: col1, Desc: true}}
p1.PartitionBy = []property.SortItem{{Col: col1, Desc: true}}
p2 := logicalop.LogicalTopN{}.Init(ctx, 1)
p2.ByItems = []*util.ByItems{{Expr: col1, Desc: true}}
p2.PartitionBy = []property.SortItem{{Col: col1, Desc: true}}
hasher1 := base.NewHashEqualer()
hasher2 := base.NewHashEqualer()
p1.Hash64(hasher1)
p2.Hash64(hasher2)
require.Equal(t, hasher1.Sum64(), hasher2.Sum64())
require.True(t, p1.Equals(p2))
p2.ByItems = []*util.ByItems{{Expr: col2, Desc: true}}
hasher2.Reset()
p2.Hash64(hasher2)
require.NotEqual(t, hasher1.Sum64(), hasher2.Sum64())
require.False(t, p1.Equals(p2))
p2.ByItems = []*util.ByItems{{Expr: col1, Desc: false}}
hasher2.Reset()
p2.Hash64(hasher2)
require.NotEqual(t, hasher1.Sum64(), hasher2.Sum64())
require.False(t, p1.Equals(p2))
p2.ByItems = []*util.ByItems{{Expr: col1, Desc: true}}
p2.PartitionBy = []property.SortItem{{Col: col1, Desc: false}}
hasher2.Reset()
p2.Hash64(hasher2)
require.NotEqual(t, hasher1.Sum64(), hasher2.Sum64())
require.False(t, p1.Equals(p2))
p2.PartitionBy = []property.SortItem{{Col: col2, Desc: true}}
hasher2.Reset()
p2.Hash64(hasher2)
require.NotEqual(t, hasher1.Sum64(), hasher2.Sum64())
require.False(t, p1.Equals(p2))
p2.PartitionBy = []property.SortItem{{Col: col1, Desc: true}}
p2.Offset = 2
hasher2.Reset()
p2.Hash64(hasher2)
require.NotEqual(t, hasher1.Sum64(), hasher2.Sum64())
require.False(t, p1.Equals(p2))
p2.Offset = 0
p2.Count = 1
hasher2.Reset()
p2.Hash64(hasher2)
require.NotEqual(t, hasher1.Sum64(), hasher2.Sum64())
require.False(t, p1.Equals(p2))
p2.Count = 0
p2.PreferLimitToCop = true
hasher2.Reset()
p2.Hash64(hasher2)
require.NotEqual(t, hasher1.Sum64(), hasher2.Sum64())
require.False(t, p1.Equals(p2))
p2.PreferLimitToCop = false
hasher2.Reset()
p2.Hash64(hasher2)
require.Equal(t, hasher1.Sum64(), hasher2.Sum64())
require.True(t, p1.Equals(p2))
}
func TestLogicalTableDualHash64Equals(t *testing.T) {
col1 := &expression.Column{
ID: 1,
Index: 0,
RetType: types.NewFieldType(mysql.TypeLonglong),
}
col2 := &expression.Column{
ID: 2,
Index: 0,
RetType: types.NewFieldType(mysql.TypeLonglong),
}
ctx := mock.NewContext()
p1 := logicalop.LogicalTableDual{}.Init(ctx, 1)
p1.LogicalSchemaProducer.SetSchema(&expression.Schema{Columns: []*expression.Column{col1}})
p2 := logicalop.LogicalTableDual{}.Init(ctx, 1)
p2.LogicalSchemaProducer.SetSchema(&expression.Schema{Columns: []*expression.Column{col1}})
hasher1 := base.NewHashEqualer()
hasher2 := base.NewHashEqualer()
p1.Hash64(hasher1)
p2.Hash64(hasher2)
require.Equal(t, hasher1.Sum64(), hasher2.Sum64())
require.True(t, p1.Equals(p2))
p2.LogicalSchemaProducer.SetSchema(&expression.Schema{Columns: []*expression.Column{col2}})
hasher2.Reset()
p2.Hash64(hasher2)
require.NotEqual(t, hasher1.Sum64(), hasher2.Sum64())
require.False(t, p1.Equals(p2))
p2.LogicalSchemaProducer.SetSchema(&expression.Schema{Columns: []*expression.Column{col1}})
p2.RowCount = 2
hasher2.Reset()
p2.Hash64(hasher2)
require.NotEqual(t, hasher1.Sum64(), hasher2.Sum64())
require.False(t, p1.Equals(p2))
p2.LogicalSchemaProducer.SetSchema(&expression.Schema{Columns: []*expression.Column{col1}})
p2.RowCount = 0
hasher2.Reset()
p2.Hash64(hasher2)
require.Equal(t, hasher1.Sum64(), hasher2.Sum64())
require.True(t, p1.Equals(p2))
}
func TestLogicalSortHash64Equals(t *testing.T) {
col1 := &expression.Column{
ID: 1,