diff --git a/br/pkg/lightning/mydump/csv_parser.go b/br/pkg/lightning/mydump/csv_parser.go index 96de51bd49c73..2d7ec3f5d9c88 100644 --- a/br/pkg/lightning/mydump/csv_parser.go +++ b/br/pkg/lightning/mydump/csv_parser.go @@ -447,9 +447,18 @@ outside: func (parser *CSVParser) readQuotedField() error { for { + prevPos := parser.pos content, terminator, err := parser.readUntil(&parser.quoteByteSet) - err = parser.replaceEOF(err, errUnterminatedQuotedField) if err != nil { + if errors.Cause(err) == io.EOF { + // return the position of quote to the caller. + // because we return an error here, the parser won't + // use the `pos` again, so it's safe to modify it here. + parser.pos = prevPos - 1 + // set buf to parser.buf in order to print err log + parser.buf = content + err = parser.replaceEOF(err, errUnterminatedQuotedField) + } return err } parser.recordBuffer = append(parser.recordBuffer, content...) diff --git a/br/tests/lightning_csv/errData/db-schema-create.sql b/br/tests/lightning_csv/errData/db-schema-create.sql new file mode 100755 index 0000000000000..6adfeca7f7dab --- /dev/null +++ b/br/tests/lightning_csv/errData/db-schema-create.sql @@ -0,0 +1 @@ +create database if not exists db; diff --git a/br/tests/lightning_csv/errData/db.test-schema.sql b/br/tests/lightning_csv/errData/db.test-schema.sql new file mode 100755 index 0000000000000..955632c7761b2 --- /dev/null +++ b/br/tests/lightning_csv/errData/db.test-schema.sql @@ -0,0 +1 @@ +create table test(a int primary key, b int, c int, d int); diff --git a/br/tests/lightning_csv/errData/db.test.1.csv b/br/tests/lightning_csv/errData/db.test.1.csv new file mode 100755 index 0000000000000..2e8450c25786e --- /dev/null +++ b/br/tests/lightning_csv/errData/db.test.1.csv @@ -0,0 +1,3 @@ +1,2,3,4 +2,10,4,5 +1111,",7,8 diff --git a/br/tests/lightning_csv/run.sh b/br/tests/lightning_csv/run.sh index 83c4917b4b76c..682bc55b08e26 100755 --- a/br/tests/lightning_csv/run.sh +++ b/br/tests/lightning_csv/run.sh @@ -41,3 +41,11 @@ for BACKEND in tidb local; do check_not_contains 'id:' done + +set +e +run_lightning --backend local -d "tests/$TEST_NAME/errData" --log-file "$TEST_DIR/lightning-err.log" 2>/dev/null +set -e +# err content presented +grep ",7,8" "$TEST_DIR/lightning-err.log" +# pos should not set to end +grep "[\"syntax error\"] [pos=22]" "$TEST_DIR/lightning-err.log" \ No newline at end of file