]> granicus.if.org Git - jq/commitdiff
Fix a crash on group_by of empty list. Fixes #208.
authorStephen Dolan <mu@netsoc.tcd.ie>
Thu, 7 Nov 2013 12:18:48 +0000 (12:18 +0000)
committerStephen Dolan <mu@netsoc.tcd.ie>
Thu, 7 Nov 2013 12:18:48 +0000 (12:18 +0000)
jv_aux.c
tests/all.test

index b73c9057fba3b859e6309f4380d0e9a34a1f38c7..89f36e699850220964e7900b8d79ae89b15ae770 100644 (file)
--- a/jv_aux.c
+++ b/jv_aux.c
@@ -545,21 +545,23 @@ jv jv_group(jv objects, jv keys) {
   int n = jv_array_length(jv_copy(objects));
   struct sort_entry* entries = sort_items(objects, keys);
   jv ret = jv_array();
-  jv curr_key = entries[0].key;
-  jv group = jv_array_append(jv_array(), entries[0].object);
-  for (int i = 1; i < n; i++) {
-    if (jv_equal(jv_copy(curr_key), jv_copy(entries[i].key))) {
-      jv_free(entries[i].key);
-    } else {
-      jv_free(curr_key);
-      curr_key = entries[i].key;
-      ret = jv_array_append(ret, group);
-      group = jv_array();
+  if (n > 0) {
+    jv curr_key = entries[0].key;
+    jv group = jv_array_append(jv_array(), entries[0].object);
+    for (int i = 1; i < n; i++) {
+      if (jv_equal(jv_copy(curr_key), jv_copy(entries[i].key))) {
+        jv_free(entries[i].key);
+      } else {
+        jv_free(curr_key);
+        curr_key = entries[i].key;
+        ret = jv_array_append(ret, group);
+        group = jv_array();
+      }
+      group = jv_array_append(group, entries[i].object);
     }
-    group = jv_array_append(group, entries[i].object);
+    jv_free(curr_key);
+    ret = jv_array_append(ret, group);
   }
-  jv_free(curr_key);
-  ret = jv_array_append(ret, group);
   jv_mem_free(entries);
   return ret;
 }
index c16b7ebac91ba68f49ee54f18c49ee0240b637ab..aa02e90cff60824a5dc1b5745134d10d50625757 100644 (file)
@@ -610,6 +610,10 @@ unique
 [1,2,5,3,5,3,1,3]
 [1,2,3,5]
 
+unique
+[]
+[]
+
 [min, max, min_by(.[1]), max_by(.[1]), min_by(.[2]), max_by(.[2])]
 [[4,2,"a"],[3,1,"a"],[2,4,"a"],[1,3,"a"]]
 [[1,3,"a"],[4,2,"a"],[3,1,"a"],[2,4,"a"],[4,2,"a"],[1,3,"a"]]