diff --git a/executor/ddl_test.go b/executor/ddl_test.go index 3e009fed443aa..ae2790338aad0 100644 --- a/executor/ddl_test.go +++ b/executor/ddl_test.go @@ -16,11 +16,6 @@ package executor_test import ( "context" "fmt" - "math" - "strconv" - "strings" - "time" - . "github.com/pingcap/check" "github.com/pingcap/failpoint" "github.com/pingcap/parser/model" @@ -41,6 +36,10 @@ import ( "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/testkit" "github.com/pingcap/tidb/util/testutil" + "math" + "strconv" + "strings" + "time" ) func (s *testSuite6) TestTruncateTable(c *C) { @@ -1005,3 +1004,4 @@ func (s *testSuite6) TestTimestampMinDefaultValue(c *C) { tk.MustExec("create table tdv(a int);") tk.MustExec("ALTER TABLE tdv ADD COLUMN ts timestamp DEFAULT '1970-01-01 08:00:01';") } + diff --git a/executor/executor_test.go b/executor/executor_test.go index 0bdca4d6acd4d..8c7392ea6ddc0 100644 --- a/executor/executor_test.go +++ b/executor/executor_test.go @@ -3948,9 +3948,7 @@ func (s *testSuite6) TearDownTest(c *C) { } } -type testSuite7 struct { - *baseTestSuite -} + func (s *testSuite7) TearDownTest(c *C) { tk := testkit.NewTestKit(c, s.store) @@ -5053,3 +5051,7 @@ func (s *testSuiteP2) TestPointUpdatePreparedPlanWithCommitMode(c *C) { tk2.MustQuery("select * from t where a = 3").Check(testkit.Rows("3 3 11")) } + +type testSuite7 struct { + *baseTestSuite +} diff --git a/executor/plugin_executor.go b/executor/plugin_executor.go index a2f4c8de5ad46..d551d459db236 100644 --- a/executor/plugin_executor.go +++ b/executor/plugin_executor.go @@ -1,8 +1,6 @@ package executor import ( - "fmt" - "github.com/davecgh/go-spew/spew" "github.com/pingcap/parser/model" "github.com/pingcap/tidb/plugin" "github.com/pingcap/tidb/util/chunk" @@ -30,7 +28,6 @@ func (e *PluginScanExecutor) Open(ctx context.Context) error { func (e *PluginScanExecutor) Next(ctx context.Context, chk *chunk.Chunk) error { chk.Reset() err := e.pm.OnReaderNext(ctx, chk, e.meta) - fmt.Println("pe next finished", spew.Sdump(err)) return err } diff --git a/plugin/csv/csv.go b/plugin/csv/csv.go index 45062362f85bf..4ce992da1f23f 100644 --- a/plugin/csv/csv.go +++ b/plugin/csv/csv.go @@ -52,7 +52,6 @@ func OnReaderOpen(ctx context.Context, meta *plugin.ExecutorMeta) { func OnReaderNext(ctx context.Context, chk *chunk.Chunk, meta *plugin.ExecutorMeta) error { if _, ok := Files[meta.Table.Name.L]; !ok { - fmt.Println("have some problem") return nil } e := Files[meta.Table.Name.L] diff --git a/plugin/plugin.go b/plugin/plugin.go index 8a63d59af8cb0..056e25019c9cb 100644 --- a/plugin/plugin.go +++ b/plugin/plugin.go @@ -384,20 +384,37 @@ func Shutdown(ctx context.Context) { } } +// Get finds and returns plugin by kind and name parameters. +var TestP map[Kind][]Plugin + +func Set(kind Kind, p Plugin) { + if TestP == nil { + TestP = make(map[Kind][]Plugin) + } + TestP[kind] = append(TestP[kind], p) +} + // Get finds and returns plugin by kind and name parameters. func Get(kind Kind, name string) *Plugin { plugins := pluginGlobal.plugins() - if plugins == nil { - return nil + if plugins != nil { + for _, p := range plugins.plugins[kind] { + if p.Name == name { + return &p + } + } } - for _, p := range plugins.plugins[kind] { + + for _, p := range TestP[kind] { if p.Name == name { return &p } } + return nil } + func List(kind Kind) []Plugin { plugins := pluginGlobal.plugins() if plugins == nil { diff --git a/plugin/plugin_engine_test.go b/plugin/plugin_engine_test.go new file mode 100644 index 0000000000000..4b8ef631a548b --- /dev/null +++ b/plugin/plugin_engine_test.go @@ -0,0 +1,96 @@ +package plugin_test + +import ( + "flag" + . "github.com/pingcap/check" + "github.com/pingcap/parser" + "github.com/pingcap/tidb/domain" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/plugin" + "github.com/pingcap/tidb/session" + "github.com/pingcap/tidb/store/mockstore" + "github.com/pingcap/tidb/store/mockstore/mocktikv" + "github.com/pingcap/tidb/util/mock" + "github.com/pingcap/tidb/util/testkit" + "testing" + "unsafe" +) + +type baseTestSuite struct { + cluster *mocktikv.Cluster + mvccStore mocktikv.MVCCStore + store kv.Storage + domain *domain.Domain + *parser.Parser + ctx *mock.Context +} + +var mockTikv = flag.Bool("mockTikv", true, "use mock tikv store in executor test") + +func (s *baseTestSuite) SetUpSuite(c *C) { + s.Parser = parser.New() + flag.Lookup("mockTikv") + useMockTikv := *mockTikv + if useMockTikv { + s.cluster = mocktikv.NewCluster() + mocktikv.BootstrapWithSingleStore(s.cluster) + s.mvccStore = mocktikv.MustNewMVCCStore() + store, err := mockstore.NewMockTikvStore( + mockstore.WithCluster(s.cluster), + mockstore.WithMVCCStore(s.mvccStore), + ) + c.Assert(err, IsNil) + s.store = store + session.SetSchemaLease(0) + session.DisableStats4Test() + } + d, err := session.BootstrapSession(s.store) + c.Assert(err, IsNil) + d.SetStatsUpdating(true) + s.domain = d +} + +func (s *baseTestSuite) TearDownSuite(c *C) { + s.domain.Close() + s.store.Close() +} + +var _ = Suite(&testPlugin{&baseTestSuite{}}) + +type testPlugin struct{ *baseTestSuite } + +func TestPlugin(t *testing.T) { + //rescueStdout := os.Stdout + //_, w, _ := os.Pipe() + //os.Stdout = w + // + //os.Stdout = rescueStdout + // + //runConf := RunConf{Output: rescueStdout, Verbose: true, KeepWorkDir: true} + TestingT(t) +} + +func (s *testPlugin) TestPlugin(c *C) { + tk := testkit.NewTestKit(c, s.store) + manifest := plugin.EngineManifest{ + Manifest: plugin.Manifest{ + Name: "csv", + }, + OnReaderOpen: plugin.OnReaderOpen, + OnReaderNext: plugin.OnReaderNext, + //OnReaderClose: plugin.OnReaderClose, + } + plugin.Set(plugin.Engine, plugin.Plugin{ + Manifest: (*plugin.Manifest)(unsafe.Pointer(&manifest)), + Path: "", + Disabled: 0, + State: 0, + }) + + tk.MustExec("use test") + tk.MustExec("create table t1(a int, b char(255)) ENGINE = csv") + result := tk.MustQuery("select * from t1") + result.Check(testkit.Rows("0 233333", "1 233333", "2 233333", "3 233333", "4 233333", "5 233333")) + result = tk.MustQuery("select * from t1 where a = 2") + result.Check(testkit.Rows("2 233333", )) +} diff --git a/plugin/test_engine.go b/plugin/test_engine.go new file mode 100644 index 0000000000000..ad122eb09400f --- /dev/null +++ b/plugin/test_engine.go @@ -0,0 +1,65 @@ +// Copyright 2019 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package plugin + +import ( + "context" + "fmt" + "github.com/pingcap/tidb/util/chunk" +) + +type ReadExecutor struct { + pos int +} + +var Files = make(map[string]*ReadExecutor) + +// Validate implements TiDB plugin's Validate SPI. +func Validate(ctx context.Context, m *Manifest) error { + fmt.Println("csv plugin validate") + return nil +} + +// OnInit implements TiDB plugin's OnInit SPI. +func OnInit(ctx context.Context, manifest *Manifest) error { + fmt.Println("csv init called") + return nil +} + +// OnShutdown implements TiDB plugin's OnShutdown SPI. +func OnShutdown(ctx context.Context, manifest *Manifest) error { + fmt.Println("csv shutdown called") + return nil +} + +func OnReaderOpen(ctx context.Context, meta *ExecutorMeta) { + Files[meta.Table.Name.L] = &ReadExecutor{ + pos: 0, + } +} + +func OnReaderNext(ctx context.Context, chk *chunk.Chunk, meta *ExecutorMeta) error { + if _, ok := Files[meta.Table.Name.L]; !ok { + fmt.Println("have some problem") + return nil + } + e := Files[meta.Table.Name.L] + if e.pos > 5 { + return nil + } + chk.AppendInt64(0, int64(e.pos)) + chk.AppendString(1, "233333") + e.pos += 1 + return nil +}