diff --git a/executor/write_test.go b/executor/write_test.go index d205b85a246df..d1f633b60d6ce 100644 --- a/executor/write_test.go +++ b/executor/write_test.go @@ -1974,6 +1974,24 @@ func TestIssue18681(t *testing.T) { require.Equal(t, uint16(0), sc.WarningCount()) } +func TestIssue33298(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + ctx := tk.Session().(sessionctx.Context) + defer ctx.SetValue(executor.LoadDataVarKey, nil) + + tk.MustExec("use test") + tk.MustExec("drop table if exists load_data_test") + tk.MustExec("create table load_data_test (a varchar(10), b varchar(10))") + + // According to https://dev.mysql.com/doc/refman/8.0/en/load-data.html , fixed-row format should be used when fields + // terminated by '' and enclosed by ''. However, tidb doesn't support it yet and empty terminator leads to infinite + // loop in `indexOfTerminator` (see https://github.com/pingcap/tidb/issues/33298). + require.Error(t, tk.ExecToErr("load data local infile '/tmp/nonexistence.csv' into table load_data_test fields terminated by ''")) + require.Error(t, tk.ExecToErr("load data local infile '/tmp/nonexistence.csv' into table load_data_test fields terminated by '' enclosed by ''")) +} + func TestLoadData(t *testing.T) { trivialMsg := "Records: 1 Deleted: 0 Skipped: 0 Warnings: 0" store, clean := testkit.CreateMockStore(t) diff --git a/planner/core/planbuilder.go b/planner/core/planbuilder.go index 0da9f93dee9d8..c7759f3c8e5a5 100644 --- a/planner/core/planbuilder.go +++ b/planner/core/planbuilder.go @@ -3913,6 +3913,10 @@ func (b *PlanBuilder) buildSelectPlanOfInsert(ctx context.Context, insert *ast.I } func (b *PlanBuilder) buildLoadData(ctx context.Context, ld *ast.LoadDataStmt) (Plan, error) { + // quick fix for https://github.com/pingcap/tidb/issues/33298 + if ld.FieldsInfo != nil && len(ld.FieldsInfo.Terminated) == 0 { + return nil, ErrNotSupportedYet.GenWithStackByArgs("load data with empty field terminator") + } p := LoadData{ IsLocal: ld.IsLocal, OnDuplicate: ld.OnDuplicate,