Skip to content

Commit

Permalink
planner: fix a panic during column pruning (#47883) (#48809)
Browse files Browse the repository at this point in the history
close #47331
  • Loading branch information
ti-chi-bot authored Dec 8, 2023
1 parent 14a07f2 commit a169b60
Show file tree
Hide file tree
Showing 4 changed files with 118 additions and 1 deletion.
15 changes: 15 additions & 0 deletions executor/test/BUILD.bazel
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
load("@io_bazel_rules_go//go:def.bzl", "go_test")

go_test(
name = "test_test",
timeout = "short",
srcs = [
"explain_test.go",
"main_test.go",
],
flaky = True,
deps = [
"//testkit",
"@org_uber_go_goleak//:goleak",
],
)
71 changes: 71 additions & 0 deletions executor/test/explain_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
// Copyright 2023 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 explain

import (
"testing"

"github.com/pingcap/tidb/testkit"
)

func TestIssue47331(t *testing.T) {
store := testkit.CreateMockStore(t)
tk := testkit.NewTestKit(t, store)
tk.MustExec("use test")
tk.MustExec("drop table if exists t1")
tk.MustExec(`create table t1(
id1 varchar(2) DEFAULT '00',
id2 varchar(30) NOT NULL,
id3 datetime DEFAULT NULL,
id4 varchar(100) NOT NULL DEFAULT 'ecifdata',
id5 datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
id6 int(11) DEFAULT NULL,
id7 int(11) DEFAULT NULL,
UNIQUE KEY UI_id2 (id2),
KEY ix_id1 (id1)
)`)
tk.MustExec("drop table if exists t2")
tk.MustExec(`create table t2(
id10 varchar(40) NOT NULL,
id2 varchar(30) NOT NULL,
KEY IX_id2 (id2),
PRIMARY KEY (id10)
)`)
tk.MustExec("drop table if exists t3")
tk.MustExec(`create table t3(
id20 varchar(40) DEFAULT NULL,
UNIQUE KEY IX_id20 (id20)
)`)
tk.MustExec(`
explain
UPDATE t1 a
SET a.id1 = '04',
a.id3 = CURRENT_TIMESTAMP,
a.id4 = SUBSTRING_INDEX(USER(), '@', 1),
a.id5 = CURRENT_TIMESTAMP
WHERE a.id1 = '03'
AND a.id6 - IFNULL(a.id7, 0) =
(
SELECT COUNT(1)
FROM t2 b, t3 c
WHERE b.id10 = c.id20
AND b.id2 = a.id2
AND b.id2 in (
SELECT rn.id2
FROM t1 rn
WHERE rn.id1 = '03'
)
);
`)
}
30 changes: 30 additions & 0 deletions executor/test/main_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
// Copyright 2022 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 explain

import (
"testing"

"go.uber.org/goleak"
)

func TestMain(m *testing.M) {
opts := []goleak.Option{
goleak.IgnoreTopFunction("github.com/golang/glog.(*loggingT).flushDaemon"),
goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"),
goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/txnkv/transaction.keepAlive"),
}
goleak.VerifyTestMain(m, opts...)
}
3 changes: 2 additions & 1 deletion planner/core/rule_join_reorder.go
Original file line number Diff line number Diff line change
Expand Up @@ -311,7 +311,8 @@ func (s *joinReOrderSolver) optimizeRecursive(ctx sessionctx.Context, p LogicalP
proj := LogicalProjection{
Exprs: expression.Column2Exprs(originalSchema.Columns),
}.Init(p.SCtx(), p.SelectBlockOffset())
proj.SetSchema(originalSchema)
// Clone the schema here, because the schema may be changed by column pruning rules.
proj.SetSchema(originalSchema.Clone())
proj.SetChildren(p)
p = proj
}
Expand Down

0 comments on commit a169b60

Please sign in to comment.