From faf6ed7f7c4f1477e4c8f15991f48f9f9d2a8eed Mon Sep 17 00:00:00 2001 From: Kenan Yao Date: Thu, 28 Feb 2019 13:57:22 +0800 Subject: [PATCH] executor: only show valid columns in `stats_histogram` (#9487) --- executor/show_stats.go | 4 ++++ executor/show_stats_test.go | 15 ++++++++++++++- statistics/table.go | 2 +- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/executor/show_stats.go b/executor/show_stats.go index 75c38249956c3..364d8b9b6d34e 100644 --- a/executor/show_stats.go +++ b/executor/show_stats.go @@ -54,6 +54,10 @@ func (e *ShowExec) fetchShowStatsHistogram() error { statsTbl := h.GetTableStats(tbl) if !statsTbl.Pseudo { for _, col := range statsTbl.Columns { + // Pass a nil StatementContext to avoid column stats being marked as needed. + if statsTbl.ColumnIsInvalid(nil, col.ID) { + continue + } e.histogramToRow(db.Name.O, tbl.Name.O, col.Info.Name.O, 0, col.Histogram, col.AvgColSize(statsTbl.Count)) } for _, idx := range statsTbl.Indices { diff --git a/executor/show_stats_test.go b/executor/show_stats_test.go index 03ddf989095f4..fc56f4a2af563 100644 --- a/executor/show_stats_test.go +++ b/executor/show_stats_test.go @@ -42,13 +42,26 @@ func (s *testSuite) TestShowStatsHistograms(c *C) { tk.MustExec("drop table if exists t") tk.MustExec("create table t (a int, b int)") tk.MustExec("analyze table t") - result := tk.MustQuery("show stats_histograms").Sort() + result := tk.MustQuery("show stats_histograms") + c.Assert(len(result.Rows()), Equals, 0) + tk.MustExec("insert into t values(1,1)") + tk.MustExec("analyze table t") + result = tk.MustQuery("show stats_histograms").Sort() c.Assert(len(result.Rows()), Equals, 2) c.Assert(result.Rows()[0][2], Equals, "a") c.Assert(result.Rows()[1][2], Equals, "b") result = tk.MustQuery("show stats_histograms where column_name = 'a'") c.Assert(len(result.Rows()), Equals, 1) c.Assert(result.Rows()[0][2], Equals, "a") + + tk.MustExec("drop table t") + tk.MustExec("create table t(a int, b int, c int, index idx_b(b), index idx_c_a(c, a))") + tk.MustExec("insert into t values(1,null,1),(2,null,2),(3,3,3),(4,null,4),(null,null,null)") + res := tk.MustQuery("show stats_histograms where table_name = 't'") + c.Assert(len(res.Rows()), Equals, 0) + tk.MustExec("analyze table t index idx_b") + res = tk.MustQuery("show stats_histograms where table_name = 't' and column_name = 'idx_b'") + c.Assert(len(res.Rows()), Equals, 1) } func (s *testSuite) TestShowStatsBuckets(c *C) { diff --git a/statistics/table.go b/statistics/table.go index 4d65063143ddc..b49dc8460e250 100644 --- a/statistics/table.go +++ b/statistics/table.go @@ -349,7 +349,7 @@ func (coll *HistColl) ColumnIsInvalid(sc *stmtctx.StatementContext, colID int64) if !ok || coll.Pseudo && col.NotAccurate() { return true } - if col.NDV > 0 && col.Len() == 0 && coll.HavePhysicalID { + if col.NDV > 0 && col.Len() == 0 && coll.HavePhysicalID && sc != nil { sc.SetHistogramsNotLoad() histogramNeededColumns.insert(tableColumnID{tableID: coll.PhysicalID, columnID: col.Info.ID}) }