Skip to content

Commit

Permalink
Merge branch 'master' into br-stream-safepoint
Browse files Browse the repository at this point in the history
  • Loading branch information
joccau authored May 17, 2022
2 parents 67a12fc + 09b155f commit eb07296
Show file tree
Hide file tree
Showing 34 changed files with 2,923 additions and 992 deletions.
20 changes: 4 additions & 16 deletions cmd/explaintest/r/collation_misc_disabled.result
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,7 @@ select * from t;
a
t_value
alter table t modify column a varchar(20) charset utf8;
admin check table t;

select * from t;
a
t_value
Error 8200: Unsupported modify charset from latin1 to utf8
drop table t;
create table t(a varchar(20) charset latin1);
insert into t values ("t_value");
Expand All @@ -31,7 +27,7 @@ t_value
drop table t;
create table t(a varchar(20) charset latin1);
insert into t values ("t_value");
alter table t modify column a varchar(20) charset utf8 collate utf8_bin;
alter table t modify column a varchar(20) charset utf8mb4 collate utf8mb4_general_ci;
admin check table t;

select * from t;
Expand All @@ -40,7 +36,8 @@ t_value
drop table t;
create table t(a varchar(20) charset latin1);
insert into t values ("t_value");
alter table t modify column a varchar(20) charset utf8mb4 collate utf8mb4_general_ci;
alter table t modify column a varchar(20) charset utf8 collate utf8_bin;
Error 8200: Unsupported modify charset from latin1 to utf8
alter table t modify column a varchar(20) charset utf8mb4 collate utf8bin;
[ddl:1273]Unknown collation: 'utf8bin'
alter table t collate LATIN1_GENERAL_CI charset utf8 collate utf8_bin;
Expand All @@ -53,15 +50,6 @@ insert into t values ("t_value");
alter table t modify column a varchar(19) charset utf8mb4;
admin check table t;

select * from t;
a
t_value
drop table t;
create table t(a varchar(20) charset latin1);
insert into t values ("t_value");
alter table t modify column a varchar(19) charset utf8 collate utf8_bin;
admin check table t;

select * from t;
a
t_value
Expand Down
20 changes: 4 additions & 16 deletions cmd/explaintest/r/collation_misc_enabled.result
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,7 @@ select * from t;
a
t_value
alter table t modify column a varchar(20) charset utf8;
admin check table t;

select * from t;
a
t_value
Error 8200: Unsupported modify charset from latin1 to utf8
drop table t;
create table t(a varchar(20) charset latin1);
insert into t values ("t_value");
Expand All @@ -31,7 +27,7 @@ t_value
drop table t;
create table t(a varchar(20) charset latin1);
insert into t values ("t_value");
alter table t modify column a varchar(20) charset utf8 collate utf8_bin;
alter table t modify column a varchar(20) charset utf8mb4 collate utf8mb4_general_ci;
admin check table t;

select * from t;
Expand All @@ -40,7 +36,8 @@ t_value
drop table t;
create table t(a varchar(20) charset latin1);
insert into t values ("t_value");
alter table t modify column a varchar(20) charset utf8mb4 collate utf8mb4_general_ci;
alter table t modify column a varchar(20) charset utf8 collate utf8_bin;
Error 8200: Unsupported modify charset from latin1 to utf8
alter table t modify column a varchar(20) charset utf8mb4 collate utf8bin;
[ddl:1273]Unknown collation: 'utf8bin'
alter table t collate LATIN1_GENERAL_CI charset utf8 collate utf8_bin;
Expand All @@ -53,15 +50,6 @@ insert into t values ("t_value");
alter table t modify column a varchar(19) charset utf8mb4;
admin check table t;

select * from t;
a
t_value
drop table t;
create table t(a varchar(20) charset latin1);
insert into t values ("t_value");
alter table t modify column a varchar(19) charset utf8 collate utf8_bin;
admin check table t;

select * from t;
a
t_value
Expand Down
14 changes: 3 additions & 11 deletions cmd/explaintest/t/collation_misc.test
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,8 @@ insert into t values ("t_value");
alter table t modify column a varchar(20) charset latin1;
select * from t;

--error 8200
alter table t modify column a varchar(20) charset utf8;
admin check table t;
select * from t;

drop table t;
create table t(a varchar(20) charset latin1);
Expand All @@ -27,15 +26,15 @@ select * from t;
drop table t;
create table t(a varchar(20) charset latin1);
insert into t values ("t_value");
alter table t modify column a varchar(20) charset utf8 collate utf8_bin;
alter table t modify column a varchar(20) charset utf8mb4 collate utf8mb4_general_ci;
admin check table t;
select * from t;

