From cc8007a1a97051b1471c932de69596b09466deba Mon Sep 17 00:00:00 2001
From: xuhuaiyu <391585975@qq.com>
Date: Wed, 26 Feb 2020 15:11:30 +0800
Subject: [PATCH 01/30] lightning: split large csv file if possible

---
 lightning/config/const.go      |  1 +
 lightning/mydump/csv_parser.go | 23 ++++++++++++
 lightning/mydump/region.go     | 69 +++++++++++++++++++++++++++++++---
 lightning/restore/restore.go   |  6 +--
 4 files changed, 91 insertions(+), 8 deletions(-)

diff --git a/lightning/config/const.go b/lightning/config/const.go
index 5f7541458..8d24a13b4 100644
--- a/lightning/config/const.go
+++ b/lightning/config/const.go
@@ -21,6 +21,7 @@ const (
 	// mydumper
 	ReadBlockSize int64 = 64 * _K
 	MinRegionSize int64 = 256 * _M
+	MaxRegionSize int64 = 256 * _M
 
 	BufferSizeScale = 5
 
diff --git a/lightning/mydump/csv_parser.go b/lightning/mydump/csv_parser.go
index 77f5266fc..51015186c 100644
--- a/lightning/mydump/csv_parser.go
+++ b/lightning/mydump/csv_parser.go
@@ -150,3 +150,26 @@ func (parser *CSVParser) ReadRow() error {
 		}
 	}
 }
+
+func (parser *CSVParser) TouchTokNewLine() (pos int64, err error) {
+	hasField := false
+	for {
+		tok, _, err := parser.lex()
+		switch errors.Cause(err) {
+		case nil:
+		case io.EOF:
+			if hasField {
+				tok = csvTokNewLine
+				break
+			}
+			fallthrough
+		default:
+			return parser.pos, errors.Trace(err)
+		}
+		hasField = true
+		switch tok {
+		case csvTokNewLine:
+			return parser.pos, nil
+		}
+	}
+}
diff --git a/lightning/mydump/region.go b/lightning/mydump/region.go
index 9e2761eef..3ac486561 100644
--- a/lightning/mydump/region.go
+++ b/lightning/mydump/region.go
@@ -19,6 +19,8 @@ import (
 	"strings"
 
 	"github.com/pingcap/errors"
+	"github.com/pingcap/tidb-lightning/lightning/config"
+		"github.com/pingcap/tidb-lightning/lightning/worker"
 )
 
 type TableRegion struct {
@@ -135,14 +137,14 @@ func AllocateEngineIDs(
 func MakeTableRegions(
 	meta *MDTableMeta,
 	columns int,
-	batchSize int64,
-	batchImportRatio float64,
-	tableConcurrency int,
+	cfg *config.Config,
+	ioWorkers       *worker.Pool,
 ) ([]*TableRegion, error) {
 	// Split files into regions
 	filesRegions := make(regionSlice, 0, len(meta.DataFiles))
 	dataFileSizes := make([]float64, 0, len(meta.DataFiles))
 
+
 	prevRowIDMax := int64(0)
 	for _, dataFile := range meta.DataFiles {
 		dataFileInfo, err := os.Stat(dataFile)
@@ -152,9 +154,24 @@ func MakeTableRegions(
 		dataFileSize := dataFileInfo.Size()
 
 		divisor := int64(columns)
-		if strings.HasSuffix(strings.ToLower(dataFile), ".sql") {
+		isCsvFile := strings.HasSuffix(strings.ToLower(dataFile), ".csv")
+		if !isCsvFile {
 			divisor += 2
 		}
+		// If a csv file is overlarge, we need to split it into mutiple regions.
+		if isCsvFile && dataFileSize > config.MaxRegionSize { // && config.IsStrict
+			var (
+				regions []*TableRegion
+				subFileSizes []float64
+			)
+			prevRowIDMax, regions, subFileSizes, err = splitLargeFile(meta, cfg, dataFile, dataFileSize, divisor, prevRowIDMax, ioWorkers)
+			if err != nil {
+				return nil, err
+			}
+			dataFileSizes = append(dataFileSizes, subFileSizes...)
+			filesRegions = append(filesRegions, regions...)
+			continue
+		}
 		rowIDMax := prevRowIDMax + dataFileSize/divisor
 		filesRegions = append(filesRegions, &TableRegion{
 			DB:    meta.DB,
@@ -171,6 +188,48 @@ func MakeTableRegions(
 		dataFileSizes = append(dataFileSizes, float64(dataFileSize))
 	}
 
-	AllocateEngineIDs(filesRegions, dataFileSizes, float64(batchSize), batchImportRatio, float64(tableConcurrency))
+	AllocateEngineIDs(filesRegions, dataFileSizes, float64(cfg.Mydumper.BatchSize), cfg.Mydumper.BatchImportRatio, float64(cfg.App.TableConcurrency))
 	return filesRegions, nil
 }
+
+func splitLargeFile(meta *MDTableMeta, cfg *config.Config, dataFilePath string, dataFileSize int64, divisor int64, prevRowIdxMax int64, ioWorker *worker.Pool) (prevRowIdMax int64, regions []*TableRegion, dataFileSizes []float64, err error){
+	reader, err := os.Open(dataFilePath)
+	if err != nil {
+		return 0, nil, nil,  err
+	}
+	dataFileSizes = make([]float64, 0, dataFileSize/config.MaxRegionSize)
+	parser := NewCSVParser(&cfg.Mydumper.CSV, reader, cfg.Mydumper.ReadBlockSize, ioWorker)
+	startOffset, endOffset := int64(0), config.MaxRegionSize
+	for ; endOffset < dataFileSize; {
+		curRegionCnt := (endOffset-startOffset)/divisor
+		rowIDMax := prevRowIdxMax + curRegionCnt
+		// rowIDMax is meaningless for this function here.
+		parser.SetPos(endOffset, rowIDMax)
+		// Get the exact pos of the last line.
+		pos, err := parser.TouchTokNewLine()
+		if err != nil {
+			return 0,nil, nil, err
+		}
+		endOffset = pos
+		regions = append(regions,
+			&TableRegion{
+				DB: meta.DB,
+				Table: meta.Name,
+				File : dataFilePath,
+				Chunk: Chunk{
+					Offset:       startOffset,
+					EndOffset:    endOffset,
+					PrevRowIDMax: prevRowIdxMax,
+					RowIDMax:     rowIDMax,
+				},
+		})
+		dataFileSizes = append(dataFileSizes, float64(endOffset - startOffset))
+		prevRowIdxMax = rowIDMax
+
+		startOffset = endOffset
+		if endOffset += config.MaxRegionSize; endOffset > dataFileSize {
+			endOffset = dataFileSize
+		}
+	}
+	return prevRowIdxMax, regions, dataFileSizes, nil
+}
\ No newline at end of file
diff --git a/lightning/restore/restore.go b/lightning/restore/restore.go
index 8dd46eec5..f0d44bfb4 100644
--- a/lightning/restore/restore.go
+++ b/lightning/restore/restore.go
@@ -704,7 +704,7 @@ func (t *TableRestore) restoreTable(
 			zap.Int("filesCnt", cp.CountChunks()),
 		)
 	} else if cp.Status < CheckpointStatusAllWritten {
-		if err := t.populateChunks(rc.cfg, cp); err != nil {
+		if err := t.populateChunks(rc, cp); err != nil {
 			return errors.Trace(err)
 		}
 		if err := rc.checkpointsDB.InsertEngineCheckpoints(ctx, t.tableName, cp.Engines); err != nil {
@@ -1316,9 +1316,9 @@ func (tr *TableRestore) Close() {
 	tr.logger.Info("restore done")
 }
 
-func (t *TableRestore) populateChunks(cfg *config.Config, cp *TableCheckpoint) error {
+func (t *TableRestore) populateChunks(rc *RestoreController, cp *TableCheckpoint) error {
 	task := t.logger.Begin(zap.InfoLevel, "load engines and files")
-	chunks, err := mydump.MakeTableRegions(t.tableMeta, t.tableInfo.Columns, cfg.Mydumper.BatchSize, cfg.Mydumper.BatchImportRatio, cfg.App.TableConcurrency)
+	chunks, err := mydump.MakeTableRegions(t.tableMeta, t.tableInfo.Columns, rc.cfg, rc.ioWorkers)
 	if err == nil {
 		timestamp := time.Now().Unix()
 		failpoint.Inject("PopulateChunkTimestamp", func(v failpoint.Value) {

From a81f21ab970d7c2ee2e1732634542d8073aec674 Mon Sep 17 00:00:00 2001
From: xuhuaiyu <391585975@qq.com>
Date: Wed, 26 Feb 2020 15:23:25 +0800
Subject: [PATCH 02/30] gofmt

---
 lightning/mydump/region.go | 27 +++++++++++++--------------
 1 file changed, 13 insertions(+), 14 deletions(-)

diff --git a/lightning/mydump/region.go b/lightning/mydump/region.go
index 3ac486561..4ea6ea7ad 100644
--- a/lightning/mydump/region.go
+++ b/lightning/mydump/region.go
@@ -20,7 +20,7 @@ import (
 
 	"github.com/pingcap/errors"
 	"github.com/pingcap/tidb-lightning/lightning/config"
-		"github.com/pingcap/tidb-lightning/lightning/worker"
+	"github.com/pingcap/tidb-lightning/lightning/worker"
 )
 
 type TableRegion struct {
@@ -138,13 +138,12 @@ func MakeTableRegions(
 	meta *MDTableMeta,
 	columns int,
 	cfg *config.Config,
-	ioWorkers       *worker.Pool,
+	ioWorkers *worker.Pool,
 ) ([]*TableRegion, error) {
 	// Split files into regions
 	filesRegions := make(regionSlice, 0, len(meta.DataFiles))
 	dataFileSizes := make([]float64, 0, len(meta.DataFiles))
 
-
 	prevRowIDMax := int64(0)
 	for _, dataFile := range meta.DataFiles {
 		dataFileInfo, err := os.Stat(dataFile)
@@ -161,7 +160,7 @@ func MakeTableRegions(
 		// If a csv file is overlarge, we need to split it into mutiple regions.
 		if isCsvFile && dataFileSize > config.MaxRegionSize { // && config.IsStrict
 			var (
-				regions []*TableRegion
+				regions      []*TableRegion
 				subFileSizes []float64
 			)
 			prevRowIDMax, regions, subFileSizes, err = splitLargeFile(meta, cfg, dataFile, dataFileSize, divisor, prevRowIDMax, ioWorkers)
@@ -192,38 +191,38 @@ func MakeTableRegions(
 	return filesRegions, nil
 }
 
-func splitLargeFile(meta *MDTableMeta, cfg *config.Config, dataFilePath string, dataFileSize int64, divisor int64, prevRowIdxMax int64, ioWorker *worker.Pool) (prevRowIdMax int64, regions []*TableRegion, dataFileSizes []float64, err error){
+func splitLargeFile(meta *MDTableMeta, cfg *config.Config, dataFilePath string, dataFileSize int64, divisor int64, prevRowIdxMax int64, ioWorker *worker.Pool) (prevRowIdMax int64, regions []*TableRegion, dataFileSizes []float64, err error) {
 	reader, err := os.Open(dataFilePath)
 	if err != nil {
-		return 0, nil, nil,  err
+		return 0, nil, nil, err
 	}
 	dataFileSizes = make([]float64, 0, dataFileSize/config.MaxRegionSize)
 	parser := NewCSVParser(&cfg.Mydumper.CSV, reader, cfg.Mydumper.ReadBlockSize, ioWorker)
 	startOffset, endOffset := int64(0), config.MaxRegionSize
-	for ; endOffset < dataFileSize; {
-		curRegionCnt := (endOffset-startOffset)/divisor
+	for endOffset < dataFileSize {
+		curRegionCnt := (endOffset - startOffset) / divisor
 		rowIDMax := prevRowIdxMax + curRegionCnt
 		// rowIDMax is meaningless for this function here.
 		parser.SetPos(endOffset, rowIDMax)
 		// Get the exact pos of the last line.
 		pos, err := parser.TouchTokNewLine()
 		if err != nil {
-			return 0,nil, nil, err
+			return 0, nil, nil, err
 		}
 		endOffset = pos
 		regions = append(regions,
 			&TableRegion{
-				DB: meta.DB,
+				DB:    meta.DB,
 				Table: meta.Name,
-				File : dataFilePath,
+				File:  dataFilePath,
 				Chunk: Chunk{
 					Offset:       startOffset,
 					EndOffset:    endOffset,
 					PrevRowIDMax: prevRowIdxMax,
 					RowIDMax:     rowIDMax,
 				},
-		})
-		dataFileSizes = append(dataFileSizes, float64(endOffset - startOffset))
+			})
+		dataFileSizes = append(dataFileSizes, float64(endOffset-startOffset))
 		prevRowIdxMax = rowIDMax
 
 		startOffset = endOffset
@@ -232,4 +231,4 @@ func splitLargeFile(meta *MDTableMeta, cfg *config.Config, dataFilePath string,
 		}
 	}
 	return prevRowIdxMax, regions, dataFileSizes, nil
-}
\ No newline at end of file
+}

From 0e16c1480181c9d1ac8aaf416981e64f45878df0 Mon Sep 17 00:00:00 2001
From: xuhuaiyu <391585975@qq.com>
Date: Wed, 26 Feb 2020 15:28:24 +0800
Subject: [PATCH 03/30] gofmt

---
 lightning/mydump/region.go | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/lightning/mydump/region.go b/lightning/mydump/region.go
index 4ea6ea7ad..618b3fe8b 100644
--- a/lightning/mydump/region.go
+++ b/lightning/mydump/region.go
@@ -191,7 +191,15 @@ func MakeTableRegions(
 	return filesRegions, nil
 }
 
-func splitLargeFile(meta *MDTableMeta, cfg *config.Config, dataFilePath string, dataFileSize int64, divisor int64, prevRowIdxMax int64, ioWorker *worker.Pool) (prevRowIdMax int64, regions []*TableRegion, dataFileSizes []float64, err error) {
+func splitLargeFile(
+	meta *MDTableMeta,
+	cfg *config.Config,
+	dataFilePath string,
+	dataFileSize int64,
+	divisor int64,
+	prevRowIdxMax int64,
+	ioWorker *worker.Pool,
+) (prevRowIdMax int64, regions []*TableRegion, dataFileSizes []float64, err error) {
 	reader, err := os.Open(dataFilePath)
 	if err != nil {
 		return 0, nil, nil, err

From 3255a8a6aeadd24c6ad56c248e7670ffacab249f Mon Sep 17 00:00:00 2001
From: xuhuaiyu <391585975@qq.com>
Date: Thu, 27 Feb 2020 10:23:00 +0800
Subject: [PATCH 04/30] unit test

---
 lightning/mydump/region_test.go | 37 +++++++++++++++++++++++++++++++++
 1 file changed, 37 insertions(+)

diff --git a/lightning/mydump/region_test.go b/lightning/mydump/region_test.go
index 82412a99a..a32ec5a1c 100644
--- a/lightning/mydump/region_test.go
+++ b/lightning/mydump/region_test.go
@@ -21,6 +21,9 @@ import (
 	. "github.com/pingcap/check"
 	"github.com/pingcap/tidb-lightning/lightning/config"
 	. "github.com/pingcap/tidb-lightning/lightning/mydump"
+	"log"
+	"github.com/pingcap/tidb-lightning/lightning/worker"
+	"context"
 )
 
 var _ = Suite(&testMydumpRegionSuite{})
@@ -193,3 +196,37 @@ func (s *testMydumpRegionSuite) TestAllocateEngineIDs(c *C) {
 		6: 100,
 	})
 }
+
+func (s *testMydumpRegionSuite) TestSplitLargeFile(c *C) {
+	meta := &MDTableMeta{
+		DB: "csv",
+		Name: "large_csv_file",
+	}
+	cfg := &config.Config{
+		Mydumper:config.MydumperRuntime{
+			ReadBlockSize: config.ReadBlockSize,
+			CSV: config.CSVConfig{
+				Separator: ",",
+				Delimiter: "",
+				Header: false,
+				TrimLastSep: false,
+				NotNull: false,
+				Null: "NULL",
+				BackslashEscape: true,
+				StrictFormat: true,
+				MaxRegionSize: 8,
+			},
+		},
+	}
+	filePath := "./examples/csv.empty_strings.csv"
+	dataFileInfo, err := os.Stat(filePath)
+	if err != nil{
+		log.Fatal(err)
+	}
+	fileSize := dataFileInfo.Size()
+	colCnt := int64(3)
+	prevRowIdxMax := int64(0)
+	ioWorker := worker.NewPool(context.Background(), 4, "io")
+	SplitLargeFile(meta, cfg, filePath, fileSize, colCnt, prevRowIdxMax, ioWorker)
+
+}
\ No newline at end of file

From 093145ca7653c683c3fad031e036fc935c3ecfa7 Mon Sep 17 00:00:00 2001
From: xuhuaiyu <391585975@qq.com>
Date: Thu, 27 Feb 2020 10:34:47 +0800
Subject: [PATCH 05/30] add unit test

---
 lightning/config/config.go                    |  4 ++
 lightning/mydump/csv_parser.go                |  2 +-
 .../mydump/examples/csv.empty_strings.csv     |  4 ++
 lightning/mydump/region.go                    | 33 ++++++++++------
 lightning/mydump/region_test.go               | 39 +++++++++++--------
 lightning/restore/restore_test.go             |  4 +-
 6 files changed, 55 insertions(+), 31 deletions(-)
 create mode 100644 lightning/mydump/examples/csv.empty_strings.csv

diff --git a/lightning/config/config.go b/lightning/config/config.go
index 6792b5250..3297d43a5 100644
--- a/lightning/config/config.go
+++ b/lightning/config/config.go
@@ -133,6 +133,8 @@ type CSVConfig struct {
 	NotNull         bool   `toml:"not-null" json:"not-null"`
 	Null            string `toml:"null" json:"null"`
 	BackslashEscape bool   `toml:"backslash-escape" json:"backslash-escape"`
+	StrictFormat    bool   `toml:"strict-format" json:"strict-format"`
+	MaxRegionSize   int64  `toml:"max-region-size" json:"max-region-size"`
 }
 
 type MydumperRuntime struct {
@@ -243,6 +245,8 @@ func NewConfig() *Config {
 				Null:            `\N`,
 				BackslashEscape: true,
 				TrimLastSep:     false,
+				StrictFormat:    false,
+				MaxRegionSize:   MaxRegionSize,
 			},
 		},
 		TikvImporter: TikvImporter{
diff --git a/lightning/mydump/csv_parser.go b/lightning/mydump/csv_parser.go
index 51015186c..cf1332b66 100644
--- a/lightning/mydump/csv_parser.go
+++ b/lightning/mydump/csv_parser.go
@@ -151,7 +151,7 @@ func (parser *CSVParser) ReadRow() error {
 	}
 }
 
-func (parser *CSVParser) TouchTokNewLine() (pos int64, err error) {
+func (parser *CSVParser) ReadUntilTokNewLine() (pos int64, err error) {
 	hasField := false
 	for {
 		tok, _, err := parser.lex()
diff --git a/lightning/mydump/examples/csv.empty_strings.csv b/lightning/mydump/examples/csv.empty_strings.csv
new file mode 100644
index 000000000..2b642f6e4
--- /dev/null
+++ b/lightning/mydump/examples/csv.empty_strings.csv
@@ -0,0 +1,4 @@
+1,1,2
+2,2,1
+3,2,2
+4,2,2
\ No newline at end of file
diff --git a/lightning/mydump/region.go b/lightning/mydump/region.go
index 618b3fe8b..fd911991a 100644
--- a/lightning/mydump/region.go
+++ b/lightning/mydump/region.go
@@ -143,7 +143,7 @@ func MakeTableRegions(
 	// Split files into regions
 	filesRegions := make(regionSlice, 0, len(meta.DataFiles))
 	dataFileSizes := make([]float64, 0, len(meta.DataFiles))
-
+	csvCfg := cfg.Mydumper.CSV
 	prevRowIDMax := int64(0)
 	for _, dataFile := range meta.DataFiles {
 		dataFileInfo, err := os.Stat(dataFile)
@@ -158,12 +158,13 @@ func MakeTableRegions(
 			divisor += 2
 		}
 		// If a csv file is overlarge, we need to split it into mutiple regions.
-		if isCsvFile && dataFileSize > config.MaxRegionSize { // && config.IsStrict
+		// Note: We can only split a csv file whose format is strict and header is empty.
+		if isCsvFile && dataFileSize > csvCfg.MaxRegionSize && csvCfg.StrictFormat && !csvCfg.Header {
 			var (
 				regions      []*TableRegion
 				subFileSizes []float64
 			)
-			prevRowIDMax, regions, subFileSizes, err = splitLargeFile(meta, cfg, dataFile, dataFileSize, divisor, prevRowIDMax, ioWorkers)
+			prevRowIDMax, regions, subFileSizes, err = SplitLargeFile(meta, cfg, dataFile, dataFileSize, divisor, prevRowIDMax, ioWorkers)
 			if err != nil {
 				return nil, err
 			}
@@ -191,7 +192,14 @@ func MakeTableRegions(
 	return filesRegions, nil
 }
 
-func splitLargeFile(
+// SplitLargeFile splits a large csv file into multiple regions, the size of
+// each regions is specified by `config.MaxRegionSize`.
+// Note: We split the file coarsely, thus the format of csv file is needed to be
+// strict.
+// e.g.
+// - CSV file with header is invalid
+// - a complete tuple split into multiple lines is invalid
+func SplitLargeFile(
 	meta *MDTableMeta,
 	cfg *config.Config,
 	dataFilePath string,
@@ -204,16 +212,17 @@ func splitLargeFile(
 	if err != nil {
 		return 0, nil, nil, err
 	}
-	dataFileSizes = make([]float64, 0, dataFileSize/config.MaxRegionSize)
+	maxRegionSize := cfg.Mydumper.CSV.MaxRegionSize
+	dataFileSizes = make([]float64, 0, dataFileSize/maxRegionSize)
 	parser := NewCSVParser(&cfg.Mydumper.CSV, reader, cfg.Mydumper.ReadBlockSize, ioWorker)
-	startOffset, endOffset := int64(0), config.MaxRegionSize
+	startOffset, endOffset := int64(0), maxRegionSize
 	for endOffset < dataFileSize {
-		curRegionCnt := (endOffset - startOffset) / divisor
-		rowIDMax := prevRowIdxMax + curRegionCnt
-		// rowIDMax is meaningless for this function here.
+		curRowsCnt := (endOffset - startOffset) / divisor
+		rowIDMax := prevRowIdxMax + curRowsCnt
+		// rowIDMax is meaningless for this function here .
 		parser.SetPos(endOffset, rowIDMax)
-		// Get the exact pos of the last line.
-		pos, err := parser.TouchTokNewLine()
+		// Get the exact pos of the last line actually.
+		pos, err := parser.ReadUntilTokNewLine()
 		if err != nil {
 			return 0, nil, nil, err
 		}
@@ -234,7 +243,7 @@ func splitLargeFile(
 		prevRowIdxMax = rowIDMax
 
 		startOffset = endOffset
-		if endOffset += config.MaxRegionSize; endOffset > dataFileSize {
+		if endOffset += maxRegionSize; endOffset > dataFileSize {
 			endOffset = dataFileSize
 		}
 	}
diff --git a/lightning/mydump/region_test.go b/lightning/mydump/region_test.go
index a32ec5a1c..ca06e1215 100644
--- a/lightning/mydump/region_test.go
+++ b/lightning/mydump/region_test.go
@@ -18,12 +18,12 @@ import (
 	"os"
 	"path/filepath"
 
+	"context"
 	. "github.com/pingcap/check"
 	"github.com/pingcap/tidb-lightning/lightning/config"
 	. "github.com/pingcap/tidb-lightning/lightning/mydump"
-	"log"
 	"github.com/pingcap/tidb-lightning/lightning/worker"
-	"context"
+	"log"
 )
 
 var _ = Suite(&testMydumpRegionSuite{})
@@ -63,8 +63,9 @@ func (s *testMydumpRegionSuite) TestTableRegion(c *C) {
 	loader, _ := NewMyDumpLoader(cfg)
 	dbMeta := loader.GetDatabases()[0]
 
+	ioWorkers := worker.NewPool(context.Background(), 1, "io")
 	for _, meta := range dbMeta.Tables {
-		regions, err := MakeTableRegions(meta, 1, 1, 0, 1)
+		regions, err := MakeTableRegions(meta, 1, cfg, ioWorkers)
 		c.Assert(err, IsNil)
 
 		table := meta.Name
@@ -199,34 +200,38 @@ func (s *testMydumpRegionSuite) TestAllocateEngineIDs(c *C) {
 
 func (s *testMydumpRegionSuite) TestSplitLargeFile(c *C) {
 	meta := &MDTableMeta{
-		DB: "csv",
+		DB:   "csv",
 		Name: "large_csv_file",
 	}
 	cfg := &config.Config{
-		Mydumper:config.MydumperRuntime{
+		Mydumper: config.MydumperRuntime{
 			ReadBlockSize: config.ReadBlockSize,
 			CSV: config.CSVConfig{
-				Separator: ",",
-				Delimiter: "",
-				Header: false,
-				TrimLastSep: false,
-				NotNull: false,
-				Null: "NULL",
+				Separator:       ",",
+				Delimiter:       "",
+				Header:          false,
+				TrimLastSep:     false,
+				NotNull:         false,
+				Null:            "NULL",
 				BackslashEscape: true,
-				StrictFormat: true,
-				MaxRegionSize: 8,
+				StrictFormat:    true,
+				MaxRegionSize:   8,
 			},
 		},
 	}
 	filePath := "./examples/csv.empty_strings.csv"
 	dataFileInfo, err := os.Stat(filePath)
-	if err != nil{
+	if err != nil {
 		log.Fatal(err)
 	}
 	fileSize := dataFileInfo.Size()
 	colCnt := int64(3)
 	prevRowIdxMax := int64(0)
 	ioWorker := worker.NewPool(context.Background(), 4, "io")
-	SplitLargeFile(meta, cfg, filePath, fileSize, colCnt, prevRowIdxMax, ioWorker)
-
-}
\ No newline at end of file
+	_, regions, _, _ := SplitLargeFile(meta, cfg, filePath, fileSize, colCnt, prevRowIdxMax, ioWorker)
+	c.Assert(len(regions), Equals, 2)
+	c.Assert(regions[0].Chunk.Offset, Equals, int64(0))
+	c.Assert(regions[0].Chunk.EndOffset, Equals, int64(12))
+	c.Assert(regions[1].Chunk.Offset, Equals, int64(12))
+	c.Assert(regions[1].Chunk.EndOffset, Equals, int64(23))
+}
diff --git a/lightning/restore/restore_test.go b/lightning/restore/restore_test.go
index 2b56d6152..04313ae97 100644
--- a/lightning/restore/restore_test.go
+++ b/lightning/restore/restore_test.go
@@ -341,7 +341,9 @@ func (s *tableRestoreSuite) TestPopulateChunks(c *C) {
 	cp := &TableCheckpoint{
 		Engines: make(map[int32]*EngineCheckpoint),
 	}
-	err := s.tr.populateChunks(s.cfg, cp)
+
+	rc := &RestoreController{cfg: s.cfg, ioWorkers: worker.NewPool(context.Background(), 1, "io")}
+	err := s.tr.populateChunks(rc, cp)
 	c.Assert(err, IsNil)
 
 	c.Assert(cp.Engines, DeepEquals, map[int32]*EngineCheckpoint{

From 69926d417012521f15b0093aa6cfffb5bdde49a5 Mon Sep 17 00:00:00 2001
From: xuhuaiyu <391585975@qq.com>
Date: Thu, 27 Feb 2020 10:37:35 +0800
Subject: [PATCH 06/30] tiny change

---
 lightning/mydump/examples/csv.empty_strings.csv | 2 +-
 lightning/mydump/region_test.go                 | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/lightning/mydump/examples/csv.empty_strings.csv b/lightning/mydump/examples/csv.empty_strings.csv
index 2b642f6e4..5b7f8adbd 100644
--- a/lightning/mydump/examples/csv.empty_strings.csv
+++ b/lightning/mydump/examples/csv.empty_strings.csv
@@ -1,4 +1,4 @@
 1,1,2
 2,2,1
 3,2,2
-4,2,2
\ No newline at end of file
+4,2,2
diff --git a/lightning/mydump/region_test.go b/lightning/mydump/region_test.go
index ca06e1215..64c70a76d 100644
--- a/lightning/mydump/region_test.go
+++ b/lightning/mydump/region_test.go
@@ -233,5 +233,5 @@ func (s *testMydumpRegionSuite) TestSplitLargeFile(c *C) {
 	c.Assert(regions[0].Chunk.Offset, Equals, int64(0))
 	c.Assert(regions[0].Chunk.EndOffset, Equals, int64(12))
 	c.Assert(regions[1].Chunk.Offset, Equals, int64(12))
-	c.Assert(regions[1].Chunk.EndOffset, Equals, int64(23))
+	c.Assert(regions[1].Chunk.EndOffset, Equals, int64(24))
 }

From 39513908937bf3acf18168100a8102b6f40c4649 Mon Sep 17 00:00:00 2001
From: xuhuaiyu <391585975@qq.com>
Date: Thu, 27 Feb 2020 12:11:27 +0800
Subject: [PATCH 07/30] tiny refine

---
 lightning/mydump/csv_parser.go                |  1 +
 ...y_strings.csv => csv.split_large_file.csv} |  0
 lightning/mydump/region.go                    | 10 ++++--
 lightning/mydump/region_test.go               | 35 +++++++++++++------
 4 files changed, 33 insertions(+), 13 deletions(-)
 rename lightning/mydump/examples/{csv.empty_strings.csv => csv.split_large_file.csv} (100%)

diff --git a/lightning/mydump/csv_parser.go b/lightning/mydump/csv_parser.go
index cf1332b66..2bbcff9f1 100644
--- a/lightning/mydump/csv_parser.go
+++ b/lightning/mydump/csv_parser.go
@@ -170,6 +170,7 @@ func (parser *CSVParser) ReadUntilTokNewLine() (pos int64, err error) {
 		switch tok {
 		case csvTokNewLine:
 			return parser.pos, nil
+		default:
 		}
 	}
 }
diff --git a/lightning/mydump/examples/csv.empty_strings.csv b/lightning/mydump/examples/csv.split_large_file.csv
similarity index 100%
rename from lightning/mydump/examples/csv.empty_strings.csv
rename to lightning/mydump/examples/csv.split_large_file.csv
diff --git a/lightning/mydump/region.go b/lightning/mydump/region.go
index fd911991a..d2f9c7ffc 100644
--- a/lightning/mydump/region.go
+++ b/lightning/mydump/region.go
@@ -14,6 +14,7 @@
 package mydump
 
 import (
+	"io"
 	"math"
 	"os"
 	"strings"
@@ -215,13 +216,16 @@ func SplitLargeFile(
 	maxRegionSize := cfg.Mydumper.CSV.MaxRegionSize
 	dataFileSizes = make([]float64, 0, dataFileSize/maxRegionSize)
 	parser := NewCSVParser(&cfg.Mydumper.CSV, reader, cfg.Mydumper.ReadBlockSize, ioWorker)
+	defer parser.Close()
 	startOffset, endOffset := int64(0), maxRegionSize
 	for endOffset < dataFileSize {
 		curRowsCnt := (endOffset - startOffset) / divisor
 		rowIDMax := prevRowIdxMax + curRowsCnt
-		// rowIDMax is meaningless for this function here .
-		parser.SetPos(endOffset, rowIDMax)
-		// Get the exact pos of the last line actually.
+		parser.SetPos(endOffset, prevRowIdMax)
+		_, err := reader.Seek(endOffset, io.SeekStart)
+		if err != nil {
+			return 0, nil, nil, err
+		}
 		pos, err := parser.ReadUntilTokNewLine()
 		if err != nil {
 			return 0, nil, nil, err
diff --git a/lightning/mydump/region_test.go b/lightning/mydump/region_test.go
index 64c70a76d..7cee24ec6 100644
--- a/lightning/mydump/region_test.go
+++ b/lightning/mydump/region_test.go
@@ -215,23 +215,38 @@ func (s *testMydumpRegionSuite) TestSplitLargeFile(c *C) {
 				Null:            "NULL",
 				BackslashEscape: true,
 				StrictFormat:    true,
-				MaxRegionSize:   8,
 			},
 		},
 	}
-	filePath := "./examples/csv.empty_strings.csv"
+	filePath := "./examples/csv.split_large_file.csv"
 	dataFileInfo, err := os.Stat(filePath)
 	if err != nil {
 		log.Fatal(err)
 	}
 	fileSize := dataFileInfo.Size()
 	colCnt := int64(3)
-	prevRowIdxMax := int64(0)
-	ioWorker := worker.NewPool(context.Background(), 4, "io")
-	_, regions, _, _ := SplitLargeFile(meta, cfg, filePath, fileSize, colCnt, prevRowIdxMax, ioWorker)
-	c.Assert(len(regions), Equals, 2)
-	c.Assert(regions[0].Chunk.Offset, Equals, int64(0))
-	c.Assert(regions[0].Chunk.EndOffset, Equals, int64(12))
-	c.Assert(regions[1].Chunk.Offset, Equals, int64(12))
-	c.Assert(regions[1].Chunk.EndOffset, Equals, int64(24))
+	for _, tc := range []struct {
+		maxRegionSize int64
+		chkCnt        int
+		offsets       [][]int64
+	}{
+		{1, 4, [][]int64{{0, 6}, {6, 12}, {12, 18}, {18, 24}}},
+		{6, 4, [][]int64{{0, 6}, {6, 12}, {12, 18}, {18, 24}}},
+		{8, 2, [][]int64{{0, 12}, {12, 24}}},
+		{12, 2, [][]int64{{0, 12}, {12, 24}}},
+		{13, 2, [][]int64{{0, 18}, {18, 24}}},
+		{18, 2, [][]int64{{0, 18}, {18, 24}}},
+		{19, 1, [][]int64{{0, 24}}},
+	} {
+		cfg.Mydumper.CSV.MaxRegionSize = tc.maxRegionSize
+		prevRowIdxMax := int64(0)
+		ioWorker := worker.NewPool(context.Background(), 4, "io")
+		_, regions, _, err := SplitLargeFile(meta, cfg, filePath, fileSize, colCnt, prevRowIdxMax, ioWorker)
+		c.Assert(err, IsNil)
+		c.Assert(len(regions), Equals, tc.chkCnt)
+		for i := range tc.offsets {
+			c.Assert(regions[i].Chunk.Offset, Equals, tc.offsets[i][0])
+			c.Assert(regions[i].Chunk.EndOffset, Equals, tc.offsets[i][1])
+		}
+	}
 }

From bc7f0f3778e3a4f7bd8d952aa53596bd8f29698a Mon Sep 17 00:00:00 2001
From: xuhuaiyu <391585975@qq.com>
Date: Thu, 27 Feb 2020 14:07:36 +0800
Subject: [PATCH 08/30] fix ci

---
 .../csv.split_large_file.csv                  |  0
 lightning/mydump/csv_parser.go                |  3 +-
 lightning/mydump/region.go                    | 38 ++++++++++---------
 lightning/mydump/region_test.go               | 12 +++---
 4 files changed, 29 insertions(+), 24 deletions(-)
 rename lightning/mydump/{examples => csv}/csv.split_large_file.csv (100%)

diff --git a/lightning/mydump/examples/csv.split_large_file.csv b/lightning/mydump/csv/csv.split_large_file.csv
similarity index 100%
rename from lightning/mydump/examples/csv.split_large_file.csv
rename to lightning/mydump/csv/csv.split_large_file.csv
diff --git a/lightning/mydump/csv_parser.go b/lightning/mydump/csv_parser.go
index 2bbcff9f1..62bc1b868 100644
--- a/lightning/mydump/csv_parser.go
+++ b/lightning/mydump/csv_parser.go
@@ -4,6 +4,7 @@ import (
 	"io"
 	"strings"
 
+	"fmt"
 	"github.com/pingcap/errors"
 	"github.com/pingcap/tidb-lightning/lightning/config"
 	"github.com/pingcap/tidb-lightning/lightning/worker"
@@ -169,8 +170,8 @@ func (parser *CSVParser) ReadUntilTokNewLine() (pos int64, err error) {
 		hasField = true
 		switch tok {
 		case csvTokNewLine:
+			fmt.Println("touch csvTokNewLine")
 			return parser.pos, nil
-		default:
 		}
 	}
 }
diff --git a/lightning/mydump/region.go b/lightning/mydump/region.go
index d2f9c7ffc..4c9dde196 100644
--- a/lightning/mydump/region.go
+++ b/lightning/mydump/region.go
@@ -209,28 +209,30 @@ func SplitLargeFile(
 	prevRowIdxMax int64,
 	ioWorker *worker.Pool,
 ) (prevRowIdMax int64, regions []*TableRegion, dataFileSizes []float64, err error) {
-	reader, err := os.Open(dataFilePath)
-	if err != nil {
-		return 0, nil, nil, err
-	}
 	maxRegionSize := cfg.Mydumper.CSV.MaxRegionSize
 	dataFileSizes = make([]float64, 0, dataFileSize/maxRegionSize)
-	parser := NewCSVParser(&cfg.Mydumper.CSV, reader, cfg.Mydumper.ReadBlockSize, ioWorker)
-	defer parser.Close()
 	startOffset, endOffset := int64(0), maxRegionSize
-	for endOffset < dataFileSize {
+	for {
 		curRowsCnt := (endOffset - startOffset) / divisor
 		rowIDMax := prevRowIdxMax + curRowsCnt
-		parser.SetPos(endOffset, prevRowIdMax)
-		_, err := reader.Seek(endOffset, io.SeekStart)
-		if err != nil {
-			return 0, nil, nil, err
-		}
-		pos, err := parser.ReadUntilTokNewLine()
-		if err != nil {
-			return 0, nil, nil, err
+		if endOffset != dataFileSize {
+			reader, err := os.Open(dataFilePath)
+			if err != nil {
+				return 0, nil, nil, err
+			}
+			parser := NewCSVParser(&cfg.Mydumper.CSV, reader, cfg.Mydumper.ReadBlockSize, ioWorker)
+			parser.SetPos(endOffset, prevRowIdMax)
+			_, err = reader.Seek(endOffset, io.SeekStart)
+			if err != nil {
+				return 0, nil, nil, err
+			}
+			pos, err := parser.ReadUntilTokNewLine()
+			if err != nil {
+				return 0, nil, nil, err
+			}
+			endOffset = pos
+			parser.Close()
 		}
-		endOffset = pos
 		regions = append(regions,
 			&TableRegion{
 				DB:    meta.DB,
@@ -245,7 +247,9 @@ func SplitLargeFile(
 			})
 		dataFileSizes = append(dataFileSizes, float64(endOffset-startOffset))
 		prevRowIdxMax = rowIDMax
-
+		if endOffset == dataFileSize {
+			break
+		}
 		startOffset = endOffset
 		if endOffset += maxRegionSize; endOffset > dataFileSize {
 			endOffset = dataFileSize
diff --git a/lightning/mydump/region_test.go b/lightning/mydump/region_test.go
index 7cee24ec6..df20ad1ba 100644
--- a/lightning/mydump/region_test.go
+++ b/lightning/mydump/region_test.go
@@ -14,16 +14,16 @@
 package mydump_test
 
 import (
+	"context"
 	"fmt"
+	"log"
 	"os"
 	"path/filepath"
 
-	"context"
 	. "github.com/pingcap/check"
 	"github.com/pingcap/tidb-lightning/lightning/config"
 	. "github.com/pingcap/tidb-lightning/lightning/mydump"
 	"github.com/pingcap/tidb-lightning/lightning/worker"
-	"log"
 )
 
 var _ = Suite(&testMydumpRegionSuite{})
@@ -218,7 +218,7 @@ func (s *testMydumpRegionSuite) TestSplitLargeFile(c *C) {
 			},
 		},
 	}
-	filePath := "./examples/csv.split_large_file.csv"
+	filePath := "./csv/csv.split_large_file.csv"
 	dataFileInfo, err := os.Stat(filePath)
 	if err != nil {
 		log.Fatal(err)
@@ -231,11 +231,11 @@ func (s *testMydumpRegionSuite) TestSplitLargeFile(c *C) {
 		offsets       [][]int64
 	}{
 		{1, 4, [][]int64{{0, 6}, {6, 12}, {12, 18}, {18, 24}}},
-		{6, 4, [][]int64{{0, 6}, {6, 12}, {12, 18}, {18, 24}}},
+		{6, 2, [][]int64{{0, 12}, {12, 24}}},
 		{8, 2, [][]int64{{0, 12}, {12, 24}}},
-		{12, 2, [][]int64{{0, 12}, {12, 24}}},
+		{12, 2, [][]int64{{0, 18}, {18, 24}}},
 		{13, 2, [][]int64{{0, 18}, {18, 24}}},
-		{18, 2, [][]int64{{0, 18}, {18, 24}}},
+		{18, 1, [][]int64{{0, 24}}},
 		{19, 1, [][]int64{{0, 24}}},
 	} {
 		cfg.Mydumper.CSV.MaxRegionSize = tc.maxRegionSize

From 921d8914a96d437d0e3ba95d0c579e2ed2cc9bb5 Mon Sep 17 00:00:00 2001
From: xuhuaiyu <391585975@qq.com>
Date: Thu, 27 Feb 2020 14:22:35 +0800
Subject: [PATCH 09/30] remove useless code

---
 lightning/mydump/csv_parser.go | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/lightning/mydump/csv_parser.go b/lightning/mydump/csv_parser.go
index 62bc1b868..f508e85b0 100644
--- a/lightning/mydump/csv_parser.go
+++ b/lightning/mydump/csv_parser.go
@@ -4,7 +4,6 @@ import (
 	"io"
 	"strings"
 
-	"fmt"
 	"github.com/pingcap/errors"
 	"github.com/pingcap/tidb-lightning/lightning/config"
 	"github.com/pingcap/tidb-lightning/lightning/worker"
@@ -170,8 +169,6 @@ func (parser *CSVParser) ReadUntilTokNewLine() (pos int64, err error) {
 		hasField = true
 		switch tok {
 		case csvTokNewLine:
-			fmt.Println("touch csvTokNewLine")
-			return parser.pos, nil
 		}
 	}
 }

From 43b01d31ecb30ce46044e4ff62cbd89fca60d0a8 Mon Sep 17 00:00:00 2001
From: xuhuaiyu <391585975@qq.com>
Date: Thu, 27 Feb 2020 14:34:41 +0800
Subject: [PATCH 10/30] fix ci

---
 .../csv/{csv.split_large_file.csv => split_large_file.csv}      | 0
 lightning/mydump/region_test.go                                 | 2 +-
 2 files changed, 1 insertion(+), 1 deletion(-)
 rename lightning/mydump/csv/{csv.split_large_file.csv => split_large_file.csv} (100%)

diff --git a/lightning/mydump/csv/csv.split_large_file.csv b/lightning/mydump/csv/split_large_file.csv
similarity index 100%
rename from lightning/mydump/csv/csv.split_large_file.csv
rename to lightning/mydump/csv/split_large_file.csv
diff --git a/lightning/mydump/region_test.go b/lightning/mydump/region_test.go
index df20ad1ba..6c0ab3e92 100644
--- a/lightning/mydump/region_test.go
+++ b/lightning/mydump/region_test.go
@@ -218,7 +218,7 @@ func (s *testMydumpRegionSuite) TestSplitLargeFile(c *C) {
 			},
 		},
 	}
-	filePath := "./csv/csv.split_large_file.csv"
+	filePath := "./csv/split_large_file.csv"
 	dataFileInfo, err := os.Stat(filePath)
 	if err != nil {
 		log.Fatal(err)

From bd1598b37e580fbf350c704b1d51722bd400b5e2 Mon Sep 17 00:00:00 2001
From: xuhuaiyu <391585975@qq.com>
Date: Thu, 27 Feb 2020 14:58:24 +0800
Subject: [PATCH 11/30] fix ci

---
 lightning/mydump/csv_parser.go | 1 +
 1 file changed, 1 insertion(+)

diff --git a/lightning/mydump/csv_parser.go b/lightning/mydump/csv_parser.go
index f508e85b0..cf1332b66 100644
--- a/lightning/mydump/csv_parser.go
+++ b/lightning/mydump/csv_parser.go
@@ -169,6 +169,7 @@ func (parser *CSVParser) ReadUntilTokNewLine() (pos int64, err error) {
 		hasField = true
 		switch tok {
 		case csvTokNewLine:
+			return parser.pos, nil
 		}
 	}
 }

From 045294a0ffb614362f98d64b2525db49c06ffb87 Mon Sep 17 00:00:00 2001
From: xuhuaiyu <391585975@qq.com>
Date: Fri, 28 Feb 2020 09:50:36 +0800
Subject: [PATCH 12/30] address comments

---
 lightning/config/config.go      | 7 ++++---
 lightning/mydump/csv_parser.go  | 3 +--
 lightning/mydump/region.go      | 5 ++---
 lightning/mydump/region_test.go | 4 ++--
 4 files changed, 9 insertions(+), 10 deletions(-)

diff --git a/lightning/config/config.go b/lightning/config/config.go
index 3297d43a5..ec82aa43f 100644
--- a/lightning/config/config.go
+++ b/lightning/config/config.go
@@ -133,7 +133,6 @@ type CSVConfig struct {
 	NotNull         bool   `toml:"not-null" json:"not-null"`
 	Null            string `toml:"null" json:"null"`
 	BackslashEscape bool   `toml:"backslash-escape" json:"backslash-escape"`
-	StrictFormat    bool   `toml:"strict-format" json:"strict-format"`
 	MaxRegionSize   int64  `toml:"max-region-size" json:"max-region-size"`
 }
 
@@ -146,6 +145,8 @@ type MydumperRuntime struct {
 	CharacterSet     string    `toml:"character-set" json:"character-set"`
 	CSV              CSVConfig `toml:"csv" json:"csv"`
 	CaseSensitive    bool      `toml:"case-sensitive" json:"case-sensitive"`
+	StrictFormat     bool      `toml:"strict-format" json:"strict-format"`
+	MaxRegionSize    int64     `toml:"max-region-size" json:"max-region-size"`
 }
 
 type TikvImporter struct {
@@ -245,9 +246,9 @@ func NewConfig() *Config {
 				Null:            `\N`,
 				BackslashEscape: true,
 				TrimLastSep:     false,
-				StrictFormat:    false,
-				MaxRegionSize:   MaxRegionSize,
 			},
+			StrictFormat:  false,
+			MaxRegionSize: MaxRegionSize,
 		},
 		TikvImporter: TikvImporter{
 			Backend:     BackendImporter,
diff --git a/lightning/mydump/csv_parser.go b/lightning/mydump/csv_parser.go
index cf1332b66..e74f9a478 100644
--- a/lightning/mydump/csv_parser.go
+++ b/lightning/mydump/csv_parser.go
@@ -167,8 +167,7 @@ func (parser *CSVParser) ReadUntilTokNewLine() (pos int64, err error) {
 			return parser.pos, errors.Trace(err)
 		}
 		hasField = true
-		switch tok {
-		case csvTokNewLine:
+		if tok == csvTokNewLine {
 			return parser.pos, nil
 		}
 	}
diff --git a/lightning/mydump/region.go b/lightning/mydump/region.go
index 4c9dde196..a2a176a20 100644
--- a/lightning/mydump/region.go
+++ b/lightning/mydump/region.go
@@ -144,7 +144,6 @@ func MakeTableRegions(
 	// Split files into regions
 	filesRegions := make(regionSlice, 0, len(meta.DataFiles))
 	dataFileSizes := make([]float64, 0, len(meta.DataFiles))
-	csvCfg := cfg.Mydumper.CSV
 	prevRowIDMax := int64(0)
 	for _, dataFile := range meta.DataFiles {
 		dataFileInfo, err := os.Stat(dataFile)
@@ -160,7 +159,7 @@ func MakeTableRegions(
 		}
 		// If a csv file is overlarge, we need to split it into mutiple regions.
 		// Note: We can only split a csv file whose format is strict and header is empty.
-		if isCsvFile && dataFileSize > csvCfg.MaxRegionSize && csvCfg.StrictFormat && !csvCfg.Header {
+		if isCsvFile && dataFileSize > cfg.Mydumper.MaxRegionSize && cfg.Mydumper.StrictFormat && !cfg.Mydumper.CSV.Header {
 			var (
 				regions      []*TableRegion
 				subFileSizes []float64
@@ -209,7 +208,7 @@ func SplitLargeFile(
 	prevRowIdxMax int64,
 	ioWorker *worker.Pool,
 ) (prevRowIdMax int64, regions []*TableRegion, dataFileSizes []float64, err error) {
-	maxRegionSize := cfg.Mydumper.CSV.MaxRegionSize
+	maxRegionSize := cfg.Mydumper.MaxRegionSize
 	dataFileSizes = make([]float64, 0, dataFileSize/maxRegionSize)
 	startOffset, endOffset := int64(0), maxRegionSize
 	for {
diff --git a/lightning/mydump/region_test.go b/lightning/mydump/region_test.go
index 6c0ab3e92..8556bd822 100644
--- a/lightning/mydump/region_test.go
+++ b/lightning/mydump/region_test.go
@@ -214,8 +214,8 @@ func (s *testMydumpRegionSuite) TestSplitLargeFile(c *C) {
 				NotNull:         false,
 				Null:            "NULL",
 				BackslashEscape: true,
-				StrictFormat:    true,
 			},
+			StrictFormat: true,
 		},
 	}
 	filePath := "./csv/split_large_file.csv"
@@ -238,7 +238,7 @@ func (s *testMydumpRegionSuite) TestSplitLargeFile(c *C) {
 		{18, 1, [][]int64{{0, 24}}},
 		{19, 1, [][]int64{{0, 24}}},
 	} {
-		cfg.Mydumper.CSV.MaxRegionSize = tc.maxRegionSize
+		cfg.Mydumper.MaxRegionSize = tc.maxRegionSize
 		prevRowIdxMax := int64(0)
 		ioWorker := worker.NewPool(context.Background(), 4, "io")
 		_, regions, _, err := SplitLargeFile(meta, cfg, filePath, fileSize, colCnt, prevRowIdxMax, ioWorker)

From 0a8fa8f0651a19cadf5f459889bb92ad81324975 Mon Sep 17 00:00:00 2001
From: xuhuaiyu <391585975@qq.com>
Date: Fri, 28 Feb 2020 10:17:09 +0800
Subject: [PATCH 13/30] go fmt for all

---
 lightning/mydump/csv_parser_generated.go | 4647 +++++++++++-----------
 lightning/mydump/parser_generated.go     | 4393 ++++++++++----------
 2 files changed, 4668 insertions(+), 4372 deletions(-)

diff --git a/lightning/mydump/csv_parser_generated.go b/lightning/mydump/csv_parser_generated.go
index 8176aa308..9c348ca1f 100644
--- a/lightning/mydump/csv_parser_generated.go
+++ b/lightning/mydump/csv_parser_generated.go
@@ -16,11 +16,8 @@ import (
 	"github.com/pingcap/errors"
 )
 
-
 //.... lightning/mydump/csv_parser.rl:57
 
-
-
 //.... tmp_parser.go:24
 const csv_parser_start int = 8
 const csv_parser_first_final int = 8
@@ -28,7 +25,6 @@ const csv_parser_error int = 0
 
 const csv_parser_en_main int = 8
 
-
 //.... lightning/mydump/csv_parser.rl:60
 
 func (parser *CSVParser) lex() (csvToken, []byte, error) {
@@ -39,16 +35,16 @@ func (parser *CSVParser) lex() (csvToken, []byte, error) {
 	sep := parser.cfg.Separator[0]
 
 	var cs, ts, te, act, p int
-	
-//.... tmp_parser.go:43
+
+	//.... tmp_parser.go:43
 	{
-	cs = csv_parser_start
-	ts = 0
-	te = 0
-	act = 0
+		cs = csv_parser_start
+		ts = 0
+		te = 0
+		act = 0
 	}
 
-//.... lightning/mydump/csv_parser.rl:70
+	//.... lightning/mydump/csv_parser.rl:70
 
 	for {
 		data := parser.buf
@@ -59,2476 +55,2512 @@ func (parser *CSVParser) lex() (csvToken, []byte, error) {
 			eof = pe
 		}
 
-		
-//.... tmp_parser.go:63
-	{
-	var _widec int16
-	if p == pe {
-		goto _test_eof
-	}
-	switch cs {
-	case 8:
-		goto st_case_8
-	case 0:
-		goto st_case_0
-	case 9:
-		goto st_case_9
-	case 10:
-		goto st_case_10
-	case 1:
-		goto st_case_1
-	case 2:
-		goto st_case_2
-	case 11:
-		goto st_case_11
-	case 12:
-		goto st_case_12
-	case 3:
-		goto st_case_3
-	case 13:
-		goto st_case_13
-	case 4:
-		goto st_case_4
-	case 14:
-		goto st_case_14
-	case 15:
-		goto st_case_15
-	case 5:
-		goto st_case_5
-	case 16:
-		goto st_case_16
-	case 6:
-		goto st_case_6
-	case 17:
-		goto st_case_17
-	case 7:
-		goto st_case_7
-	case 18:
-		goto st_case_18
-	case 19:
-		goto st_case_19
-	case 20:
-		goto st_case_20
-	case 21:
-		goto st_case_21
-	case 22:
-		goto st_case_22
-	case 23:
-		goto st_case_23
-	case 24:
-		goto st_case_24
-	}
-	goto st_out
-tr0:
-//.... NONE:1
-	switch act {
-	case 0:
-	{{goto st0 }}
-	case 1:
-	{p = (te) - 1
+		//.... tmp_parser.go:63
+		{
+			var _widec int16
+			if p == pe {
+				goto _test_eof
+			}
+			switch cs {
+			case 8:
+				goto st_case_8
+			case 0:
+				goto st_case_0
+			case 9:
+				goto st_case_9
+			case 10:
+				goto st_case_10
+			case 1:
+				goto st_case_1
+			case 2:
+				goto st_case_2
+			case 11:
+				goto st_case_11
+			case 12:
+				goto st_case_12
+			case 3:
+				goto st_case_3
+			case 13:
+				goto st_case_13
+			case 4:
+				goto st_case_4
+			case 14:
+				goto st_case_14
+			case 15:
+				goto st_case_15
+			case 5:
+				goto st_case_5
+			case 16:
+				goto st_case_16
+			case 6:
+				goto st_case_6
+			case 17:
+				goto st_case_17
+			case 7:
+				goto st_case_7
+			case 18:
+				goto st_case_18
+			case 19:
+				goto st_case_19
+			case 20:
+				goto st_case_20
+			case 21:
+				goto st_case_21
+			case 22:
+				goto st_case_22
+			case 23:
+				goto st_case_23
+			case 24:
+				goto st_case_24
+			}
+			goto st_out
+		tr0:
+			//.... NONE:1
+			switch act {
+			case 0:
+				{
+					{
+						goto st0
+					}
+				}
+			case 1:
+				{
+					p = (te) - 1
 
-		consumedToken = csvTokSep
-		{p++; cs = 8; goto _out }
-	}
-	case 2:
-	{p = (te) - 1
+					consumedToken = csvTokSep
+					{
+						p++
+						cs = 8
+						goto _out
+					}
+				}
+			case 2:
+				{
+					p = (te) - 1
 
-		consumedToken = csvTokField
-		{p++; cs = 8; goto _out }
-	}
-	}
-	
-	goto st8
-tr14:
-//.... lightning/mydump/csv_parser.rl:45
-p = (te) - 1
-{
-		consumedToken = csvTokField
-		{p++; cs = 8; goto _out }
-	}
-	goto st8
-tr17:
-//.... lightning/mydump/csv_parser.rl:40
-te = p+1
-{
-		consumedToken = csvTokSep
-		{p++; cs = 8; goto _out }
-	}
-	goto st8
-tr23:
-//.... lightning/mydump/csv_parser.rl:50
-te = p
-p--
-{
-		consumedToken = csvTokNewLine
-		{p++; cs = 8; goto _out }
-	}
-	goto st8
-tr24:
-//.... lightning/mydump/csv_parser.rl:45
-te = p
-p--
-{
-		consumedToken = csvTokField
-		{p++; cs = 8; goto _out }
-	}
-	goto st8
-tr25:
-//.... lightning/mydump/csv_parser.rl:40
-te = p
-p--
-{
-		consumedToken = csvTokSep
-		{p++; cs = 8; goto _out }
-	}
-	goto st8
-	st8:
-//.... NONE:1
-ts = 0
+					consumedToken = csvTokField
+					{
+						p++
+						cs = 8
+						goto _out
+					}
+				}
+			}
 
-//.... NONE:1
-act = 0
+			goto st8
+		tr14:
+			//.... lightning/mydump/csv_parser.rl:45
+			p = (te) - 1
+			{
+				consumedToken = csvTokField
+				{
+					p++
+					cs = 8
+					goto _out
+				}
+			}
+			goto st8
+		tr17:
+			//.... lightning/mydump/csv_parser.rl:40
+			te = p + 1
+			{
+				consumedToken = csvTokSep
+				{
+					p++
+					cs = 8
+					goto _out
+				}
+			}
+			goto st8
+		tr23:
+			//.... lightning/mydump/csv_parser.rl:50
+			te = p
+			p--
+			{
+				consumedToken = csvTokNewLine
+				{
+					p++
+					cs = 8
+					goto _out
+				}
+			}
+			goto st8
+		tr24:
+			//.... lightning/mydump/csv_parser.rl:45
+			te = p
+			p--
+			{
+				consumedToken = csvTokField
+				{
+					p++
+					cs = 8
+					goto _out
+				}
+			}
+			goto st8
+		tr25:
+			//.... lightning/mydump/csv_parser.rl:40
+			te = p
+			p--
+			{
+				consumedToken = csvTokSep
+				{
+					p++
+					cs = 8
+					goto _out
+				}
+			}
+			goto st8
+		st8:
+			//.... NONE:1
+			ts = 0
 
-		if p++; p == pe {
-			goto _test_eof8
-		}
-	st_case_8:
-//.... NONE:1
-ts = p
+			//.... NONE:1
+			act = 0
+
+			if p++; p == pe {
+				goto _test_eof8
+			}
+		st_case_8:
+			//.... NONE:1
+			ts = p
 
-//.... tmp_parser.go:199
-		_widec = int16(data[p])
-		switch {
-		case data[p] < 14:
+			//.... tmp_parser.go:199
+			_widec = int16(data[p])
 			switch {
-			case data[p] > 9:
-				if 11 <= data[p] && data[p] <= 12 {
+			case data[p] < 14:
+				switch {
+				case data[p] > 9:
+					if 11 <= data[p] && data[p] <= 12 {
+						_widec = 2816 + (int16(data[p]) - 0)
+						if data[p] == delim {
+							_widec += 256
+						}
+						if data[p] == sep {
+							_widec += 512
+						}
+					}
+				default:
 					_widec = 2816 + (int16(data[p]) - 0)
-					if  data[p] == delim  {
+					if data[p] == delim {
 						_widec += 256
 					}
-					if  data[p] == sep  {
+					if data[p] == sep {
 						_widec += 512
 					}
 				}
-			default:
-				_widec = 2816 + (int16(data[p]) - 0)
-				if  data[p] == delim  {
-					_widec += 256
-				}
-				if  data[p] == sep  {
-					_widec += 512
-				}
-			}
-		case data[p] > 91:
-			switch {
-			case data[p] > 92:
-				if 93 <= data[p] {
-					_widec = 2816 + (int16(data[p]) - 0)
-					if  data[p] == delim  {
+			case data[p] > 91:
+				switch {
+				case data[p] > 92:
+					if 93 <= data[p] {
+						_widec = 2816 + (int16(data[p]) - 0)
+						if data[p] == delim {
+							_widec += 256
+						}
+						if data[p] == sep {
+							_widec += 512
+						}
+					}
+				case data[p] >= 92:
+					_widec = 3840 + (int16(data[p]) - 0)
+					if data[p] == delim {
 						_widec += 256
 					}
-					if  data[p] == sep  {
+					if parser.escFlavor != backslashEscapeFlavorNone {
 						_widec += 512
 					}
+					if data[p] == sep {
+						_widec += 1024
+					}
 				}
-			case data[p] >= 92:
-				_widec = 3840 + (int16(data[p]) - 0)
-				if  data[p] == delim  {
+			default:
+				_widec = 2816 + (int16(data[p]) - 0)
+				if data[p] == delim {
 					_widec += 256
 				}
-				if  parser.escFlavor != backslashEscapeFlavorNone  {
+				if data[p] == sep {
 					_widec += 512
 				}
-				if  data[p] == sep  {
-					_widec += 1024
-				}
-			}
-		default:
-			_widec = 2816 + (int16(data[p]) - 0)
-			if  data[p] == delim  {
-				_widec += 256
 			}
-			if  data[p] == sep  {
-				_widec += 512
+			switch _widec {
+			case 10:
+				goto st9
+			case 13:
+				goto st9
+			case 3932:
+				goto tr1
+			case 4188:
+				goto st2
+			case 4444:
+				goto st1
+			case 4700:
+				goto st5
+			case 4956:
+				goto tr17
+			case 5212:
+				goto tr18
+			case 5468:
+				goto st23
+			case 5724:
+				goto st24
 			}
-		}
-		switch _widec {
-		case 10:
-			goto st9
-		case 13:
-			goto st9
-		case 3932:
-			goto tr1
-		case 4188:
-			goto st2
-		case 4444:
-			goto st1
-		case 4700:
-			goto st5
-		case 4956:
-			goto tr17
-		case 5212:
-			goto tr18
-		case 5468:
-			goto st23
-		case 5724:
-			goto st24
-		}
-		switch {
-		case _widec < 3165:
 			switch {
-			case _widec < 2909:
+			case _widec < 3165:
 				switch {
-				case _widec < 2827:
-					if 2816 <= _widec && _widec <= 2825 {
-						goto tr1
-					}
-				case _widec > 2828:
-					if 2830 <= _widec && _widec <= 2907 {
+				case _widec < 2909:
+					switch {
+					case _widec < 2827:
+						if 2816 <= _widec && _widec <= 2825 {
+							goto tr1
+						}
+					case _widec > 2828:
+						if 2830 <= _widec && _widec <= 2907 {
+							goto tr1
+						}
+					default:
 						goto tr1
 					}
-				default:
-					goto tr1
-				}
-			case _widec > 3071:
-				switch {
-				case _widec < 3083:
-					if 3072 <= _widec && _widec <= 3081 {
-						goto st2
-					}
-				case _widec > 3084:
-					if 3086 <= _widec && _widec <= 3163 {
+				case _widec > 3071:
+					switch {
+					case _widec < 3083:
+						if 3072 <= _widec && _widec <= 3081 {
+							goto st2
+						}
+					case _widec > 3084:
+						if 3086 <= _widec && _widec <= 3163 {
+							goto st2
+						}
+					default:
 						goto st2
 					}
 				default:
-					goto st2
+					goto tr1
 				}
-			default:
-				goto tr1
-			}
-		case _widec > 3327:
-			switch {
-			case _widec < 3421:
+			case _widec > 3327:
 				switch {
-				case _widec < 3339:
-					if 3328 <= _widec && _widec <= 3337 {
-						goto tr17
-					}
-				case _widec > 3340:
-					if 3342 <= _widec && _widec <= 3419 {
+				case _widec < 3421:
+					switch {
+					case _widec < 3339:
+						if 3328 <= _widec && _widec <= 3337 {
+							goto tr17
+						}
+					case _widec > 3340:
+						if 3342 <= _widec && _widec <= 3419 {
+							goto tr17
+						}
+					default:
 						goto tr17
 					}
-				default:
-					goto tr17
-				}
-			case _widec > 3583:
-				switch {
-				case _widec < 3595:
-					if 3584 <= _widec && _widec <= 3593 {
-						goto tr18
-					}
-				case _widec > 3596:
+				case _widec > 3583:
 					switch {
-					case _widec > 3675:
-						if 3677 <= _widec && _widec <= 3839 {
+					case _widec < 3595:
+						if 3584 <= _widec && _widec <= 3593 {
+							goto tr18
+						}
+					case _widec > 3596:
+						switch {
+						case _widec > 3675:
+							if 3677 <= _widec && _widec <= 3839 {
+								goto tr18
+							}
+						case _widec >= 3598:
 							goto tr18
 						}
-					case _widec >= 3598:
+					default:
 						goto tr18
 					}
 				default:
-					goto tr18
+					goto tr17
 				}
 			default:
-				goto tr17
+				goto st2
 			}
-		default:
-			goto st2
-		}
-		goto st0
-st_case_0:
-	st0:
-		cs = 0
-		goto _out
-	st9:
-		if p++; p == pe {
-			goto _test_eof9
-		}
-	st_case_9:
-		switch data[p] {
-		case 10:
-			goto st9
-		case 13:
-			goto st9
-		}
-		goto tr23
-tr1:
-//.... NONE:1
-te = p+1
+			goto st0
+		st_case_0:
+		st0:
+			cs = 0
+			goto _out
+		st9:
+			if p++; p == pe {
+				goto _test_eof9
+			}
+		st_case_9:
+			switch data[p] {
+			case 10:
+				goto st9
+			case 13:
+				goto st9
+			}
+			goto tr23
+		tr1:
+			//.... NONE:1
+			te = p + 1
 
-//.... lightning/mydump/csv_parser.rl:45
-act = 2;
-	goto st10
-	st10:
-		if p++; p == pe {
-			goto _test_eof10
-		}
-	st_case_10:
-//.... tmp_parser.go:378
-		_widec = int16(data[p])
-		switch {
-		case data[p] < 14:
-			switch {
-			case data[p] > 9:
-				if 11 <= data[p] && data[p] <= 12 {
+			//.... lightning/mydump/csv_parser.rl:45
+			act = 2
+			goto st10
+		st10:
+			if p++; p == pe {
+				goto _test_eof10
+			}
+		st_case_10:
+			//.... tmp_parser.go:378
+			_widec = int16(data[p])
+			switch {
+			case data[p] < 14:
+				switch {
+				case data[p] > 9:
+					if 11 <= data[p] && data[p] <= 12 {
+						_widec = 2816 + (int16(data[p]) - 0)
+						if data[p] == delim {
+							_widec += 256
+						}
+						if data[p] == sep {
+							_widec += 512
+						}
+					}
+				default:
 					_widec = 2816 + (int16(data[p]) - 0)
-					if  data[p] == delim  {
+					if data[p] == delim {
 						_widec += 256
 					}
-					if  data[p] == sep  {
+					if data[p] == sep {
 						_widec += 512
 					}
 				}
-			default:
-				_widec = 2816 + (int16(data[p]) - 0)
-				if  data[p] == delim  {
-					_widec += 256
-				}
-				if  data[p] == sep  {
-					_widec += 512
-				}
-			}
-		case data[p] > 91:
-			switch {
-			case data[p] > 92:
-				if 93 <= data[p] {
-					_widec = 2816 + (int16(data[p]) - 0)
-					if  data[p] == delim  {
+			case data[p] > 91:
+				switch {
+				case data[p] > 92:
+					if 93 <= data[p] {
+						_widec = 2816 + (int16(data[p]) - 0)
+						if data[p] == delim {
+							_widec += 256
+						}
+						if data[p] == sep {
+							_widec += 512
+						}
+					}
+				case data[p] >= 92:
+					_widec = 3840 + (int16(data[p]) - 0)
+					if data[p] == delim {
 						_widec += 256
 					}
-					if  data[p] == sep  {
+					if parser.escFlavor != backslashEscapeFlavorNone {
 						_widec += 512
 					}
+					if data[p] == sep {
+						_widec += 1024
+					}
 				}
-			case data[p] >= 92:
-				_widec = 3840 + (int16(data[p]) - 0)
-				if  data[p] == delim  {
+			default:
+				_widec = 2816 + (int16(data[p]) - 0)
+				if data[p] == delim {
 					_widec += 256
 				}
-				if  parser.escFlavor != backslashEscapeFlavorNone  {
+				if data[p] == sep {
 					_widec += 512
 				}
-				if  data[p] == sep  {
-					_widec += 1024
-				}
 			}
-		default:
-			_widec = 2816 + (int16(data[p]) - 0)
-			if  data[p] == delim  {
-				_widec += 256
-			}
-			if  data[p] == sep  {
-				_widec += 512
-			}
-		}
-		switch _widec {
-		case 3932:
-			goto tr1
-		case 4444:
-			goto st1
-		case 4700:
-			goto st1
-		case 5468:
-			goto st1
-		case 5724:
-			goto st1
-		}
-		switch {
-		case _widec < 2827:
-			if 2816 <= _widec && _widec <= 2825 {
+			switch _widec {
+			case 3932:
 				goto tr1
-			}
-		case _widec > 2828:
-			switch {
-			case _widec > 2907:
-				if 2909 <= _widec && _widec <= 3071 {
+			case 4444:
+				goto st1
+			case 4700:
+				goto st1
+			case 5468:
+				goto st1
+			case 5724:
+				goto st1
+			}
+			switch {
+			case _widec < 2827:
+				if 2816 <= _widec && _widec <= 2825 {
+					goto tr1
+				}
+			case _widec > 2828:
+				switch {
+				case _widec > 2907:
+					if 2909 <= _widec && _widec <= 3071 {
+						goto tr1
+					}
+				case _widec >= 2830:
 					goto tr1
 				}
-			case _widec >= 2830:
+			default:
 				goto tr1
 			}
-		default:
+			goto tr24
+		st1:
+			if p++; p == pe {
+				goto _test_eof1
+			}
+		st_case_1:
 			goto tr1
-		}
-		goto tr24
-	st1:
-		if p++; p == pe {
-			goto _test_eof1
-		}
-	st_case_1:
-		goto tr1
-	st2:
-		if p++; p == pe {
-			goto _test_eof2
-		}
-	st_case_2:
-		_widec = int16(data[p])
-		switch {
-		case data[p] < 14:
+		st2:
+			if p++; p == pe {
+				goto _test_eof2
+			}
+		st_case_2:
+			_widec = int16(data[p])
 			switch {
-			case data[p] > 9:
-				if 11 <= data[p] && data[p] <= 12 {
+			case data[p] < 14:
+				switch {
+				case data[p] > 9:
+					if 11 <= data[p] && data[p] <= 12 {
+						_widec = 2816 + (int16(data[p]) - 0)
+						if data[p] == delim {
+							_widec += 256
+						}
+						if data[p] == sep {
+							_widec += 512
+						}
+					}
+				default:
 					_widec = 2816 + (int16(data[p]) - 0)
-					if  data[p] == delim  {
+					if data[p] == delim {
 						_widec += 256
 					}
-					if  data[p] == sep  {
+					if data[p] == sep {
 						_widec += 512
 					}
 				}
-			default:
-				_widec = 2816 + (int16(data[p]) - 0)
-				if  data[p] == delim  {
-					_widec += 256
-				}
-				if  data[p] == sep  {
-					_widec += 512
-				}
-			}
-		case data[p] > 91:
-			switch {
-			case data[p] > 92:
-				if 93 <= data[p] {
-					_widec = 2816 + (int16(data[p]) - 0)
-					if  data[p] == delim  {
+			case data[p] > 91:
+				switch {
+				case data[p] > 92:
+					if 93 <= data[p] {
+						_widec = 2816 + (int16(data[p]) - 0)
+						if data[p] == delim {
+							_widec += 256
+						}
+						if data[p] == sep {
+							_widec += 512
+						}
+					}
+				case data[p] >= 92:
+					_widec = 3840 + (int16(data[p]) - 0)
+					if data[p] == delim {
 						_widec += 256
 					}
-					if  data[p] == sep  {
+					if parser.escFlavor != backslashEscapeFlavorNone {
 						_widec += 512
 					}
+					if data[p] == sep {
+						_widec += 1024
+					}
 				}
-			case data[p] >= 92:
-				_widec = 3840 + (int16(data[p]) - 0)
-				if  data[p] == delim  {
+			default:
+				_widec = 2816 + (int16(data[p]) - 0)
+				if data[p] == delim {
 					_widec += 256
 				}
-				if  parser.escFlavor != backslashEscapeFlavorNone  {
+				if data[p] == sep {
 					_widec += 512
 				}
-				if  data[p] == sep  {
-					_widec += 1024
-				}
-			}
-		default:
-			_widec = 2816 + (int16(data[p]) - 0)
-			if  data[p] == delim  {
-				_widec += 256
-			}
-			if  data[p] == sep  {
-				_widec += 512
 			}
-		}
-		switch _widec {
-		case 10:
-			goto st2
-		case 13:
-			goto st2
-		case 3932:
-			goto st2
-		case 4188:
-			goto tr3
-		case 4444:
-			goto st3
-		case 4700:
-			goto tr6
-		case 4956:
-			goto st2
-		case 5212:
-			goto tr4
-		case 5468:
-			goto st4
-		case 5724:
-			goto tr8
-		}
-		switch {
-		case _widec < 3165:
-			switch {
-			case _widec < 2909:
-				switch {
-				case _widec < 2827:
-					if 2816 <= _widec && _widec <= 2825 {
-						goto st2
-					}
-				case _widec > 2828:
-					if 2830 <= _widec && _widec <= 2907 {
-						goto st2
-					}
-				default:
-					goto st2
-				}
-			case _widec > 3071:
-				switch {
-				case _widec < 3083:
-					if 3072 <= _widec && _widec <= 3081 {
-						goto tr3
-					}
-				case _widec > 3084:
-					if 3086 <= _widec && _widec <= 3163 {
-						goto tr3
-					}
-				default:
-					goto tr3
-				}
-			default:
+			switch _widec {
+			case 10:
+				goto st2
+			case 13:
 				goto st2
+			case 3932:
+				goto st2
+			case 4188:
+				goto tr3
+			case 4444:
+				goto st3
+			case 4700:
+				goto tr6
+			case 4956:
+				goto st2
+			case 5212:
+				goto tr4
+			case 5468:
+				goto st4
+			case 5724:
+				goto tr8
 			}
-		case _widec > 3327:
 			switch {
-			case _widec < 3421:
+			case _widec < 3165:
 				switch {
-				case _widec < 3339:
-					if 3328 <= _widec && _widec <= 3337 {
+				case _widec < 2909:
+					switch {
+					case _widec < 2827:
+						if 2816 <= _widec && _widec <= 2825 {
+							goto st2
+						}
+					case _widec > 2828:
+						if 2830 <= _widec && _widec <= 2907 {
+							goto st2
+						}
+					default:
 						goto st2
 					}
-				case _widec > 3340:
-					if 3342 <= _widec && _widec <= 3419 {
-						goto st2
+				case _widec > 3071:
+					switch {
+					case _widec < 3083:
+						if 3072 <= _widec && _widec <= 3081 {
+							goto tr3
+						}
+					case _widec > 3084:
+						if 3086 <= _widec && _widec <= 3163 {
+							goto tr3
+						}
+					default:
+						goto tr3
 					}
 				default:
 					goto st2
 				}
-			case _widec > 3583:
+			case _widec > 3327:
 				switch {
-				case _widec < 3595:
-					if 3584 <= _widec && _widec <= 3593 {
-						goto tr4
+				case _widec < 3421:
+					switch {
+					case _widec < 3339:
+						if 3328 <= _widec && _widec <= 3337 {
+							goto st2
+						}
+					case _widec > 3340:
+						if 3342 <= _widec && _widec <= 3419 {
+							goto st2
+						}
+					default:
+						goto st2
 					}
-				case _widec > 3596:
+				case _widec > 3583:
 					switch {
-					case _widec > 3675:
-						if 3677 <= _widec && _widec <= 3839 {
+					case _widec < 3595:
+						if 3584 <= _widec && _widec <= 3593 {
+							goto tr4
+						}
+					case _widec > 3596:
+						switch {
+						case _widec > 3675:
+							if 3677 <= _widec && _widec <= 3839 {
+								goto tr4
+							}
+						case _widec >= 3598:
 							goto tr4
 						}
-					case _widec >= 3598:
+					default:
 						goto tr4
 					}
 				default:
-					goto tr4
+					goto st2
 				}
 			default:
-				goto st2
+				goto tr3
 			}
-		default:
-			goto tr3
-		}
-		goto tr0
-tr3:
-//.... NONE:1
-te = p+1
+			goto tr0
+		tr3:
+			//.... NONE:1
+			te = p + 1
 
-//.... lightning/mydump/csv_parser.rl:45
-act = 2;
-	goto st11
-	st11:
-		if p++; p == pe {
-			goto _test_eof11
-		}
-	st_case_11:
-//.... tmp_parser.go:638
-		_widec = int16(data[p])
-		switch {
-		case data[p] < 11:
-			if data[p] <= 9 {
-				_widec = 768 + (int16(data[p]) - 0)
-				if  data[p] == delim  {
-					_widec += 256
+			//.... lightning/mydump/csv_parser.rl:45
+			act = 2
+			goto st11
+		st11:
+			if p++; p == pe {
+				goto _test_eof11
+			}
+		st_case_11:
+			//.... tmp_parser.go:638
+			_widec = int16(data[p])
+			switch {
+			case data[p] < 11:
+				if data[p] <= 9 {
+					_widec = 768 + (int16(data[p]) - 0)
+					if data[p] == delim {
+						_widec += 256
+					}
 				}
-			}
-		case data[p] > 12:
-			if 14 <= data[p] {
+			case data[p] > 12:
+				if 14 <= data[p] {
+					_widec = 768 + (int16(data[p]) - 0)
+					if data[p] == delim {
+						_widec += 256
+					}
+				}
+			default:
 				_widec = 768 + (int16(data[p]) - 0)
-				if  data[p] == delim  {
+				if data[p] == delim {
 					_widec += 256
 				}
 			}
-		default:
-			_widec = 768 + (int16(data[p]) - 0)
-			if  data[p] == delim  {
-				_widec += 256
-			}
-		}
-		switch {
-		case _widec < 1035:
-			if 1024 <= _widec && _widec <= 1033 {
-				goto st2
-			}
-		case _widec > 1036:
-			if 1038 <= _widec && _widec <= 1279 {
+			switch {
+			case _widec < 1035:
+				if 1024 <= _widec && _widec <= 1033 {
+					goto st2
+				}
+			case _widec > 1036:
+				if 1038 <= _widec && _widec <= 1279 {
+					goto st2
+				}
+			default:
 				goto st2
 			}
-		default:
-			goto st2
-		}
-		goto tr24
-tr4:
-//.... NONE:1
-te = p+1
+			goto tr24
+		tr4:
+			//.... NONE:1
+			te = p + 1
 
-//.... lightning/mydump/csv_parser.rl:45
-act = 2;
-	goto st12
-	st12:
-		if p++; p == pe {
-			goto _test_eof12
-		}
-	st_case_12:
-//.... tmp_parser.go:686
-		_widec = int16(data[p])
-		switch {
-		case data[p] < 14:
-			switch {
-			case data[p] > 9:
-				if 11 <= data[p] && data[p] <= 12 {
+			//.... lightning/mydump/csv_parser.rl:45
+			act = 2
+			goto st12
+		st12:
+			if p++; p == pe {
+				goto _test_eof12
+			}
+		st_case_12:
+			//.... tmp_parser.go:686
+			_widec = int16(data[p])
+			switch {
+			case data[p] < 14:
+				switch {
+				case data[p] > 9:
+					if 11 <= data[p] && data[p] <= 12 {
+						_widec = 2816 + (int16(data[p]) - 0)
+						if data[p] == delim {
+							_widec += 256
+						}
+						if data[p] == sep {
+							_widec += 512
+						}
+					}
+				default:
 					_widec = 2816 + (int16(data[p]) - 0)
-					if  data[p] == delim  {
+					if data[p] == delim {
 						_widec += 256
 					}
-					if  data[p] == sep  {
+					if data[p] == sep {
 						_widec += 512
 					}
 				}
-			default:
-				_widec = 2816 + (int16(data[p]) - 0)
-				if  data[p] == delim  {
-					_widec += 256
-				}
-				if  data[p] == sep  {
-					_widec += 512
-				}
-			}
-		case data[p] > 91:
-			switch {
-			case data[p] > 92:
-				if 93 <= data[p] {
-					_widec = 2816 + (int16(data[p]) - 0)
-					if  data[p] == delim  {
+			case data[p] > 91:
+				switch {
+				case data[p] > 92:
+					if 93 <= data[p] {
+						_widec = 2816 + (int16(data[p]) - 0)
+						if data[p] == delim {
+							_widec += 256
+						}
+						if data[p] == sep {
+							_widec += 512
+						}
+					}
+				case data[p] >= 92:
+					_widec = 3840 + (int16(data[p]) - 0)
+					if data[p] == delim {
 						_widec += 256
 					}
-					if  data[p] == sep  {
+					if parser.escFlavor != backslashEscapeFlavorNone {
 						_widec += 512
 					}
+					if data[p] == sep {
+						_widec += 1024
+					}
 				}
-			case data[p] >= 92:
-				_widec = 3840 + (int16(data[p]) - 0)
-				if  data[p] == delim  {
+			default:
+				_widec = 2816 + (int16(data[p]) - 0)
+				if data[p] == delim {
 					_widec += 256
 				}
-				if  parser.escFlavor != backslashEscapeFlavorNone  {
+				if data[p] == sep {
 					_widec += 512
 				}
-				if  data[p] == sep  {
-					_widec += 1024
-				}
-			}
-		default:
-			_widec = 2816 + (int16(data[p]) - 0)
-			if  data[p] == delim  {
-				_widec += 256
 			}
-			if  data[p] == sep  {
-				_widec += 512
+			switch _widec {
+			case 10:
+				goto st2
+			case 13:
+				goto st2
+			case 3932:
+				goto st2
+			case 4188:
+				goto tr4
+			case 4444:
+				goto st3
+			case 4700:
+				goto tr8
+			case 4956:
+				goto st2
+			case 5212:
+				goto tr4
+			case 5468:
+				goto st4
+			case 5724:
+				goto tr8
 			}
-		}
-		switch _widec {
-		case 10:
-			goto st2
-		case 13:
-			goto st2
-		case 3932:
-			goto st2
-		case 4188:
-			goto tr4
-		case 4444:
-			goto st3
-		case 4700:
-			goto tr8
-		case 4956:
-			goto st2
-		case 5212:
-			goto tr4
-		case 5468:
-			goto st4
-		case 5724:
-			goto tr8
-		}
-		switch {
-		case _widec < 3165:
 			switch {
-			case _widec < 2909:
+			case _widec < 3165:
 				switch {
-				case _widec < 2827:
-					if 2816 <= _widec && _widec <= 2825 {
+				case _widec < 2909:
+					switch {
+					case _widec < 2827:
+						if 2816 <= _widec && _widec <= 2825 {
+							goto st2
+						}
+					case _widec > 2828:
+						if 2830 <= _widec && _widec <= 2907 {
+							goto st2
+						}
+					default:
 						goto st2
 					}
-				case _widec > 2828:
-					if 2830 <= _widec && _widec <= 2907 {
-						goto st2
+				case _widec > 3071:
+					switch {
+					case _widec < 3083:
+						if 3072 <= _widec && _widec <= 3081 {
+							goto tr4
+						}
+					case _widec > 3084:
+						if 3086 <= _widec && _widec <= 3163 {
+							goto tr4
+						}
+					default:
+						goto tr4
 					}
 				default:
 					goto st2
 				}
-			case _widec > 3071:
+			case _widec > 3327:
 				switch {
-				case _widec < 3083:
-					if 3072 <= _widec && _widec <= 3081 {
-						goto tr4
+				case _widec < 3421:
+					switch {
+					case _widec < 3339:
+						if 3328 <= _widec && _widec <= 3337 {
+							goto st2
+						}
+					case _widec > 3340:
+						if 3342 <= _widec && _widec <= 3419 {
+							goto st2
+						}
+					default:
+						goto st2
 					}
-				case _widec > 3084:
-					if 3086 <= _widec && _widec <= 3163 {
+				case _widec > 3583:
+					switch {
+					case _widec < 3595:
+						if 3584 <= _widec && _widec <= 3593 {
+							goto tr4
+						}
+					case _widec > 3596:
+						switch {
+						case _widec > 3675:
+							if 3677 <= _widec && _widec <= 3839 {
+								goto tr4
+							}
+						case _widec >= 3598:
+							goto tr4
+						}
+					default:
 						goto tr4
 					}
 				default:
-					goto tr4
+					goto st2
+				}
+			default:
+				goto tr4
+			}
+			goto tr24
+		st3:
+			if p++; p == pe {
+				goto _test_eof3
+			}
+		st_case_3:
+			goto st2
+		tr8:
+			//.... NONE:1
+			te = p + 1
+
+			//.... lightning/mydump/csv_parser.rl:45
+			act = 2
+			goto st13
+		st13:
+			if p++; p == pe {
+				goto _test_eof13
+			}
+		st_case_13:
+			//.... tmp_parser.go:855
+			_widec = int16(data[p])
+			switch {
+			case data[p] < 14:
+				switch {
+				case data[p] > 9:
+					if 11 <= data[p] && data[p] <= 12 {
+						_widec = 2816 + (int16(data[p]) - 0)
+						if data[p] == delim {
+							_widec += 256
+						}
+						if data[p] == sep {
+							_widec += 512
+						}
+					}
+				default:
+					_widec = 2816 + (int16(data[p]) - 0)
+					if data[p] == delim {
+						_widec += 256
+					}
+					if data[p] == sep {
+						_widec += 512
+					}
+				}
+			case data[p] > 91:
+				switch {
+				case data[p] > 92:
+					if 93 <= data[p] {
+						_widec = 2816 + (int16(data[p]) - 0)
+						if data[p] == delim {
+							_widec += 256
+						}
+						if data[p] == sep {
+							_widec += 512
+						}
+					}
+				case data[p] >= 92:
+					_widec = 3840 + (int16(data[p]) - 0)
+					if data[p] == delim {
+						_widec += 256
+					}
+					if parser.escFlavor != backslashEscapeFlavorNone {
+						_widec += 512
+					}
+					if data[p] == sep {
+						_widec += 1024
+					}
 				}
 			default:
+				_widec = 2816 + (int16(data[p]) - 0)
+				if data[p] == delim {
+					_widec += 256
+				}
+				if data[p] == sep {
+					_widec += 512
+				}
+			}
+			switch _widec {
+			case 10:
+				goto st2
+			case 13:
 				goto st2
+			case 3932:
+				goto st2
+			case 4188:
+				goto tr4
+			case 4444:
+				goto st4
+			case 4700:
+				goto tr8
+			case 4956:
+				goto st2
+			case 5212:
+				goto tr4
+			case 5468:
+				goto st4
+			case 5724:
+				goto tr8
 			}
-		case _widec > 3327:
 			switch {
-			case _widec < 3421:
+			case _widec < 3165:
 				switch {
-				case _widec < 3339:
-					if 3328 <= _widec && _widec <= 3337 {
+				case _widec < 2909:
+					switch {
+					case _widec < 2827:
+						if 2816 <= _widec && _widec <= 2825 {
+							goto st2
+						}
+					case _widec > 2828:
+						if 2830 <= _widec && _widec <= 2907 {
+							goto st2
+						}
+					default:
 						goto st2
 					}
-				case _widec > 3340:
-					if 3342 <= _widec && _widec <= 3419 {
-						goto st2
+				case _widec > 3071:
+					switch {
+					case _widec < 3083:
+						if 3072 <= _widec && _widec <= 3081 {
+							goto tr4
+						}
+					case _widec > 3084:
+						if 3086 <= _widec && _widec <= 3163 {
+							goto tr4
+						}
+					default:
+						goto tr4
 					}
 				default:
 					goto st2
 				}
-			case _widec > 3583:
+			case _widec > 3327:
 				switch {
-				case _widec < 3595:
-					if 3584 <= _widec && _widec <= 3593 {
-						goto tr4
+				case _widec < 3421:
+					switch {
+					case _widec < 3339:
+						if 3328 <= _widec && _widec <= 3337 {
+							goto st2
+						}
+					case _widec > 3340:
+						if 3342 <= _widec && _widec <= 3419 {
+							goto st2
+						}
+					default:
+						goto st2
 					}
-				case _widec > 3596:
+				case _widec > 3583:
 					switch {
-					case _widec > 3675:
-						if 3677 <= _widec && _widec <= 3839 {
+					case _widec < 3595:
+						if 3584 <= _widec && _widec <= 3593 {
 							goto tr4
 						}
-					case _widec >= 3598:
+					case _widec > 3596:
+						switch {
+						case _widec > 3675:
+							if 3677 <= _widec && _widec <= 3839 {
+								goto tr4
+							}
+						case _widec >= 3598:
+							goto tr4
+						}
+					default:
 						goto tr4
 					}
 				default:
-					goto tr4
+					goto st2
 				}
 			default:
-				goto st2
+				goto tr4
 			}
-		default:
-			goto tr4
-		}
-		goto tr24
-	st3:
-		if p++; p == pe {
-			goto _test_eof3
-		}
-	st_case_3:
-		goto st2
-tr8:
-//.... NONE:1
-te = p+1
-
-//.... lightning/mydump/csv_parser.rl:45
-act = 2;
-	goto st13
-	st13:
-		if p++; p == pe {
-			goto _test_eof13
-		}
-	st_case_13:
-//.... tmp_parser.go:855
-		_widec = int16(data[p])
-		switch {
-		case data[p] < 14:
+			goto tr24
+		st4:
+			if p++; p == pe {
+				goto _test_eof4
+			}
+		st_case_4:
+			_widec = int16(data[p])
 			switch {
-			case data[p] > 9:
-				if 11 <= data[p] && data[p] <= 12 {
+			case data[p] < 14:
+				switch {
+				case data[p] > 9:
+					if 11 <= data[p] && data[p] <= 12 {
+						_widec = 2816 + (int16(data[p]) - 0)
+						if data[p] == delim {
+							_widec += 256
+						}
+						if data[p] == sep {
+							_widec += 512
+						}
+					}
+				default:
 					_widec = 2816 + (int16(data[p]) - 0)
-					if  data[p] == delim  {
+					if data[p] == delim {
 						_widec += 256
 					}
-					if  data[p] == sep  {
+					if data[p] == sep {
 						_widec += 512
 					}
 				}
-			default:
-				_widec = 2816 + (int16(data[p]) - 0)
-				if  data[p] == delim  {
-					_widec += 256
-				}
-				if  data[p] == sep  {
-					_widec += 512
-				}
-			}
-		case data[p] > 91:
-			switch {
-			case data[p] > 92:
-				if 93 <= data[p] {
-					_widec = 2816 + (int16(data[p]) - 0)
-					if  data[p] == delim  {
+			case data[p] > 91:
+				switch {
+				case data[p] > 92:
+					if 93 <= data[p] {
+						_widec = 2816 + (int16(data[p]) - 0)
+						if data[p] == delim {
+							_widec += 256
+						}
+						if data[p] == sep {
+							_widec += 512
+						}
+					}
+				case data[p] >= 92:
+					_widec = 3840 + (int16(data[p]) - 0)
+					if data[p] == delim {
 						_widec += 256
 					}
-					if  data[p] == sep  {
+					if parser.escFlavor != backslashEscapeFlavorNone {
 						_widec += 512
 					}
+					if data[p] == sep {
+						_widec += 1024
+					}
 				}
-			case data[p] >= 92:
-				_widec = 3840 + (int16(data[p]) - 0)
-				if  data[p] == delim  {
+			default:
+				_widec = 2816 + (int16(data[p]) - 0)
+				if data[p] == delim {
 					_widec += 256
 				}
-				if  parser.escFlavor != backslashEscapeFlavorNone  {
+				if data[p] == sep {
 					_widec += 512
 				}
-				if  data[p] == sep  {
-					_widec += 1024
-				}
 			}
-		default:
-			_widec = 2816 + (int16(data[p]) - 0)
-			if  data[p] == delim  {
-				_widec += 256
-			}
-			if  data[p] == sep  {
-				_widec += 512
+			switch _widec {
+			case 10:
+				goto st2
+			case 13:
+				goto st2
+			case 3932:
+				goto st2
+			case 4188:
+				goto tr4
+			case 4444:
+				goto st4
+			case 4700:
+				goto tr8
+			case 4956:
+				goto st2
+			case 5212:
+				goto tr4
+			case 5468:
+				goto st4
+			case 5724:
+				goto tr8
 			}
-		}
-		switch _widec {
-		case 10:
-			goto st2
-		case 13:
-			goto st2
-		case 3932:
-			goto st2
-		case 4188:
-			goto tr4
-		case 4444:
-			goto st4
-		case 4700:
-			goto tr8
-		case 4956:
-			goto st2
-		case 5212:
-			goto tr4
-		case 5468:
-			goto st4
-		case 5724:
-			goto tr8
-		}
-		switch {
-		case _widec < 3165:
 			switch {
-			case _widec < 2909:
+			case _widec < 3165:
 				switch {
-				case _widec < 2827:
-					if 2816 <= _widec && _widec <= 2825 {
+				case _widec < 2909:
+					switch {
+					case _widec < 2827:
+						if 2816 <= _widec && _widec <= 2825 {
+							goto st2
+						}
+					case _widec > 2828:
+						if 2830 <= _widec && _widec <= 2907 {
+							goto st2
+						}
+					default:
 						goto st2
 					}
-				case _widec > 2828:
-					if 2830 <= _widec && _widec <= 2907 {
-						goto st2
+				case _widec > 3071:
+					switch {
+					case _widec < 3083:
+						if 3072 <= _widec && _widec <= 3081 {
+							goto tr4
+						}
+					case _widec > 3084:
+						if 3086 <= _widec && _widec <= 3163 {
+							goto tr4
+						}
+					default:
+						goto tr4
 					}
 				default:
 					goto st2
 				}
-			case _widec > 3071:
+			case _widec > 3327:
 				switch {
-				case _widec < 3083:
-					if 3072 <= _widec && _widec <= 3081 {
-						goto tr4
+				case _widec < 3421:
+					switch {
+					case _widec < 3339:
+						if 3328 <= _widec && _widec <= 3337 {
+							goto st2
+						}
+					case _widec > 3340:
+						if 3342 <= _widec && _widec <= 3419 {
+							goto st2
+						}
+					default:
+						goto st2
 					}
-				case _widec > 3084:
-					if 3086 <= _widec && _widec <= 3163 {
+				case _widec > 3583:
+					switch {
+					case _widec < 3595:
+						if 3584 <= _widec && _widec <= 3593 {
+							goto tr4
+						}
+					case _widec > 3596:
+						switch {
+						case _widec > 3675:
+							if 3677 <= _widec && _widec <= 3839 {
+								goto tr4
+							}
+						case _widec >= 3598:
+							goto tr4
+						}
+					default:
 						goto tr4
 					}
 				default:
-					goto tr4
+					goto st2
+				}
+			default:
+				goto tr4
+			}
+			goto tr0
+		tr6:
+			//.... NONE:1
+			te = p + 1
+
+			//.... lightning/mydump/csv_parser.rl:45
+			act = 2
+			goto st14
+		st14:
+			if p++; p == pe {
+				goto _test_eof14
+			}
+		st_case_14:
+			//.... tmp_parser.go:1173
+			_widec = int16(data[p])
+			switch {
+			case data[p] < 11:
+				if data[p] <= 9 {
+					_widec = 768 + (int16(data[p]) - 0)
+					if data[p] == delim {
+						_widec += 256
+					}
+				}
+			case data[p] > 12:
+				if 14 <= data[p] {
+					_widec = 768 + (int16(data[p]) - 0)
+					if data[p] == delim {
+						_widec += 256
+					}
 				}
 			default:
+				_widec = 768 + (int16(data[p]) - 0)
+				if data[p] == delim {
+					_widec += 256
+				}
+			}
+			switch _widec {
+			case 10:
+				goto st2
+			case 13:
 				goto st2
 			}
-		case _widec > 3327:
 			switch {
-			case _widec < 3421:
+			case _widec < 782:
 				switch {
-				case _widec < 3339:
-					if 3328 <= _widec && _widec <= 3337 {
+				case _widec > 777:
+					if 779 <= _widec && _widec <= 780 {
 						goto st2
 					}
-				case _widec > 3340:
-					if 3342 <= _widec && _widec <= 3419 {
-						goto st2
-					}
-				default:
+				case _widec >= 768:
 					goto st2
 				}
-			case _widec > 3583:
+			case _widec > 1033:
 				switch {
-				case _widec < 3595:
-					if 3584 <= _widec && _widec <= 3593 {
-						goto tr4
-					}
-				case _widec > 3596:
-					switch {
-					case _widec > 3675:
-						if 3677 <= _widec && _widec <= 3839 {
-							goto tr4
-						}
-					case _widec >= 3598:
-						goto tr4
+				case _widec > 1036:
+					if 1038 <= _widec && _widec <= 1279 {
+						goto st2
 					}
-				default:
-					goto tr4
+				case _widec >= 1035:
+					goto st2
 				}
 			default:
 				goto st2
 			}
-		default:
-			goto tr4
-		}
-		goto tr24
-	st4:
-		if p++; p == pe {
-			goto _test_eof4
-		}
-	st_case_4:
-		_widec = int16(data[p])
-		switch {
-		case data[p] < 14:
-			switch {
-			case data[p] > 9:
-				if 11 <= data[p] && data[p] <= 12 {
+			goto tr24
+		tr18:
+			//.... NONE:1
+			te = p + 1
+
+			//.... lightning/mydump/csv_parser.rl:40
+			act = 1
+			goto st15
+		st15:
+			if p++; p == pe {
+				goto _test_eof15
+			}
+		st_case_15:
+			//.... tmp_parser.go:1237
+			_widec = int16(data[p])
+			switch {
+			case data[p] < 14:
+				switch {
+				case data[p] > 9:
+					if 11 <= data[p] && data[p] <= 12 {
+						_widec = 2816 + (int16(data[p]) - 0)
+						if data[p] == delim {
+							_widec += 256
+						}
+						if data[p] == sep {
+							_widec += 512
+						}
+					}
+				default:
 					_widec = 2816 + (int16(data[p]) - 0)
-					if  data[p] == delim  {
+					if data[p] == delim {
 						_widec += 256
 					}
-					if  data[p] == sep  {
+					if data[p] == sep {
 						_widec += 512
 					}
 				}
-			default:
-				_widec = 2816 + (int16(data[p]) - 0)
-				if  data[p] == delim  {
-					_widec += 256
-				}
-				if  data[p] == sep  {
-					_widec += 512
-				}
-			}
-		case data[p] > 91:
-			switch {
-			case data[p] > 92:
-				if 93 <= data[p] {
-					_widec = 2816 + (int16(data[p]) - 0)
-					if  data[p] == delim  {
+			case data[p] > 91:
+				switch {
+				case data[p] > 92:
+					if 93 <= data[p] {
+						_widec = 2816 + (int16(data[p]) - 0)
+						if data[p] == delim {
+							_widec += 256
+						}
+						if data[p] == sep {
+							_widec += 512
+						}
+					}
+				case data[p] >= 92:
+					_widec = 3840 + (int16(data[p]) - 0)
+					if data[p] == delim {
 						_widec += 256
 					}
-					if  data[p] == sep  {
+					if parser.escFlavor != backslashEscapeFlavorNone {
 						_widec += 512
 					}
+					if data[p] == sep {
+						_widec += 1024
+					}
 				}
-			case data[p] >= 92:
-				_widec = 3840 + (int16(data[p]) - 0)
-				if  data[p] == delim  {
+			default:
+				_widec = 2816 + (int16(data[p]) - 0)
+				if data[p] == delim {
 					_widec += 256
 				}
-				if  parser.escFlavor != backslashEscapeFlavorNone  {
+				if data[p] == sep {
 					_widec += 512
 				}
-				if  data[p] == sep  {
-					_widec += 1024
-				}
-			}
-		default:
-			_widec = 2816 + (int16(data[p]) - 0)
-			if  data[p] == delim  {
-				_widec += 256
 			}
-			if  data[p] == sep  {
-				_widec += 512
+			switch _widec {
+			case 10:
+				goto st2
+			case 13:
+				goto st2
+			case 3932:
+				goto st2
+			case 4188:
+				goto tr3
+			case 4444:
+				goto st3
+			case 4700:
+				goto tr6
+			case 4956:
+				goto st2
+			case 5212:
+				goto tr4
+			case 5468:
+				goto st4
+			case 5724:
+				goto tr8
 			}
-		}
-		switch _widec {
-		case 10:
-			goto st2
-		case 13:
-			goto st2
-		case 3932:
-			goto st2
-		case 4188:
-			goto tr4
-		case 4444:
-			goto st4
-		case 4700:
-			goto tr8
-		case 4956:
-			goto st2
-		case 5212:
-			goto tr4
-		case 5468:
-			goto st4
-		case 5724:
-			goto tr8
-		}
-		switch {
-		case _widec < 3165:
 			switch {
-			case _widec < 2909:
+			case _widec < 3165:
 				switch {
-				case _widec < 2827:
-					if 2816 <= _widec && _widec <= 2825 {
+				case _widec < 2909:
+					switch {
+					case _widec < 2827:
+						if 2816 <= _widec && _widec <= 2825 {
+							goto st2
+						}
+					case _widec > 2828:
+						if 2830 <= _widec && _widec <= 2907 {
+							goto st2
+						}
+					default:
 						goto st2
 					}
-				case _widec > 2828:
-					if 2830 <= _widec && _widec <= 2907 {
-						goto st2
+				case _widec > 3071:
+					switch {
+					case _widec < 3083:
+						if 3072 <= _widec && _widec <= 3081 {
+							goto tr3
+						}
+					case _widec > 3084:
+						if 3086 <= _widec && _widec <= 3163 {
+							goto tr3
+						}
+					default:
+						goto tr3
 					}
 				default:
 					goto st2
 				}
-			case _widec > 3071:
+			case _widec > 3327:
 				switch {
-				case _widec < 3083:
-					if 3072 <= _widec && _widec <= 3081 {
-						goto tr4
+				case _widec < 3421:
+					switch {
+					case _widec < 3339:
+						if 3328 <= _widec && _widec <= 3337 {
+							goto st2
+						}
+					case _widec > 3340:
+						if 3342 <= _widec && _widec <= 3419 {
+							goto st2
+						}
+					default:
+						goto st2
 					}
-				case _widec > 3084:
-					if 3086 <= _widec && _widec <= 3163 {
+				case _widec > 3583:
+					switch {
+					case _widec < 3595:
+						if 3584 <= _widec && _widec <= 3593 {
+							goto tr4
+						}
+					case _widec > 3596:
+						switch {
+						case _widec > 3675:
+							if 3677 <= _widec && _widec <= 3839 {
+								goto tr4
+							}
+						case _widec >= 3598:
+							goto tr4
+						}
+					default:
 						goto tr4
 					}
 				default:
-					goto tr4
+					goto st2
 				}
 			default:
-				goto st2
+				goto tr3
+			}
+			goto tr25
+		st5:
+			if p++; p == pe {
+				goto _test_eof5
 			}
-		case _widec > 3327:
+		st_case_5:
+			_widec = int16(data[p])
 			switch {
-			case _widec < 3421:
+			case data[p] < 14:
 				switch {
-				case _widec < 3339:
-					if 3328 <= _widec && _widec <= 3337 {
-						goto st2
-					}
-				case _widec > 3340:
-					if 3342 <= _widec && _widec <= 3419 {
-						goto st2
+				case data[p] > 9:
+					if 11 <= data[p] && data[p] <= 12 {
+						_widec = 2816 + (int16(data[p]) - 0)
+						if data[p] == delim {
+							_widec += 256
+						}
+						if data[p] == sep {
+							_widec += 512
+						}
 					}
 				default:
-					goto st2
-				}
-			case _widec > 3583:
-				switch {
-				case _widec < 3595:
-					if 3584 <= _widec && _widec <= 3593 {
-						goto tr4
-					}
-				case _widec > 3596:
-					switch {
-					case _widec > 3675:
-						if 3677 <= _widec && _widec <= 3839 {
-							goto tr4
-						}
-					case _widec >= 3598:
-						goto tr4
-					}
-				default:
-					goto tr4
-				}
-			default:
-				goto st2
-			}
-		default:
-			goto tr4
-		}
-		goto tr0
-tr6:
-//.... NONE:1
-te = p+1
-
-//.... lightning/mydump/csv_parser.rl:45
-act = 2;
-	goto st14
-	st14:
-		if p++; p == pe {
-			goto _test_eof14
-		}
-	st_case_14:
-//.... tmp_parser.go:1173
-		_widec = int16(data[p])
-		switch {
-		case data[p] < 11:
-			if data[p] <= 9 {
-				_widec = 768 + (int16(data[p]) - 0)
-				if  data[p] == delim  {
-					_widec += 256
-				}
-			}
-		case data[p] > 12:
-			if 14 <= data[p] {
-				_widec = 768 + (int16(data[p]) - 0)
-				if  data[p] == delim  {
-					_widec += 256
-				}
-			}
-		default:
-			_widec = 768 + (int16(data[p]) - 0)
-			if  data[p] == delim  {
-				_widec += 256
-			}
-		}
-		switch _widec {
-		case 10:
-			goto st2
-		case 13:
-			goto st2
-		}
-		switch {
-		case _widec < 782:
-			switch {
-			case _widec > 777:
-				if 779 <= _widec && _widec <= 780 {
-					goto st2
-				}
-			case _widec >= 768:
-				goto st2
-			}
-		case _widec > 1033:
-			switch {
-			case _widec > 1036:
-				if 1038 <= _widec && _widec <= 1279 {
-					goto st2
-				}
-			case _widec >= 1035:
-				goto st2
-			}
-		default:
-			goto st2
-		}
-		goto tr24
-tr18:
-//.... NONE:1
-te = p+1
-
-//.... lightning/mydump/csv_parser.rl:40
-act = 1;
-	goto st15
-	st15:
-		if p++; p == pe {
-			goto _test_eof15
-		}
-	st_case_15:
-//.... tmp_parser.go:1237
-		_widec = int16(data[p])
-		switch {
-		case data[p] < 14:
-			switch {
-			case data[p] > 9:
-				if 11 <= data[p] && data[p] <= 12 {
 					_widec = 2816 + (int16(data[p]) - 0)
-					if  data[p] == delim  {
+					if data[p] == delim {
 						_widec += 256
 					}
-					if  data[p] == sep  {
+					if data[p] == sep {
 						_widec += 512
 					}
 				}
-			default:
-				_widec = 2816 + (int16(data[p]) - 0)
-				if  data[p] == delim  {
-					_widec += 256
-				}
-				if  data[p] == sep  {
-					_widec += 512
-				}
-			}
-		case data[p] > 91:
-			switch {
-			case data[p] > 92:
-				if 93 <= data[p] {
-					_widec = 2816 + (int16(data[p]) - 0)
-					if  data[p] == delim  {
+			case data[p] > 91:
+				switch {
+				case data[p] > 92:
+					if 93 <= data[p] {
+						_widec = 2816 + (int16(data[p]) - 0)
+						if data[p] == delim {
+							_widec += 256
+						}
+						if data[p] == sep {
+							_widec += 512
+						}
+					}
+				case data[p] >= 92:
+					_widec = 3840 + (int16(data[p]) - 0)
+					if data[p] == delim {
 						_widec += 256
 					}
-					if  data[p] == sep  {
+					if parser.escFlavor != backslashEscapeFlavorNone {
 						_widec += 512
 					}
+					if data[p] == sep {
+						_widec += 1024
+					}
 				}
-			case data[p] >= 92:
-				_widec = 3840 + (int16(data[p]) - 0)
-				if  data[p] == delim  {
+			default:
+				_widec = 2816 + (int16(data[p]) - 0)
+				if data[p] == delim {
 					_widec += 256
 				}
-				if  parser.escFlavor != backslashEscapeFlavorNone  {
+				if data[p] == sep {
 					_widec += 512
 				}
-				if  data[p] == sep  {
-					_widec += 1024
-				}
 			}
-		default:
-			_widec = 2816 + (int16(data[p]) - 0)
-			if  data[p] == delim  {
-				_widec += 256
-			}
-			if  data[p] == sep  {
-				_widec += 512
+			switch _widec {
+			case 10:
+				goto tr9
+			case 13:
+				goto tr9
+			case 3932:
+				goto tr9
+			case 4188:
+				goto tr10
+			case 4444:
+				goto tr12
+			case 4700:
+				goto tr12
+			case 4956:
+				goto tr9
+			case 5212:
+				goto tr11
+			case 5468:
+				goto tr13
+			case 5724:
+				goto tr13
 			}
-		}
-		switch _widec {
-		case 10:
-			goto st2
-		case 13:
-			goto st2
-		case 3932:
-			goto st2
-		case 4188:
-			goto tr3
-		case 4444:
-			goto st3
-		case 4700:
-			goto tr6
-		case 4956:
-			goto st2
-		case 5212:
-			goto tr4
-		case 5468:
-			goto st4
-		case 5724:
-			goto tr8
-		}
-		switch {
-		case _widec < 3165:
 			switch {
-			case _widec < 2909:
+			case _widec < 3165:
 				switch {
-				case _widec < 2827:
-					if 2816 <= _widec && _widec <= 2825 {
-						goto st2
+				case _widec < 2909:
+					switch {
+					case _widec < 2827:
+						if 2816 <= _widec && _widec <= 2825 {
+							goto tr9
+						}
+					case _widec > 2828:
+						if 2830 <= _widec && _widec <= 2907 {
+							goto tr9
+						}
+					default:
+						goto tr9
 					}
-				case _widec > 2828:
-					if 2830 <= _widec && _widec <= 2907 {
-						goto st2
+				case _widec > 3071:
+					switch {
+					case _widec < 3083:
+						if 3072 <= _widec && _widec <= 3081 {
+							goto tr10
+						}
+					case _widec > 3084:
+						if 3086 <= _widec && _widec <= 3163 {
+							goto tr10
+						}
+					default:
+						goto tr10
 					}
 				default:
-					goto st2
+					goto tr9
 				}
-			case _widec > 3071:
+			case _widec > 3327:
 				switch {
-				case _widec < 3083:
-					if 3072 <= _widec && _widec <= 3081 {
-						goto tr3
+				case _widec < 3421:
+					switch {
+					case _widec < 3339:
+						if 3328 <= _widec && _widec <= 3337 {
+							goto tr9
+						}
+					case _widec > 3340:
+						if 3342 <= _widec && _widec <= 3419 {
+							goto tr9
+						}
+					default:
+						goto tr9
 					}
-				case _widec > 3084:
-					if 3086 <= _widec && _widec <= 3163 {
-						goto tr3
+				case _widec > 3583:
+					switch {
+					case _widec < 3595:
+						if 3584 <= _widec && _widec <= 3593 {
+							goto tr11
+						}
+					case _widec > 3596:
+						switch {
+						case _widec > 3675:
+							if 3677 <= _widec && _widec <= 3839 {
+								goto tr11
+							}
+						case _widec >= 3598:
+							goto tr11
+						}
+					default:
+						goto tr11
 					}
 				default:
-					goto tr3
+					goto tr9
 				}
 			default:
-				goto st2
+				goto tr10
 			}
-		case _widec > 3327:
-			switch {
-			case _widec < 3421:
-				switch {
-				case _widec < 3339:
-					if 3328 <= _widec && _widec <= 3337 {
-						goto st2
-					}
-				case _widec > 3340:
-					if 3342 <= _widec && _widec <= 3419 {
-						goto st2
-					}
-				default:
-					goto st2
-				}
-			case _widec > 3583:
+			goto tr0
+		tr9:
+			//.... NONE:1
+			te = p + 1
+
+			//.... lightning/mydump/csv_parser.rl:45
+			act = 2
+			goto st16
+		st16:
+			if p++; p == pe {
+				goto _test_eof16
+			}
+		st_case_16:
+			//.... tmp_parser.go:1555
+			_widec = int16(data[p])
+			switch {
+			case data[p] < 14:
 				switch {
-				case _widec < 3595:
-					if 3584 <= _widec && _widec <= 3593 {
-						goto tr4
-					}
-				case _widec > 3596:
-					switch {
-					case _widec > 3675:
-						if 3677 <= _widec && _widec <= 3839 {
-							goto tr4
+				case data[p] > 9:
+					if 11 <= data[p] && data[p] <= 12 {
+						_widec = 2816 + (int16(data[p]) - 0)
+						if data[p] == delim {
+							_widec += 256
+						}
+						if data[p] == sep {
+							_widec += 512
 						}
-					case _widec >= 3598:
-						goto tr4
 					}
 				default:
-					goto tr4
-				}
-			default:
-				goto st2
-			}
-		default:
-			goto tr3
-		}
-		goto tr25
-	st5:
-		if p++; p == pe {
-			goto _test_eof5
-		}
-	st_case_5:
-		_widec = int16(data[p])
-		switch {
-		case data[p] < 14:
-			switch {
-			case data[p] > 9:
-				if 11 <= data[p] && data[p] <= 12 {
 					_widec = 2816 + (int16(data[p]) - 0)
-					if  data[p] == delim  {
+					if data[p] == delim {
 						_widec += 256
 					}
-					if  data[p] == sep  {
+					if data[p] == sep {
 						_widec += 512
 					}
 				}
-			default:
-				_widec = 2816 + (int16(data[p]) - 0)
-				if  data[p] == delim  {
-					_widec += 256
-				}
-				if  data[p] == sep  {
-					_widec += 512
-				}
-			}
-		case data[p] > 91:
-			switch {
-			case data[p] > 92:
-				if 93 <= data[p] {
-					_widec = 2816 + (int16(data[p]) - 0)
-					if  data[p] == delim  {
+			case data[p] > 91:
+				switch {
+				case data[p] > 92:
+					if 93 <= data[p] {
+						_widec = 2816 + (int16(data[p]) - 0)
+						if data[p] == delim {
+							_widec += 256
+						}
+						if data[p] == sep {
+							_widec += 512
+						}
+					}
+				case data[p] >= 92:
+					_widec = 3840 + (int16(data[p]) - 0)
+					if data[p] == delim {
 						_widec += 256
 					}
-					if  data[p] == sep  {
+					if parser.escFlavor != backslashEscapeFlavorNone {
 						_widec += 512
 					}
+					if data[p] == sep {
+						_widec += 1024
+					}
 				}
-			case data[p] >= 92:
-				_widec = 3840 + (int16(data[p]) - 0)
-				if  data[p] == delim  {
+			default:
+				_widec = 2816 + (int16(data[p]) - 0)
+				if data[p] == delim {
 					_widec += 256
 				}
-				if  parser.escFlavor != backslashEscapeFlavorNone  {
+				if data[p] == sep {
 					_widec += 512
 				}
-				if  data[p] == sep  {
-					_widec += 1024
-				}
 			}
-		default:
-			_widec = 2816 + (int16(data[p]) - 0)
-			if  data[p] == delim  {
-				_widec += 256
-			}
-			if  data[p] == sep  {
-				_widec += 512
-			}
-		}
-		switch _widec {
-		case 10:
-			goto tr9
-		case 13:
-			goto tr9
-		case 3932:
-			goto tr9
-		case 4188:
-			goto tr10
-		case 4444:
-			goto tr12
-		case 4700:
-			goto tr12
-		case 4956:
-			goto tr9
-		case 5212:
-			goto tr11
-		case 5468:
-			goto tr13
-		case 5724:
-			goto tr13
-		}
-		switch {
-		case _widec < 3165:
-			switch {
-			case _widec < 2909:
-				switch {
-				case _widec < 2827:
-					if 2816 <= _widec && _widec <= 2825 {
-						goto tr9
-					}
-				case _widec > 2828:
-					if 2830 <= _widec && _widec <= 2907 {
-						goto tr9
-					}
-				default:
-					goto tr9
-				}
-			case _widec > 3071:
-				switch {
-				case _widec < 3083:
-					if 3072 <= _widec && _widec <= 3081 {
-						goto tr10
-					}
-				case _widec > 3084:
-					if 3086 <= _widec && _widec <= 3163 {
-						goto tr10
-					}
-				default:
-					goto tr10
-				}
-			default:
+			switch _widec {
+			case 10:
+				goto st2
+			case 13:
+				goto st2
+			case 3932:
 				goto tr9
+			case 4188:
+				goto tr3
+			case 4444:
+				goto st6
+			case 4700:
+				goto st17
+			case 4956:
+				goto st2
+			case 5212:
+				goto tr4
+			case 5468:
+				goto st7
+			case 5724:
+				goto st19
 			}
-		case _widec > 3327:
 			switch {
-			case _widec < 3421:
+			case _widec < 3165:
 				switch {
-				case _widec < 3339:
-					if 3328 <= _widec && _widec <= 3337 {
+				case _widec < 2909:
+					switch {
+					case _widec < 2827:
+						if 2816 <= _widec && _widec <= 2825 {
+							goto tr9
+						}
+					case _widec > 2828:
+						if 2830 <= _widec && _widec <= 2907 {
+							goto tr9
+						}
+					default:
 						goto tr9
 					}
-				case _widec > 3340:
-					if 3342 <= _widec && _widec <= 3419 {
-						goto tr9
+				case _widec > 3071:
+					switch {
+					case _widec < 3083:
+						if 3072 <= _widec && _widec <= 3081 {
+							goto tr3
+						}
+					case _widec > 3084:
+						if 3086 <= _widec && _widec <= 3163 {
+							goto tr3
+						}
+					default:
+						goto tr3
 					}
 				default:
 					goto tr9
 				}
-			case _widec > 3583:
+			case _widec > 3327:
 				switch {
-				case _widec < 3595:
-					if 3584 <= _widec && _widec <= 3593 {
-						goto tr11
+				case _widec < 3421:
+					switch {
+					case _widec < 3339:
+						if 3328 <= _widec && _widec <= 3337 {
+							goto st2
+						}
+					case _widec > 3340:
+						if 3342 <= _widec && _widec <= 3419 {
+							goto st2
+						}
+					default:
+						goto st2
 					}
-				case _widec > 3596:
+				case _widec > 3583:
 					switch {
-					case _widec > 3675:
-						if 3677 <= _widec && _widec <= 3839 {
-							goto tr11
+					case _widec < 3595:
+						if 3584 <= _widec && _widec <= 3593 {
+							goto tr4
 						}
-					case _widec >= 3598:
-						goto tr11
+					case _widec > 3596:
+						switch {
+						case _widec > 3675:
+							if 3677 <= _widec && _widec <= 3839 {
+								goto tr4
+							}
+						case _widec >= 3598:
+							goto tr4
+						}
+					default:
+						goto tr4
 					}
 				default:
-					goto tr11
+					goto st2
 				}
 			default:
-				goto tr9
+				goto tr3
 			}
-		default:
-			goto tr10
-		}
-		goto tr0
-tr9:
-//.... NONE:1
-te = p+1
-
-//.... lightning/mydump/csv_parser.rl:45
-act = 2;
-	goto st16
-	st16:
-		if p++; p == pe {
-			goto _test_eof16
-		}
-	st_case_16:
-//.... tmp_parser.go:1555
-		_widec = int16(data[p])
-		switch {
-		case data[p] < 14:
+			goto tr24
+		st6:
+			if p++; p == pe {
+				goto _test_eof6
+			}
+		st_case_6:
+			goto tr9
+		st17:
+			if p++; p == pe {
+				goto _test_eof17
+			}
+		st_case_17:
+			_widec = int16(data[p])
 			switch {
-			case data[p] > 9:
-				if 11 <= data[p] && data[p] <= 12 {
-					_widec = 2816 + (int16(data[p]) - 0)
-					if  data[p] == delim  {
+			case data[p] < 11:
+				if data[p] <= 9 {
+					_widec = 768 + (int16(data[p]) - 0)
+					if data[p] == delim {
 						_widec += 256
 					}
-					if  data[p] == sep  {
-						_widec += 512
-					}
 				}
-			default:
-				_widec = 2816 + (int16(data[p]) - 0)
-				if  data[p] == delim  {
-					_widec += 256
-				}
-				if  data[p] == sep  {
-					_widec += 512
-				}
-			}
-		case data[p] > 91:
-			switch {
-			case data[p] > 92:
-				if 93 <= data[p] {
-					_widec = 2816 + (int16(data[p]) - 0)
-					if  data[p] == delim  {
+			case data[p] > 12:
+				if 14 <= data[p] {
+					_widec = 768 + (int16(data[p]) - 0)
+					if data[p] == delim {
 						_widec += 256
 					}
-					if  data[p] == sep  {
-						_widec += 512
-					}
 				}
-			case data[p] >= 92:
-				_widec = 3840 + (int16(data[p]) - 0)
-				if  data[p] == delim  {
+			default:
+				_widec = 768 + (int16(data[p]) - 0)
+				if data[p] == delim {
 					_widec += 256
 				}
-				if  parser.escFlavor != backslashEscapeFlavorNone  {
-					_widec += 512
-				}
-				if  data[p] == sep  {
-					_widec += 1024
-				}
 			}
-		default:
-			_widec = 2816 + (int16(data[p]) - 0)
-			if  data[p] == delim  {
-				_widec += 256
-			}
-			if  data[p] == sep  {
-				_widec += 512
+			switch _widec {
+			case 10:
+				goto tr9
+			case 13:
+				goto tr9
 			}
-		}
-		switch _widec {
-		case 10:
-			goto st2
-		case 13:
-			goto st2
-		case 3932:
-			goto tr9
-		case 4188:
-			goto tr3
-		case 4444:
-			goto st6
-		case 4700:
-			goto st17
-		case 4956:
-			goto st2
-		case 5212:
-			goto tr4
-		case 5468:
-			goto st7
-		case 5724:
-			goto st19
-		}
-		switch {
-		case _widec < 3165:
 			switch {
-			case _widec < 2909:
+			case _widec < 782:
 				switch {
-				case _widec < 2827:
-					if 2816 <= _widec && _widec <= 2825 {
-						goto tr9
-					}
-				case _widec > 2828:
-					if 2830 <= _widec && _widec <= 2907 {
+				case _widec > 777:
+					if 779 <= _widec && _widec <= 780 {
 						goto tr9
 					}
-				default:
+				case _widec >= 768:
 					goto tr9
 				}
-			case _widec > 3071:
+			case _widec > 1033:
 				switch {
-				case _widec < 3083:
-					if 3072 <= _widec && _widec <= 3081 {
-						goto tr3
-					}
-				case _widec > 3084:
-					if 3086 <= _widec && _widec <= 3163 {
-						goto tr3
+				case _widec > 1036:
+					if 1038 <= _widec && _widec <= 1279 {
+						goto tr9
 					}
-				default:
-					goto tr3
+				case _widec >= 1035:
+					goto tr9
 				}
 			default:
 				goto tr9
 			}
-		case _widec > 3327:
+			goto tr24
+		st7:
+			if p++; p == pe {
+				goto _test_eof7
+			}
+		st_case_7:
+			_widec = int16(data[p])
 			switch {
-			case _widec < 3421:
-				switch {
-				case _widec < 3339:
-					if 3328 <= _widec && _widec <= 3337 {
-						goto st2
-					}
-				case _widec > 3340:
-					if 3342 <= _widec && _widec <= 3419 {
-						goto st2
-					}
-				default:
-					goto st2
-				}
-			case _widec > 3583:
+			case data[p] < 14:
 				switch {
-				case _widec < 3595:
-					if 3584 <= _widec && _widec <= 3593 {
-						goto tr4
-					}
-				case _widec > 3596:
-					switch {
-					case _widec > 3675:
-						if 3677 <= _widec && _widec <= 3839 {
-							goto tr4
+				case data[p] > 9:
+					if 11 <= data[p] && data[p] <= 12 {
+						_widec = 2816 + (int16(data[p]) - 0)
+						if data[p] == delim {
+							_widec += 256
+						}
+						if data[p] == sep {
+							_widec += 512
 						}
-					case _widec >= 3598:
-						goto tr4
 					}
 				default:
-					goto tr4
-				}
-			default:
-				goto st2
-			}
-		default:
-			goto tr3
-		}
-		goto tr24
-	st6:
-		if p++; p == pe {
-			goto _test_eof6
-		}
-	st_case_6:
-		goto tr9
-	st17:
-		if p++; p == pe {
-			goto _test_eof17
-		}
-	st_case_17:
-		_widec = int16(data[p])
-		switch {
-		case data[p] < 11:
-			if data[p] <= 9 {
-				_widec = 768 + (int16(data[p]) - 0)
-				if  data[p] == delim  {
-					_widec += 256
-				}
-			}
-		case data[p] > 12:
-			if 14 <= data[p] {
-				_widec = 768 + (int16(data[p]) - 0)
-				if  data[p] == delim  {
-					_widec += 256
-				}
-			}
-		default:
-			_widec = 768 + (int16(data[p]) - 0)
-			if  data[p] == delim  {
-				_widec += 256
-			}
-		}
-		switch _widec {
-		case 10:
-			goto tr9
-		case 13:
-			goto tr9
-		}
-		switch {
-		case _widec < 782:
-			switch {
-			case _widec > 777:
-				if 779 <= _widec && _widec <= 780 {
-					goto tr9
-				}
-			case _widec >= 768:
-				goto tr9
-			}
-		case _widec > 1033:
-			switch {
-			case _widec > 1036:
-				if 1038 <= _widec && _widec <= 1279 {
-					goto tr9
-				}
-			case _widec >= 1035:
-				goto tr9
-			}
-		default:
-			goto tr9
-		}
-		goto tr24
-	st7:
-		if p++; p == pe {
-			goto _test_eof7
-		}
-	st_case_7:
-		_widec = int16(data[p])
-		switch {
-		case data[p] < 14:
-			switch {
-			case data[p] > 9:
-				if 11 <= data[p] && data[p] <= 12 {
 					_widec = 2816 + (int16(data[p]) - 0)
-					if  data[p] == delim  {
+					if data[p] == delim {
 						_widec += 256
 					}
-					if  data[p] == sep  {
+					if data[p] == sep {
 						_widec += 512
 					}
 				}
-			default:
-				_widec = 2816 + (int16(data[p]) - 0)
-				if  data[p] == delim  {
-					_widec += 256
-				}
-				if  data[p] == sep  {
-					_widec += 512
-				}
-			}
-		case data[p] > 91:
-			switch {
-			case data[p] > 92:
-				if 93 <= data[p] {
-					_widec = 2816 + (int16(data[p]) - 0)
-					if  data[p] == delim  {
-						_widec += 256
-					}
-					if  data[p] == sep  {
-						_widec += 512
-					}
-				}
-			case data[p] >= 92:
-				_widec = 3840 + (int16(data[p]) - 0)
-				if  data[p] == delim  {
-					_widec += 256
-				}
-				if  parser.escFlavor != backslashEscapeFlavorNone  {
-					_widec += 512
-				}
-				if  data[p] == sep  {
-					_widec += 1024
-				}
-			}
-		default:
-			_widec = 2816 + (int16(data[p]) - 0)
-			if  data[p] == delim  {
-				_widec += 256
-			}
-			if  data[p] == sep  {
-				_widec += 512
-			}
-		}
-		switch _widec {
-		case 10:
-			goto tr9
-		case 13:
-			goto tr9
-		case 3932:
-			goto tr9
-		case 4188:
-			goto tr11
-		case 4444:
-			goto tr13
-		case 4700:
-			goto tr13
-		case 4956:
-			goto tr9
-		case 5212:
-			goto tr11
-		case 5468:
-			goto tr13
-		case 5724:
-			goto tr13
-		}
-		switch {
-		case _widec < 3165:
-			switch {
-			case _widec < 2909:
+			case data[p] > 91:
 				switch {
-				case _widec < 2827:
-					if 2816 <= _widec && _widec <= 2825 {
-						goto tr9
-					}
-				case _widec > 2828:
-					if 2830 <= _widec && _widec <= 2907 {
-						goto tr9
+				case data[p] > 92:
+					if 93 <= data[p] {
+						_widec = 2816 + (int16(data[p]) - 0)
+						if data[p] == delim {
+							_widec += 256
+						}
+						if data[p] == sep {
+							_widec += 512
+						}
 					}
-				default:
-					goto tr9
-				}
-			case _widec > 3071:
-				switch {
-				case _widec < 3083:
-					if 3072 <= _widec && _widec <= 3081 {
-						goto tr11
+				case data[p] >= 92:
+					_widec = 3840 + (int16(data[p]) - 0)
+					if data[p] == delim {
+						_widec += 256
 					}
-				case _widec > 3084:
-					if 3086 <= _widec && _widec <= 3163 {
-						goto tr11
+					if parser.escFlavor != backslashEscapeFlavorNone {
+						_widec += 512
+					}
+					if data[p] == sep {
+						_widec += 1024
 					}
-				default:
-					goto tr11
 				}
 			default:
+				_widec = 2816 + (int16(data[p]) - 0)
+				if data[p] == delim {
+					_widec += 256
+				}
+				if data[p] == sep {
+					_widec += 512
+				}
+			}
+			switch _widec {
+			case 10:
+				goto tr9
+			case 13:
+				goto tr9
+			case 3932:
 				goto tr9
+			case 4188:
+				goto tr11
+			case 4444:
+				goto tr13
+			case 4700:
+				goto tr13
+			case 4956:
+				goto tr9
+			case 5212:
+				goto tr11
+			case 5468:
+				goto tr13
+			case 5724:
+				goto tr13
 			}
-		case _widec > 3327:
 			switch {
-			case _widec < 3421:
+			case _widec < 3165:
 				switch {
-				case _widec < 3339:
-					if 3328 <= _widec && _widec <= 3337 {
+				case _widec < 2909:
+					switch {
+					case _widec < 2827:
+						if 2816 <= _widec && _widec <= 2825 {
+							goto tr9
+						}
+					case _widec > 2828:
+						if 2830 <= _widec && _widec <= 2907 {
+							goto tr9
+						}
+					default:
 						goto tr9
 					}
-				case _widec > 3340:
-					if 3342 <= _widec && _widec <= 3419 {
-						goto tr9
+				case _widec > 3071:
+					switch {
+					case _widec < 3083:
+						if 3072 <= _widec && _widec <= 3081 {
+							goto tr11
+						}
+					case _widec > 3084:
+						if 3086 <= _widec && _widec <= 3163 {
+							goto tr11
+						}
+					default:
+						goto tr11
 					}
 				default:
 					goto tr9
 				}
-			case _widec > 3583:
+			case _widec > 3327:
 				switch {
-				case _widec < 3595:
-					if 3584 <= _widec && _widec <= 3593 {
-						goto tr11
+				case _widec < 3421:
+					switch {
+					case _widec < 3339:
+						if 3328 <= _widec && _widec <= 3337 {
+							goto tr9
+						}
+					case _widec > 3340:
+						if 3342 <= _widec && _widec <= 3419 {
+							goto tr9
+						}
+					default:
+						goto tr9
 					}
-				case _widec > 3596:
+				case _widec > 3583:
 					switch {
-					case _widec > 3675:
-						if 3677 <= _widec && _widec <= 3839 {
+					case _widec < 3595:
+						if 3584 <= _widec && _widec <= 3593 {
+							goto tr11
+						}
+					case _widec > 3596:
+						switch {
+						case _widec > 3675:
+							if 3677 <= _widec && _widec <= 3839 {
+								goto tr11
+							}
+						case _widec >= 3598:
 							goto tr11
 						}
-					case _widec >= 3598:
+					default:
 						goto tr11
 					}
 				default:
-					goto tr11
+					goto tr9
 				}
 			default:
-				goto tr9
+				goto tr11
 			}
-		default:
-			goto tr11
-		}
-		goto tr14
-tr11:
-//.... NONE:1
-te = p+1
+			goto tr14
+		tr11:
+			//.... NONE:1
+			te = p + 1
 
-//.... lightning/mydump/csv_parser.rl:45
-act = 2;
-	goto st18
-	st18:
-		if p++; p == pe {
-			goto _test_eof18
-		}
-	st_case_18:
-//.... tmp_parser.go:1935
-		_widec = int16(data[p])
-		switch {
-		case data[p] < 14:
-			switch {
-			case data[p] > 9:
-				if 11 <= data[p] && data[p] <= 12 {
+			//.... lightning/mydump/csv_parser.rl:45
+			act = 2
+			goto st18
+		st18:
+			if p++; p == pe {
+				goto _test_eof18
+			}
+		st_case_18:
+			//.... tmp_parser.go:1935
+			_widec = int16(data[p])
+			switch {
+			case data[p] < 14:
+				switch {
+				case data[p] > 9:
+					if 11 <= data[p] && data[p] <= 12 {
+						_widec = 2816 + (int16(data[p]) - 0)
+						if data[p] == delim {
+							_widec += 256
+						}
+						if data[p] == sep {
+							_widec += 512
+						}
+					}
+				default:
 					_widec = 2816 + (int16(data[p]) - 0)
-					if  data[p] == delim  {
+					if data[p] == delim {
 						_widec += 256
 					}
-					if  data[p] == sep  {
+					if data[p] == sep {
 						_widec += 512
 					}
 				}
-			default:
-				_widec = 2816 + (int16(data[p]) - 0)
-				if  data[p] == delim  {
-					_widec += 256
-				}
-				if  data[p] == sep  {
-					_widec += 512
-				}
-			}
-		case data[p] > 91:
-			switch {
-			case data[p] > 92:
-				if 93 <= data[p] {
-					_widec = 2816 + (int16(data[p]) - 0)
-					if  data[p] == delim  {
+			case data[p] > 91:
+				switch {
+				case data[p] > 92:
+					if 93 <= data[p] {
+						_widec = 2816 + (int16(data[p]) - 0)
+						if data[p] == delim {
+							_widec += 256
+						}
+						if data[p] == sep {
+							_widec += 512
+						}
+					}
+				case data[p] >= 92:
+					_widec = 3840 + (int16(data[p]) - 0)
+					if data[p] == delim {
 						_widec += 256
 					}
-					if  data[p] == sep  {
+					if parser.escFlavor != backslashEscapeFlavorNone {
 						_widec += 512
 					}
+					if data[p] == sep {
+						_widec += 1024
+					}
 				}
-			case data[p] >= 92:
-				_widec = 3840 + (int16(data[p]) - 0)
-				if  data[p] == delim  {
+			default:
+				_widec = 2816 + (int16(data[p]) - 0)
+				if data[p] == delim {
 					_widec += 256
 				}
-				if  parser.escFlavor != backslashEscapeFlavorNone  {
+				if data[p] == sep {
 					_widec += 512
 				}
-				if  data[p] == sep  {
-					_widec += 1024
-				}
-			}
-		default:
-			_widec = 2816 + (int16(data[p]) - 0)
-			if  data[p] == delim  {
-				_widec += 256
 			}
-			if  data[p] == sep  {
-				_widec += 512
+			switch _widec {
+			case 10:
+				goto st2
+			case 13:
+				goto st2
+			case 3932:
+				goto tr9
+			case 4188:
+				goto tr4
+			case 4444:
+				goto st6
+			case 4700:
+				goto st19
+			case 4956:
+				goto st2
+			case 5212:
+				goto tr4
+			case 5468:
+				goto st7
+			case 5724:
+				goto st19
 			}
-		}
-		switch _widec {
-		case 10:
-			goto st2
-		case 13:
-			goto st2
-		case 3932:
-			goto tr9
-		case 4188:
-			goto tr4
-		case 4444:
-			goto st6
-		case 4700:
-			goto st19
-		case 4956:
-			goto st2
-		case 5212:
-			goto tr4
-		case 5468:
-			goto st7
-		case 5724:
-			goto st19
-		}
-		switch {
-		case _widec < 3165:
 			switch {
-			case _widec < 2909:
+			case _widec < 3165:
 				switch {
-				case _widec < 2827:
-					if 2816 <= _widec && _widec <= 2825 {
-						goto tr9
-					}
-				case _widec > 2828:
-					if 2830 <= _widec && _widec <= 2907 {
+				case _widec < 2909:
+					switch {
+					case _widec < 2827:
+						if 2816 <= _widec && _widec <= 2825 {
+							goto tr9
+						}
+					case _widec > 2828:
+						if 2830 <= _widec && _widec <= 2907 {
+							goto tr9
+						}
+					default:
 						goto tr9
 					}
-				default:
-					goto tr9
-				}
-			case _widec > 3071:
-				switch {
-				case _widec < 3083:
-					if 3072 <= _widec && _widec <= 3081 {
-						goto tr4
-					}
-				case _widec > 3084:
-					if 3086 <= _widec && _widec <= 3163 {
+				case _widec > 3071:
+					switch {
+					case _widec < 3083:
+						if 3072 <= _widec && _widec <= 3081 {
+							goto tr4
+						}
+					case _widec > 3084:
+						if 3086 <= _widec && _widec <= 3163 {
+							goto tr4
+						}
+					default:
 						goto tr4
 					}
 				default:
-					goto tr4
+					goto tr9
 				}
-			default:
-				goto tr9
-			}
-		case _widec > 3327:
-			switch {
-			case _widec < 3421:
+			case _widec > 3327:
 				switch {
-				case _widec < 3339:
-					if 3328 <= _widec && _widec <= 3337 {
-						goto st2
-					}
-				case _widec > 3340:
-					if 3342 <= _widec && _widec <= 3419 {
+				case _widec < 3421:
+					switch {
+					case _widec < 3339:
+						if 3328 <= _widec && _widec <= 3337 {
+							goto st2
+						}
+					case _widec > 3340:
+						if 3342 <= _widec && _widec <= 3419 {
+							goto st2
+						}
+					default:
 						goto st2
 					}
-				default:
-					goto st2
-				}
-			case _widec > 3583:
-				switch {
-				case _widec < 3595:
-					if 3584 <= _widec && _widec <= 3593 {
-						goto tr4
-					}
-				case _widec > 3596:
+				case _widec > 3583:
 					switch {
-					case _widec > 3675:
-						if 3677 <= _widec && _widec <= 3839 {
+					case _widec < 3595:
+						if 3584 <= _widec && _widec <= 3593 {
+							goto tr4
+						}
+					case _widec > 3596:
+						switch {
+						case _widec > 3675:
+							if 3677 <= _widec && _widec <= 3839 {
+								goto tr4
+							}
+						case _widec >= 3598:
 							goto tr4
 						}
-					case _widec >= 3598:
+					default:
 						goto tr4
 					}
 				default:
-					goto tr4
+					goto st2
 				}
 			default:
-				goto st2
+				goto tr4
 			}
-		default:
-			goto tr4
-		}
-		goto tr24
-	st19:
-		if p++; p == pe {
-			goto _test_eof19
-		}
-	st_case_19:
-		_widec = int16(data[p])
-		switch {
-		case data[p] < 14:
+			goto tr24
+		st19:
+			if p++; p == pe {
+				goto _test_eof19
+			}
+		st_case_19:
+			_widec = int16(data[p])
 			switch {
-			case data[p] > 9:
-				if 11 <= data[p] && data[p] <= 12 {
+			case data[p] < 14:
+				switch {
+				case data[p] > 9:
+					if 11 <= data[p] && data[p] <= 12 {
+						_widec = 2816 + (int16(data[p]) - 0)
+						if data[p] == delim {
+							_widec += 256
+						}
+						if data[p] == sep {
+							_widec += 512
+						}
+					}
+				default:
 					_widec = 2816 + (int16(data[p]) - 0)
-					if  data[p] == delim  {
+					if data[p] == delim {
 						_widec += 256
 					}
-					if  data[p] == sep  {
+					if data[p] == sep {
 						_widec += 512
 					}
 				}
-			default:
-				_widec = 2816 + (int16(data[p]) - 0)
-				if  data[p] == delim  {
-					_widec += 256
-				}
-				if  data[p] == sep  {
-					_widec += 512
-				}
-			}
-		case data[p] > 91:
-			switch {
-			case data[p] > 92:
-				if 93 <= data[p] {
-					_widec = 2816 + (int16(data[p]) - 0)
-					if  data[p] == delim  {
+			case data[p] > 91:
+				switch {
+				case data[p] > 92:
+					if 93 <= data[p] {
+						_widec = 2816 + (int16(data[p]) - 0)
+						if data[p] == delim {
+							_widec += 256
+						}
+						if data[p] == sep {
+							_widec += 512
+						}
+					}
+				case data[p] >= 92:
+					_widec = 3840 + (int16(data[p]) - 0)
+					if data[p] == delim {
 						_widec += 256
 					}
-					if  data[p] == sep  {
+					if parser.escFlavor != backslashEscapeFlavorNone {
 						_widec += 512
 					}
+					if data[p] == sep {
+						_widec += 1024
+					}
 				}
-			case data[p] >= 92:
-				_widec = 3840 + (int16(data[p]) - 0)
-				if  data[p] == delim  {
+			default:
+				_widec = 2816 + (int16(data[p]) - 0)
+				if data[p] == delim {
 					_widec += 256
 				}
-				if  parser.escFlavor != backslashEscapeFlavorNone  {
+				if data[p] == sep {
 					_widec += 512
 				}
-				if  data[p] == sep  {
-					_widec += 1024
-				}
-			}
-		default:
-			_widec = 2816 + (int16(data[p]) - 0)
-			if  data[p] == delim  {
-				_widec += 256
 			}
-			if  data[p] == sep  {
-				_widec += 512
-			}
-		}
-		switch _widec {
-		case 10:
-			goto tr9
-		case 13:
-			goto tr9
-		case 3932:
-			goto tr9
-		case 4188:
-			goto tr11
-		case 4444:
-			goto tr13
-		case 4700:
-			goto tr13
-		case 4956:
-			goto tr9
-		case 5212:
-			goto tr11
-		case 5468:
-			goto tr13
-		case 5724:
-			goto tr13
-		}
-		switch {
-		case _widec < 3165:
-			switch {
-			case _widec < 2909:
-				switch {
-				case _widec < 2827:
-					if 2816 <= _widec && _widec <= 2825 {
-						goto tr9
-					}
-				case _widec > 2828:
-					if 2830 <= _widec && _widec <= 2907 {
-						goto tr9
-					}
-				default:
-					goto tr9
-				}
-			case _widec > 3071:
-				switch {
-				case _widec < 3083:
-					if 3072 <= _widec && _widec <= 3081 {
-						goto tr11
-					}
-				case _widec > 3084:
-					if 3086 <= _widec && _widec <= 3163 {
-						goto tr11
-					}
-				default:
-					goto tr11
-				}
-			default:
+			switch _widec {
+			case 10:
+				goto tr9
+			case 13:
+				goto tr9
+			case 3932:
 				goto tr9
+			case 4188:
+				goto tr11
+			case 4444:
+				goto tr13
+			case 4700:
+				goto tr13
+			case 4956:
+				goto tr9
+			case 5212:
+				goto tr11
+			case 5468:
+				goto tr13
+			case 5724:
+				goto tr13
 			}
-		case _widec > 3327:
 			switch {
-			case _widec < 3421:
+			case _widec < 3165:
 				switch {
-				case _widec < 3339:
-					if 3328 <= _widec && _widec <= 3337 {
+				case _widec < 2909:
+					switch {
+					case _widec < 2827:
+						if 2816 <= _widec && _widec <= 2825 {
+							goto tr9
+						}
+					case _widec > 2828:
+						if 2830 <= _widec && _widec <= 2907 {
+							goto tr9
+						}
+					default:
 						goto tr9
 					}
-				case _widec > 3340:
-					if 3342 <= _widec && _widec <= 3419 {
-						goto tr9
+				case _widec > 3071:
+					switch {
+					case _widec < 3083:
+						if 3072 <= _widec && _widec <= 3081 {
+							goto tr11
+						}
+					case _widec > 3084:
+						if 3086 <= _widec && _widec <= 3163 {
+							goto tr11
+						}
+					default:
+						goto tr11
 					}
 				default:
 					goto tr9
 				}
-			case _widec > 3583:
+			case _widec > 3327:
 				switch {
-				case _widec < 3595:
-					if 3584 <= _widec && _widec <= 3593 {
-						goto tr11
+				case _widec < 3421:
+					switch {
+					case _widec < 3339:
+						if 3328 <= _widec && _widec <= 3337 {
+							goto tr9
+						}
+					case _widec > 3340:
+						if 3342 <= _widec && _widec <= 3419 {
+							goto tr9
+						}
+					default:
+						goto tr9
 					}
-				case _widec > 3596:
+				case _widec > 3583:
 					switch {
-					case _widec > 3675:
-						if 3677 <= _widec && _widec <= 3839 {
+					case _widec < 3595:
+						if 3584 <= _widec && _widec <= 3593 {
+							goto tr11
+						}
+					case _widec > 3596:
+						switch {
+						case _widec > 3675:
+							if 3677 <= _widec && _widec <= 3839 {
+								goto tr11
+							}
+						case _widec >= 3598:
 							goto tr11
 						}
-					case _widec >= 3598:
+					default:
 						goto tr11
 					}
 				default:
-					goto tr11
+					goto tr9
 				}
 			default:
-				goto tr9
+				goto tr11
 			}
-		default:
-			goto tr11
-		}
-		goto tr24
-tr13:
-//.... NONE:1
-te = p+1
+			goto tr24
+		tr13:
+			//.... NONE:1
+			te = p + 1
 
-//.... lightning/mydump/csv_parser.rl:45
-act = 2;
-	goto st20
-	st20:
-		if p++; p == pe {
-			goto _test_eof20
-		}
-	st_case_20:
-//.... tmp_parser.go:2253
-		_widec = int16(data[p])
-		switch {
-		case data[p] < 14:
-			switch {
-			case data[p] > 9:
-				if 11 <= data[p] && data[p] <= 12 {
+			//.... lightning/mydump/csv_parser.rl:45
+			act = 2
+			goto st20
+		st20:
+			if p++; p == pe {
+				goto _test_eof20
+			}
+		st_case_20:
+			//.... tmp_parser.go:2253
+			_widec = int16(data[p])
+			switch {
+			case data[p] < 14:
+				switch {
+				case data[p] > 9:
+					if 11 <= data[p] && data[p] <= 12 {
+						_widec = 2816 + (int16(data[p]) - 0)
+						if data[p] == delim {
+							_widec += 256
+						}
+						if data[p] == sep {
+							_widec += 512
+						}
+					}
+				default:
 					_widec = 2816 + (int16(data[p]) - 0)
-					if  data[p] == delim  {
+					if data[p] == delim {
 						_widec += 256
 					}
-					if  data[p] == sep  {
+					if data[p] == sep {
 						_widec += 512
 					}
 				}
-			default:
-				_widec = 2816 + (int16(data[p]) - 0)
-				if  data[p] == delim  {
-					_widec += 256
-				}
-				if  data[p] == sep  {
-					_widec += 512
-				}
-			}
-		case data[p] > 91:
-			switch {
-			case data[p] > 92:
-				if 93 <= data[p] {
-					_widec = 2816 + (int16(data[p]) - 0)
-					if  data[p] == delim  {
+			case data[p] > 91:
+				switch {
+				case data[p] > 92:
+					if 93 <= data[p] {
+						_widec = 2816 + (int16(data[p]) - 0)
+						if data[p] == delim {
+							_widec += 256
+						}
+						if data[p] == sep {
+							_widec += 512
+						}
+					}
+				case data[p] >= 92:
+					_widec = 3840 + (int16(data[p]) - 0)
+					if data[p] == delim {
 						_widec += 256
 					}
-					if  data[p] == sep  {
+					if parser.escFlavor != backslashEscapeFlavorNone {
 						_widec += 512
 					}
+					if data[p] == sep {
+						_widec += 1024
+					}
 				}
-			case data[p] >= 92:
-				_widec = 3840 + (int16(data[p]) - 0)
-				if  data[p] == delim  {
+			default:
+				_widec = 2816 + (int16(data[p]) - 0)
+				if data[p] == delim {
 					_widec += 256
 				}
-				if  parser.escFlavor != backslashEscapeFlavorNone  {
+				if data[p] == sep {
 					_widec += 512
 				}
-				if  data[p] == sep  {
-					_widec += 1024
-				}
-			}
-		default:
-			_widec = 2816 + (int16(data[p]) - 0)
-			if  data[p] == delim  {
-				_widec += 256
 			}
-			if  data[p] == sep  {
-				_widec += 512
+			switch _widec {
+			case 10:
+				goto st2
+			case 13:
+				goto st2
+			case 3932:
+				goto tr9
+			case 4188:
+				goto tr4
+			case 4444:
+				goto st7
+			case 4700:
+				goto st19
+			case 4956:
+				goto st2
+			case 5212:
+				goto tr4
+			case 5468:
+				goto st7
+			case 5724:
+				goto st19
 			}
-		}
-		switch _widec {
-		case 10:
-			goto st2
-		case 13:
-			goto st2
-		case 3932:
-			goto tr9
-		case 4188:
-			goto tr4
-		case 4444:
-			goto st7
-		case 4700:
-			goto st19
-		case 4956:
-			goto st2
-		case 5212:
-			goto tr4
-		case 5468:
-			goto st7
-		case 5724:
-			goto st19
-		}
-		switch {
-		case _widec < 3165:
 			switch {
-			case _widec < 2909:
+			case _widec < 3165:
 				switch {
-				case _widec < 2827:
-					if 2816 <= _widec && _widec <= 2825 {
-						goto tr9
-					}
-				case _widec > 2828:
-					if 2830 <= _widec && _widec <= 2907 {
+				case _widec < 2909:
+					switch {
+					case _widec < 2827:
+						if 2816 <= _widec && _widec <= 2825 {
+							goto tr9
+						}
+					case _widec > 2828:
+						if 2830 <= _widec && _widec <= 2907 {
+							goto tr9
+						}
+					default:
 						goto tr9
 					}
-				default:
-					goto tr9
-				}
-			case _widec > 3071:
-				switch {
-				case _widec < 3083:
-					if 3072 <= _widec && _widec <= 3081 {
-						goto tr4
-					}
-				case _widec > 3084:
-					if 3086 <= _widec && _widec <= 3163 {
+				case _widec > 3071:
+					switch {
+					case _widec < 3083:
+						if 3072 <= _widec && _widec <= 3081 {
+							goto tr4
+						}
+					case _widec > 3084:
+						if 3086 <= _widec && _widec <= 3163 {
+							goto tr4
+						}
+					default:
 						goto tr4
 					}
 				default:
-					goto tr4
-				}
-			default:
-				goto tr9
-			}
-		case _widec > 3327:
-			switch {
-			case _widec < 3421:
-				switch {
-				case _widec < 3339:
-					if 3328 <= _widec && _widec <= 3337 {
-						goto st2
-					}
-				case _widec > 3340:
-					if 3342 <= _widec && _widec <= 3419 {
-						goto st2
-					}
-				default:
-					goto st2
+					goto tr9
 				}
-			case _widec > 3583:
+			case _widec > 3327:
 				switch {
-				case _widec < 3595:
-					if 3584 <= _widec && _widec <= 3593 {
-						goto tr4
+				case _widec < 3421:
+					switch {
+					case _widec < 3339:
+						if 3328 <= _widec && _widec <= 3337 {
+							goto st2
+						}
+					case _widec > 3340:
+						if 3342 <= _widec && _widec <= 3419 {
+							goto st2
+						}
+					default:
+						goto st2
 					}
-				case _widec > 3596:
+				case _widec > 3583:
 					switch {
-					case _widec > 3675:
-						if 3677 <= _widec && _widec <= 3839 {
+					case _widec < 3595:
+						if 3584 <= _widec && _widec <= 3593 {
+							goto tr4
+						}
+					case _widec > 3596:
+						switch {
+						case _widec > 3675:
+							if 3677 <= _widec && _widec <= 3839 {
+								goto tr4
+							}
+						case _widec >= 3598:
 							goto tr4
 						}
-					case _widec >= 3598:
+					default:
 						goto tr4
 					}
 				default:
-					goto tr4
+					goto st2
 				}
 			default:
-				goto st2
+				goto tr4
 			}
-		default:
-			goto tr4
-		}
-		goto tr24
-tr10:
-//.... NONE:1
-te = p+1
+			goto tr24
+		tr10:
+			//.... NONE:1
+			te = p + 1
 
-//.... lightning/mydump/csv_parser.rl:45
-act = 2;
-	goto st21
-	st21:
-		if p++; p == pe {
-			goto _test_eof21
-		}
-	st_case_21:
-//.... tmp_parser.go:2416
-		_widec = int16(data[p])
-		switch {
-		case data[p] < 14:
-			switch {
-			case data[p] > 9:
-				if 11 <= data[p] && data[p] <= 12 {
+			//.... lightning/mydump/csv_parser.rl:45
+			act = 2
+			goto st21
+		st21:
+			if p++; p == pe {
+				goto _test_eof21
+			}
+		st_case_21:
+			//.... tmp_parser.go:2416
+			_widec = int16(data[p])
+			switch {
+			case data[p] < 14:
+				switch {
+				case data[p] > 9:
+					if 11 <= data[p] && data[p] <= 12 {
+						_widec = 2816 + (int16(data[p]) - 0)
+						if data[p] == delim {
+							_widec += 256
+						}
+						if data[p] == sep {
+							_widec += 512
+						}
+					}
+				default:
 					_widec = 2816 + (int16(data[p]) - 0)
-					if  data[p] == delim  {
+					if data[p] == delim {
 						_widec += 256
 					}
-					if  data[p] == sep  {
+					if data[p] == sep {
 						_widec += 512
 					}
 				}
-			default:
-				_widec = 2816 + (int16(data[p]) - 0)
-				if  data[p] == delim  {
-					_widec += 256
-				}
-				if  data[p] == sep  {
-					_widec += 512
-				}
-			}
-		case data[p] > 91:
-			switch {
-			case data[p] > 92:
-				if 93 <= data[p] {
-					_widec = 2816 + (int16(data[p]) - 0)
-					if  data[p] == delim  {
+			case data[p] > 91:
+				switch {
+				case data[p] > 92:
+					if 93 <= data[p] {
+						_widec = 2816 + (int16(data[p]) - 0)
+						if data[p] == delim {
+							_widec += 256
+						}
+						if data[p] == sep {
+							_widec += 512
+						}
+					}
+				case data[p] >= 92:
+					_widec = 3840 + (int16(data[p]) - 0)
+					if data[p] == delim {
 						_widec += 256
 					}
-					if  data[p] == sep  {
+					if parser.escFlavor != backslashEscapeFlavorNone {
 						_widec += 512
 					}
+					if data[p] == sep {
+						_widec += 1024
+					}
 				}
-			case data[p] >= 92:
-				_widec = 3840 + (int16(data[p]) - 0)
-				if  data[p] == delim  {
+			default:
+				_widec = 2816 + (int16(data[p]) - 0)
+				if data[p] == delim {
 					_widec += 256
 				}
-				if  parser.escFlavor != backslashEscapeFlavorNone  {
+				if data[p] == sep {
 					_widec += 512
 				}
-				if  data[p] == sep  {
-					_widec += 1024
-				}
-			}
-		default:
-			_widec = 2816 + (int16(data[p]) - 0)
-			if  data[p] == delim  {
-				_widec += 256
 			}
-			if  data[p] == sep  {
-				_widec += 512
+			switch _widec {
+			case 3932:
+				goto tr1
+			case 4188:
+				goto st2
+			case 4444:
+				goto st1
+			case 4700:
+				goto st5
+			case 5212:
+				goto st2
+			case 5468:
+				goto st1
+			case 5724:
+				goto st5
 			}
-		}
-		switch _widec {
-		case 3932:
-			goto tr1
-		case 4188:
-			goto st2
-		case 4444:
-			goto st1
-		case 4700:
-			goto st5
-		case 5212:
-			goto st2
-		case 5468:
-			goto st1
-		case 5724:
-			goto st5
-		}
-		switch {
-		case _widec < 3083:
 			switch {
-			case _widec < 2830:
+			case _widec < 3083:
 				switch {
-				case _widec > 2825:
-					if 2827 <= _widec && _widec <= 2828 {
+				case _widec < 2830:
+					switch {
+					case _widec > 2825:
+						if 2827 <= _widec && _widec <= 2828 {
+							goto tr1
+						}
+					case _widec >= 2816:
 						goto tr1
 					}
-				case _widec >= 2816:
-					goto tr1
-				}
-			case _widec > 2907:
-				switch {
-				case _widec > 3071:
-					if 3072 <= _widec && _widec <= 3081 {
-						goto st2
+				case _widec > 2907:
+					switch {
+					case _widec > 3071:
+						if 3072 <= _widec && _widec <= 3081 {
+							goto st2
+						}
+					case _widec >= 2909:
+						goto tr1
 					}
-				case _widec >= 2909:
+				default:
 					goto tr1
 				}
-			default:
-				goto tr1
-			}
-		case _widec > 3084:
-			switch {
-			case _widec < 3584:
-				switch {
-				case _widec > 3163:
-					if 3165 <= _widec && _widec <= 3327 {
-						goto st2
-					}
-				case _widec >= 3086:
-					goto st2
-				}
-			case _widec > 3593:
+			case _widec > 3084:
 				switch {
-				case _widec < 3598:
-					if 3595 <= _widec && _widec <= 3596 {
+				case _widec < 3584:
+					switch {
+					case _widec > 3163:
+						if 3165 <= _widec && _widec <= 3327 {
+							goto st2
+						}
+					case _widec >= 3086:
 						goto st2
 					}
-				case _widec > 3675:
-					if 3677 <= _widec && _widec <= 3839 {
+				case _widec > 3593:
+					switch {
+					case _widec < 3598:
+						if 3595 <= _widec && _widec <= 3596 {
+							goto st2
+						}
+					case _widec > 3675:
+						if 3677 <= _widec && _widec <= 3839 {
+							goto st2
+						}
+					default:
 						goto st2
 					}
 				default:
@@ -2537,152 +2569,152 @@ act = 2;
 			default:
 				goto st2
 			}
-		default:
-			goto st2
-		}
-		goto tr24
-tr12:
-//.... NONE:1
-te = p+1
+			goto tr24
+		tr12:
+			//.... NONE:1
+			te = p + 1
 
-//.... lightning/mydump/csv_parser.rl:45
-act = 2;
-	goto st22
-	st22:
-		if p++; p == pe {
-			goto _test_eof22
-		}
-	st_case_22:
-//.... tmp_parser.go:2556
-		_widec = int16(data[p])
-		switch {
-		case data[p] < 14:
-			switch {
-			case data[p] > 9:
-				if 11 <= data[p] && data[p] <= 12 {
+			//.... lightning/mydump/csv_parser.rl:45
+			act = 2
+			goto st22
+		st22:
+			if p++; p == pe {
+				goto _test_eof22
+			}
+		st_case_22:
+			//.... tmp_parser.go:2556
+			_widec = int16(data[p])
+			switch {
+			case data[p] < 14:
+				switch {
+				case data[p] > 9:
+					if 11 <= data[p] && data[p] <= 12 {
+						_widec = 2816 + (int16(data[p]) - 0)
+						if data[p] == delim {
+							_widec += 256
+						}
+						if data[p] == sep {
+							_widec += 512
+						}
+					}
+				default:
 					_widec = 2816 + (int16(data[p]) - 0)
-					if  data[p] == delim  {
+					if data[p] == delim {
 						_widec += 256
 					}
-					if  data[p] == sep  {
+					if data[p] == sep {
 						_widec += 512
 					}
 				}
-			default:
-				_widec = 2816 + (int16(data[p]) - 0)
-				if  data[p] == delim  {
-					_widec += 256
-				}
-				if  data[p] == sep  {
-					_widec += 512
-				}
-			}
-		case data[p] > 91:
-			switch {
-			case data[p] > 92:
-				if 93 <= data[p] {
-					_widec = 2816 + (int16(data[p]) - 0)
-					if  data[p] == delim  {
+			case data[p] > 91:
+				switch {
+				case data[p] > 92:
+					if 93 <= data[p] {
+						_widec = 2816 + (int16(data[p]) - 0)
+						if data[p] == delim {
+							_widec += 256
+						}
+						if data[p] == sep {
+							_widec += 512
+						}
+					}
+				case data[p] >= 92:
+					_widec = 3840 + (int16(data[p]) - 0)
+					if data[p] == delim {
 						_widec += 256
 					}
-					if  data[p] == sep  {
+					if parser.escFlavor != backslashEscapeFlavorNone {
 						_widec += 512
 					}
+					if data[p] == sep {
+						_widec += 1024
+					}
 				}
-			case data[p] >= 92:
-				_widec = 3840 + (int16(data[p]) - 0)
-				if  data[p] == delim  {
+			default:
+				_widec = 2816 + (int16(data[p]) - 0)
+				if data[p] == delim {
 					_widec += 256
 				}
-				if  parser.escFlavor != backslashEscapeFlavorNone  {
+				if data[p] == sep {
 					_widec += 512
 				}
-				if  data[p] == sep  {
-					_widec += 1024
-				}
-			}
-		default:
-			_widec = 2816 + (int16(data[p]) - 0)
-			if  data[p] == delim  {
-				_widec += 256
-			}
-			if  data[p] == sep  {
-				_widec += 512
 			}
-		}
-		switch _widec {
-		case 10:
-			goto st2
-		case 13:
-			goto st2
-		case 3932:
-			goto tr9
-		case 4188:
-			goto st2
-		case 4444:
-			goto st5
-		case 4700:
-			goto st5
-		case 4956:
-			goto st2
-		case 5212:
-			goto st2
-		case 5468:
-			goto st5
-		case 5724:
-			goto st5
-		}
-		switch {
-		case _widec < 3086:
-			switch {
-			case _widec < 2830:
-				switch {
-				case _widec > 2825:
-					if 2827 <= _widec && _widec <= 2828 {
-						goto tr9
-					}
-				case _widec >= 2816:
-					goto tr9
-				}
-			case _widec > 2907:
-				switch {
-				case _widec < 3072:
-					if 2909 <= _widec && _widec <= 3071 {
-						goto tr9
-					}
-				case _widec > 3081:
-					if 3083 <= _widec && _widec <= 3084 {
-						goto st2
-					}
-				default:
-					goto st2
-				}
-			default:
+			switch _widec {
+			case 10:
+				goto st2
+			case 13:
+				goto st2
+			case 3932:
 				goto tr9
+			case 4188:
+				goto st2
+			case 4444:
+				goto st5
+			case 4700:
+				goto st5
+			case 4956:
+				goto st2
+			case 5212:
+				goto st2
+			case 5468:
+				goto st5
+			case 5724:
+				goto st5
 			}
-		case _widec > 3163:
 			switch {
-			case _widec < 3421:
+			case _widec < 3086:
 				switch {
-				case _widec < 3339:
-					if 3165 <= _widec && _widec <= 3337 {
-						goto st2
+				case _widec < 2830:
+					switch {
+					case _widec > 2825:
+						if 2827 <= _widec && _widec <= 2828 {
+							goto tr9
+						}
+					case _widec >= 2816:
+						goto tr9
 					}
-				case _widec > 3340:
-					if 3342 <= _widec && _widec <= 3419 {
+				case _widec > 2907:
+					switch {
+					case _widec < 3072:
+						if 2909 <= _widec && _widec <= 3071 {
+							goto tr9
+						}
+					case _widec > 3081:
+						if 3083 <= _widec && _widec <= 3084 {
+							goto st2
+						}
+					default:
 						goto st2
 					}
 				default:
-					goto st2
+					goto tr9
 				}
-			case _widec > 3593:
+			case _widec > 3163:
 				switch {
-				case _widec < 3598:
-					if 3595 <= _widec && _widec <= 3596 {
+				case _widec < 3421:
+					switch {
+					case _widec < 3339:
+						if 3165 <= _widec && _widec <= 3337 {
+							goto st2
+						}
+					case _widec > 3340:
+						if 3342 <= _widec && _widec <= 3419 {
+							goto st2
+						}
+					default:
 						goto st2
 					}
-				case _widec > 3675:
-					if 3677 <= _widec && _widec <= 3839 {
+				case _widec > 3593:
+					switch {
+					case _widec < 3598:
+						if 3595 <= _widec && _widec <= 3596 {
+							goto st2
+						}
+					case _widec > 3675:
+						if 3677 <= _widec && _widec <= 3839 {
+							goto st2
+						}
+					default:
 						goto st2
 					}
 				default:
@@ -2691,253 +2723,302 @@ act = 2;
 			default:
 				goto st2
 			}
-		default:
-			goto st2
-		}
-		goto tr24
-	st23:
-		if p++; p == pe {
-			goto _test_eof23
-		}
-	st_case_23:
-		goto tr1
-	st24:
-		if p++; p == pe {
-			goto _test_eof24
-		}
-	st_case_24:
-		_widec = int16(data[p])
-		switch {
-		case data[p] < 14:
+			goto tr24
+		st23:
+			if p++; p == pe {
+				goto _test_eof23
+			}
+		st_case_23:
+			goto tr1
+		st24:
+			if p++; p == pe {
+				goto _test_eof24
+			}
+		st_case_24:
+			_widec = int16(data[p])
 			switch {
-			case data[p] > 9:
-				if 11 <= data[p] && data[p] <= 12 {
+			case data[p] < 14:
+				switch {
+				case data[p] > 9:
+					if 11 <= data[p] && data[p] <= 12 {
+						_widec = 2816 + (int16(data[p]) - 0)
+						if data[p] == delim {
+							_widec += 256
+						}
+						if data[p] == sep {
+							_widec += 512
+						}
+					}
+				default:
 					_widec = 2816 + (int16(data[p]) - 0)
-					if  data[p] == delim  {
+					if data[p] == delim {
 						_widec += 256
 					}
-					if  data[p] == sep  {
+					if data[p] == sep {
 						_widec += 512
 					}
 				}
-			default:
-				_widec = 2816 + (int16(data[p]) - 0)
-				if  data[p] == delim  {
-					_widec += 256
-				}
-				if  data[p] == sep  {
-					_widec += 512
-				}
-			}
-		case data[p] > 91:
-			switch {
-			case data[p] > 92:
-				if 93 <= data[p] {
-					_widec = 2816 + (int16(data[p]) - 0)
-					if  data[p] == delim  {
+			case data[p] > 91:
+				switch {
+				case data[p] > 92:
+					if 93 <= data[p] {
+						_widec = 2816 + (int16(data[p]) - 0)
+						if data[p] == delim {
+							_widec += 256
+						}
+						if data[p] == sep {
+							_widec += 512
+						}
+					}
+				case data[p] >= 92:
+					_widec = 3840 + (int16(data[p]) - 0)
+					if data[p] == delim {
 						_widec += 256
 					}
-					if  data[p] == sep  {
+					if parser.escFlavor != backslashEscapeFlavorNone {
 						_widec += 512
 					}
+					if data[p] == sep {
+						_widec += 1024
+					}
 				}
-			case data[p] >= 92:
-				_widec = 3840 + (int16(data[p]) - 0)
-				if  data[p] == delim  {
+			default:
+				_widec = 2816 + (int16(data[p]) - 0)
+				if data[p] == delim {
 					_widec += 256
 				}
-				if  parser.escFlavor != backslashEscapeFlavorNone  {
+				if data[p] == sep {
 					_widec += 512
 				}
-				if  data[p] == sep  {
-					_widec += 1024
-				}
 			}
-		default:
-			_widec = 2816 + (int16(data[p]) - 0)
-			if  data[p] == delim  {
-				_widec += 256
-			}
-			if  data[p] == sep  {
-				_widec += 512
-			}
-		}
-		switch _widec {
-		case 10:
-			goto tr9
-		case 13:
-			goto tr9
-		case 3932:
-			goto tr9
-		case 4188:
-			goto tr10
-		case 4444:
-			goto tr12
-		case 4700:
-			goto tr12
-		case 4956:
-			goto tr9
-		case 5212:
-			goto tr11
-		case 5468:
-			goto tr13
-		case 5724:
-			goto tr13
-		}
-		switch {
-		case _widec < 3165:
-			switch {
-			case _widec < 2909:
-				switch {
-				case _widec < 2827:
-					if 2816 <= _widec && _widec <= 2825 {
-						goto tr9
-					}
-				case _widec > 2828:
-					if 2830 <= _widec && _widec <= 2907 {
-						goto tr9
-					}
-				default:
-					goto tr9
-				}
-			case _widec > 3071:
-				switch {
-				case _widec < 3083:
-					if 3072 <= _widec && _widec <= 3081 {
-						goto tr10
-					}
-				case _widec > 3084:
-					if 3086 <= _widec && _widec <= 3163 {
-						goto tr10
-					}
-				default:
-					goto tr10
-				}
-			default:
+			switch _widec {
+			case 10:
+				goto tr9
+			case 13:
+				goto tr9
+			case 3932:
+				goto tr9
+			case 4188:
+				goto tr10
+			case 4444:
+				goto tr12
+			case 4700:
+				goto tr12
+			case 4956:
 				goto tr9
+			case 5212:
+				goto tr11
+			case 5468:
+				goto tr13
+			case 5724:
+				goto tr13
 			}
-		case _widec > 3327:
 			switch {
-			case _widec < 3421:
+			case _widec < 3165:
 				switch {
-				case _widec < 3339:
-					if 3328 <= _widec && _widec <= 3337 {
+				case _widec < 2909:
+					switch {
+					case _widec < 2827:
+						if 2816 <= _widec && _widec <= 2825 {
+							goto tr9
+						}
+					case _widec > 2828:
+						if 2830 <= _widec && _widec <= 2907 {
+							goto tr9
+						}
+					default:
 						goto tr9
 					}
-				case _widec > 3340:
-					if 3342 <= _widec && _widec <= 3419 {
-						goto tr9
+				case _widec > 3071:
+					switch {
+					case _widec < 3083:
+						if 3072 <= _widec && _widec <= 3081 {
+							goto tr10
+						}
+					case _widec > 3084:
+						if 3086 <= _widec && _widec <= 3163 {
+							goto tr10
+						}
+					default:
+						goto tr10
 					}
 				default:
 					goto tr9
 				}
-			case _widec > 3583:
+			case _widec > 3327:
 				switch {
-				case _widec < 3595:
-					if 3584 <= _widec && _widec <= 3593 {
-						goto tr11
+				case _widec < 3421:
+					switch {
+					case _widec < 3339:
+						if 3328 <= _widec && _widec <= 3337 {
+							goto tr9
+						}
+					case _widec > 3340:
+						if 3342 <= _widec && _widec <= 3419 {
+							goto tr9
+						}
+					default:
+						goto tr9
 					}
-				case _widec > 3596:
+				case _widec > 3583:
 					switch {
-					case _widec > 3675:
-						if 3677 <= _widec && _widec <= 3839 {
+					case _widec < 3595:
+						if 3584 <= _widec && _widec <= 3593 {
 							goto tr11
 						}
-					case _widec >= 3598:
+					case _widec > 3596:
+						switch {
+						case _widec > 3675:
+							if 3677 <= _widec && _widec <= 3839 {
+								goto tr11
+							}
+						case _widec >= 3598:
+							goto tr11
+						}
+					default:
 						goto tr11
 					}
 				default:
-					goto tr11
+					goto tr9
 				}
 			default:
-				goto tr9
+				goto tr10
 			}
-		default:
-			goto tr10
-		}
-		goto tr25
-	st_out:
-	_test_eof8: cs = 8; goto _test_eof
-	_test_eof9: cs = 9; goto _test_eof
-	_test_eof10: cs = 10; goto _test_eof
-	_test_eof1: cs = 1; goto _test_eof
-	_test_eof2: cs = 2; goto _test_eof
-	_test_eof11: cs = 11; goto _test_eof
-	_test_eof12: cs = 12; goto _test_eof
-	_test_eof3: cs = 3; goto _test_eof
-	_test_eof13: cs = 13; goto _test_eof
-	_test_eof4: cs = 4; goto _test_eof
-	_test_eof14: cs = 14; goto _test_eof
-	_test_eof15: cs = 15; goto _test_eof
-	_test_eof5: cs = 5; goto _test_eof
-	_test_eof16: cs = 16; goto _test_eof
-	_test_eof6: cs = 6; goto _test_eof
-	_test_eof17: cs = 17; goto _test_eof
-	_test_eof7: cs = 7; goto _test_eof
-	_test_eof18: cs = 18; goto _test_eof
-	_test_eof19: cs = 19; goto _test_eof
-	_test_eof20: cs = 20; goto _test_eof
-	_test_eof21: cs = 21; goto _test_eof
-	_test_eof22: cs = 22; goto _test_eof
-	_test_eof23: cs = 23; goto _test_eof
-	_test_eof24: cs = 24; goto _test_eof
-
-	_test_eof: {}
-	if p == eof {
-		switch cs {
-		case 9:
-			goto tr23
-		case 10:
-			goto tr24
-		case 1:
-			goto tr0
-		case 2:
-			goto tr0
-		case 11:
-			goto tr24
-		case 12:
-			goto tr24
-		case 3:
-			goto tr0
-		case 13:
-			goto tr24
-		case 4:
-			goto tr0
-		case 14:
-			goto tr24
-		case 15:
-			goto tr25
-		case 5:
-			goto tr0
-		case 16:
-			goto tr24
-		case 6:
-			goto tr14
-		case 17:
-			goto tr24
-		case 7:
-			goto tr14
-		case 18:
-			goto tr24
-		case 19:
-			goto tr24
-		case 20:
-			goto tr24
-		case 21:
-			goto tr24
-		case 22:
-			goto tr24
-		case 23:
-			goto tr25
-		case 24:
 			goto tr25
-		}
-	}
+		st_out:
+		_test_eof8:
+			cs = 8
+			goto _test_eof
+		_test_eof9:
+			cs = 9
+			goto _test_eof
+		_test_eof10:
+			cs = 10
+			goto _test_eof
+		_test_eof1:
+			cs = 1
+			goto _test_eof
+		_test_eof2:
+			cs = 2
+			goto _test_eof
+		_test_eof11:
+			cs = 11
+			goto _test_eof
+		_test_eof12:
+			cs = 12
+			goto _test_eof
+		_test_eof3:
+			cs = 3
+			goto _test_eof
+		_test_eof13:
+			cs = 13
+			goto _test_eof
+		_test_eof4:
+			cs = 4
+			goto _test_eof
+		_test_eof14:
+			cs = 14
+			goto _test_eof
+		_test_eof15:
+			cs = 15
+			goto _test_eof
+		_test_eof5:
+			cs = 5
+			goto _test_eof
+		_test_eof16:
+			cs = 16
+			goto _test_eof
+		_test_eof6:
+			cs = 6
+			goto _test_eof
+		_test_eof17:
+			cs = 17
+			goto _test_eof
+		_test_eof7:
+			cs = 7
+			goto _test_eof
+		_test_eof18:
+			cs = 18
+			goto _test_eof
+		_test_eof19:
+			cs = 19
+			goto _test_eof
+		_test_eof20:
+			cs = 20
+			goto _test_eof
+		_test_eof21:
+			cs = 21
+			goto _test_eof
+		_test_eof22:
+			cs = 22
+			goto _test_eof
+		_test_eof23:
+			cs = 23
+			goto _test_eof
+		_test_eof24:
+			cs = 24
+			goto _test_eof
 
-	_out: {}
-	}
+		_test_eof:
+			{
+			}
+			if p == eof {
+				switch cs {
+				case 9:
+					goto tr23
+				case 10:
+					goto tr24
+				case 1:
+					goto tr0
+				case 2:
+					goto tr0
+				case 11:
+					goto tr24
+				case 12:
+					goto tr24
+				case 3:
+					goto tr0
+				case 13:
+					goto tr24
+				case 4:
+					goto tr0
+				case 14:
+					goto tr24
+				case 15:
+					goto tr25
+				case 5:
+					goto tr0
+				case 16:
+					goto tr24
+				case 6:
+					goto tr14
+				case 17:
+					goto tr24
+				case 7:
+					goto tr14
+				case 18:
+					goto tr24
+				case 19:
+					goto tr24
+				case 20:
+					goto tr24
+				case 21:
+					goto tr24
+				case 22:
+					goto tr24
+				case 23:
+					goto tr25
+				case 24:
+					goto tr25
+				}
+			}
+
+		_out:
+			{
+			}
+		}
 
-//.... lightning/mydump/csv_parser.rl:81
+		//.... lightning/mydump/csv_parser.rl:81
 
 		if cs == 0 {
 			parser.logSyntaxError()
diff --git a/lightning/mydump/parser_generated.go b/lightning/mydump/parser_generated.go
index 0d20eecfc..6b446cc66 100644
--- a/lightning/mydump/parser_generated.go
+++ b/lightning/mydump/parser_generated.go
@@ -29,11 +29,8 @@ import (
 	"github.com/pingcap/errors"
 )
 
-
 //.... lightning/mydump/parser.rl:137
 
-
-
 //.... tmp_parser.go:37
 const chunk_parser_start int = 21
 const chunk_parser_first_final int = 21
@@ -41,21 +38,20 @@ const chunk_parser_error int = 0
 
 const chunk_parser_en_main int = 21
 
-
 //.... lightning/mydump/parser.rl:140
 
 func (parser *ChunkParser) lex() (token, []byte, error) {
 	var cs, ts, te, act, p int
-	
-//.... tmp_parser.go:50
+
+	//.... tmp_parser.go:50
 	{
-	cs = chunk_parser_start
-	ts = 0
-	te = 0
-	act = 0
+		cs = chunk_parser_start
+		ts = 0
+		te = 0
+		act = 0
 	}
 
-//.... lightning/mydump/parser.rl:144
+	//.... lightning/mydump/parser.rl:144
 
 	for {
 		data := parser.buf
@@ -66,2203 +62,2422 @@ func (parser *ChunkParser) lex() (token, []byte, error) {
 			eof = pe
 		}
 
-		
-//.... tmp_parser.go:70
-	{
-	var _widec int16
-	if p == pe {
-		goto _test_eof
-	}
-	switch cs {
-	case 21:
-		goto st_case_21
-	case 22:
-		goto st_case_22
-	case 1:
-		goto st_case_1
-	case 2:
-		goto st_case_2
-	case 23:
-		goto st_case_23
-	case 3:
-		goto st_case_3
-	case 0:
-		goto st_case_0
-	case 4:
-		goto st_case_4
-	case 5:
-		goto st_case_5
-	case 24:
-		goto st_case_24
-	case 6:
-		goto st_case_6
-	case 25:
-		goto st_case_25
-	case 26:
-		goto st_case_26
-	case 27:
-		goto st_case_27
-	case 28:
-		goto st_case_28
-	case 7:
-		goto st_case_7
-	case 8:
-		goto st_case_8
-	case 9:
-		goto st_case_9
-	case 29:
-		goto st_case_29
-	case 30:
-		goto st_case_30
-	case 31:
-		goto st_case_31
-	case 32:
-		goto st_case_32
-	case 10:
-		goto st_case_10
-	case 33:
-		goto st_case_33
-	case 34:
-		goto st_case_34
-	case 35:
-		goto st_case_35
-	case 36:
-		goto st_case_36
-	case 37:
-		goto st_case_37
-	case 38:
-		goto st_case_38
-	case 39:
-		goto st_case_39
-	case 40:
-		goto st_case_40
-	case 41:
-		goto st_case_41
-	case 42:
-		goto st_case_42
-	case 43:
-		goto st_case_43
-	case 44:
-		goto st_case_44
-	case 45:
-		goto st_case_45
-	case 46:
-		goto st_case_46
-	case 47:
-		goto st_case_47
-	case 48:
-		goto st_case_48
-	case 49:
-		goto st_case_49
-	case 50:
-		goto st_case_50
-	case 51:
-		goto st_case_51
-	case 52:
-		goto st_case_52
-	case 53:
-		goto st_case_53
-	case 54:
-		goto st_case_54
-	case 11:
-		goto st_case_11
-	case 12:
-		goto st_case_12
-	case 13:
-		goto st_case_13
-	case 14:
-		goto st_case_14
-	case 15:
-		goto st_case_15
-	case 16:
-		goto st_case_16
-	case 17:
-		goto st_case_17
-	case 18:
-		goto st_case_18
-	case 55:
-		goto st_case_55
-	case 56:
-		goto st_case_56
-	case 57:
-		goto st_case_57
-	case 58:
-		goto st_case_58
-	case 59:
-		goto st_case_59
-	case 60:
-		goto st_case_60
-	case 19:
-		goto st_case_19
-	case 20:
-		goto st_case_20
-	case 61:
-		goto st_case_61
-	}
-	goto st_out
-tr4:
-//.... NONE:1
-	switch act {
-	case 0:
-	{{goto st0 }}
-	case 4:
-	{p = (te) - 1
+		//.... tmp_parser.go:70
+		{
+			var _widec int16
+			if p == pe {
+				goto _test_eof
+			}
+			switch cs {
+			case 21:
+				goto st_case_21
+			case 22:
+				goto st_case_22
+			case 1:
+				goto st_case_1
+			case 2:
+				goto st_case_2
+			case 23:
+				goto st_case_23
+			case 3:
+				goto st_case_3
+			case 0:
+				goto st_case_0
+			case 4:
+				goto st_case_4
+			case 5:
+				goto st_case_5
+			case 24:
+				goto st_case_24
+			case 6:
+				goto st_case_6
+			case 25:
+				goto st_case_25
+			case 26:
+				goto st_case_26
+			case 27:
+				goto st_case_27
+			case 28:
+				goto st_case_28
+			case 7:
+				goto st_case_7
+			case 8:
+				goto st_case_8
+			case 9:
+				goto st_case_9
+			case 29:
+				goto st_case_29
+			case 30:
+				goto st_case_30
+			case 31:
+				goto st_case_31
+			case 32:
+				goto st_case_32
+			case 10:
+				goto st_case_10
+			case 33:
+				goto st_case_33
+			case 34:
+				goto st_case_34
+			case 35:
+				goto st_case_35
+			case 36:
+				goto st_case_36
+			case 37:
+				goto st_case_37
+			case 38:
+				goto st_case_38
+			case 39:
+				goto st_case_39
+			case 40:
+				goto st_case_40
+			case 41:
+				goto st_case_41
+			case 42:
+				goto st_case_42
+			case 43:
+				goto st_case_43
+			case 44:
+				goto st_case_44
+			case 45:
+				goto st_case_45
+			case 46:
+				goto st_case_46
+			case 47:
+				goto st_case_47
+			case 48:
+				goto st_case_48
+			case 49:
+				goto st_case_49
+			case 50:
+				goto st_case_50
+			case 51:
+				goto st_case_51
+			case 52:
+				goto st_case_52
+			case 53:
+				goto st_case_53
+			case 54:
+				goto st_case_54
+			case 11:
+				goto st_case_11
+			case 12:
+				goto st_case_12
+			case 13:
+				goto st_case_13
+			case 14:
+				goto st_case_14
+			case 15:
+				goto st_case_15
+			case 16:
+				goto st_case_16
+			case 17:
+				goto st_case_17
+			case 18:
+				goto st_case_18
+			case 55:
+				goto st_case_55
+			case 56:
+				goto st_case_56
+			case 57:
+				goto st_case_57
+			case 58:
+				goto st_case_58
+			case 59:
+				goto st_case_59
+			case 60:
+				goto st_case_60
+			case 19:
+				goto st_case_19
+			case 20:
+				goto st_case_20
+			case 61:
+				goto st_case_61
+			}
+			goto st_out
+		tr4:
+			//.... NONE:1
+			switch act {
+			case 0:
+				{
+					{
+						goto st0
+					}
+				}
+			case 4:
+				{
+					p = (te) - 1
 
-		consumedToken = tokValues
-		{p++; cs = 21; goto _out }
-	}
-	case 5:
-	{p = (te) - 1
+					consumedToken = tokValues
+					{
+						p++
+						cs = 21
+						goto _out
+					}
+				}
+			case 5:
+				{
+					p = (te) - 1
 
-		consumedToken = tokNull
-		{p++; cs = 21; goto _out }
-	}
-	case 6:
-	{p = (te) - 1
+					consumedToken = tokNull
+					{
+						p++
+						cs = 21
+						goto _out
+					}
+				}
+			case 6:
+				{
+					p = (te) - 1
 
-		consumedToken = tokTrue
-		{p++; cs = 21; goto _out }
-	}
-	case 7:
-	{p = (te) - 1
+					consumedToken = tokTrue
+					{
+						p++
+						cs = 21
+						goto _out
+					}
+				}
+			case 7:
+				{
+					p = (te) - 1
 
-		consumedToken = tokFalse
-		{p++; cs = 21; goto _out }
-	}
-	case 9:
-	{p = (te) - 1
+					consumedToken = tokFalse
+					{
+						p++
+						cs = 21
+						goto _out
+					}
+				}
+			case 9:
+				{
+					p = (te) - 1
 
-		consumedToken = tokHexString
-		{p++; cs = 21; goto _out }
-	}
-	case 10:
-	{p = (te) - 1
+					consumedToken = tokHexString
+					{
+						p++
+						cs = 21
+						goto _out
+					}
+				}
+			case 10:
+				{
+					p = (te) - 1
 
-		consumedToken = tokBinString
-		{p++; cs = 21; goto _out }
-	}
-	case 11:
-	{p = (te) - 1
+					consumedToken = tokBinString
+					{
+						p++
+						cs = 21
+						goto _out
+					}
+				}
+			case 11:
+				{
+					p = (te) - 1
 
-		consumedToken = tokSingleQuoted
-		{p++; cs = 21; goto _out }
-	}
-	case 12:
-	{p = (te) - 1
+					consumedToken = tokSingleQuoted
+					{
+						p++
+						cs = 21
+						goto _out
+					}
+				}
+			case 12:
+				{
+					p = (te) - 1
 
-		consumedToken = tokDoubleQuoted
-		{p++; cs = 21; goto _out }
-	}
-	case 13:
-	{p = (te) - 1
+					consumedToken = tokDoubleQuoted
+					{
+						p++
+						cs = 21
+						goto _out
+					}
+				}
+			case 13:
+				{
+					p = (te) - 1
 
-		consumedToken = tokBackQuoted
-		{p++; cs = 21; goto _out }
-	}
-	case 14:
-	{p = (te) - 1
+					consumedToken = tokBackQuoted
+					{
+						p++
+						cs = 21
+						goto _out
+					}
+				}
+			case 14:
+				{
+					p = (te) - 1
 
-		consumedToken = tokUnquoted
-		{p++; cs = 21; goto _out }
-	}
-	}
-	
-	goto st21
-tr10:
-//.... lightning/mydump/parser.rl:68
-te = p+1
+					consumedToken = tokUnquoted
+					{
+						p++
+						cs = 21
+						goto _out
+					}
+				}
+			}
 
-	goto st21
-tr11:
-//.... lightning/mydump/parser.rl:130
-p = (te) - 1
-{
-		consumedToken = tokUnquoted
-		{p++; cs = 21; goto _out }
-	}
-	goto st21
-tr12:
-//.... lightning/mydump/parser.rl:110
-te = p+1
-{
-		consumedToken = tokBinString
-		{p++; cs = 21; goto _out }
-	}
-	goto st21
-tr21:
-//.... lightning/mydump/parser.rl:105
-te = p+1
-{
-		consumedToken = tokHexString
-		{p++; cs = 21; goto _out }
-	}
-	goto st21
-tr28:
-//.... lightning/mydump/parser.rl:70
-te = p+1
-{
-		consumedToken = tokRowBegin
-		{p++; cs = 21; goto _out }
-	}
-	goto st21
-tr29:
-//.... lightning/mydump/parser.rl:75
-te = p+1
-{
-		consumedToken = tokRowEnd
-		{p++; cs = 21; goto _out }
-	}
-	goto st21
-tr42:
-//.... lightning/mydump/parser.rl:120
-te = p
-p--
-{
-		consumedToken = tokDoubleQuoted
-		{p++; cs = 21; goto _out }
-	}
-	goto st21
-tr43:
-//.... lightning/mydump/parser.rl:115
-te = p
-p--
-{
-		consumedToken = tokSingleQuoted
-		{p++; cs = 21; goto _out }
-	}
-	goto st21
-tr44:
-//.... lightning/mydump/parser.rl:130
-te = p
-p--
-{
-		consumedToken = tokUnquoted
-		{p++; cs = 21; goto _out }
-	}
-	goto st21
-tr46:
-//.... lightning/mydump/parser.rl:68
-te = p
-p--
+			goto st21
+		tr10:
+			//.... lightning/mydump/parser.rl:68
+			te = p + 1
 
-	goto st21
-tr48:
-//.... lightning/mydump/parser.rl:100
-te = p
-p--
-{
-		consumedToken = tokInteger
-		{p++; cs = 21; goto _out }
-	}
-	goto st21
-tr79:
-//.... lightning/mydump/parser.rl:125
-te = p
-p--
-{
-		consumedToken = tokBackQuoted
-		{p++; cs = 21; goto _out }
-	}
-	goto st21
-	st21:
-//.... NONE:1
-ts = 0
+			goto st21
+		tr11:
+			//.... lightning/mydump/parser.rl:130
+			p = (te) - 1
+			{
+				consumedToken = tokUnquoted
+				{
+					p++
+					cs = 21
+					goto _out
+				}
+			}
+			goto st21
+		tr12:
+			//.... lightning/mydump/parser.rl:110
+			te = p + 1
+			{
+				consumedToken = tokBinString
+				{
+					p++
+					cs = 21
+					goto _out
+				}
+			}
+			goto st21
+		tr21:
+			//.... lightning/mydump/parser.rl:105
+			te = p + 1
+			{
+				consumedToken = tokHexString
+				{
+					p++
+					cs = 21
+					goto _out
+				}
+			}
+			goto st21
+		tr28:
+			//.... lightning/mydump/parser.rl:70
+			te = p + 1
+			{
+				consumedToken = tokRowBegin
+				{
+					p++
+					cs = 21
+					goto _out
+				}
+			}
+			goto st21
+		tr29:
+			//.... lightning/mydump/parser.rl:75
+			te = p + 1
+			{
+				consumedToken = tokRowEnd
+				{
+					p++
+					cs = 21
+					goto _out
+				}
+			}
+			goto st21
+		tr42:
+			//.... lightning/mydump/parser.rl:120
+			te = p
+			p--
+			{
+				consumedToken = tokDoubleQuoted
+				{
+					p++
+					cs = 21
+					goto _out
+				}
+			}
+			goto st21
+		tr43:
+			//.... lightning/mydump/parser.rl:115
+			te = p
+			p--
+			{
+				consumedToken = tokSingleQuoted
+				{
+					p++
+					cs = 21
+					goto _out
+				}
+			}
+			goto st21
+		tr44:
+			//.... lightning/mydump/parser.rl:130
+			te = p
+			p--
+			{
+				consumedToken = tokUnquoted
+				{
+					p++
+					cs = 21
+					goto _out
+				}
+			}
+			goto st21
+		tr46:
+			//.... lightning/mydump/parser.rl:68
+			te = p
+			p--
+
+			goto st21
+		tr48:
+			//.... lightning/mydump/parser.rl:100
+			te = p
+			p--
+			{
+				consumedToken = tokInteger
+				{
+					p++
+					cs = 21
+					goto _out
+				}
+			}
+			goto st21
+		tr79:
+			//.... lightning/mydump/parser.rl:125
+			te = p
+			p--
+			{
+				consumedToken = tokBackQuoted
+				{
+					p++
+					cs = 21
+					goto _out
+				}
+			}
+			goto st21
+		st21:
+			//.... NONE:1
+			ts = 0
 
-//.... NONE:1
-act = 0
+			//.... NONE:1
+			act = 0
 
-		if p++; p == pe {
-			goto _test_eof21
-		}
-	st_case_21:
-//.... NONE:1
-ts = p
+			if p++; p == pe {
+				goto _test_eof21
+			}
+		st_case_21:
+			//.... NONE:1
+			ts = p
 
-//.... tmp_parser.go:381
-		switch data[p] {
-		case 32:
-			goto tr10
-		case 34:
-			goto st1
-		case 39:
-			goto st4
-		case 40:
-			goto tr28
-		case 41:
-			goto tr29
-		case 42:
-			goto st0
-		case 44:
-			goto tr10
-		case 45:
-			goto st25
-		case 47:
-			goto st7
-		case 48:
-			goto st29
-		case 59:
-			goto tr10
-		case 66:
-			goto tr34
-		case 67:
-			goto st33
-		case 70:
-			goto st40
-		case 78:
-			goto st44
-		case 84:
-			goto st47
-		case 85:
-			goto st50
-		case 86:
-			goto st55
-		case 88:
-			goto tr41
-		case 96:
-			goto st20
-		case 98:
-			goto tr34
-		case 99:
-			goto st33
-		case 102:
-			goto st40
-		case 110:
-			goto st44
-		case 116:
-			goto st47
-		case 117:
-			goto st50
-		case 118:
-			goto st55
-		case 120:
-			goto tr41
-		}
-		switch {
-		case data[p] > 13:
-			if 49 <= data[p] && data[p] <= 57 {
-				goto st28
+			//.... tmp_parser.go:381
+			switch data[p] {
+			case 32:
+				goto tr10
+			case 34:
+				goto st1
+			case 39:
+				goto st4
+			case 40:
+				goto tr28
+			case 41:
+				goto tr29
+			case 42:
+				goto st0
+			case 44:
+				goto tr10
+			case 45:
+				goto st25
+			case 47:
+				goto st7
+			case 48:
+				goto st29
+			case 59:
+				goto tr10
+			case 66:
+				goto tr34
+			case 67:
+				goto st33
+			case 70:
+				goto st40
+			case 78:
+				goto st44
+			case 84:
+				goto st47
+			case 85:
+				goto st50
+			case 86:
+				goto st55
+			case 88:
+				goto tr41
+			case 96:
+				goto st20
+			case 98:
+				goto tr34
+			case 99:
+				goto st33
+			case 102:
+				goto st40
+			case 110:
+				goto st44
+			case 116:
+				goto st47
+			case 117:
+				goto st50
+			case 118:
+				goto st55
+			case 120:
+				goto tr41
 			}
-		case data[p] >= 9:
-			goto tr10
-		}
-		goto tr25
-tr25:
-//.... NONE:1
-te = p+1
+			switch {
+			case data[p] > 13:
+				if 49 <= data[p] && data[p] <= 57 {
+					goto st28
+				}
+			case data[p] >= 9:
+				goto tr10
+			}
+			goto tr25
+		tr25:
+			//.... NONE:1
+			te = p + 1
 
-//.... lightning/mydump/parser.rl:130
-act = 14;
-	goto st22
-tr62:
-//.... NONE:1
-te = p+1
+			//.... lightning/mydump/parser.rl:130
+			act = 14
+			goto st22
+		tr62:
+			//.... NONE:1
+			te = p + 1
 
-//.... lightning/mydump/parser.rl:95
-act = 7;
-	goto st22
-tr65:
-//.... NONE:1
-te = p+1
+			//.... lightning/mydump/parser.rl:95
+			act = 7
+			goto st22
+		tr65:
+			//.... NONE:1
+			te = p + 1
 
-//.... lightning/mydump/parser.rl:85
-act = 5;
-	goto st22
-tr68:
-//.... NONE:1
-te = p+1
+			//.... lightning/mydump/parser.rl:85
+			act = 5
+			goto st22
+		tr68:
+			//.... NONE:1
+			te = p + 1
 
-//.... lightning/mydump/parser.rl:90
-act = 6;
-	goto st22
-tr78:
-//.... NONE:1
-te = p+1
+			//.... lightning/mydump/parser.rl:90
+			act = 6
+			goto st22
+		tr78:
+			//.... NONE:1
+			te = p + 1
 
-//.... lightning/mydump/parser.rl:80
-act = 4;
-	goto st22
-	st22:
-		if p++; p == pe {
-			goto _test_eof22
-		}
-	st_case_22:
-//.... tmp_parser.go:489
-		switch data[p] {
-		case 32:
-			goto tr4
-		case 34:
-			goto tr4
-		case 44:
-			goto tr4
-		case 47:
-			goto tr4
-		case 59:
-			goto tr4
-		case 96:
-			goto tr4
-		}
-		switch {
-		case data[p] > 13:
-			if 39 <= data[p] && data[p] <= 42 {
+			//.... lightning/mydump/parser.rl:80
+			act = 4
+			goto st22
+		st22:
+			if p++; p == pe {
+				goto _test_eof22
+			}
+		st_case_22:
+			//.... tmp_parser.go:489
+			switch data[p] {
+			case 32:
+				goto tr4
+			case 34:
+				goto tr4
+			case 44:
+				goto tr4
+			case 47:
+				goto tr4
+			case 59:
+				goto tr4
+			case 96:
 				goto tr4
 			}
-		case data[p] >= 9:
-			goto tr4
-		}
-		goto tr25
-	st1:
-		if p++; p == pe {
-			goto _test_eof1
-		}
-	st_case_1:
-		_widec = int16(data[p])
-		if 92 <= data[p] && data[p] <= 92 {
-			_widec = 256 + (int16(data[p]) - 0)
-			if  parser.escFlavor != backslashEscapeFlavorNone  {
-				_widec += 256
+			switch {
+			case data[p] > 13:
+				if 39 <= data[p] && data[p] <= 42 {
+					goto tr4
+				}
+			case data[p] >= 9:
+				goto tr4
 			}
-		}
-		switch _widec {
-		case 34:
-			goto tr1
-		case 348:
-			goto st2
-		case 604:
-			goto st3
-		}
-		switch {
-		case _widec > 91:
-			if 93 <= _widec {
+			goto tr25
+		st1:
+			if p++; p == pe {
+				goto _test_eof1
+			}
+		st_case_1:
+			_widec = int16(data[p])
+			if 92 <= data[p] && data[p] <= 92 {
+				_widec = 256 + (int16(data[p]) - 0)
+				if parser.escFlavor != backslashEscapeFlavorNone {
+					_widec += 256
+				}
+			}
+			switch _widec {
+			case 34:
+				goto tr1
+			case 348:
 				goto st2
+			case 604:
+				goto st3
 			}
-		default:
-			goto st2
-		}
-		goto st0
-	st2:
-		if p++; p == pe {
-			goto _test_eof2
-		}
-	st_case_2:
-		_widec = int16(data[p])
-		if 92 <= data[p] && data[p] <= 92 {
-			_widec = 256 + (int16(data[p]) - 0)
-			if  parser.escFlavor != backslashEscapeFlavorNone  {
-				_widec += 256
+			switch {
+			case _widec > 91:
+				if 93 <= _widec {
+					goto st2
+				}
+			default:
+				goto st2
 			}
-		}
-		switch _widec {
-		case 34:
-			goto tr1
-		case 348:
-			goto st2
-		case 604:
-			goto st3
-		}
-		switch {
-		case _widec > 91:
-			if 93 <= _widec {
+			goto st0
+		st2:
+			if p++; p == pe {
+				goto _test_eof2
+			}
+		st_case_2:
+			_widec = int16(data[p])
+			if 92 <= data[p] && data[p] <= 92 {
+				_widec = 256 + (int16(data[p]) - 0)
+				if parser.escFlavor != backslashEscapeFlavorNone {
+					_widec += 256
+				}
+			}
+			switch _widec {
+			case 34:
+				goto tr1
+			case 348:
 				goto st2
+			case 604:
+				goto st3
 			}
-		default:
-			goto st2
-		}
-		goto tr4
-tr1:
-//.... NONE:1
-te = p+1
+			switch {
+			case _widec > 91:
+				if 93 <= _widec {
+					goto st2
+				}
+			default:
+				goto st2
+			}
+			goto tr4
+		tr1:
+			//.... NONE:1
+			te = p + 1
 
-//.... lightning/mydump/parser.rl:120
-act = 12;
-	goto st23
-	st23:
-		if p++; p == pe {
-			goto _test_eof23
-		}
-	st_case_23:
-//.... tmp_parser.go:583
-		if data[p] == 34 {
-			goto st2
-		}
-		goto tr42
-	st3:
-		if p++; p == pe {
-			goto _test_eof3
-		}
-	st_case_3:
-		_widec = int16(data[p])
-		if 92 <= data[p] && data[p] <= 92 {
-			_widec = 256 + (int16(data[p]) - 0)
-			if  parser.escFlavor != backslashEscapeFlavorNone  {
-				_widec += 256
+			//.... lightning/mydump/parser.rl:120
+			act = 12
+			goto st23
+		st23:
+			if p++; p == pe {
+				goto _test_eof23
 			}
-		}
-		switch _widec {
-		case 348:
-			goto st2
-		case 604:
-			goto st2
-		}
-		switch {
-		case _widec > 91:
-			if 93 <= _widec {
+		st_case_23:
+			//.... tmp_parser.go:583
+			if data[p] == 34 {
 				goto st2
 			}
-		default:
-			goto st2
-		}
-		goto tr4
-st_case_0:
-	st0:
-		cs = 0
-		goto _out
-	st4:
-		if p++; p == pe {
-			goto _test_eof4
-		}
-	st_case_4:
-		_widec = int16(data[p])
-		if 92 <= data[p] && data[p] <= 92 {
-			_widec = 256 + (int16(data[p]) - 0)
-			if  parser.escFlavor != backslashEscapeFlavorNone  {
-				_widec += 256
+			goto tr42
+		st3:
+			if p++; p == pe {
+				goto _test_eof3
 			}
-		}
-		switch _widec {
-		case 39:
-			goto tr6
-		case 348:
-			goto st5
-		case 604:
-			goto st6
-		}
-		switch {
-		case _widec > 91:
-			if 93 <= _widec {
+		st_case_3:
+			_widec = int16(data[p])
+			if 92 <= data[p] && data[p] <= 92 {
+				_widec = 256 + (int16(data[p]) - 0)
+				if parser.escFlavor != backslashEscapeFlavorNone {
+					_widec += 256
+				}
+			}
+			switch _widec {
+			case 348:
+				goto st2
+			case 604:
+				goto st2
+			}
+			switch {
+			case _widec > 91:
+				if 93 <= _widec {
+					goto st2
+				}
+			default:
+				goto st2
+			}
+			goto tr4
+		st_case_0:
+		st0:
+			cs = 0
+			goto _out
+		st4:
+			if p++; p == pe {
+				goto _test_eof4
+			}
+		st_case_4:
+			_widec = int16(data[p])
+			if 92 <= data[p] && data[p] <= 92 {
+				_widec = 256 + (int16(data[p]) - 0)
+				if parser.escFlavor != backslashEscapeFlavorNone {
+					_widec += 256
+				}
+			}
+			switch _widec {
+			case 39:
+				goto tr6
+			case 348:
 				goto st5
+			case 604:
+				goto st6
 			}
-		default:
-			goto st5
-		}
-		goto st0
-	st5:
-		if p++; p == pe {
-			goto _test_eof5
-		}
-	st_case_5:
-		_widec = int16(data[p])
-		if 92 <= data[p] && data[p] <= 92 {
-			_widec = 256 + (int16(data[p]) - 0)
-			if  parser.escFlavor != backslashEscapeFlavorNone  {
-				_widec += 256
+			switch {
+			case _widec > 91:
+				if 93 <= _widec {
+					goto st5
+				}
+			default:
+				goto st5
 			}
-		}
-		switch _widec {
-		case 39:
-			goto tr6
-		case 348:
-			goto st5
-		case 604:
-			goto st6
-		}
-		switch {
-		case _widec > 91:
-			if 93 <= _widec {
+			goto st0
+		st5:
+			if p++; p == pe {
+				goto _test_eof5
+			}
+		st_case_5:
+			_widec = int16(data[p])
+			if 92 <= data[p] && data[p] <= 92 {
+				_widec = 256 + (int16(data[p]) - 0)
+				if parser.escFlavor != backslashEscapeFlavorNone {
+					_widec += 256
+				}
+			}
+			switch _widec {
+			case 39:
+				goto tr6
+			case 348:
 				goto st5
+			case 604:
+				goto st6
 			}
-		default:
-			goto st5
-		}
-		goto tr4
-tr6:
-//.... NONE:1
-te = p+1
+			switch {
+			case _widec > 91:
+				if 93 <= _widec {
+					goto st5
+				}
+			default:
+				goto st5
+			}
+			goto tr4
+		tr6:
+			//.... NONE:1
+			te = p + 1
 
-//.... lightning/mydump/parser.rl:115
-act = 11;
-	goto st24
-	st24:
-		if p++; p == pe {
-			goto _test_eof24
-		}
-	st_case_24:
-//.... tmp_parser.go:689
-		if data[p] == 39 {
-			goto st5
-		}
-		goto tr43
-	st6:
-		if p++; p == pe {
-			goto _test_eof6
-		}
-	st_case_6:
-		_widec = int16(data[p])
-		if 92 <= data[p] && data[p] <= 92 {
-			_widec = 256 + (int16(data[p]) - 0)
-			if  parser.escFlavor != backslashEscapeFlavorNone  {
-				_widec += 256
+			//.... lightning/mydump/parser.rl:115
+			act = 11
+			goto st24
+		st24:
+			if p++; p == pe {
+				goto _test_eof24
 			}
-		}
-		switch _widec {
-		case 348:
-			goto st5
-		case 604:
-			goto st5
-		}
-		switch {
-		case _widec > 91:
-			if 93 <= _widec {
+		st_case_24:
+			//.... tmp_parser.go:689
+			if data[p] == 39 {
 				goto st5
 			}
-		default:
-			goto st5
-		}
-		goto tr4
-	st25:
-		if p++; p == pe {
-			goto _test_eof25
-		}
-	st_case_25:
-		switch data[p] {
-		case 32:
-			goto tr44
-		case 34:
-			goto tr44
-		case 44:
-			goto tr44
-		case 45:
-			goto st26
-		case 47:
-			goto tr44
-		case 59:
-			goto tr44
-		case 96:
-			goto tr44
-		}
-		switch {
-		case data[p] < 39:
-			if 9 <= data[p] && data[p] <= 13 {
-				goto tr44
+			goto tr43
+		st6:
+			if p++; p == pe {
+				goto _test_eof6
 			}
-		case data[p] > 42:
-			if 48 <= data[p] && data[p] <= 57 {
-				goto st28
+		st_case_6:
+			_widec = int16(data[p])
+			if 92 <= data[p] && data[p] <= 92 {
+				_widec = 256 + (int16(data[p]) - 0)
+				if parser.escFlavor != backslashEscapeFlavorNone {
+					_widec += 256
+				}
 			}
-		default:
-			goto tr44
-		}
-		goto tr25
-	st26:
-		if p++; p == pe {
-			goto _test_eof26
-		}
-	st_case_26:
-		switch data[p] {
-		case 10:
-			goto tr46
-		case 13:
-			goto tr46
-		case 32:
-			goto st27
-		case 34:
-			goto st27
-		case 44:
-			goto st27
-		case 47:
-			goto st27
-		case 59:
-			goto st27
-		case 96:
-			goto st27
-		}
-		switch {
-		case data[p] > 12:
-			if 39 <= data[p] && data[p] <= 42 {
-				goto st27
+			switch _widec {
+			case 348:
+				goto st5
+			case 604:
+				goto st5
 			}
-		case data[p] >= 9:
-			goto st27
-		}
-		goto st26
-	st27:
-		if p++; p == pe {
-			goto _test_eof27
-		}
-	st_case_27:
-		switch data[p] {
-		case 10:
-			goto tr46
-		case 13:
-			goto tr46
-		}
-		goto st27
-	st28:
-		if p++; p == pe {
-			goto _test_eof28
-		}
-	st_case_28:
-		switch data[p] {
-		case 32:
-			goto tr48
-		case 34:
-			goto tr48
-		case 44:
-			goto tr48
-		case 47:
-			goto tr48
-		case 59:
-			goto tr48
-		case 96:
-			goto tr48
-		}
-		switch {
-		case data[p] < 39:
-			if 9 <= data[p] && data[p] <= 13 {
-				goto tr48
+			switch {
+			case _widec > 91:
+				if 93 <= _widec {
+					goto st5
+				}
+			default:
+				goto st5
 			}
-		case data[p] > 42:
-			if 48 <= data[p] && data[p] <= 57 {
-				goto st28
+			goto tr4
+		st25:
+			if p++; p == pe {
+				goto _test_eof25
 			}
-		default:
-			goto tr48
-		}
-		goto tr25
-	st7:
-		if p++; p == pe {
-			goto _test_eof7
-		}
-	st_case_7:
-		if data[p] == 42 {
-			goto st8
-		}
-		goto st0
-	st8:
-		if p++; p == pe {
-			goto _test_eof8
-		}
-	st_case_8:
-		if data[p] == 42 {
-			goto st9
-		}
-		goto st8
-	st9:
-		if p++; p == pe {
-			goto _test_eof9
-		}
-	st_case_9:
-		switch data[p] {
-		case 42:
-			goto st9
-		case 47:
-			goto tr10
-		}
-		goto st8
-	st29:
-		if p++; p == pe {
-			goto _test_eof29
-		}
-	st_case_29:
-		switch data[p] {
-		case 32:
-			goto tr48
-		case 34:
-			goto tr48
-		case 44:
-			goto tr48
-		case 47:
-			goto tr48
-		case 59:
-			goto tr48
-		case 96:
-			goto tr48
-		case 98:
-			goto tr49
-		case 120:
-			goto tr50
-		}
-		switch {
-		case data[p] < 39:
-			if 9 <= data[p] && data[p] <= 13 {
-				goto tr48
+		st_case_25:
+			switch data[p] {
+			case 32:
+				goto tr44
+			case 34:
+				goto tr44
+			case 44:
+				goto tr44
+			case 45:
+				goto st26
+			case 47:
+				goto tr44
+			case 59:
+				goto tr44
+			case 96:
+				goto tr44
 			}
-		case data[p] > 42:
-			if 48 <= data[p] && data[p] <= 57 {
-				goto st28
+			switch {
+			case data[p] < 39:
+				if 9 <= data[p] && data[p] <= 13 {
+					goto tr44
+				}
+			case data[p] > 42:
+				if 48 <= data[p] && data[p] <= 57 {
+					goto st28
+				}
+			default:
+				goto tr44
 			}
-		default:
-			goto tr48
-		}
-		goto tr25
-tr49:
-//.... NONE:1
-te = p+1
-
-//.... lightning/mydump/parser.rl:130
-act = 14;
-	goto st30
-tr51:
-//.... NONE:1
-te = p+1
-
-//.... lightning/mydump/parser.rl:110
-act = 10;
-	goto st30
-	st30:
-		if p++; p == pe {
-			goto _test_eof30
-		}
-	st_case_30:
-//.... tmp_parser.go:916
-		switch data[p] {
-		case 32:
-			goto tr4
-		case 34:
-			goto tr4
-		case 44:
-			goto tr4
-		case 47:
-			goto tr4
-		case 59:
-			goto tr4
-		case 96:
-			goto tr4
-		}
-		switch {
-		case data[p] < 39:
-			if 9 <= data[p] && data[p] <= 13 {
-				goto tr4
+			goto tr25
+		st26:
+			if p++; p == pe {
+				goto _test_eof26
 			}
-		case data[p] > 42:
-			if 48 <= data[p] && data[p] <= 49 {
-				goto tr51
+		st_case_26:
+			switch data[p] {
+			case 10:
+				goto tr46
+			case 13:
+				goto tr46
+			case 32:
+				goto st27
+			case 34:
+				goto st27
+			case 44:
+				goto st27
+			case 47:
+				goto st27
+			case 59:
+				goto st27
+			case 96:
+				goto st27
 			}
-		default:
-			goto tr4
-		}
-		goto tr25
-tr50:
-//.... NONE:1
-te = p+1
-
-//.... lightning/mydump/parser.rl:130
-act = 14;
-	goto st31
-tr52:
-//.... NONE:1
-te = p+1
-
-//.... lightning/mydump/parser.rl:105
-act = 9;
-	goto st31
-	st31:
-		if p++; p == pe {
-			goto _test_eof31
-		}
-	st_case_31:
-//.... tmp_parser.go:963
-		switch data[p] {
-		case 32:
-			goto tr4
-		case 34:
-			goto tr4
-		case 44:
-			goto tr4
-		case 47:
-			goto tr4
-		case 59:
-			goto tr4
-		case 96:
-			goto tr4
-		}
-		switch {
-		case data[p] < 48:
 			switch {
-			case data[p] > 13:
+			case data[p] > 12:
 				if 39 <= data[p] && data[p] <= 42 {
-					goto tr4
+					goto st27
 				}
 			case data[p] >= 9:
-				goto tr4
+				goto st27
 			}
-		case data[p] > 57:
-			switch {
-			case data[p] > 70:
-				if 97 <= data[p] && data[p] <= 102 {
+			goto st26
+		st27:
+			if p++; p == pe {
+				goto _test_eof27
+			}
+		st_case_27:
+			switch data[p] {
+			case 10:
+				goto tr46
+			case 13:
+				goto tr46
+			}
+			goto st27
+		st28:
+			if p++; p == pe {
+				goto _test_eof28
+			}
+		st_case_28:
+			switch data[p] {
+			case 32:
+				goto tr48
+			case 34:
+				goto tr48
+			case 44:
+				goto tr48
+			case 47:
+				goto tr48
+			case 59:
+				goto tr48
+			case 96:
+				goto tr48
+			}
+			switch {
+			case data[p] < 39:
+				if 9 <= data[p] && data[p] <= 13 {
+					goto tr48
+				}
+			case data[p] > 42:
+				if 48 <= data[p] && data[p] <= 57 {
+					goto st28
+				}
+			default:
+				goto tr48
+			}
+			goto tr25
+		st7:
+			if p++; p == pe {
+				goto _test_eof7
+			}
+		st_case_7:
+			if data[p] == 42 {
+				goto st8
+			}
+			goto st0
+		st8:
+			if p++; p == pe {
+				goto _test_eof8
+			}
+		st_case_8:
+			if data[p] == 42 {
+				goto st9
+			}
+			goto st8
+		st9:
+			if p++; p == pe {
+				goto _test_eof9
+			}
+		st_case_9:
+			switch data[p] {
+			case 42:
+				goto st9
+			case 47:
+				goto tr10
+			}
+			goto st8
+		st29:
+			if p++; p == pe {
+				goto _test_eof29
+			}
+		st_case_29:
+			switch data[p] {
+			case 32:
+				goto tr48
+			case 34:
+				goto tr48
+			case 44:
+				goto tr48
+			case 47:
+				goto tr48
+			case 59:
+				goto tr48
+			case 96:
+				goto tr48
+			case 98:
+				goto tr49
+			case 120:
+				goto tr50
+			}
+			switch {
+			case data[p] < 39:
+				if 9 <= data[p] && data[p] <= 13 {
+					goto tr48
+				}
+			case data[p] > 42:
+				if 48 <= data[p] && data[p] <= 57 {
+					goto st28
+				}
+			default:
+				goto tr48
+			}
+			goto tr25
+		tr49:
+			//.... NONE:1
+			te = p + 1
+
+			//.... lightning/mydump/parser.rl:130
+			act = 14
+			goto st30
+		tr51:
+			//.... NONE:1
+			te = p + 1
+
+			//.... lightning/mydump/parser.rl:110
+			act = 10
+			goto st30
+		st30:
+			if p++; p == pe {
+				goto _test_eof30
+			}
+		st_case_30:
+			//.... tmp_parser.go:916
+			switch data[p] {
+			case 32:
+				goto tr4
+			case 34:
+				goto tr4
+			case 44:
+				goto tr4
+			case 47:
+				goto tr4
+			case 59:
+				goto tr4
+			case 96:
+				goto tr4
+			}
+			switch {
+			case data[p] < 39:
+				if 9 <= data[p] && data[p] <= 13 {
+					goto tr4
+				}
+			case data[p] > 42:
+				if 48 <= data[p] && data[p] <= 49 {
+					goto tr51
+				}
+			default:
+				goto tr4
+			}
+			goto tr25
+		tr50:
+			//.... NONE:1
+			te = p + 1
+
+			//.... lightning/mydump/parser.rl:130
+			act = 14
+			goto st31
+		tr52:
+			//.... NONE:1
+			te = p + 1
+
+			//.... lightning/mydump/parser.rl:105
+			act = 9
+			goto st31
+		st31:
+			if p++; p == pe {
+				goto _test_eof31
+			}
+		st_case_31:
+			//.... tmp_parser.go:963
+			switch data[p] {
+			case 32:
+				goto tr4
+			case 34:
+				goto tr4
+			case 44:
+				goto tr4
+			case 47:
+				goto tr4
+			case 59:
+				goto tr4
+			case 96:
+				goto tr4
+			}
+			switch {
+			case data[p] < 48:
+				switch {
+				case data[p] > 13:
+					if 39 <= data[p] && data[p] <= 42 {
+						goto tr4
+					}
+				case data[p] >= 9:
+					goto tr4
+				}
+			case data[p] > 57:
+				switch {
+				case data[p] > 70:
+					if 97 <= data[p] && data[p] <= 102 {
+						goto tr52
+					}
+				case data[p] >= 65:
 					goto tr52
 				}
-			case data[p] >= 65:
+			default:
 				goto tr52
 			}
-		default:
-			goto tr52
-		}
-		goto tr25
-tr34:
-//.... NONE:1
-te = p+1
+			goto tr25
+		tr34:
+			//.... NONE:1
+			te = p + 1
 
-	goto st32
-	st32:
-		if p++; p == pe {
-			goto _test_eof32
-		}
-	st_case_32:
-//.... tmp_parser.go:1011
-		switch data[p] {
-		case 32:
-			goto tr44
-		case 34:
-			goto tr44
-		case 39:
-			goto st10
-		case 44:
-			goto tr44
-		case 47:
-			goto tr44
-		case 59:
-			goto tr44
-		case 96:
-			goto tr44
-		}
-		switch {
-		case data[p] > 13:
-			if 40 <= data[p] && data[p] <= 42 {
+			goto st32
+		st32:
+			if p++; p == pe {
+				goto _test_eof32
+			}
+		st_case_32:
+			//.... tmp_parser.go:1011
+			switch data[p] {
+			case 32:
+				goto tr44
+			case 34:
+				goto tr44
+			case 39:
+				goto st10
+			case 44:
+				goto tr44
+			case 47:
+				goto tr44
+			case 59:
+				goto tr44
+			case 96:
 				goto tr44
 			}
-		case data[p] >= 9:
-			goto tr44
-		}
-		goto tr25
-	st10:
-		if p++; p == pe {
-			goto _test_eof10
-		}
-	st_case_10:
-		if data[p] == 39 {
-			goto tr12
-		}
-		if 48 <= data[p] && data[p] <= 49 {
-			goto st10
-		}
-		goto tr11
-	st33:
-		if p++; p == pe {
-			goto _test_eof33
-		}
-	st_case_33:
-		switch data[p] {
-		case 32:
-			goto tr44
-		case 34:
-			goto tr44
-		case 44:
-			goto tr44
-		case 47:
-			goto tr44
-		case 59:
-			goto tr44
-		case 79:
-			goto st34
-		case 96:
-			goto tr44
-		case 111:
-			goto st34
-		}
-		switch {
-		case data[p] > 13:
-			if 39 <= data[p] && data[p] <= 42 {
+			switch {
+			case data[p] > 13:
+				if 40 <= data[p] && data[p] <= 42 {
+					goto tr44
+				}
+			case data[p] >= 9:
 				goto tr44
 			}
-		case data[p] >= 9:
-			goto tr44
-		}
-		goto tr25
-	st34:
-		if p++; p == pe {
-			goto _test_eof34
-		}
-	st_case_34:
-		switch data[p] {
-		case 32:
-			goto tr44
-		case 34:
-			goto tr44
-		case 44:
-			goto tr44
-		case 47:
-			goto tr44
-		case 59:
-			goto tr44
-		case 78:
-			goto st35
-		case 96:
-			goto tr44
-		case 110:
-			goto st35
-		}
-		switch {
-		case data[p] > 13:
-			if 39 <= data[p] && data[p] <= 42 {
+			goto tr25
+		st10:
+			if p++; p == pe {
+				goto _test_eof10
+			}
+		st_case_10:
+			if data[p] == 39 {
+				goto tr12
+			}
+			if 48 <= data[p] && data[p] <= 49 {
+				goto st10
+			}
+			goto tr11
+		st33:
+			if p++; p == pe {
+				goto _test_eof33
+			}
+		st_case_33:
+			switch data[p] {
+			case 32:
+				goto tr44
+			case 34:
+				goto tr44
+			case 44:
+				goto tr44
+			case 47:
+				goto tr44
+			case 59:
+				goto tr44
+			case 79:
+				goto st34
+			case 96:
 				goto tr44
+			case 111:
+				goto st34
 			}
-		case data[p] >= 9:
-			goto tr44
-		}
-		goto tr25
-	st35:
-		if p++; p == pe {
-			goto _test_eof35
-		}
-	st_case_35:
-		switch data[p] {
-		case 32:
-			goto tr44
-		case 34:
-			goto tr44
-		case 44:
-			goto tr44
-		case 47:
-			goto tr44
-		case 59:
-			goto tr44
-		case 86:
-			goto st36
-		case 96:
-			goto tr44
-		case 118:
-			goto st36
-		}
-		switch {
-		case data[p] > 13:
-			if 39 <= data[p] && data[p] <= 42 {
+			switch {
+			case data[p] > 13:
+				if 39 <= data[p] && data[p] <= 42 {
+					goto tr44
+				}
+			case data[p] >= 9:
+				goto tr44
+			}
+			goto tr25
+		st34:
+			if p++; p == pe {
+				goto _test_eof34
+			}
+		st_case_34:
+			switch data[p] {
+			case 32:
+				goto tr44
+			case 34:
+				goto tr44
+			case 44:
+				goto tr44
+			case 47:
+				goto tr44
+			case 59:
+				goto tr44
+			case 78:
+				goto st35
+			case 96:
+				goto tr44
+			case 110:
+				goto st35
+			}
+			switch {
+			case data[p] > 13:
+				if 39 <= data[p] && data[p] <= 42 {
+					goto tr44
+				}
+			case data[p] >= 9:
+				goto tr44
+			}
+			goto tr25
+		st35:
+			if p++; p == pe {
+				goto _test_eof35
+			}
+		st_case_35:
+			switch data[p] {
+			case 32:
+				goto tr44
+			case 34:
+				goto tr44
+			case 44:
+				goto tr44
+			case 47:
+				goto tr44
+			case 59:
+				goto tr44
+			case 86:
+				goto st36
+			case 96:
+				goto tr44
+			case 118:
+				goto st36
+			}
+			switch {
+			case data[p] > 13:
+				if 39 <= data[p] && data[p] <= 42 {
+					goto tr44
+				}
+			case data[p] >= 9:
+				goto tr44
+			}
+			goto tr25
+		st36:
+			if p++; p == pe {
+				goto _test_eof36
+			}
+		st_case_36:
+			switch data[p] {
+			case 32:
+				goto tr44
+			case 34:
+				goto tr44
+			case 44:
+				goto tr44
+			case 47:
+				goto tr44
+			case 59:
+				goto tr44
+			case 69:
+				goto st37
+			case 96:
+				goto tr44
+			case 101:
+				goto st37
+			}
+			switch {
+			case data[p] > 13:
+				if 39 <= data[p] && data[p] <= 42 {
+					goto tr44
+				}
+			case data[p] >= 9:
+				goto tr44
+			}
+			goto tr25
+		st37:
+			if p++; p == pe {
+				goto _test_eof37
+			}
+		st_case_37:
+			switch data[p] {
+			case 32:
+				goto tr44
+			case 34:
+				goto tr44
+			case 44:
+				goto tr44
+			case 47:
+				goto tr44
+			case 59:
+				goto tr44
+			case 82:
+				goto st38
+			case 96:
+				goto tr44
+			case 114:
+				goto st38
+			}
+			switch {
+			case data[p] > 13:
+				if 39 <= data[p] && data[p] <= 42 {
+					goto tr44
+				}
+			case data[p] >= 9:
+				goto tr44
+			}
+			goto tr25
+		st38:
+			if p++; p == pe {
+				goto _test_eof38
+			}
+		st_case_38:
+			switch data[p] {
+			case 32:
+				goto tr44
+			case 34:
+				goto tr44
+			case 44:
+				goto tr44
+			case 47:
+				goto tr44
+			case 59:
+				goto tr44
+			case 84:
+				goto st39
+			case 96:
+				goto tr44
+			case 116:
+				goto st39
+			}
+			switch {
+			case data[p] > 13:
+				if 39 <= data[p] && data[p] <= 42 {
+					goto tr44
+				}
+			case data[p] >= 9:
+				goto tr44
+			}
+			goto tr25
+		st39:
+			if p++; p == pe {
+				goto _test_eof39
+			}
+		st_case_39:
+			switch data[p] {
+			case 32:
+				goto tr44
+			case 34:
+				goto tr44
+			case 40:
+				goto tr10
+			case 44:
+				goto tr44
+			case 47:
+				goto tr44
+			case 59:
+				goto tr44
+			case 96:
+				goto tr44
+			}
+			switch {
+			case data[p] > 13:
+				if 39 <= data[p] && data[p] <= 42 {
+					goto tr44
+				}
+			case data[p] >= 9:
+				goto tr44
+			}
+			goto tr25
+		st40:
+			if p++; p == pe {
+				goto _test_eof40
+			}
+		st_case_40:
+			switch data[p] {
+			case 32:
+				goto tr44
+			case 34:
+				goto tr44
+			case 44:
+				goto tr44
+			case 47:
+				goto tr44
+			case 59:
+				goto tr44
+			case 65:
+				goto st41
+			case 96:
+				goto tr44
+			case 97:
+				goto st41
+			}
+			switch {
+			case data[p] > 13:
+				if 39 <= data[p] && data[p] <= 42 {
+					goto tr44
+				}
+			case data[p] >= 9:
+				goto tr44
+			}
+			goto tr25
+		st41:
+			if p++; p == pe {
+				goto _test_eof41
+			}
+		st_case_41:
+			switch data[p] {
+			case 32:
+				goto tr44
+			case 34:
+				goto tr44
+			case 44:
+				goto tr44
+			case 47:
+				goto tr44
+			case 59:
+				goto tr44
+			case 76:
+				goto st42
+			case 96:
+				goto tr44
+			case 108:
+				goto st42
+			}
+			switch {
+			case data[p] > 13:
+				if 39 <= data[p] && data[p] <= 42 {
+					goto tr44
+				}
+			case data[p] >= 9:
+				goto tr44
+			}
+			goto tr25
+		st42:
+			if p++; p == pe {
+				goto _test_eof42
+			}
+		st_case_42:
+			switch data[p] {
+			case 32:
+				goto tr44
+			case 34:
+				goto tr44
+			case 44:
+				goto tr44
+			case 47:
+				goto tr44
+			case 59:
+				goto tr44
+			case 83:
+				goto st43
+			case 96:
+				goto tr44
+			case 115:
+				goto st43
+			}
+			switch {
+			case data[p] > 13:
+				if 39 <= data[p] && data[p] <= 42 {
+					goto tr44
+				}
+			case data[p] >= 9:
+				goto tr44
+			}
+			goto tr25
+		st43:
+			if p++; p == pe {
+				goto _test_eof43
+			}
+		st_case_43:
+			switch data[p] {
+			case 32:
+				goto tr44
+			case 34:
+				goto tr44
+			case 44:
+				goto tr44
+			case 47:
+				goto tr44
+			case 59:
+				goto tr44
+			case 69:
+				goto tr62
+			case 96:
+				goto tr44
+			case 101:
+				goto tr62
+			}
+			switch {
+			case data[p] > 13:
+				if 39 <= data[p] && data[p] <= 42 {
+					goto tr44
+				}
+			case data[p] >= 9:
+				goto tr44
+			}
+			goto tr25
+		st44:
+			if p++; p == pe {
+				goto _test_eof44
+			}
+		st_case_44:
+			switch data[p] {
+			case 32:
+				goto tr44
+			case 34:
+				goto tr44
+			case 44:
+				goto tr44
+			case 47:
+				goto tr44
+			case 59:
+				goto tr44
+			case 85:
+				goto st45
+			case 96:
+				goto tr44
+			case 117:
+				goto st45
+			}
+			switch {
+			case data[p] > 13:
+				if 39 <= data[p] && data[p] <= 42 {
+					goto tr44
+				}
+			case data[p] >= 9:
+				goto tr44
+			}
+			goto tr25
+		st45:
+			if p++; p == pe {
+				goto _test_eof45
+			}
+		st_case_45:
+			switch data[p] {
+			case 32:
+				goto tr44
+			case 34:
+				goto tr44
+			case 44:
+				goto tr44
+			case 47:
+				goto tr44
+			case 59:
+				goto tr44
+			case 76:
+				goto st46
+			case 96:
+				goto tr44
+			case 108:
+				goto st46
+			}
+			switch {
+			case data[p] > 13:
+				if 39 <= data[p] && data[p] <= 42 {
+					goto tr44
+				}
+			case data[p] >= 9:
+				goto tr44
+			}
+			goto tr25
+		st46:
+			if p++; p == pe {
+				goto _test_eof46
+			}
+		st_case_46:
+			switch data[p] {
+			case 32:
+				goto tr44
+			case 34:
+				goto tr44
+			case 44:
+				goto tr44
+			case 47:
+				goto tr44
+			case 59:
+				goto tr44
+			case 76:
+				goto tr65
+			case 96:
+				goto tr44
+			case 108:
+				goto tr65
+			}
+			switch {
+			case data[p] > 13:
+				if 39 <= data[p] && data[p] <= 42 {
+					goto tr44
+				}
+			case data[p] >= 9:
+				goto tr44
+			}
+			goto tr25
+		st47:
+			if p++; p == pe {
+				goto _test_eof47
+			}
+		st_case_47:
+			switch data[p] {
+			case 32:
+				goto tr44
+			case 34:
+				goto tr44
+			case 44:
+				goto tr44
+			case 47:
+				goto tr44
+			case 59:
+				goto tr44
+			case 82:
+				goto st48
+			case 96:
+				goto tr44
+			case 114:
+				goto st48
+			}
+			switch {
+			case data[p] > 13:
+				if 39 <= data[p] && data[p] <= 42 {
+					goto tr44
+				}
+			case data[p] >= 9:
+				goto tr44
+			}
+			goto tr25
+		st48:
+			if p++; p == pe {
+				goto _test_eof48
+			}
+		st_case_48:
+			switch data[p] {
+			case 32:
+				goto tr44
+			case 34:
+				goto tr44
+			case 44:
+				goto tr44
+			case 47:
+				goto tr44
+			case 59:
+				goto tr44
+			case 85:
+				goto st49
+			case 96:
+				goto tr44
+			case 117:
+				goto st49
+			}
+			switch {
+			case data[p] > 13:
+				if 39 <= data[p] && data[p] <= 42 {
+					goto tr44
+				}
+			case data[p] >= 9:
+				goto tr44
+			}
+			goto tr25
+		st49:
+			if p++; p == pe {
+				goto _test_eof49
+			}
+		st_case_49:
+			switch data[p] {
+			case 32:
+				goto tr44
+			case 34:
+				goto tr44
+			case 44:
+				goto tr44
+			case 47:
+				goto tr44
+			case 59:
+				goto tr44
+			case 69:
+				goto tr68
+			case 96:
+				goto tr44
+			case 101:
+				goto tr68
+			}
+			switch {
+			case data[p] > 13:
+				if 39 <= data[p] && data[p] <= 42 {
+					goto tr44
+				}
+			case data[p] >= 9:
+				goto tr44
+			}
+			goto tr25
+		st50:
+			if p++; p == pe {
+				goto _test_eof50
+			}
+		st_case_50:
+			switch data[p] {
+			case 32:
+				goto tr44
+			case 34:
+				goto tr44
+			case 44:
+				goto tr44
+			case 47:
+				goto tr44
+			case 59:
+				goto tr44
+			case 83:
+				goto st51
+			case 96:
+				goto tr44
+			case 115:
+				goto st51
+			}
+			switch {
+			case data[p] > 13:
+				if 39 <= data[p] && data[p] <= 42 {
+					goto tr44
+				}
+			case data[p] >= 9:
+				goto tr44
+			}
+			goto tr25
+		st51:
+			if p++; p == pe {
+				goto _test_eof51
+			}
+		st_case_51:
+			switch data[p] {
+			case 32:
+				goto tr44
+			case 34:
+				goto tr44
+			case 44:
+				goto tr44
+			case 47:
+				goto tr44
+			case 59:
+				goto tr44
+			case 73:
+				goto st52
+			case 96:
+				goto tr44
+			case 105:
+				goto st52
+			}
+			switch {
+			case data[p] > 13:
+				if 39 <= data[p] && data[p] <= 42 {
+					goto tr44
+				}
+			case data[p] >= 9:
+				goto tr44
+			}
+			goto tr25
+		st52:
+			if p++; p == pe {
+				goto _test_eof52
+			}
+		st_case_52:
+			switch data[p] {
+			case 32:
+				goto tr44
+			case 34:
+				goto tr44
+			case 44:
+				goto tr44
+			case 47:
+				goto tr44
+			case 59:
+				goto tr44
+			case 78:
+				goto st53
+			case 96:
+				goto tr44
+			case 110:
+				goto st53
+			}
+			switch {
+			case data[p] > 13:
+				if 39 <= data[p] && data[p] <= 42 {
+					goto tr44
+				}
+			case data[p] >= 9:
+				goto tr44
+			}
+			goto tr25
+		st53:
+			if p++; p == pe {
+				goto _test_eof53
+			}
+		st_case_53:
+			switch data[p] {
+			case 32:
+				goto tr44
+			case 34:
+				goto tr44
+			case 44:
+				goto tr44
+			case 47:
+				goto tr44
+			case 59:
+				goto tr44
+			case 71:
+				goto tr72
+			case 96:
 				goto tr44
+			case 103:
+				goto tr72
 			}
-		case data[p] >= 9:
-			goto tr44
-		}
-		goto tr25
-	st36:
-		if p++; p == pe {
-			goto _test_eof36
-		}
-	st_case_36:
-		switch data[p] {
-		case 32:
-			goto tr44
-		case 34:
-			goto tr44
-		case 44:
-			goto tr44
-		case 47:
-			goto tr44
-		case 59:
-			goto tr44
-		case 69:
-			goto st37
-		case 96:
-			goto tr44
-		case 101:
-			goto st37
-		}
-		switch {
-		case data[p] > 13:
-			if 39 <= data[p] && data[p] <= 42 {
+			switch {
+			case data[p] > 13:
+				if 39 <= data[p] && data[p] <= 42 {
+					goto tr44
+				}
+			case data[p] >= 9:
 				goto tr44
 			}
-		case data[p] >= 9:
-			goto tr44
-		}
-		goto tr25
-	st37:
-		if p++; p == pe {
-			goto _test_eof37
-		}
-	st_case_37:
-		switch data[p] {
-		case 32:
-			goto tr44
-		case 34:
-			goto tr44
-		case 44:
-			goto tr44
-		case 47:
-			goto tr44
-		case 59:
-			goto tr44
-		case 82:
-			goto st38
-		case 96:
-			goto tr44
-		case 114:
-			goto st38
-		}
-		switch {
-		case data[p] > 13:
-			if 39 <= data[p] && data[p] <= 42 {
-				goto tr44
+			goto tr25
+		tr72:
+			//.... NONE:1
+			te = p + 1
+
+			goto st54
+		st54:
+			if p++; p == pe {
+				goto _test_eof54
 			}
-		case data[p] >= 9:
-			goto tr44
-		}
-		goto tr25
-	st38:
-		if p++; p == pe {
-			goto _test_eof38
-		}
-	st_case_38:
-		switch data[p] {
-		case 32:
-			goto tr44
-		case 34:
-			goto tr44
-		case 44:
-			goto tr44
-		case 47:
-			goto tr44
-		case 59:
-			goto tr44
-		case 84:
-			goto st39
-		case 96:
-			goto tr44
-		case 116:
-			goto st39
-		}
-		switch {
-		case data[p] > 13:
-			if 39 <= data[p] && data[p] <= 42 {
+		st_case_54:
+			//.... tmp_parser.go:1729
+			switch data[p] {
+			case 32:
+				goto st11
+			case 34:
 				goto tr44
-			}
-		case data[p] >= 9:
-			goto tr44
-		}
-		goto tr25
-	st39:
-		if p++; p == pe {
-			goto _test_eof39
-		}
-	st_case_39:
-		switch data[p] {
-		case 32:
-			goto tr44
-		case 34:
-			goto tr44
-		case 40:
-			goto tr10
-		case 44:
-			goto tr44
-		case 47:
-			goto tr44
-		case 59:
-			goto tr44
-		case 96:
-			goto tr44
-		}
-		switch {
-		case data[p] > 13:
-			if 39 <= data[p] && data[p] <= 42 {
+			case 44:
 				goto tr44
-			}
-		case data[p] >= 9:
-			goto tr44
-		}
-		goto tr25
-	st40:
-		if p++; p == pe {
-			goto _test_eof40
-		}
-	st_case_40:
-		switch data[p] {
-		case 32:
-			goto tr44
-		case 34:
-			goto tr44
-		case 44:
-			goto tr44
-		case 47:
-			goto tr44
-		case 59:
-			goto tr44
-		case 65:
-			goto st41
-		case 96:
-			goto tr44
-		case 97:
-			goto st41
-		}
-		switch {
-		case data[p] > 13:
-			if 39 <= data[p] && data[p] <= 42 {
+			case 47:
 				goto tr44
-			}
-		case data[p] >= 9:
-			goto tr44
-		}
-		goto tr25
-	st41:
-		if p++; p == pe {
-			goto _test_eof41
-		}
-	st_case_41:
-		switch data[p] {
-		case 32:
-			goto tr44
-		case 34:
-			goto tr44
-		case 44:
-			goto tr44
-		case 47:
-			goto tr44
-		case 59:
-			goto tr44
-		case 76:
-			goto st42
-		case 96:
-			goto tr44
-		case 108:
-			goto st42
-		}
-		switch {
-		case data[p] > 13:
-			if 39 <= data[p] && data[p] <= 42 {
+			case 59:
 				goto tr44
-			}
-		case data[p] >= 9:
-			goto tr44
-		}
-		goto tr25
-	st42:
-		if p++; p == pe {
-			goto _test_eof42
-		}
-	st_case_42:
-		switch data[p] {
-		case 32:
-			goto tr44
-		case 34:
-			goto tr44
-		case 44:
-			goto tr44
-		case 47:
-			goto tr44
-		case 59:
-			goto tr44
-		case 83:
-			goto st43
-		case 96:
-			goto tr44
-		case 115:
-			goto st43
-		}
-		switch {
-		case data[p] > 13:
-			if 39 <= data[p] && data[p] <= 42 {
+			case 96:
 				goto tr44
 			}
-		case data[p] >= 9:
-			goto tr44
-		}
-		goto tr25
-	st43:
-		if p++; p == pe {
-			goto _test_eof43
-		}
-	st_case_43:
-		switch data[p] {
-		case 32:
-			goto tr44
-		case 34:
-			goto tr44
-		case 44:
-			goto tr44
-		case 47:
-			goto tr44
-		case 59:
-			goto tr44
-		case 69:
-			goto tr62
-		case 96:
-			goto tr44
-		case 101:
-			goto tr62
-		}
-		switch {
-		case data[p] > 13:
-			if 39 <= data[p] && data[p] <= 42 {
+			switch {
+			case data[p] > 13:
+				if 39 <= data[p] && data[p] <= 42 {
+					goto tr44
+				}
+			case data[p] >= 9:
 				goto tr44
 			}
-		case data[p] >= 9:
-			goto tr44
-		}
-		goto tr25
-	st44:
-		if p++; p == pe {
-			goto _test_eof44
-		}
-	st_case_44:
-		switch data[p] {
-		case 32:
-			goto tr44
-		case 34:
-			goto tr44
-		case 44:
-			goto tr44
-		case 47:
-			goto tr44
-		case 59:
-			goto tr44
-		case 85:
-			goto st45
-		case 96:
-			goto tr44
-		case 117:
-			goto st45
-		}
-		switch {
-		case data[p] > 13:
-			if 39 <= data[p] && data[p] <= 42 {
+			goto tr25
+		st11:
+			if p++; p == pe {
+				goto _test_eof11
+			}
+		st_case_11:
+			switch data[p] {
+			case 85:
+				goto st12
+			case 117:
+				goto st12
+			}
+			goto tr11
+		st12:
+			if p++; p == pe {
+				goto _test_eof12
+			}
+		st_case_12:
+			switch data[p] {
+			case 84:
+				goto st13
+			case 116:
+				goto st13
+			}
+			goto tr11
+		st13:
+			if p++; p == pe {
+				goto _test_eof13
+			}
+		st_case_13:
+			switch data[p] {
+			case 70:
+				goto st14
+			case 102:
+				goto st14
+			}
+			goto tr11
+		st14:
+			if p++; p == pe {
+				goto _test_eof14
+			}
+		st_case_14:
+			if data[p] == 56 {
+				goto st15
+			}
+			goto tr11
+		st15:
+			if p++; p == pe {
+				goto _test_eof15
+			}
+		st_case_15:
+			switch data[p] {
+			case 77:
+				goto st16
+			case 109:
+				goto st16
+			}
+			goto tr11
+		st16:
+			if p++; p == pe {
+				goto _test_eof16
+			}
+		st_case_16:
+			switch data[p] {
+			case 66:
+				goto st17
+			case 98:
+				goto st17
+			}
+			goto tr11
+		st17:
+			if p++; p == pe {
+				goto _test_eof17
+			}
+		st_case_17:
+			if data[p] == 52 {
+				goto st18
+			}
+			goto tr11
+		st18:
+			if p++; p == pe {
+				goto _test_eof18
+			}
+		st_case_18:
+			if data[p] == 41 {
+				goto tr10
+			}
+			goto tr11
+		st55:
+			if p++; p == pe {
+				goto _test_eof55
+			}
+		st_case_55:
+			switch data[p] {
+			case 32:
+				goto tr44
+			case 34:
+				goto tr44
+			case 44:
+				goto tr44
+			case 47:
+				goto tr44
+			case 59:
 				goto tr44
+			case 65:
+				goto st56
+			case 96:
+				goto tr44
+			case 97:
+				goto st56
 			}
-		case data[p] >= 9:
-			goto tr44
-		}
-		goto tr25
-	st45:
-		if p++; p == pe {
-			goto _test_eof45
-		}
-	st_case_45:
-		switch data[p] {
-		case 32:
-			goto tr44
-		case 34:
-			goto tr44
-		case 44:
-			goto tr44
-		case 47:
-			goto tr44
-		case 59:
-			goto tr44
-		case 76:
-			goto st46
-		case 96:
-			goto tr44
-		case 108:
-			goto st46
-		}
-		switch {
-		case data[p] > 13:
-			if 39 <= data[p] && data[p] <= 42 {
+			switch {
+			case data[p] > 13:
+				if 39 <= data[p] && data[p] <= 42 {
+					goto tr44
+				}
+			case data[p] >= 9:
 				goto tr44
 			}
-		case data[p] >= 9:
-			goto tr44
-		}
-		goto tr25
-	st46:
-		if p++; p == pe {
-			goto _test_eof46
-		}
-	st_case_46:
-		switch data[p] {
-		case 32:
-			goto tr44
-		case 34:
-			goto tr44
-		case 44:
-			goto tr44
-		case 47:
-			goto tr44
-		case 59:
-			goto tr44
-		case 76:
-			goto tr65
-		case 96:
-			goto tr44
-		case 108:
-			goto tr65
-		}
-		switch {
-		case data[p] > 13:
-			if 39 <= data[p] && data[p] <= 42 {
+			goto tr25
+		st56:
+			if p++; p == pe {
+				goto _test_eof56
+			}
+		st_case_56:
+			switch data[p] {
+			case 32:
+				goto tr44
+			case 34:
+				goto tr44
+			case 44:
+				goto tr44
+			case 47:
 				goto tr44
+			case 59:
+				goto tr44
+			case 76:
+				goto st57
+			case 96:
+				goto tr44
+			case 108:
+				goto st57
 			}
-		case data[p] >= 9:
-			goto tr44
-		}
-		goto tr25
-	st47:
-		if p++; p == pe {
-			goto _test_eof47
-		}
-	st_case_47:
-		switch data[p] {
-		case 32:
-			goto tr44
-		case 34:
-			goto tr44
-		case 44:
-			goto tr44
-		case 47:
-			goto tr44
-		case 59:
-			goto tr44
-		case 82:
-			goto st48
-		case 96:
-			goto tr44
-		case 114:
-			goto st48
-		}
-		switch {
-		case data[p] > 13:
-			if 39 <= data[p] && data[p] <= 42 {
+			switch {
+			case data[p] > 13:
+				if 39 <= data[p] && data[p] <= 42 {
+					goto tr44
+				}
+			case data[p] >= 9:
 				goto tr44
 			}
-		case data[p] >= 9:
-			goto tr44
-		}
-		goto tr25
-	st48:
-		if p++; p == pe {
-			goto _test_eof48
-		}
-	st_case_48:
-		switch data[p] {
-		case 32:
-			goto tr44
-		case 34:
-			goto tr44
-		case 44:
-			goto tr44
-		case 47:
-			goto tr44
-		case 59:
-			goto tr44
-		case 85:
-			goto st49
-		case 96:
-			goto tr44
-		case 117:
-			goto st49
-		}
-		switch {
-		case data[p] > 13:
-			if 39 <= data[p] && data[p] <= 42 {
+			goto tr25
+		st57:
+			if p++; p == pe {
+				goto _test_eof57
+			}
+		st_case_57:
+			switch data[p] {
+			case 32:
+				goto tr44
+			case 34:
+				goto tr44
+			case 44:
 				goto tr44
+			case 47:
+				goto tr44
+			case 59:
+				goto tr44
+			case 85:
+				goto st58
+			case 96:
+				goto tr44
+			case 117:
+				goto st58
 			}
-		case data[p] >= 9:
-			goto tr44
-		}
-		goto tr25
-	st49:
-		if p++; p == pe {
-			goto _test_eof49
-		}
-	st_case_49:
-		switch data[p] {
-		case 32:
-			goto tr44
-		case 34:
-			goto tr44
-		case 44:
-			goto tr44
-		case 47:
-			goto tr44
-		case 59:
-			goto tr44
-		case 69:
-			goto tr68
-		case 96:
-			goto tr44
-		case 101:
-			goto tr68
-		}
-		switch {
-		case data[p] > 13:
-			if 39 <= data[p] && data[p] <= 42 {
+			switch {
+			case data[p] > 13:
+				if 39 <= data[p] && data[p] <= 42 {
+					goto tr44
+				}
+			case data[p] >= 9:
 				goto tr44
 			}
-		case data[p] >= 9:
-			goto tr44
-		}
-		goto tr25
-	st50:
-		if p++; p == pe {
-			goto _test_eof50
-		}
-	st_case_50:
-		switch data[p] {
-		case 32:
-			goto tr44
-		case 34:
-			goto tr44
-		case 44:
-			goto tr44
-		case 47:
-			goto tr44
-		case 59:
-			goto tr44
-		case 83:
-			goto st51
-		case 96:
-			goto tr44
-		case 115:
-			goto st51
-		}
-		switch {
-		case data[p] > 13:
-			if 39 <= data[p] && data[p] <= 42 {
+			goto tr25
+		st58:
+			if p++; p == pe {
+				goto _test_eof58
+			}
+		st_case_58:
+			switch data[p] {
+			case 32:
+				goto tr44
+			case 34:
 				goto tr44
+			case 44:
+				goto tr44
+			case 47:
+				goto tr44
+			case 59:
+				goto tr44
+			case 69:
+				goto st59
+			case 96:
+				goto tr44
+			case 101:
+				goto st59
 			}
-		case data[p] >= 9:
-			goto tr44
-		}
-		goto tr25
-	st51:
-		if p++; p == pe {
-			goto _test_eof51
-		}
-	st_case_51:
-		switch data[p] {
-		case 32:
-			goto tr44
-		case 34:
-			goto tr44
-		case 44:
-			goto tr44
-		case 47:
-			goto tr44
-		case 59:
-			goto tr44
-		case 73:
-			goto st52
-		case 96:
-			goto tr44
-		case 105:
-			goto st52
-		}
-		switch {
-		case data[p] > 13:
-			if 39 <= data[p] && data[p] <= 42 {
+			switch {
+			case data[p] > 13:
+				if 39 <= data[p] && data[p] <= 42 {
+					goto tr44
+				}
+			case data[p] >= 9:
 				goto tr44
 			}
-		case data[p] >= 9:
-			goto tr44
-		}
-		goto tr25
-	st52:
-		if p++; p == pe {
-			goto _test_eof52
-		}
-	st_case_52:
-		switch data[p] {
-		case 32:
-			goto tr44
-		case 34:
-			goto tr44
-		case 44:
-			goto tr44
-		case 47:
-			goto tr44
-		case 59:
-			goto tr44
-		case 78:
-			goto st53
-		case 96:
-			goto tr44
-		case 110:
-			goto st53
-		}
-		switch {
-		case data[p] > 13:
-			if 39 <= data[p] && data[p] <= 42 {
+			goto tr25
+		st59:
+			if p++; p == pe {
+				goto _test_eof59
+			}
+		st_case_59:
+			switch data[p] {
+			case 32:
 				goto tr44
+			case 34:
+				goto tr44
+			case 44:
+				goto tr44
+			case 47:
+				goto tr44
+			case 59:
+				goto tr44
+			case 83:
+				goto tr78
+			case 96:
+				goto tr44
+			case 115:
+				goto tr78
 			}
-		case data[p] >= 9:
-			goto tr44
-		}
-		goto tr25
-	st53:
-		if p++; p == pe {
-			goto _test_eof53
-		}
-	st_case_53:
-		switch data[p] {
-		case 32:
-			goto tr44
-		case 34:
-			goto tr44
-		case 44:
-			goto tr44
-		case 47:
-			goto tr44
-		case 59:
-			goto tr44
-		case 71:
-			goto tr72
-		case 96:
-			goto tr44
-		case 103:
-			goto tr72
-		}
-		switch {
-		case data[p] > 13:
-			if 39 <= data[p] && data[p] <= 42 {
+			switch {
+			case data[p] > 13:
+				if 39 <= data[p] && data[p] <= 42 {
+					goto tr44
+				}
+			case data[p] >= 9:
 				goto tr44
 			}
-		case data[p] >= 9:
-			goto tr44
-		}
-		goto tr25
-tr72:
-//.... NONE:1
-te = p+1
+			goto tr25
+		tr41:
+			//.... NONE:1
+			te = p + 1
 
-	goto st54
-	st54:
-		if p++; p == pe {
-			goto _test_eof54
-		}
-	st_case_54:
-//.... tmp_parser.go:1729
-		switch data[p] {
-		case 32:
-			goto st11
-		case 34:
-			goto tr44
-		case 44:
-			goto tr44
-		case 47:
-			goto tr44
-		case 59:
-			goto tr44
-		case 96:
-			goto tr44
-		}
-		switch {
-		case data[p] > 13:
-			if 39 <= data[p] && data[p] <= 42 {
-				goto tr44
+			goto st60
+		st60:
+			if p++; p == pe {
+				goto _test_eof60
 			}
-		case data[p] >= 9:
-			goto tr44
-		}
-		goto tr25
-	st11:
-		if p++; p == pe {
-			goto _test_eof11
-		}
-	st_case_11:
-		switch data[p] {
-		case 85:
-			goto st12
-		case 117:
-			goto st12
-		}
-		goto tr11
-	st12:
-		if p++; p == pe {
-			goto _test_eof12
-		}
-	st_case_12:
-		switch data[p] {
-		case 84:
-			goto st13
-		case 116:
-			goto st13
-		}
-		goto tr11
-	st13:
-		if p++; p == pe {
-			goto _test_eof13
-		}
-	st_case_13:
-		switch data[p] {
-		case 70:
-			goto st14
-		case 102:
-			goto st14
-		}
-		goto tr11
-	st14:
-		if p++; p == pe {
-			goto _test_eof14
-		}
-	st_case_14:
-		if data[p] == 56 {
-			goto st15
-		}
-		goto tr11
-	st15:
-		if p++; p == pe {
-			goto _test_eof15
-		}
-	st_case_15:
-		switch data[p] {
-		case 77:
-			goto st16
-		case 109:
-			goto st16
-		}
-		goto tr11
-	st16:
-		if p++; p == pe {
-			goto _test_eof16
-		}
-	st_case_16:
-		switch data[p] {
-		case 66:
-			goto st17
-		case 98:
-			goto st17
-		}
-		goto tr11
-	st17:
-		if p++; p == pe {
-			goto _test_eof17
-		}
-	st_case_17:
-		if data[p] == 52 {
-			goto st18
-		}
-		goto tr11
-	st18:
-		if p++; p == pe {
-			goto _test_eof18
-		}
-	st_case_18:
-		if data[p] == 41 {
-			goto tr10
-		}
-		goto tr11
-	st55:
-		if p++; p == pe {
-			goto _test_eof55
-		}
-	st_case_55:
-		switch data[p] {
-		case 32:
-			goto tr44
-		case 34:
-			goto tr44
-		case 44:
-			goto tr44
-		case 47:
-			goto tr44
-		case 59:
-			goto tr44
-		case 65:
-			goto st56
-		case 96:
-			goto tr44
-		case 97:
-			goto st56
-		}
-		switch {
-		case data[p] > 13:
-			if 39 <= data[p] && data[p] <= 42 {
+		st_case_60:
+			//.... tmp_parser.go:2010
+			switch data[p] {
+			case 32:
 				goto tr44
-			}
-		case data[p] >= 9:
-			goto tr44
-		}
-		goto tr25
-	st56:
-		if p++; p == pe {
-			goto _test_eof56
-		}
-	st_case_56:
-		switch data[p] {
-		case 32:
-			goto tr44
-		case 34:
-			goto tr44
-		case 44:
-			goto tr44
-		case 47:
-			goto tr44
-		case 59:
-			goto tr44
-		case 76:
-			goto st57
-		case 96:
-			goto tr44
-		case 108:
-			goto st57
-		}
-		switch {
-		case data[p] > 13:
-			if 39 <= data[p] && data[p] <= 42 {
+			case 34:
 				goto tr44
-			}
-		case data[p] >= 9:
-			goto tr44
-		}
-		goto tr25
-	st57:
-		if p++; p == pe {
-			goto _test_eof57
-		}
-	st_case_57:
-		switch data[p] {
-		case 32:
-			goto tr44
-		case 34:
-			goto tr44
-		case 44:
-			goto tr44
-		case 47:
-			goto tr44
-		case 59:
-			goto tr44
-		case 85:
-			goto st58
-		case 96:
-			goto tr44
-		case 117:
-			goto st58
-		}
-		switch {
-		case data[p] > 13:
-			if 39 <= data[p] && data[p] <= 42 {
+			case 39:
+				goto st19
+			case 44:
 				goto tr44
-			}
-		case data[p] >= 9:
-			goto tr44
-		}
-		goto tr25
-	st58:
-		if p++; p == pe {
-			goto _test_eof58
-		}
-	st_case_58:
-		switch data[p] {
-		case 32:
-			goto tr44
-		case 34:
-			goto tr44
-		case 44:
-			goto tr44
-		case 47:
-			goto tr44
-		case 59:
-			goto tr44
-		case 69:
-			goto st59
-		case 96:
-			goto tr44
-		case 101:
-			goto st59
-		}
-		switch {
-		case data[p] > 13:
-			if 39 <= data[p] && data[p] <= 42 {
+			case 47:
 				goto tr44
-			}
-		case data[p] >= 9:
-			goto tr44
-		}
-		goto tr25
-	st59:
-		if p++; p == pe {
-			goto _test_eof59
-		}
-	st_case_59:
-		switch data[p] {
-		case 32:
-			goto tr44
-		case 34:
-			goto tr44
-		case 44:
-			goto tr44
-		case 47:
-			goto tr44
-		case 59:
-			goto tr44
-		case 83:
-			goto tr78
-		case 96:
-			goto tr44
-		case 115:
-			goto tr78
-		}
-		switch {
-		case data[p] > 13:
-			if 39 <= data[p] && data[p] <= 42 {
+			case 59:
+				goto tr44
+			case 96:
 				goto tr44
 			}
-		case data[p] >= 9:
-			goto tr44
-		}
-		goto tr25
-tr41:
-//.... NONE:1
-te = p+1
-
-	goto st60
-	st60:
-		if p++; p == pe {
-			goto _test_eof60
-		}
-	st_case_60:
-//.... tmp_parser.go:2010
-		switch data[p] {
-		case 32:
-			goto tr44
-		case 34:
-			goto tr44
-		case 39:
-			goto st19
-		case 44:
-			goto tr44
-		case 47:
-			goto tr44
-		case 59:
-			goto tr44
-		case 96:
-			goto tr44
-		}
-		switch {
-		case data[p] > 13:
-			if 40 <= data[p] && data[p] <= 42 {
+			switch {
+			case data[p] > 13:
+				if 40 <= data[p] && data[p] <= 42 {
+					goto tr44
+				}
+			case data[p] >= 9:
 				goto tr44
 			}
-		case data[p] >= 9:
-			goto tr44
-		}
-		goto tr25
-	st19:
-		if p++; p == pe {
-			goto _test_eof19
-		}
-	st_case_19:
-		if data[p] == 39 {
-			goto tr21
-		}
-		switch {
-		case data[p] < 65:
-			if 48 <= data[p] && data[p] <= 57 {
-				goto st19
+			goto tr25
+		st19:
+			if p++; p == pe {
+				goto _test_eof19
 			}
-		case data[p] > 70:
-			if 97 <= data[p] && data[p] <= 102 {
+		st_case_19:
+			if data[p] == 39 {
+				goto tr21
+			}
+			switch {
+			case data[p] < 65:
+				if 48 <= data[p] && data[p] <= 57 {
+					goto st19
+				}
+			case data[p] > 70:
+				if 97 <= data[p] && data[p] <= 102 {
+					goto st19
+				}
+			default:
 				goto st19
 			}
-		default:
-			goto st19
-		}
-		goto tr11
-	st20:
-		if p++; p == pe {
-			goto _test_eof20
-		}
-	st_case_20:
-		if data[p] == 96 {
-			goto tr24
-		}
-		goto st20
-tr24:
-//.... NONE:1
-te = p+1
-
-//.... lightning/mydump/parser.rl:125
-act = 13;
-	goto st61
-	st61:
-		if p++; p == pe {
-			goto _test_eof61
-		}
-	st_case_61:
-//.... tmp_parser.go:2078
-		if data[p] == 96 {
+			goto tr11
+		st20:
+			if p++; p == pe {
+				goto _test_eof20
+			}
+		st_case_20:
+			if data[p] == 96 {
+				goto tr24
+			}
 			goto st20
-		}
-		goto tr79
-	st_out:
-	_test_eof21: cs = 21; goto _test_eof
-	_test_eof22: cs = 22; goto _test_eof
-	_test_eof1: cs = 1; goto _test_eof
-	_test_eof2: cs = 2; goto _test_eof
-	_test_eof23: cs = 23; goto _test_eof
-	_test_eof3: cs = 3; goto _test_eof
-	_test_eof4: cs = 4; goto _test_eof
-	_test_eof5: cs = 5; goto _test_eof
-	_test_eof24: cs = 24; goto _test_eof
-	_test_eof6: cs = 6; goto _test_eof
-	_test_eof25: cs = 25; goto _test_eof
-	_test_eof26: cs = 26; goto _test_eof
-	_test_eof27: cs = 27; goto _test_eof
-	_test_eof28: cs = 28; goto _test_eof
-	_test_eof7: cs = 7; goto _test_eof
-	_test_eof8: cs = 8; goto _test_eof
-	_test_eof9: cs = 9; goto _test_eof
-	_test_eof29: cs = 29; goto _test_eof
-	_test_eof30: cs = 30; goto _test_eof
-	_test_eof31: cs = 31; goto _test_eof
-	_test_eof32: cs = 32; goto _test_eof
-	_test_eof10: cs = 10; goto _test_eof
-	_test_eof33: cs = 33; goto _test_eof
-	_test_eof34: cs = 34; goto _test_eof
-	_test_eof35: cs = 35; goto _test_eof
-	_test_eof36: cs = 36; goto _test_eof
-	_test_eof37: cs = 37; goto _test_eof
-	_test_eof38: cs = 38; goto _test_eof
-	_test_eof39: cs = 39; goto _test_eof
-	_test_eof40: cs = 40; goto _test_eof
-	_test_eof41: cs = 41; goto _test_eof
-	_test_eof42: cs = 42; goto _test_eof
-	_test_eof43: cs = 43; goto _test_eof
-	_test_eof44: cs = 44; goto _test_eof
-	_test_eof45: cs = 45; goto _test_eof
-	_test_eof46: cs = 46; goto _test_eof
-	_test_eof47: cs = 47; goto _test_eof
-	_test_eof48: cs = 48; goto _test_eof
-	_test_eof49: cs = 49; goto _test_eof
-	_test_eof50: cs = 50; goto _test_eof
-	_test_eof51: cs = 51; goto _test_eof
-	_test_eof52: cs = 52; goto _test_eof
-	_test_eof53: cs = 53; goto _test_eof
-	_test_eof54: cs = 54; goto _test_eof
-	_test_eof11: cs = 11; goto _test_eof
-	_test_eof12: cs = 12; goto _test_eof
-	_test_eof13: cs = 13; goto _test_eof
-	_test_eof14: cs = 14; goto _test_eof
-	_test_eof15: cs = 15; goto _test_eof
-	_test_eof16: cs = 16; goto _test_eof
-	_test_eof17: cs = 17; goto _test_eof
-	_test_eof18: cs = 18; goto _test_eof
-	_test_eof55: cs = 55; goto _test_eof
-	_test_eof56: cs = 56; goto _test_eof
-	_test_eof57: cs = 57; goto _test_eof
-	_test_eof58: cs = 58; goto _test_eof
-	_test_eof59: cs = 59; goto _test_eof
-	_test_eof60: cs = 60; goto _test_eof
-	_test_eof19: cs = 19; goto _test_eof
-	_test_eof20: cs = 20; goto _test_eof
-	_test_eof61: cs = 61; goto _test_eof
+		tr24:
+			//.... NONE:1
+			te = p + 1
 
-	_test_eof: {}
-	if p == eof {
-		switch cs {
-		case 22:
-			goto tr4
-		case 2:
-			goto tr4
-		case 23:
-			goto tr42
-		case 3:
-			goto tr4
-		case 5:
-			goto tr4
-		case 24:
-			goto tr43
-		case 6:
-			goto tr4
-		case 25:
-			goto tr44
-		case 26:
-			goto tr46
-		case 27:
-			goto tr46
-		case 28:
-			goto tr48
-		case 29:
-			goto tr48
-		case 30:
-			goto tr4
-		case 31:
-			goto tr4
-		case 32:
-			goto tr44
-		case 10:
-			goto tr11
-		case 33:
-			goto tr44
-		case 34:
-			goto tr44
-		case 35:
-			goto tr44
-		case 36:
-			goto tr44
-		case 37:
-			goto tr44
-		case 38:
-			goto tr44
-		case 39:
-			goto tr44
-		case 40:
-			goto tr44
-		case 41:
-			goto tr44
-		case 42:
-			goto tr44
-		case 43:
-			goto tr44
-		case 44:
-			goto tr44
-		case 45:
-			goto tr44
-		case 46:
-			goto tr44
-		case 47:
-			goto tr44
-		case 48:
-			goto tr44
-		case 49:
-			goto tr44
-		case 50:
-			goto tr44
-		case 51:
-			goto tr44
-		case 52:
-			goto tr44
-		case 53:
-			goto tr44
-		case 54:
-			goto tr44
-		case 11:
-			goto tr11
-		case 12:
-			goto tr11
-		case 13:
-			goto tr11
-		case 14:
-			goto tr11
-		case 15:
-			goto tr11
-		case 16:
-			goto tr11
-		case 17:
-			goto tr11
-		case 18:
-			goto tr11
-		case 55:
-			goto tr44
-		case 56:
-			goto tr44
-		case 57:
-			goto tr44
-		case 58:
-			goto tr44
-		case 59:
-			goto tr44
-		case 60:
-			goto tr44
-		case 19:
-			goto tr11
-		case 20:
-			goto tr4
-		case 61:
+			//.... lightning/mydump/parser.rl:125
+			act = 13
+			goto st61
+		st61:
+			if p++; p == pe {
+				goto _test_eof61
+			}
+		st_case_61:
+			//.... tmp_parser.go:2078
+			if data[p] == 96 {
+				goto st20
+			}
 			goto tr79
-		}
-	}
+		st_out:
+		_test_eof21:
+			cs = 21
+			goto _test_eof
+		_test_eof22:
+			cs = 22
+			goto _test_eof
+		_test_eof1:
+			cs = 1
+			goto _test_eof
+		_test_eof2:
+			cs = 2
+			goto _test_eof
+		_test_eof23:
+			cs = 23
+			goto _test_eof
+		_test_eof3:
+			cs = 3
+			goto _test_eof
+		_test_eof4:
+			cs = 4
+			goto _test_eof
+		_test_eof5:
+			cs = 5
+			goto _test_eof
+		_test_eof24:
+			cs = 24
+			goto _test_eof
+		_test_eof6:
+			cs = 6
+			goto _test_eof
+		_test_eof25:
+			cs = 25
+			goto _test_eof
+		_test_eof26:
+			cs = 26
+			goto _test_eof
+		_test_eof27:
+			cs = 27
+			goto _test_eof
+		_test_eof28:
+			cs = 28
+			goto _test_eof
+		_test_eof7:
+			cs = 7
+			goto _test_eof
+		_test_eof8:
+			cs = 8
+			goto _test_eof
+		_test_eof9:
+			cs = 9
+			goto _test_eof
+		_test_eof29:
+			cs = 29
+			goto _test_eof
+		_test_eof30:
+			cs = 30
+			goto _test_eof
+		_test_eof31:
+			cs = 31
+			goto _test_eof
+		_test_eof32:
+			cs = 32
+			goto _test_eof
+		_test_eof10:
+			cs = 10
+			goto _test_eof
+		_test_eof33:
+			cs = 33
+			goto _test_eof
+		_test_eof34:
+			cs = 34
+			goto _test_eof
+		_test_eof35:
+			cs = 35
+			goto _test_eof
+		_test_eof36:
+			cs = 36
+			goto _test_eof
+		_test_eof37:
+			cs = 37
+			goto _test_eof
+		_test_eof38:
+			cs = 38
+			goto _test_eof
+		_test_eof39:
+			cs = 39
+			goto _test_eof
+		_test_eof40:
+			cs = 40
+			goto _test_eof
+		_test_eof41:
+			cs = 41
+			goto _test_eof
+		_test_eof42:
+			cs = 42
+			goto _test_eof
+		_test_eof43:
+			cs = 43
+			goto _test_eof
+		_test_eof44:
+			cs = 44
+			goto _test_eof
+		_test_eof45:
+			cs = 45
+			goto _test_eof
+		_test_eof46:
+			cs = 46
+			goto _test_eof
+		_test_eof47:
+			cs = 47
+			goto _test_eof
+		_test_eof48:
+			cs = 48
+			goto _test_eof
+		_test_eof49:
+			cs = 49
+			goto _test_eof
+		_test_eof50:
+			cs = 50
+			goto _test_eof
+		_test_eof51:
+			cs = 51
+			goto _test_eof
+		_test_eof52:
+			cs = 52
+			goto _test_eof
+		_test_eof53:
+			cs = 53
+			goto _test_eof
+		_test_eof54:
+			cs = 54
+			goto _test_eof
+		_test_eof11:
+			cs = 11
+			goto _test_eof
+		_test_eof12:
+			cs = 12
+			goto _test_eof
+		_test_eof13:
+			cs = 13
+			goto _test_eof
+		_test_eof14:
+			cs = 14
+			goto _test_eof
+		_test_eof15:
+			cs = 15
+			goto _test_eof
+		_test_eof16:
+			cs = 16
+			goto _test_eof
+		_test_eof17:
+			cs = 17
+			goto _test_eof
+		_test_eof18:
+			cs = 18
+			goto _test_eof
+		_test_eof55:
+			cs = 55
+			goto _test_eof
+		_test_eof56:
+			cs = 56
+			goto _test_eof
+		_test_eof57:
+			cs = 57
+			goto _test_eof
+		_test_eof58:
+			cs = 58
+			goto _test_eof
+		_test_eof59:
+			cs = 59
+			goto _test_eof
+		_test_eof60:
+			cs = 60
+			goto _test_eof
+		_test_eof19:
+			cs = 19
+			goto _test_eof
+		_test_eof20:
+			cs = 20
+			goto _test_eof
+		_test_eof61:
+			cs = 61
+			goto _test_eof
 
-	_out: {}
-	}
+		_test_eof:
+			{
+			}
+			if p == eof {
+				switch cs {
+				case 22:
+					goto tr4
+				case 2:
+					goto tr4
+				case 23:
+					goto tr42
+				case 3:
+					goto tr4
+				case 5:
+					goto tr4
+				case 24:
+					goto tr43
+				case 6:
+					goto tr4
+				case 25:
+					goto tr44
+				case 26:
+					goto tr46
+				case 27:
+					goto tr46
+				case 28:
+					goto tr48
+				case 29:
+					goto tr48
+				case 30:
+					goto tr4
+				case 31:
+					goto tr4
+				case 32:
+					goto tr44
+				case 10:
+					goto tr11
+				case 33:
+					goto tr44
+				case 34:
+					goto tr44
+				case 35:
+					goto tr44
+				case 36:
+					goto tr44
+				case 37:
+					goto tr44
+				case 38:
+					goto tr44
+				case 39:
+					goto tr44
+				case 40:
+					goto tr44
+				case 41:
+					goto tr44
+				case 42:
+					goto tr44
+				case 43:
+					goto tr44
+				case 44:
+					goto tr44
+				case 45:
+					goto tr44
+				case 46:
+					goto tr44
+				case 47:
+					goto tr44
+				case 48:
+					goto tr44
+				case 49:
+					goto tr44
+				case 50:
+					goto tr44
+				case 51:
+					goto tr44
+				case 52:
+					goto tr44
+				case 53:
+					goto tr44
+				case 54:
+					goto tr44
+				case 11:
+					goto tr11
+				case 12:
+					goto tr11
+				case 13:
+					goto tr11
+				case 14:
+					goto tr11
+				case 15:
+					goto tr11
+				case 16:
+					goto tr11
+				case 17:
+					goto tr11
+				case 18:
+					goto tr11
+				case 55:
+					goto tr44
+				case 56:
+					goto tr44
+				case 57:
+					goto tr44
+				case 58:
+					goto tr44
+				case 59:
+					goto tr44
+				case 60:
+					goto tr44
+				case 19:
+					goto tr11
+				case 20:
+					goto tr4
+				case 61:
+					goto tr79
+				}
+			}
+
+		_out:
+			{
+			}
+		}
 
-//.... lightning/mydump/parser.rl:155
+		//.... lightning/mydump/parser.rl:155
 
 		if cs == 0 {
 			parser.logSyntaxError()

From c30f0586a2451d7f9ed3bed69b5f0d4ae8874471 Mon Sep 17 00:00:00 2001
From: XuHuaiyu <391585975@qq.com>
Date: Tue, 3 Mar 2020 10:20:12 +0800
Subject: [PATCH 14/30] Replace CSV Ragel parser by a hand-written parser
 copied from encoding/csv

Conflicts:
	lightning/mydump/csv_parser_generated.go
---
 Makefile                            |   2 +-
 checkout-pr-branch.sh               |  37 ++
 lightning/mydump/csv_parser.go      | 370 +++++++++++----
 lightning/mydump/csv_parser.rl      | 107 -----
 lightning/mydump/csv_parser_test.go | 683 ++++++----------------------
 lightning/mydump/parser.go          |  32 +-
 lightning/mydump/parser_test.go     |  39 +-
 lightning/mydump/reader.go          |  62 +++
 lightning/restore/restore.go        |   1 -
 9 files changed, 567 insertions(+), 766 deletions(-)
 create mode 100755 checkout-pr-branch.sh
 delete mode 100644 lightning/mydump/csv_parser.rl

diff --git a/Makefile b/Makefile
index b41f08b86..00d1d8192 100644
--- a/Makefile
+++ b/Makefile
@@ -60,7 +60,7 @@ checksuccess:
 $(VFSGENDEV_BIN):
 	cd tools && $(GOBUILD) -o ../$(VFSGENDEV_BIN) github.com/shurcooL/vfsgen/cmd/vfsgendev
 
-data_parsers: $(VFSGENDEV_BIN) lightning/mydump/parser_generated.go lightning/mydump/csv_parser_generated.go
+data_parsers: $(VFSGENDEV_BIN) lightning/mydump/parser_generated.go
 	PATH="$(GOPATH)/bin":"$(PATH)" protoc -I. -I"$(GOPATH)/src" lightning/checkpoints/file_checkpoints.proto --gogofaster_out=.
 	$(VFSGENDEV_BIN) -source='"github.com/pingcap/tidb-lightning/lightning/web".Res' && mv res_vfsdata.go lightning/web/
 
diff --git a/checkout-pr-branch.sh b/checkout-pr-branch.sh
new file mode 100755
index 000000000..54399d232
--- /dev/null
+++ b/checkout-pr-branch.sh
@@ -0,0 +1,37 @@
+#!/usr/bin/env bash
+# Copyright 2019 PingCAP, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# This script is used to checkout a TiDB PR branch in a forked repo.
+if test -z $1; then
+	echo -e "Usage:\n"
+	echo -e "\tcheckout-pr-branch.sh [github-username]:[pr-branch]\n"
+	echo -e "The argument can be copied directly from github PR page."
+	echo -e "The local branch name would be [github-username]/[pr-branch]."
+	exit 0;
+fi
+
+username=$(echo $1 | cut -d':' -f1)
+branch=$(echo $1 | cut -d':' -f2)
+local_branch=$username/$branch
+fork="https://github.com/$username/tidb-lightning"
+# fork="https://github.com/pingcap/tidb-lightning"
+
+exists=`git show-ref refs/heads/$local_branch`
+if [ -n "$exists" ]; then
+	git checkout $local_branch
+	git pull $fork $branch:$local_branch
+else
+	git fetch $fork $branch:$local_branch
+	git checkout $local_branch
+fi
diff --git a/lightning/mydump/csv_parser.go b/lightning/mydump/csv_parser.go
index e74f9a478..b1885862c 100644
--- a/lightning/mydump/csv_parser.go
+++ b/lightning/mydump/csv_parser.go
@@ -1,6 +1,20 @@
+// Copyright 2020 PingCAP, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
 package mydump
 
 import (
+	"bytes"
 	"io"
 	"strings"
 
@@ -10,21 +24,52 @@ import (
 	"github.com/pingcap/tidb/types"
 )
 
+var (
+	errUnterminatedQuotedField = errors.NewNoStackError("syntax error: unterminated quoted field")
+	errDanglingBackslash       = errors.NewNoStackError("syntax error: no character after backslash")
+	errUnexpectedQuoteField    = errors.NewNoStackError("syntax error: cannot have consecutive fields without separator")
+)
+
+// CSVParser is basically a copy of encoding/csv, but special-cased for MySQL-like input.
 type CSVParser struct {
 	blockParser
 	cfg       *config.CSVConfig
 	escFlavor backslashEscapeFlavor
+
+	comma          byte
+	quote          byte
+	quoteStopSet   string
+	unquoteStopSet string
+
+	// recordBuffer holds the unescaped fields, one after another.
+	// The fields can be accessed by using the indexes in fieldIndexes.
+	// E.g., For the row `a,"b","c""d",e`, recordBuffer will contain `abc"de`
+	// and fieldIndexes will contain the indexes [1, 2, 5, 6].
+	recordBuffer []byte
+
+	// fieldIndexes is an index of fields inside recordBuffer.
+	// The i'th field ends at offset fieldIndexes[i] in recordBuffer.
+	fieldIndexes []int
 }
 
 func NewCSVParser(
 	cfg *config.CSVConfig,
-	reader io.Reader,
+	reader ReadSeekCloser,
 	blockBufSize int64,
 	ioWorkers *worker.Pool,
 ) *CSVParser {
+	quote := byte(0)
+	if len(cfg.Delimiter) > 0 {
+		quote = cfg.Delimiter[0]
+	}
+
 	escFlavor := backslashEscapeFlavorNone
+	quoteStopSet := cfg.Delimiter
+	unquoteStopSet := "\r\n" + cfg.Separator + cfg.Delimiter
 	if cfg.BackslashEscape {
 		escFlavor = backslashEscapeFlavorMySQL
+		quoteStopSet += `\`
+		unquoteStopSet += `\`
 		// we need special treatment of the NULL value \N, used by MySQL.
 		if !cfg.NotNull && cfg.Null == `\N` {
 			escFlavor = backslashEscapeFlavorMySQLWithNull
@@ -32,123 +77,284 @@ func NewCSVParser(
 	}
 
 	return &CSVParser{
-		blockParser: makeBlockParser(reader, blockBufSize, ioWorkers),
-		cfg:         cfg,
-		escFlavor:   escFlavor,
+		blockParser:    makeBlockParser(reader, blockBufSize, ioWorkers),
+		cfg:            cfg,
+		comma:          cfg.Separator[0],
+		quote:          quote,
+		escFlavor:      escFlavor,
+		quoteStopSet:   quoteStopSet,
+		unquoteStopSet: unquoteStopSet,
 	}
 }
 
-type csvToken byte
+func (parser *CSVParser) unescapeString(input string) (unescaped string, isNull bool) {
+	if parser.escFlavor == backslashEscapeFlavorMySQLWithNull && input == `\N` {
+		return input, true
+	}
+	unescaped = unescape(input, "", parser.escFlavor)
+	isNull = parser.escFlavor != backslashEscapeFlavorMySQLWithNull &&
+		!parser.cfg.NotNull &&
+		unescaped == parser.cfg.Null
+	return
+}
 
-const (
-	csvTokNil csvToken = iota
-	csvTokSep
-	csvTokNewLine
-	csvTokField
-)
+func (parser *CSVParser) readByte() (byte, error) {
+	if len(parser.buf) == 0 {
+		if err := parser.readBlock(); err != nil {
+			return 0, err
+		}
+	}
+	if len(parser.buf) == 0 {
+		return 0, io.EOF
+	}
+	b := parser.buf[0]
+	parser.buf = parser.buf[1:]
+	parser.pos++
+	return b, nil
+}
 
-func (parser *CSVParser) appendEmptyValues(sepCount int) {
-	var datum types.Datum
-	if !parser.cfg.NotNull && parser.cfg.Null == "" {
-		datum.SetNull()
-	} else {
-		datum.SetString("")
+func (parser *CSVParser) peekByte() (byte, error) {
+	if len(parser.buf) == 0 {
+		if err := parser.readBlock(); err != nil {
+			return 0, err
+		}
 	}
-	for i := 0; i < sepCount; i++ {
-		parser.lastRow.Row = append(parser.lastRow.Row, datum)
+	if len(parser.buf) == 0 {
+		return 0, io.EOF
 	}
+	return parser.buf[0], nil
 }
 
-func (parser *CSVParser) appendField(content string) {
-	input, isNull := parser.unescapeString(content)
+func (parser *CSVParser) skipByte() {
+	parser.buf = parser.buf[1:]
+	parser.pos++
+}
 
-	if parser.escFlavor != backslashEscapeFlavorMySQLWithNull {
-		isNull = !parser.cfg.NotNull && parser.cfg.Null == input
+// readUntil reads the buffer until any character from the `chars` set is found.
+// that character is excluded from the final buffer.
+func (parser *CSVParser) readUntil(chars string) ([]byte, byte, error) {
+	index := bytes.IndexAny(parser.buf, chars)
+	if index >= 0 {
+		ret := parser.buf[:index]
+		parser.buf = parser.buf[index:]
+		parser.pos += int64(index)
+		return ret, parser.buf[0], nil
 	}
 
-	var datum types.Datum
-	if isNull {
-		datum.SetNull()
-	} else {
-		datum.SetString(input)
+	// not found in parser.buf, need allocate and loop.
+	var buf []byte
+	for {
+		buf = append(buf, parser.buf...)
+		parser.buf = nil
+		if err := parser.readBlock(); err != nil || len(parser.buf) == 0 {
+			if err == nil {
+				err = io.EOF
+			}
+			parser.pos += int64(len(buf))
+			return buf, 0, errors.Trace(err)
+		}
+		index := bytes.IndexAny(parser.buf, chars)
+		if index >= 0 {
+			buf = append(buf, parser.buf[:index]...)
+			parser.buf = parser.buf[index:]
+			parser.pos += int64(len(buf))
+			return buf, parser.buf[0], nil
+		}
 	}
-	parser.lastRow.Row = append(parser.lastRow.Row, datum)
 }
 
-func (parser *CSVParser) unescapeString(input string) (unescaped string, isNull bool) {
-	delim := parser.cfg.Delimiter
-	if len(delim) > 0 && len(input) >= 2 && input[0] == delim[0] {
-		input = input[1 : len(input)-1]
-	} else {
-		delim = ""
+func (parser *CSVParser) readRecord() ([]string, error) {
+	parser.recordBuffer = parser.recordBuffer[:0]
+	parser.fieldIndexes = parser.fieldIndexes[:0]
+
+	isEmptyLine := true
+outside:
+	for {
+		firstByte, err := parser.readByte()
+		if err != nil {
+			if isEmptyLine || errors.Cause(err) != io.EOF {
+				return nil, err
+			}
+			// treat EOF as the same as trailing \n.
+			firstByte = '\n'
+		}
+
+		switch firstByte {
+		case parser.comma:
+			parser.fieldIndexes = append(parser.fieldIndexes, len(parser.recordBuffer))
+
+		case parser.quote:
+			if err := parser.readQuotedField(); err != nil {
+				return nil, err
+			}
+
+		case '\r', '\n':
+			// new line = end of record (ignore empty lines)
+			if isEmptyLine {
+				continue
+			}
+			parser.fieldIndexes = append(parser.fieldIndexes, len(parser.recordBuffer))
+			break outside
+
+		default:
+			if firstByte == '\\' && parser.escFlavor != backslashEscapeFlavorNone {
+				if err := parser.readByteForBackslashEscape(); err != nil {
+					return nil, err
+				}
+			} else {
+				parser.recordBuffer = append(parser.recordBuffer, firstByte)
+			}
+			if err := parser.readUnquoteField(); err != nil {
+				return nil, err
+			}
+		}
+		isEmptyLine = false
 	}
-	if parser.escFlavor == backslashEscapeFlavorMySQLWithNull && input == `\N` {
-		return input, true
+
+	// Create a single string and create slices out of it.
+	// This pins the memory of the fields together, but allocates once.
+	str := string(parser.recordBuffer) // Convert to string once to batch allocations
+	dst := make([]string, len(parser.fieldIndexes))
+	var preIdx int
+	for i, idx := range parser.fieldIndexes {
+		dst[i] = str[preIdx:idx]
+		preIdx = idx
 	}
-	return unescape(input, delim, parser.escFlavor), false
-}
 
-// ReadRow reads a row from the datafile.
-func (parser *CSVParser) ReadRow() error {
-	emptySepCount := 1
-	hasField := false
+	// Check or update the expected fields per record.
+	return dst, nil
+}
 
-	row := &parser.lastRow
-	row.RowID++
-	row.Row = make([]types.Datum, 0, len(row.Row))
+func (parser *CSVParser) readByteForBackslashEscape() error {
+	b, err := parser.readByte()
+	err = parser.replaceEOF(err, errDanglingBackslash)
+	if err != nil {
+		return err
+	}
+	parser.recordBuffer = append(parser.recordBuffer, '\\', b)
+	return nil
+}
 
-	// skip the header first
-	if parser.pos == 0 && parser.cfg.Header {
-		parser.columns = make([]string, 0, len(row.Row))
-	outside:
-		for {
-			tok, content, err := parser.lex()
+func (parser *CSVParser) readQuotedField() error {
+	for {
+		content, terminator, err := parser.readUntil(parser.quoteStopSet)
+		err = parser.replaceEOF(err, errUnterminatedQuotedField)
+		if err != nil {
+			return err
+		}
+		parser.recordBuffer = append(parser.recordBuffer, content...)
+		parser.skipByte()
+		switch terminator {
+		case parser.quote:
+			// encountered '"' -> continue if we're seeing '""'.
+			b, err := parser.peekByte()
+			err = parser.replaceEOF(err, nil)
 			if err != nil {
-				return errors.Trace(err)
+				return err
 			}
-			switch tok {
-			case csvTokSep:
-			case csvTokField:
-				colName, _ := parser.unescapeString(string(content))
-				parser.columns = append(parser.columns, strings.ToLower(colName))
-			case csvTokNewLine:
-				break outside
+			switch b {
+			case parser.quote:
+				// consume the double quotation mark and continue
+				parser.skipByte()
+				parser.recordBuffer = append(parser.recordBuffer, '"')
+			case '\r', '\n', parser.comma, 0:
+				// end the field if the next is a separator
+				return nil
+			default:
+				// in all other cases, we've got a syntax error.
+				parser.logSyntaxError()
+				return errors.AddStack(errUnexpectedQuoteField)
+			}
+		case '\\':
+			if err := parser.readByteForBackslashEscape(); err != nil {
+				return err
 			}
 		}
 	}
+}
 
+func (parser *CSVParser) readUnquoteField() error {
 	for {
-		tok, content, err := parser.lex()
-		switch errors.Cause(err) {
-		case nil:
-		case io.EOF:
-			if hasField {
-				tok = csvTokNewLine
-				break
+		content, terminator, err := parser.readUntil(parser.unquoteStopSet)
+		parser.recordBuffer = append(parser.recordBuffer, content...)
+		err = parser.replaceEOF(err, nil)
+		if err != nil {
+			return err
+		}
+
+		switch terminator {
+		case '\r', '\n', parser.comma, 0:
+			return nil
+		case parser.quote:
+			parser.logSyntaxError()
+			return errors.AddStack(errUnexpectedQuoteField)
+		case '\\':
+			parser.skipByte()
+			if err := parser.readByteForBackslashEscape(); err != nil {
+				return err
 			}
-			fallthrough
-		default:
-			return errors.Trace(err)
 		}
+	}
+}
 
-		hasField = true
+func (parser *CSVParser) replaceEOF(err error, replaced error) error {
+	if err == nil || errors.Cause(err) != io.EOF {
+		return err
+	}
+	if replaced != nil {
+		parser.logSyntaxError()
+		replaced = errors.AddStack(replaced)
+	}
+	return replaced
+}
 
-		switch tok {
-		case csvTokSep:
-			emptySepCount++
+// ReadRow reads a row from the datafile.
+func (parser *CSVParser) ReadRow() error {
+	row := &parser.lastRow
+	row.RowID++
 
-		case csvTokField:
-			parser.appendEmptyValues(emptySepCount - 1)
-			emptySepCount = 0
-			parser.appendField(string(content))
+	// skip the header first
+	if parser.pos == 0 && parser.cfg.Header {
+		columns, err := parser.readRecord()
+		if err != nil {
+			return errors.Trace(err)
+		}
+		parser.columns = make([]string, 0, len(columns))
+		for _, colName := range columns {
+			colName, _ = parser.unescapeString(colName)
+			parser.columns = append(parser.columns, strings.ToLower(colName))
+		}
+	}
 
-		case csvTokNewLine:
-			if !parser.cfg.TrimLastSep {
-				parser.appendEmptyValues(emptySepCount)
+	records, err := parser.readRecord()
+	if err != nil {
+		return errors.Trace(err)
+	}
+	// remove trailing empty values
+	if parser.cfg.TrimLastSep {
+		i := len(records)
+		for i > 0 {
+			if len(records[i-1]) > 0 {
+				break
 			}
-			return nil
+			i--
 		}
+		records = records[:i]
 	}
+
+	row.Row = make([]types.Datum, 0, len(records))
+	for _, record := range records {
+		var datum types.Datum
+		unescaped, isNull := parser.unescapeString(record)
+		if isNull {
+			datum.SetNull()
+		} else {
+			datum.SetString(unescaped)
+		}
+		row.Row = append(row.Row, datum)
+	}
+
+	return nil
 }
 
 func (parser *CSVParser) ReadUntilTokNewLine() (pos int64, err error) {
diff --git a/lightning/mydump/csv_parser.rl b/lightning/mydump/csv_parser.rl
deleted file mode 100644
index 059b7a074..000000000
--- a/lightning/mydump/csv_parser.rl
+++ /dev/null
@@ -1,107 +0,0 @@
-// Please edit `csv_parser.rl` if you want to modify this file. To generate
-// `csv_parser_generated.go`, please execute
-//
-// ```sh
-// make data_parsers
-// ```
-
-package mydump
-
-import (
-	"io"
-
-	"github.com/pingcap/errors"
-)
-
-%%{
-#`
-
-# This is a ragel parser to quickly scan through a CSV data source file.
-# You may find detailed syntax explanation on its website
-# <https://www.colm.net/open-source/ragel/>.
-
-machine csv_parser;
-
-# We are not going to use Go's `encoding/csv` package since we have some special cases to deal with.
-#
-# MySQL supports backslash escaping, so the following has 2 fields, but `encoding/csv` will report
-# a syntax error.
-#
-# 	"5\"6",7
-#
-
-q = ^[\r\n] when { fc == delim };
-bs = '\\' when { parser.escFlavor != backslashEscapeFlavorNone };
-sep = ^[\r\n] when { fc == sep };
-
-c = (^[\r\n] - q - bs - sep) | bs any;
-
-main := |*
-	sep => {
-		consumedToken = csvTokSep
-		fbreak;
-	};
-
-	q (c | [\r\n] | sep | q q)* q | c+ => {
-		consumedToken = csvTokField
-		fbreak;
-	};
-
-	[\r\n]+ => {
-		consumedToken = csvTokNewLine
-		fbreak;
-	};
-*|;
-
-#`
-}%%
-
-%% write data;
-
-func (parser *CSVParser) lex() (csvToken, []byte, error) {
-	var delim byte
-	if len(parser.cfg.Delimiter) > 0 {
-		delim = parser.cfg.Delimiter[0]
-	}
-	sep := parser.cfg.Separator[0]
-
-	var cs, ts, te, act, p int
-	%% write init;
-
-	for {
-		data := parser.buf
-		consumedToken := csvTokNil
-		pe := len(data)
-		eof := -1
-		if parser.isLastChunk {
-			eof = pe
-		}
-
-		%% write exec;
-
-		if cs == %%{ write error; }%% {
-			parser.logSyntaxError()
-			return csvTokNil, nil, errors.New("syntax error")
-		}
-
-		if consumedToken != csvTokNil {
-			result := data[ts:te]
-			parser.buf = data[te:]
-			parser.pos += int64(te)
-			return consumedToken, result, nil
-		}
-
-		if parser.isLastChunk {
-			return csvTokNil, nil, io.EOF
-		}
-
-		parser.buf = parser.buf[ts:]
-		parser.pos += int64(ts)
-		p -= ts
-		te -= ts
-		ts = 0
-		if err := parser.readBlock(); err != nil {
-			return csvTokNil, nil, errors.Trace(err)
-		}
-	}
-}
diff --git a/lightning/mydump/csv_parser_test.go b/lightning/mydump/csv_parser_test.go
index 9e509b7b0..0ce212d70 100644
--- a/lightning/mydump/csv_parser_test.go
+++ b/lightning/mydump/csv_parser_test.go
@@ -1,19 +1,22 @@
 package mydump_test
 
 import (
-	// "fmt"
 	"context"
+	"encoding/csv"
 	"io"
+	"os"
+	"path/filepath"
 	"strings"
 
 	. "github.com/pingcap/check"
 	"github.com/pingcap/errors"
+	"github.com/pingcap/tidb/types"
+	"go.uber.org/zap"
+
 	"github.com/pingcap/tidb-lightning/lightning/config"
 	"github.com/pingcap/tidb-lightning/lightning/log"
 	"github.com/pingcap/tidb-lightning/lightning/mydump"
 	"github.com/pingcap/tidb-lightning/lightning/worker"
-	"github.com/pingcap/tidb/types"
-	"go.uber.org/zap/zaptest"
 )
 
 var _ = Suite(&testMydumpCSVParserSuite{})
@@ -52,10 +55,11 @@ type testCase struct {
 
 func (s *testMydumpCSVParserSuite) runTestCases(c *C, cfg *config.CSVConfig, blockBufSize int64, cases []testCase) {
 	for _, tc := range cases {
-		parser := mydump.NewCSVParser(cfg, strings.NewReader(tc.input), blockBufSize, s.ioWorkers)
+		parser := mydump.NewCSVParser(cfg, mydump.NewStringReader(tc.input), blockBufSize, s.ioWorkers)
 		for i, row := range tc.expected {
 			comment := Commentf("input = %q, row = %d", tc.input, i+1)
-			c.Assert(parser.ReadRow(), IsNil, comment)
+			e := parser.ReadRow()
+			c.Assert(e, IsNil, Commentf("input = %q, row = %d, error = %s", tc.input, i+1, errors.ErrorStack(e)))
 			c.Assert(parser.LastRow(), DeepEquals, mydump.Row{RowID: int64(i) + 1, Row: row}, comment)
 		}
 		c.Assert(errors.Cause(parser.ReadRow()), Equals, io.EOF, Commentf("input = %q", tc.input))
@@ -64,13 +68,14 @@ func (s *testMydumpCSVParserSuite) runTestCases(c *C, cfg *config.CSVConfig, blo
 
 func (s *testMydumpCSVParserSuite) runFailingTestCases(c *C, cfg *config.CSVConfig, blockBufSize int64, cases []string) {
 	for _, tc := range cases {
-		parser := mydump.NewCSVParser(cfg, strings.NewReader(tc), blockBufSize, s.ioWorkers)
-		c.Assert(parser.ReadRow(), ErrorMatches, "syntax error", Commentf("input = %q", tc))
+		parser := mydump.NewCSVParser(cfg, mydump.NewStringReader(tc), blockBufSize, s.ioWorkers)
+		e := parser.ReadRow()
+		c.Assert(e, ErrorMatches, "syntax error.*", Commentf("input = %q / %s", tc, errors.ErrorStack(e)))
 	}
 }
 
-func (s *testMydumpCSVParserSuite) TestTCPH(c *C) {
-	reader := strings.NewReader(
+func (s *testMydumpCSVParserSuite) TestTPCH(c *C) {
+	reader := mydump.NewStringReader(
 		`1|goldenrod lavender spring chocolate lace|Manufacturer#1|Brand#13|PROMO BURNISHED COPPER|7|JUMBO PKG|901.00|ly. slyly ironi|
 2|blush thistle blue yellow saddle|Manufacturer#1|Brand#13|LARGE BRUSHED BRASS|1|LG CASE|902.00|lar accounts amo|
 3|spring green yellow purple cornsilk|Manufacturer#4|Brand#42|STANDARD POLISHED BRASS|21|WRAP CASE|903.00|egular deposits hag|
@@ -146,7 +151,7 @@ func (s *testMydumpCSVParserSuite) TestRFC4180(c *C) {
 
 	// example 1, trailing new lines
 
-	parser := mydump.NewCSVParser(&cfg, strings.NewReader("aaa,bbb,ccc\nzzz,yyy,xxx\n"), config.ReadBlockSize, s.ioWorkers)
+	parser := mydump.NewCSVParser(&cfg, mydump.NewStringReader("aaa,bbb,ccc\nzzz,yyy,xxx\n"), config.ReadBlockSize, s.ioWorkers)
 
 	c.Assert(parser.ReadRow(), IsNil)
 	c.Assert(parser.LastRow(), DeepEquals, mydump.Row{
@@ -174,7 +179,7 @@ func (s *testMydumpCSVParserSuite) TestRFC4180(c *C) {
 
 	// example 2, no trailing new lines
 
-	parser = mydump.NewCSVParser(&cfg, strings.NewReader("aaa,bbb,ccc\nzzz,yyy,xxx"), config.ReadBlockSize, s.ioWorkers)
+	parser = mydump.NewCSVParser(&cfg, mydump.NewStringReader("aaa,bbb,ccc\nzzz,yyy,xxx"), config.ReadBlockSize, s.ioWorkers)
 
 	c.Assert(parser.ReadRow(), IsNil)
 	c.Assert(parser.LastRow(), DeepEquals, mydump.Row{
@@ -202,7 +207,7 @@ func (s *testMydumpCSVParserSuite) TestRFC4180(c *C) {
 
 	// example 5, quoted fields
 
-	parser = mydump.NewCSVParser(&cfg, strings.NewReader(`"aaa","bbb","ccc"`+"\nzzz,yyy,xxx"), config.ReadBlockSize, s.ioWorkers)
+	parser = mydump.NewCSVParser(&cfg, mydump.NewStringReader(`"aaa","bbb","ccc"`+"\nzzz,yyy,xxx"), config.ReadBlockSize, s.ioWorkers)
 
 	c.Assert(parser.ReadRow(), IsNil)
 	c.Assert(parser.LastRow(), DeepEquals, mydump.Row{
@@ -230,7 +235,7 @@ func (s *testMydumpCSVParserSuite) TestRFC4180(c *C) {
 
 	// example 6, line breaks within fields
 
-	parser = mydump.NewCSVParser(&cfg, strings.NewReader(`"aaa","b
+	parser = mydump.NewCSVParser(&cfg, mydump.NewStringReader(`"aaa","b
 bb","ccc"
 zzz,yyy,xxx`), config.ReadBlockSize, s.ioWorkers)
 
@@ -260,7 +265,7 @@ zzz,yyy,xxx`), config.ReadBlockSize, s.ioWorkers)
 
 	// example 7, quote escaping
 
-	parser = mydump.NewCSVParser(&cfg, strings.NewReader(`"aaa","b""bb","ccc"`), config.ReadBlockSize, s.ioWorkers)
+	parser = mydump.NewCSVParser(&cfg, mydump.NewStringReader(`"aaa","b""bb","ccc"`), config.ReadBlockSize, s.ioWorkers)
 
 	c.Assert(parser.ReadRow(), IsNil)
 	c.Assert(parser.LastRow(), DeepEquals, mydump.Row{
@@ -285,7 +290,7 @@ func (s *testMydumpCSVParserSuite) TestMySQL(c *C) {
 		Null:            `\N`,
 	}
 
-	parser := mydump.NewCSVParser(&cfg, strings.NewReader(`"\"","\\","\?"
+	parser := mydump.NewCSVParser(&cfg, mydump.NewStringReader(`"\"","\\","\?"
 "\
 ",\N,\\N`), config.ReadBlockSize, s.ioWorkers)
 
@@ -349,7 +354,7 @@ func (s *testMydumpCSVParserSuite) TestTSV(c *C) {
 		Header:          true,
 	}
 
-	parser := mydump.NewCSVParser(&cfg, strings.NewReader(`a	b	c	d	e	f
+	parser := mydump.NewCSVParser(&cfg, mydump.NewStringReader(`a	b	c	d	e	f
 0				foo	0000-00-00
 0				foo	0000-00-00
 0	abc	def	ghi	bar	1999-12-31`), config.ReadBlockSize, s.ioWorkers)
@@ -406,17 +411,17 @@ func (s *testMydumpCSVParserSuite) TestEmpty(c *C) {
 		Delimiter: `"`,
 	}
 
-	parser := mydump.NewCSVParser(&cfg, strings.NewReader(""), config.ReadBlockSize, s.ioWorkers)
+	parser := mydump.NewCSVParser(&cfg, mydump.NewStringReader(""), config.ReadBlockSize, s.ioWorkers)
 	c.Assert(errors.Cause(parser.ReadRow()), Equals, io.EOF)
 
 	// Try again with headers.
 
 	cfg.Header = true
 
-	parser = mydump.NewCSVParser(&cfg, strings.NewReader(""), config.ReadBlockSize, s.ioWorkers)
+	parser = mydump.NewCSVParser(&cfg, mydump.NewStringReader(""), config.ReadBlockSize, s.ioWorkers)
 	c.Assert(errors.Cause(parser.ReadRow()), Equals, io.EOF)
 
-	parser = mydump.NewCSVParser(&cfg, strings.NewReader("h\n"), config.ReadBlockSize, s.ioWorkers)
+	parser = mydump.NewCSVParser(&cfg, mydump.NewStringReader("h\n"), config.ReadBlockSize, s.ioWorkers)
 	c.Assert(errors.Cause(parser.ReadRow()), Equals, io.EOF)
 }
 
@@ -425,7 +430,7 @@ func (s *testMydumpCSVParserSuite) TestCRLF(c *C) {
 		Separator: ",",
 		Delimiter: `"`,
 	}
-	parser := mydump.NewCSVParser(&cfg, strings.NewReader("a\rb\r\nc\n\n\n\nd"), config.ReadBlockSize, s.ioWorkers)
+	parser := mydump.NewCSVParser(&cfg, mydump.NewStringReader("a\rb\r\nc\n\n\n\nd"), config.ReadBlockSize, s.ioWorkers)
 
 	c.Assert(parser.ReadRow(), IsNil)
 	c.Assert(parser.LastRow(), DeepEquals, mydump.Row{
@@ -460,7 +465,7 @@ func (s *testMydumpCSVParserSuite) TestQuotedSeparator(c *C) {
 		Delimiter: `"`,
 	}
 
-	parser := mydump.NewCSVParser(&cfg, strings.NewReader(`",",','`), config.ReadBlockSize, s.ioWorkers)
+	parser := mydump.NewCSVParser(&cfg, mydump.NewStringReader(`",",','`), config.ReadBlockSize, s.ioWorkers)
 	c.Assert(parser.ReadRow(), IsNil)
 	c.Assert(parser.LastRow(), DeepEquals, mydump.Row{
 		RowID: 1,
@@ -481,29 +486,19 @@ func (s *testMydumpCSVParserSuite) TestConsecutiveFields(c *C) {
 	// Go's CSV package returns a parse error.
 	// NPM's CSV package returns a parse error.
 	// MySQL's LOAD DATA statement returns `"xxx"yyy` as-is.
-	// For simplicity we treat this as two separate fields.
 
 	cfg := config.CSVConfig{
 		Separator: ",",
 		Delimiter: `"`,
 	}
 
-	testCases := []testCase{
-		{
-			input:    `"x"?`,
-			expected: [][]types.Datum{{types.NewStringDatum("x"), types.NewStringDatum("?")}},
-		},
-		{
-			input:    "\"\"\x01",
-			expected: [][]types.Datum{{nullDatum, types.NewStringDatum("\x01")}},
-		},
-		{
-			input:    "\"\"\v",
-			expected: [][]types.Datum{{nullDatum, types.NewStringDatum("\v")}},
-		},
+	testCases := []string{
+		`"x"?`,
+		"\"\"\x01",
+		"\"\"\v",
 	}
 
-	s.runTestCases(c, &cfg, config.ReadBlockSize, testCases)
+	s.runFailingTestCases(c, &cfg, config.ReadBlockSize, testCases)
 }
 
 func (s *testMydumpCSVParserSuite) TestSpecialChars(c *C) {
@@ -531,7 +526,11 @@ func (s *testMydumpCSVParserSuite) TestSpecialChars(c *C) {
 		},
 		{
 			input:    "\n\r",
-			expected: [][]types.Datum{{nullDatum}},
+			expected: [][]types.Datum{},
+		},
+		{
+			input:    `"""",0`,
+			expected: [][]types.Datum{{types.NewStringDatum(`"`), types.NewStringDatum(`0`)}},
 		},
 	}
 
@@ -562,116 +561,13 @@ func (s *testMydumpCSVParserSuite) TestContinuation(c *C) {
 				},
 			},
 		},
-	}
-
-	s.runTestCases(c, &cfg, 1, testCases)
-}
-
-func (s *testMydumpCSVParserSuite) TestOverlappingSepDelim(c *C) {
-	// If the same character is simultaneously a separator and a delimiter,
-	// we treat paired characters as a delimiter and an orphan character as a
-	// separator, due to behavior of picking longest match in Ragel's tokenizer.
-	cfg := config.CSVConfig{
-		Separator: ",",
-		Delimiter: ",",
-	}
-
-	testCases := []testCase{
-		{
-			input:    `,`,
-			expected: [][]types.Datum{{nullDatum, nullDatum}},
-		},
-		{
-			input:    "0000,0",
-			expected: [][]types.Datum{{types.NewStringDatum("0000"), types.NewStringDatum("0")}},
-		},
 		{
-			input:    ",0",
-			expected: [][]types.Datum{{nullDatum, types.NewStringDatum("0")}},
-		},
-		{
-			input:    ",\r",
-			expected: [][]types.Datum{{nullDatum, nullDatum}},
-		},
-		{
-			input:    ",\n",
-			expected: [][]types.Datum{{nullDatum, nullDatum}},
-		},
-		{
-			input:    ",\r\n",
-			expected: [][]types.Datum{{nullDatum, nullDatum}},
-		},
-		{
-			input:    ",,",
-			expected: [][]types.Datum{{nullDatum}},
-		},
-		{
-			input:    ",c",
-			expected: [][]types.Datum{{nullDatum, types.NewStringDatum("c")}},
-		},
-		{
-			input:    ",\x04",
-			expected: [][]types.Datum{{nullDatum, types.NewStringDatum("\x04")}},
-		},
-		{
-			input:    ",\f",
-			expected: [][]types.Datum{{nullDatum, types.NewStringDatum("\f")}},
-		},
-		{
-			input:    ",0,",
-			expected: [][]types.Datum{{types.NewStringDatum("0")}},
-		},
-		{
-			input:    `,\`,
-			expected: [][]types.Datum{{nullDatum, types.NewStringDatum(`\`)}},
-		},
-		{
-			input:    "0,00,0",
-			expected: [][]types.Datum{{types.NewStringDatum("0"), types.NewStringDatum("00"), types.NewStringDatum("0")}},
-		},
-		{
-			input:    ",,0",
-			expected: [][]types.Datum{{nullDatum, types.NewStringDatum("0")}},
-		},
-		{
-			input:    ",,\f",
-			expected: [][]types.Datum{{nullDatum, types.NewStringDatum("\f")}},
-		},
-		{
-			input:    ",,\x8f",
-			expected: [][]types.Datum{{nullDatum, types.NewStringDatum("\x8f")}},
-		},
-		{
-			input:    ",,,",
-			expected: [][]types.Datum{{types.NewStringDatum(",")}},
+			input:    `"VzMXdTXsLbiIqTYQlwPSudocNPKVsAqXgnuvupXEzlxkaFpBtHNDyoVEydoEgdnhsygaNHLpMTdEkpkrkNdzVjCbSoXvUqwoVaca"`,
+			expected: [][]types.Datum{{types.NewStringDatum("VzMXdTXsLbiIqTYQlwPSudocNPKVsAqXgnuvupXEzlxkaFpBtHNDyoVEydoEgdnhsygaNHLpMTdEkpkrkNdzVjCbSoXvUqwoVaca")}},
 		},
 	}
 
 	s.runTestCases(c, &cfg, 1, testCases)
-
-	cfg.BackslashEscape = true
-	testCases = []testCase{
-		{
-			input:    ",,\x02",
-			expected: [][]types.Datum{{nullDatum, types.NewStringDatum("\x02")}},
-		},
-		{
-			input:    ",,\n",
-			expected: [][]types.Datum{{nullDatum}},
-		},
-		{
-			input:    ",,\r",
-			expected: [][]types.Datum{{nullDatum}},
-		},
-	}
-
-	s.runTestCases(c, &cfg, 1, testCases)
-
-	failingInputs := []string{
-		`,\`,
-		`,,\`,
-	}
-	s.runFailingTestCases(c, &cfg, 1, failingInputs)
 }
 
 func (s *testMydumpCSVParserSuite) TestBackslashAsSep(c *C) {
@@ -697,58 +593,9 @@ func (s *testMydumpCSVParserSuite) TestBackslashAsSep(c *C) {
 		`"\`,
 	}
 	s.runFailingTestCases(c, &cfg, 1, failingInputs)
-
-	cfg.BackslashEscape = true
-
-	testCases = []testCase{
-		{
-			input:    `0\`,
-			expected: [][]types.Datum{{types.NewStringDatum("0"), nullDatum}},
-		},
-		{
-			input:    `\`,
-			expected: [][]types.Datum{{nullDatum, nullDatum}},
-		},
-		{
-			input:    `""""\0`,
-			expected: [][]types.Datum{{types.NewStringDatum(`"`), types.NewStringDatum("\x00")}},
-		},
-		{
-			input:    `\0`,
-			expected: [][]types.Datum{{types.NewStringDatum("\x00")}},
-		},
-		{
-			input:    `"\"`,
-			expected: [][]types.Datum{{types.NewStringDatum(`\`)}},
-		},
-		{
-			input:    `"\"\`,
-			expected: [][]types.Datum{{types.NewStringDatum(`\`), nullDatum}},
-		},
-	}
-
-	s.runTestCases(c, &cfg, 1, testCases)
-
-	failingInputs = []string{
-		`"\`,
-		"\"\\\xef",
-		`"000\0`,
-		`"\0`,
-		`"\\`,
-		"\"\\\v",
-		"\"\\\n",
-		"\"\\\x00",
-		"\"\\\r",
-	}
-	s.runFailingTestCases(c, &cfg, 1, failingInputs)
 }
 
 func (s *testMydumpCSVParserSuite) TestBackslashAsDelim(c *C) {
-	// Most of these are just documenting the current behavior for coverage,
-	// there's no sane way to describe the desired behavior. The expected
-	// results of these tests may change according to the parser's internals.
-	//
-	// We'll deny these cases when checking the config.
 	cfg := config.CSVConfig{
 		Separator: ",",
 		Delimiter: `\`,
@@ -766,358 +613,6 @@ func (s *testMydumpCSVParserSuite) TestBackslashAsDelim(c *C) {
 		`"\`,
 	}
 	s.runFailingTestCases(c, &cfg, 1, failingInputs)
-
-	cfg.BackslashEscape = true
-
-	testCases = []testCase{
-		{
-			input:    `\0`,
-			expected: [][]types.Datum{{nullDatum}},
-		},
-		{
-			input:    "\\\x00",
-			expected: [][]types.Datum{{nullDatum}},
-		},
-		{
-			input:    `\\`,
-			expected: [][]types.Datum{{nullDatum}},
-		},
-		{
-			input:    "\\\r",
-			expected: [][]types.Datum{{nullDatum}},
-		},
-		{
-			input:    "\\\n",
-			expected: [][]types.Datum{{nullDatum}},
-		},
-		{
-			input:    "000\r\\0",
-			expected: [][]types.Datum{{types.NewStringDatum("000")}, {nullDatum}},
-		},
-		{
-			input:    "\\\xe3",
-			expected: [][]types.Datum{{nullDatum}},
-		},
-		{
-			input:    "\\\v",
-			expected: [][]types.Datum{{nullDatum}},
-		},
-		{
-			input:    "\\0\xbf",
-			expected: [][]types.Datum{{types.NewStringDatum("0")}},
-		},
-		{
-			input:    `\0\`,
-			expected: [][]types.Datum{{types.NewStringDatum("0")}},
-		},
-		{
-			input:    "\\0\n",
-			expected: [][]types.Datum{{nullDatum}},
-		},
-		{
-			input:    "\\0\r",
-			expected: [][]types.Datum{{nullDatum}},
-		},
-		{
-			input:    "\\0\v",
-			expected: [][]types.Datum{{types.NewStringDatum("0")}},
-		},
-		{
-			input:    "00\n\\00",
-			expected: [][]types.Datum{{types.NewStringDatum("00")}, {types.NewStringDatum("0")}},
-		},
-		{
-			input:    `\\0`,
-			expected: [][]types.Datum{{types.NewStringDatum(`\`)}},
-		},
-		{
-			input:    "00,\\00",
-			expected: [][]types.Datum{{types.NewStringDatum("00"), types.NewStringDatum("0")}},
-		},
-		{
-			input:    "\\\\\x00",
-			expected: [][]types.Datum{{types.NewStringDatum(`\`)}},
-		},
-		{
-			input:    `\01`,
-			expected: [][]types.Datum{{types.NewStringDatum("0")}},
-		},
-		{
-			input:    "\\0\x00",
-			expected: [][]types.Datum{{types.NewStringDatum("0")}},
-		},
-		{
-			input:    `\,`,
-			expected: [][]types.Datum{{nullDatum}},
-		},
-		{
-			input:    "\\\\\r",
-			expected: [][]types.Datum{{nullDatum}},
-		},
-		{
-			input:    `\0\\`,
-			expected: [][]types.Datum{{types.NewStringDatum(`0\`)}},
-		},
-		{
-			input:    `\0,`,
-			expected: [][]types.Datum{{nullDatum, nullDatum}},
-		},
-		{
-			input:    `\\\\\\\\\\0`,
-			expected: [][]types.Datum{{types.NewStringDatum(`\\\`)}},
-		},
-		{
-			input:    `\\,`,
-			expected: [][]types.Datum{{nullDatum, nullDatum}},
-		},
-		{
-			input:    "\\0\\\r",
-			expected: [][]types.Datum{{types.NewStringDatum(`0\`)}},
-		},
-		{
-			input:    "\\0\\\n",
-			expected: [][]types.Datum{{types.NewStringDatum(`0\`)}},
-		},
-		{
-			input:    "\\0\r\\",
-			expected: [][]types.Datum{{types.NewStringDatum("0\r")}},
-		},
-		{
-			input:    "\\\\\n",
-			expected: [][]types.Datum{{nullDatum}},
-		},
-		{
-			input:    `\0\0`,
-			expected: [][]types.Datum{{types.NewStringDatum(`0\`)}},
-		},
-		{
-			input:    "0\n\\0\\0",
-			expected: [][]types.Datum{{types.NewStringDatum(`0`)}, {types.NewStringDatum(`0\`)}},
-		},
-		{
-			input:    "\\0\n\\\v",
-			expected: [][]types.Datum{{types.NewStringDatum("0\n"), types.NewStringDatum("\v")}},
-		},
-		{
-			input:    "\\0\\\v",
-			expected: [][]types.Datum{{types.NewStringDatum(`0\`)}},
-		},
-		{
-			input:    "\\0\n\\0",
-			expected: [][]types.Datum{{types.NewStringDatum("0\n"), types.NewStringDatum("0")}},
-		},
-		{
-			input:    "\\0\\\x00",
-			expected: [][]types.Datum{{types.NewStringDatum(`0\`)}},
-		},
-		{
-			input:    "\\0\n\\\n",
-			expected: [][]types.Datum{{types.NewStringDatum("0\n")}},
-		},
-		{
-			input:    "\\0\r\\\r",
-			expected: [][]types.Datum{{types.NewStringDatum("0\r")}},
-		},
-		{
-			input:    "\n\\0\n\\0",
-			expected: [][]types.Datum{{nullDatum}, {types.NewStringDatum("0\n"), types.NewStringDatum("0")}},
-		},
-		{
-			input:    "\\0\n\\\x01",
-			expected: [][]types.Datum{{types.NewStringDatum("0\n"), types.NewStringDatum("\x01")}},
-		},
-	}
-	s.runTestCases(c, &cfg, 1, testCases)
-
-	failingInputs = []string{
-		`0\`,
-		`\`,
-		`\\\`,
-		`\0,\\`,
-	}
-	s.runFailingTestCases(c, &cfg, 1, failingInputs)
-}
-
-func (s *testMydumpCSVParserSuite) TestBackslashAsSepAndDelim(c *C) {
-	// Most of these are just documenting the current behavior for coverage,
-	// there's no sane way to describe the desired behavior. The expected
-	// results of these tests may change according to the parser's internals.
-	//
-	// We'll deny these cases when checking the config.
-	cfg := config.CSVConfig{
-		Separator: `\`,
-		Delimiter: `\`,
-	}
-
-	testCases := []testCase{
-		{
-			input:    `\`,
-			expected: [][]types.Datum{{nullDatum, nullDatum}},
-		},
-		{
-			input:    `\0\`,
-			expected: [][]types.Datum{{types.NewStringDatum("0")}},
-		},
-		{
-			input:    `\\`,
-			expected: [][]types.Datum{{nullDatum}},
-		},
-		{
-			input:    `\\\`,
-			expected: [][]types.Datum{{types.NewStringDatum(`\`)}},
-		},
-	}
-	s.runTestCases(c, &cfg, 1, testCases)
-
-	cfg.BackslashEscape = true
-
-	testCases = []testCase{
-		{
-			input:    `0\`,
-			expected: [][]types.Datum{{types.NewStringDatum("0"), nullDatum}},
-		},
-		{
-			input:    `\`,
-			expected: [][]types.Datum{{nullDatum, nullDatum}},
-		},
-		{
-			input:    "\\\xe7",
-			expected: [][]types.Datum{{nullDatum}},
-		},
-		{
-			input:    `\0`,
-			expected: [][]types.Datum{{nullDatum}},
-		},
-		{
-			input:    "\\\x00",
-			expected: [][]types.Datum{{nullDatum}},
-		},
-		{
-			input:    `\\`,
-			expected: [][]types.Datum{{nullDatum}},
-		},
-		{
-			input:    "\\\r",
-			expected: [][]types.Datum{{nullDatum}},
-		},
-		{
-			input:    "\\\n",
-			expected: [][]types.Datum{{nullDatum}},
-		},
-		{
-			input:    "000\r\\0",
-			expected: [][]types.Datum{{types.NewStringDatum("000")}, {nullDatum}},
-		},
-		{
-			input:    "\\\v",
-			expected: [][]types.Datum{{nullDatum}},
-		},
-		{
-			input:    `\0\`,
-			expected: [][]types.Datum{{types.NewStringDatum("0")}},
-		},
-		{
-			input:    "00\r\\\\0",
-			expected: [][]types.Datum{{types.NewStringDatum("00")}, {types.NewStringDatum(`\`)}},
-		},
-		{
-			input:    "\\0\n\\",
-			expected: [][]types.Datum{{types.NewStringDatum("0\n")}},
-		},
-		{
-			input:    "\\\\r",
-			expected: [][]types.Datum{{types.NewStringDatum(`\`)}},
-		},
-		{
-			input:    "\\\\\r",
-			expected: [][]types.Datum{{nullDatum}},
-		},
-		{
-			input:    "\\\\0",
-			expected: [][]types.Datum{{types.NewStringDatum(`\`)}},
-		},
-		{
-			input:    "\\\\\v",
-			expected: [][]types.Datum{{types.NewStringDatum(`\`)}},
-		},
-		{
-			input:    "\\\\\x00",
-			expected: [][]types.Datum{{types.NewStringDatum(`\`)}},
-		},
-		{
-			input:    "\\\\\n",
-			expected: [][]types.Datum{{nullDatum}},
-		},
-		{
-			input:    `\\\`,
-			expected: [][]types.Datum{{types.NewStringDatum(`\`)}},
-		},
-		{
-			input:    "\\0\\\v",
-			expected: [][]types.Datum{{types.NewStringDatum(`0\`)}},
-		},
-		{
-			input:    "\\0\n\\\\",
-			expected: [][]types.Datum{{types.NewStringDatum("0\n\\")}},
-		},
-		{
-			input:    "\\0\n\\0",
-			expected: [][]types.Datum{{types.NewStringDatum("0\n"), types.NewStringDatum("0")}},
-		},
-		{
-			input:    `\0\\`,
-			expected: [][]types.Datum{{types.NewStringDatum(`0\`)}},
-		},
-		{
-			input:    "\\0\\\x00",
-			expected: [][]types.Datum{{types.NewStringDatum(`0\`)}},
-		},
-		{
-			input:    "\\0\n\\\n",
-			expected: [][]types.Datum{{types.NewStringDatum("0\n")}},
-		},
-		{
-			input:    "\\0\\t",
-			expected: [][]types.Datum{{types.NewStringDatum(`0\`)}},
-		},
-		{
-			input:    "\\0\n\\\x04",
-			expected: [][]types.Datum{{types.NewStringDatum("0\n"), types.NewStringDatum("\x04")}},
-		},
-		{
-			input:    "\\0\\\r",
-			expected: [][]types.Datum{{types.NewStringDatum(`0\`)}},
-		},
-		{
-			input:    "\\0\r\\\r",
-			expected: [][]types.Datum{{types.NewStringDatum("0\r")}},
-		},
-		{
-			input:    "\\0\n\\\xdf",
-			expected: [][]types.Datum{{types.NewStringDatum("0\n"), types.NewStringDatum("\xdf")}},
-		},
-		{
-			input:    "\n\\0\n\\0",
-			expected: [][]types.Datum{{nullDatum}, {types.NewStringDatum("0\n"), types.NewStringDatum("0")}},
-		},
-		{
-			input:    "\\0\r\\\v",
-			expected: [][]types.Datum{{types.NewStringDatum("0\r"), types.NewStringDatum("\v")}},
-		},
-		{
-			input:    "\\0\\\n",
-			expected: [][]types.Datum{{types.NewStringDatum(`0\`)}},
-		},
-		{
-			input:    `\0\0`,
-			expected: [][]types.Datum{{types.NewStringDatum(`0\`)}},
-		},
-		{
-			input:    "0\n\\0\\0",
-			expected: [][]types.Datum{{types.NewStringDatum("0")}, {types.NewStringDatum(`0\`)}},
-		},
-	}
-	s.runTestCases(c, &cfg, 1, testCases)
 }
 
 // errorReader implements the Reader interface which always returns an error.
@@ -1127,6 +622,14 @@ func (*errorReader) Read(p []byte) (int, error) {
 	return 0, errors.New("fake read error")
 }
 
+func (*errorReader) Seek(offset int64, whence int) (int64, error) {
+	return 0, errors.New("fake seek error")
+}
+
+func (*errorReader) Close() error {
+	return errors.New("fake close error")
+}
+
 func (s *testMydumpCSVParserSuite) TestReadError(c *C) {
 	cfg := config.CSVConfig{
 		Separator: ",",
@@ -1144,15 +647,101 @@ func (s *testMydumpCSVParserSuite) TestSyntaxErrorLog(c *C) {
 		Delimiter: "'",
 	}
 
-	tc := strings.NewReader("x'" + strings.Repeat("y", 50000))
+	tc := mydump.NewStringReader("x'" + strings.Repeat("y", 50000))
 	parser := mydump.NewCSVParser(&cfg, tc, 50000, s.ioWorkers)
-	var buffer *zaptest.Buffer
-	parser.Logger, buffer = log.MakeTestLogger()
+	logger, buffer := log.MakeTestLogger()
+	parser.SetLogger(logger)
 	c.Assert(parser.ReadRow(), ErrorMatches, "syntax error.*")
-	c.Assert(parser.Logger.Sync(), IsNil)
+	c.Assert(logger.Sync(), IsNil)
 
 	c.Assert(
 		buffer.Stripped(), Equals,
 		`{"$lvl":"ERROR","$msg":"syntax error","pos":1,"content":"'`+strings.Repeat("y", 255)+`"}`,
 	)
 }
+
+// Run `go test github.com/pingcap/tidb-lightning/lightning/mydump -check.b -check.bmem -test.v` to get benchmark result.
+// Please ensure your temporary storage has (c.N / 2) KiB of free space.
+
+type benchCSVParserSuite struct {
+	csvPath   string
+	ioWorkers *worker.Pool
+}
+
+var _ = Suite(&benchCSVParserSuite{})
+
+func (s *benchCSVParserSuite) setupTest(c *C) {
+	s.ioWorkers = worker.NewPool(context.Background(), 5, "bench_csv")
+
+	dir := c.MkDir()
+	s.csvPath = filepath.Join(dir, "input.csv")
+	file, err := os.Create(s.csvPath)
+	c.Assert(err, IsNil)
+	defer func() {
+		c.Assert(file.Close(), IsNil)
+	}()
+	for i := 0; i < c.N; i++ {
+		_, err = file.WriteString("18,1,1,0.3650,GC,BARBARBAR,rw9AOV1AjoI1,50000.00,-10.00,10.00,1,1,djj3Q2XaIPoYVy1FuF,gc80Q2o82Au3C9xv,PYOolSxG3w,DI,265111111,7586538936787184,2020-02-26 20:06:00.193,OE,YCkSPBVqoJ2V5F8zWs87V5XzbaIY70aWCD4dgcB6bjUzCr5wOJCJ2TYH49J7yWyysbudJIxlTAEWSJahY7hswLtTsqyjEkrlsN8iDMAa9Poj29miJ08tnn2G8mL64IlyywvnRGbLbyGvWDdrOSF42RyUFTWVyqlDWc6Gr5wyMPYgvweKemzFDVD3kro5JsmBmJY08EK54nQoyfo2sScyb34zcM9GFo9ZQTwloINfPYQKXQm32m0XvU7jiNmYpFTFJQjdqA825SEvQqMMefG2WG4jVu9UPdhdUjRsFRd0Gw7YPKByOlcuY0eKxT7sAzMKXx2000RR6dqHNXe47oVYd\n")
+		c.Assert(err, IsNil)
+	}
+	c.ResetTimer()
+}
+
+func (s *benchCSVParserSuite) BenchmarkReadRowUsingMydumpCSVParser(c *C) {
+	s.setupTest(c)
+
+	file, err := os.Open(s.csvPath)
+	c.Assert(err, IsNil)
+	defer func() {
+		c.Assert(file.Close(), IsNil)
+	}()
+
+	cfg := config.CSVConfig{Separator: ","}
+	parser := mydump.NewCSVParser(&cfg, file, 65536, s.ioWorkers)
+	parser.SetLogger(log.Logger{Logger: zap.NewNop()})
+
+	rowsCount := 0
+	for {
+		err := parser.ReadRow()
+		if err == nil {
+			rowsCount++
+			continue
+		}
+		if errors.Cause(err) == io.EOF {
+			return
+		}
+		c.Fatal(err)
+	}
+	c.Assert(rowsCount, Equals, c.N)
+}
+
+func (s *benchCSVParserSuite) BenchmarkReadRowUsingEncodingCSV(c *C) {
+	s.setupTest(c)
+
+	file, err := os.Open(s.csvPath)
+	c.Assert(err, IsNil)
+	defer func() {
+		c.Assert(file.Close(), IsNil)
+	}()
+
+	csvParser := csv.NewReader(file)
+
+	rowsCount := 0
+	for {
+		records, err := csvParser.Read()
+		if err == nil {
+			// for fair comparison, we need to include the cost of conversion to Datum.
+			datums := make([]types.Datum, 0, len(records))
+			for _, record := range records {
+				datums = append(datums, types.NewStringDatum(record))
+			}
+			rowsCount++
+			continue
+		}
+		if errors.Cause(err) == io.EOF {
+			return
+		}
+		c.Fatal(err)
+	}
+	c.Assert(rowsCount, Equals, c.N)
+}
diff --git a/lightning/mydump/parser.go b/lightning/mydump/parser.go
index a34179bf5..29031d6fd 100644
--- a/lightning/mydump/parser.go
+++ b/lightning/mydump/parser.go
@@ -34,7 +34,7 @@ import (
 
 type blockParser struct {
 	// states for the lexer
-	reader      io.Reader
+	reader      PooledReader
 	buf         []byte
 	blockBuf    []byte
 	isLastChunk bool
@@ -49,19 +49,17 @@ type blockParser struct {
 	// cache
 	remainBuf *bytes.Buffer
 	appendBuf *bytes.Buffer
-	ioWorkers *worker.Pool
 
 	// the Logger associated with this parser for reporting failure
 	Logger log.Logger
 }
 
-func makeBlockParser(reader io.Reader, blockBufSize int64, ioWorkers *worker.Pool) blockParser {
+func makeBlockParser(reader ReadSeekCloser, blockBufSize int64, ioWorkers *worker.Pool) blockParser {
 	return blockParser{
-		reader:    reader,
+		reader:    MakePooledReader(reader, ioWorkers),
 		blockBuf:  make([]byte, blockBufSize*config.BufferSizeScale),
 		remainBuf: &bytes.Buffer{},
 		appendBuf: &bytes.Buffer{},
-		ioWorkers: ioWorkers,
 		Logger:    log.L(),
 	}
 }
@@ -106,12 +104,14 @@ type Parser interface {
 	// Columns returns the _lower-case_ column names corresponding to values in
 	// the LastRow.
 	Columns() []string
+
+	SetLogger(log.Logger)
 }
 
 // NewChunkParser creates a new parser which can read chunks out of a file.
 func NewChunkParser(
 	sqlMode mysql.SQLMode,
-	reader io.Reader,
+	reader ReadSeekCloser,
 	blockBufSize int64,
 	ioWorkers *worker.Pool,
 ) *ChunkParser {
@@ -126,13 +126,9 @@ func NewChunkParser(
 	}
 }
 
-// Reader returns the underlying reader of this parser.
-func (parser *blockParser) Reader() io.Reader {
-	return parser.reader
-}
-
 // SetPos changes the reported position and row ID.
 func (parser *blockParser) SetPos(pos int64, rowID int64) {
+	parser.reader.Seek(pos, io.SeekStart)
 	parser.pos = pos
 	parser.lastRow.RowID = rowID
 }
@@ -143,10 +139,7 @@ func (parser *blockParser) Pos() (int64, int64) {
 }
 
 func (parser *blockParser) Close() error {
-	if closer, ok := parser.reader.(io.Closer); ok {
-		return closer.Close()
-	}
-	return errors.New("this parser is not created with a reader that can be closed")
+	return parser.reader.Close()
 }
 
 func (parser *blockParser) Columns() []string {
@@ -164,6 +157,10 @@ func (parser *blockParser) logSyntaxError() {
 	)
 }
 
+func (parser *blockParser) SetLogger(logger log.Logger) {
+	parser.Logger = logger
+}
+
 type token byte
 
 const (
@@ -216,10 +213,7 @@ func (tok token) String() string {
 func (parser *blockParser) readBlock() error {
 	startTime := time.Now()
 
-	// limit IO concurrency
-	w := parser.ioWorkers.Apply()
-	n, err := io.ReadFull(parser.reader, parser.blockBuf)
-	parser.ioWorkers.Recycle(w)
+	n, err := parser.reader.ReadFull(parser.blockBuf)
 
 	switch err {
 	case io.ErrUnexpectedEOF, io.EOF:
diff --git a/lightning/mydump/parser_test.go b/lightning/mydump/parser_test.go
index 826b603b4..6268e5dc8 100644
--- a/lightning/mydump/parser_test.go
+++ b/lightning/mydump/parser_test.go
@@ -16,7 +16,6 @@ package mydump_test
 import (
 	"context"
 	"io"
-	"strings"
 
 	. "github.com/pingcap/check"
 	"github.com/pingcap/errors"
@@ -40,10 +39,11 @@ func (s *testMydumpParserSuite) TearDownSuite(c *C) {}
 
 func (s *testMydumpParserSuite) runTestCases(c *C, mode mysql.SQLMode, blockBufSize int64, cases []testCase) {
 	for _, tc := range cases {
-		parser := mydump.NewChunkParser(mode, strings.NewReader(tc.input), blockBufSize, s.ioWorkers)
+		parser := mydump.NewChunkParser(mode, mydump.NewStringReader(tc.input), blockBufSize, s.ioWorkers)
 		for i, row := range tc.expected {
-			comment := Commentf("input = %q, row = %d", tc.input, i+1)
-			c.Assert(parser.ReadRow(), IsNil, comment)
+			e := parser.ReadRow()
+			comment := Commentf("input = %q, row = %d, err = %s", tc.input, i+1, errors.ErrorStack(e))
+			c.Assert(e, IsNil, comment)
 			c.Assert(parser.LastRow(), DeepEquals, mydump.Row{RowID: int64(i) + 1, Row: row}, comment)
 		}
 		c.Assert(errors.Cause(parser.ReadRow()), Equals, io.EOF, Commentf("input = %q", tc.input))
@@ -52,13 +52,13 @@ func (s *testMydumpParserSuite) runTestCases(c *C, mode mysql.SQLMode, blockBufS
 
 func (s *testMydumpParserSuite) runFailingTestCases(c *C, mode mysql.SQLMode, blockBufSize int64, cases []string) {
 	for _, tc := range cases {
-		parser := mydump.NewChunkParser(mode, strings.NewReader(tc), blockBufSize, s.ioWorkers)
+		parser := mydump.NewChunkParser(mode, mydump.NewStringReader(tc), blockBufSize, s.ioWorkers)
 		c.Assert(parser.ReadRow(), ErrorMatches, "syntax error.*", Commentf("input = %q", tc))
 	}
 }
 
 func (s *testMydumpParserSuite) TestReadRow(c *C) {
-	reader := strings.NewReader(
+	reader := mydump.NewStringReader(
 		"/* whatever pragmas */;" +
 			"INSERT INTO `namespaced`.`table` (columns, more, columns) VALUES (1,-2, 3),\n(4,5., 6);" +
 			"INSERT `namespaced`.`table` (x,y,z) VALUES (7,8,9);" +
@@ -129,7 +129,7 @@ func (s *testMydumpParserSuite) TestReadRow(c *C) {
 }
 
 func (s *testMydumpParserSuite) TestReadChunks(c *C) {
-	reader := strings.NewReader(`
+	reader := mydump.NewStringReader(`
 		INSERT foo VALUES (1,2,3,4),(5,6,7,8),(9,10,11,12);
 		INSERT foo VALUES (13,14,15,16),(17,18,19,20),(21,22,23,24),(25,26,27,28);
 		INSERT foo VALUES (29,30,31,32),(33,34,35,36);
@@ -174,7 +174,7 @@ func (s *testMydumpParserSuite) TestReadChunks(c *C) {
 }
 
 func (s *testMydumpParserSuite) TestNestedRow(c *C) {
-	reader := strings.NewReader(`
+	reader := mydump.NewStringReader(`
 		INSERT INTO exam_detail VALUES
 		("123",CONVERT("{}" USING UTF8MB4)),
 		("456",CONVERT("{\"a\":4}" USING UTF8MB4)),
@@ -351,8 +351,29 @@ func (s *testMydumpParserSuite) TestVariousSyntax(c *C) {
 	s.runTestCases(c, mysql.ModeNone, config.ReadBlockSize, testCases)
 }
 
+func (s *testMydumpParserSuite) TestContinuation(c *C) {
+	testCases := []testCase{
+		{
+			input: `
+				('FUZNtcGYegeXwnMRKtYnXtFhgnAMTzQHEBUTBehAFBQdPsnjHhRwRZhZLtEBsIDUFduzftskgxkYkPmEgvoirfIZRsARXjsdKwOc')
+			`,
+			expected: [][]types.Datum{
+				{types.NewStringDatum("FUZNtcGYegeXwnMRKtYnXtFhgnAMTzQHEBUTBehAFBQdPsnjHhRwRZhZLtEBsIDUFduzftskgxkYkPmEgvoirfIZRsARXjsdKwOc")},
+			},
+		},
+		{
+			input: "INSERT INTO `report_case_high_risk` VALUES (2,'4','6',8,10);",
+			expected: [][]types.Datum{
+				{types.NewUintDatum(2), types.NewStringDatum("4"), types.NewStringDatum("6"), types.NewUintDatum(8), types.NewUintDatum(10)},
+			},
+		},
+	}
+
+	s.runTestCases(c, mysql.ModeNone, 1, testCases)
+}
+
 func (s *testMydumpParserSuite) TestPseudoKeywords(c *C) {
-	reader := strings.NewReader(`
+	reader := mydump.NewStringReader(`
 		INSERT INTO t (
 			c, C,
 			co, CO,
diff --git a/lightning/mydump/reader.go b/lightning/mydump/reader.go
index a30e42461..66a9221e0 100644
--- a/lightning/mydump/reader.go
+++ b/lightning/mydump/reader.go
@@ -23,6 +23,7 @@ import (
 
 	"github.com/pingcap/errors"
 	"github.com/pingcap/tidb-lightning/lightning/log"
+	"github.com/pingcap/tidb-lightning/lightning/worker"
 	"go.uber.org/zap"
 	"golang.org/x/text/encoding/simplifiedchinese"
 )
@@ -112,3 +113,64 @@ func ExportStatement(sqlFile string, characterSet string) ([]byte, error) {
 	}
 	return data, nil
 }
+
+// ReadSeekCloser = Reader + Seeker + Closer
+type ReadSeekCloser interface {
+	io.Reader
+	io.Seeker
+	io.Closer
+}
+
+// StringReader is a wrapper around *strings.Reader with an additional Close() method
+type StringReader struct{ *strings.Reader }
+
+// NewStringReader constructs a new StringReader
+func NewStringReader(s string) StringReader {
+	return StringReader{Reader: strings.NewReader(s)}
+}
+
+// Close implements io.Closer
+func (sr StringReader) Close() error {
+	return nil
+}
+
+// PooledReader is a throttled reader wrapper, where Read() calls have an upper limit of concurrency
+// imposed by the given worker pool.
+type PooledReader struct {
+	reader    ReadSeekCloser
+	ioWorkers *worker.Pool
+}
+
+// MakePooledReader constructs a new PooledReader.
+func MakePooledReader(reader ReadSeekCloser, ioWorkers *worker.Pool) PooledReader {
+	return PooledReader{
+		reader:    reader,
+		ioWorkers: ioWorkers,
+	}
+}
+
+// Read implements io.Reader
+func (pr PooledReader) Read(p []byte) (n int, err error) {
+	w := pr.ioWorkers.Apply()
+	defer pr.ioWorkers.Recycle(w)
+	return pr.reader.Read(p)
+}
+
+// Seek implements io.Seeker
+func (pr PooledReader) Seek(offset int64, whence int) (int64, error) {
+	w := pr.ioWorkers.Apply()
+	defer pr.ioWorkers.Recycle(w)
+	return pr.reader.Seek(offset, whence)
+}
+
+// Close implements io.Closer
+func (pr PooledReader) Close() error {
+	return pr.reader.Close()
+}
+
+// ReadFull is same as `io.ReadFull(pr)` with less worker recycling
+func (pr PooledReader) ReadFull(buf []byte) (n int, err error) {
+	w := pr.ioWorkers.Apply()
+	defer pr.ioWorkers.Recycle(w)
+	return io.ReadFull(pr.reader, buf)
+}
diff --git a/lightning/restore/restore.go b/lightning/restore/restore.go
index f0d44bfb4..e66b9d8cc 100644
--- a/lightning/restore/restore.go
+++ b/lightning/restore/restore.go
@@ -1262,7 +1262,6 @@ func newChunkRestore(
 		parser = mydump.NewChunkParser(cfg.TiDB.SQLMode, reader, blockBufSize, ioWorkers)
 	}
 
-	reader.Seek(chunk.Chunk.Offset, io.SeekStart)
 	parser.SetPos(chunk.Chunk.Offset, chunk.Chunk.PrevRowIDMax)
 
 	return &chunkRestore{

From 7765f6c614639c9037933999bdb8498a86be966a Mon Sep 17 00:00:00 2001
From: XuHuaiyu <391585975@qq.com>
Date: Tue, 3 Mar 2020 10:32:08 +0800
Subject: [PATCH 15/30] fix conflict

---
 lightning/mydump/csv_parser.go           |    6 +-
 lightning/mydump/csv_parser_generated.go | 3048 ----------------------
 2 files changed, 3 insertions(+), 3051 deletions(-)
 delete mode 100644 lightning/mydump/csv_parser_generated.go

diff --git a/lightning/mydump/csv_parser.go b/lightning/mydump/csv_parser.go
index b1885862c..b2790d9bd 100644
--- a/lightning/mydump/csv_parser.go
+++ b/lightning/mydump/csv_parser.go
@@ -360,12 +360,12 @@ func (parser *CSVParser) ReadRow() error {
 func (parser *CSVParser) ReadUntilTokNewLine() (pos int64, err error) {
 	hasField := false
 	for {
-		tok, _, err := parser.lex()
+		firstByte, err := parser.readByte()
 		switch errors.Cause(err) {
 		case nil:
 		case io.EOF:
 			if hasField {
-				tok = csvTokNewLine
+				firstByte = '\n'
 				break
 			}
 			fallthrough
@@ -373,7 +373,7 @@ func (parser *CSVParser) ReadUntilTokNewLine() (pos int64, err error) {
 			return parser.pos, errors.Trace(err)
 		}
 		hasField = true
-		if tok == csvTokNewLine {
+		if firstByte == '\n' {
 			return parser.pos, nil
 		}
 	}
diff --git a/lightning/mydump/csv_parser_generated.go b/lightning/mydump/csv_parser_generated.go
deleted file mode 100644
index 9c348ca1f..000000000
--- a/lightning/mydump/csv_parser_generated.go
+++ /dev/null
@@ -1,3048 +0,0 @@
-// Code generated by ragel DO NOT EDIT.
-
-//.... lightning/mydump/csv_parser.rl:1
-// Please edit `csv_parser.rl` if you want to modify this file. To generate
-// `csv_parser_generated.go`, please execute
-//
-// ```sh
-// make data_parsers
-// ```
-
-package mydump
-
-import (
-	"io"
-
-	"github.com/pingcap/errors"
-)
-
-//.... lightning/mydump/csv_parser.rl:57
-
-//.... tmp_parser.go:24
-const csv_parser_start int = 8
-const csv_parser_first_final int = 8
-const csv_parser_error int = 0
-
-const csv_parser_en_main int = 8
-
-//.... lightning/mydump/csv_parser.rl:60
-
-func (parser *CSVParser) lex() (csvToken, []byte, error) {
-	var delim byte
-	if len(parser.cfg.Delimiter) > 0 {
-		delim = parser.cfg.Delimiter[0]
-	}
-	sep := parser.cfg.Separator[0]
-
-	var cs, ts, te, act, p int
-
-	//.... tmp_parser.go:43
-	{
-		cs = csv_parser_start
-		ts = 0
-		te = 0
-		act = 0
-	}
-
-	//.... lightning/mydump/csv_parser.rl:70
-
-	for {
-		data := parser.buf
-		consumedToken := csvTokNil
-		pe := len(data)
-		eof := -1
-		if parser.isLastChunk {
-			eof = pe
-		}
-
-		//.... tmp_parser.go:63
-		{
-			var _widec int16
-			if p == pe {
-				goto _test_eof
-			}
-			switch cs {
-			case 8:
-				goto st_case_8
-			case 0:
-				goto st_case_0
-			case 9:
-				goto st_case_9
-			case 10:
-				goto st_case_10
-			case 1:
-				goto st_case_1
-			case 2:
-				goto st_case_2
-			case 11:
-				goto st_case_11
-			case 12:
-				goto st_case_12
-			case 3:
-				goto st_case_3
-			case 13:
-				goto st_case_13
-			case 4:
-				goto st_case_4
-			case 14:
-				goto st_case_14
-			case 15:
-				goto st_case_15
-			case 5:
-				goto st_case_5
-			case 16:
-				goto st_case_16
-			case 6:
-				goto st_case_6
-			case 17:
-				goto st_case_17
-			case 7:
-				goto st_case_7
-			case 18:
-				goto st_case_18
-			case 19:
-				goto st_case_19
-			case 20:
-				goto st_case_20
-			case 21:
-				goto st_case_21
-			case 22:
-				goto st_case_22
-			case 23:
-				goto st_case_23
-			case 24:
-				goto st_case_24
-			}
-			goto st_out
-		tr0:
-			//.... NONE:1
-			switch act {
-			case 0:
-				{
-					{
-						goto st0
-					}
-				}
-			case 1:
-				{
-					p = (te) - 1
-
-					consumedToken = csvTokSep
-					{
-						p++
-						cs = 8
-						goto _out
-					}
-				}
-			case 2:
-				{
-					p = (te) - 1
-
-					consumedToken = csvTokField
-					{
-						p++
-						cs = 8
-						goto _out
-					}
-				}
-			}
-
-			goto st8
-		tr14:
-			//.... lightning/mydump/csv_parser.rl:45
-			p = (te) - 1
-			{
-				consumedToken = csvTokField
-				{
-					p++
-					cs = 8
-					goto _out
-				}
-			}
-			goto st8
-		tr17:
-			//.... lightning/mydump/csv_parser.rl:40
-			te = p + 1
-			{
-				consumedToken = csvTokSep
-				{
-					p++
-					cs = 8
-					goto _out
-				}
-			}
-			goto st8
-		tr23:
-			//.... lightning/mydump/csv_parser.rl:50
-			te = p
-			p--
-			{
-				consumedToken = csvTokNewLine
-				{
-					p++
-					cs = 8
-					goto _out
-				}
-			}
-			goto st8
-		tr24:
-			//.... lightning/mydump/csv_parser.rl:45
-			te = p
-			p--
-			{
-				consumedToken = csvTokField
-				{
-					p++
-					cs = 8
-					goto _out
-				}
-			}
-			goto st8
-		tr25:
-			//.... lightning/mydump/csv_parser.rl:40
-			te = p
-			p--
-			{
-				consumedToken = csvTokSep
-				{
-					p++
-					cs = 8
-					goto _out
-				}
-			}
-			goto st8
-		st8:
-			//.... NONE:1
-			ts = 0
-
-			//.... NONE:1
-			act = 0
-
-			if p++; p == pe {
-				goto _test_eof8
-			}
-		st_case_8:
-			//.... NONE:1
-			ts = p
-
-			//.... tmp_parser.go:199
-			_widec = int16(data[p])
-			switch {
-			case data[p] < 14:
-				switch {
-				case data[p] > 9:
-					if 11 <= data[p] && data[p] <= 12 {
-						_widec = 2816 + (int16(data[p]) - 0)
-						if data[p] == delim {
-							_widec += 256
-						}
-						if data[p] == sep {
-							_widec += 512
-						}
-					}
-				default:
-					_widec = 2816 + (int16(data[p]) - 0)
-					if data[p] == delim {
-						_widec += 256
-					}
-					if data[p] == sep {
-						_widec += 512
-					}
-				}
-			case data[p] > 91:
-				switch {
-				case data[p] > 92:
-					if 93 <= data[p] {
-						_widec = 2816 + (int16(data[p]) - 0)
-						if data[p] == delim {
-							_widec += 256
-						}
-						if data[p] == sep {
-							_widec += 512
-						}
-					}
-				case data[p] >= 92:
-					_widec = 3840 + (int16(data[p]) - 0)
-					if data[p] == delim {
-						_widec += 256
-					}
-					if parser.escFlavor != backslashEscapeFlavorNone {
-						_widec += 512
-					}
-					if data[p] == sep {
-						_widec += 1024
-					}
-				}
-			default:
-				_widec = 2816 + (int16(data[p]) - 0)
-				if data[p] == delim {
-					_widec += 256
-				}
-				if data[p] == sep {
-					_widec += 512
-				}
-			}
-			switch _widec {
-			case 10:
-				goto st9
-			case 13:
-				goto st9
-			case 3932:
-				goto tr1
-			case 4188:
-				goto st2
-			case 4444:
-				goto st1
-			case 4700:
-				goto st5
-			case 4956:
-				goto tr17
-			case 5212:
-				goto tr18
-			case 5468:
-				goto st23
-			case 5724:
-				goto st24
-			}
-			switch {
-			case _widec < 3165:
-				switch {
-				case _widec < 2909:
-					switch {
-					case _widec < 2827:
-						if 2816 <= _widec && _widec <= 2825 {
-							goto tr1
-						}
-					case _widec > 2828:
-						if 2830 <= _widec && _widec <= 2907 {
-							goto tr1
-						}
-					default:
-						goto tr1
-					}
-				case _widec > 3071:
-					switch {
-					case _widec < 3083:
-						if 3072 <= _widec && _widec <= 3081 {
-							goto st2
-						}
-					case _widec > 3084:
-						if 3086 <= _widec && _widec <= 3163 {
-							goto st2
-						}
-					default:
-						goto st2
-					}
-				default:
-					goto tr1
-				}
-			case _widec > 3327:
-				switch {
-				case _widec < 3421:
-					switch {
-					case _widec < 3339:
-						if 3328 <= _widec && _widec <= 3337 {
-							goto tr17
-						}
-					case _widec > 3340:
-						if 3342 <= _widec && _widec <= 3419 {
-							goto tr17
-						}
-					default:
-						goto tr17
-					}
-				case _widec > 3583:
-					switch {
-					case _widec < 3595:
-						if 3584 <= _widec && _widec <= 3593 {
-							goto tr18
-						}
-					case _widec > 3596:
-						switch {
-						case _widec > 3675:
-							if 3677 <= _widec && _widec <= 3839 {
-								goto tr18
-							}
-						case _widec >= 3598:
-							goto tr18
-						}
-					default:
-						goto tr18
-					}
-				default:
-					goto tr17
-				}
-			default:
-				goto st2
-			}
-			goto st0
-		st_case_0:
-		st0:
-			cs = 0
-			goto _out
-		st9:
-			if p++; p == pe {
-				goto _test_eof9
-			}
-		st_case_9:
-			switch data[p] {
-			case 10:
-				goto st9
-			case 13:
-				goto st9
-			}
-			goto tr23
-		tr1:
-			//.... NONE:1
-			te = p + 1
-
-			//.... lightning/mydump/csv_parser.rl:45
-			act = 2
-			goto st10
-		st10:
-			if p++; p == pe {
-				goto _test_eof10
-			}
-		st_case_10:
-			//.... tmp_parser.go:378
-			_widec = int16(data[p])
-			switch {
-			case data[p] < 14:
-				switch {
-				case data[p] > 9:
-					if 11 <= data[p] && data[p] <= 12 {
-						_widec = 2816 + (int16(data[p]) - 0)
-						if data[p] == delim {
-							_widec += 256
-						}
-						if data[p] == sep {
-							_widec += 512
-						}
-					}
-				default:
-					_widec = 2816 + (int16(data[p]) - 0)
-					if data[p] == delim {
-						_widec += 256
-					}
-					if data[p] == sep {
-						_widec += 512
-					}
-				}
-			case data[p] > 91:
-				switch {
-				case data[p] > 92:
-					if 93 <= data[p] {
-						_widec = 2816 + (int16(data[p]) - 0)
-						if data[p] == delim {
-							_widec += 256
-						}
-						if data[p] == sep {
-							_widec += 512
-						}
-					}
-				case data[p] >= 92:
-					_widec = 3840 + (int16(data[p]) - 0)
-					if data[p] == delim {
-						_widec += 256
-					}
-					if parser.escFlavor != backslashEscapeFlavorNone {
-						_widec += 512
-					}
-					if data[p] == sep {
-						_widec += 1024
-					}
-				}
-			default:
-				_widec = 2816 + (int16(data[p]) - 0)
-				if data[p] == delim {
-					_widec += 256
-				}
-				if data[p] == sep {
-					_widec += 512
-				}
-			}
-			switch _widec {
-			case 3932:
-				goto tr1
-			case 4444:
-				goto st1
-			case 4700:
-				goto st1
-			case 5468:
-				goto st1
-			case 5724:
-				goto st1
-			}
-			switch {
-			case _widec < 2827:
-				if 2816 <= _widec && _widec <= 2825 {
-					goto tr1
-				}
-			case _widec > 2828:
-				switch {
-				case _widec > 2907:
-					if 2909 <= _widec && _widec <= 3071 {
-						goto tr1
-					}
-				case _widec >= 2830:
-					goto tr1
-				}
-			default:
-				goto tr1
-			}
-			goto tr24
-		st1:
-			if p++; p == pe {
-				goto _test_eof1
-			}
-		st_case_1:
-			goto tr1
-		st2:
-			if p++; p == pe {
-				goto _test_eof2
-			}
-		st_case_2:
-			_widec = int16(data[p])
-			switch {
-			case data[p] < 14:
-				switch {
-				case data[p] > 9:
-					if 11 <= data[p] && data[p] <= 12 {
-						_widec = 2816 + (int16(data[p]) - 0)
-						if data[p] == delim {
-							_widec += 256
-						}
-						if data[p] == sep {
-							_widec += 512
-						}
-					}
-				default:
-					_widec = 2816 + (int16(data[p]) - 0)
-					if data[p] == delim {
-						_widec += 256
-					}
-					if data[p] == sep {
-						_widec += 512
-					}
-				}
-			case data[p] > 91:
-				switch {
-				case data[p] > 92:
-					if 93 <= data[p] {
-						_widec = 2816 + (int16(data[p]) - 0)
-						if data[p] == delim {
-							_widec += 256
-						}
-						if data[p] == sep {
-							_widec += 512
-						}
-					}
-				case data[p] >= 92:
-					_widec = 3840 + (int16(data[p]) - 0)
-					if data[p] == delim {
-						_widec += 256
-					}
-					if parser.escFlavor != backslashEscapeFlavorNone {
-						_widec += 512
-					}
-					if data[p] == sep {
-						_widec += 1024
-					}
-				}
-			default:
-				_widec = 2816 + (int16(data[p]) - 0)
-				if data[p] == delim {
-					_widec += 256
-				}
-				if data[p] == sep {
-					_widec += 512
-				}
-			}
-			switch _widec {
-			case 10:
-				goto st2
-			case 13:
-				goto st2
-			case 3932:
-				goto st2
-			case 4188:
-				goto tr3
-			case 4444:
-				goto st3
-			case 4700:
-				goto tr6
-			case 4956:
-				goto st2
-			case 5212:
-				goto tr4
-			case 5468:
-				goto st4
-			case 5724:
-				goto tr8
-			}
-			switch {
-			case _widec < 3165:
-				switch {
-				case _widec < 2909:
-					switch {
-					case _widec < 2827:
-						if 2816 <= _widec && _widec <= 2825 {
-							goto st2
-						}
-					case _widec > 2828:
-						if 2830 <= _widec && _widec <= 2907 {
-							goto st2
-						}
-					default:
-						goto st2
-					}
-				case _widec > 3071:
-					switch {
-					case _widec < 3083:
-						if 3072 <= _widec && _widec <= 3081 {
-							goto tr3
-						}
-					case _widec > 3084:
-						if 3086 <= _widec && _widec <= 3163 {
-							goto tr3
-						}
-					default:
-						goto tr3
-					}
-				default:
-					goto st2
-				}
-			case _widec > 3327:
-				switch {
-				case _widec < 3421:
-					switch {
-					case _widec < 3339:
-						if 3328 <= _widec && _widec <= 3337 {
-							goto st2
-						}
-					case _widec > 3340:
-						if 3342 <= _widec && _widec <= 3419 {
-							goto st2
-						}
-					default:
-						goto st2
-					}
-				case _widec > 3583:
-					switch {
-					case _widec < 3595:
-						if 3584 <= _widec && _widec <= 3593 {
-							goto tr4
-						}
-					case _widec > 3596:
-						switch {
-						case _widec > 3675:
-							if 3677 <= _widec && _widec <= 3839 {
-								goto tr4
-							}
-						case _widec >= 3598:
-							goto tr4
-						}
-					default:
-						goto tr4
-					}
-				default:
-					goto st2
-				}
-			default:
-				goto tr3
-			}
-			goto tr0
-		tr3:
-			//.... NONE:1
-			te = p + 1
-
-			//.... lightning/mydump/csv_parser.rl:45
-			act = 2
-			goto st11
-		st11:
-			if p++; p == pe {
-				goto _test_eof11
-			}
-		st_case_11:
-			//.... tmp_parser.go:638
-			_widec = int16(data[p])
-			switch {
-			case data[p] < 11:
-				if data[p] <= 9 {
-					_widec = 768 + (int16(data[p]) - 0)
-					if data[p] == delim {
-						_widec += 256
-					}
-				}
-			case data[p] > 12:
-				if 14 <= data[p] {
-					_widec = 768 + (int16(data[p]) - 0)
-					if data[p] == delim {
-						_widec += 256
-					}
-				}
-			default:
-				_widec = 768 + (int16(data[p]) - 0)
-				if data[p] == delim {
-					_widec += 256
-				}
-			}
-			switch {
-			case _widec < 1035:
-				if 1024 <= _widec && _widec <= 1033 {
-					goto st2
-				}
-			case _widec > 1036:
-				if 1038 <= _widec && _widec <= 1279 {
-					goto st2
-				}
-			default:
-				goto st2
-			}
-			goto tr24
-		tr4:
-			//.... NONE:1
-			te = p + 1
-
-			//.... lightning/mydump/csv_parser.rl:45
-			act = 2
-			goto st12
-		st12:
-			if p++; p == pe {
-				goto _test_eof12
-			}
-		st_case_12:
-			//.... tmp_parser.go:686
-			_widec = int16(data[p])
-			switch {
-			case data[p] < 14:
-				switch {
-				case data[p] > 9:
-					if 11 <= data[p] && data[p] <= 12 {
-						_widec = 2816 + (int16(data[p]) - 0)
-						if data[p] == delim {
-							_widec += 256
-						}
-						if data[p] == sep {
-							_widec += 512
-						}
-					}
-				default:
-					_widec = 2816 + (int16(data[p]) - 0)
-					if data[p] == delim {
-						_widec += 256
-					}
-					if data[p] == sep {
-						_widec += 512
-					}
-				}
-			case data[p] > 91:
-				switch {
-				case data[p] > 92:
-					if 93 <= data[p] {
-						_widec = 2816 + (int16(data[p]) - 0)
-						if data[p] == delim {
-							_widec += 256
-						}
-						if data[p] == sep {
-							_widec += 512
-						}
-					}
-				case data[p] >= 92:
-					_widec = 3840 + (int16(data[p]) - 0)
-					if data[p] == delim {
-						_widec += 256
-					}
-					if parser.escFlavor != backslashEscapeFlavorNone {
-						_widec += 512
-					}
-					if data[p] == sep {
-						_widec += 1024
-					}
-				}
-			default:
-				_widec = 2816 + (int16(data[p]) - 0)
-				if data[p] == delim {
-					_widec += 256
-				}
-				if data[p] == sep {
-					_widec += 512
-				}
-			}
-			switch _widec {
-			case 10:
-				goto st2
-			case 13:
-				goto st2
-			case 3932:
-				goto st2
-			case 4188:
-				goto tr4
-			case 4444:
-				goto st3
-			case 4700:
-				goto tr8
-			case 4956:
-				goto st2
-			case 5212:
-				goto tr4
-			case 5468:
-				goto st4
-			case 5724:
-				goto tr8
-			}
-			switch {
-			case _widec < 3165:
-				switch {
-				case _widec < 2909:
-					switch {
-					case _widec < 2827:
-						if 2816 <= _widec && _widec <= 2825 {
-							goto st2
-						}
-					case _widec > 2828:
-						if 2830 <= _widec && _widec <= 2907 {
-							goto st2
-						}
-					default:
-						goto st2
-					}
-				case _widec > 3071:
-					switch {
-					case _widec < 3083:
-						if 3072 <= _widec && _widec <= 3081 {
-							goto tr4
-						}
-					case _widec > 3084:
-						if 3086 <= _widec && _widec <= 3163 {
-							goto tr4
-						}
-					default:
-						goto tr4
-					}
-				default:
-					goto st2
-				}
-			case _widec > 3327:
-				switch {
-				case _widec < 3421:
-					switch {
-					case _widec < 3339:
-						if 3328 <= _widec && _widec <= 3337 {
-							goto st2
-						}
-					case _widec > 3340:
-						if 3342 <= _widec && _widec <= 3419 {
-							goto st2
-						}
-					default:
-						goto st2
-					}
-				case _widec > 3583:
-					switch {
-					case _widec < 3595:
-						if 3584 <= _widec && _widec <= 3593 {
-							goto tr4
-						}
-					case _widec > 3596:
-						switch {
-						case _widec > 3675:
-							if 3677 <= _widec && _widec <= 3839 {
-								goto tr4
-							}
-						case _widec >= 3598:
-							goto tr4
-						}
-					default:
-						goto tr4
-					}
-				default:
-					goto st2
-				}
-			default:
-				goto tr4
-			}
-			goto tr24
-		st3:
-			if p++; p == pe {
-				goto _test_eof3
-			}
-		st_case_3:
-			goto st2
-		tr8:
-			//.... NONE:1
-			te = p + 1
-
-			//.... lightning/mydump/csv_parser.rl:45
-			act = 2
-			goto st13
-		st13:
-			if p++; p == pe {
-				goto _test_eof13
-			}
-		st_case_13:
-			//.... tmp_parser.go:855
-			_widec = int16(data[p])
-			switch {
-			case data[p] < 14:
-				switch {
-				case data[p] > 9:
-					if 11 <= data[p] && data[p] <= 12 {
-						_widec = 2816 + (int16(data[p]) - 0)
-						if data[p] == delim {
-							_widec += 256
-						}
-						if data[p] == sep {
-							_widec += 512
-						}
-					}
-				default:
-					_widec = 2816 + (int16(data[p]) - 0)
-					if data[p] == delim {
-						_widec += 256
-					}
-					if data[p] == sep {
-						_widec += 512
-					}
-				}
-			case data[p] > 91:
-				switch {
-				case data[p] > 92:
-					if 93 <= data[p] {
-						_widec = 2816 + (int16(data[p]) - 0)
-						if data[p] == delim {
-							_widec += 256
-						}
-						if data[p] == sep {
-							_widec += 512
-						}
-					}
-				case data[p] >= 92:
-					_widec = 3840 + (int16(data[p]) - 0)
-					if data[p] == delim {
-						_widec += 256
-					}
-					if parser.escFlavor != backslashEscapeFlavorNone {
-						_widec += 512
-					}
-					if data[p] == sep {
-						_widec += 1024
-					}
-				}
-			default:
-				_widec = 2816 + (int16(data[p]) - 0)
-				if data[p] == delim {
-					_widec += 256
-				}
-				if data[p] == sep {
-					_widec += 512
-				}
-			}
-			switch _widec {
-			case 10:
-				goto st2
-			case 13:
-				goto st2
-			case 3932:
-				goto st2
-			case 4188:
-				goto tr4
-			case 4444:
-				goto st4
-			case 4700:
-				goto tr8
-			case 4956:
-				goto st2
-			case 5212:
-				goto tr4
-			case 5468:
-				goto st4
-			case 5724:
-				goto tr8
-			}
-			switch {
-			case _widec < 3165:
-				switch {
-				case _widec < 2909:
-					switch {
-					case _widec < 2827:
-						if 2816 <= _widec && _widec <= 2825 {
-							goto st2
-						}
-					case _widec > 2828:
-						if 2830 <= _widec && _widec <= 2907 {
-							goto st2
-						}
-					default:
-						goto st2
-					}
-				case _widec > 3071:
-					switch {
-					case _widec < 3083:
-						if 3072 <= _widec && _widec <= 3081 {
-							goto tr4
-						}
-					case _widec > 3084:
-						if 3086 <= _widec && _widec <= 3163 {
-							goto tr4
-						}
-					default:
-						goto tr4
-					}
-				default:
-					goto st2
-				}
-			case _widec > 3327:
-				switch {
-				case _widec < 3421:
-					switch {
-					case _widec < 3339:
-						if 3328 <= _widec && _widec <= 3337 {
-							goto st2
-						}
-					case _widec > 3340:
-						if 3342 <= _widec && _widec <= 3419 {
-							goto st2
-						}
-					default:
-						goto st2
-					}
-				case _widec > 3583:
-					switch {
-					case _widec < 3595:
-						if 3584 <= _widec && _widec <= 3593 {
-							goto tr4
-						}
-					case _widec > 3596:
-						switch {
-						case _widec > 3675:
-							if 3677 <= _widec && _widec <= 3839 {
-								goto tr4
-							}
-						case _widec >= 3598:
-							goto tr4
-						}
-					default:
-						goto tr4
-					}
-				default:
-					goto st2
-				}
-			default:
-				goto tr4
-			}
-			goto tr24
-		st4:
-			if p++; p == pe {
-				goto _test_eof4
-			}
-		st_case_4:
-			_widec = int16(data[p])
-			switch {
-			case data[p] < 14:
-				switch {
-				case data[p] > 9:
-					if 11 <= data[p] && data[p] <= 12 {
-						_widec = 2816 + (int16(data[p]) - 0)
-						if data[p] == delim {
-							_widec += 256
-						}
-						if data[p] == sep {
-							_widec += 512
-						}
-					}
-				default:
-					_widec = 2816 + (int16(data[p]) - 0)
-					if data[p] == delim {
-						_widec += 256
-					}
-					if data[p] == sep {
-						_widec += 512
-					}
-				}
-			case data[p] > 91:
-				switch {
-				case data[p] > 92:
-					if 93 <= data[p] {
-						_widec = 2816 + (int16(data[p]) - 0)
-						if data[p] == delim {
-							_widec += 256
-						}
-						if data[p] == sep {
-							_widec += 512
-						}
-					}
-				case data[p] >= 92:
-					_widec = 3840 + (int16(data[p]) - 0)
-					if data[p] == delim {
-						_widec += 256
-					}
-					if parser.escFlavor != backslashEscapeFlavorNone {
-						_widec += 512
-					}
-					if data[p] == sep {
-						_widec += 1024
-					}
-				}
-			default:
-				_widec = 2816 + (int16(data[p]) - 0)
-				if data[p] == delim {
-					_widec += 256
-				}
-				if data[p] == sep {
-					_widec += 512
-				}
-			}
-			switch _widec {
-			case 10:
-				goto st2
-			case 13:
-				goto st2
-			case 3932:
-				goto st2
-			case 4188:
-				goto tr4
-			case 4444:
-				goto st4
-			case 4700:
-				goto tr8
-			case 4956:
-				goto st2
-			case 5212:
-				goto tr4
-			case 5468:
-				goto st4
-			case 5724:
-				goto tr8
-			}
-			switch {
-			case _widec < 3165:
-				switch {
-				case _widec < 2909:
-					switch {
-					case _widec < 2827:
-						if 2816 <= _widec && _widec <= 2825 {
-							goto st2
-						}
-					case _widec > 2828:
-						if 2830 <= _widec && _widec <= 2907 {
-							goto st2
-						}
-					default:
-						goto st2
-					}
-				case _widec > 3071:
-					switch {
-					case _widec < 3083:
-						if 3072 <= _widec && _widec <= 3081 {
-							goto tr4
-						}
-					case _widec > 3084:
-						if 3086 <= _widec && _widec <= 3163 {
-							goto tr4
-						}
-					default:
-						goto tr4
-					}
-				default:
-					goto st2
-				}
-			case _widec > 3327:
-				switch {
-				case _widec < 3421:
-					switch {
-					case _widec < 3339:
-						if 3328 <= _widec && _widec <= 3337 {
-							goto st2
-						}
-					case _widec > 3340:
-						if 3342 <= _widec && _widec <= 3419 {
-							goto st2
-						}
-					default:
-						goto st2
-					}
-				case _widec > 3583:
-					switch {
-					case _widec < 3595:
-						if 3584 <= _widec && _widec <= 3593 {
-							goto tr4
-						}
-					case _widec > 3596:
-						switch {
-						case _widec > 3675:
-							if 3677 <= _widec && _widec <= 3839 {
-								goto tr4
-							}
-						case _widec >= 3598:
-							goto tr4
-						}
-					default:
-						goto tr4
-					}
-				default:
-					goto st2
-				}
-			default:
-				goto tr4
-			}
-			goto tr0
-		tr6:
-			//.... NONE:1
-			te = p + 1
-
-			//.... lightning/mydump/csv_parser.rl:45
-			act = 2
-			goto st14
-		st14:
-			if p++; p == pe {
-				goto _test_eof14
-			}
-		st_case_14:
-			//.... tmp_parser.go:1173
-			_widec = int16(data[p])
-			switch {
-			case data[p] < 11:
-				if data[p] <= 9 {
-					_widec = 768 + (int16(data[p]) - 0)
-					if data[p] == delim {
-						_widec += 256
-					}
-				}
-			case data[p] > 12:
-				if 14 <= data[p] {
-					_widec = 768 + (int16(data[p]) - 0)
-					if data[p] == delim {
-						_widec += 256
-					}
-				}
-			default:
-				_widec = 768 + (int16(data[p]) - 0)
-				if data[p] == delim {
-					_widec += 256
-				}
-			}
-			switch _widec {
-			case 10:
-				goto st2
-			case 13:
-				goto st2
-			}
-			switch {
-			case _widec < 782:
-				switch {
-				case _widec > 777:
-					if 779 <= _widec && _widec <= 780 {
-						goto st2
-					}
-				case _widec >= 768:
-					goto st2
-				}
-			case _widec > 1033:
-				switch {
-				case _widec > 1036:
-					if 1038 <= _widec && _widec <= 1279 {
-						goto st2
-					}
-				case _widec >= 1035:
-					goto st2
-				}
-			default:
-				goto st2
-			}
-			goto tr24
-		tr18:
-			//.... NONE:1
-			te = p + 1
-
-			//.... lightning/mydump/csv_parser.rl:40
-			act = 1
-			goto st15
-		st15:
-			if p++; p == pe {
-				goto _test_eof15
-			}
-		st_case_15:
-			//.... tmp_parser.go:1237
-			_widec = int16(data[p])
-			switch {
-			case data[p] < 14:
-				switch {
-				case data[p] > 9:
-					if 11 <= data[p] && data[p] <= 12 {
-						_widec = 2816 + (int16(data[p]) - 0)
-						if data[p] == delim {
-							_widec += 256
-						}
-						if data[p] == sep {
-							_widec += 512
-						}
-					}
-				default:
-					_widec = 2816 + (int16(data[p]) - 0)
-					if data[p] == delim {
-						_widec += 256
-					}
-					if data[p] == sep {
-						_widec += 512
-					}
-				}
-			case data[p] > 91:
-				switch {
-				case data[p] > 92:
-					if 93 <= data[p] {
-						_widec = 2816 + (int16(data[p]) - 0)
-						if data[p] == delim {
-							_widec += 256
-						}
-						if data[p] == sep {
-							_widec += 512
-						}
-					}
-				case data[p] >= 92:
-					_widec = 3840 + (int16(data[p]) - 0)
-					if data[p] == delim {
-						_widec += 256
-					}
-					if parser.escFlavor != backslashEscapeFlavorNone {
-						_widec += 512
-					}
-					if data[p] == sep {
-						_widec += 1024
-					}
-				}
-			default:
-				_widec = 2816 + (int16(data[p]) - 0)
-				if data[p] == delim {
-					_widec += 256
-				}
-				if data[p] == sep {
-					_widec += 512
-				}
-			}
-			switch _widec {
-			case 10:
-				goto st2
-			case 13:
-				goto st2
-			case 3932:
-				goto st2
-			case 4188:
-				goto tr3
-			case 4444:
-				goto st3
-			case 4700:
-				goto tr6
-			case 4956:
-				goto st2
-			case 5212:
-				goto tr4
-			case 5468:
-				goto st4
-			case 5724:
-				goto tr8
-			}
-			switch {
-			case _widec < 3165:
-				switch {
-				case _widec < 2909:
-					switch {
-					case _widec < 2827:
-						if 2816 <= _widec && _widec <= 2825 {
-							goto st2
-						}
-					case _widec > 2828:
-						if 2830 <= _widec && _widec <= 2907 {
-							goto st2
-						}
-					default:
-						goto st2
-					}
-				case _widec > 3071:
-					switch {
-					case _widec < 3083:
-						if 3072 <= _widec && _widec <= 3081 {
-							goto tr3
-						}
-					case _widec > 3084:
-						if 3086 <= _widec && _widec <= 3163 {
-							goto tr3
-						}
-					default:
-						goto tr3
-					}
-				default:
-					goto st2
-				}
-			case _widec > 3327:
-				switch {
-				case _widec < 3421:
-					switch {
-					case _widec < 3339:
-						if 3328 <= _widec && _widec <= 3337 {
-							goto st2
-						}
-					case _widec > 3340:
-						if 3342 <= _widec && _widec <= 3419 {
-							goto st2
-						}
-					default:
-						goto st2
-					}
-				case _widec > 3583:
-					switch {
-					case _widec < 3595:
-						if 3584 <= _widec && _widec <= 3593 {
-							goto tr4
-						}
-					case _widec > 3596:
-						switch {
-						case _widec > 3675:
-							if 3677 <= _widec && _widec <= 3839 {
-								goto tr4
-							}
-						case _widec >= 3598:
-							goto tr4
-						}
-					default:
-						goto tr4
-					}
-				default:
-					goto st2
-				}
-			default:
-				goto tr3
-			}
-			goto tr25
-		st5:
-			if p++; p == pe {
-				goto _test_eof5
-			}
-		st_case_5:
-			_widec = int16(data[p])
-			switch {
-			case data[p] < 14:
-				switch {
-				case data[p] > 9:
-					if 11 <= data[p] && data[p] <= 12 {
-						_widec = 2816 + (int16(data[p]) - 0)
-						if data[p] == delim {
-							_widec += 256
-						}
-						if data[p] == sep {
-							_widec += 512
-						}
-					}
-				default:
-					_widec = 2816 + (int16(data[p]) - 0)
-					if data[p] == delim {
-						_widec += 256
-					}
-					if data[p] == sep {
-						_widec += 512
-					}
-				}
-			case data[p] > 91:
-				switch {
-				case data[p] > 92:
-					if 93 <= data[p] {
-						_widec = 2816 + (int16(data[p]) - 0)
-						if data[p] == delim {
-							_widec += 256
-						}
-						if data[p] == sep {
-							_widec += 512
-						}
-					}
-				case data[p] >= 92:
-					_widec = 3840 + (int16(data[p]) - 0)
-					if data[p] == delim {
-						_widec += 256
-					}
-					if parser.escFlavor != backslashEscapeFlavorNone {
-						_widec += 512
-					}
-					if data[p] == sep {
-						_widec += 1024
-					}
-				}
-			default:
-				_widec = 2816 + (int16(data[p]) - 0)
-				if data[p] == delim {
-					_widec += 256
-				}
-				if data[p] == sep {
-					_widec += 512
-				}
-			}
-			switch _widec {
-			case 10:
-				goto tr9
-			case 13:
-				goto tr9
-			case 3932:
-				goto tr9
-			case 4188:
-				goto tr10
-			case 4444:
-				goto tr12
-			case 4700:
-				goto tr12
-			case 4956:
-				goto tr9
-			case 5212:
-				goto tr11
-			case 5468:
-				goto tr13
-			case 5724:
-				goto tr13
-			}
-			switch {
-			case _widec < 3165:
-				switch {
-				case _widec < 2909:
-					switch {
-					case _widec < 2827:
-						if 2816 <= _widec && _widec <= 2825 {
-							goto tr9
-						}
-					case _widec > 2828:
-						if 2830 <= _widec && _widec <= 2907 {
-							goto tr9
-						}
-					default:
-						goto tr9
-					}
-				case _widec > 3071:
-					switch {
-					case _widec < 3083:
-						if 3072 <= _widec && _widec <= 3081 {
-							goto tr10
-						}
-					case _widec > 3084:
-						if 3086 <= _widec && _widec <= 3163 {
-							goto tr10
-						}
-					default:
-						goto tr10
-					}
-				default:
-					goto tr9
-				}
-			case _widec > 3327:
-				switch {
-				case _widec < 3421:
-					switch {
-					case _widec < 3339:
-						if 3328 <= _widec && _widec <= 3337 {
-							goto tr9
-						}
-					case _widec > 3340:
-						if 3342 <= _widec && _widec <= 3419 {
-							goto tr9
-						}
-					default:
-						goto tr9
-					}
-				case _widec > 3583:
-					switch {
-					case _widec < 3595:
-						if 3584 <= _widec && _widec <= 3593 {
-							goto tr11
-						}
-					case _widec > 3596:
-						switch {
-						case _widec > 3675:
-							if 3677 <= _widec && _widec <= 3839 {
-								goto tr11
-							}
-						case _widec >= 3598:
-							goto tr11
-						}
-					default:
-						goto tr11
-					}
-				default:
-					goto tr9
-				}
-			default:
-				goto tr10
-			}
-			goto tr0
-		tr9:
-			//.... NONE:1
-			te = p + 1
-
-			//.... lightning/mydump/csv_parser.rl:45
-			act = 2
-			goto st16
-		st16:
-			if p++; p == pe {
-				goto _test_eof16
-			}
-		st_case_16:
-			//.... tmp_parser.go:1555
-			_widec = int16(data[p])
-			switch {
-			case data[p] < 14:
-				switch {
-				case data[p] > 9:
-					if 11 <= data[p] && data[p] <= 12 {
-						_widec = 2816 + (int16(data[p]) - 0)
-						if data[p] == delim {
-							_widec += 256
-						}
-						if data[p] == sep {
-							_widec += 512
-						}
-					}
-				default:
-					_widec = 2816 + (int16(data[p]) - 0)
-					if data[p] == delim {
-						_widec += 256
-					}
-					if data[p] == sep {
-						_widec += 512
-					}
-				}
-			case data[p] > 91:
-				switch {
-				case data[p] > 92:
-					if 93 <= data[p] {
-						_widec = 2816 + (int16(data[p]) - 0)
-						if data[p] == delim {
-							_widec += 256
-						}
-						if data[p] == sep {
-							_widec += 512
-						}
-					}
-				case data[p] >= 92:
-					_widec = 3840 + (int16(data[p]) - 0)
-					if data[p] == delim {
-						_widec += 256
-					}
-					if parser.escFlavor != backslashEscapeFlavorNone {
-						_widec += 512
-					}
-					if data[p] == sep {
-						_widec += 1024
-					}
-				}
-			default:
-				_widec = 2816 + (int16(data[p]) - 0)
-				if data[p] == delim {
-					_widec += 256
-				}
-				if data[p] == sep {
-					_widec += 512
-				}
-			}
-			switch _widec {
-			case 10:
-				goto st2
-			case 13:
-				goto st2
-			case 3932:
-				goto tr9
-			case 4188:
-				goto tr3
-			case 4444:
-				goto st6
-			case 4700:
-				goto st17
-			case 4956:
-				goto st2
-			case 5212:
-				goto tr4
-			case 5468:
-				goto st7
-			case 5724:
-				goto st19
-			}
-			switch {
-			case _widec < 3165:
-				switch {
-				case _widec < 2909:
-					switch {
-					case _widec < 2827:
-						if 2816 <= _widec && _widec <= 2825 {
-							goto tr9
-						}
-					case _widec > 2828:
-						if 2830 <= _widec && _widec <= 2907 {
-							goto tr9
-						}
-					default:
-						goto tr9
-					}
-				case _widec > 3071:
-					switch {
-					case _widec < 3083:
-						if 3072 <= _widec && _widec <= 3081 {
-							goto tr3
-						}
-					case _widec > 3084:
-						if 3086 <= _widec && _widec <= 3163 {
-							goto tr3
-						}
-					default:
-						goto tr3
-					}
-				default:
-					goto tr9
-				}
-			case _widec > 3327:
-				switch {
-				case _widec < 3421:
-					switch {
-					case _widec < 3339:
-						if 3328 <= _widec && _widec <= 3337 {
-							goto st2
-						}
-					case _widec > 3340:
-						if 3342 <= _widec && _widec <= 3419 {
-							goto st2
-						}
-					default:
-						goto st2
-					}
-				case _widec > 3583:
-					switch {
-					case _widec < 3595:
-						if 3584 <= _widec && _widec <= 3593 {
-							goto tr4
-						}
-					case _widec > 3596:
-						switch {
-						case _widec > 3675:
-							if 3677 <= _widec && _widec <= 3839 {
-								goto tr4
-							}
-						case _widec >= 3598:
-							goto tr4
-						}
-					default:
-						goto tr4
-					}
-				default:
-					goto st2
-				}
-			default:
-				goto tr3
-			}
-			goto tr24
-		st6:
-			if p++; p == pe {
-				goto _test_eof6
-			}
-		st_case_6:
-			goto tr9
-		st17:
-			if p++; p == pe {
-				goto _test_eof17
-			}
-		st_case_17:
-			_widec = int16(data[p])
-			switch {
-			case data[p] < 11:
-				if data[p] <= 9 {
-					_widec = 768 + (int16(data[p]) - 0)
-					if data[p] == delim {
-						_widec += 256
-					}
-				}
-			case data[p] > 12:
-				if 14 <= data[p] {
-					_widec = 768 + (int16(data[p]) - 0)
-					if data[p] == delim {
-						_widec += 256
-					}
-				}
-			default:
-				_widec = 768 + (int16(data[p]) - 0)
-				if data[p] == delim {
-					_widec += 256
-				}
-			}
-			switch _widec {
-			case 10:
-				goto tr9
-			case 13:
-				goto tr9
-			}
-			switch {
-			case _widec < 782:
-				switch {
-				case _widec > 777:
-					if 779 <= _widec && _widec <= 780 {
-						goto tr9
-					}
-				case _widec >= 768:
-					goto tr9
-				}
-			case _widec > 1033:
-				switch {
-				case _widec > 1036:
-					if 1038 <= _widec && _widec <= 1279 {
-						goto tr9
-					}
-				case _widec >= 1035:
-					goto tr9
-				}
-			default:
-				goto tr9
-			}
-			goto tr24
-		st7:
-			if p++; p == pe {
-				goto _test_eof7
-			}
-		st_case_7:
-			_widec = int16(data[p])
-			switch {
-			case data[p] < 14:
-				switch {
-				case data[p] > 9:
-					if 11 <= data[p] && data[p] <= 12 {
-						_widec = 2816 + (int16(data[p]) - 0)
-						if data[p] == delim {
-							_widec += 256
-						}
-						if data[p] == sep {
-							_widec += 512
-						}
-					}
-				default:
-					_widec = 2816 + (int16(data[p]) - 0)
-					if data[p] == delim {
-						_widec += 256
-					}
-					if data[p] == sep {
-						_widec += 512
-					}
-				}
-			case data[p] > 91:
-				switch {
-				case data[p] > 92:
-					if 93 <= data[p] {
-						_widec = 2816 + (int16(data[p]) - 0)
-						if data[p] == delim {
-							_widec += 256
-						}
-						if data[p] == sep {
-							_widec += 512
-						}
-					}
-				case data[p] >= 92:
-					_widec = 3840 + (int16(data[p]) - 0)
-					if data[p] == delim {
-						_widec += 256
-					}
-					if parser.escFlavor != backslashEscapeFlavorNone {
-						_widec += 512
-					}
-					if data[p] == sep {
-						_widec += 1024
-					}
-				}
-			default:
-				_widec = 2816 + (int16(data[p]) - 0)
-				if data[p] == delim {
-					_widec += 256
-				}
-				if data[p] == sep {
-					_widec += 512
-				}
-			}
-			switch _widec {
-			case 10:
-				goto tr9
-			case 13:
-				goto tr9
-			case 3932:
-				goto tr9
-			case 4188:
-				goto tr11
-			case 4444:
-				goto tr13
-			case 4700:
-				goto tr13
-			case 4956:
-				goto tr9
-			case 5212:
-				goto tr11
-			case 5468:
-				goto tr13
-			case 5724:
-				goto tr13
-			}
-			switch {
-			case _widec < 3165:
-				switch {
-				case _widec < 2909:
-					switch {
-					case _widec < 2827:
-						if 2816 <= _widec && _widec <= 2825 {
-							goto tr9
-						}
-					case _widec > 2828:
-						if 2830 <= _widec && _widec <= 2907 {
-							goto tr9
-						}
-					default:
-						goto tr9
-					}
-				case _widec > 3071:
-					switch {
-					case _widec < 3083:
-						if 3072 <= _widec && _widec <= 3081 {
-							goto tr11
-						}
-					case _widec > 3084:
-						if 3086 <= _widec && _widec <= 3163 {
-							goto tr11
-						}
-					default:
-						goto tr11
-					}
-				default:
-					goto tr9
-				}
-			case _widec > 3327:
-				switch {
-				case _widec < 3421:
-					switch {
-					case _widec < 3339:
-						if 3328 <= _widec && _widec <= 3337 {
-							goto tr9
-						}
-					case _widec > 3340:
-						if 3342 <= _widec && _widec <= 3419 {
-							goto tr9
-						}
-					default:
-						goto tr9
-					}
-				case _widec > 3583:
-					switch {
-					case _widec < 3595:
-						if 3584 <= _widec && _widec <= 3593 {
-							goto tr11
-						}
-					case _widec > 3596:
-						switch {
-						case _widec > 3675:
-							if 3677 <= _widec && _widec <= 3839 {
-								goto tr11
-							}
-						case _widec >= 3598:
-							goto tr11
-						}
-					default:
-						goto tr11
-					}
-				default:
-					goto tr9
-				}
-			default:
-				goto tr11
-			}
-			goto tr14
-		tr11:
-			//.... NONE:1
-			te = p + 1
-
-			//.... lightning/mydump/csv_parser.rl:45
-			act = 2
-			goto st18
-		st18:
-			if p++; p == pe {
-				goto _test_eof18
-			}
-		st_case_18:
-			//.... tmp_parser.go:1935
-			_widec = int16(data[p])
-			switch {
-			case data[p] < 14:
-				switch {
-				case data[p] > 9:
-					if 11 <= data[p] && data[p] <= 12 {
-						_widec = 2816 + (int16(data[p]) - 0)
-						if data[p] == delim {
-							_widec += 256
-						}
-						if data[p] == sep {
-							_widec += 512
-						}
-					}
-				default:
-					_widec = 2816 + (int16(data[p]) - 0)
-					if data[p] == delim {
-						_widec += 256
-					}
-					if data[p] == sep {
-						_widec += 512
-					}
-				}
-			case data[p] > 91:
-				switch {
-				case data[p] > 92:
-					if 93 <= data[p] {
-						_widec = 2816 + (int16(data[p]) - 0)
-						if data[p] == delim {
-							_widec += 256
-						}
-						if data[p] == sep {
-							_widec += 512
-						}
-					}
-				case data[p] >= 92:
-					_widec = 3840 + (int16(data[p]) - 0)
-					if data[p] == delim {
-						_widec += 256
-					}
-					if parser.escFlavor != backslashEscapeFlavorNone {
-						_widec += 512
-					}
-					if data[p] == sep {
-						_widec += 1024
-					}
-				}
-			default:
-				_widec = 2816 + (int16(data[p]) - 0)
-				if data[p] == delim {
-					_widec += 256
-				}
-				if data[p] == sep {
-					_widec += 512
-				}
-			}
-			switch _widec {
-			case 10:
-				goto st2
-			case 13:
-				goto st2
-			case 3932:
-				goto tr9
-			case 4188:
-				goto tr4
-			case 4444:
-				goto st6
-			case 4700:
-				goto st19
-			case 4956:
-				goto st2
-			case 5212:
-				goto tr4
-			case 5468:
-				goto st7
-			case 5724:
-				goto st19
-			}
-			switch {
-			case _widec < 3165:
-				switch {
-				case _widec < 2909:
-					switch {
-					case _widec < 2827:
-						if 2816 <= _widec && _widec <= 2825 {
-							goto tr9
-						}
-					case _widec > 2828:
-						if 2830 <= _widec && _widec <= 2907 {
-							goto tr9
-						}
-					default:
-						goto tr9
-					}
-				case _widec > 3071:
-					switch {
-					case _widec < 3083:
-						if 3072 <= _widec && _widec <= 3081 {
-							goto tr4
-						}
-					case _widec > 3084:
-						if 3086 <= _widec && _widec <= 3163 {
-							goto tr4
-						}
-					default:
-						goto tr4
-					}
-				default:
-					goto tr9
-				}
-			case _widec > 3327:
-				switch {
-				case _widec < 3421:
-					switch {
-					case _widec < 3339:
-						if 3328 <= _widec && _widec <= 3337 {
-							goto st2
-						}
-					case _widec > 3340:
-						if 3342 <= _widec && _widec <= 3419 {
-							goto st2
-						}
-					default:
-						goto st2
-					}
-				case _widec > 3583:
-					switch {
-					case _widec < 3595:
-						if 3584 <= _widec && _widec <= 3593 {
-							goto tr4
-						}
-					case _widec > 3596:
-						switch {
-						case _widec > 3675:
-							if 3677 <= _widec && _widec <= 3839 {
-								goto tr4
-							}
-						case _widec >= 3598:
-							goto tr4
-						}
-					default:
-						goto tr4
-					}
-				default:
-					goto st2
-				}
-			default:
-				goto tr4
-			}
-			goto tr24
-		st19:
-			if p++; p == pe {
-				goto _test_eof19
-			}
-		st_case_19:
-			_widec = int16(data[p])
-			switch {
-			case data[p] < 14:
-				switch {
-				case data[p] > 9:
-					if 11 <= data[p] && data[p] <= 12 {
-						_widec = 2816 + (int16(data[p]) - 0)
-						if data[p] == delim {
-							_widec += 256
-						}
-						if data[p] == sep {
-							_widec += 512
-						}
-					}
-				default:
-					_widec = 2816 + (int16(data[p]) - 0)
-					if data[p] == delim {
-						_widec += 256
-					}
-					if data[p] == sep {
-						_widec += 512
-					}
-				}
-			case data[p] > 91:
-				switch {
-				case data[p] > 92:
-					if 93 <= data[p] {
-						_widec = 2816 + (int16(data[p]) - 0)
-						if data[p] == delim {
-							_widec += 256
-						}
-						if data[p] == sep {
-							_widec += 512
-						}
-					}
-				case data[p] >= 92:
-					_widec = 3840 + (int16(data[p]) - 0)
-					if data[p] == delim {
-						_widec += 256
-					}
-					if parser.escFlavor != backslashEscapeFlavorNone {
-						_widec += 512
-					}
-					if data[p] == sep {
-						_widec += 1024
-					}
-				}
-			default:
-				_widec = 2816 + (int16(data[p]) - 0)
-				if data[p] == delim {
-					_widec += 256
-				}
-				if data[p] == sep {
-					_widec += 512
-				}
-			}
-			switch _widec {
-			case 10:
-				goto tr9
-			case 13:
-				goto tr9
-			case 3932:
-				goto tr9
-			case 4188:
-				goto tr11
-			case 4444:
-				goto tr13
-			case 4700:
-				goto tr13
-			case 4956:
-				goto tr9
-			case 5212:
-				goto tr11
-			case 5468:
-				goto tr13
-			case 5724:
-				goto tr13
-			}
-			switch {
-			case _widec < 3165:
-				switch {
-				case _widec < 2909:
-					switch {
-					case _widec < 2827:
-						if 2816 <= _widec && _widec <= 2825 {
-							goto tr9
-						}
-					case _widec > 2828:
-						if 2830 <= _widec && _widec <= 2907 {
-							goto tr9
-						}
-					default:
-						goto tr9
-					}
-				case _widec > 3071:
-					switch {
-					case _widec < 3083:
-						if 3072 <= _widec && _widec <= 3081 {
-							goto tr11
-						}
-					case _widec > 3084:
-						if 3086 <= _widec && _widec <= 3163 {
-							goto tr11
-						}
-					default:
-						goto tr11
-					}
-				default:
-					goto tr9
-				}
-			case _widec > 3327:
-				switch {
-				case _widec < 3421:
-					switch {
-					case _widec < 3339:
-						if 3328 <= _widec && _widec <= 3337 {
-							goto tr9
-						}
-					case _widec > 3340:
-						if 3342 <= _widec && _widec <= 3419 {
-							goto tr9
-						}
-					default:
-						goto tr9
-					}
-				case _widec > 3583:
-					switch {
-					case _widec < 3595:
-						if 3584 <= _widec && _widec <= 3593 {
-							goto tr11
-						}
-					case _widec > 3596:
-						switch {
-						case _widec > 3675:
-							if 3677 <= _widec && _widec <= 3839 {
-								goto tr11
-							}
-						case _widec >= 3598:
-							goto tr11
-						}
-					default:
-						goto tr11
-					}
-				default:
-					goto tr9
-				}
-			default:
-				goto tr11
-			}
-			goto tr24
-		tr13:
-			//.... NONE:1
-			te = p + 1
-
-			//.... lightning/mydump/csv_parser.rl:45
-			act = 2
-			goto st20
-		st20:
-			if p++; p == pe {
-				goto _test_eof20
-			}
-		st_case_20:
-			//.... tmp_parser.go:2253
-			_widec = int16(data[p])
-			switch {
-			case data[p] < 14:
-				switch {
-				case data[p] > 9:
-					if 11 <= data[p] && data[p] <= 12 {
-						_widec = 2816 + (int16(data[p]) - 0)
-						if data[p] == delim {
-							_widec += 256
-						}
-						if data[p] == sep {
-							_widec += 512
-						}
-					}
-				default:
-					_widec = 2816 + (int16(data[p]) - 0)
-					if data[p] == delim {
-						_widec += 256
-					}
-					if data[p] == sep {
-						_widec += 512
-					}
-				}
-			case data[p] > 91:
-				switch {
-				case data[p] > 92:
-					if 93 <= data[p] {
-						_widec = 2816 + (int16(data[p]) - 0)
-						if data[p] == delim {
-							_widec += 256
-						}
-						if data[p] == sep {
-							_widec += 512
-						}
-					}
-				case data[p] >= 92:
-					_widec = 3840 + (int16(data[p]) - 0)
-					if data[p] == delim {
-						_widec += 256
-					}
-					if parser.escFlavor != backslashEscapeFlavorNone {
-						_widec += 512
-					}
-					if data[p] == sep {
-						_widec += 1024
-					}
-				}
-			default:
-				_widec = 2816 + (int16(data[p]) - 0)
-				if data[p] == delim {
-					_widec += 256
-				}
-				if data[p] == sep {
-					_widec += 512
-				}
-			}
-			switch _widec {
-			case 10:
-				goto st2
-			case 13:
-				goto st2
-			case 3932:
-				goto tr9
-			case 4188:
-				goto tr4
-			case 4444:
-				goto st7
-			case 4700:
-				goto st19
-			case 4956:
-				goto st2
-			case 5212:
-				goto tr4
-			case 5468:
-				goto st7
-			case 5724:
-				goto st19
-			}
-			switch {
-			case _widec < 3165:
-				switch {
-				case _widec < 2909:
-					switch {
-					case _widec < 2827:
-						if 2816 <= _widec && _widec <= 2825 {
-							goto tr9
-						}
-					case _widec > 2828:
-						if 2830 <= _widec && _widec <= 2907 {
-							goto tr9
-						}
-					default:
-						goto tr9
-					}
-				case _widec > 3071:
-					switch {
-					case _widec < 3083:
-						if 3072 <= _widec && _widec <= 3081 {
-							goto tr4
-						}
-					case _widec > 3084:
-						if 3086 <= _widec && _widec <= 3163 {
-							goto tr4
-						}
-					default:
-						goto tr4
-					}
-				default:
-					goto tr9
-				}
-			case _widec > 3327:
-				switch {
-				case _widec < 3421:
-					switch {
-					case _widec < 3339:
-						if 3328 <= _widec && _widec <= 3337 {
-							goto st2
-						}
-					case _widec > 3340:
-						if 3342 <= _widec && _widec <= 3419 {
-							goto st2
-						}
-					default:
-						goto st2
-					}
-				case _widec > 3583:
-					switch {
-					case _widec < 3595:
-						if 3584 <= _widec && _widec <= 3593 {
-							goto tr4
-						}
-					case _widec > 3596:
-						switch {
-						case _widec > 3675:
-							if 3677 <= _widec && _widec <= 3839 {
-								goto tr4
-							}
-						case _widec >= 3598:
-							goto tr4
-						}
-					default:
-						goto tr4
-					}
-				default:
-					goto st2
-				}
-			default:
-				goto tr4
-			}
-			goto tr24
-		tr10:
-			//.... NONE:1
-			te = p + 1
-
-			//.... lightning/mydump/csv_parser.rl:45
-			act = 2
-			goto st21
-		st21:
-			if p++; p == pe {
-				goto _test_eof21
-			}
-		st_case_21:
-			//.... tmp_parser.go:2416
-			_widec = int16(data[p])
-			switch {
-			case data[p] < 14:
-				switch {
-				case data[p] > 9:
-					if 11 <= data[p] && data[p] <= 12 {
-						_widec = 2816 + (int16(data[p]) - 0)
-						if data[p] == delim {
-							_widec += 256
-						}
-						if data[p] == sep {
-							_widec += 512
-						}
-					}
-				default:
-					_widec = 2816 + (int16(data[p]) - 0)
-					if data[p] == delim {
-						_widec += 256
-					}
-					if data[p] == sep {
-						_widec += 512
-					}
-				}
-			case data[p] > 91:
-				switch {
-				case data[p] > 92:
-					if 93 <= data[p] {
-						_widec = 2816 + (int16(data[p]) - 0)
-						if data[p] == delim {
-							_widec += 256
-						}
-						if data[p] == sep {
-							_widec += 512
-						}
-					}
-				case data[p] >= 92:
-					_widec = 3840 + (int16(data[p]) - 0)
-					if data[p] == delim {
-						_widec += 256
-					}
-					if parser.escFlavor != backslashEscapeFlavorNone {
-						_widec += 512
-					}
-					if data[p] == sep {
-						_widec += 1024
-					}
-				}
-			default:
-				_widec = 2816 + (int16(data[p]) - 0)
-				if data[p] == delim {
-					_widec += 256
-				}
-				if data[p] == sep {
-					_widec += 512
-				}
-			}
-			switch _widec {
-			case 3932:
-				goto tr1
-			case 4188:
-				goto st2
-			case 4444:
-				goto st1
-			case 4700:
-				goto st5
-			case 5212:
-				goto st2
-			case 5468:
-				goto st1
-			case 5724:
-				goto st5
-			}
-			switch {
-			case _widec < 3083:
-				switch {
-				case _widec < 2830:
-					switch {
-					case _widec > 2825:
-						if 2827 <= _widec && _widec <= 2828 {
-							goto tr1
-						}
-					case _widec >= 2816:
-						goto tr1
-					}
-				case _widec > 2907:
-					switch {
-					case _widec > 3071:
-						if 3072 <= _widec && _widec <= 3081 {
-							goto st2
-						}
-					case _widec >= 2909:
-						goto tr1
-					}
-				default:
-					goto tr1
-				}
-			case _widec > 3084:
-				switch {
-				case _widec < 3584:
-					switch {
-					case _widec > 3163:
-						if 3165 <= _widec && _widec <= 3327 {
-							goto st2
-						}
-					case _widec >= 3086:
-						goto st2
-					}
-				case _widec > 3593:
-					switch {
-					case _widec < 3598:
-						if 3595 <= _widec && _widec <= 3596 {
-							goto st2
-						}
-					case _widec > 3675:
-						if 3677 <= _widec && _widec <= 3839 {
-							goto st2
-						}
-					default:
-						goto st2
-					}
-				default:
-					goto st2
-				}
-			default:
-				goto st2
-			}
-			goto tr24
-		tr12:
-			//.... NONE:1
-			te = p + 1
-
-			//.... lightning/mydump/csv_parser.rl:45
-			act = 2
-			goto st22
-		st22:
-			if p++; p == pe {
-				goto _test_eof22
-			}
-		st_case_22:
-			//.... tmp_parser.go:2556
-			_widec = int16(data[p])
-			switch {
-			case data[p] < 14:
-				switch {
-				case data[p] > 9:
-					if 11 <= data[p] && data[p] <= 12 {
-						_widec = 2816 + (int16(data[p]) - 0)
-						if data[p] == delim {
-							_widec += 256
-						}
-						if data[p] == sep {
-							_widec += 512
-						}
-					}
-				default:
-					_widec = 2816 + (int16(data[p]) - 0)
-					if data[p] == delim {
-						_widec += 256
-					}
-					if data[p] == sep {
-						_widec += 512
-					}
-				}
-			case data[p] > 91:
-				switch {
-				case data[p] > 92:
-					if 93 <= data[p] {
-						_widec = 2816 + (int16(data[p]) - 0)
-						if data[p] == delim {
-							_widec += 256
-						}
-						if data[p] == sep {
-							_widec += 512
-						}
-					}
-				case data[p] >= 92:
-					_widec = 3840 + (int16(data[p]) - 0)
-					if data[p] == delim {
-						_widec += 256
-					}
-					if parser.escFlavor != backslashEscapeFlavorNone {
-						_widec += 512
-					}
-					if data[p] == sep {
-						_widec += 1024
-					}
-				}
-			default:
-				_widec = 2816 + (int16(data[p]) - 0)
-				if data[p] == delim {
-					_widec += 256
-				}
-				if data[p] == sep {
-					_widec += 512
-				}
-			}
-			switch _widec {
-			case 10:
-				goto st2
-			case 13:
-				goto st2
-			case 3932:
-				goto tr9
-			case 4188:
-				goto st2
-			case 4444:
-				goto st5
-			case 4700:
-				goto st5
-			case 4956:
-				goto st2
-			case 5212:
-				goto st2
-			case 5468:
-				goto st5
-			case 5724:
-				goto st5
-			}
-			switch {
-			case _widec < 3086:
-				switch {
-				case _widec < 2830:
-					switch {
-					case _widec > 2825:
-						if 2827 <= _widec && _widec <= 2828 {
-							goto tr9
-						}
-					case _widec >= 2816:
-						goto tr9
-					}
-				case _widec > 2907:
-					switch {
-					case _widec < 3072:
-						if 2909 <= _widec && _widec <= 3071 {
-							goto tr9
-						}
-					case _widec > 3081:
-						if 3083 <= _widec && _widec <= 3084 {
-							goto st2
-						}
-					default:
-						goto st2
-					}
-				default:
-					goto tr9
-				}
-			case _widec > 3163:
-				switch {
-				case _widec < 3421:
-					switch {
-					case _widec < 3339:
-						if 3165 <= _widec && _widec <= 3337 {
-							goto st2
-						}
-					case _widec > 3340:
-						if 3342 <= _widec && _widec <= 3419 {
-							goto st2
-						}
-					default:
-						goto st2
-					}
-				case _widec > 3593:
-					switch {
-					case _widec < 3598:
-						if 3595 <= _widec && _widec <= 3596 {
-							goto st2
-						}
-					case _widec > 3675:
-						if 3677 <= _widec && _widec <= 3839 {
-							goto st2
-						}
-					default:
-						goto st2
-					}
-				default:
-					goto st2
-				}
-			default:
-				goto st2
-			}
-			goto tr24
-		st23:
-			if p++; p == pe {
-				goto _test_eof23
-			}
-		st_case_23:
-			goto tr1
-		st24:
-			if p++; p == pe {
-				goto _test_eof24
-			}
-		st_case_24:
-			_widec = int16(data[p])
-			switch {
-			case data[p] < 14:
-				switch {
-				case data[p] > 9:
-					if 11 <= data[p] && data[p] <= 12 {
-						_widec = 2816 + (int16(data[p]) - 0)
-						if data[p] == delim {
-							_widec += 256
-						}
-						if data[p] == sep {
-							_widec += 512
-						}
-					}
-				default:
-					_widec = 2816 + (int16(data[p]) - 0)
-					if data[p] == delim {
-						_widec += 256
-					}
-					if data[p] == sep {
-						_widec += 512
-					}
-				}
-			case data[p] > 91:
-				switch {
-				case data[p] > 92:
-					if 93 <= data[p] {
-						_widec = 2816 + (int16(data[p]) - 0)
-						if data[p] == delim {
-							_widec += 256
-						}
-						if data[p] == sep {
-							_widec += 512
-						}
-					}
-				case data[p] >= 92:
-					_widec = 3840 + (int16(data[p]) - 0)
-					if data[p] == delim {
-						_widec += 256
-					}
-					if parser.escFlavor != backslashEscapeFlavorNone {
-						_widec += 512
-					}
-					if data[p] == sep {
-						_widec += 1024
-					}
-				}
-			default:
-				_widec = 2816 + (int16(data[p]) - 0)
-				if data[p] == delim {
-					_widec += 256
-				}
-				if data[p] == sep {
-					_widec += 512
-				}
-			}
-			switch _widec {
-			case 10:
-				goto tr9
-			case 13:
-				goto tr9
-			case 3932:
-				goto tr9
-			case 4188:
-				goto tr10
-			case 4444:
-				goto tr12
-			case 4700:
-				goto tr12
-			case 4956:
-				goto tr9
-			case 5212:
-				goto tr11
-			case 5468:
-				goto tr13
-			case 5724:
-				goto tr13
-			}
-			switch {
-			case _widec < 3165:
-				switch {
-				case _widec < 2909:
-					switch {
-					case _widec < 2827:
-						if 2816 <= _widec && _widec <= 2825 {
-							goto tr9
-						}
-					case _widec > 2828:
-						if 2830 <= _widec && _widec <= 2907 {
-							goto tr9
-						}
-					default:
-						goto tr9
-					}
-				case _widec > 3071:
-					switch {
-					case _widec < 3083:
-						if 3072 <= _widec && _widec <= 3081 {
-							goto tr10
-						}
-					case _widec > 3084:
-						if 3086 <= _widec && _widec <= 3163 {
-							goto tr10
-						}
-					default:
-						goto tr10
-					}
-				default:
-					goto tr9
-				}
-			case _widec > 3327:
-				switch {
-				case _widec < 3421:
-					switch {
-					case _widec < 3339:
-						if 3328 <= _widec && _widec <= 3337 {
-							goto tr9
-						}
-					case _widec > 3340:
-						if 3342 <= _widec && _widec <= 3419 {
-							goto tr9
-						}
-					default:
-						goto tr9
-					}
-				case _widec > 3583:
-					switch {
-					case _widec < 3595:
-						if 3584 <= _widec && _widec <= 3593 {
-							goto tr11
-						}
-					case _widec > 3596:
-						switch {
-						case _widec > 3675:
-							if 3677 <= _widec && _widec <= 3839 {
-								goto tr11
-							}
-						case _widec >= 3598:
-							goto tr11
-						}
-					default:
-						goto tr11
-					}
-				default:
-					goto tr9
-				}
-			default:
-				goto tr10
-			}
-			goto tr25
-		st_out:
-		_test_eof8:
-			cs = 8
-			goto _test_eof
-		_test_eof9:
-			cs = 9
-			goto _test_eof
-		_test_eof10:
-			cs = 10
-			goto _test_eof
-		_test_eof1:
-			cs = 1
-			goto _test_eof
-		_test_eof2:
-			cs = 2
-			goto _test_eof
-		_test_eof11:
-			cs = 11
-			goto _test_eof
-		_test_eof12:
-			cs = 12
-			goto _test_eof
-		_test_eof3:
-			cs = 3
-			goto _test_eof
-		_test_eof13:
-			cs = 13
-			goto _test_eof
-		_test_eof4:
-			cs = 4
-			goto _test_eof
-		_test_eof14:
-			cs = 14
-			goto _test_eof
-		_test_eof15:
-			cs = 15
-			goto _test_eof
-		_test_eof5:
-			cs = 5
-			goto _test_eof
-		_test_eof16:
-			cs = 16
-			goto _test_eof
-		_test_eof6:
-			cs = 6
-			goto _test_eof
-		_test_eof17:
-			cs = 17
-			goto _test_eof
-		_test_eof7:
-			cs = 7
-			goto _test_eof
-		_test_eof18:
-			cs = 18
-			goto _test_eof
-		_test_eof19:
-			cs = 19
-			goto _test_eof
-		_test_eof20:
-			cs = 20
-			goto _test_eof
-		_test_eof21:
-			cs = 21
-			goto _test_eof
-		_test_eof22:
-			cs = 22
-			goto _test_eof
-		_test_eof23:
-			cs = 23
-			goto _test_eof
-		_test_eof24:
-			cs = 24
-			goto _test_eof
-
-		_test_eof:
-			{
-			}
-			if p == eof {
-				switch cs {
-				case 9:
-					goto tr23
-				case 10:
-					goto tr24
-				case 1:
-					goto tr0
-				case 2:
-					goto tr0
-				case 11:
-					goto tr24
-				case 12:
-					goto tr24
-				case 3:
-					goto tr0
-				case 13:
-					goto tr24
-				case 4:
-					goto tr0
-				case 14:
-					goto tr24
-				case 15:
-					goto tr25
-				case 5:
-					goto tr0
-				case 16:
-					goto tr24
-				case 6:
-					goto tr14
-				case 17:
-					goto tr24
-				case 7:
-					goto tr14
-				case 18:
-					goto tr24
-				case 19:
-					goto tr24
-				case 20:
-					goto tr24
-				case 21:
-					goto tr24
-				case 22:
-					goto tr24
-				case 23:
-					goto tr25
-				case 24:
-					goto tr25
-				}
-			}
-
-		_out:
-			{
-			}
-		}
-
-		//.... lightning/mydump/csv_parser.rl:81
-
-		if cs == 0 {
-			parser.logSyntaxError()
-			return csvTokNil, nil, errors.New("syntax error")
-		}
-
-		if consumedToken != csvTokNil {
-			result := data[ts:te]
-			parser.buf = data[te:]
-			parser.pos += int64(te)
-			return consumedToken, result, nil
-		}
-
-		if parser.isLastChunk {
-			return csvTokNil, nil, io.EOF
-		}
-
-		parser.buf = parser.buf[ts:]
-		parser.pos += int64(ts)
-		p -= ts
-		te -= ts
-		ts = 0
-		if err := parser.readBlock(); err != nil {
-			return csvTokNil, nil, errors.Trace(err)
-		}
-	}
-}

From 4fd22f7b65096f2642e97635b468ef7ec4ef915f Mon Sep 17 00:00:00 2001
From: xuhuaiyu <391585975@qq.com>
Date: Thu, 5 Mar 2020 11:56:38 +0800
Subject: [PATCH 16/30] update

---
 go.mod                       |  6 ++++--
 go.sum                       | 18 ++++++++++++++++++
 lightning/backend/session.go |  1 +
 3 files changed, 23 insertions(+), 2 deletions(-)

diff --git a/go.mod b/go.mod
index a49609870..cb7f0d575 100644
--- a/go.mod
+++ b/go.mod
@@ -14,8 +14,8 @@ require (
 	github.com/pingcap/errors v0.11.5-0.20190809092503-95897b64e011
 	github.com/pingcap/failpoint v0.0.0-20191029060244-12f4ac2fd11d
 	github.com/pingcap/kvproto v0.0.0-20200108025604-a4dc183d2af5
-	github.com/pingcap/log v0.0.0-20191012051959-b742a5d432e9
-	github.com/pingcap/parser v0.0.0-20200109073933-a9496438d77d
+	github.com/pingcap/log v0.0.0-20200117041106-d28c14d3b1cd
+	github.com/pingcap/parser v0.0.0-20200207090844-d65f5147dd9f
 	github.com/pingcap/tidb v1.1.0-beta.0.20200110130413-8c3ee37c1938
 	github.com/pingcap/tidb-tools v4.0.0-beta+incompatible
 	github.com/prometheus/client_golang v1.4.0
@@ -28,3 +28,5 @@ require (
 	google.golang.org/grpc v1.25.1
 	modernc.org/mathutil v1.0.0
 )
+
+replace github.com/pingcap/tidb => github.com/XuHuaiyu/tidb v0.0.0-20200305034632-db3a8f08d804
diff --git a/go.sum b/go.sum
index 02d872d34..194e3874a 100644
--- a/go.sum
+++ b/go.sum
@@ -7,6 +7,8 @@ github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE
 github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
 github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d h1:G0m3OIz70MZUWq3EgK3CesDbo8upS2Vm9/P3FtgI+Jk=
 github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
+github.com/XuHuaiyu/tidb v0.0.0-20200305034632-db3a8f08d804 h1:caexiCKS9STOeOX93unc+o5E0GEbS8XrbnXXtKYt8MY=
+github.com/XuHuaiyu/tidb v0.0.0-20200305034632-db3a8f08d804/go.mod h1:u2XSRro367b2irRWpV8ylXqonmH4qhQBvyGIUPeoEKQ=
 github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
 github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
 github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
@@ -108,6 +110,8 @@ github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y
 github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs=
 github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.3 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I=
+github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
 github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db h1:woRePGFeVFfLKN/pOkfl+p/TAqKOfFu+7KPlMVpok/w=
 github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/google/btree v0.0.0-20180124185431-e89373fe6b4a/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
@@ -209,6 +213,7 @@ github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKw
 github.com/opentracing/opentracing-go v1.0.2 h1:3jA2P6O1F9UOrWVpwrIo17pu01KWvNWg4X946/Y5Zwg=
 github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
 github.com/pelletier/go-toml v1.3.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo=
+github.com/phf/go-queue v0.0.0-20170504031614-9abe38d0371d/go.mod h1:lXfE4PvvTW5xOjO6Mba8zDPyw8M93B6AQ7frTGnMlA8=
 github.com/pingcap/check v0.0.0-20190102082844-67f458068fc8 h1:USx2/E1bX46VG32FIw034Au6seQ2fY9NEILmNh/UlQg=
 github.com/pingcap/check v0.0.0-20190102082844-67f458068fc8/go.mod h1:B1+S9LNcuMyLH/4HMTViQOJevkGiik3wW2AN9zb2fNQ=
 github.com/pingcap/check v0.0.0-20191107115940-caf2b9e6ccf4/go.mod h1:PYMCGwN0JHjoqGr3HrZoD+b8Tgx8bKnArhSq8YVzUMc=
@@ -233,12 +238,19 @@ github.com/pingcap/kvproto v0.0.0-20200108025604-a4dc183d2af5 h1:RUxQExD5yubAjWG
 github.com/pingcap/kvproto v0.0.0-20200108025604-a4dc183d2af5/go.mod h1:WWLmULLO7l8IOcQG+t+ItJ3fEcrL5FxF0Wu+HrMy26w=
 github.com/pingcap/log v0.0.0-20191012051959-b742a5d432e9 h1:AJD9pZYm72vMgPcQDww9rkZ1DnWfl0pXV3BOWlkYIjA=
 github.com/pingcap/log v0.0.0-20191012051959-b742a5d432e9/go.mod h1:4rbK1p9ILyIfb6hU7OG2CiWSqMXnp3JMbiaVJ6mvoY8=
+github.com/pingcap/log v0.0.0-20200117041106-d28c14d3b1cd h1:CV3VsP3Z02MVtdpTMfEgRJ4T9NGgGTxdHpJerent7rM=
+github.com/pingcap/log v0.0.0-20200117041106-d28c14d3b1cd/go.mod h1:4rbK1p9ILyIfb6hU7OG2CiWSqMXnp3JMbiaVJ6mvoY8=
 github.com/pingcap/parser v0.0.0-20200109073933-a9496438d77d h1:4QwSJRxmBjTB9ssJNWg2f2bDm5rqnHCUUjMh4N1QOOY=
 github.com/pingcap/parser v0.0.0-20200109073933-a9496438d77d/go.mod h1:9v0Edh8IbgjGYW2ArJr19E+bvL8zKahsFp+ixWeId+4=
+github.com/pingcap/parser v0.0.0-20200207090844-d65f5147dd9f h1:uUrZ94J2/tsmCXHjF7pItG2tMqwP4P4vMojAbI8NMRY=
+github.com/pingcap/parser v0.0.0-20200207090844-d65f5147dd9f/go.mod h1:9v0Edh8IbgjGYW2ArJr19E+bvL8zKahsFp+ixWeId+4=
 github.com/pingcap/pd v1.1.0-beta.0.20191219054547-4d65bbefbc6d h1:Ui80aiLTyd0EZD56o2tjFRYpHfhazBjtBdKeR8UoTFY=
 github.com/pingcap/pd v1.1.0-beta.0.20191219054547-4d65bbefbc6d/go.mod h1:CML+b1JVjN+VbDijaIcUSmuPgpDjXEY7UiOx5yDP8eE=
+github.com/pingcap/pd v1.1.0-beta.0.20200106144140-f5a7aa985497 h1:FzLErYtcXnSxtC469OuVDlgBbh0trJZzNxw0mNKzyls=
+github.com/pingcap/pd v1.1.0-beta.0.20200106144140-f5a7aa985497/go.mod h1:cfT/xu4Zz+Tkq95QrLgEBZ9ikRcgzy4alHqqoaTftqI=
 github.com/pingcap/sysutil v0.0.0-20191216090214-5f9620d22b3b h1:EEyo/SCRswLGuSk+7SB86Ak1p8bS6HL1Mi4Dhyuv6zg=
 github.com/pingcap/sysutil v0.0.0-20191216090214-5f9620d22b3b/go.mod h1:EB/852NMQ+aRKioCpToQ94Wl7fktV+FNnxf3CX/TTXI=
+github.com/pingcap/sysutil v0.0.0-20200206130906-2bfa6dc40bcd/go.mod h1:EB/852NMQ+aRKioCpToQ94Wl7fktV+FNnxf3CX/TTXI=
 github.com/pingcap/tidb v1.1.0-beta.0.20200110130413-8c3ee37c1938 h1:Jt9ENNiS1ZNC9jV2Pd3wdegXQYFq3U6z1xFlzZNMNC8=
 github.com/pingcap/tidb v1.1.0-beta.0.20200110130413-8c3ee37c1938/go.mod h1:DlMN+GGqC/WpREnzcH8xgxbXnntjybLhT84AbUSvMVM=
 github.com/pingcap/tidb v2.0.11+incompatible h1:Shz+ry1DzQNsPk1QAejnM+5tgjbwZuzPnIER5aCjQ6c=
@@ -248,6 +260,8 @@ github.com/pingcap/tidb-tools v4.0.0-beta+incompatible/go.mod h1:XGdcy9+yqlDSEMT
 github.com/pingcap/tipb v0.0.0-20190428032612-535e1abaa330/go.mod h1:RtkHW8WbcNxj8lsbzjaILci01CtYnYbIkQhjyZWrWVI=
 github.com/pingcap/tipb v0.0.0-20191227083941-3996eff010dc h1:IOKsFObJ4GZwAgyuhdJKg3oKCzWcoBFfHhpq2TOn5H0=
 github.com/pingcap/tipb v0.0.0-20191227083941-3996eff010dc/go.mod h1:RtkHW8WbcNxj8lsbzjaILci01CtYnYbIkQhjyZWrWVI=
+github.com/pingcap/tipb v0.0.0-20200201101609-1a2e9c441455 h1:Jh9k3RIOTJ/YvODLg2zcCmGaQg1wEt2iFh1vYSEZW5Q=
+github.com/pingcap/tipb v0.0.0-20200201101609-1a2e9c441455/go.mod h1:RtkHW8WbcNxj8lsbzjaILci01CtYnYbIkQhjyZWrWVI=
 github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
 github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
@@ -382,6 +396,7 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA
 golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
 golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f h1:J5lckAjkw6qYlOZNj90mLYNTEKDvWeuc1yieZ8qUzUE=
 golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
+golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
 golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
 golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -445,6 +460,9 @@ golang.org/x/tools v0.0.0-20191107010934-f79515f33823/go.mod h1:b+2E5dAYhXwXZwtn
 golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4 h1:Toz2IK7k8rbltAXwNAxKcn9OzqyNfMUhUNjz3sL0NMk=
 golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200206050830-dd0d5d485177 h1:E2vxBajJgSA3TcJhDGTh/kP3VnsvXKl9jSijv+h7svQ=
+golang.org/x/tools v0.0.0-20200206050830-dd0d5d485177/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
diff --git a/lightning/backend/session.go b/lightning/backend/session.go
index 141dc5e12..fb50aef8e 100644
--- a/lightning/backend/session.go
+++ b/lightning/backend/session.go
@@ -106,6 +106,7 @@ func newSession(options *SessionOptions) *session {
 	vars.StmtCtx.TimeZone = vars.Location()
 	vars.SetSystemVar("timestamp", strconv.FormatInt(options.Timestamp, 10))
 	vars.SetSystemVar(variable.TiDBRowFormatVersion, options.RowFormatVersion)
+	vars.TxnCtx = nil
 
 	s := &session{
 		txn:  transaction{},

From 97589d0111169a94c8ab81f79b2f452560914ba1 Mon Sep 17 00:00:00 2001
From: xuhuaiyu <391585975@qq.com>
Date: Thu, 5 Mar 2020 12:12:06 +0800
Subject: [PATCH 17/30] update again

---
 go.mod | 10 +++++-----
 go.sum | 21 +++++++++++++++++++++
 2 files changed, 26 insertions(+), 5 deletions(-)

diff --git a/go.mod b/go.mod
index cb7f0d575..96bd33b56 100644
--- a/go.mod
+++ b/go.mod
@@ -10,12 +10,12 @@ require (
 	github.com/gogo/protobuf v1.3.1
 	github.com/golang/mock v1.4.0
 	github.com/joho/sqltocsv v0.0.0-20190824231449-5650f27fd5b6
-	github.com/pingcap/check v0.0.0-20191216031241-8a5a85928f12
+	github.com/pingcap/check v0.0.0-20200212061837-5e12011dc712
 	github.com/pingcap/errors v0.11.5-0.20190809092503-95897b64e011
-	github.com/pingcap/failpoint v0.0.0-20191029060244-12f4ac2fd11d
-	github.com/pingcap/kvproto v0.0.0-20200108025604-a4dc183d2af5
+	github.com/pingcap/failpoint v0.0.0-20200210140405-f8f9fb234798
+	github.com/pingcap/kvproto v0.0.0-20200210234432-a965739f8162
 	github.com/pingcap/log v0.0.0-20200117041106-d28c14d3b1cd
-	github.com/pingcap/parser v0.0.0-20200207090844-d65f5147dd9f
+	github.com/pingcap/parser v0.0.0-20200218113622-517beb2e39c2
 	github.com/pingcap/tidb v1.1.0-beta.0.20200110130413-8c3ee37c1938
 	github.com/pingcap/tidb-tools v4.0.0-beta+incompatible
 	github.com/prometheus/client_golang v1.4.0
@@ -29,4 +29,4 @@ require (
 	modernc.org/mathutil v1.0.0
 )
 
-replace github.com/pingcap/tidb => github.com/XuHuaiyu/tidb v0.0.0-20200305034632-db3a8f08d804
+replace github.com/pingcap/tidb => github.com/XuHuaiyu/tidb v0.0.0-20200305040504-ba0c83c0a06d
diff --git a/go.sum b/go.sum
index 194e3874a..8169a39a8 100644
--- a/go.sum
+++ b/go.sum
@@ -9,10 +9,13 @@ github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d h1:G0m3OIz70MZUW
 github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
 github.com/XuHuaiyu/tidb v0.0.0-20200305034632-db3a8f08d804 h1:caexiCKS9STOeOX93unc+o5E0GEbS8XrbnXXtKYt8MY=
 github.com/XuHuaiyu/tidb v0.0.0-20200305034632-db3a8f08d804/go.mod h1:u2XSRro367b2irRWpV8ylXqonmH4qhQBvyGIUPeoEKQ=
+github.com/XuHuaiyu/tidb v0.0.0-20200305040504-ba0c83c0a06d h1:uvryvd3BdIgMAynX1BpzoMeUonCl1s7KI92LHEkmp+w=
+github.com/XuHuaiyu/tidb v0.0.0-20200305040504-ba0c83c0a06d/go.mod h1:Bb4gLdJvdUtq/7iqz7nM7uLxNI16SDfti05K82LdKfk=
 github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
 github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
 github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
 github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q=
 github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
 github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
@@ -149,6 +152,8 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf
 github.com/grpc-ecosystem/grpc-gateway v1.4.1/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw=
 github.com/grpc-ecosystem/grpc-gateway v1.9.5 h1:UImYN5qQ8tuGpGE16ZmjvcTtTw24zw1QAp/SlnNrZhI=
 github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
+github.com/grpc-ecosystem/grpc-gateway v1.12.1 h1:zCy2xE9ablevUOrUZc3Dl72Dt+ya2FNAvC2yLYMHzi4=
+github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c=
 github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
 github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
 github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
@@ -219,6 +224,7 @@ github.com/pingcap/check v0.0.0-20190102082844-67f458068fc8/go.mod h1:B1+S9LNcuM
 github.com/pingcap/check v0.0.0-20191107115940-caf2b9e6ccf4/go.mod h1:PYMCGwN0JHjoqGr3HrZoD+b8Tgx8bKnArhSq8YVzUMc=
 github.com/pingcap/check v0.0.0-20191216031241-8a5a85928f12 h1:rfD9v3+ppLPzoQBgZev0qYCpegrwyFx/BUpkApEiKdY=
 github.com/pingcap/check v0.0.0-20191216031241-8a5a85928f12/go.mod h1:PYMCGwN0JHjoqGr3HrZoD+b8Tgx8bKnArhSq8YVzUMc=
+github.com/pingcap/check v0.0.0-20200212061837-5e12011dc712/go.mod h1:PYMCGwN0JHjoqGr3HrZoD+b8Tgx8bKnArhSq8YVzUMc=
 github.com/pingcap/errcode v0.0.0-20180921232412-a1a7271709d9 h1:KH4f4Si9XK6/IW50HtoaiLIFHGkapOM6w83za47UYik=
 github.com/pingcap/errcode v0.0.0-20180921232412-a1a7271709d9/go.mod h1:4b2X8xSqxIroj/IZ9MX/VGZhAwc11wB9wRIzHvz6SeM=
 github.com/pingcap/errors v0.11.0/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8=
@@ -228,6 +234,8 @@ github.com/pingcap/errors v0.11.5-0.20190809092503-95897b64e011 h1:58naV4XMEqm0h
 github.com/pingcap/errors v0.11.5-0.20190809092503-95897b64e011/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8=
 github.com/pingcap/failpoint v0.0.0-20191029060244-12f4ac2fd11d h1:F8vp38kTAckN+v8Jlc98uMBvKIzr1a+UhnLyVYn8Q5Q=
 github.com/pingcap/failpoint v0.0.0-20191029060244-12f4ac2fd11d/go.mod h1:DNS3Qg7bEDhU6EXNHF+XSv/PGznQaMJ5FWvctpm6pQI=
+github.com/pingcap/failpoint v0.0.0-20200210140405-f8f9fb234798 h1:6DMbRqPI1qzQ8N1xc3+nKY8IxSACd9VqQKkRVvbyoIg=
+github.com/pingcap/failpoint v0.0.0-20200210140405-f8f9fb234798/go.mod h1:DNS3Qg7bEDhU6EXNHF+XSv/PGznQaMJ5FWvctpm6pQI=
 github.com/pingcap/fn v0.0.0-20191016082858-07623b84a47d h1:rCmRK0lCRrHMUbS99BKFYhK9YxJDNw0xB033cQbYo0s=
 github.com/pingcap/fn v0.0.0-20191016082858-07623b84a47d/go.mod h1:fMRU1BA1y+r89AxUoaAar4JjrhUkVDt0o0Np6V8XbDQ=
 github.com/pingcap/goleveldb v0.0.0-20191226122134-f82aafb29989 h1:surzm05a8C9dN8dIUmo4Be2+pMRb6f55i+UIYrluu2E=
@@ -236,6 +244,8 @@ github.com/pingcap/kvproto v0.0.0-20191211054548-3c6b38ea5107/go.mod h1:WWLmULLO
 github.com/pingcap/kvproto v0.0.0-20191213111810-93cb7c623c8b/go.mod h1:WWLmULLO7l8IOcQG+t+ItJ3fEcrL5FxF0Wu+HrMy26w=
 github.com/pingcap/kvproto v0.0.0-20200108025604-a4dc183d2af5 h1:RUxQExD5yubAjWGnw8kcxfO9abbiVHIE1rbuCyQCWDE=
 github.com/pingcap/kvproto v0.0.0-20200108025604-a4dc183d2af5/go.mod h1:WWLmULLO7l8IOcQG+t+ItJ3fEcrL5FxF0Wu+HrMy26w=
+github.com/pingcap/kvproto v0.0.0-20200210234432-a965739f8162 h1:lsoIoCoXMpcHvW6jHcqP/prA4I6duAp1DVyG2ULz4bM=
+github.com/pingcap/kvproto v0.0.0-20200210234432-a965739f8162/go.mod h1:IOdRDPLyda8GX2hE/jO7gqaCV/PNFh8BZQCQZXfIOqI=
 github.com/pingcap/log v0.0.0-20191012051959-b742a5d432e9 h1:AJD9pZYm72vMgPcQDww9rkZ1DnWfl0pXV3BOWlkYIjA=
 github.com/pingcap/log v0.0.0-20191012051959-b742a5d432e9/go.mod h1:4rbK1p9ILyIfb6hU7OG2CiWSqMXnp3JMbiaVJ6mvoY8=
 github.com/pingcap/log v0.0.0-20200117041106-d28c14d3b1cd h1:CV3VsP3Z02MVtdpTMfEgRJ4T9NGgGTxdHpJerent7rM=
@@ -244,6 +254,8 @@ github.com/pingcap/parser v0.0.0-20200109073933-a9496438d77d h1:4QwSJRxmBjTB9ssJ
 github.com/pingcap/parser v0.0.0-20200109073933-a9496438d77d/go.mod h1:9v0Edh8IbgjGYW2ArJr19E+bvL8zKahsFp+ixWeId+4=
 github.com/pingcap/parser v0.0.0-20200207090844-d65f5147dd9f h1:uUrZ94J2/tsmCXHjF7pItG2tMqwP4P4vMojAbI8NMRY=
 github.com/pingcap/parser v0.0.0-20200207090844-d65f5147dd9f/go.mod h1:9v0Edh8IbgjGYW2ArJr19E+bvL8zKahsFp+ixWeId+4=
+github.com/pingcap/parser v0.0.0-20200218113622-517beb2e39c2 h1:DsymejjOFdljM1q0BJ8yBZUYQ7718+7JTO046Rqd/3k=
+github.com/pingcap/parser v0.0.0-20200218113622-517beb2e39c2/go.mod h1:9v0Edh8IbgjGYW2ArJr19E+bvL8zKahsFp+ixWeId+4=
 github.com/pingcap/pd v1.1.0-beta.0.20191219054547-4d65bbefbc6d h1:Ui80aiLTyd0EZD56o2tjFRYpHfhazBjtBdKeR8UoTFY=
 github.com/pingcap/pd v1.1.0-beta.0.20191219054547-4d65bbefbc6d/go.mod h1:CML+b1JVjN+VbDijaIcUSmuPgpDjXEY7UiOx5yDP8eE=
 github.com/pingcap/pd v1.1.0-beta.0.20200106144140-f5a7aa985497 h1:FzLErYtcXnSxtC469OuVDlgBbh0trJZzNxw0mNKzyls=
@@ -262,6 +274,8 @@ github.com/pingcap/tipb v0.0.0-20191227083941-3996eff010dc h1:IOKsFObJ4GZwAgyuhd
 github.com/pingcap/tipb v0.0.0-20191227083941-3996eff010dc/go.mod h1:RtkHW8WbcNxj8lsbzjaILci01CtYnYbIkQhjyZWrWVI=
 github.com/pingcap/tipb v0.0.0-20200201101609-1a2e9c441455 h1:Jh9k3RIOTJ/YvODLg2zcCmGaQg1wEt2iFh1vYSEZW5Q=
 github.com/pingcap/tipb v0.0.0-20200201101609-1a2e9c441455/go.mod h1:RtkHW8WbcNxj8lsbzjaILci01CtYnYbIkQhjyZWrWVI=
+github.com/pingcap/tipb v0.0.0-20200212061130-c4d518eb1d60 h1:aJPXrT1u4VfUSGFA2oQVwl4pOXzqe+YI6wed01cjDH4=
+github.com/pingcap/tipb v0.0.0-20200212061130-c4d518eb1d60/go.mod h1:RtkHW8WbcNxj8lsbzjaILci01CtYnYbIkQhjyZWrWVI=
 github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
 github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
@@ -291,6 +305,7 @@ github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+Gx
 github.com/remyoudompheng/bigfft v0.0.0-20190728182440-6a916e37a237 h1:HQagqIiBmr8YXawX/le3+O26N+vPPC1PtjaF3mwnook=
 github.com/remyoudompheng/bigfft v0.0.0-20190728182440-6a916e37a237/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
 github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
+github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
 github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww=
 github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
@@ -414,6 +429,8 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL
 golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20190909003024-a7b16738d86b h1:XfVGCX+0T4WOStkaOsJRllbsiImhB2jgVBGc9L0lPGc=
 golang.org/x/net v0.0.0-20190909003024-a7b16738d86b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20191002035440-2ec189313ef0 h1:2mqDk8w/o6UmeUCu5Qiq2y7iMf6anbx+YA8d1JFoFrs=
+golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -476,11 +493,14 @@ google.golang.org/genproto v0.0.0-20181004005441-af9cb2a35e7f/go.mod h1:JiN7NxoA
 google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
 google.golang.org/genproto v0.0.0-20190905072037-92dd089d5514 h1:oFSK4421fpCKRrpzIpybyBVWyht05NegY9+L/3TLAZs=
 google.golang.org/genproto v0.0.0-20190905072037-92dd089d5514/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c h1:hrpEMCZ2O7DR5gC1n2AJGVhrwiEjOi35+jxtIuZpTMo=
+google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
 google.golang.org/grpc v0.0.0-20180607172857-7a6a684ca69e/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
 google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
 google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
 google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
 google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA=
 google.golang.org/grpc v1.25.1 h1:wdKvqQk7IttEw92GoRyKG2IDrUIpgpj6H6m81yfeMW0=
 google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
 gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U=
@@ -506,6 +526,7 @@ gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bl
 gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
 gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.5 h1:ymVxjfMaHvXD8RqPRmzHHsB3VvucivSkIAvJFDI5O3c=
 gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=

From 69364510df7079e6df0c8f6818255ab2ec1b3971 Mon Sep 17 00:00:00 2001
From: xuhuaiyu <391585975@qq.com>
Date: Fri, 6 Mar 2020 12:00:00 +0800
Subject: [PATCH 18/30] send a batch of kv in encodeLoop

---
 lightning/config/config.go        |   2 +
 lightning/restore/restore.go      | 115 ++++++++++++++++--------------
 lightning/restore/restore_test.go |  50 +++++++------
 3 files changed, 94 insertions(+), 73 deletions(-)

diff --git a/lightning/config/config.go b/lightning/config/config.go
index ec82aa43f..49a03d6d8 100644
--- a/lightning/config/config.go
+++ b/lightning/config/config.go
@@ -147,6 +147,7 @@ type MydumperRuntime struct {
 	CaseSensitive    bool      `toml:"case-sensitive" json:"case-sensitive"`
 	StrictFormat     bool      `toml:"strict-format" json:"strict-format"`
 	MaxRegionSize    int64     `toml:"max-region-size" json:"max-region-size"`
+	MaxKVPairs       int64     `toml:"max-kv-pairs" json:"max-kv-pairs"`
 }
 
 type TikvImporter struct {
@@ -248,6 +249,7 @@ func NewConfig() *Config {
 				TrimLastSep:     false,
 			},
 			StrictFormat:  false,
+			MaxKVPairs:    128,
 			MaxRegionSize: MaxRegionSize,
 		},
 		TikvImporter: TikvImporter{
diff --git a/lightning/restore/restore.go b/lightning/restore/restore.go
index e66b9d8cc..10e4f26aa 100644
--- a/lightning/restore/restore.go
+++ b/lightning/restore/restore.go
@@ -1555,7 +1555,7 @@ type deliverResult struct {
 
 func (cr *chunkRestore) deliverLoop(
 	ctx context.Context,
-	kvsCh <-chan deliveredKVs,
+	kvsCh <-chan []deliveredKVs,
 	t *TableRestore,
 	engineID int32,
 	dataEngine, indexEngine *kv.OpenedEngine,
@@ -1576,21 +1576,22 @@ func (cr *chunkRestore) deliverLoop(
 		var dataChecksum, indexChecksum verify.KVChecksum
 		var offset, rowID int64
 		var columns []string
-
+		var kvPacket []deliveredKVs
 		// Fetch enough KV pairs from the source.
 	populate:
 		for dataChecksum.SumSize()+indexChecksum.SumSize() < minDeliverBytes {
 			select {
-			case d := <-kvsCh:
-				if d.kvs == nil {
+			case kvPacket = <-kvsCh:
+				if len(kvPacket) == 0 {
 					channelClosed = true
 					break populate
 				}
-
-				d.kvs.ClassifyAndAppend(&dataKVs, &dataChecksum, &indexKVs, &indexChecksum)
-				columns = d.columns
-				offset = d.offset
-				rowID = d.rowID
+				for _, p := range kvPacket {
+					p.kvs.ClassifyAndAppend(&dataKVs, &dataChecksum, &indexKVs, &indexChecksum)
+					columns = p.columns
+					offset = p.offset
+					rowID = p.rowID
+				}
 			case <-ctx.Done():
 				err = ctx.Err()
 				return
@@ -1660,14 +1661,14 @@ func (cr *chunkRestore) saveCheckpoint(t *TableRestore, engineID int32, rc *Rest
 
 func (cr *chunkRestore) encodeLoop(
 	ctx context.Context,
-	kvsCh chan<- deliveredKVs,
+	kvsCh chan<- []deliveredKVs,
 	t *TableRestore,
 	logger log.Logger,
 	kvEncoder kv.Encoder,
 	deliverCompleteCh <-chan deliverResult,
-	pauser *common.Pauser,
+	rc *RestoreController,
 ) (readTotalDur time.Duration, encodeTotalDur time.Duration, err error) {
-	send := func(kvs deliveredKVs) error {
+	send := func(kvs []deliveredKVs) error {
 		select {
 		case kvsCh <- kvs:
 			return nil
@@ -1685,63 +1686,73 @@ func (cr *chunkRestore) encodeLoop(
 		}
 	}
 
-	initializedColumns := false
-outside:
-	for {
+	pauser, maxKvPairsCnt := rc.pauser, rc.cfg.Mydumper.MaxKVPairs
+	initializedColumns, reachEOF := false, false
+	for !reachEOF {
 		if err = pauser.Wait(ctx); err != nil {
 			return
 		}
-
 		offset, _ := cr.parser.Pos()
 		if offset >= cr.chunk.Chunk.EndOffset {
 			break
 		}
 
-		start := time.Now()
-		err = cr.parser.ReadRow()
-		newOffset, rowID := cr.parser.Pos()
 		columnNames := cr.parser.Columns()
-		switch errors.Cause(err) {
-		case nil:
-			if !initializedColumns {
-				if len(cr.chunk.ColumnPermutation) == 0 {
-					t.initializeColumns(columnNames, cr.chunk)
+		var readDur, encodeDur time.Duration
+		canDeliver := false
+		kvPacket := make([]deliveredKVs, 0, maxKvPairsCnt)
+		var newOffset, rowID int64
+	outLoop:
+		for !canDeliver {
+			readDurStart := time.Now()
+			err = cr.parser.ReadRow()
+			newOffset, rowID = cr.parser.Pos()
+			switch errors.Cause(err) {
+			case nil:
+				if !initializedColumns {
+					if len(cr.chunk.ColumnPermutation) == 0 {
+						t.initializeColumns(columnNames, cr.chunk)
+					}
+					initializedColumns = true
 				}
-				initializedColumns = true
+			case io.EOF:
+				reachEOF = true
+				break outLoop
+			default:
+				err = errors.Annotatef(err, "in file %s at offset %d", &cr.chunk.Key, newOffset)
+				return
+			}
+			readDur += time.Since(readDurStart)
+			encodeDurStart := time.Now()
+			lastRow := cr.parser.LastRow()
+			// sql -> kv
+			kvs, encodeErr := kvEncoder.Encode(logger, lastRow.Row, lastRow.RowID, cr.chunk.ColumnPermutation)
+			encodeDur += time.Since(encodeDurStart)
+			if encodeErr != nil {
+				err = errors.Annotatef(encodeErr, "in file %s at offset %d", &cr.chunk.Key, newOffset)
+				return
+			}
+			kvPacket = append(kvPacket, deliveredKVs{kvs: kvs, columns: columnNames, offset: newOffset, rowID: rowID})
+			if len(kvPacket) == int(maxKvPairsCnt) || newOffset == cr.chunk.Chunk.EndOffset {
+				canDeliver = true
 			}
-		case io.EOF:
-			break outside
-		default:
-			err = errors.Annotatef(err, "in file %s at offset %d", &cr.chunk.Key, newOffset)
-			return
 		}
-
-		readDur := time.Since(start)
+		encodeTotalDur += encodeDur
+		metric.RowEncodeSecondsHistogram.Observe(encodeDur.Seconds())
 		readTotalDur += readDur
 		metric.RowReadSecondsHistogram.Observe(readDur.Seconds())
 		metric.RowReadBytesHistogram.Observe(float64(newOffset - offset))
 
-		// sql -> kv
-		lastRow := cr.parser.LastRow()
-		kvs, encodeErr := kvEncoder.Encode(logger, lastRow.Row, lastRow.RowID, cr.chunk.ColumnPermutation)
-		encodeDur := time.Since(start)
-		encodeTotalDur += encodeDur
-		metric.RowEncodeSecondsHistogram.Observe(encodeDur.Seconds())
-
-		if encodeErr != nil {
-			// error is already logged inside kvEncoder.Encode(), just propagate up directly.
-			err = errors.Annotatef(encodeErr, "in file %s at offset %d", &cr.chunk.Key, newOffset)
-			return
-		}
-
-		deliverKvStart := time.Now()
-		if err = send(deliveredKVs{kvs: kvs, columns: columnNames, offset: newOffset, rowID: rowID}); err != nil {
-			return
+		if len(kvPacket) != 0 {
+			deliverKvStart := time.Now()
+			if err = send(kvPacket); err != nil {
+				return
+			}
+			metric.RowKVDeliverSecondsHistogram.Observe(time.Since(deliverKvStart).Seconds())
 		}
-		metric.RowKVDeliverSecondsHistogram.Observe(time.Since(deliverKvStart).Seconds())
 	}
 
-	err = send(deliveredKVs{kvs: nil})
+	err = send([]deliveredKVs{})
 	return
 }
 
@@ -1758,7 +1769,7 @@ func (cr *chunkRestore) restore(
 		Timestamp:        cr.chunk.Timestamp,
 		RowFormatVersion: rc.rowFormatVer,
 	})
-	kvsCh := make(chan deliveredKVs, maxKVQueueSize)
+	kvsCh := make(chan []deliveredKVs, maxKVQueueSize)
 	deliverCompleteCh := make(chan deliverResult)
 
 	defer func() {
@@ -1782,7 +1793,7 @@ func (cr *chunkRestore) restore(
 		zap.Stringer("path", &cr.chunk.Key),
 	).Begin(zap.InfoLevel, "restore file")
 
-	readTotalDur, encodeTotalDur, err := cr.encodeLoop(ctx, kvsCh, t, logTask.Logger, kvEncoder, deliverCompleteCh, rc.pauser)
+	readTotalDur, encodeTotalDur, err := cr.encodeLoop(ctx, kvsCh, t, logTask.Logger, kvEncoder, deliverCompleteCh, rc)
 	if err != nil {
 		return err
 	}
diff --git a/lightning/restore/restore_test.go b/lightning/restore/restore_test.go
index 04313ae97..8632acffe 100644
--- a/lightning/restore/restore_test.go
+++ b/lightning/restore/restore_test.go
@@ -595,7 +595,7 @@ func (s *chunkRestoreSuite) TestDeliverLoopCancel(c *C) {
 	rc := &RestoreController{backend: kv.NewMockImporter(nil, "")}
 
 	ctx, cancel := context.WithCancel(context.Background())
-	kvsCh := make(chan deliveredKVs)
+	kvsCh := make(chan []deliveredKVs)
 	go cancel()
 	_, err := s.cr.deliverLoop(ctx, kvsCh, s.tr, 0, nil, nil, rc)
 	c.Assert(errors.Cause(err), Equals, context.Canceled)
@@ -624,15 +624,15 @@ func (s *chunkRestoreSuite) TestDeliverLoopEmptyData(c *C) {
 
 	rc := &RestoreController{backend: importer}
 
-	kvsCh := make(chan deliveredKVs, 1)
-	kvsCh <- deliveredKVs{}
+	kvsCh := make(chan []deliveredKVs, 1)
+	kvsCh <- []deliveredKVs{}
 	_, err = s.cr.deliverLoop(ctx, kvsCh, s.tr, 0, dataEngine, indexEngine, rc)
 	c.Assert(err, IsNil)
 }
 
 func (s *chunkRestoreSuite) TestDeliverLoop(c *C) {
 	ctx := context.Background()
-	kvsCh := make(chan deliveredKVs)
+	kvsCh := make(chan []deliveredKVs)
 	mockCols := []string{"c1", "c2"}
 
 	// Open two mock engines.
@@ -683,7 +683,7 @@ func (s *chunkRestoreSuite) TestDeliverLoop(c *C) {
 
 	saveCpCh := make(chan saveCp, 2)
 	go func() {
-		kvsCh <- deliveredKVs{
+		kvsCh <- []deliveredKVs{deliveredKVs{
 			kvs: kv.MakeRowFromKvPairs([]common.KvPair{
 				{
 					Key: []byte("txxxxxxxx_ryyyyyyyy"),
@@ -701,8 +701,9 @@ func (s *chunkRestoreSuite) TestDeliverLoop(c *C) {
 			columns: mockCols,
 			offset:  12,
 			rowID:   76,
+		},
 		}
-		kvsCh <- deliveredKVs{}
+		kvsCh <- []deliveredKVs{}
 		close(kvsCh)
 	}()
 
@@ -718,30 +719,31 @@ func (s *chunkRestoreSuite) TestDeliverLoop(c *C) {
 
 func (s *chunkRestoreSuite) TestEncodeLoop(c *C) {
 	ctx := context.Background()
-	kvsCh := make(chan deliveredKVs, 2)
+	kvsCh := make(chan []deliveredKVs, 2)
 	deliverCompleteCh := make(chan deliverResult)
 	kvEncoder := kv.NewTableKVEncoder(s.tr.encTable, &kv.SessionOptions{
 		SQLMode:          s.cfg.TiDB.SQLMode,
 		Timestamp:        1234567895,
 		RowFormatVersion: "1",
 	})
-
-	_, _, err := s.cr.encodeLoop(ctx, kvsCh, s.tr, s.tr.logger, kvEncoder, deliverCompleteCh, DeliverPauser)
+	cfg := config.NewConfig()
+	rc := RestoreController{pauser: DeliverPauser, cfg: cfg}
+	_, _, err := s.cr.encodeLoop(ctx, kvsCh, s.tr, s.tr.logger, kvEncoder, deliverCompleteCh, rc)
 	c.Assert(err, IsNil)
 	c.Assert(kvsCh, HasLen, 2)
 
-	firstKVs := <-kvsCh
-	c.Assert(firstKVs.kvs, HasLen, 2)
-	c.Assert(firstKVs.rowID, Equals, int64(19))
-	c.Assert(firstKVs.offset, Equals, int64(36))
+	kvs := <-kvsCh
+	c.Assert(kvs[0].kvs, HasLen, 2)
+	c.Assert(kvs[0].rowID, Equals, int64(19))
+	c.Assert(kvs[0].offset, Equals, int64(36))
 
-	secondKVs := <-kvsCh
-	c.Assert(secondKVs.kvs, IsNil)
+	kvs = <-kvsCh
+	c.Assert(len(kvs), Equals, 0)
 }
 
 func (s *chunkRestoreSuite) TestEncodeLoopCanceled(c *C) {
 	ctx, cancel := context.WithCancel(context.Background())
-	kvsCh := make(chan deliveredKVs)
+	kvsCh := make(chan []deliveredKVs)
 	deliverCompleteCh := make(chan deliverResult)
 	kvEncoder := kv.NewTableKVEncoder(s.tr.encTable, &kv.SessionOptions{
 		SQLMode:          s.cfg.TiDB.SQLMode,
@@ -750,14 +752,16 @@ func (s *chunkRestoreSuite) TestEncodeLoopCanceled(c *C) {
 	})
 
 	go cancel()
-	_, _, err := s.cr.encodeLoop(ctx, kvsCh, s.tr, s.tr.logger, kvEncoder, deliverCompleteCh, DeliverPauser)
+	cfg := config.NewConfig()
+	rc := RestoreController{pauser: DeliverPauser, cfg: cfg}
+	_, _, err := s.cr.encodeLoop(ctx, kvsCh, s.tr, s.tr.logger, kvEncoder, deliverCompleteCh, rc)
 	c.Assert(errors.Cause(err), Equals, context.Canceled)
 	c.Assert(kvsCh, HasLen, 0)
 }
 
 func (s *chunkRestoreSuite) TestEncodeLoopForcedError(c *C) {
 	ctx := context.Background()
-	kvsCh := make(chan deliveredKVs, 2)
+	kvsCh := make(chan []deliveredKVs, 2)
 	deliverCompleteCh := make(chan deliverResult)
 	kvEncoder := kv.NewTableKVEncoder(s.tr.encTable, &kv.SessionOptions{
 		SQLMode:          s.cfg.TiDB.SQLMode,
@@ -768,14 +772,16 @@ func (s *chunkRestoreSuite) TestEncodeLoopForcedError(c *C) {
 	// close the chunk so reading it will result in the "file already closed" error.
 	s.cr.parser.Close()
 
-	_, _, err := s.cr.encodeLoop(ctx, kvsCh, s.tr, s.tr.logger, kvEncoder, deliverCompleteCh, DeliverPauser)
+	cfg := config.NewConfig()
+	rc := RestoreController{pauser: DeliverPauser, cfg: cfg}
+	_, _, err := s.cr.encodeLoop(ctx, kvsCh, s.tr, s.tr.logger, kvEncoder, deliverCompleteCh, rc)
 	c.Assert(err, ErrorMatches, `in file .*[/\\]db\.table\.2\.sql:0 at offset 0:.*file already closed`)
 	c.Assert(kvsCh, HasLen, 0)
 }
 
 func (s *chunkRestoreSuite) TestEncodeLoopDeliverErrored(c *C) {
 	ctx := context.Background()
-	kvsCh := make(chan deliveredKVs)
+	kvsCh := make(chan []deliveredKVs)
 	deliverCompleteCh := make(chan deliverResult)
 	kvEncoder := kv.NewTableKVEncoder(s.tr.encTable, &kv.SessionOptions{
 		SQLMode:          s.cfg.TiDB.SQLMode,
@@ -788,7 +794,9 @@ func (s *chunkRestoreSuite) TestEncodeLoopDeliverErrored(c *C) {
 			err: errors.New("fake deliver error"),
 		}
 	}()
-	_, _, err := s.cr.encodeLoop(ctx, kvsCh, s.tr, s.tr.logger, kvEncoder, deliverCompleteCh, DeliverPauser)
+	cfg := config.NewConfig()
+	rc := RestoreController{pauser: DeliverPauser, cfg: cfg}
+	_, _, err := s.cr.encodeLoop(ctx, kvsCh, s.tr, s.tr.logger, kvEncoder, deliverCompleteCh, rc)
 	c.Assert(err, ErrorMatches, "fake deliver error")
 	c.Assert(kvsCh, HasLen, 0)
 }

From 08f44a69806f7b5171d8830733ad519d3b844e9a Mon Sep 17 00:00:00 2001
From: xuhuaiyu <391585975@qq.com>
Date: Sun, 8 Mar 2020 17:51:10 +0800
Subject: [PATCH 19/30] use sync.Pool

---
 lightning/mydump/csv_parser.go | 11 ++++++++++-
 lightning/mydump/parser.go     |  2 +-
 lightning/restore/restore.go   |  1 +
 3 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/lightning/mydump/csv_parser.go b/lightning/mydump/csv_parser.go
index b2790d9bd..9083cb534 100644
--- a/lightning/mydump/csv_parser.go
+++ b/lightning/mydump/csv_parser.go
@@ -22,6 +22,7 @@ import (
 	"github.com/pingcap/tidb-lightning/lightning/config"
 	"github.com/pingcap/tidb-lightning/lightning/worker"
 	"github.com/pingcap/tidb/types"
+	"sync"
 )
 
 var (
@@ -52,6 +53,14 @@ type CSVParser struct {
 	fieldIndexes []int
 }
 
+const estColCnt = 10
+
+var DatumSlicePool = &sync.Pool{
+	New: func() interface{} {
+		return make([]types.Datum, 0, estColCnt)
+	},
+}
+
 func NewCSVParser(
 	cfg *config.CSVConfig,
 	reader ReadSeekCloser,
@@ -342,7 +351,7 @@ func (parser *CSVParser) ReadRow() error {
 		records = records[:i]
 	}
 
-	row.Row = make([]types.Datum, 0, len(records))
+	row.Row = DatumSlicePool.Get().([]types.Datum)
 	for _, record := range records {
 		var datum types.Datum
 		unescaped, isNull := parser.unescapeString(record)
diff --git a/lightning/mydump/parser.go b/lightning/mydump/parser.go
index 29031d6fd..4d745d194 100644
--- a/lightning/mydump/parser.go
+++ b/lightning/mydump/parser.go
@@ -421,7 +421,7 @@ func (parser *ChunkParser) ReadRow() error {
 			switch tok {
 			case tokRowBegin:
 				row.RowID++
-				row.Row = make([]types.Datum, 0, len(row.Row))
+				row.Row = DatumSlicePool.Get().([]types.Datum)
 				st = stateRow
 			case tokUnquoted, tokDoubleQuoted, tokBackQuoted:
 				parser.columns = nil
diff --git a/lightning/restore/restore.go b/lightning/restore/restore.go
index 10e4f26aa..4917263be 100644
--- a/lightning/restore/restore.go
+++ b/lightning/restore/restore.go
@@ -1727,6 +1727,7 @@ func (cr *chunkRestore) encodeLoop(
 			lastRow := cr.parser.LastRow()
 			// sql -> kv
 			kvs, encodeErr := kvEncoder.Encode(logger, lastRow.Row, lastRow.RowID, cr.chunk.ColumnPermutation)
+			mydump.DatumSlicePool.Put(lastRow.Row[:0])
 			encodeDur += time.Since(encodeDurStart)
 			if encodeErr != nil {
 				err = errors.Annotatef(encodeErr, "in file %s at offset %d", &cr.chunk.Key, newOffset)

From 83a732f4ccdaea6d6feae85e5171a1374430b235 Mon Sep 17 00:00:00 2001
From: Jiahao Huang <july2993@gmail.com>
Date: Thu, 12 Mar 2020 11:37:55 +0800
Subject: [PATCH 20/30]  Close channel instead of push one entry.

---
 go.sum                            |  1 +
 lightning/restore/restore.go      |  6 +++---
 lightning/restore/restore_test.go |  2 +-
 tools/go.sum                      | 11 +++++++++++
 4 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/go.sum b/go.sum
index 8169a39a8..f721b4053 100644
--- a/go.sum
+++ b/go.sum
@@ -224,6 +224,7 @@ github.com/pingcap/check v0.0.0-20190102082844-67f458068fc8/go.mod h1:B1+S9LNcuM
 github.com/pingcap/check v0.0.0-20191107115940-caf2b9e6ccf4/go.mod h1:PYMCGwN0JHjoqGr3HrZoD+b8Tgx8bKnArhSq8YVzUMc=
 github.com/pingcap/check v0.0.0-20191216031241-8a5a85928f12 h1:rfD9v3+ppLPzoQBgZev0qYCpegrwyFx/BUpkApEiKdY=
 github.com/pingcap/check v0.0.0-20191216031241-8a5a85928f12/go.mod h1:PYMCGwN0JHjoqGr3HrZoD+b8Tgx8bKnArhSq8YVzUMc=
+github.com/pingcap/check v0.0.0-20200212061837-5e12011dc712 h1:R8gStypOBmpnHEx1qi//SaqxJVI4inOqljg/Aj5/390=
 github.com/pingcap/check v0.0.0-20200212061837-5e12011dc712/go.mod h1:PYMCGwN0JHjoqGr3HrZoD+b8Tgx8bKnArhSq8YVzUMc=
 github.com/pingcap/errcode v0.0.0-20180921232412-a1a7271709d9 h1:KH4f4Si9XK6/IW50HtoaiLIFHGkapOM6w83za47UYik=
 github.com/pingcap/errcode v0.0.0-20180921232412-a1a7271709d9/go.mod h1:4b2X8xSqxIroj/IZ9MX/VGZhAwc11wB9wRIzHvz6SeM=
diff --git a/lightning/restore/restore.go b/lightning/restore/restore.go
index 4917263be..b41eb2e6e 100644
--- a/lightning/restore/restore.go
+++ b/lightning/restore/restore.go
@@ -567,7 +567,7 @@ func (rc *RestoreController) restoreTables(ctx context.Context) error {
 
 	var restoreErr common.OnceError
 
-	stopPeriodicActions := make(chan struct{}, 1)
+	stopPeriodicActions := make(chan struct{})
 	go rc.runPeriodicActions(ctx, stopPeriodicActions)
 
 	type task struct {
@@ -677,7 +677,7 @@ func (rc *RestoreController) restoreTables(ctx context.Context) error {
 	}
 
 	wg.Wait()
-	stopPeriodicActions <- struct{}{}
+	close(stopPeriodicActions)
 
 	err := restoreErr.Get()
 	logTask.End(zap.ErrorLevel, err)
@@ -934,7 +934,7 @@ func (t *TableRestore) restoreEngine(
 	totalSQLSize := int64(0)
 	for _, chunk := range cp.Chunks {
 		totalKVSize += chunk.Checksum.SumSize()
-		totalSQLSize += chunk.Chunk.EndOffset
+		totalSQLSize += chunk.Chunk.EndOffset // want EndOffset - Offset ?
 	}
 
 	err = chunkErr.Get()
diff --git a/lightning/restore/restore_test.go b/lightning/restore/restore_test.go
index 8632acffe..5ad005c42 100644
--- a/lightning/restore/restore_test.go
+++ b/lightning/restore/restore_test.go
@@ -683,7 +683,7 @@ func (s *chunkRestoreSuite) TestDeliverLoop(c *C) {
 
 	saveCpCh := make(chan saveCp, 2)
 	go func() {
-		kvsCh <- []deliveredKVs{deliveredKVs{
+		kvsCh <- []deliveredKVs{{
 			kvs: kv.MakeRowFromKvPairs([]common.KvPair{
 				{
 					Key: []byte("txxxxxxxx_ryyyyyyyy"),
diff --git a/tools/go.sum b/tools/go.sum
index 0612a230a..306fc7259 100644
--- a/tools/go.sum
+++ b/tools/go.sum
@@ -1,4 +1,5 @@
 cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
 github.com/OpenPeeDeeP/depguard v1.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM=
@@ -26,8 +27,10 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
 github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
+github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys=
 github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
 github.com/fatih/structtag v1.0.0/go.mod h1:IKitwq45uXL/yqi5mYghiD3w9H6eTOvI9vnk8tXMphA=
+github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=
 github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=
 github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
 github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
@@ -117,17 +120,23 @@ github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czP
 github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
 github.com/matoous/godox v0.0.0-20190911065817-5d6d842e92eb/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s=
 github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
+github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA=
 github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
 github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
+github.com/mattn/go-isatty v0.0.9 h1:d5US/mDsogSGW37IV293h//ZFaeajb69h+EHFsv2xGg=
 github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ=
 github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
+github.com/mattn/go-runewidth v0.0.7 h1:Ei8KR0497xHyKJPAv59M1dkC+rOZCMBJ+t3fZ+twI54=
 github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
 github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw=
 github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
 github.com/mgechev/dots v0.0.0-20181228164730-18fa4c4b71cc/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg=
+github.com/mgechev/dots v0.0.0-20190921121421-c36f7dcfbb81 h1:QASJXOGm2RZ5Ardbc86qNFvby9AqkLDibfChMtAg5QM=
 github.com/mgechev/dots v0.0.0-20190921121421-c36f7dcfbb81/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg=
 github.com/mgechev/revive v0.0.0-20190917153825-40564c5052ae/go.mod h1:37hJOqkogcmT5nmiriskuzkdJ/YhMlZwFSg87NDZbco=
+github.com/mgechev/revive v1.0.0 h1:CaN0UEsXgAovl5WB4yI7obZG+NhBh7HeEuQX11wVmTI=
 github.com/mgechev/revive v1.0.0/go.mod h1:Vwga5U/ducQXkYcbsNPMIOA1kFBVY1NBPs5Fa4Nfceg=
+github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
 github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
 github.com/mitchellh/go-ps v0.0.0-20190716172923-621e5597135b/go.mod h1:r1VsdOzOPt1ZSrGZWFoNhsAedKnEd6r9Np1+5blZCWk=
 github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
@@ -137,6 +146,7 @@ github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d/go.mod h1:o96d
 github.com/nicksnyder/go-i18n v1.10.0/go.mod h1:HrK7VCrbOvQoUAQ7Vpy7i87N7JZZZ7R2xBGjv0j365Q=
 github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
 github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
+github.com/olekukonko/tablewriter v0.0.4 h1:vHD/YYe1Wolo78koG299f7V/VAS08c6IpCLn+Ejf/w8=
 github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA=
 github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
@@ -280,6 +290,7 @@ golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtn
 golang.org/x/tools v0.0.0-20190930201159-7c411dea38b0/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20191010075000-0337d82405ff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20191113232020-e2727e816f5a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4 h1:Toz2IK7k8rbltAXwNAxKcn9OzqyNfMUhUNjz3sL0NMk=
 golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

From 2e3775b2b24b9c55d9ceb502053ec594e3fb16f1 Mon Sep 17 00:00:00 2001
From: Jiahao Huang <july2993@gmail.com>
Date: Thu, 12 Mar 2020 13:31:45 +0800
Subject: [PATCH 21/30] Use copy instead append

---
 lightning/backend/session.go | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/lightning/backend/session.go b/lightning/backend/session.go
index fb50aef8e..5e65bd7f5 100644
--- a/lightning/backend/session.go
+++ b/lightning/backend/session.go
@@ -60,9 +60,12 @@ func (t *transaction) Iter(k kv.Key, upperBound kv.Key) (kv.Iterator, error) {
 
 // Set implements the kv.Mutator interface
 func (t *transaction) Set(k kv.Key, v []byte) error {
+	val := make([]byte, len(v))
+	copy(val, v)
+
 	t.kvPairs = append(t.kvPairs, common.KvPair{
 		Key: k.Clone(),
-		Val: append([]byte{}, v...),
+		Val: val,
 	})
 	return nil
 }

From 74f35b8bc377634669c1eaacc1a05ae32314bbb5 Mon Sep 17 00:00:00 2001
From: Jiahao Huang <july2993@gmail.com>
Date: Thu, 12 Mar 2020 14:24:50 +0800
Subject: [PATCH 22/30] Fix test and failpoint version

---
 lightning/restore/restore_test.go | 8 ++++----
 tools/go.mod                      | 2 +-
 tools/go.sum                      | 2 ++
 3 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/lightning/restore/restore_test.go b/lightning/restore/restore_test.go
index 5ad005c42..153e4db91 100644
--- a/lightning/restore/restore_test.go
+++ b/lightning/restore/restore_test.go
@@ -728,7 +728,7 @@ func (s *chunkRestoreSuite) TestEncodeLoop(c *C) {
 	})
 	cfg := config.NewConfig()
 	rc := RestoreController{pauser: DeliverPauser, cfg: cfg}
-	_, _, err := s.cr.encodeLoop(ctx, kvsCh, s.tr, s.tr.logger, kvEncoder, deliverCompleteCh, rc)
+	_, _, err := s.cr.encodeLoop(ctx, kvsCh, s.tr, s.tr.logger, kvEncoder, deliverCompleteCh, &rc)
 	c.Assert(err, IsNil)
 	c.Assert(kvsCh, HasLen, 2)
 
@@ -754,7 +754,7 @@ func (s *chunkRestoreSuite) TestEncodeLoopCanceled(c *C) {
 	go cancel()
 	cfg := config.NewConfig()
 	rc := RestoreController{pauser: DeliverPauser, cfg: cfg}
-	_, _, err := s.cr.encodeLoop(ctx, kvsCh, s.tr, s.tr.logger, kvEncoder, deliverCompleteCh, rc)
+	_, _, err := s.cr.encodeLoop(ctx, kvsCh, s.tr, s.tr.logger, kvEncoder, deliverCompleteCh, &rc)
 	c.Assert(errors.Cause(err), Equals, context.Canceled)
 	c.Assert(kvsCh, HasLen, 0)
 }
@@ -774,7 +774,7 @@ func (s *chunkRestoreSuite) TestEncodeLoopForcedError(c *C) {
 
 	cfg := config.NewConfig()
 	rc := RestoreController{pauser: DeliverPauser, cfg: cfg}
-	_, _, err := s.cr.encodeLoop(ctx, kvsCh, s.tr, s.tr.logger, kvEncoder, deliverCompleteCh, rc)
+	_, _, err := s.cr.encodeLoop(ctx, kvsCh, s.tr, s.tr.logger, kvEncoder, deliverCompleteCh, &rc)
 	c.Assert(err, ErrorMatches, `in file .*[/\\]db\.table\.2\.sql:0 at offset 0:.*file already closed`)
 	c.Assert(kvsCh, HasLen, 0)
 }
@@ -796,7 +796,7 @@ func (s *chunkRestoreSuite) TestEncodeLoopDeliverErrored(c *C) {
 	}()
 	cfg := config.NewConfig()
 	rc := RestoreController{pauser: DeliverPauser, cfg: cfg}
-	_, _, err := s.cr.encodeLoop(ctx, kvsCh, s.tr, s.tr.logger, kvEncoder, deliverCompleteCh, rc)
+	_, _, err := s.cr.encodeLoop(ctx, kvsCh, s.tr, s.tr.logger, kvEncoder, deliverCompleteCh, &rc)
 	c.Assert(err, ErrorMatches, "fake deliver error")
 	c.Assert(kvsCh, HasLen, 0)
 }
diff --git a/tools/go.mod b/tools/go.mod
index e10cb3146..e14a38d28 100644
--- a/tools/go.mod
+++ b/tools/go.mod
@@ -5,6 +5,6 @@ go 1.12
 require (
 	github.com/golangci/golangci-lint v1.22.2
 	github.com/mgechev/revive v1.0.0
-	github.com/pingcap/failpoint v0.0.0-20191029060244-12f4ac2fd11d
+	github.com/pingcap/failpoint v0.0.0-20200210140405-f8f9fb234798
 	github.com/shurcooL/vfsgen v0.0.0-20181202132449-6a9ea43bcacd
 )
diff --git a/tools/go.sum b/tools/go.sum
index 306fc7259..c7e62af6d 100644
--- a/tools/go.sum
+++ b/tools/go.sum
@@ -161,6 +161,8 @@ github.com/pingcap/failpoint v0.0.0-20190708053854-e7b1061e6e81 h1:g9j4cAoWE39lh
 github.com/pingcap/failpoint v0.0.0-20190708053854-e7b1061e6e81/go.mod h1:DNS3Qg7bEDhU6EXNHF+XSv/PGznQaMJ5FWvctpm6pQI=
 github.com/pingcap/failpoint v0.0.0-20191029060244-12f4ac2fd11d h1:F8vp38kTAckN+v8Jlc98uMBvKIzr1a+UhnLyVYn8Q5Q=
 github.com/pingcap/failpoint v0.0.0-20191029060244-12f4ac2fd11d/go.mod h1:DNS3Qg7bEDhU6EXNHF+XSv/PGznQaMJ5FWvctpm6pQI=
+github.com/pingcap/failpoint v0.0.0-20200210140405-f8f9fb234798 h1:6DMbRqPI1qzQ8N1xc3+nKY8IxSACd9VqQKkRVvbyoIg=
+github.com/pingcap/failpoint v0.0.0-20200210140405-f8f9fb234798/go.mod h1:DNS3Qg7bEDhU6EXNHF+XSv/PGznQaMJ5FWvctpm6pQI=
 github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=

From 6f21d82f1e6ff10a66058201d3ff7963f904ebce Mon Sep 17 00:00:00 2001
From: Jiahao Huang <july2993@gmail.com>
Date: Thu, 12 Mar 2020 15:20:07 +0800
Subject: [PATCH 23/30] Reuse slice of record

This expected to avoid about 3.5% of alloc_objects
alloc_objects:
  Total:   773496750  773873722 (flat, cum)  7.18%
    177            .          .           	parser.fieldIndexes = parser.fieldIndexes[:0]
    178            .          .
    179            .          .           	isEmptyLine := true
...
    225    386621314  386621314           	str := string(parser.recordBuffer) // Convert to string once to batch allocations
    226    386875436  386875436           	dst := make([]string, len(parser.fieldIndexes))
---
 lightning/mydump/csv_parser.go | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

diff --git a/lightning/mydump/csv_parser.go b/lightning/mydump/csv_parser.go
index 9083cb534..a2b5eb86d 100644
--- a/lightning/mydump/csv_parser.go
+++ b/lightning/mydump/csv_parser.go
@@ -17,12 +17,12 @@ import (
 	"bytes"
 	"io"
 	"strings"
+	"sync"
 
 	"github.com/pingcap/errors"
 	"github.com/pingcap/tidb-lightning/lightning/config"
 	"github.com/pingcap/tidb-lightning/lightning/worker"
 	"github.com/pingcap/tidb/types"
-	"sync"
 )
 
 var (
@@ -51,6 +51,8 @@ type CSVParser struct {
 	// fieldIndexes is an index of fields inside recordBuffer.
 	// The i'th field ends at offset fieldIndexes[i] in recordBuffer.
 	fieldIndexes []int
+
+	lastRecord []string
 }
 
 const estColCnt = 10
@@ -172,7 +174,7 @@ func (parser *CSVParser) readUntil(chars string) ([]byte, byte, error) {
 	}
 }
 
-func (parser *CSVParser) readRecord() ([]string, error) {
+func (parser *CSVParser) readRecord(dst []string) ([]string, error) {
 	parser.recordBuffer = parser.recordBuffer[:0]
 	parser.fieldIndexes = parser.fieldIndexes[:0]
 
@@ -223,7 +225,11 @@ outside:
 	// Create a single string and create slices out of it.
 	// This pins the memory of the fields together, but allocates once.
 	str := string(parser.recordBuffer) // Convert to string once to batch allocations
-	dst := make([]string, len(parser.fieldIndexes))
+	dst = dst[:0]
+	if cap(dst) < len(parser.fieldIndexes) {
+		dst = make([]string, len(parser.fieldIndexes))
+	}
+	dst = dst[:len(parser.fieldIndexes)]
 	var preIdx int
 	for i, idx := range parser.fieldIndexes {
 		dst[i] = str[preIdx:idx]
@@ -324,7 +330,7 @@ func (parser *CSVParser) ReadRow() error {
 
 	// skip the header first
 	if parser.pos == 0 && parser.cfg.Header {
-		columns, err := parser.readRecord()
+		columns, err := parser.readRecord(nil)
 		if err != nil {
 			return errors.Trace(err)
 		}
@@ -335,10 +341,11 @@ func (parser *CSVParser) ReadRow() error {
 		}
 	}
 
-	records, err := parser.readRecord()
+	records, err := parser.readRecord(parser.lastRecord)
 	if err != nil {
 		return errors.Trace(err)
 	}
+	parser.lastRecord = records
 	// remove trailing empty values
 	if parser.cfg.TrimLastSep {
 		i := len(records)

From cce3ea65de77926ea127e6ae2c90ab79fa472b9a Mon Sep 17 00:00:00 2001
From: Jiahao Huang <july2993@gmail.com>
Date: Thu, 12 Mar 2020 23:10:40 +0800
Subject: [PATCH 24/30] Use pool for mutation

This take most alloc in WriteRows:
    ROUTINE ======================== github.com/pingcap/tidb-lightning/lightning/backend.(*importer).WriteRows in /Users/huangjiahao/go/src/github.com/pingcap/tidb-lightning/lightning/backend/importer.go
     797370418  980241246 (flat, cum)  9.09% of Total
             .          .    155:   kvs := rows.(kvPairs)
    ...
    ...
             .          .    192:   for i, pair := range kvs {
     772641868  772641868    193:           mutations[i] = &kv.Mutation{
             .          .    194:                   Op:    kv.Mutation_Put,
             .          .    195:                   Key:   pair.Key,
             .          .    196:                   Value: pair.Val,
             .          .    197:           }
             .          .    198:   }
---
 lightning/backend/importer.go      | 33 ++++++++++++++++---------
 lightning/backend/importer_test.go | 39 ++++++++++++++++++++++++++++++
 2 files changed, 60 insertions(+), 12 deletions(-)

diff --git a/lightning/backend/importer.go b/lightning/backend/importer.go
index e46930392..f0e009d0f 100644
--- a/lightning/backend/importer.go
+++ b/lightning/backend/importer.go
@@ -16,6 +16,7 @@ package backend
 import (
 	"context"
 	"strings"
+	"sync"
 	"time"
 
 	"github.com/pingcap/errors"
@@ -39,6 +40,8 @@ type importer struct {
 	conn   *grpc.ClientConn
 	cli    kv.ImportKVClient
 	pdAddr string
+
+	mutationPool sync.Pool
 }
 
 // NewImporter creates a new connection to tikv-importer. A single connection
@@ -50,9 +53,10 @@ func NewImporter(ctx context.Context, tls *common.TLS, importServerAddr string,
 	}
 
 	return MakeBackend(&importer{
-		conn:   conn,
-		cli:    kv.NewImportKVClient(conn),
-		pdAddr: pdAddr,
+		conn:         conn,
+		cli:          kv.NewImportKVClient(conn),
+		pdAddr:       pdAddr,
+		mutationPool: sync.Pool{New: func() interface{} { return &kv.Mutation{} }},
 	}), nil
 }
 
@@ -61,9 +65,10 @@ func NewImporter(ctx context.Context, tls *common.TLS, importServerAddr string,
 // outside of tests.
 func NewMockImporter(cli kv.ImportKVClient, pdAddr string) Backend {
 	return MakeBackend(&importer{
-		conn:   nil,
-		cli:    cli,
-		pdAddr: pdAddr,
+		conn:         nil,
+		cli:          cli,
+		pdAddr:       pdAddr,
+		mutationPool: sync.Pool{New: func() interface{} { return &kv.Mutation{} }},
 	})
 }
 
@@ -190,11 +195,10 @@ func (importer *importer) WriteRows(
 	// Send kv paris as write request content
 	mutations := make([]*kv.Mutation, len(kvs))
 	for i, pair := range kvs {
-		mutations[i] = &kv.Mutation{
-			Op:    kv.Mutation_Put,
-			Key:   pair.Key,
-			Value: pair.Val,
-		}
+		mutations[i] = importer.mutationPool.Get().(*kv.Mutation)
+		mutations[i].Op = kv.Mutation_Put
+		mutations[i].Key = pair.Key
+		mutations[i].Value = pair.Val
 	}
 
 	req.Reset()
@@ -205,7 +209,12 @@ func (importer *importer) WriteRows(
 		},
 	}
 
-	if err := wstream.Send(req); err != nil {
+	err = wstream.Send(req)
+	for i := 0; i < len(mutations); i++ {
+		importer.mutationPool.Put(mutations[i])
+	}
+
+	if err != nil {
 		return errors.Trace(err)
 	}
 
diff --git a/lightning/backend/importer_test.go b/lightning/backend/importer_test.go
index 44a2583f8..c18f6cee2 100644
--- a/lightning/backend/importer_test.go
+++ b/lightning/backend/importer_test.go
@@ -2,6 +2,8 @@ package backend_test
 
 import (
 	"context"
+	"sync"
+	"testing"
 
 	"github.com/golang/mock/gomock"
 	. "github.com/pingcap/check"
@@ -9,6 +11,7 @@ import (
 	"github.com/pingcap/kvproto/pkg/import_kvpb"
 	uuid "github.com/satori/go.uuid"
 
+	kvpb "github.com/pingcap/kvproto/pkg/import_kvpb"
 	kv "github.com/pingcap/tidb-lightning/lightning/backend"
 	"github.com/pingcap/tidb-lightning/lightning/common"
 	"github.com/pingcap/tidb-lightning/mock"
@@ -193,3 +196,39 @@ func (s *importerSuite) TestCloseImportCleanupEngine(c *C) {
 	err = engine.Cleanup(s.ctx)
 	c.Assert(err, IsNil)
 }
+
+func BenchmarkMutationAlloc(b *testing.B) {
+	var g *kvpb.Mutation
+	for i := 0; i < b.N; i++ {
+		m := &kvpb.Mutation{
+			Op:    kvpb.Mutation_Put,
+			Key:   nil,
+			Value: nil,
+		}
+		g = m
+	}
+
+	var _ = g
+}
+
+func BenchmarkMutationPool(b *testing.B) {
+	p := sync.Pool{
+		New: func() interface{} {
+			return &kvpb.Mutation{}
+		},
+	}
+	var g *kvpb.Mutation
+
+	for i := 0; i < b.N; i++ {
+		m := p.Get().(*kvpb.Mutation)
+		m.Op = kvpb.Mutation_Put
+		m.Key = nil
+		m.Value = nil
+
+		g = m
+
+		p.Put(m)
+	}
+
+	var _ = g
+}

From 59e5cd5cc59061fcbd4156bb1ee8540e7ce956e8 Mon Sep 17 00:00:00 2001
From: Jiahao Huang <july2993@gmail.com>
Date: Mon, 16 Mar 2020 11:18:25 +0800
Subject: [PATCH 25/30] Set GC percent as 500 default

Lightning allocates too many transient objects and heap size is small,
so garbage collections happen too frequently and lots of time is spent in GC component.

In a test of loading the table `order_line.csv` of 14k TPCC.
The time need of `encode kv data and write` step reduce from 52m4s to 37m30s when change
GOGC from 100 to 500, the total time needed reduce near 15m too.
The cost of this is the memory of lightnin at runtime grow from about 200M to 700M, but it's acceptable.

So we set the gc percentage as 500 default to reduce the GC frequency instead of 100.
---
 cmd/tidb-lightning/main.go | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/cmd/tidb-lightning/main.go b/cmd/tidb-lightning/main.go
index aa6b1e17a..22ba81e21 100644
--- a/cmd/tidb-lightning/main.go
+++ b/cmd/tidb-lightning/main.go
@@ -17,6 +17,7 @@ import (
 	"fmt"
 	"os"
 	"os/signal"
+	"runtime/debug"
 	"syscall"
 
 	"github.com/pingcap/tidb-lightning/lightning"
@@ -44,6 +45,21 @@ func main() {
 
 	logger := log.L()
 
+	// Lightning allocates too many transient objects and heap size is small,
+	// so garbage collections happen too frequently and lots of time is spent in GC component.
+	//
+	// In a test of loading the table `order_line.csv` of 14k TPCC.
+	// The time need of `encode kv data and write` step reduce from 52m4s to 37m30s when change
+	// GOGC from 100 to 500, the total time needed reduce near 15m too.
+	// The cost of this is the memory of lightnin at runtime grow from about 200M to 700M, but it's acceptable.
+	//
+	// So we set the gc percentage as 500 default to reduce the GC frequency instead of 100.
+	gogc := os.Getenv("GOGC")
+	if gogc == "" {
+		old := debug.SetGCPercent(500)
+		log.L().Info("set gc percentage", zap.Int("old", old), zap.Int("new", 500))
+	}
+
 	err := app.GoServe()
 	if err != nil {
 		logger.Error("failed to start HTTP server", zap.Error(err))

From d2c013e0376af3e148f15ab607a4a66acf46c578 Mon Sep 17 00:00:00 2001
From: Jiahao Huang <july2993@gmail.com>
Date: Mon, 16 Mar 2020 16:28:55 +0800
Subject: [PATCH 26/30] Remove MaxKVPairs in Mydump

has been move to Importer part
---
 lightning/config/config.go | 2 --
 1 file changed, 2 deletions(-)

diff --git a/lightning/config/config.go b/lightning/config/config.go
index ad46a4208..b2cb759ba 100644
--- a/lightning/config/config.go
+++ b/lightning/config/config.go
@@ -147,7 +147,6 @@ type MydumperRuntime struct {
 	CaseSensitive    bool      `toml:"case-sensitive" json:"case-sensitive"`
 	StrictFormat     bool      `toml:"strict-format" json:"strict-format"`
 	MaxRegionSize    int64     `toml:"max-region-size" json:"max-region-size"`
-	MaxKVPairs       int64     `toml:"max-kv-pairs" json:"max-kv-pairs"`
 }
 
 type TikvImporter struct {
@@ -250,7 +249,6 @@ func NewConfig() *Config {
 				TrimLastSep:     false,
 			},
 			StrictFormat:  false,
-			MaxKVPairs:    128,
 			MaxRegionSize: MaxRegionSize,
 		},
 		TikvImporter: TikvImporter{

From e964971eda67cecda6d8f140ef070bc0b7bbb6a1 Mon Sep 17 00:00:00 2001
From: Jiahao Huang <july2993@gmail.com>
Date: Mon, 16 Mar 2020 16:33:56 +0800
Subject: [PATCH 27/30] Remove outdate code

---
 lightning/mydump/csv_parser.go | 9 ---------
 lightning/restore/restore.go   | 1 -
 2 files changed, 10 deletions(-)

diff --git a/lightning/mydump/csv_parser.go b/lightning/mydump/csv_parser.go
index 7d947095c..4cebab1b0 100644
--- a/lightning/mydump/csv_parser.go
+++ b/lightning/mydump/csv_parser.go
@@ -17,7 +17,6 @@ import (
 	"bytes"
 	"io"
 	"strings"
-	"sync"
 
 	"github.com/pingcap/errors"
 	"github.com/pingcap/tidb-lightning/lightning/config"
@@ -55,14 +54,6 @@ type CSVParser struct {
 	lastRecord []string
 }
 
-const estColCnt = 10
-
-var DatumSlicePool = &sync.Pool{
-	New: func() interface{} {
-		return make([]types.Datum, 0, estColCnt)
-	},
-}
-
 func NewCSVParser(
 	cfg *config.CSVConfig,
 	reader ReadSeekCloser,
diff --git a/lightning/restore/restore.go b/lightning/restore/restore.go
index ce6c8b62e..82b4b4fe0 100644
--- a/lightning/restore/restore.go
+++ b/lightning/restore/restore.go
@@ -1741,7 +1741,6 @@ func (cr *chunkRestore) encodeLoop(
 			lastRow := cr.parser.LastRow()
 			// sql -> kv
 			kvs, encodeErr := kvEncoder.Encode(logger, lastRow.Row, lastRow.RowID, cr.chunk.ColumnPermutation)
-			mydump.DatumSlicePool.Put(lastRow.Row[:0])
 			encodeDur += time.Since(encodeDurStart)
 			cr.parser.RecycleRow(lastRow)
 			if encodeErr != nil {

From 0181a3f7c8c736e24f00d2a86d96a6278a86789a Mon Sep 17 00:00:00 2001
From: Jiahao Huang <july2993@gmail.com>
Date: Mon, 16 Mar 2020 18:40:28 +0800
Subject: [PATCH 28/30] Update tidb version

For https://github.com/pingcap/tidb/commit/495f8b74382fb31924b4948374c0dbba6f2d87cd
disable UpdateDeltaForTable if TxnCtx is nil
---
 checkout-pr-branch.sh          | 37 -----------------
 go.mod                         |  6 +--
 go.sum                         | 74 ++++++----------------------------
 lightning/backend/session.go   |  4 --
 lightning/mydump/csv_parser.go |  2 +-
 lightning/mydump/parser.go     |  2 +-
 6 files changed, 17 insertions(+), 108 deletions(-)
 delete mode 100755 checkout-pr-branch.sh

diff --git a/checkout-pr-branch.sh b/checkout-pr-branch.sh
deleted file mode 100755
index 54399d232..000000000
--- a/checkout-pr-branch.sh
+++ /dev/null
@@ -1,37 +0,0 @@
-#!/usr/bin/env bash
-# Copyright 2019 PingCAP, Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This script is used to checkout a TiDB PR branch in a forked repo.
-if test -z $1; then
-	echo -e "Usage:\n"
-	echo -e "\tcheckout-pr-branch.sh [github-username]:[pr-branch]\n"
-	echo -e "The argument can be copied directly from github PR page."
-	echo -e "The local branch name would be [github-username]/[pr-branch]."
-	exit 0;
-fi
-
-username=$(echo $1 | cut -d':' -f1)
-branch=$(echo $1 | cut -d':' -f2)
-local_branch=$username/$branch
-fork="https://github.com/$username/tidb-lightning"
-# fork="https://github.com/pingcap/tidb-lightning"
-
-exists=`git show-ref refs/heads/$local_branch`
-if [ -n "$exists" ]; then
-	git checkout $local_branch
-	git pull $fork $branch:$local_branch
-else
-	git fetch $fork $branch:$local_branch
-	git checkout $local_branch
-fi
diff --git a/go.mod b/go.mod
index 96bd33b56..be7dc3d00 100644
--- a/go.mod
+++ b/go.mod
@@ -13,10 +13,10 @@ require (
 	github.com/pingcap/check v0.0.0-20200212061837-5e12011dc712
 	github.com/pingcap/errors v0.11.5-0.20190809092503-95897b64e011
 	github.com/pingcap/failpoint v0.0.0-20200210140405-f8f9fb234798
-	github.com/pingcap/kvproto v0.0.0-20200210234432-a965739f8162
+	github.com/pingcap/kvproto v0.0.0-20200221125103-35b65c96516e
 	github.com/pingcap/log v0.0.0-20200117041106-d28c14d3b1cd
 	github.com/pingcap/parser v0.0.0-20200218113622-517beb2e39c2
-	github.com/pingcap/tidb v1.1.0-beta.0.20200110130413-8c3ee37c1938
+	github.com/pingcap/tidb v1.1.0-beta.0.20200303031609-495f8b74382f
 	github.com/pingcap/tidb-tools v4.0.0-beta+incompatible
 	github.com/prometheus/client_golang v1.4.0
 	github.com/prometheus/client_model v0.2.0
@@ -28,5 +28,3 @@ require (
 	google.golang.org/grpc v1.25.1
 	modernc.org/mathutil v1.0.0
 )
-
-replace github.com/pingcap/tidb => github.com/XuHuaiyu/tidb v0.0.0-20200305040504-ba0c83c0a06d
diff --git a/go.sum b/go.sum
index f721b4053..c8c0bbdf7 100644
--- a/go.sum
+++ b/go.sum
@@ -7,10 +7,6 @@ github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE
 github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
 github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d h1:G0m3OIz70MZUWq3EgK3CesDbo8upS2Vm9/P3FtgI+Jk=
 github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
-github.com/XuHuaiyu/tidb v0.0.0-20200305034632-db3a8f08d804 h1:caexiCKS9STOeOX93unc+o5E0GEbS8XrbnXXtKYt8MY=
-github.com/XuHuaiyu/tidb v0.0.0-20200305034632-db3a8f08d804/go.mod h1:u2XSRro367b2irRWpV8ylXqonmH4qhQBvyGIUPeoEKQ=
-github.com/XuHuaiyu/tidb v0.0.0-20200305040504-ba0c83c0a06d h1:uvryvd3BdIgMAynX1BpzoMeUonCl1s7KI92LHEkmp+w=
-github.com/XuHuaiyu/tidb v0.0.0-20200305040504-ba0c83c0a06d/go.mod h1:Bb4gLdJvdUtq/7iqz7nM7uLxNI16SDfti05K82LdKfk=
 github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
 github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
 github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
@@ -93,7 +89,6 @@ github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gG
 github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
 github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
 github.com/gogo/protobuf v0.0.0-20180717141946-636bf0302bc9/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
-github.com/gogo/protobuf v1.0.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
 github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
 github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
 github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls=
@@ -117,9 +112,6 @@ github.com/golang/protobuf v1.3.3 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I
 github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
 github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db h1:woRePGFeVFfLKN/pOkfl+p/TAqKOfFu+7KPlMVpok/w=
 github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
-github.com/google/btree v0.0.0-20180124185431-e89373fe6b4a/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
-github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c h1:964Od4U6p2jUkFxvCydnIczKteheJEzHRToSGK3Bnlw=
-github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo=
 github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
@@ -149,7 +141,6 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de
 github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
 github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho=
 github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
-github.com/grpc-ecosystem/grpc-gateway v1.4.1/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw=
 github.com/grpc-ecosystem/grpc-gateway v1.9.5 h1:UImYN5qQ8tuGpGE16ZmjvcTtTw24zw1QAp/SlnNrZhI=
 github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
 github.com/grpc-ecosystem/grpc-gateway v1.12.1 h1:zCy2xE9ablevUOrUZc3Dl72Dt+ya2FNAvC2yLYMHzi4=
@@ -182,7 +173,6 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxv
 github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
 github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
 github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
-github.com/kr/pty v1.0.0/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
 github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
@@ -190,7 +180,6 @@ github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaO
 github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
 github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
 github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o=
-github.com/matttproud/golang_protobuf_extensions v1.0.0/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
 github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
 github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
 github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
@@ -218,12 +207,11 @@ github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKw
 github.com/opentracing/opentracing-go v1.0.2 h1:3jA2P6O1F9UOrWVpwrIo17pu01KWvNWg4X946/Y5Zwg=
 github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
 github.com/pelletier/go-toml v1.3.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo=
+github.com/phf/go-queue v0.0.0-20170504031614-9abe38d0371d h1:U+PMnTlV2tu7RuMK5etusZG3Cf+rpow5hqQByeCzJ2g=
 github.com/phf/go-queue v0.0.0-20170504031614-9abe38d0371d/go.mod h1:lXfE4PvvTW5xOjO6Mba8zDPyw8M93B6AQ7frTGnMlA8=
 github.com/pingcap/check v0.0.0-20190102082844-67f458068fc8 h1:USx2/E1bX46VG32FIw034Au6seQ2fY9NEILmNh/UlQg=
 github.com/pingcap/check v0.0.0-20190102082844-67f458068fc8/go.mod h1:B1+S9LNcuMyLH/4HMTViQOJevkGiik3wW2AN9zb2fNQ=
 github.com/pingcap/check v0.0.0-20191107115940-caf2b9e6ccf4/go.mod h1:PYMCGwN0JHjoqGr3HrZoD+b8Tgx8bKnArhSq8YVzUMc=
-github.com/pingcap/check v0.0.0-20191216031241-8a5a85928f12 h1:rfD9v3+ppLPzoQBgZev0qYCpegrwyFx/BUpkApEiKdY=
-github.com/pingcap/check v0.0.0-20191216031241-8a5a85928f12/go.mod h1:PYMCGwN0JHjoqGr3HrZoD+b8Tgx8bKnArhSq8YVzUMc=
 github.com/pingcap/check v0.0.0-20200212061837-5e12011dc712 h1:R8gStypOBmpnHEx1qi//SaqxJVI4inOqljg/Aj5/390=
 github.com/pingcap/check v0.0.0-20200212061837-5e12011dc712/go.mod h1:PYMCGwN0JHjoqGr3HrZoD+b8Tgx8bKnArhSq8YVzUMc=
 github.com/pingcap/errcode v0.0.0-20180921232412-a1a7271709d9 h1:KH4f4Si9XK6/IW50HtoaiLIFHGkapOM6w83za47UYik=
@@ -243,38 +231,26 @@ github.com/pingcap/goleveldb v0.0.0-20191226122134-f82aafb29989 h1:surzm05a8C9dN
 github.com/pingcap/goleveldb v0.0.0-20191226122134-f82aafb29989/go.mod h1:O17XtbryoCJhkKGbT62+L2OlrniwqiGLSqrmdHCMzZw=
 github.com/pingcap/kvproto v0.0.0-20191211054548-3c6b38ea5107/go.mod h1:WWLmULLO7l8IOcQG+t+ItJ3fEcrL5FxF0Wu+HrMy26w=
 github.com/pingcap/kvproto v0.0.0-20191213111810-93cb7c623c8b/go.mod h1:WWLmULLO7l8IOcQG+t+ItJ3fEcrL5FxF0Wu+HrMy26w=
-github.com/pingcap/kvproto v0.0.0-20200108025604-a4dc183d2af5 h1:RUxQExD5yubAjWGnw8kcxfO9abbiVHIE1rbuCyQCWDE=
-github.com/pingcap/kvproto v0.0.0-20200108025604-a4dc183d2af5/go.mod h1:WWLmULLO7l8IOcQG+t+ItJ3fEcrL5FxF0Wu+HrMy26w=
-github.com/pingcap/kvproto v0.0.0-20200210234432-a965739f8162 h1:lsoIoCoXMpcHvW6jHcqP/prA4I6duAp1DVyG2ULz4bM=
-github.com/pingcap/kvproto v0.0.0-20200210234432-a965739f8162/go.mod h1:IOdRDPLyda8GX2hE/jO7gqaCV/PNFh8BZQCQZXfIOqI=
+github.com/pingcap/kvproto v0.0.0-20200221125103-35b65c96516e h1:z7j9uyuG/6I4god5h5NbsbMDSfhoOYAvVW6JxhwdHHw=
+github.com/pingcap/kvproto v0.0.0-20200221125103-35b65c96516e/go.mod h1:IOdRDPLyda8GX2hE/jO7gqaCV/PNFh8BZQCQZXfIOqI=
 github.com/pingcap/log v0.0.0-20191012051959-b742a5d432e9 h1:AJD9pZYm72vMgPcQDww9rkZ1DnWfl0pXV3BOWlkYIjA=
 github.com/pingcap/log v0.0.0-20191012051959-b742a5d432e9/go.mod h1:4rbK1p9ILyIfb6hU7OG2CiWSqMXnp3JMbiaVJ6mvoY8=
 github.com/pingcap/log v0.0.0-20200117041106-d28c14d3b1cd h1:CV3VsP3Z02MVtdpTMfEgRJ4T9NGgGTxdHpJerent7rM=
 github.com/pingcap/log v0.0.0-20200117041106-d28c14d3b1cd/go.mod h1:4rbK1p9ILyIfb6hU7OG2CiWSqMXnp3JMbiaVJ6mvoY8=
-github.com/pingcap/parser v0.0.0-20200109073933-a9496438d77d h1:4QwSJRxmBjTB9ssJNWg2f2bDm5rqnHCUUjMh4N1QOOY=
-github.com/pingcap/parser v0.0.0-20200109073933-a9496438d77d/go.mod h1:9v0Edh8IbgjGYW2ArJr19E+bvL8zKahsFp+ixWeId+4=
-github.com/pingcap/parser v0.0.0-20200207090844-d65f5147dd9f h1:uUrZ94J2/tsmCXHjF7pItG2tMqwP4P4vMojAbI8NMRY=
-github.com/pingcap/parser v0.0.0-20200207090844-d65f5147dd9f/go.mod h1:9v0Edh8IbgjGYW2ArJr19E+bvL8zKahsFp+ixWeId+4=
 github.com/pingcap/parser v0.0.0-20200218113622-517beb2e39c2 h1:DsymejjOFdljM1q0BJ8yBZUYQ7718+7JTO046Rqd/3k=
 github.com/pingcap/parser v0.0.0-20200218113622-517beb2e39c2/go.mod h1:9v0Edh8IbgjGYW2ArJr19E+bvL8zKahsFp+ixWeId+4=
-github.com/pingcap/pd v1.1.0-beta.0.20191219054547-4d65bbefbc6d h1:Ui80aiLTyd0EZD56o2tjFRYpHfhazBjtBdKeR8UoTFY=
-github.com/pingcap/pd v1.1.0-beta.0.20191219054547-4d65bbefbc6d/go.mod h1:CML+b1JVjN+VbDijaIcUSmuPgpDjXEY7UiOx5yDP8eE=
 github.com/pingcap/pd v1.1.0-beta.0.20200106144140-f5a7aa985497 h1:FzLErYtcXnSxtC469OuVDlgBbh0trJZzNxw0mNKzyls=
 github.com/pingcap/pd v1.1.0-beta.0.20200106144140-f5a7aa985497/go.mod h1:cfT/xu4Zz+Tkq95QrLgEBZ9ikRcgzy4alHqqoaTftqI=
 github.com/pingcap/sysutil v0.0.0-20191216090214-5f9620d22b3b h1:EEyo/SCRswLGuSk+7SB86Ak1p8bS6HL1Mi4Dhyuv6zg=
 github.com/pingcap/sysutil v0.0.0-20191216090214-5f9620d22b3b/go.mod h1:EB/852NMQ+aRKioCpToQ94Wl7fktV+FNnxf3CX/TTXI=
+github.com/pingcap/sysutil v0.0.0-20200206130906-2bfa6dc40bcd h1:k7CIHMFVKjHsda3PKkiN4zv++NEnexlUwiJEhryWpG0=
 github.com/pingcap/sysutil v0.0.0-20200206130906-2bfa6dc40bcd/go.mod h1:EB/852NMQ+aRKioCpToQ94Wl7fktV+FNnxf3CX/TTXI=
-github.com/pingcap/tidb v1.1.0-beta.0.20200110130413-8c3ee37c1938 h1:Jt9ENNiS1ZNC9jV2Pd3wdegXQYFq3U6z1xFlzZNMNC8=
-github.com/pingcap/tidb v1.1.0-beta.0.20200110130413-8c3ee37c1938/go.mod h1:DlMN+GGqC/WpREnzcH8xgxbXnntjybLhT84AbUSvMVM=
-github.com/pingcap/tidb v2.0.11+incompatible h1:Shz+ry1DzQNsPk1QAejnM+5tgjbwZuzPnIER5aCjQ6c=
+github.com/pingcap/tidb v1.1.0-beta.0.20200303031609-495f8b74382f h1:brOLFPS3T5b/RQAL8V/YtYvHXWVybfPme7sVdbLVfpU=
+github.com/pingcap/tidb v1.1.0-beta.0.20200303031609-495f8b74382f/go.mod h1:untj2MAKBepgebXTYWRsEW54UvngfHxn2zUy6gp8ITo=
 github.com/pingcap/tidb-tools v3.0.6-0.20191106033616-90632dda3863+incompatible/go.mod h1:XGdcy9+yqlDSEMTpOXnwf3hiTeqrV6MN/u1se9N8yIM=
 github.com/pingcap/tidb-tools v4.0.0-beta+incompatible h1:+XJdcVLCM8GDgXiMS6lFV59N3XPVOqtNHeWNLVrb2pg=
 github.com/pingcap/tidb-tools v4.0.0-beta+incompatible/go.mod h1:XGdcy9+yqlDSEMTpOXnwf3hiTeqrV6MN/u1se9N8yIM=
 github.com/pingcap/tipb v0.0.0-20190428032612-535e1abaa330/go.mod h1:RtkHW8WbcNxj8lsbzjaILci01CtYnYbIkQhjyZWrWVI=
-github.com/pingcap/tipb v0.0.0-20191227083941-3996eff010dc h1:IOKsFObJ4GZwAgyuhdJKg3oKCzWcoBFfHhpq2TOn5H0=
-github.com/pingcap/tipb v0.0.0-20191227083941-3996eff010dc/go.mod h1:RtkHW8WbcNxj8lsbzjaILci01CtYnYbIkQhjyZWrWVI=
-github.com/pingcap/tipb v0.0.0-20200201101609-1a2e9c441455 h1:Jh9k3RIOTJ/YvODLg2zcCmGaQg1wEt2iFh1vYSEZW5Q=
-github.com/pingcap/tipb v0.0.0-20200201101609-1a2e9c441455/go.mod h1:RtkHW8WbcNxj8lsbzjaILci01CtYnYbIkQhjyZWrWVI=
 github.com/pingcap/tipb v0.0.0-20200212061130-c4d518eb1d60 h1:aJPXrT1u4VfUSGFA2oQVwl4pOXzqe+YI6wed01cjDH4=
 github.com/pingcap/tipb v0.0.0-20200212061130-c4d518eb1d60/go.mod h1:RtkHW8WbcNxj8lsbzjaILci01CtYnYbIkQhjyZWrWVI=
 github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
@@ -282,23 +258,19 @@ github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
 github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
 github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
 github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
 github.com/prometheus/client_golang v1.4.0 h1:YVIb/fVcOTMSqtqZWSKnHpSLBxu8DKgxq8z6RuBZwqI=
 github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=
-github.com/prometheus/client_model v0.0.0-20170216185247-6f3806018612/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
 github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
 github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 h1:S/YWwWx/RA8rT8tKFRuGUZhuA90OyIBpPCXkcbwU8DE=
 github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=
 github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-github.com/prometheus/common v0.0.0-20180518154759-7600349dcfe1/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
 github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
 github.com/prometheus/common v0.9.1 h1:KOMtN28tlbam3/7ZKEYKHhKoJZYYj3gMH4uc62x7X7U=
 github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=
-github.com/prometheus/procfs v0.0.0-20180612222113-7d6f385de8be/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
 github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
 github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
 github.com/prometheus/procfs v0.0.8 h1:+fpWZdT24pJBiqJdAwYBjPSk+5YmQzYNPYzQsdzLkt8=
@@ -321,7 +293,6 @@ github.com/shurcooL/httpgzip v0.0.0-20190720172056-320755c1c1b0 h1:mj/nMDAwTBiaC
 github.com/shurcooL/httpgzip v0.0.0-20190720172056-320755c1c1b0/go.mod h1:919LwcH0M7/W4fcZ0/jy0qGght1GIhqyS/EgWGH2j5Q=
 github.com/shurcooL/vfsgen v0.0.0-20181020040650-a97a25d856ca h1:3fECS8atRjByijiI8yYiuwLwQ2ZxXobW7ua/8GRB3pI=
 github.com/shurcooL/vfsgen v0.0.0-20181020040650-a97a25d856ca/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw=
-github.com/sirupsen/logrus v1.0.5/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc=
 github.com/sirupsen/logrus v1.2.0 h1:juTguoYk5qI21pwyTXY3B3Y5cOTH3ZUyZCg1v/mihuo=
 github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
 github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4=
@@ -353,10 +324,6 @@ github.com/uber/jaeger-client-go v2.15.0+incompatible h1:NP3qsSqNxh8VYr956ur1N/1
 github.com/uber/jaeger-client-go v2.15.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk=
 github.com/uber/jaeger-lib v1.5.0 h1:OHbgr8l656Ub3Fw5k9SWnBfIEwvoHQ+W2y+Aa9D1Uyo=
 github.com/uber/jaeger-lib v1.5.0/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U=
-github.com/ugorji/go v1.1.2 h1:JON3E2/GPW2iDNGoSAusl1KDf5TRQ8k8q7Tp097pZGs=
-github.com/ugorji/go v1.1.2/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ=
-github.com/ugorji/go/codec v0.0.0-20190204201341-e444a5086c43 h1:BasDe+IErOQKrMVXab7UayvSlIpiyGwRvuX3EKYY7UA=
-github.com/ugorji/go/codec v0.0.0-20190204201341-e444a5086c43/go.mod h1:iT03XoTwV7xq/+UGwKO3UbC1nNNlopQiY61beSdrtOA=
 github.com/unrolled/render v0.0.0-20171102162132-65450fb6b2d3/go.mod h1:tu82oB5W2ykJRVioYsB+IQKcft7ryBr7w12qMBUPyXg=
 github.com/unrolled/render v0.0.0-20180914162206-b9786414de4d h1:ggUgChAeyge4NZ4QUw6lhHsVymzwSDJOZcE0s2X8S20=
 github.com/unrolled/render v0.0.0-20180914162206-b9786414de4d/go.mod h1:tu82oB5W2ykJRVioYsB+IQKcft7ryBr7w12qMBUPyXg=
@@ -366,11 +333,8 @@ github.com/urfave/negroni v0.3.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKn
 github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8=
 github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
 github.com/yookoala/realpath v1.0.0/go.mod h1:gJJMA9wuX7AcqLy1+ffPatSCySA1FQ2S8Ya9AIoYBpE=
-go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
 go.etcd.io/bbolt v1.3.3 h1:MUGmc65QhB3pIlaQ5bB4LwqSj6GIonVJXpZiaKNyaKk=
 go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
-go.etcd.io/etcd v0.0.0-20190320044326-77d4b742cdbf h1:rmttwKPEgG/l4UscTDYtaJgeUsedKPKSyFfNQLI6q+I=
-go.etcd.io/etcd v0.0.0-20190320044326-77d4b742cdbf/go.mod h1:KSGwdbiFchh5KIC9My2+ZVl5/3ANcwohw50dpPwa2cw=
 go.etcd.io/etcd v0.5.0-alpha.5.0.20191023171146-3cf2f69b5738 h1:lWF4f9Nypl1ZqSb4gLeh/DGvBYVaUYHuiB93teOmwgc=
 go.etcd.io/etcd v0.5.0-alpha.5.0.20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg=
 go.uber.org/atomic v1.3.2 h1:2Oa65PReHzfn29GpvgsYwloV9AVFHPDk8tYxt2c2tr4=
@@ -394,13 +358,10 @@ go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
 go.uber.org/zap v1.12.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
 go.uber.org/zap v1.13.0 h1:nR6NoDBgAf67s68NhaXbsojM+2gxp3S1hWkHDl27pVU=
 go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
-golang.org/x/crypto v0.0.0-20180608092829-8ac0e0d97ce4/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20190909091759-094676da4a83 h1:mgAKeshyNqWKdENOnQsg+8dRTwZFIwFaO3HNl52sweA=
-golang.org/x/crypto v0.0.0-20190909091759-094676da4a83/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413 h1:ULYEB3JvPRE/IfO+9uO7vKV/xzVTO7XPAwm8xbf4w2g=
 golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
@@ -410,10 +371,10 @@ golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvx
 golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
 golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs=
 golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f h1:J5lckAjkw6qYlOZNj90mLYNTEKDvWeuc1yieZ8qUzUE=
-golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
+golang.org/x/lint v0.0.0-20200130185559-910be7a94367 h1:0IiAsCRByjO2QjX7ZPkw5oU9x+n1YqRL802rjC0c3Aw=
 golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
 golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
+golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee h1:WG0RUwxtNT4qqaXX3DPA8zHFNm/D9xaBpxzHt1WcA/E=
 golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -428,8 +389,6 @@ golang.org/x/net v0.0.0-20190613194153-d28f0bde5980 h1:dfGZHvZk057jK2MCeWus/TowK
 golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20190909003024-a7b16738d86b h1:XfVGCX+0T4WOStkaOsJRllbsiImhB2jgVBGc9L0lPGc=
-golang.org/x/net v0.0.0-20190909003024-a7b16738d86b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20191002035440-2ec189313ef0 h1:2mqDk8w/o6UmeUCu5Qiq2y7iMf6anbx+YA8d1JFoFrs=
 golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@@ -448,7 +407,6 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h
 golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190909082730-f460065e899a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200122134326-e047566fdf82 h1:ywK/j/KkyTHcdyYSZNXGjMwgmDSfjglYZ3vStQ/gSCU=
 golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -475,12 +433,10 @@ golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtn
 golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20191107010934-f79515f33823 h1:akkRBeitX2EZP59KdtKw310CI4WGPCNPyrLbE7WZA8Y=
 golang.org/x/tools v0.0.0-20191107010934-f79515f33823/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4 h1:Toz2IK7k8rbltAXwNAxKcn9OzqyNfMUhUNjz3sL0NMk=
-golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200206050830-dd0d5d485177 h1:E2vxBajJgSA3TcJhDGTh/kP3VnsvXKl9jSijv+h7svQ=
-golang.org/x/tools v0.0.0-20200206050830-dd0d5d485177/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200216192241-b320d3a0f5a2 h1:0sfSpGSa544Fwnbot3Oxq/U6SXqjty6Jy/3wRhVS7ig=
+golang.org/x/tools v0.0.0-20200216192241-b320d3a0f5a2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
@@ -488,23 +444,18 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T
 google.golang.org/appengine v1.1.0 h1:igQkv0AAhEIvTEpD5LIpAfav2eeVO9HBTjvKHVJPRSs=
 google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
 google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-google.golang.org/genproto v0.0.0-20180608181217-32ee49c4dd80/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
 google.golang.org/genproto v0.0.0-20181004005441-af9cb2a35e7f/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
 google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
-google.golang.org/genproto v0.0.0-20190905072037-92dd089d5514 h1:oFSK4421fpCKRrpzIpybyBVWyht05NegY9+L/3TLAZs=
-google.golang.org/genproto v0.0.0-20190905072037-92dd089d5514/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
 google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c h1:hrpEMCZ2O7DR5gC1n2AJGVhrwiEjOi35+jxtIuZpTMo=
 google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
 google.golang.org/grpc v0.0.0-20180607172857-7a6a684ca69e/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
-google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
 google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
 google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
 google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
 google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA=
 google.golang.org/grpc v1.25.1 h1:wdKvqQk7IttEw92GoRyKG2IDrUIpgpj6H6m81yfeMW0=
 google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
-gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U=
 gopkg.in/alecthomas/gometalinter.v2 v2.0.12/go.mod h1:NDRytsqEZyolNuAgTzJkZMkSQM7FIKyzVzGhjB/qfYo=
 gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
 gopkg.in/alecthomas/kingpin.v3-unstable v3.0.0-20180810215634-df19058c872c/go.mod h1:3HH7i1SgMqlzxCcBmUHW657sD4Kvv9sC3HpL3YukzwA=
@@ -517,7 +468,6 @@ gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qS
 gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
 gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
 gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
-gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo=
 gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=
 gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
 gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
@@ -535,6 +485,8 @@ honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWh
 honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM=
 honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
+honnef.co/go/tools v0.0.1-2020.1.3 h1:sXmLre5bzIR6ypkjXCDI3jHPssRhc8KD/Ome589sc3U=
+honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
 modernc.org/mathutil v1.0.0 h1:93vKjrJopTPrtTNpZ8XIovER7iCIH1QU7wNbOQXC60I=
 modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k=
 rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
diff --git a/lightning/backend/session.go b/lightning/backend/session.go
index 5e65bd7f5..e7c739f08 100644
--- a/lightning/backend/session.go
+++ b/lightning/backend/session.go
@@ -117,10 +117,6 @@ func newSession(options *SessionOptions) *session {
 	}
 	s.vars.GetWriteStmtBufs().BufStore = &kv.BufferStore{MemBuffer: &s.txn}
 
-	// FIXME: potential further improvements:
-	//  - (*TransactionContext).UpdateDeltaForTable takes 14% of Encode() time.
-	//    But we cannot make `vars.TxnCtx` into nil nor make it no-op.
-
 	return s
 }
 
diff --git a/lightning/mydump/csv_parser.go b/lightning/mydump/csv_parser.go
index 4cebab1b0..6aaccde2e 100644
--- a/lightning/mydump/csv_parser.go
+++ b/lightning/mydump/csv_parser.go
@@ -347,7 +347,7 @@ func (parser *CSVParser) ReadRow() error {
 		if isNull {
 			datum.SetNull()
 		} else {
-			datum.SetString(unescaped)
+			datum.SetString(unescaped, "utf8mb4_bin")
 		}
 		row.Row = append(row.Row, datum)
 	}
diff --git a/lightning/mydump/parser.go b/lightning/mydump/parser.go
index 7749245bd..ee2c29a7c 100644
--- a/lightning/mydump/parser.go
+++ b/lightning/mydump/parser.go
@@ -472,7 +472,7 @@ func (parser *ChunkParser) ReadRow() error {
 				// can't handle integers more than 64 bits anyway)
 				fallthrough
 			case tokUnquoted, tokSingleQuoted, tokDoubleQuoted:
-				value.SetString(parser.unescapeString(string(content)))
+				value.SetString(parser.unescapeString(string(content)), "utf8mb4_bin")
 			case tokHexString:
 				hexLit, err := types.ParseHexStr(string(content))
 				if err != nil {

From aa83ba885ef47e44bbc2635f42f74b26f87fda4a Mon Sep 17 00:00:00 2001
From: Jiahao Huang <july2993@gmail.com>
Date: Mon, 16 Mar 2020 21:36:35 +0800
Subject: [PATCH 29/30] Address comment

---
 cmd/tidb-lightning/main.go     |  2 +-
 lightning/backend/importer.go  |  4 ++--
 lightning/mydump/csv_parser.go | 13 +++++++++----
 lightning/restore/restore.go   |  2 +-
 4 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/cmd/tidb-lightning/main.go b/cmd/tidb-lightning/main.go
index 22ba81e21..778008535 100644
--- a/cmd/tidb-lightning/main.go
+++ b/cmd/tidb-lightning/main.go
@@ -57,7 +57,7 @@ func main() {
 	gogc := os.Getenv("GOGC")
 	if gogc == "" {
 		old := debug.SetGCPercent(500)
-		log.L().Info("set gc percentage", zap.Int("old", old), zap.Int("new", 500))
+		log.L().Debug("set gc percentage", zap.Int("old", old), zap.Int("new", 500))
 	}
 
 	err := app.GoServe()
diff --git a/lightning/backend/importer.go b/lightning/backend/importer.go
index f0e009d0f..94bb35064 100644
--- a/lightning/backend/importer.go
+++ b/lightning/backend/importer.go
@@ -210,8 +210,8 @@ func (importer *importer) WriteRows(
 	}
 
 	err = wstream.Send(req)
-	for i := 0; i < len(mutations); i++ {
-		importer.mutationPool.Put(mutations[i])
+	for _, mutation := range mutations {
+		importer.mutationPool.Put(mutation)
 	}
 
 	if err != nil {
diff --git a/lightning/mydump/csv_parser.go b/lightning/mydump/csv_parser.go
index 6aaccde2e..e1eb69b7f 100644
--- a/lightning/mydump/csv_parser.go
+++ b/lightning/mydump/csv_parser.go
@@ -165,7 +165,7 @@ func (parser *CSVParser) readUntil(chars string) ([]byte, byte, error) {
 	}
 }
 
-func (parser *CSVParser) readRecord() ([]string, error) {
+func (parser *CSVParser) readRecord(dst []string) ([]string, error) {
 	parser.recordBuffer = parser.recordBuffer[:0]
 	parser.fieldIndexes = parser.fieldIndexes[:0]
 
@@ -216,7 +216,11 @@ outside:
 	// Create a single string and create slices out of it.
 	// This pins the memory of the fields together, but allocates once.
 	str := string(parser.recordBuffer) // Convert to string once to batch allocations
-	dst := make([]string, len(parser.fieldIndexes))
+	dst = dst[:0]
+	if cap(dst) < len(parser.fieldIndexes) {
+		dst = make([]string, len(parser.fieldIndexes))
+	}
+	dst = dst[:len(parser.fieldIndexes)]
 	var preIdx int
 	for i, idx := range parser.fieldIndexes {
 		dst[i] = str[preIdx:idx]
@@ -317,7 +321,7 @@ func (parser *CSVParser) ReadRow() error {
 
 	// skip the header first
 	if parser.pos == 0 && parser.cfg.Header {
-		columns, err := parser.readRecord()
+		columns, err := parser.readRecord(nil)
 		if err != nil {
 			return errors.Trace(err)
 		}
@@ -328,10 +332,11 @@ func (parser *CSVParser) ReadRow() error {
 		}
 	}
 
-	records, err := parser.readRecord()
+	records, err := parser.readRecord(parser.lastRecord)
 	if err != nil {
 		return errors.Trace(err)
 	}
+	parser.lastRecord = records
 	// remove trailing empty values
 	if parser.cfg.TrimLastSep {
 		var i int
diff --git a/lightning/restore/restore.go b/lightning/restore/restore.go
index 82b4b4fe0..3b6cd3d86 100644
--- a/lightning/restore/restore.go
+++ b/lightning/restore/restore.go
@@ -948,7 +948,7 @@ func (t *TableRestore) restoreEngine(
 	totalSQLSize := int64(0)
 	for _, chunk := range cp.Chunks {
 		totalKVSize += chunk.Checksum.SumSize()
-		totalSQLSize += chunk.Chunk.EndOffset // want EndOffset - Offset ?
+		totalSQLSize += chunk.Chunk.EndOffset - chunk.Chunk.Offset
 	}
 
 	err = chunkErr.Get()

From 430f66a54c796071bb2491a440e47bd34554c2af Mon Sep 17 00:00:00 2001
From: Jiahao Huang <july2993@gmail.com>
Date: Mon, 16 Mar 2020 21:59:00 +0800
Subject: [PATCH 30/30] Remain append

---
 lightning/backend/session.go | 5 +----
 1 file changed, 1 insertion(+), 4 deletions(-)

diff --git a/lightning/backend/session.go b/lightning/backend/session.go
index e7c739f08..8c68ff2ac 100644
--- a/lightning/backend/session.go
+++ b/lightning/backend/session.go
@@ -60,12 +60,9 @@ func (t *transaction) Iter(k kv.Key, upperBound kv.Key) (kv.Iterator, error) {
 
 // Set implements the kv.Mutator interface
 func (t *transaction) Set(k kv.Key, v []byte) error {
-	val := make([]byte, len(v))
-	copy(val, v)
-
 	t.kvPairs = append(t.kvPairs, common.KvPair{
 		Key: k.Clone(),
-		Val: val,
+		Val: append([]byte{}, v...),
 	})
 	return nil
 }