Skip to content

Commit

Permalink
Merge branch 'master' into m/data-lock-waits-sql-text
Browse files Browse the repository at this point in the history
  • Loading branch information
MyonKeminta authored Aug 2, 2021
2 parents 08a4f80 + fdd6663 commit 46656d2
Show file tree
Hide file tree
Showing 115 changed files with 4,050 additions and 1,100 deletions.
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@ check-fail: goword check-slow
fmt:
@echo "gofmt (simplify)"
@gofmt -s -l -w $(FILES) 2>&1 | $(FAIL_ON_STDOUT)
@cd cmd/importcheck && $(GO) run . ../..

goword:tools/bin/goword
tools/bin/goword $(FILES) 2>&1 | $(FAIL_ON_STDOUT)
Expand All @@ -58,6 +57,7 @@ check-static: tools/bin/golangci-lint
--enable=structcheck \
--enable=deadcode \
--enable=gosimple \
--enable=goimports \
$$($(PACKAGE_DIRECTORIES))

check-slow:tools/bin/gometalinter tools/bin/gosec
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ docker run --name tidb-server -d -p 4000:4000 pingcap/tidb:latest
Now you can use official mysql client to connect to TiDB.

```
mysql -h 127.0.0.1 -P 4000 -u root -D test --prompt="tidb> "
mysql -h 127.0.0.1 -P 4000 -u root -D test --prompt="tidb> " --comments
```

