case-map: Remove buggy and unused case_map_clone().
[pspp] / src / data / dataset.c
index 7bc44c7c1017d257ea039143394282ce0a6973d3..063a4a425184ff1c6c35c06717c1552d83177e58 100644 (file)
@@ -354,6 +354,12 @@ dataset_delete_vars (struct dataset *ds, struct variable **vars, size_t n)
   assert (!proc_has_transformations (ds));
   assert (n < dict_get_n_vars (ds->dict));
 
+  caseinit_mark_for_init (ds->caseinit, ds->dict);
+  ds->source = caseinit_translate_casereader_to_init_vars (
+    ds->caseinit, dict_get_proto (ds->dict), ds->source);
+  caseinit_clear (ds->caseinit);
+  caseinit_mark_as_preinited (ds->caseinit, ds->dict);
+
   dict_delete_vars (ds->dict, vars, n);
   ds->source = case_map_create_input_translator (
     case_map_to_compact_dict (ds->dict, 0), ds->source);
@@ -448,6 +454,8 @@ proc_open_filtering (struct dataset *ds, bool filter)
   update_last_proc_invocation (ds);
 
   caseinit_mark_for_init (ds->caseinit, ds->dict);
+  ds->source = caseinit_translate_casereader_to_init_vars (
+    ds->caseinit, dict_get_proto (ds->dict), ds->source);
 
   /* Finish up the collection of transformations. */
   add_case_limit_trns (ds);
@@ -466,7 +474,8 @@ proc_open_filtering (struct dataset *ds, bool filter)
     {
       struct dictionary *pd = ds->permanent_dict;
       size_t compacted_n_values = dict_count_values (pd, DC_SCRATCH);
-      if (compacted_n_values < dict_get_next_value_idx (pd))
+      assert (dict_count_values (pd, 0) == dict_get_n_vars (pd));
+      if (compacted_n_values < dict_get_n_vars (pd))
         {
           struct caseproto *compacted_proto;
           compacted_proto = dict_get_compacted_proto (pd, DC_SCRATCH);
@@ -549,12 +558,12 @@ proc_casereader_read (struct casereader *reader UNUSED, void *ds_)
       if (c == NULL)
         return NULL;
       c = case_unshare_and_resize (c, dict_get_proto (ds->dict));
-      caseinit_init_vars (ds->caseinit, c);
+      caseinit_restore_left_vars (ds->caseinit, c);
 
       /* Execute permanent transformations.  */
       casenumber case_nr = ds->cases_written + 1;
       retval = trns_chain_execute (&ds->permanent_trns_chain, case_nr, &c);
-      caseinit_update_left_vars (ds->caseinit, c);
+      caseinit_save_left_vars (ds->caseinit, c);
       if (retval != TRNS_CONTINUE)
         continue;
 
@@ -1061,8 +1070,8 @@ measure_guesser_create__ (struct dictionary *dict)
       if (var_get_measure (var) != MEASURE_UNKNOWN)
         continue;
 
-      const struct fmt_spec *f = var_get_print_format (var);
-      enum measure m = var_default_measure_for_format (f->type);
+      struct fmt_spec f = var_get_print_format (var);
+      enum measure m = var_default_measure_for_format (f.type);
       if (m != MEASURE_UNKNOWN)
         {
           var_set_measure (var, m);