From 4a3148eb297f9b24682cb1c5f08d8b84101cf242 Mon Sep 17 00:00:00 2001 From: tangenta Date: Wed, 23 Nov 2022 17:19:21 +0800 Subject: [PATCH 1/2] executor: move FillVirtualColumnValue to the table package --- executor/analyze_col_v2.go | 3 ++- executor/batch_point_get.go | 3 ++- executor/executor.go | 33 --------------------------------- executor/point_get.go | 4 ++-- executor/table_reader.go | 2 +- table/column.go | 34 ++++++++++++++++++++++++++++++++++ 6 files changed, 41 insertions(+), 38 deletions(-) diff --git a/executor/analyze_col_v2.go b/executor/analyze_col_v2.go index 68a02485c0048..0ab8a3a019cbe 100644 --- a/executor/analyze_col_v2.go +++ b/executor/analyze_col_v2.go @@ -32,6 +32,7 @@ import ( "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/statistics" + "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util" @@ -187,7 +188,7 @@ func (e *AnalyzeColumnsExecV2) decodeSampleDataWithVirtualColumn( } } } - err := FillVirtualColumnValue(fieldTps, virtualColIdx, schema, e.colsInfo, e.ctx, chk) + err := table.FillVirtualColumnValue(fieldTps, virtualColIdx, schema.Columns, e.colsInfo, e.ctx, chk) if err != nil { return err } diff --git a/executor/batch_point_get.go b/executor/batch_point_get.go index 1af256ade8c31..6f9710dd14f0d 100644 --- a/executor/batch_point_get.go +++ b/executor/batch_point_get.go @@ -29,6 +29,7 @@ import ( "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/variable" driver "github.com/pingcap/tidb/store/driver/txn" + "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/types" @@ -190,7 +191,7 @@ func (e *BatchPointGetExec) Next(ctx context.Context, req *chunk.Chunk) error { e.index++ } - err := FillVirtualColumnValue(e.virtualColumnRetFieldTypes, e.virtualColumnIndex, e.schema, e.columns, e.ctx, req) + err := table.FillVirtualColumnValue(e.virtualColumnRetFieldTypes, e.virtualColumnIndex, e.schema.Columns, e.columns, e.ctx, req) if err != nil { return err } diff --git a/executor/executor.go b/executor/executor.go index d792d3a219bb3..930331684d1de 100644 --- a/executor/executor.go +++ b/executor/executor.go @@ -2186,39 +2186,6 @@ func ResetUpdateStmtCtx(sc *stmtctx.StatementContext, stmt *ast.UpdateStmt, vars sc.IgnoreNoPartition = stmt.IgnoreErr } -// FillVirtualColumnValue will calculate the virtual column value by evaluating generated -// expression using rows from a chunk, and then fill this value into the chunk -func FillVirtualColumnValue(virtualRetTypes []*types.FieldType, virtualColumnIndex []int, - schema *expression.Schema, columns []*model.ColumnInfo, sctx sessionctx.Context, req *chunk.Chunk) error { - if len(virtualColumnIndex) == 0 { - return nil - } - - virCols := chunk.NewChunkWithCapacity(virtualRetTypes, req.Capacity()) - iter := chunk.NewIterator4Chunk(req) - for i, idx := range virtualColumnIndex { - for row := iter.Begin(); row != iter.End(); row = iter.Next() { - datum, err := schema.Columns[idx].EvalVirtualColumn(row) - if err != nil { - return err - } - // Because the expression might return different type from - // the generated column, we should wrap a CAST on the result. - castDatum, err := table.CastValue(sctx, datum, columns[idx], false, true) - if err != nil { - return err - } - // Handle the bad null error. - if (mysql.HasNotNullFlag(columns[idx].GetFlag()) || mysql.HasPreventNullInsertFlag(columns[idx].GetFlag())) && castDatum.IsNull() { - castDatum = table.GetZeroValue(columns[idx]) - } - virCols.AppendDatum(i, &castDatum) - } - req.SetCol(idx, virCols.Column(i)) - } - return nil -} - func setOptionForTopSQL(sc *stmtctx.StatementContext, snapshot kv.Snapshot) { if snapshot == nil { return diff --git a/executor/point_get.go b/executor/point_get.go index f65c52c06cb1b..e83c5f32e0927 100644 --- a/executor/point_get.go +++ b/executor/point_get.go @@ -347,8 +347,8 @@ func (e *PointGetExecutor) Next(ctx context.Context, req *chunk.Chunk) error { return err } - err = FillVirtualColumnValue(e.virtualColumnRetFieldTypes, e.virtualColumnIndex, - e.schema, e.columns, e.ctx, req) + err = table.FillVirtualColumnValue(e.virtualColumnRetFieldTypes, e.virtualColumnIndex, + e.schema.Columns, e.columns, e.ctx, req) if err != nil { return err } diff --git a/executor/table_reader.go b/executor/table_reader.go index 500b3ba3ab771..ce5a10b125754 100644 --- a/executor/table_reader.go +++ b/executor/table_reader.go @@ -256,7 +256,7 @@ func (e *TableReaderExecutor) Next(ctx context.Context, req *chunk.Chunk) error return err } - err := FillVirtualColumnValue(e.virtualColumnRetFieldTypes, e.virtualColumnIndex, e.schema, e.columns, e.ctx, req) + err := table.FillVirtualColumnValue(e.virtualColumnRetFieldTypes, e.virtualColumnIndex, e.schema.Columns, e.columns, e.ctx, req) if err != nil { return err } diff --git a/table/column.go b/table/column.go index b814c8927a472..0a80ddae4e8d4 100644 --- a/table/column.go +++ b/table/column.go @@ -35,6 +35,7 @@ import ( "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/hack" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/timeutil" @@ -670,3 +671,36 @@ func OptionalFsp(fieldType *types.FieldType) string { } return "(" + strconv.Itoa(fsp) + ")" } + +// FillVirtualColumnValue will calculate the virtual column value by evaluating generated +// expression using rows from a chunk, and then fill this value into the chunk. +func FillVirtualColumnValue(virtualRetTypes []*types.FieldType, virtualColumnIndex []int, + expCols []*expression.Column, colInfos []*model.ColumnInfo, sctx sessionctx.Context, req *chunk.Chunk) error { + if len(virtualColumnIndex) == 0 { + return nil + } + + virCols := chunk.NewChunkWithCapacity(virtualRetTypes, req.Capacity()) + iter := chunk.NewIterator4Chunk(req) + for i, idx := range virtualColumnIndex { + for row := iter.Begin(); row != iter.End(); row = iter.Next() { + datum, err := expCols[idx].EvalVirtualColumn(row) + if err != nil { + return err + } + // Because the expression might return different type from + // the generated column, we should wrap a CAST on the result. + castDatum, err := CastValue(sctx, datum, colInfos[idx], false, true) + if err != nil { + return err + } + // Handle the bad null error. + if (mysql.HasNotNullFlag(colInfos[idx].GetFlag()) || mysql.HasPreventNullInsertFlag(colInfos[idx].GetFlag())) && castDatum.IsNull() { + castDatum = GetZeroValue(colInfos[idx]) + } + virCols.AppendDatum(i, &castDatum) + } + req.SetCol(idx, virCols.Column(i)) + } + return nil +} From 112666051b3d30abbe33f4851ada938132c734a1 Mon Sep 17 00:00:00 2001 From: tangenta Date: Wed, 23 Nov 2022 17:27:35 +0800 Subject: [PATCH 2/2] update bazel --- table/BUILD.bazel | 1 + 1 file changed, 1 insertion(+) diff --git a/table/BUILD.bazel b/table/BUILD.bazel index 5f8e425822279..a1f2feab60722 100644 --- a/table/BUILD.bazel +++ b/table/BUILD.bazel @@ -23,6 +23,7 @@ go_library( "//sessionctx", "//sessionctx/stmtctx", "//types", + "//util/chunk", "//util/dbterror", "//util/hack", "//util/logutil",