planner: filter conflict read_from_storage hints (#24313)
This commit is contained in:
@ -3524,3 +3524,34 @@ func (s *testIntegrationSuite) TestIssue24095(c *C) {
|
||||
tk.MustQuery("explain format = 'brief' " + tt).Check(testkit.Rows(output[i].Plan...))
|
||||
}
|
||||
}
|
||||
|
||||
func (s *testIntegrationSuite) TestConflictReadFromStorage(c *C) {
|
||||
tk := testkit.NewTestKit(c, s.store)
|
||||
tk.MustExec("use test")
|
||||
tk.MustExec("drop table if exists t")
|
||||
tk.MustExec(`create table t (
|
||||
a int, b int, c varchar(20),
|
||||
primary key(a), key(b), key(c)
|
||||
) partition by range columns(a) (
|
||||
partition p0 values less than(6),
|
||||
partition p1 values less than(11),
|
||||
partition p2 values less than(16));`)
|
||||
tk.MustExec(`insert into t values (1,1,"1"), (2,2,"2"), (8,8,"8"), (11,11,"11"), (15,15,"15")`)
|
||||
// Create virtual tiflash replica info.
|
||||
dom := domain.GetDomain(tk.Se)
|
||||
is := dom.InfoSchema()
|
||||
db, exists := is.SchemaByName(model.NewCIStr("test"))
|
||||
c.Assert(exists, IsTrue)
|
||||
for _, tblInfo := range db.Tables {
|
||||
if tblInfo.Name.L == "t" {
|
||||
tblInfo.TiFlashReplica = &model.TiFlashReplicaInfo{
|
||||
Count: 1,
|
||||
Available: true,
|
||||
}
|
||||
}
|
||||
}
|
||||
tk.MustQuery(`explain select /*+ read_from_storage(tikv[t partition(p0)], tiflash[t partition(p1, p2)]) */ * from t`)
|
||||
tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1815 Storage hints are conflict, you can only specify one storage type of table test.t"))
|
||||
tk.MustQuery(`explain select /*+ read_from_storage(tikv[t], tiflash[t]) */ * from t`)
|
||||
tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1815 Storage hints are conflict, you can only specify one storage type of table test.t"))
|
||||
}
|
||||
|
||||
@ -610,10 +610,9 @@ func (ds *DataSource) setPreferredStoreType(hintInfo *tableHintInfo) {
|
||||
}
|
||||
}
|
||||
if hintTbl := hintInfo.ifPreferTiFlash(alias); hintTbl != nil {
|
||||
// 1. `ds.tableInfo.Partition == nil`, which means the hint takes effect in the whole table.
|
||||
// 2. `ds.preferStoreType != 0`, which means there's a hint hit the both TiKV value and TiFlash value for table.
|
||||
// If it's satisfied the above two conditions, then we can make sure there are some hints conflicted.
|
||||
if ds.preferStoreType != 0 && ds.tableInfo.Partition == nil {
|
||||
// `ds.preferStoreType != 0`, which means there's a hint hit the both TiKV value and TiFlash value for table.
|
||||
// We can't support read a table from two different storages, even partition table.
|
||||
if ds.preferStoreType != 0 {
|
||||
errMsg := fmt.Sprintf("Storage hints are conflict, you can only specify one storage type of table %s.%s",
|
||||
alias.dbName.L, alias.tblName.L)
|
||||
warning := ErrInternal.GenWithStack(errMsg)
|
||||
|
||||
@ -168,8 +168,7 @@
|
||||
"select /*+ hash_join(t1, t2 partition(p0)) */ * from t t1 join t t2 on t1.a = t2.a",
|
||||
"select /*+ use_index_merge(t partition(p0)) */ * from t where t.b = 1 or t.c = \"8\"",
|
||||
"select /*+ use_index_merge(t partition(p0, p1) primary, b) */ * from t where t.a = 1 or t.b = 2",
|
||||
"select /*+ use_index(t partition(p0) b) */ * from t partition(p0, p1)",
|
||||
"select /*+ read_from_storage(tikv[t partition(p0)], tiflash[t partition(p1, p2)]) */ * from t"
|
||||
"select /*+ use_index(t partition(p0) b) */ * from t partition(p0, p1)"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
||||
13
planner/core/testdata/integration_suite_out.json
vendored
13
planner/core/testdata/integration_suite_out.json
vendored
@ -879,19 +879,6 @@
|
||||
" └─TableFullScan 10000.00 cop[tiflash] table:t, partition:p1 keep order:false, stats:pseudo"
|
||||
],
|
||||
"Warn": null
|
||||
},
|
||||
{
|
||||
"SQL": "select /*+ read_from_storage(tikv[t partition(p0)], tiflash[t partition(p1, p2)]) */ * from t",
|
||||
"Plan": [
|
||||
"PartitionUnion 30000.00 root ",
|
||||
"├─TableReader 10000.00 root data:TableFullScan",
|
||||
"│ └─TableFullScan 10000.00 cop[tikv] table:t, partition:p0 keep order:false, stats:pseudo",
|
||||
"├─TableReader 10000.00 root data:TableFullScan",
|
||||
"│ └─TableFullScan 10000.00 cop[tiflash] table:t, partition:p1 keep order:false, stats:pseudo",
|
||||
"└─TableReader 10000.00 root data:TableFullScan",
|
||||
" └─TableFullScan 10000.00 cop[tiflash] table:t, partition:p2 keep order:false, stats:pseudo"
|
||||
],
|
||||
"Warn": null
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user