Fixed a bug reading empty strings from Postgres databases.
authorJohn Darrington <john@darrington.wattle.id.au>
Sun, 8 Mar 2009 01:47:48 +0000 (10:47 +0900)
committerJohn Darrington <john@darrington.wattle.id.au>
Sun, 8 Mar 2009 01:47:48 +0000 (10:47 +0900)
Fixed a bug in the Postgresql import feature, where a segfault
would occur when a reading a database which contained string
fields with only null, or zero length values.

Thanks to Joerg Schmengle for reporting this.

src/data/psql-reader.c
tests/command/get-data-psql.sh

index 72e14be4fce9542eb8f7c92b6a21563fc2842f0c..9df82b558c69252930fdf932e0ed5575edd3cfa8 100644 (file)
@@ -442,6 +442,10 @@ psql_open_reader (struct psql_read_info *info, struct dictionary **dict)
          break;
        }
 
+      if ( width == 0 && fmt_is_string (fmt.type))
+       fmt.w = width = MAX_SHORT_STRING;
+
+
       var = create_var (r, &fmt, width, PQfname (qres, i), i);
       if ( type == NUMERICOID && n_tuples > 0)
        {
index fa61d6d684db5ee9ea1060ad6f6dd69cc31f2666..1d8afadaa815f2ece469e7d488845844540f8951 100755 (executable)
@@ -427,4 +427,44 @@ diff -b  $TEMPDIR/pspp.list - << 'EOF'
 EOF
 if [ $? -ne 0 ] ; then fail ; fi
 
+
+
+# Check for a bug caused by having string variables in the database,
+# all of which are null.
+
+activity="populate database 4"
+$pgpath/psql  -h $TEMPDIR -p $port  $dbase > /dev/null << EOF
+
+-- a table which has a text field containing only null, or zero
+-- length entries.
+
+CREATE TABLE foo (int4  int4, text text);
+
+INSERT INTO foo VALUES ('12', '');
+
+INSERT INTO foo VALUES (null, '');
+
+EOF
+if [ $? -ne 0 ] ; then fail ; fi
+
+
+activity="create program 4"
+cat > $TESTFILE <<EOF
+GET DATA /TYPE=psql 
+       /CONNECT="host=$TEMPDIR port=$port dbname=$dbase"
+       /UNENCRYPTED
+       /SQL="select * from foo".
+
+DISPLAY DICTIONARY.
+
+LIST.
+EOF
+if [ $? -ne 0 ] ; then no_result ; fi
+
+
+activity="run program 4"
+$SUPERVISOR $PSPP --testing-mode -o raw-ascii $TESTFILE
+if [ $? -ne 0 ] ; then no_result ; fi
+
+
 pass;