void sum_complex_clear(UDF_INIT *initid, char *is_null, char *error) {
// Reset accumulator to 0+0i
double *state = (double*)initid->ptr;
state[0] = 0.0; // real
state[1] = 0.0; // imaginary
}
void sum_complex_add(UDF_INIT *initid, UDF_ARGS *args,
char *is_null, char *error) {
if (args->args[0] == nullptr) return; // Skip NULL
double *state = (double*)initid->ptr;
double real = float8get((unsigned char*)args->args[0]);
double imag = float8get((unsigned char*)args->args[0] + 8);
state[0] += real;
state[1] += imag;
}
char *sum_complex(UDF_INIT *initid, UDF_ARGS *args, char *result,
unsigned long *length, char *is_null, char *error) {
double *state = (double*)initid->ptr;
float8store((unsigned char*)result, state[0]);
float8store((unsigned char*)result + 8, state[1]);
*length = 16;
return result;
}