Skip to content

Commit f007e15

Browse files
Error for invalid input
1 parent 177202f commit f007e15

3 files changed

Lines changed: 14 additions & 9 deletions

File tree

NEWS.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
1. `as.integer64.integer64` is consistent with `as.integer.integer` in terms or returning a plain integer64 vector (i.e., stripped of attributes; #188). Thanks @hcirellu.
5252
1. `log(integer64(), base=integer64(1))` no longer warns, consistent with `log(integer(), base=integer())` (#93).
5353
1. `sortfin(integer64(), 1:10)` no longer segfaults (#164).
54-
1. `orderfin(as.integer64(10:1), 1:3, 8:11)` no longer segfaults (#166).
54+
1. `orderfin(as.integer64(10:1), 1:3, 8:11)` enforces that `table` be sorted by `order` instead of segfaulting (#166).
5555

5656
## NOTES
5757

src/sortuse64.c

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -274,8 +274,7 @@ SEXP r_ram_integer64_orderfin_asc(
274274

275275
for(i=1;i<nt;i++)
276276
if (table[index[i]-1] < table[index[i-1]-1]) {
277-
for(i=0; i<n; i++) ret[i] = FALSE;
278-
goto wrapup_no_index_increment;
277+
error("Invalid input -- 'table' is not sorted by 'order'");
279278
}
280279

281280
for(i=0;i<nt;i++)
@@ -324,7 +323,6 @@ SEXP r_ram_integer64_orderfin_asc(
324323
for(i=0;i<nt;i++)
325324
index[i]++;
326325

327-
wrapup_no_index_increment:
328326
R_Busy(0);
329327
if (method==0)
330328
error("unimplemented method");
@@ -361,8 +359,7 @@ SEXP r_ram_integer64_orderpos_asc(
361359

362360
for(i=1;i<nt;i++)
363361
if (table[index[i]-1] < table[index[i-1]-1]) {
364-
for(i=0; i<n; i++) ret[i] = nomatch;
365-
goto wrapup_no_index_increment;
362+
error("Invalid input -- 'table' is not sorted by 'order'");
366363
}
367364

368365
for(i=0;i<nt;i++)
@@ -412,7 +409,6 @@ SEXP r_ram_integer64_orderpos_asc(
412409
for(i=0;i<nt;i++)
413410
index[i]++;
414411

415-
wrapup_no_index_increment:
416412
R_Busy(0);
417413
if (method==0)
418414
error("unimplemented method");

tests/testthat/test-sortuse64.R

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,16 @@ with_parameters_test_that("orderfin and orderpos work", method=1:3, {
4343
expect_identical(orderfin(table, partial_order, x_search, method=method), partial_fin)
4444
expect_identical(orderpos(table, partial_order, x_search, method=method), partial_pos)
4545

46-
expect_identical(orderfin(as.integer64(10:1), 1:3, 8:11, method=method), rep(FALSE, 4L))
47-
expect_identical(orderpos(as.integer64(10:1), 1:3, 8:11, method=method), rep(NA_integer_, 4L))
46+
expect_error(
47+
orderfin(as.integer64(10:1), 1:3, 8:11, method=method),
48+
"'table' is not sorted by 'order'",
49+
fixed = TRUE
50+
)
51+
expect_error(
52+
orderpos(as.integer64(10:1), 1:3, 8:11, method=method),
53+
"'table' is not sorted by 'order'",
54+
fixed = TRUE
55+
)
4856
})
4957

5058
test_that("ordertab and orderdup work", {
@@ -56,3 +64,4 @@ test_that("ordertab and orderdup work", {
5664
expect_identical(orderdup(x, idx), rep(c(FALSE, TRUE), c(10L, 14L)))
5765
expect_identical(orderdup(x, idx, method=2L), rep(c(FALSE, TRUE), c(10L, 14L)))
5866
})
67+

0 commit comments

Comments
 (0)