From 35f7d3ab6c1c9ec2acfc7cc835f6819fc3024350 Mon Sep 17 00:00:00 2001 From: Ti Chi Robot Date: Fri, 5 May 2023 20:49:56 +0800 Subject: [PATCH] infoschema: fix select temporary table with view will panic problem (#42566) (#42702) close pingcap/tidb#42563 --- infoschema/infoschema.go | 13 +++------- table/temptable/BUILD.bazel | 3 +++ table/temptable/infoschema.go | 4 +-- table/temptable/intergration_test.go | 39 ++++++++++++++++++++++++++++ 4 files changed, 47 insertions(+), 12 deletions(-) create mode 100644 table/temptable/intergration_test.go diff --git a/infoschema/infoschema.go b/infoschema/infoschema.go index 11c9bd8b0e7af..2076d0774a07c 100644 --- a/infoschema/infoschema.go +++ b/infoschema/infoschema.go @@ -700,15 +700,10 @@ func (ts *SessionExtendedInfoSchema) HasTemporaryTable() bool { return ts.LocalTemporaryTables != nil && ts.LocalTemporaryTables.Count() > 0 || ts.InfoSchema.HasTemporaryTable() } -// AttachMDLTableInfoSchema attach MDL related table information schema to is -func AttachMDLTableInfoSchema(is InfoSchema) InfoSchema { - mdlTables := NewSessionTables() - if iss, ok := is.(*SessionExtendedInfoSchema); ok { - iss.MdlTables = mdlTables - return iss - } +// DetachTemporaryTableInfoSchema returns a new SessionExtendedInfoSchema without temporary tables +func (ts *SessionExtendedInfoSchema) DetachTemporaryTableInfoSchema() *SessionExtendedInfoSchema { return &SessionExtendedInfoSchema{ - InfoSchema: is, - MdlTables: mdlTables, + InfoSchema: ts.InfoSchema, + MdlTables: ts.MdlTables, } } diff --git a/table/temptable/BUILD.bazel b/table/temptable/BUILD.bazel index 8487a26533b51..0d606bbe02d1f 100644 --- a/table/temptable/BUILD.bazel +++ b/table/temptable/BUILD.bazel @@ -34,6 +34,7 @@ go_test( srcs = [ "ddl_test.go", "interceptor_test.go", + "intergration_test.go", "main_test.go", ], embed = [":temptable"], @@ -42,6 +43,7 @@ go_test( "//infoschema", "//kv", "//meta/autoid", + "//parser/auth", "//parser/model", "//parser/mysql", "//sessionctx", @@ -49,6 +51,7 @@ go_test( "//store/mockstore", "//table", "//tablecodec", + "//testkit", "//testkit/testsetup", "//types", "//util/codec", diff --git a/table/temptable/infoschema.go b/table/temptable/infoschema.go index f2de5cf8b5dfe..515474f06e325 100644 --- a/table/temptable/infoschema.go +++ b/table/temptable/infoschema.go @@ -41,9 +41,7 @@ func AttachLocalTemporaryTableInfoSchema(sctx sessionctx.Context, is infoschema. // DetachLocalTemporaryTableInfoSchema detach local temporary table information schema from is func DetachLocalTemporaryTableInfoSchema(is infoschema.InfoSchema) infoschema.InfoSchema { if attachedInfoSchema, ok := is.(*infoschema.SessionExtendedInfoSchema); ok { - newIs := attachedInfoSchema - newIs.LocalTemporaryTables = nil - return newIs + return attachedInfoSchema.DetachTemporaryTableInfoSchema() } return is diff --git a/table/temptable/intergration_test.go b/table/temptable/intergration_test.go new file mode 100644 index 0000000000000..1403dc60788a0 --- /dev/null +++ b/table/temptable/intergration_test.go @@ -0,0 +1,39 @@ +// 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 temptable_test + +import ( + "testing" + + "github.com/pingcap/tidb/parser/auth" + "github.com/pingcap/tidb/testkit" + "github.com/stretchr/testify/require" +) + +func TestSelectTemporaryTableUnionView(t *testing.T) { + // see the issue: https://github.com/pingcap/tidb/issues/42563 + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + require.NoError(t, tk.Session().Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil)) + tk.MustExec("use test") + tk.MustExec("create table t(a int)") + tk.MustExec("insert into t values(1)") + tk.MustExec("create view tv as select a from t") + tk.MustExec("create temporary table t(a int)") + tk.MustExec("insert into t values(2)") + tk.MustQuery("select * from tv").Check(testkit.Rows("1")) + tk.MustQuery("select * from t").Check(testkit.Rows("2")) + tk.MustQuery("select * from (select a from t union all select a from tv) t1 order by a").Check(testkit.Rows("1", "2")) +}