## Contributing
Expand Down
42 changes: 23 additions & 19 deletions cmd/explaintest/r/explain_generate_column_substitute.result
Original file line number Diff line number Diff line change
Expand Up @@ -175,17 +175,17 @@ a b c e
2 2.1 3 4.1
desc select a+1 from t where a+1=3;
id estRows task access object operator info
IndexReader_6 10.00 root index:IndexRangeScan_5
└─IndexRangeScan_5 10.00 cop[tikv] table:t, index:expr_idx_c(`a` + 1) range:[3,3], keep order:false, stats:pseudo
Projection_4 10.00 root plus(test.t.a, 1)
└─IndexReader_6 10.00 root index:IndexRangeScan_5
└─IndexRangeScan_5 10.00 cop[tikv] table:t, index:expr_idx_c(`a` + 1) range:[3,3], keep order:false, stats:pseudo
select a+1 from t where a+1=3;
a+1
3
desc select c from t where a+1=3;
id estRows task access object operator info
Projection_4 10.00 root test.t.c
└─IndexLookUp_11 10.00 root
├─IndexRangeScan_9(Build) 10.00 cop[tikv] table:t, index:expr_idx_c(`a` + 1) range:[3,3], keep order:false, stats:pseudo
└─TableRowIDScan_10(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo
└─IndexReader_6 10.00 root index:IndexRangeScan_5
└─IndexRangeScan_5 10.00 cop[tikv] table:t, index:expr_idx_c(`a` + 1) range:[3,3], keep order:false, stats:pseudo
select c from t where a+1=3;
c
3
Expand All @@ -200,24 +200,25 @@ a b c e
1 2 2 3
desc select b+a from t where b+a=3;
id estRows task access object operator info
IndexReader_6 10.00 root index:IndexRangeScan_5
└─IndexRangeScan_5 10.00 cop[tikv] table:t, index:expr_idx_e(`b` + `a`) range:[3,3], keep order:false, stats:pseudo
Projection_4 10.00 root plus(test.t.b, cast(test.t.a, double BINARY))
└─IndexReader_6 10.00 root index:IndexRangeScan_5
└─IndexRangeScan_5 10.00 cop[tikv] table:t, index:expr_idx_e(`b` + `a`) range:[3,3], keep order:false, stats:pseudo
select b+a from t where b+a=3;
b+a
3
desc select e from t where b+a=3;
id estRows task access object operator info
Projection_4 10.00 root test.t.e
└─IndexLookUp_11 10.00 root
├─IndexRangeScan_9(Build) 10.00 cop[tikv] table:t, index:expr_idx_e(`b` + `a`) range:[3,3], keep order:false, stats:pseudo
└─TableRowIDScan_10(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo
└─IndexReader_6 10.00 root index:IndexRangeScan_5
└─IndexRangeScan_5 10.00 cop[tikv] table:t, index:expr_idx_e(`b` + `a`) range:[3,3], keep order:false, stats:pseudo
select e from t where b+a=3;
e
3
desc select a+1 from t where a+1 in (1, 2, 3);
id estRows task access object operator info
IndexReader_6 30.00 root index:IndexRangeScan_5
└─IndexRangeScan_5 30.00 cop[tikv] table:t, index:expr_idx_c(`a` + 1) range:[1,1], [2,2], [3,3], keep order:false, stats:pseudo
Projection_4 30.00 root plus(test.t.a, 1)
└─IndexReader_6 30.00 root index:IndexRangeScan_5
└─IndexRangeScan_5 30.00 cop[tikv] table:t, index:expr_idx_c(`a` + 1) range:[1,1], [2,2], [3,3], keep order:false, stats:pseudo
select a+1 from t where a+1 in (1, 2, 3);
a+1
1
Expand All @@ -238,8 +239,9 @@ a b c e
0 0 1 0
desc select a+1 from t where a+1 between 1 and 4;
id estRows task access object operator info
IndexReader_6 250.00 root index:IndexRangeScan_5
└─IndexRangeScan_5 250.00 cop[tikv] table:t, index:expr_idx_c(`a` + 1) range:[1,4], keep order:false, stats:pseudo
Projection_4 250.00 root plus(test.t.a, 1)
└─IndexReader_6 250.00 root index:IndexRangeScan_5
└─IndexRangeScan_5 250.00 cop[tikv] table:t, index:expr_idx_c(`a` + 1) range:[1,4], keep order:false, stats:pseudo
select a+1 from t where a+1 between 1 and 4;
a+1
1
Expand All @@ -261,7 +263,7 @@ a b c e
desc select * from t order by a+1;
id estRows task access object operator info
Projection_5 10000.00 root test.t.a, test.t.b, test.t.c, test.t.e
└─Projection_13 10000.00 root test.t.a, test.t.b, test.t.c, test.t.e, plus(test.t.a, 1)
└─Projection_13 10000.00 root test.t.a, test.t.b, test.t.c, test.t.e, plus(test.t.a, 1), plus(test.t.b, cast(test.t.a, double BINARY))
└─IndexLookUp_12 10000.00 root
├─IndexFullScan_10(Build) 10000.00 cop[tikv] table:t, index:expr_idx_c(`a` + 1) keep order:true, stats:pseudo
└─TableRowIDScan_11(Probe) 10000.00 cop[tikv] table:t keep order:false, stats:pseudo
Expand All @@ -276,8 +278,9 @@ a b c e
5 -1 6 4
desc select a+1 from t order by a+1;
id estRows task access object operator info
IndexReader_14 10000.00 root index:IndexFullScan_13
└─IndexFullScan_13 10000.00 cop[tikv] table:t, index:expr_idx_c(`a` + 1) keep order:true, stats:pseudo
Projection_5 10000.00 root plus(test.t.a, 1)
└─IndexReader_14 10000.00 root index:IndexFullScan_13
└─IndexFullScan_13 10000.00 cop[tikv] table:t, index:expr_idx_c(`a` + 1) keep order:true, stats:pseudo
select a+1 from t order by a+1;
a+1
0
Expand All @@ -289,8 +292,9 @@ a+1
6
desc select b+a from t order by b+a;
id estRows task access object operator info
IndexReader_14 10000.00 root index:IndexFullScan_13
└─IndexFullScan_13 10000.00 cop[tikv] table:t, index:expr_idx_e(`b` + `a`) keep order:true, stats:pseudo
Projection_5 10000.00 root plus(test.t.b, cast(test.t.a, double BINARY))
└─IndexReader_14 10000.00 root index:IndexFullScan_13
└─IndexFullScan_13 10000.00 cop[tikv] table:t, index:expr_idx_e(`b` + `a`) keep order:true, stats:pseudo
select b+a from t order by b+a;
b+a
-3
Expand Down
118 changes: 0 additions & 118 deletions cmd/importcheck/importcheck.go

This file was deleted.

46 changes: 46 additions & 0 deletions ddl/attributes_sql_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
// Copyright 2021 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 ddl_test

import (
. "github.com/pingcap/check"
"github.com/pingcap/tidb/util/testkit"
)

func (s *testDBSuite8) TestAlterTableAttributes(c *C) {
tk := testkit.NewTestKit(c, s.store)
tk.MustExec("use test")
tk.MustExec("drop table if exists t1")
defer tk.MustExec("drop table if exists t1")

tk.MustExec(`create table t1 (c int);`)

// normal cases
_, err := tk.Exec(`alter table t1 attributes="nomerge";`)
c.Assert(err, IsNil)
_, err = tk.Exec(`alter table t1 attributes="nomerge,somethingelse";`)
c.Assert(err, IsNil)

// space cases
_, err = tk.Exec(`alter table t1 attributes=" nomerge ";`)
c.Assert(err, IsNil)
_, err = tk.Exec(`alter table t1 attributes=" nomerge , somethingelse ";`)
c.Assert(err, IsNil)

// without equal
_, err = tk.Exec(`alter table t1 attributes " nomerge ";`)
c.Assert(err, IsNil)
_, err = tk.Exec(`alter table t1 attributes " nomerge , somethingelse ";`)
c.Assert(err, IsNil)
}
42 changes: 42 additions & 0 deletions ddl/ddl_api.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ import (
"github.com/pingcap/parser/terror"
field_types "github.com/pingcap/parser/types"
"github.com/pingcap/tidb/config"
"github.com/pingcap/tidb/ddl/label"
"github.com/pingcap/tidb/ddl/placement"
"github.com/pingcap/tidb/expression"
"github.com/pingcap/tidb/infoschema"
Expand Down Expand Up @@ -2587,6 +2588,8 @@ func (d *ddl) AlterTable(ctx context.Context, sctx sessionctx.Context, ident ast
err = d.AlterTableAddStatistics(sctx, ident, spec.Statistics, spec.IfNotExists)
case ast.AlterTableDropStatistics:
err = d.AlterTableDropStatistics(sctx, ident, spec.Statistics, spec.IfExists)
case ast.AlterTableAttributes:
err = d.AlterTableAttributes(sctx, ident, spec)
default:
// Nothing to do now.
}
Expand Down Expand Up @@ -6020,3 +6023,42 @@ func (d *ddl) AlterTableAlterPartition(ctx sessionctx.Context, ident ast.Ident,
err = d.callHookOnChanged(err)
return errors.Trace(err)
}

func (d *ddl) AlterTableAttributes(ctx sessionctx.Context, ident ast.Ident, spec *ast.AlterTableSpec) error {
schema, tb, err := d.getSchemaAndTableByIdent(ctx, ident)
if err != nil {
return errors.Trace(err)
}
meta := tb.Meta()

rule := label.NewRule()
err = rule.ApplyAttributesSpec(spec.AttributesSpec)
if err != nil {
var sb strings.Builder
restoreCtx := format.NewRestoreCtx(format.RestoreStringSingleQuotes|format.RestoreKeyWordLowercase|format.RestoreNameBackQuotes, &sb)

if e := spec.Restore(restoreCtx); e != nil {
return ErrInvalidAttributesSpec.GenWithStackByArgs(sb.String(), err)
}
return ErrInvalidAttributesSpec.GenWithStackByArgs(err)
}

rule.ResetTable(meta.ID, schema.Name.L, meta.Name.L)

job := &model.Job{
SchemaID: schema.ID,
TableID: meta.ID,
SchemaName: schema.Name.L,
Type: model.ActionAlterTableAttributes,
BinlogInfo: &model.HistoryInfo{},
Args: []interface{}{rule},
}

err = d.doDDLJob(ctx, job)
if err != nil {
return errors.Trace(err)
}

err = d.callHookOnChanged(err)
return errors.Trace(err)
}
2 changes: 2 additions & 0 deletions ddl/ddl_worker.go
Original file line number Diff line number Diff line change
Expand Up @@ -817,6 +817,8 @@ func (w *worker) runDDLJob(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64,
ver, err = onAlterSequence(t, job)
case model.ActionRenameTables:
ver, err = onRenameTables(d, t, job)
case model.ActionAlterTableAttributes:
ver, err = onAlterTableAttributes(t, job)
default:
// Invalid job, cancel it.
job.State = model.JobStateCancelled
Expand Down
3 changes: 3 additions & 0 deletions ddl/error.go
Original file line number Diff line number Diff line change
Expand Up @@ -287,4 +287,7 @@ var (
errUnsupportedOnCommitPreserve = dbterror.ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message("TiDB doesn't support ON COMMIT PRESERVE ROWS for now", nil))
errUnsupportedEngineTemporary = dbterror.ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message("TiDB doesn't support this kind of engine for temporary table", nil))
errUnsupportedClusteredSecondaryKey = dbterror.ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message("CLUSTERED/NONCLUSTERED keyword is only supported for primary key", nil))

// ErrInvalidAttributesSpec is returned when meeting invalid attributes.
ErrInvalidAttributesSpec = dbterror.ClassDDL.NewStd(mysql.ErrInvalidAttributesSpec)
)
Loading

0 comments on commit 46656d2

Please sign in to comment.