AT_BANNER([GET DATA /TYPE=PSQL])

m4_define([INIT_PSQL], 
  [AT_SKIP_IF([test "$PSQL_SUPPORT" = no])
   PATH=$PG_PATH:$PATH
   export PATH
   PGDATA=`pwd`/cluster
   export PGDATA
   PGPORT=$PG_PORT
   export PGPORT
   socket_dir=`mktemp -d`
   PGHOST="$socket_dir"
   export PGHOST
   AT_CHECK([initdb -A trust], [0], [ignore])
   AT_CHECK([pg_ctl start -w -o "-k $socket_dir -h ''"], [0], [ignore])
   trap 'CLEANUP_PSQL' 0
   AT_CHECK([createdb -h "$socket_dir" -p $PG_PORT $PG_DBASE],
      [0], [ignore], [ignore])
   AT_DATA([populate.sql], 
     [CREATE TABLE empty (a int, b date, c numeric(23, 4));

      -- a largeish table to check big queries work ok.
      CREATE TABLE large (x int);
      INSERT INTO large  (select * from generate_series(1, 1000));


      CREATE TABLE thing (
       bool    bool                      ,
       bytea   bytea                     ,
       char    char                      ,
       int8    int8                      ,
       int2    int2                      ,
       int4    int4                      ,
       numeric       numeric(50,6)       ,
       text    text                      ,
       oid     oid                       ,
       float4  float4                    ,
       float8  float8                    ,
       money   money                     ,
       pbchar  bpchar                    ,
       varchar varchar                   ,
       date    date                      ,
       time    time                      ,
       timestamp     timestamp           ,
       timestamptz   timestamptz         ,
       interval      interval            ,
       timetz        timetz              
      );

      INSERT INTO thing VALUES (
       false,
       '0',
       'a',
       '0',
       0,
       0,
       -256.098,
       'this-long-text',
       0,
       0,
       0,
       '0.01',
       'a',
       'A',
       '1-Jan-2000',
       '00:00',
       'January 8 04:05:06 1999',
       'January 8 04:05:06 1999 PST',
       '1 minutes',
       '10:09 UTC+4'
      );

      INSERT INTO thing VALUES (
       null,
       null,
       null,
       null,
       null,
       null,
       null,
       null,
       null,
       null,
       null,
       null,
       null,
       null,
       null,
       null,
       null,
       null,
       null,
       null
      );

      INSERT INTO thing VALUES (
       true,
       '1',
       'b',
       '1',
       1,
       1,
       65535.00001,
       'that-long-text',
       1,
       1,
       1,
       '1.23',
       'b',
       'B',
       '10-Jan-1963',
       '01:05:02',
       '10-Jan-1963 23:58:00',
       '10-Jan-1963 23:58:00 CET',
       '2 year 1 month 12 days 1 hours 3 minutes 4 seconds',
       '01:05:02 UTC-7'
      );
])
   AT_CHECK([psql -h "$socket_dir" -p $PG_PORT $PG_DBASE < populate.sql],
      [0], [ignore])])

m4_define([CLEANUP_PSQL], [pg_ctl stop -W -o "-k $socket_dir -h ''"])

AT_SETUP([GET DATA /TYPE=PSQL])
INIT_PSQL

