You are viewing a plain text version of this content. The canonical link for it is here.
Posted to github@arrow.apache.org by "js8544 (via GitHub)" <gi...@apache.org> on 2023/08/18 10:49:52 UTC
[GitHub] [arrow] js8544 opened a new pull request, #37243: GH-34909: [C++] Avoid mean overflow on large integer inputs
js8544 opened a new pull request, #37243:
URL: https://github.com/apache/arrow/pull/37243
<!--
Thanks for opening a pull request!
If this is your first pull request you can find detailed information on how
to contribute here:
* [New Contributor's Guide](https://arrow.apache.org/docs/dev/developers/guide/step_by_step/pr_lifecycle.html#reviews-and-merge-of-the-pull-request)
* [Contributing Overview](https://arrow.apache.org/docs/dev/developers/overview.html)
If this is not a [minor PR](https://github.com/apache/arrow/blob/main/CONTRIBUTING.md#Minor-Fixes). Could you open an issue for this pull request on GitHub? https://github.com/apache/arrow/issues/new/choose
Opening GitHub issues ahead of time contributes to the [Openness](http://theapacheway.com/open/#:~:text=Openness%20allows%20new%20users%20the,must%20happen%20in%20the%20open.) of the Apache Arrow project.
Then could you also rename the pull request title in the following format?
GH-${GITHUB_ISSUE_ID}: [${COMPONENT}] ${SUMMARY}
or
MINOR: [${COMPONENT}] ${SUMMARY}
In the case of PARQUET issues on JIRA the title also supports:
PARQUET-${JIRA_ISSUE_ID}: [${COMPONENT}] ${SUMMARY}
-->
### Rationale for this change
<!--
Why are you proposing this change? If this is already explained clearly in the issue then this section is not needed.
Explaining clearly why changes are proposed helps reviewers understand your changes and offer better suggestions for fixes.
-->
The `mean` aggregate function would overflow if the input array's sum is larger than int64_max.
### What changes are included in this PR?
<!--
There is no need to duplicate the description in the issue here but it is sometimes worth providing a summary of the individual changes in this PR.
-->
Store intermediate sum in double instead of int64, so that it won't overflow.
### Are these changes tested?
<!--
We typically require tests for all PRs in order to:
1. Prevent the code from being accidentally broken by subsequent changes
2. Serve as another way to document the expected behavior of the code
If tests are not included in your PR, please explain why (for example, are they covered by existing tests)?
-->
Yes.
### Are there any user-facing changes?
No.
<!--
If there are user-facing changes then we may require documentation to be updated before approving the PR.
-->
<!--
If there are any breaking changes to public APIs, please uncomment the line below and explain which changes are breaking.
-->
<!-- **This PR includes breaking changes to public APIs.** -->
<!--
Please uncomment the line below (and provide explanation) if the changes fix either (a) a security vulnerability, (b) a bug that caused incorrect or invalid data to be produced, or (c) a bug that causes a crash (even when the API contract is upheld). We use this to highlight fixes to issues that may affect users without their knowledge. For this reason, fixing bugs that cause errors don't count, since those are usually obvious.
-->
<!-- **This PR contains a "Critical Fix".** -->
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
[GitHub] [arrow] pitrou commented on pull request #37243: GH-34909: [C++] Avoid mean overflow on large integer inputs
Posted by "pitrou (via GitHub)" <gi...@apache.org>.
pitrou commented on PR #37243:
URL: https://github.com/apache/arrow/pull/37243#issuecomment-1699453409
Thank you @js8544 !
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
[GitHub] [arrow] conbench-apache-arrow[bot] commented on pull request #37243: GH-34909: [C++] Avoid mean overflow on large integer inputs
Posted by "conbench-apache-arrow[bot] (via GitHub)" <gi...@apache.org>.
conbench-apache-arrow[bot] commented on PR #37243:
URL: https://github.com/apache/arrow/pull/37243#issuecomment-1703053070
After merging your PR, Conbench analyzed the 6 benchmarking runs that have been run so far on merge-commit e0ee82cb8db2aa950119689f6ce3972ef4333aa9.
There were no benchmark performance regressions. 🎉
The [full Conbench report](https://github.com/apache/arrow/runs/16424697644) has more details. It also includes information about possible false positives for unstable benchmarks that are known to sometimes produce them.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
[GitHub] [arrow] js8544 commented on a diff in pull request #37243: GH-34909: [C++] Avoid mean overflow on large integer inputs
Posted by "js8544 (via GitHub)" <gi...@apache.org>.
js8544 commented on code in PR #37243:
URL: https://github.com/apache/arrow/pull/37243#discussion_r1310409338
##########
cpp/src/arrow/compute/kernels/aggregate_basic_internal.h:
##########
@@ -196,20 +203,32 @@ struct MeanImpl : public SumImpl<ArrowType, SimdLevel> {
}
return Status::OK();
}
+
+ Status Finalize(KernelContext*, Datum* out) override { return FinalizeImpl(out); }
+};
+
+template <typename ArrowType, SimdLevel::type SimdLevel>
+struct MeanImpl<ArrowType, SimdLevel,
+ std::enable_if_t<!is_decimal_type<ArrowType>::value>>
+ : public SumImpl<ArrowType, SimdLevel, DoubleType> {
Review Comment:
Done and rebased from main
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
[GitHub] [arrow] Light-City commented on pull request #37243: GH-34909: [C++] Avoid mean overflow on large integer inputs
Posted by "Light-City (via GitHub)" <gi...@apache.org>.
Light-City commented on PR #37243:
URL: https://github.com/apache/arrow/pull/37243#issuecomment-1691042055
> In the current implementation, the overflow problem is not considered
just like:
```
func = std::make_shared<ScalarAggregateFunction>("sum", Arity::Unary(), sum_doc,
&default_scalar_aggregate_options);
AddArrayScalarAggKernels(SumInit, {boolean()}, uint64(), func.get());
AddAggKernel(KernelSignature::Make({Type::DECIMAL128}, FirstType), SumInit, func.get(),
SimdLevel::NONE);
AddAggKernel(KernelSignature::Make({Type::DECIMAL256}, FirstType), SumInit, func.get(),
SimdLevel::NONE);
AddArrayScalarAggKernels(SumInit, SignedIntTypes(), int64(), func.get());
```
sum(int64)-> output also is int64(), will cause overflow.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
[GitHub] [arrow] Light-City commented on pull request #37243: GH-34909: [C++] Avoid mean overflow on large integer inputs
Posted by "Light-City (via GitHub)" <gi...@apache.org>.
Light-City commented on PR #37243:
URL: https://github.com/apache/arrow/pull/37243#issuecomment-1691039829
In the current implementation, the overflow problem is not considered
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
[GitHub] [arrow] js8544 commented on pull request #37243: GH-34909: [C++] Avoid mean overflow on large integer inputs
Posted by "js8544 (via GitHub)" <gi...@apache.org>.
js8544 commented on PR #37243:
URL: https://github.com/apache/arrow/pull/37243#issuecomment-1691057299
What you said is correct. However, this PR is intended to deal with the `mean` function, not `sum`. I'll add a `sum_checked` function after this PR is merged.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
[GitHub] [arrow] js8544 commented on pull request #37243: GH-34909: [C++] Avoid mean overflow on large integer inputs
Posted by "js8544 (via GitHub)" <gi...@apache.org>.
js8544 commented on PR #37243:
URL: https://github.com/apache/arrow/pull/37243#issuecomment-1697373475
@felipecrv @pitrou I think this PR is ready for review. Would you mind taking a look? Thanks!
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
[GitHub] [arrow] pitrou commented on a diff in pull request #37243: GH-34909: [C++] Avoid mean overflow on large integer inputs
Posted by "pitrou (via GitHub)" <gi...@apache.org>.
pitrou commented on code in PR #37243:
URL: https://github.com/apache/arrow/pull/37243#discussion_r1309896086
##########
cpp/src/arrow/compute/kernels/aggregate_basic_internal.h:
##########
@@ -196,20 +203,32 @@ struct MeanImpl : public SumImpl<ArrowType, SimdLevel> {
}
return Status::OK();
}
+
+ Status Finalize(KernelContext*, Datum* out) override { return FinalizeImpl(out); }
+};
+
+template <typename ArrowType, SimdLevel::type SimdLevel>
+struct MeanImpl<ArrowType, SimdLevel,
+ std::enable_if_t<!is_decimal_type<ArrowType>::value>>
+ : public SumImpl<ArrowType, SimdLevel, DoubleType> {
Review Comment:
Can you add a comment above explaining that you're overriding the sum result type and why?
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
[GitHub] [arrow] pitrou merged pull request #37243: GH-34909: [C++] Avoid mean overflow on large integer inputs
Posted by "pitrou (via GitHub)" <gi...@apache.org>.
pitrou merged PR #37243:
URL: https://github.com/apache/arrow/pull/37243
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org