Skip to content

Commit da3e7ca

Browse files
authored
table: add WritableConstraint to interface table.Table to avoid implicit interface implementation (#54825)
close #54824
1 parent d67421d commit da3e7ca

File tree

5 files changed

+46
-47
lines changed

5 files changed

+46
-47
lines changed

pkg/executor/write.go

+3-10
Original file line numberDiff line numberDiff line change
@@ -329,8 +329,9 @@ func checkRowForExchangePartition(sctx table.MutateContext, row []types.Datum, t
329329
if !ok {
330330
return errors.Errorf("exchange partition process assert table partition failed")
331331
}
332+
evalCtx := sctx.GetExprCtx().GetEvalCtx()
332333
err := p.CheckForExchangePartition(
333-
sctx.GetExprCtx().GetEvalCtx(),
334+
evalCtx,
334335
pt.Meta().Partition,
335336
row,
336337
tbl.ExchangePartitionInfo.ExchangePartitionDefID,
@@ -340,15 +341,7 @@ func checkRowForExchangePartition(sctx table.MutateContext, row []types.Datum, t
340341
return err
341342
}
342343
if variable.EnableCheckConstraint.Load() {
343-
type CheckConstraintTable interface {
344-
CheckRowConstraint(ctx table.MutateContext, rowToCheck []types.Datum) error
345-
}
346-
cc, ok := pt.(CheckConstraintTable)
347-
if !ok {
348-
return errors.Errorf("exchange partition process assert check constraint failed")
349-
}
350-
err := cc.CheckRowConstraint(sctx, row)
351-
if err != nil {
344+
if err = table.CheckRowConstraintWithDatum(evalCtx, pt.WritableConstraint(), row); err != nil {
352345
// TODO: make error include ExchangePartition info.
353346
return err
354347
}

pkg/infoschema/tables.go

+10
Original file line numberDiff line numberDiff line change
@@ -2410,6 +2410,11 @@ func (it *infoschemaTable) Indices() []table.Index {
24102410
return nil
24112411
}
24122412

2413+
// WritableConstraint implements table.Table WritableConstraint interface.
2414+
func (it *infoschemaTable) WritableConstraint() []*table.Constraint {
2415+
return nil
2416+
}
2417+
24132418
// RecordPrefix implements table.Table RecordPrefix interface.
24142419
func (it *infoschemaTable) RecordPrefix() kv.Key {
24152420
return nil
@@ -2498,6 +2503,11 @@ func (vt *VirtualTable) Indices() []table.Index {
24982503
return nil
24992504
}
25002505

2506+
// WritableConstraint implements table.Table WritableConstraint interface.
2507+
func (vt *VirtualTable) WritableConstraint() []*table.Constraint {
2508+
return nil
2509+
}
2510+
25012511
// RecordPrefix implements table.Table RecordPrefix interface.
25022512
func (vt *VirtualTable) RecordPrefix() kv.Key {
25032513
return nil

pkg/table/table.go

+28
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,15 @@ import (
2424

2525
mysql "github.com/pingcap/tidb/pkg/errno"
2626
"github.com/pingcap/tidb/pkg/expression"
27+
exprctx "github.com/pingcap/tidb/pkg/expression/context"
2728
"github.com/pingcap/tidb/pkg/kv"
2829
"github.com/pingcap/tidb/pkg/meta/autoid"
2930
"github.com/pingcap/tidb/pkg/parser/model"
3031
"github.com/pingcap/tidb/pkg/sessionctx"
3132
"github.com/pingcap/tidb/pkg/sessionctx/variable"
3233
tbctx "github.com/pingcap/tidb/pkg/table/context"
3334
"github.com/pingcap/tidb/pkg/types"
35+
"github.com/pingcap/tidb/pkg/util/chunk"
3436
"github.com/pingcap/tidb/pkg/util/dbterror"
3537
"github.com/pingcap/tidb/pkg/util/sqlexec"
3638
"github.com/pingcap/tidb/pkg/util/tracing"
@@ -188,6 +190,9 @@ type Table interface {
188190
// The caller must be aware of that not all the returned indices are public.
189191
Indices() []Index
190192

193+
// WritableConstraint returns constraints of the table in writable states.
194+
WritableConstraint() []*Constraint
195+
191196
// RecordPrefix returns the record key prefix.
192197
RecordPrefix() kv.Key
193198
// IndexPrefix returns the index key prefix.
@@ -303,3 +308,26 @@ type CachedTable interface {
303308
// The result is sent to the 'wg' channel.
304309
WriteLockAndKeepAlive(ctx context.Context, exit chan struct{}, leasePtr *uint64, wg chan error)
305310
}
311+
312+
// CheckRowConstraint verify row check constraints.
313+
func CheckRowConstraint(ctx exprctx.EvalContext, constraints []*Constraint, rowToCheck chunk.Row) error {
314+
for _, constraint := range constraints {
315+
ok, isNull, err := constraint.ConstraintExpr.EvalInt(ctx, rowToCheck)
316+
if err != nil {
317+
return err
318+
}
319+
if ok == 0 && !isNull {
320+
return ErrCheckConstraintViolated.FastGenByArgs(constraint.Name.O)
321+
}
322+
}
323+
return nil
324+
}
325+
326+
// CheckRowConstraintWithDatum verify row check constraints.
327+
// It is the same with `CheckRowConstraint` but receives a slice of `types.Datum` instead of `chunk.Row`.
328+
func CheckRowConstraintWithDatum(ctx exprctx.EvalContext, constraints []*Constraint, row []types.Datum) error {
329+
if len(constraints) == 0 {
330+
return nil
331+
}
332+
return CheckRowConstraint(ctx, constraints, chunk.MutRowFromDatums(row).ToRow())
333+
}

pkg/table/tables/partition.go

+3-9
Original file line numberDiff line numberDiff line change
@@ -1579,15 +1579,9 @@ func checkConstraintForExchangePartition(sctx table.MutateContext, row []types.D
15791579
return errors.Errorf("exchange partition process table by id failed")
15801580
}
15811581
}
1582-
type CheckConstraintTable interface {
1583-
CheckRowConstraint(ctx table.MutateContext, rowToCheck []types.Datum) error
1584-
}
1585-
cc, ok := nt.(CheckConstraintTable)
1586-
if !ok {
1587-
return errors.Errorf("exchange partition process assert check constraint failed")
1588-
}
1589-
err := cc.CheckRowConstraint(sctx, row)
1590-
if err != nil {
1582+
1583+
evalCtx := sctx.GetExprCtx().GetEvalCtx()
1584+
if err := table.CheckRowConstraintWithDatum(evalCtx, nt.WritableConstraint(), row); err != nil {
15911585
// TODO: make error include ExchangePartition info.
15921586
return err
15931587
}

pkg/table/tables/tables.go

+2-28
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ import (
4646
"github.com/pingcap/tidb/pkg/tablecodec"
4747
"github.com/pingcap/tidb/pkg/types"
4848
"github.com/pingcap/tidb/pkg/util"
49-
"github.com/pingcap/tidb/pkg/util/chunk"
5049
"github.com/pingcap/tidb/pkg/util/codec"
5150
"github.com/pingcap/tidb/pkg/util/collate"
5251
"github.com/pingcap/tidb/pkg/util/generatedexpr"
@@ -378,30 +377,6 @@ func (t *TableCommon) WritableConstraint() []*table.Constraint {
378377
return t.writableConstraints
379378
}
380379

381-
// CheckRowConstraint verify row check constraints.
382-
func (t *TableCommon) CheckRowConstraint(ctx table.MutateContext, rowToCheck []types.Datum) error {
383-
if constraints := t.WritableConstraint(); len(constraints) > 0 {
384-
ectx := ctx.GetExprCtx().GetEvalCtx()
385-
row := chunk.MutRowFromDatums(rowToCheck).ToRow()
386-
return checkRowConstraint(ectx, constraints, row)
387-
}
388-
return nil
389-
}
390-
391-
// checkRowConstraint verify row check constraints.
392-
func checkRowConstraint(ctx exprctx.EvalContext, constraints []*table.Constraint, rowToCheck chunk.Row) error {
393-
for _, constraint := range constraints {
394-
ok, isNull, err := constraint.ConstraintExpr.EvalInt(ctx, rowToCheck)
395-
if err != nil {
396-
return err
397-
}
398-
if ok == 0 && !isNull {
399-
return table.ErrCheckConstraintViolated.FastGenByArgs(constraint.Name.O)
400-
}
401-
}
402-
return nil
403-
}
404-
405380
// FullHiddenColsAndVisibleCols implements table FullHiddenColsAndVisibleCols interface.
406381
func (t *TableCommon) FullHiddenColsAndVisibleCols() []*table.Column {
407382
return t.fullHiddenColsAndVisibleColumns
@@ -532,7 +507,7 @@ func (t *TableCommon) UpdateRecord(ctx context.Context, sctx table.MutateContext
532507
// check data constraint
533508
evalCtx := sctx.GetExprCtx().GetEvalCtx()
534509
if constraints := t.WritableConstraint(); len(constraints) > 0 {
535-
if err = checkRowConstraint(evalCtx, constraints, checkRowBuffer.GetRowToCheck()); err != nil {
510+
if err = table.CheckRowConstraint(evalCtx, constraints, checkRowBuffer.GetRowToCheck()); err != nil {
536511
return err
537512
}
538513
}
@@ -917,8 +892,7 @@ func (t *TableCommon) AddRecord(sctx table.MutateContext, r []types.Datum, opts
917892
}
918893
}
919894
// check data constraint
920-
err = t.CheckRowConstraint(sctx, r)
921-
if err != nil {
895+
if err = table.CheckRowConstraintWithDatum(evalCtx, t.WritableConstraint(), r); err != nil {
922896
return nil, err
923897
}
924898
key := t.RecordKey(recordID)

0 commit comments

Comments
 (0)