dnl Test with an ordinary query.
AT_CHECK([cat > ordinary-query.sps <<EOF
GET DATA /TYPE=psql 
	/CONNECT="host=$socket_dir port=$PGPORT dbname=$PG_DBASE"
	/UNENCRYPTED
	/SQL="select * from thing".

DISPLAY DICTIONARY.

LIST.
EOF
])
AT_CHECK([pspp -o pspp.csv ordinary-query.sps])
AT_CHECK([cat pspp.csv], [0], [dnl
Variable,Description,,Position
bool,Format: F8.2,,1
,Measure: Scale,,
,Display Alignment: Right,,
,Display Width: 8,,
bytea,Format: AHEX2,,2
,Measure: Nominal,,
,Display Alignment: Left,,
,Display Width: 1,,
char,Format: A8,,3
,Measure: Nominal,,
,Display Alignment: Left,,
,Display Width: 8,,
int8,Format: F8.2,,4
,Measure: Scale,,
,Display Alignment: Right,,
,Display Width: 8,,
int2,Format: F8.2,,5
,Measure: Scale,,
,Display Alignment: Right,,
,Display Width: 8,,
int4,Format: F8.2,,6
,Measure: Scale,,
,Display Alignment: Right,,
,Display Width: 8,,
numeric,Format: E40.6,,7
,Measure: Scale,,
,Display Alignment: Right,,
,Display Width: 8,,
text,Format: A16,,8
,Measure: Nominal,,
,Display Alignment: Left,,
,Display Width: 16,,
oid,Format: F8.2,,9
,Measure: Scale,,
,Display Alignment: Right,,
,Display Width: 8,,
float4,Format: F8.2,,10
,Measure: Scale,,
,Display Alignment: Right,,
,Display Width: 8,,
float8,Format: F8.2,,11
,Measure: Scale,,
,Display Alignment: Right,,
,Display Width: 8,,
money,Format: DOLLAR8.2,,12
,Measure: Scale,,
,Display Alignment: Right,,
,Display Width: 8,,
pbchar,Format: A8,,13
,Measure: Nominal,,
,Display Alignment: Left,,
,Display Width: 8,,
varchar,Format: A8,,14
,Measure: Nominal,,
,Display Alignment: Left,,
,Display Width: 8,,
date,Format: DATE11,,15
,Measure: Scale,,
,Display Alignment: Right,,
,Display Width: 8,,
time,Format: TIME11.0,,16
,Measure: Scale,,
,Display Alignment: Right,,
,Display Width: 8,,
timestamp,Format: DATETIME22.0,,17
,Measure: Scale,,
,Display Alignment: Right,,
,Display Width: 8,,
timestamptz,Format: DATETIME22.0,,18
,Measure: Scale,,
,Display Alignment: Right,,
,Display Width: 8,,
interval,Format: DTIME13.0,,19
,Measure: Scale,,
,Display Alignment: Right,,
,Display Width: 8,,
interval_months,Format: F3.0,,20
,Measure: Scale,,
,Display Alignment: Right,,
,Display Width: 8,,
timetz,Format: TIME11.0,,21
,Measure: Scale,,
,Display Alignment: Right,,
,Display Width: 8,,
timetz_zone,Format: F8.2,,22
,Measure: Scale,,
,Display Alignment: Right,,
,Display Width: 8,,

Table: Data List
bool,bytea,char,int8,int2,int4,numeric,text,oid,float4,float8,money,pbchar,varchar,date,time,timestamp,timestamptz,interval,interval_months,timetz,timetz_zone
.00,30,a       ,.00,.00,.00,-2.560980E+002,this-long-text  ,.00,.00,.00,$.01,a       ,A       ,01-JAN-2000,0:00:00,08-JAN-1999 04:05:06,08-JAN-1999 12:05:06,0 00:01:00,0,10:09:00,4.00
.  ,20,,.  ,.  ,.  ,.          ,,.  ,.  ,.  ,.  ,,,.,.,.,.,.,.,.,.  @&t@
1.00,31,b       ,1.00,1.00,1.00,6.553500E+004,that-long-text  ,.00,1.00,1.00,$1.23,b       ,B       ,10-JAN-1963,1:05:02,10-JAN-1963 23:58:00,10-JAN-1963 22:58:00,12 01:03:04,25,1:05:02,-7.00
])

dnl Test query with empty result set.
AT_CHECK([cat > empty-result.sps <<EOF
GET DATA /TYPE=psql 
	/CONNECT="host=$socket_dir port=$PGPORT dbname=$PG_DBASE"
	/UNENCRYPTED
	/SQL="select * from empty".

DISPLAY DICTIONARY.

LIST.
EOF
])
AT_CHECK([pspp -o pspp.csv empty-result.sps])
AT_CHECK([cat pspp.csv], [0], [dnl
Variable,Description,,Position
a,Format: F8.2,,1
,Measure: Scale,,
,Display Alignment: Right,,
,Display Width: 8,,
b,Format: DATE11,,2
,Measure: Scale,,
,Display Alignment: Right,,
,Display Width: 8,,
c,Format: E40.2,,3
,Measure: Scale,,
,Display Alignment: Right,,
,Display Width: 8,,
])

dnl Test query with large result set.
AT_CHECK([cat > large-result.sps <<EOF
GET DATA /TYPE=psql 
	/CONNECT="host=$socket_dir port=$PGPORT dbname=$PG_DBASE"
	/UNENCRYPTED
	/SQL="select * from large".

NUMERIC diff.
COMPUTE diff = x - lag (x).

TEMPORARY.
SELECT IF (diff <> 1).
LIST.

TEMPORARY.
N OF CASES 6.
LIST.

SORT CASES BY x (D).

TEMPORARY.
N OF CASES 6.
LIST.
EOF
])
AT_CHECK([pspp -o pspp.csv large-result.sps])
AT_CHECK([cat pspp.csv], [0], [dnl
Table: Data List
x,diff
1.00,.  @&t@
2.00,1.00
3.00,1.00
4.00,1.00
5.00,1.00
6.00,1.00

Table: Data List
x,diff
1000.00,1.00
999.00,1.00
998.00,1.00
997.00,1.00
996.00,1.00
995.00,1.00
])

dnl Check for a bug caused by having string variables in the database,
dnl all of which are null.
AT_DATA([all-null-string.sql],
  [-- 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, '');
])
AT_CHECK([psql -h "$socket_dir" -p $PG_PORT $PG_DBASE < all-null-string.sql],
  [0], [ignore])
AT_CAPTURE_FILE([get-data.sps])
AT_CHECK([cat > get-data.sps <<EOF
GET DATA /TYPE=psql 
	/CONNECT="host=$socket_dir port=$PGPORT dbname=$PG_DBASE"
	/UNENCRYPTED
	/SQL="select * from foo".

DISPLAY DICTIONARY.

LIST.
EOF
])
AT_CHECK([pspp -o pspp.csv get-data.sps])
AT_CAPTURE_FILE([pspp.csv])
rm -rf "$socket_dir"
AT_CLEANUP
