Fixed bug in single arity version of LAG.
authorJohn Darrington <john@darrington.wattle.id.au>
Fri, 29 Apr 2005 01:29:31 +0000 (01:29 +0000)
committerJohn Darrington <john@darrington.wattle.id.au>
Fri, 29 Apr 2005 01:29:31 +0000 (01:29 +0000)
src/ChangeLog
src/expressions/parse.c
src/vfm.c
tests/Makefile.am
tests/bugs/lag_crash.sh [new file with mode: 0755]

index 1a9d2659eb7057a9b9bc44925dbce8b188bdbb5d..9259c9f90b77d6038e77639b331793bb5f50c782 100644 (file)
@@ -1,3 +1,8 @@
+Fri Apr 29 09:28:00 WST 2005 John Darrington <john@darrington.wattle.id.au>
+
+       * expressions/parse.c: Added handler for OP_LAG_Vn and OP_LAG_Vs.  
+       Fixed bug [#12858] .
+
 Wed Apr 27 12:42:34 WST 2005 John Darrington <john@darrington.wattle.id.au>
 
        * loop.c recode.c repeat.c: Fixed a couple of instances of SHORT_NAME_LEN 
index ba790d08838a1cb30a3ac550f0926ee0983d5dbd..0abfbb8a50389a161a4449127981a9f687b269de 100644 (file)
@@ -1204,7 +1204,9 @@ parse_function (struct expression *e)
   n = expr_allocate_composite (e, f - operations, args, arg_cnt);
   n->composite.min_valid = min_valid != -1 ? min_valid : f->array_min_elems; 
 
-  if (n->type == OP_LAG_Vnn || n->type == OP_LAG_Vsn) 
+  if (n->type == OP_LAG_Vn || n->type == OP_LAG_Vs)
+      n_lag = 1;
+  else if (n->type == OP_LAG_Vnn || n->type == OP_LAG_Vsn)
     {
       int n_before;
       assert (n->composite.arg_cnt == 2);
index 5afa838ddbd913303db79580c1aeadf7c11a20cd..6944df2b7d530f287cc5278a3bc392ae47f4fc4f 100644 (file)
--- a/src/vfm.c
+++ b/src/vfm.c
@@ -584,7 +584,9 @@ const struct case_sink_class null_sink_class =
 struct ccase *
 lagged_case (int n_before)
 {
-  assert (n_before >= 1 && n_before <= n_lag);
+  assert (n_before >= 1 );
+  assert (n_before <= n_lag);
+
   if (n_before <= lag_count)
     {
       int index = lag_head - n_before;
index b14643e459796aaa69bd7f40fd422dbbc5b9df56..f2cabf49de6f3a3d7f5290268f102d383b48494c 100644 (file)
@@ -64,6 +64,7 @@ TESTS = \
        bugs/get-no-file.sh \
        bugs/html-frequency.sh \
        bugs/if_crash.sh \
+       bugs/lag_crash.sh \
        bugs/multipass.sh \
        bugs/random.sh \
        bugs/t-test-with-temp.sh \
diff --git a/tests/bugs/lag_crash.sh b/tests/bugs/lag_crash.sh
new file mode 100755 (executable)
index 0000000..72683b2
--- /dev/null
@@ -0,0 +1,71 @@
+#!/bin/sh
+
+# This program tests for a bug which crashed pspp when using LAG
+
+TEMPDIR=/tmp/pspp-tst-$$
+TESTFILE=$TEMPDIR/`basename $0`.sps
+
+here=`pwd`;
+
+# ensure that top_srcdir is absolute
+cd $top_srcdir; top_srcdir=`pwd`
+
+export STAT_CONFIG_PATH=$top_srcdir/config
+
+
+cleanup()
+{
+     rm -rf $TEMPDIR
+}
+
+
+fail()
+{
+    echo $activity
+    echo FAILED
+    cleanup;
+    exit 1;
+}
+
+
+no_result()
+{
+    echo $activity
+    echo NO RESULT;
+    cleanup;
+    exit 2;
+}
+
+pass()
+{
+    cleanup;
+    exit 0;
+}
+
+mkdir -p $TEMPDIR
+
+cd $TEMPDIR
+
+activity="create program"
+cat > $TESTFILE << EOF
+DATA LIST LIST /x.
+BEGIN DATA
+1 
+2 
+END DATA.
+
+DO IF (x <> LAG(x) ).
+       ECHO 'hello'.
+END IF.
+
+EXECUTE.
+EOF
+if [ $? -ne 0 ] ; then no_result ; fi
+
+
+activity="run_program"
+$SUPERVISOR $here/../src/pspp $TESTFILE > /dev/null
+if [ $? -ne 0 ] ; then fail ; fi
+
+
+pass;