LIST: Fix crash when SPLIT FILE was used.
authorBen Pfaff <blp@cs.stanford.edu>
Sun, 10 Apr 2011 02:11:44 +0000 (19:11 -0700)
committerBen Pfaff <blp@cs.stanford.edu>
Sun, 10 Apr 2011 02:11:44 +0000 (19:11 -0700)
Thanks to John Darrington for reporting the problem and to Michel
Boaventura for reducing the problem to a simple test case.

src/language/data-io/list.q
tests/language/data-io/list.at

index 6bb2bed2938f74c3a39895e2e40e4e5083f1341b..ddc072a46b5ebaad10b5ed03dc6d0136d5c824f3 100644 (file)
@@ -130,13 +130,6 @@ cmd_list (struct lexer *lexer, struct dataset *ds)
       struct ccase *ccase;
       struct table *t;
 
-      group = casereader_project (group, &sc);
-      if (cmd.numbering == LST_NUMBERED)
-        group = casereader_create_arithmetic_sequence (group, 1, 1);
-      group = casereader_select (group, cmd.first - 1,
-                                 (cmd.last != LONG_MAX ? cmd.last
-                                  : CASENUMBER_MAX), cmd.step);
-
       ccase = casereader_peek (group, 0);
       if (ccase != NULL)
         {
@@ -144,6 +137,13 @@ cmd_list (struct lexer *lexer, struct dataset *ds)
           case_unref (ccase);
         }
 
+      group = casereader_project (group, &sc);
+      if (cmd.numbering == LST_NUMBERED)
+        group = casereader_create_arithmetic_sequence (group, 1, 1);
+      group = casereader_select (group, cmd.first - 1,
+                                 (cmd.last != LONG_MAX ? cmd.last
+                                  : CASENUMBER_MAX), cmd.step);
+
       if (cmd.numbering == LST_NUMBERED)
         {
           struct fmt_spec fmt;
index f8b3bb5c3bb6323eda932692a6a81aed6a68003c..4beeceed1f78779ef473c85202b5f62e44f7f32d 100644 (file)
@@ -84,6 +84,50 @@ Case Number,avar,bvar
 ])
 AT_CLEANUP
 
+# Checks for a crash when LIST did not include the variables from SPLIT
+# FILE in the same positions (bug #30684).
+AT_SETUP([LIST with split file])
+AT_DATA([data.txt], [dnl
+a 1
+a 2
+a 3
+b 1
+c 4
+c 5
+])
+AT_DATA([list.sps], [dnl
+DATA LIST LIST NOTABLE FILE='data.txt'/s (a1) n.
+SPLIT FILE BY s.
+LIST n.
+])
+AT_CHECK([pspp -o pspp.csv list.sps])
+AT_CHECK([cat pspp.csv], [0], [dnl
+Variable,Value,Label
+s,a,
+
+Table: Data List
+n
+1.00
+2.00
+3.00
+
+Variable,Value,Label
+s,b,
+
+Table: Data List
+n
+1.00
+
+Variable,Value,Label
+s,c,
+
+Table: Data List
+n
+4.00
+5.00
+])
+AT_CLEANUP
+
 AT_SETUP([LIST lots of variables])
 AT_DATA([data.txt], [dnl
 767532466348513789073483106409