From 7bfe1bd2d06cf6adb4a5d3814f063e7e48c082db Mon Sep 17 00:00:00 2001 From: mattdowle Date: Thu, 25 Apr 2019 12:32:06 -0700 Subject: [PATCH 1/2] fread quote='' when last line too short and fill=TRUE --- NEWS.md | 2 ++ inst/tests/noquote.csv.gz | Bin 0 -> 32255 bytes inst/tests/tests.Rraw | 10 ++++++++++ src/fread.c | 29 ++++++++++++++++------------- 4 files changed, 28 insertions(+), 13 deletions(-) create mode 100644 inst/tests/noquote.csv.gz diff --git a/NEWS.md b/NEWS.md index b905811c7c..2b0e4d8a43 100644 --- a/NEWS.md +++ b/NEWS.md @@ -56,6 +56,8 @@ 4. `fwrite()` could crash when writing very long strings such as 30 million characters, [#2974](https://github.com/Rdatatable/data.table/issues/2974), and could be unstable in memory constrained environments, [#2612](https://github.com/Rdatatable/data.table/issues/2612). Thanks to @logworthy and @zachokeeffe for reporting and Philippe Chataignon for fixing in PR [#3288](https://github.com/Rdatatable/data.table/pull/3288). +5. `fread()` could crash if `quote=""` (i.e. ignore quotes), the last line is too short, and `fill=TRUE`, [#PR](). Thanks to Jiucang Hao for the report. + #### NOTES 1. `rbindlist`'s `use.names="check"` now emits its message for automatic column names (`"V[0-9]+"`) too, [#3484](https://github.com/Rdatatable/data.table/pull/3484). See news item 5 of v1.12.2 below. diff --git a/inst/tests/noquote.csv.gz b/inst/tests/noquote.csv.gz new file mode 100644 index 0000000000000000000000000000000000000000..f65f56dbae4bf4bdce1ce94eae5fb16db01313c5 GIT binary patch literal 32255 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 = ch; @@ -562,7 +562,7 @@ static void Field(FieldParseContext *ctx) } target->len = (int32_t)(ch - fieldStart); target->off = (int32_t)(fieldStart - ctx->anchor); - if (*ch==quote) { + if (*ch==quote) { // quote=='\0' (user set quote="") would have returned earlier above in the same branch as quoteRule 3 ch++; skip_white(&ch); *(ctx->ch) = ch; @@ -798,7 +798,7 @@ static void parse_double_extended(FieldParseContext *ctx) double *target = (double*) ctx->targets[sizeof(double)]; bool neg, quoted; init(); - ch += (quoted = (*ch=='"')); + ch += (quoted = (*ch==quote && quote)); ch += (neg = (*ch=='-')) + (*ch=='+'); if (ch[0]=='n' && ch[1]=='a' && ch[2]=='n' && (ch += 3)) goto return_nan; @@ -843,7 +843,7 @@ static void parse_double_extended(FieldParseContext *ctx) return_na: *target = NA_FLOAT64; ok: - if (quoted && *ch!='"') { + if (quoted && *ch!=quote) { *target = NA_FLOAT64; } else { *(ctx->ch) = ch + quoted; @@ -1048,7 +1048,7 @@ static int detect_types( const char **pch, int8_t type[], int ncol, bool *bumped // thread at headPos which has full lineage to sof may bump the quoteRule. break; // caller will detect this line hasn't finished properly } - if (*ch==quote) { + if (*ch==quote && quote) { // && quote to exclude quote='\0' (user passed quote="") ch++; fun[tmpType[field]](&fctx); if (*ch==quote) { @@ -1169,6 +1169,8 @@ int freadMain(freadMainArgs _args) { if (dec=='\0') STOP("dec='' not allowed. Should be '.' or ','"); if (args.sep == dec) STOP("sep == dec ('%c') is not allowed", dec); if (quote == dec) STOP("quote == dec ('%c') is not allowed", dec); + // since quote=='\0' when user passed quote="", the logic in this file uses '*ch==quote && quote' otherwise + // the ending \0 at eof could be treated as a quote (test xxx) // File parsing context: pointer to the start of file, and to the end of // the file. The `sof` pointer may be shifted in order to skip over @@ -1459,7 +1461,7 @@ int freadMain(freadMainArgs _args) { int topSkip=0; // how many rows to auto-skip const char *topStart=NULL; - for (quoteRule=0; quoteRule<4; quoteRule++) { + for (quoteRule=quote?0:3; quoteRule<4; quoteRule++) { // quote rule in order of preference. // when top is tied the first wins, so do all seps for the first quoteRule, then all seps for the second quoteRule, etc for (int s=0; s1) continue; // turn off self-healing quote rules when filling + if (quoteRule>1 && quote) continue; // turn off self-healing quote rule when filling int firstRowNcol = countfields(&ch); int thisncol=0, maxncol=firstRowNcol, thisRow=0; while (ch1) { + if (quoteRule>1 && quote) { DTWARN("Found and resolved improper quoting in first %d rows. If the fields are not quoted (e.g. field separator does not appear within any field), try quote=\"\" to avoid this warning.", jumpLines); // TODO: include line number and text in warning. Could loop again with the standard quote rule to find the line that fails. } @@ -2172,10 +2174,10 @@ int freadMain(freadMainArgs _args) { tch = end_NA_string(tch); skip_white(&tch); if (!end_of_field(tch)) tch = afterSpace; // else it is the field_end, we're on closing sep|eol and we'll let processor write appropriate NA as if field was empty - if (*tch==quote) { quoted=true; tch++; } + if (*tch==quote && quote) { quoted=true; tch++; } } // else Field() handles NA inside it unlike other processors e.g. ,, is interpretted as "" or NA depending on option read inside Field() fun[abs(thisType)](&fctx); - if (quoted) { + if (quoted) { // quoted was only set to true with '&& quote' above (=> quote!='\0' now) if (*tch==quote) tch++; else goto typebump; } @@ -2362,6 +2364,7 @@ int freadMain(freadMainArgs _args) { for (int i=0; i Date: Thu, 25 Apr 2019 12:38:24 -0700 Subject: [PATCH 2/2] added PR number to news item link --- NEWS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NEWS.md b/NEWS.md index 2b0e4d8a43..67764c472a 100644 --- a/NEWS.md +++ b/NEWS.md @@ -56,7 +56,7 @@ 4. `fwrite()` could crash when writing very long strings such as 30 million characters, [#2974](https://github.com/Rdatatable/data.table/issues/2974), and could be unstable in memory constrained environments, [#2612](https://github.com/Rdatatable/data.table/issues/2612). Thanks to @logworthy and @zachokeeffe for reporting and Philippe Chataignon for fixing in PR [#3288](https://github.com/Rdatatable/data.table/pull/3288). -5. `fread()` could crash if `quote=""` (i.e. ignore quotes), the last line is too short, and `fill=TRUE`, [#PR](). Thanks to Jiucang Hao for the report. +5. `fread()` could crash if `quote=""` (i.e. ignore quotes), the last line is too short, and `fill=TRUE`, [#3524](https://github.com/Rdatatable/data.table/pull/3524). Thanks to Jiucang Hao for the report and reproducible example. #### NOTES