From b50163ee70593d84b5402e049cfcf37b411e2318 Mon Sep 17 00:00:00 2001 From: arunsrinivasan Date: Mon, 16 Mar 2015 01:08:15 +0100 Subject: [PATCH] Closes #1082. Fixed segfault in assignment by reference. --- README.md | 2 ++ inst/tests/tests.Rraw | 7 +++++++ src/assign.c | 2 ++ 3 files changed, 11 insertions(+) diff --git a/README.md b/README.md index acc3affdb8..349e8cdc8d 100644 --- a/README.md +++ b/README.md @@ -169,6 +169,8 @@ 45. Fixed another segfault in `melt.data.table` issue that was caught due to issue in Windows. Closes [#1059](https://github.com/Rdatatable/data.table/issues/1059). Thanks again to @ChristK for the minimal report. + 46. `DT[rows, newcol := NULL]` resulted in a segfault on the next assignment by reference. Closes [#1082](https://github.com/Rdatatable/data.table/issues/1082). Thanks to @stevenbagley for the MRE. + #### NOTES 1. Clearer explanation of what `duplicated()` does (borrowed from base). Thanks to @matthieugomez for pointing out. Closes [#872](https://github.com/Rdatatable/data.table/issues/872). diff --git a/inst/tests/tests.Rraw b/inst/tests/tests.Rraw index 94964edb3c..07eab385f8 100644 --- a/inst/tests/tests.Rraw +++ b/inst/tests/tests.Rraw @@ -6196,6 +6196,13 @@ ans2 <- cbind(ans21, ans22[, -1L]) setkey(setnames(setDT(ans2), names(ans1)), x) test(1501.8, ans1, ans2) +# fix for #1082 +dt1 = data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6), v=1:9, key=c("x", "y")) +dt2 = copy(dt1) +test(1502.1, dt1["a", z := NULL], error="When deleting columns, i should not be provided") +# this shouldn't segfault on 'dt1[...]' +test(1502.2, dt1["a", z := 42L], dt2["a", z := 42L]) + ########################## diff --git a/src/assign.c b/src/assign.c index c44f8f1d9f..d39d4b2976 100644 --- a/src/assign.c +++ b/src/assign.c @@ -367,6 +367,8 @@ SEXP assign(SEXP dt, SEXP rows, SEXP cols, SEXP newcolnames, SEXP values, SEXP v if (newcolnum<0 || newcolnum>=length(newcolnames)) error("Internal logical error. length(newcolnames)=%d, length(names)=%d, coln=%d", length(newcolnames), length(names), coln); if (isNull(thisvalue)) { + // fix for #1082 + if (!isNull(rows)) error("When deleting columns, i should not be provided"); warning("Adding new column '%s' then assigning NULL (deleting it).",CHAR(STRING_ELT(newcolnames,newcolnum))); continue; }