drop table t;
create table t(a varchar(20) charset latin1);
insert into t values ("t_value");
--error 8200
alter table t modify column a varchar(20) charset utf8mb4 collate utf8mb4_general_ci;
alter table t modify column a varchar(20) charset utf8 collate utf8_bin;
--error 1273
alter table t modify column a varchar(20) charset utf8mb4 collate utf8bin;
--error 1302, 1273
Expand All @@ -51,13 +50,6 @@ alter table t modify column a varchar(19) charset utf8mb4;
admin check table t;
select * from t;

drop table t;
create table t(a varchar(20) charset latin1);
insert into t values ("t_value");
alter table t modify column a varchar(19) charset utf8 collate utf8_bin;
admin check table t;
select * from t;

# TestCharsetDatabase
create database if not exists cd_test_utf8 CHARACTER SET utf8 COLLATE utf8_bin;
--error 1273
Expand Down
7 changes: 2 additions & 5 deletions ddl/db_integration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -770,9 +770,7 @@ func TestChangingTableCharset(t *testing.T) {
tk.MustGetErrCode("alter table t charset utf8 collate latin1_bin", errno.ErrCollationCharsetMismatch)
tk.MustGetErrCode("alter table t charset utf8 collate utf8mb4_bin;", errno.ErrCollationCharsetMismatch)
tk.MustGetErrCode("alter table t charset utf8 collate utf8_bin collate utf8mb4_bin collate utf8_bin;", errno.ErrCollationCharsetMismatch)

tk.MustExec("alter table t charset utf8")
tk.MustExec("admin check table t")
tk.MustGetErrCode("alter table t charset utf8", errno.ErrUnsupportedDDLOperation)

tk.MustExec("drop table if exists t")
tk.MustExec("create table t(a char(10), index i(a)) charset latin1 collate latin1_bin")
Expand Down Expand Up @@ -806,8 +804,7 @@ func TestChangingTableCharset(t *testing.T) {
tk.MustExec("create table t(a varchar(20), key i(a)) charset=latin1")
tk.MustGetErrCode("alter table t convert to charset utf8 collate utf8_unicode_ci", errno.ErrUnsupportedDDLOperation)
tk.MustGetErrCode("alter table t convert to charset utf8 collate utf8_general_ci", errno.ErrUnsupportedDDLOperation)
tk.MustExec("alter table t convert to charset utf8 collate utf8_bin")
tk.MustGetErrCode("alter table t convert to charset latin1", errno.ErrUnsupportedDDLOperation)
tk.MustGetErrCode("alter table t convert to charset utf8 collate utf8_bin", errno.ErrUnsupportedDDLOperation)

// Test when column charset can not convert to the target charset.
tk.MustExec("drop table t;")
Expand Down
1 change: 0 additions & 1 deletion ddl/ddl_api.go
Original file line number Diff line number Diff line change
Expand Up @@ -4178,7 +4178,6 @@ func checkModifyCharsetAndCollation(toCharset, toCollate, origCharset, origColla
if (origCharset == charset.CharsetUTF8 && toCharset == charset.CharsetUTF8MB4) ||
(origCharset == charset.CharsetUTF8 && toCharset == charset.CharsetUTF8) ||
(origCharset == charset.CharsetUTF8MB4 && toCharset == charset.CharsetUTF8MB4) ||
(origCharset == charset.CharsetLatin1 && toCharset == charset.CharsetUTF8) ||
(origCharset == charset.CharsetLatin1 && toCharset == charset.CharsetUTF8MB4) {
// TiDB only allow utf8/latin1 to be changed to utf8mb4, or changing the collation when the charset is utf8/utf8mb4/latin1.
return nil
Expand Down
18 changes: 17 additions & 1 deletion distsql/distsql.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ package distsql

import (
"context"
"strconv"
"unsafe"

"github.com/opentracing/opentracing-go"
Expand All @@ -25,24 +26,26 @@ import (
"github.com/pingcap/tidb/metrics"
"github.com/pingcap/tidb/sessionctx"
"github.com/pingcap/tidb/sessionctx/stmtctx"
"github.com/pingcap/tidb/sessionctx/variable"
"github.com/pingcap/tidb/statistics"
"github.com/pingcap/tidb/types"
"github.com/pingcap/tidb/util/logutil"
"github.com/pingcap/tidb/util/trxevents"
"github.com/pingcap/tipb/go-tipb"
"github.com/tikv/client-go/v2/tikvrpc/interceptor"
"go.uber.org/zap"
"google.golang.org/grpc/metadata"
)

// DispatchMPPTasks dispatches all tasks and returns an iterator.
func DispatchMPPTasks(ctx context.Context, sctx sessionctx.Context, tasks []*kv.MPPDispatchRequest, fieldTypes []*types.FieldType, planIDs []int, rootID int, startTs uint64) (SelectResult, error) {
ctx = WithSQLKvExecCounterInterceptor(ctx, sctx.GetSessionVars().StmtCtx)
_, allowTiFlashFallback := sctx.GetSessionVars().AllowFallbackToTiKV[kv.TiFlash]
ctx = SetTiFlashMaxThreadsInContext(ctx, sctx)
resp := sctx.GetMPPClient().DispatchMPPTasks(ctx, sctx.GetSessionVars().KVVars, tasks, allowTiFlashFallback, startTs)
if resp == nil {
return nil, errors.New("client returns nil response")
}

encodeType := tipb.EncodeType_TypeDefault
if canUseChunkRPC(sctx) {
encodeType = tipb.EncodeType_TypeChunk
Expand Down Expand Up @@ -97,6 +100,11 @@ func Select(ctx context.Context, sctx sessionctx.Context, kvReq *kv.Request, fie
EventCb: eventCb,
EnableCollectExecutionInfo: config.GetGlobalConfig().Instance.EnableCollectExecutionInfo,
}

if kvReq.StoreType == kv.TiFlash {
ctx = SetTiFlashMaxThreadsInContext(ctx, sctx)
}

resp := sctx.GetClient().Send(ctx, kvReq, sctx.GetSessionVars().KVVars, option)
if resp == nil {
return nil, errors.New("client returns nil response")
Expand Down Expand Up @@ -141,6 +149,14 @@ func Select(ctx context.Context, sctx sessionctx.Context, kvReq *kv.Request, fie
}, nil
}

// SetTiFlashMaxThreadsInContext set the config TiFlash max threads in context.
func SetTiFlashMaxThreadsInContext(ctx context.Context, sctx sessionctx.Context) context.Context {
if sctx.GetSessionVars().TiFlashMaxThreads != -1 {
ctx = metadata.AppendToOutgoingContext(ctx, variable.TiDBMaxTiFlashThreads, strconv.FormatInt(sctx.GetSessionVars().TiFlashMaxThreads, 10))
}
return ctx
}

// SelectWithRuntimeStats sends a DAG request, returns SelectResult.
// The difference from Select is that SelectWithRuntimeStats will set copPlanIDs into selectResult,
// which can help selectResult to collect runtime stats.
Expand Down
10 changes: 6 additions & 4 deletions executor/builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -738,7 +738,7 @@ func (b *executorBuilder) buildExecute(v *plannercore.Execute) Executor {
baseExecutor: newBaseExecutor(b.ctx, v.Schema(), v.ID()),
is: b.is,
name: v.Name,
usingVars: v.UsingVars,
usingVars: v.TxtProtoVars,
id: v.ExecID,
stmt: v.Stmt,
plan: v.Plan,
Expand Down Expand Up @@ -1834,9 +1834,11 @@ func (b *executorBuilder) buildMemTable(v *plannercore.PhysicalMemTable) Executo
baseExecutor: newBaseExecutor(b.ctx, v.Schema(), v.ID()),
table: v.Table,
retriever: &hugeMemTableRetriever{
table: v.Table,
columns: v.Columns,
extractor: v.Extractor.(*plannercore.ColumnsTableExtractor),
table: v.Table,
columns: v.Columns,
extractor: v.Extractor.(*plannercore.ColumnsTableExtractor),
viewSchemaMap: make(map[int64]*expression.Schema),
viewOutputNamesMap: make(map[int64]types.NameSlice),
},
}

Expand Down
70 changes: 38 additions & 32 deletions executor/infoschema_reader.go
Original file line number Diff line number Diff line change
Expand Up @@ -679,26 +679,26 @@ func (e *hugeMemTableRetriever) setDataForColumns(ctx context.Context, sctx sess

func (e *hugeMemTableRetriever) dataForColumnsInTable(ctx context.Context, sctx sessionctx.Context, schema *model.DBInfo, tbl *model.TableInfo, priv mysql.PrivilegeType, extractor *plannercore.ColumnsTableExtractor) {
is := sessiontxn.GetTxnManager(sctx).GetTxnInfoSchema()
var viewSchema *expression.Schema
var viewOutputNames types.NameSlice
if tbl.IsView() {
var viewLogicalPlan plannercore.Plan
// Build plan is not thread safe, there will be concurrency on sessionctx.
if err := runWithSystemSession(sctx, func(s sessionctx.Context) error {
planBuilder, _ := plannercore.NewPlanBuilder().Init(s, is, &hint.BlockHintProcessor{})
var err error
viewLogicalPlan, err = planBuilder.BuildDataSourceFromView(ctx, schema.Name, tbl)
if err != nil {
e.viewMu.Lock()
_, ok := e.viewSchemaMap[tbl.ID]
if !ok {
var viewLogicalPlan plannercore.Plan
// Build plan is not thread safe, there will be concurrency on sessionctx.
if err := runWithSystemSession(sctx, func(s sessionctx.Context) error {
planBuilder, _ := plannercore.NewPlanBuilder().Init(s, is, &hint.BlockHintProcessor{})
var err error
viewLogicalPlan, err = planBuilder.BuildDataSourceFromView(ctx, schema.Name, tbl)
return errors.Trace(err)
}); err != nil {
sctx.GetSessionVars().StmtCtx.AppendWarning(err)
e.viewMu.Unlock()
return
}
return nil
}); err != nil {
sctx.GetSessionVars().StmtCtx.AppendWarning(err)
return
e.viewSchemaMap[tbl.ID] = viewLogicalPlan.Schema()
e.viewOutputNamesMap[tbl.ID] = viewLogicalPlan.OutputNames()
}

viewSchema = viewLogicalPlan.Schema()
viewOutputNames = viewLogicalPlan.OutputNames()
e.viewMu.Unlock()
}

var tableSchemaRegexp, tableNameRegexp, columnsRegexp []collate.WildcardPattern
Expand Down Expand Up @@ -737,15 +737,18 @@ ForColumnsTag:
}

ft := &col.FieldType
if viewSchema != nil {
// If this is a view, replace the column with the view column.
idx := expression.FindFieldNameIdxByColName(viewOutputNames, col.Name.L)
if idx >= 0 {
col1 := viewSchema.Columns[idx]
ft = col1.GetType()
if tbl.IsView() {
e.viewMu.RLock()
if e.viewSchemaMap[tbl.ID] != nil {
// If this is a view, replace the column with the view column.
idx := expression.FindFieldNameIdxByColName(e.viewOutputNamesMap[tbl.ID], col.Name.L)
if idx >= 0 {
col1 := e.viewSchemaMap[tbl.ID].Columns[idx]
ft = col1.GetType()
}
}
e.viewMu.RUnlock()
}

if !extractor.SkipRequest {
if tableSchemaFilterEnable && !extractor.TableSchema.Exist(schema.Name.L) {
continue
Expand Down Expand Up @@ -2613,15 +2616,18 @@ func (r *deadlocksTableRetriever) retrieve(ctx context.Context, sctx sessionctx.

type hugeMemTableRetriever struct {
dummyCloser
extractor *plannercore.ColumnsTableExtractor
table *model.TableInfo
columns []*model.ColumnInfo
retrieved bool
initialized bool
rows [][]types.Datum
dbs []*model.DBInfo
dbsIdx int
tblIdx int
extractor *plannercore.ColumnsTableExtractor
table *model.TableInfo
columns []*model.ColumnInfo
retrieved bool
initialized bool
rows [][]types.Datum
dbs []*model.DBInfo
dbsIdx int
tblIdx int
viewMu sync.RWMutex
viewSchemaMap map[int64]*expression.Schema // table id to view schema
viewOutputNamesMap map[int64]types.NameSlice // table id to view output names
}

// retrieve implements the infoschemaRetriever interface
Expand Down
2 changes: 1 addition & 1 deletion executor/set_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -594,7 +594,7 @@ func TestSetVar(t *testing.T) {
tk.MustQuery("show global variables like 'tidb_ignore_prepared_cache_close_stmt'").Check(testkit.Rows("tidb_ignore_prepared_cache_close_stmt OFF"))

// test for tidb_enable_new_cost_interface
tk.MustQuery("select @@global.tidb_enable_new_cost_interface").Check(testkit.Rows("0")) // default value is 0
tk.MustQuery("select @@global.tidb_enable_new_cost_interface").Check(testkit.Rows("1")) // default value is 1
tk.MustExec("set global tidb_enable_new_cost_interface=1")
tk.MustQuery("select @@global.tidb_enable_new_cost_interface").Check(testkit.Rows("1"))
tk.MustQuery("show global variables like 'tidb_enable_new_cost_interface'").Check(testkit.Rows()) // hidden
Expand Down
Loading

0 comments on commit eb07296

Please sign in to comment.