Skip to content
This repository was archived by the owner on Sep 18, 2023. It is now read-only.

Commit 9c876c8

Browse files
committed
using from_chars instead of stoi/stod
Signed-off-by: Yuan Zhou <[email protected]>
1 parent 04fb798 commit 9c876c8

File tree

1 file changed

+15
-5
lines changed

1 file changed

+15
-5
lines changed

native-sql-engine/cpp/src/codegen/arrow_compute/ext/expression_codegen_visitor.cc

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -671,17 +671,27 @@ arrow::Status ExpressionCodegenVisitor::Visit(const gandiva::FunctionNode& node)
671671

672672
std::string func_str;
673673
if (func_name.compare("castINTOrNull") == 0) {
674-
func_str = " = std::stoi";
674+
// C++17 based from_chars
675+
// std::from_chars(str.data(), str.data() + str.size(), result);
676+
func_str = " = std::from_chars";
677+
prepare_ss << "int result = 0" << std::endl;
675678
} else if (func_name.compare("castBIGINTOrNull") == 0) {
676-
func_str = " = std::stol";
679+
// C++17 based from_chars
680+
// std::from_chars(str.data(), str.data() + str.size(), result);
681+
func_str = " = std::from_chars";
682+
prepare_ss << "long int result = 0" << std::endl;
677683
} else if (func_name.compare("castFLOAT4OrNull") == 0) {
678-
func_str = " = std::stof";
684+
func_str = " = ::arrow_vendored::fast_float::from_chars";
685+
prepare_ss << "float result = 0" << std::endl;
679686
} else {
680-
func_str = " = std::stod";
687+
func_str = " = ::arrow_vendored::fast_float::from_chars";
688+
prepare_ss << "double result = 0" << std::endl;
681689
}
682690
prepare_ss << "try {" << std::endl;
683691
prepare_ss << codes_str_ << func_str << "(" << child_visitor_list[0]->GetResult()
684-
<< ");" << std::endl;
692+
<< ".data(), " << child_visitor_list[0]->GetResult() << ".length(), "
693+
<< "&result);" << std::endl;
694+
prepare_ss << codes_str_ << " = result;" << std::endl;
685695
prepare_ss << "} catch (std::invalid_argument) {" << std::endl;
686696
prepare_ss << validity << " = false;" << std::endl;
687697
prepare_ss << "} catch (std::out_of_range) {" << std::endl;

0 commit comments

Comments
 (0)