diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index ba15a58..a027ec2 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -24,7 +24,7 @@ jobs: - name: install PostgreSQL run: | sudo apt update - sudo apt -y install postgresql-16 postgresql-client-16 postgresql-server-dev-16 libpq-dev + sudo apt -y install postgresql-16 postgresql-client-16 postgresql-server-dev-16 libpq-dev clang-19 - name: make run: make - name: install diff --git a/src/aod_sketch_c_adapter.cpp b/src/aod_sketch_c_adapter.cpp index 48fe9f2..e93b4be 100644 --- a/src/aod_sketch_c_adapter.cpp +++ b/src/aod_sketch_c_adapter.cpp @@ -157,6 +157,16 @@ char* aod_sketch_to_string(const void* sketchptr, bool print_entries) { pg_unreachable(); } +unsigned aod_sketch_get_num_values(const void* sketchptr) { + try { + uint8_t num_values = static_cast(sketchptr)->get_num_values(); + return num_values; + } catch (std::exception& e) { + pg_error(e.what()); + } + pg_unreachable(); +} + ptr_with_size aod_sketch_serialize(const void* sketchptr, unsigned header_size) { try { ptr_with_size p; diff --git a/src/aod_sketch_c_adapter.h b/src/aod_sketch_c_adapter.h index 7918c24..0f2032e 100644 --- a/src/aod_sketch_c_adapter.h +++ b/src/aod_sketch_c_adapter.h @@ -39,6 +39,7 @@ double update_aod_sketch_get_estimate(const void* sketchptr); double compact_aod_sketch_get_estimate(const void* sketchptr); void** aod_sketch_get_estimate_and_bounds(const void* sketchptr, unsigned num_std_devs); char* aod_sketch_to_string(const void* sketchptr, bool print_entries); +unsigned aod_sketch_get_num_values(const void* sketchptr); struct ptr_with_size aod_sketch_serialize(const void* sketchptr, unsigned header_size); void* aod_sketch_deserialize(const char* buffer, unsigned length); diff --git a/src/aod_sketch_pg_functions.c b/src/aod_sketch_pg_functions.c index bab1c0d..a98ca1d 100644 --- a/src/aod_sketch_pg_functions.c +++ b/src/aod_sketch_pg_functions.c @@ -189,6 +189,10 @@ Datum pg_aod_sketch_union_agg(PG_FUNCTION_ARGS) { sketch_bytes = PG_GETARG_BYTEA_P(1); sketchptr = aod_sketch_deserialize(VARDATA(sketch_bytes), VARSIZE(sketch_bytes) - VARHDRSZ); + if (stateptr->num_values != aod_sketch_get_num_values(sketchptr)) { + compact_aod_sketch_delete(sketchptr); + elog(ERROR, "pg_aod_sketch_union_agg expects the same num_values in sketches"); + } aod_union_update(stateptr->ptr, sketchptr); compact_aod_sketch_delete(sketchptr);