Skip to content

Commit

Permalink
planner: forbid load data with empty field terminator (pingcap#36500) (
Browse files Browse the repository at this point in the history
  • Loading branch information
ti-srebot authored Aug 25, 2022
1 parent a5fd7d1 commit 5263a0a
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 0 deletions.
18 changes: 18 additions & 0 deletions executor/write_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1995,6 +1995,24 @@ func TestIssue34358(t *testing.T) {
}, ld, t, tk, ctx, "select * from load_data_test", "delete from load_data_test")
}

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)
Expand Down
4 changes: 4 additions & 0 deletions planner/core/planbuilder.go
Original file line number Diff line number Diff line change
Expand Up @@ -3891,6 +3891,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,
Expand Down

0 comments on commit 5263a0a

Please sign in to comment.