[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 2/2] librec: Fix wrong results when aggregates are mixed with sel
From: |
Liliana Marie Prikler |
Subject: |
[PATCH 2/2] librec: Fix wrong results when aggregates are mixed with selections. |
Date: |
Wed, 2 Feb 2022 16:33:44 +0100 |
---
src/rec-db.c | 38 +++++++++++++++++++++++++++++++++++++-
1 file changed, 37 insertions(+), 1 deletion(-)
diff --git a/src/rec-db.c b/src/rec-db.c
index b303132..eb2845a 100644
--- a/src/rec-db.c
+++ b/src/rec-db.c
@@ -1083,7 +1083,43 @@ rec_db_query (rec_db_t db,
aggregates. This is peformed by invoking rec_db_process_fex
with a NULL record. */
- rec_record_t record = rec_db_process_fex (db, rset, NULL, fex);
+ rec_record_t record;
+ if (!sex && !index)
+ record = rec_db_process_fex (db, rset, NULL, fex);
+ else
+ {
+ /* The query contains a selection, which might not span the
+ entire rset. Hence shrink it. */
+
+ rec_rset_t selected = rec_rset_new ();
+ rec_mset_iterator_t iter = rec_mset_iterator (rec_rset_mset (rset));
+ size_t num_rec = -1;
+ rec_record_t sel;
+
+ while (sel = rec_db_next_selected_record (&iter,
+ &num_rec,
+ index,
+ sex,
+ fast_string,
+ flags & REC_F_ICASE))
+ {
+ rec_record_t dup_sel = rec_record_dup (sel);
+ if (!dup_sel)
+ return NULL;
+ rec_record_set_container (dup_sel, selected);
+ if (!rec_mset_append (rec_rset_mset (selected),
+ MSET_RECORD,
+ (void *)dup_sel,
+ MSET_RECORD))
+ {
+ return NULL;
+ }
+ }
+
+ record = rec_db_process_fex (db, selected, NULL, fex);
+ rec_rset_destroy (selected);
+ }
+
if (record)
{
rec_record_set_container (record, res);
--
2.34.0
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [PATCH 2/2] librec: Fix wrong results when aggregates are mixed with selections.,
Liliana Marie Prikler <=