Skip to content

Commit

Permalink
planner: choose TableScan when use an empty index hint (#12037) (#12154)
Browse files Browse the repository at this point in the history
  • Loading branch information
francis0407 authored and zz-jason committed Sep 11, 2019
1 parent f1e421d commit 683540e
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 0 deletions.
10 changes: 10 additions & 0 deletions planner/core/logical_plans.go
Original file line number Diff line number Diff line change
Expand Up @@ -372,6 +372,16 @@ type accessPath struct {
forced bool
}

// getTablePath finds the TablePath from a group of accessPaths.
func getTablePath(paths []*accessPath) *accessPath {
for _, path := range paths {
if path.isTablePath {
return path
}
}
return nil
}

// deriveTablePathStats will fulfill the information that the accessPath need.
// And it will check whether the primary key is covered only by point query.
func (ds *DataSource) deriveTablePathStats(path *accessPath) (bool, error) {
Expand Down
4 changes: 4 additions & 0 deletions planner/core/physical_plan_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,10 @@ func (s *testPlanSuite) TestDAGPlanBuilderSimpleCase(c *C) {
sql: "select * from t t1 use index(c_d_e)",
best: "IndexLookUp(Index(t.c_d_e)[[NULL,+inf]], Table(t))",
},
{
sql: "select f from t use index() where f = 1",
best: "TableReader(Table(t)->Sel([eq(test.t.f, 1)]))",
},
// Test ts + Sort vs. DoubleRead + filter.
{
sql: "select a from t where a between 1 and 2 order by c",
Expand Down
11 changes: 11 additions & 0 deletions planner/core/planbuilder.go
Original file line number Diff line number Diff line change
Expand Up @@ -478,6 +478,17 @@ func getPossibleAccessPaths(indexHints []*ast.IndexHint, tblInfo *model.TableInf
}

hasScanHint = true

// It is syntactically valid to omit index_list for USE INDEX, which means “use no indexes”.
// Omitting index_list for FORCE INDEX or IGNORE INDEX is a syntax error.
// See https://dev.mysql.com/doc/refman/8.0/en/index-hints.html.
if hint.IndexNames == nil && hint.HintType != ast.HintIgnore {
if path := getTablePath(publicPaths); path != nil {
hasUseOrForce = true
path.forced = true
available = append(available, path)
}
}
for _, idxName := range hint.IndexNames {
path := getPathByIndexName(publicPaths, idxName, tblInfo)
if path == nil {
Expand Down

0 comments on commit 683540e

Please sign in to comment.