Skip to content

Commit

Permalink
Merge branch 'master' into refine-errcode
Browse files Browse the repository at this point in the history
  • Loading branch information
tiancaiamao committed Dec 11, 2019
2 parents f3b363a + a94cff9 commit c5d0d66
Show file tree
Hide file tree
Showing 45 changed files with 985 additions and 268 deletions.
33 changes: 33 additions & 0 deletions cmd/explaintest/r/explain_easy.result
Expand Up @@ -482,6 +482,39 @@ explain select distinct t1.a, t1.b from t1 left outer join t2 on t1.a = t2.a;
id count task operator info
IndexReader_11 10000.00 root index:IndexScan_10
└─IndexScan_10 10000.00 cop[tikv] table:t1, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo
CREATE TABLE `test01` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`stat_date` int(11) NOT NULL DEFAULT '0',
`show_date` varchar(20) NOT NULL DEFAULT '',
`region_id` bigint(20) unsigned NOT NULL DEFAULT '0',
`period` tinyint(3) unsigned NOT NULL DEFAULT '0',
`registration_num` bigint(20) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
CREATE TABLE `test02` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`region_name` varchar(128) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
EXPLAIN SELECT COUNT(1) FROM (SELECT COALESCE(b.region_name, '不详') region_name, SUM(a.registration_num) registration_num FROM (SELECT stat_date, show_date, region_id, 0 registration_num FROM test01 WHERE period = 1 AND stat_date >= 20191202 AND stat_date <= 20191202 UNION ALL SELECT stat_date, show_date, region_id, registration_num registration_num FROM test01 WHERE period = 1 AND stat_date >= 20191202 AND stat_date <= 20191202) a LEFT JOIN test02 b ON a.region_id = b.id WHERE registration_num > 0 AND a.stat_date >= '20191202' AND a.stat_date <= '20191202' GROUP BY a.stat_date , a.show_date , COALESCE(b.region_name, '不详') ) JLS;
id count task operator info
StreamAgg_22 1.00 root funcs:count(1)->Column#22
└─HashAgg_25 1.00 root group by:Column#31, Column#32, Column#33, funcs:firstrow(1)->Column#23
└─Projection_50 0.02 root Column#14, Column#15, coalesce(test.test02.region_name, 不详)->Column#33
└─IndexMergeJoin_32 0.02 root left outer join, inner:TableReader_30, outer key:Column#16, inner key:test.test02.id
├─Union_37 0.02 root
│ ├─Projection_38 0.01 root test.test01.stat_date, test.test01.show_date, test.test01.region_id, cast(0)->Column#17
│ │ └─Selection_39 0.01 root gt(cast(0), 0)
│ │ └─TableReader_42 0.01 root data:Selection_41
│ │ └─Selection_41 0.01 cop[tikv] eq(test.test01.period, 1), ge(test.test01.stat_date, 20191202), ge(test.test01.stat_date, 20191202), le(test.test01.stat_date, 20191202), le(test.test01.stat_date, 20191202)
│ │ └─TableScan_40 10000.00 cop[tikv] table:test01, range:[-inf,+inf], keep order:false, stats:pseudo
│ └─Projection_43 0.01 root test.test01.stat_date, test.test01.show_date, test.test01.region_id, cast(test.test01.registration_num)->Column#17
│ └─Selection_44 0.01 root gt(cast(test.test01.registration_num), 0)
│ └─TableReader_47 0.01 root data:Selection_46
│ └─Selection_46 0.01 cop[tikv] eq(test.test01.period, 1), ge(test.test01.stat_date, 20191202), ge(test.test01.stat_date, 20191202), le(test.test01.stat_date, 20191202), le(test.test01.stat_date, 20191202)
│ └─TableScan_45 10000.00 cop[tikv] table:test01, range:[-inf,+inf], keep order:false, stats:pseudo
└─TableReader_30 1.00 root data:TableScan_29
└─TableScan_29 1.00 cop[tikv] table:b, range: decided by [Column#16], keep order:true, stats:pseudo
drop table if exists t;
create table t(a int, nb int not null, nc int not null);
explain select ifnull(a, 0) from t;
Expand Down
18 changes: 18 additions & 0 deletions cmd/explaintest/t/explain_easy.test
Expand Up @@ -104,6 +104,24 @@ create table t2(a int, b int, c int, primary key(a));
explain select t1.a, t1.b from t1 left outer join t2 on t1.a = t2.a;
explain select distinct t1.a, t1.b from t1 left outer join t2 on t1.a = t2.a;

CREATE TABLE `test01` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`stat_date` int(11) NOT NULL DEFAULT '0',
`show_date` varchar(20) NOT NULL DEFAULT '',
`region_id` bigint(20) unsigned NOT NULL DEFAULT '0',
`period` tinyint(3) unsigned NOT NULL DEFAULT '0',
`registration_num` bigint(20) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

CREATE TABLE `test02` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`region_name` varchar(128) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

EXPLAIN SELECT COUNT(1) FROM (SELECT COALESCE(b.region_name, '不详') region_name, SUM(a.registration_num) registration_num FROM (SELECT stat_date, show_date, region_id, 0 registration_num FROM test01 WHERE period = 1 AND stat_date >= 20191202 AND stat_date <= 20191202 UNION ALL SELECT stat_date, show_date, region_id, registration_num registration_num FROM test01 WHERE period = 1 AND stat_date >= 20191202 AND stat_date <= 20191202) a LEFT JOIN test02 b ON a.region_id = b.id WHERE registration_num > 0 AND a.stat_date >= '20191202' AND a.stat_date <= '20191202' GROUP BY a.stat_date , a.show_date , COALESCE(b.region_name, '不详') ) JLS;

# https://github.com/pingcap/tidb/issues/7918
drop table if exists t;
create table t(a int, nb int not null, nc int not null);
Expand Down
5 changes: 4 additions & 1 deletion config/config.go
Expand Up @@ -720,7 +720,10 @@ func (c *Config) Valid() error {
return fmt.Errorf("grpc-connection-count should be greater than 0")
}

if c.Performance.TxnTotalSizeLimit > (10 << 30) {
if c.Performance.TxnTotalSizeLimit > 100<<20 && c.Binlog.Enable {
return fmt.Errorf("txn-total-size-limit should be less than %d with binlog enabled", 100<<20)
}
if c.Performance.TxnTotalSizeLimit > 10<<30 {
return fmt.Errorf("txn-total-size-limit should be less than %d", 10<<30)
}

Expand Down
4 changes: 4 additions & 0 deletions config/config_test.go
Expand Up @@ -377,4 +377,8 @@ func (s *testConfigSuite) TestTxnTotalSizeLimitValid(c *C) {
conf.Performance.TxnTotalSizeLimit = tt.limit
c.Assert(conf.Valid() == nil, Equals, tt.valid)
}

conf.Binlog.Enable = true
conf.Performance.TxnTotalSizeLimit = 100<<20 + 1
c.Assert(conf.Valid(), NotNil)
}
2 changes: 1 addition & 1 deletion ddl/index.go
Expand Up @@ -980,7 +980,7 @@ func (w *addIndexWorker) backfillIndexInTxn(handleRange reorgIndexTask) (taskCtx

// Lock the row key to notify us that someone delete or update the row,
// then we should not backfill the index of it, otherwise the adding index is redundant.
err := txn.LockKeys(context.Background(), nil, 0, kv.LockAlwaysWait, time.Now(), idxRecord.key)
err := txn.LockKeys(context.Background(), new(kv.LockCtx), idxRecord.key)
if err != nil {
return errors.Trace(err)
}
Expand Down
14 changes: 13 additions & 1 deletion distsql/select_result.go
Expand Up @@ -74,7 +74,9 @@ type selectResult struct {
copPlanIDs []fmt.Stringer
rootPlanID fmt.Stringer

memTracker *memory.Tracker
fetchDuration time.Duration
durationReported bool
memTracker *memory.Tracker
}

func (r *selectResult) Fetch(ctx context.Context) {
Expand All @@ -83,7 +85,10 @@ func (r *selectResult) Fetch(ctx context.Context) {
func (r *selectResult) fetchResp(ctx context.Context) error {
for {
r.respChkIdx = 0
startTime := time.Now()
resultSubset, err := r.resp.Next(ctx)
duration := time.Since(startTime)
r.fetchDuration += duration
if err != nil {
return errors.Trace(err)
}
Expand All @@ -92,6 +97,13 @@ func (r *selectResult) fetchResp(ctx context.Context) error {
}
if resultSubset == nil {
r.selectResp = nil
if !r.durationReported {
// final round of fetch
// TODO: Add a label to distinguish between success or failure.
// https://github.com/pingcap/tidb/issues/11397
metrics.DistSQLQueryHistgram.WithLabelValues(r.label, r.sqlType).Observe(r.fetchDuration.Seconds())
r.durationReported = true
}
return nil
}
r.selectResp = new(tipb.SelectResponse)
Expand Down
11 changes: 8 additions & 3 deletions executor/adapter.go
Expand Up @@ -529,9 +529,14 @@ func (a *ExecStmt) handlePessimisticDML(ctx context.Context, e Executor) error {
if len(keys) == 0 {
return nil
}
forUpdateTS := txnCtx.GetForUpdateTS()
err = txn.LockKeys(ctx, &sctx.GetSessionVars().Killed, forUpdateTS, sctx.GetSessionVars().LockWaitTimeout,
sctx.GetSessionVars().StmtCtx.GetLockWaitStartTime(), keys...)
seVars := sctx.GetSessionVars()
lockCtx := &kv.LockCtx{
Killed: &seVars.Killed,
ForUpdateTS: txnCtx.GetForUpdateTS(),
LockWaitTime: seVars.LockWaitTimeout,
WaitStartTime: seVars.StmtCtx.GetLockWaitStartTime(),
}
err = txn.LockKeys(ctx, lockCtx, keys...)
if err == nil {
return nil
}
Expand Down
3 changes: 1 addition & 2 deletions executor/admin.go
Expand Up @@ -16,7 +16,6 @@ package executor
import (
"context"
"math"
"time"

"github.com/pingcap/parser/ast"
"github.com/pingcap/parser/model"
Expand Down Expand Up @@ -433,7 +432,7 @@ func (e *RecoverIndexExec) backfillIndexInTxn(ctx context.Context, txn kv.Transa
}

recordKey := e.table.RecordKey(row.handle)
err := txn.LockKeys(ctx, nil, 0, kv.LockAlwaysWait, time.Now(), recordKey)
err := txn.LockKeys(ctx, new(kv.LockCtx), recordKey)
if err != nil {
return result, err
}
Expand Down
25 changes: 18 additions & 7 deletions executor/builder.go
Expand Up @@ -1241,13 +1241,24 @@ func (b *executorBuilder) getStartTS() (uint64, error) {
}

func (b *executorBuilder) buildMemTable(v *plannercore.PhysicalMemTable) Executor {
tb, _ := b.is.TableByID(v.Table.ID)
e := &TableScanExec{
baseExecutor: newBaseExecutor(b.ctx, v.Schema(), v.ExplainID()),
t: tb,
columns: v.Columns,
seekHandle: math.MinInt64,
isVirtualTable: !tb.Type().IsNormalTable(),
var e Executor
switch v.Table.Name.L {
case strings.ToLower(infoschema.TableClusterConfig):
e = &ClusterReaderExec{
baseExecutor: newBaseExecutor(b.ctx, v.Schema(), v.ExplainID()),
retriever: &clusterConfigRetriever{
extractor: v.Extractor.(*plannercore.ClusterConfigTableExtractor),
},
}
default:
tb, _ := b.is.TableByID(v.Table.ID)
e = &TableScanExec{
baseExecutor: newBaseExecutor(b.ctx, v.Schema(), v.ExplainID()),
t: tb,
columns: v.Columns,
seekHandle: math.MinInt64,
isVirtualTable: !tb.Type().IsNormalTable(),
}
}
return e
}
Expand Down

0 comments on commit c5d0d66

Please sign in to comment.