This is an automated email from the ASF dual-hosted git repository.
thisisnic pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow.git
The following commit(s) were added to refs/heads/main by this push:
new 4095d92751 GH-46825: [R] Use smallest_decimal() from C++ instead of
working out which decimal type to instantiate in R (#47906)
4095d92751 is described below
commit 4095d927514b224a501be20172f9fe17b9d23aff
Author: Nic Crane <[email protected]>
AuthorDate: Tue Oct 28 19:23:51 2025 +0000
GH-46825: [R] Use smallest_decimal() from C++ instead of working out which
decimal type to instantiate in R (#47906)
### Rationale for this change
R code duplicated code from C++
### What changes are included in this PR?
Remove duplication
### Are these changes tested?
There were existing tests
### Are there any user-facing changes?
Nah
* GitHub Issue: #46825
Authored-by: Nic Crane <[email protected]>
Signed-off-by: Nic Crane <[email protected]>
---
r/R/arrowExports.R | 4 ++++
r/R/type.R | 11 +----------
r/src/arrowExports.cpp | 10 ++++++++++
r/src/datatype.cpp | 6 ++++++
4 files changed, 21 insertions(+), 10 deletions(-)
diff --git a/r/R/arrowExports.R b/r/R/arrowExports.R
index fafb5ccecd..a8387526b2 100644
--- a/r/R/arrowExports.R
+++ b/r/R/arrowExports.R
@@ -940,6 +940,10 @@ Decimal256Type__initialize <- function(precision, scale) {
.Call(`_arrow_Decimal256Type__initialize`, precision, scale)
}
+SmallestDecimal__initialize <- function(precision, scale) {
+ .Call(`_arrow_SmallestDecimal__initialize`, precision, scale)
+}
+
DayTimeInterval__initialize <- function() {
.Call(`_arrow_DayTimeInterval__initialize`)
}
diff --git a/r/R/type.R b/r/R/type.R
index ed8c2f2818..8cd2d324a7 100644
--- a/r/R/type.R
+++ b/r/R/type.R
@@ -604,16 +604,7 @@ timestamp <- function(unit = c("s", "ms", "us", "ns"),
timezone = "") {
#' @export
decimal <- function(precision, scale) {
args <- check_decimal_args(precision, scale)
-
- if (args$precision > 38) {
- decimal256(args$precision, args$scale)
- } else if (args$precision > 18) {
- decimal128(args$precision, args$scale)
- } else if (args$precision > 9) {
- decimal64(args$precision, args$scale)
- } else {
- decimal32(args$precision, args$scale)
- }
+ SmallestDecimal__initialize(args$precision, args$scale)
}
#' @rdname data-type
diff --git a/r/src/arrowExports.cpp b/r/src/arrowExports.cpp
index 4f4056b6b6..73bf81f83b 100644
--- a/r/src/arrowExports.cpp
+++ b/r/src/arrowExports.cpp
@@ -2588,6 +2588,15 @@ BEGIN_CPP11
END_CPP11
}
// datatype.cpp
+std::shared_ptr<arrow::DataType> SmallestDecimal__initialize(int32_t
precision, int32_t scale);
+extern "C" SEXP _arrow_SmallestDecimal__initialize(SEXP precision_sexp, SEXP
scale_sexp){
+BEGIN_CPP11
+ arrow::r::Input<int32_t>::type precision(precision_sexp);
+ arrow::r::Input<int32_t>::type scale(scale_sexp);
+ return cpp11::as_sexp(SmallestDecimal__initialize(precision, scale));
+END_CPP11
+}
+// datatype.cpp
std::shared_ptr<arrow::DataType> DayTimeInterval__initialize();
extern "C" SEXP _arrow_DayTimeInterval__initialize(){
BEGIN_CPP11
@@ -5933,6 +5942,7 @@ static const R_CallMethodDef CallEntries[] = {
{ "_arrow_Decimal64Type__initialize", (DL_FUNC)
&_arrow_Decimal64Type__initialize, 2},
{ "_arrow_Decimal128Type__initialize", (DL_FUNC)
&_arrow_Decimal128Type__initialize, 2},
{ "_arrow_Decimal256Type__initialize", (DL_FUNC)
&_arrow_Decimal256Type__initialize, 2},
+ { "_arrow_SmallestDecimal__initialize", (DL_FUNC)
&_arrow_SmallestDecimal__initialize, 2},
{ "_arrow_DayTimeInterval__initialize", (DL_FUNC)
&_arrow_DayTimeInterval__initialize, 0},
{ "_arrow_FixedSizeBinary__initialize", (DL_FUNC)
&_arrow_FixedSizeBinary__initialize, 1},
{ "_arrow_FixedSizeBinary__byte_width", (DL_FUNC)
&_arrow_FixedSizeBinary__byte_width, 1},
diff --git a/r/src/datatype.cpp b/r/src/datatype.cpp
index ea407fc777..3360159c58 100644
--- a/r/src/datatype.cpp
+++ b/r/src/datatype.cpp
@@ -213,6 +213,12 @@ std::shared_ptr<arrow::DataType>
Decimal256Type__initialize(int32_t precision,
return ValueOrStop(arrow::Decimal256Type::Make(precision, scale));
}
+// [[arrow::export]]
+std::shared_ptr<arrow::DataType> SmallestDecimal__initialize(int32_t precision,
+ int32_t scale) {
+ return arrow::smallest_decimal(precision, scale);
+}
+
// [[arrow::export]]
std::shared_ptr<arrow::DataType> DayTimeInterval__initialize() {
return arrow::day_time_interval();