bug-recutils
[Top][All Lists]
Advanced

[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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]