@@ -88,106 +88,108 @@ const char* gdv_fn_regexp_extract_utf8_utf8_int32(int64_t ptr, int64_t holder_pt
8888
8989// Helper: arena allocation + null check
9090#define GDV_FN_CAST_VARLEN_ALLOC (SIZE ) \
91- char * ret = reinterpret_cast <char *>( \
92- gdv_fn_context_arena_malloc (context, SIZE )); \
93- if (ret == nullptr ) { \
94- gdv_fn_context_set_error_msg (context, " Could not allocate memory" ); \
95- *out_len = 0 ; \
96- return " " ; \
97- }
91+ char * ret = reinterpret_cast <char *>(gdv_fn_context_arena_malloc(context, SIZE )); \
92+ if (ret == nullptr ) { \
93+ gdv_fn_context_set_error_msg (context, " Could not allocate memory" ); \
94+ *out_len = 0 ; \
95+ return " " ; \
96+ }
9897
9998// Helper: function signature + len validation
100- #define GDV_FN_CAST_VARLEN_PREFIX (IN_TYPE, CAST_NAME ) \
101- GANDIVA_EXPORT \
102- const char * gdv_fn_cast##CAST_NAME ##_##IN_TYPE ##_int64( \
103- int64_t context, gdv_##IN_TYPE value, int64_t len, int32_t * out_len) { \
104- if (len < 0 ) { \
105- gdv_fn_context_set_error_msg (context, " Buffer length cannot be negative" ); \
106- *out_len = 0 ; \
107- return " " ; \
108- } \
109- if (len == 0 ) { \
110- *out_len = 0 ; \
111- return " " ; \
99+ #define GDV_FN_CAST_VARLEN_PREFIX (IN_TYPE, CAST_NAME ) \
100+ GANDIVA_EXPORT \
101+ const char * gdv_fn_cast##CAST_NAME ##_##IN_TYPE ##_int64( \
102+ int64_t context, gdv_##IN_TYPE value, int64_t len, int32_t * out_len) { \
103+ if (len < 0 ) { \
104+ gdv_fn_context_set_error_msg (context, " Buffer length cannot be negative" ); \
105+ *out_len = 0 ; \
106+ return " " ; \
107+ } \
108+ if (len == 0 ) { \
109+ *out_len = 0 ; \
110+ return " " ; \
112111 }
113112
114113// Macro for integer types (int32/int64). Uses optimized digit-pair conversion.
115114// Max string: 11 chars for int32 ("-2147483648"), 20 chars for int64.
116- #define GDV_FN_CAST_VARLEN_TYPE_FROM_INTEGER (IN_TYPE, CAST_NAME, ARROW_TYPE ) \
117- GDV_FN_CAST_VARLEN_PREFIX (IN_TYPE , CAST_NAME ) \
118- constexpr int32_t max_int_str_len = std::numeric_limits<gdv_##IN_TYPE >::digits10 + 2 ; \
119- char stack_buffer[max_int_str_len]; \
120- char * cursor = stack_buffer + max_int_str_len; \
121- /* Convert using optimized digit-pair method */ \
122- auto abs_value = value < 0 ? static_cast <std::make_unsigned_t <gdv_##IN_TYPE >>( \
123- ~static_cast <std::make_unsigned_t <gdv_##IN_TYPE >>(value) + 1 ) \
124- : static_cast <std::make_unsigned_t <gdv_##IN_TYPE >>(value); \
125- const char * digit_pairs = arrow::internal::detail::digit_pairs; \
126- while (abs_value >= 100 ) { \
127- auto idx = (abs_value % 100 ) * 2 ; \
128- abs_value /= 100 ; \
129- *--cursor = digit_pairs[idx + 1 ]; \
130- *--cursor = digit_pairs[idx]; \
131- } \
132- if (abs_value >= 10 ) { \
133- auto idx = abs_value * 2 ; \
134- *--cursor = digit_pairs[idx + 1 ]; \
135- *--cursor = digit_pairs[idx]; \
136- } else { \
137- *--cursor = ' 0' + static_cast <char >(abs_value); \
138- } \
139- if (value < 0 ) { \
140- *--cursor = ' -' ; \
141- } \
142- int32_t str_len = static_cast <int32_t >(stack_buffer + max_int_str_len - cursor); \
143- *out_len = static_cast <int32_t >(len < str_len ? len : str_len); \
144- GDV_FN_CAST_VARLEN_ALLOC (*out_len) \
145- memcpy (ret, cursor, *out_len); \
146- return ret; \
115+ #define GDV_FN_CAST_VARLEN_TYPE_FROM_INTEGER (IN_TYPE, CAST_NAME, ARROW_TYPE ) \
116+ GDV_FN_CAST_VARLEN_PREFIX (IN_TYPE , CAST_NAME ) \
117+ constexpr int32_t max_int_str_len = std::numeric_limits<gdv_##IN_TYPE >::digits10 + 2 ; \
118+ char stack_buffer[max_int_str_len]; \
119+ char * cursor = stack_buffer + max_int_str_len; \
120+ /* Convert using optimized digit-pair method */ \
121+ auto abs_value = \
122+ value < 0 ? static_cast <std::make_unsigned_t <gdv_##IN_TYPE >>( \
123+ ~static_cast <std::make_unsigned_t <gdv_##IN_TYPE >>(value) + 1 ) \
124+ : static_cast <std::make_unsigned_t <gdv_##IN_TYPE >>(value); \
125+ const char * digit_pairs = arrow::internal::detail::digit_pairs; \
126+ while (abs_value >= 100 ) { \
127+ auto idx = (abs_value % 100 ) * 2 ; \
128+ abs_value /= 100 ; \
129+ *--cursor = digit_pairs[idx + 1 ]; \
130+ *--cursor = digit_pairs[idx]; \
131+ } \
132+ if (abs_value >= 10 ) { \
133+ auto idx = abs_value * 2 ; \
134+ *--cursor = digit_pairs[idx + 1 ]; \
135+ *--cursor = digit_pairs[idx]; \
136+ } else { \
137+ *--cursor = ' 0' + static_cast <char >(abs_value); \
138+ } \
139+ if (value < 0 ) { \
140+ *--cursor = ' -' ; \
141+ } \
142+ int32_t str_len = static_cast <int32_t >(stack_buffer + max_int_str_len - cursor); \
143+ *out_len = static_cast <int32_t >(len < str_len ? len : str_len); \
144+ GDV_FN_CAST_VARLEN_ALLOC (*out_len) \
145+ memcpy (ret, cursor, *out_len); \
146+ return ret; \
147147 }
148148
149149// Helper: invoke formatter callback, copy result to ret, handle errors
150- #define GDV_FN_CAST_VARLEN_SUFFIX \
151- arrow::Status status = formatter(value, [&](std::string_view v) { \
152- int64_t size = static_cast <int64_t >(v.size ()); \
153- *out_len = static_cast <int32_t >(len < size ? len : size); \
154- memcpy (ret, v.data (), *out_len); \
155- return arrow::Status::OK (); \
156- }); \
157- if (!status.ok()) { \
158- std::string err = " Could not cast " + std::to_string (value) + " to string" ; \
159- gdv_fn_context_set_error_msg (context, err.c_str ()); \
160- *out_len = 0 ; \
161- return " " ; \
162- } \
163- return ret; \
150+ #define GDV_FN_CAST_VARLEN_SUFFIX \
151+ arrow::Status status = formatter(value, [&](std::string_view v) { \
152+ int64_t size = static_cast <int64_t >(v.size ()); \
153+ *out_len = static_cast <int32_t >(len < size ? len : size); \
154+ memcpy (ret, v.data (), *out_len); \
155+ return arrow::Status::OK (); \
156+ }); \
157+ if (!status.ok()) { \
158+ std::string err = " Could not cast " + std::to_string (value) + " to string" ; \
159+ gdv_fn_context_set_error_msg (context, err.c_str ()); \
160+ *out_len = 0 ; \
161+ return " " ; \
162+ } \
163+ return ret; \
164164 }
165165
166166// Macro for date types (date64). Output is always "YYYY-MM-DD" = 10 chars max.
167- #define GDV_FN_CAST_VARLEN_TYPE_FROM_TYPE (IN_TYPE, CAST_NAME, ARROW_TYPE ) \
168- GDV_FN_CAST_VARLEN_PREFIX (IN_TYPE , CAST_NAME ) \
169- constexpr int32_t max_date_str_len = 10; \
170- int32_t alloc_len = static_cast <int32_t >(len < max_date_str_len ? len : max_date_str_len); \
171- GDV_FN_CAST_VARLEN_ALLOC (alloc_len) \
172- arrow::internal::StringFormatter<arrow::ARROW_TYPE> formatter; \
173- GDV_FN_CAST_VARLEN_SUFFIX
167+ #define GDV_FN_CAST_VARLEN_TYPE_FROM_TYPE (IN_TYPE, CAST_NAME, ARROW_TYPE ) \
168+ GDV_FN_CAST_VARLEN_PREFIX (IN_TYPE , CAST_NAME ) \
169+ constexpr int32_t max_date_str_len = 10; \
170+ int32_t alloc_len = \
171+ static_cast <int32_t >(len < max_date_str_len ? len : max_date_str_len); \
172+ GDV_FN_CAST_VARLEN_ALLOC (alloc_len) \
173+ arrow::internal::StringFormatter<arrow::ARROW_TYPE> formatter; \
174+ GDV_FN_CAST_VARLEN_SUFFIX
174175
175176// Macro for float types (float32/float64). Uses Java-compatible formatting.
176177// Max string: "-1.2345678901234567E-308" = 24 chars.
177- #define GDV_FN_CAST_VARLEN_TYPE_FROM_REAL (IN_TYPE, CAST_NAME, ARROW_TYPE ) \
178- GDV_FN_CAST_VARLEN_PREFIX (IN_TYPE , CAST_NAME ) \
179- constexpr int32_t max_real_str_len = 24; \
180- int32_t alloc_len = static_cast <int32_t >(len < max_real_str_len ? len : max_real_str_len); \
181- GDV_FN_CAST_VARLEN_ALLOC (alloc_len) \
182- gandiva::GdvStringFormatter<arrow::ARROW_TYPE> formatter; \
183- GDV_FN_CAST_VARLEN_SUFFIX
178+ #define GDV_FN_CAST_VARLEN_TYPE_FROM_REAL (IN_TYPE, CAST_NAME, ARROW_TYPE ) \
179+ GDV_FN_CAST_VARLEN_PREFIX (IN_TYPE , CAST_NAME ) \
180+ constexpr int32_t max_real_str_len = 24; \
181+ int32_t alloc_len = \
182+ static_cast <int32_t >(len < max_real_str_len ? len : max_real_str_len); \
183+ GDV_FN_CAST_VARLEN_ALLOC (alloc_len) \
184+ gandiva::GdvStringFormatter<arrow::ARROW_TYPE> formatter; \
185+ GDV_FN_CAST_VARLEN_SUFFIX
184186
185187// Use optimized integer macro for int32/int64, generic macro for date64
186- #define CAST_VARLEN_TYPE_FROM_NUMERIC (VARLEN_TYPE ) \
187- GDV_FN_CAST_VARLEN_TYPE_FROM_INTEGER (int32, VARLEN_TYPE , Int32Type) \
188- GDV_FN_CAST_VARLEN_TYPE_FROM_INTEGER(int64, VARLEN_TYPE , Int64Type) \
189- GDV_FN_CAST_VARLEN_TYPE_FROM_TYPE(date64, VARLEN_TYPE , Date64Type) \
190- GDV_FN_CAST_VARLEN_TYPE_FROM_REAL(float32, VARLEN_TYPE , FloatType) \
188+ #define CAST_VARLEN_TYPE_FROM_NUMERIC (VARLEN_TYPE ) \
189+ GDV_FN_CAST_VARLEN_TYPE_FROM_INTEGER (int32, VARLEN_TYPE , Int32Type) \
190+ GDV_FN_CAST_VARLEN_TYPE_FROM_INTEGER(int64, VARLEN_TYPE , Int64Type) \
191+ GDV_FN_CAST_VARLEN_TYPE_FROM_TYPE(date64, VARLEN_TYPE , Date64Type) \
192+ GDV_FN_CAST_VARLEN_TYPE_FROM_REAL(float32, VARLEN_TYPE , FloatType) \
191193 GDV_FN_CAST_VARLEN_TYPE_FROM_REAL(float64, VARLEN_TYPE , DoubleType)
192194
193195CAST_VARLEN_TYPE_FROM_NUMERIC(VARCHAR )
0 commit comments