@@ -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