Lookups: fix pgsql multiple-row, single-column return
authorJeremy Harris <jgh146exb@wizmail.org>
Sun, 24 Dec 2017 21:30:20 +0000 (21:30 +0000)
committerJeremy Harris <jgh146exb@wizmail.org>
Sun, 24 Dec 2017 21:30:20 +0000 (21:30 +0000)
Report & fix from James <list@xdrv.co.uk>; additional tidying and testcase by JGH

Broken-by: acec9514b1
12 files changed:
doc/doc-txt/ChangeLog
src/src/lookups/pgsql.c
test/confs/2620 [moved from test/confs/9200 with 92% similarity]
test/log/2620 [moved from test/log/9200 with 100% similarity]
test/mail/2620.ph10 [moved from test/mail/9200.CALLER with 100% similarity]
test/runtest
test/scripts/2620-Postgresql/2620 [new file with mode: 0644]
test/scripts/2620-Postgresql/REQUIRES [new file with mode: 0644]
test/scripts/9200-PostgreSQL/9200 [deleted file]
test/stderr/2620 [moved from test/stderr/9200 with 60% similarity]
test/stdout/2620 [new file with mode: 0644]
test/stdout/9200 [deleted file]

index 824ae232e6c0ca71ed70777c566ec1c1a2c9602e..08ed2ce9d1b262a15b47e8f0d138a692c9f98881 100644 (file)
@@ -5,6 +5,13 @@ affect Exim's operation, with an unchanged configuration file.  For new
 options, and new features, see the NewStuff file next to this ChangeLog.
 
 
+Since Exim version 4.90
+-----------------
+
+JH/03 Fix pgsql lookup for multiple result-tuples with a single column.
+      Previously only the last row was returned.
+
+
 Exim version 4.90
 -----------------
 
index 0b771f59cae389302f0bc563b35e6e85a04c7250..cece43b66b4750a744bb4eb4593f7cb477dc73f9 100644 (file)
@@ -140,7 +140,7 @@ has the password removed. This copy is also used for debugging output. */
 for (i = 2; i >= 0; i--)
   {
   uschar *pp = Ustrrchr(server, '/');
-  if (pp == NULL)
+  if (!pp)
     {
     *errmsg = string_sprintf("incomplete pgSQL server data: %s",
       (i == 2)? server : server_copy);
@@ -156,18 +156,16 @@ for (i = 2; i >= 0; i--)
 start is the identification of the server (host or path). See if we have a
 cached connection to the server. */
 
-for (cn = pgsql_connections; cn != NULL; cn = cn->next)
-  {
+for (cn = pgsql_connections; cn; cn = cn->next)
   if (Ustrcmp(cn->server, server_copy) == 0)
     {
     pg_conn = cn->handle;
     break;
     }
-  }
 
 /* If there is no cached connection, we must set one up. */
 
-if (cn == NULL)
+if (!cn)
   {
   uschar *port = US"";
 
@@ -178,7 +176,7 @@ if (cn == NULL)
     uschar *last_slash, *last_dot, *p;
 
     p = ++server;
-    while (*p != 0 && *p != ')') p++;
+    while (*p && *p != ')') p++;
     *p = 0;
 
     last_slash = Ustrrchr(server, '/');
@@ -191,10 +189,9 @@ if (cn == NULL)
     We have to call PQsetdbLogin with '/var/run/postgresql' as the hostname
     argument and put '5432' into the port variable. */
 
-    if (last_slash == NULL || last_dot == NULL)
+    if (!last_slash || !last_dot)
       {
-      *errmsg = string_sprintf("PGSQL invalid filename for socket: %s",
-        server);
+      *errmsg = string_sprintf("PGSQL invalid filename for socket: %s", server);
       *defer_break = TRUE;
       return DEFER;
       }
@@ -211,13 +208,13 @@ if (cn == NULL)
   else
     {
     uschar *p;
-    if ((p = Ustrchr(server, ':')) != NULL)
+    if ((p = Ustrchr(server, ':')))
       {
       *p++ = 0;
       port = p;
       }
 
-    if (Ustrchr(server, '/') != NULL)
+    if (Ustrchr(server, '/'))
       {
       *errmsg = string_sprintf("unexpected slash in pgSQL server hostname: %s",
         server);
@@ -280,37 +277,37 @@ else
 
 /* Run the query */
 
-  pg_result = PQexec(pg_conn, CS query);
-  switch(PQresultStatus(pg_result))
-    {
-    case PGRES_EMPTY_QUERY:
-    case PGRES_COMMAND_OK:
-      /* The command was successful but did not return any data since it was
-      not SELECT but either an INSERT, UPDATE or DELETE statement. Tell the
-      high level code to not cache this query, and clean the current cache for
-      this handle by setting *do_cache zero. */
-
-      result = string_cat(result, US PQcmdTuples(pg_result));
-      *do_cache = 0;
-      DEBUG(D_lookup) debug_printf("PGSQL: command does not return any data "
-       "but was successful. Rows affected: %s\n", result->s);
-      break;
+pg_result = PQexec(pg_conn, CS query);
+switch(PQresultStatus(pg_result))
+  {
+  case PGRES_EMPTY_QUERY:
+  case PGRES_COMMAND_OK:
+    /* The command was successful but did not return any data since it was
+    not SELECT but either an INSERT, UPDATE or DELETE statement. Tell the
+    high level code to not cache this query, and clean the current cache for
+    this handle by setting *do_cache zero. */
+
+    result = string_cat(result, US PQcmdTuples(pg_result));
+    *do_cache = 0;
+    DEBUG(D_lookup) debug_printf("PGSQL: command does not return any data "
+      "but was successful. Rows affected: %s\n", string_from_gstring(result));
+    break;
 
-    case PGRES_TUPLES_OK:
-      break;
+  case PGRES_TUPLES_OK:
+    break;
 
-    default:
-      /* This was the original code:
-      *errmsg = string_sprintf("PGSQL: query failed: %s\n",
-                              PQresultErrorMessage(pg_result));
-      This was suggested by a user:
-      */
-
-      *errmsg = string_sprintf("PGSQL: query failed: %s (%s) (%s)\n",
-                             PQresultErrorMessage(pg_result),
-                             PQresStatus(PQresultStatus(pg_result)), query);
-      goto PGSQL_EXIT;
-    }
+  default:
+    /* This was the original code:
+    *errmsg = string_sprintf("PGSQL: query failed: %s\n",
+                            PQresultErrorMessage(pg_result));
+    This was suggested by a user:
+    */
+
+    *errmsg = string_sprintf("PGSQL: query failed: %s (%s) (%s)\n",
+                          PQresultErrorMessage(pg_result),
+                          PQresStatus(PQresultStatus(pg_result)), query);
+    goto PGSQL_EXIT;
+  }
 
 /* Result is in pg_result. Find the number of fields returned. If this is one,
 we don't add field names to the data. Otherwise we do. If the query did not
@@ -329,7 +326,7 @@ for (i = 0; i < num_tuples; i++)
     result = string_catn(result, US"\n", 1);
 
   if (num_fields == 1)
-    result = string_catn(NULL,
+    result = string_catn(result,
        US PQgetvalue(pg_result, i, 0), PQgetlength(pg_result, i, 0));
   else
     {
@@ -342,17 +339,13 @@ for (i = 0; i < num_tuples; i++)
     }
   }
 
-/* If result is NULL then no data has been found and so we return FAIL.
-Otherwise, we must terminate the string which has been built; string_cat()
-always leaves enough room for a terminating zero. */
+/* If result is NULL then no data has been found and so we return FAIL. */
 
 if (!result)
   {
   yield = FAIL;
   *errmsg = US"PGSQL: no data found";
   }
-else
-  store_reset(result->s + result->ptr + 1);
 
 /* Get here by goto from various error checks. */
 
@@ -367,6 +360,7 @@ if (pg_result) PQclear(pg_result);
 
 if (result)
   {
+  store_reset(result->s + result->ptr + 1);
   *resultptr = string_from_gstring(result);
   return OK;
   }
similarity index 92%
rename from test/confs/9200
rename to test/confs/2620
index 04f52a9a01911fe76efabf5d2b72a26b6a4e3fd9..009e74fd8540f6010a83328bea471f75849e10eb 100644 (file)
@@ -1,6 +1,6 @@
-# Exim test configuration 9200
+# Exim test configuration 2620
 
-SERVERS=localhost/test/ph10/
+SERVERS=localhost::PORT_N/test/CALLER/
 
 .include DIR/aux-var/std_conf_prefix
 
similarity index 100%
rename from test/log/9200
rename to test/log/2620
similarity index 100%
rename from test/mail/9200.CALLER
rename to test/mail/2620.ph10
index a1259f76920c8b73671e260c1d66d71a31bfd04c..d0de8622e4b448bb88cc2240abfde41da846464a 100755 (executable)
@@ -2428,6 +2428,7 @@ elsif (/^background$/)
 
   $_ = <SCRIPT>; $lineno++;
   chomp;
+  do_substitute($testno);
   $line = $_;
   if ($debug) { printf ">> daemon: $line >>test-stdout 2>>test-stderr\n"; }
 
diff --git a/test/scripts/2620-Postgresql/2620 b/test/scripts/2620-Postgresql/2620
new file mode 100644 (file)
index 0000000..ba3a3bc
--- /dev/null
@@ -0,0 +1,63 @@
+# pgsql lookups
+#
+# first, populate a DB to test against
+sudo rm -fr DIR/pgsql
+perl
+system 'initdb -D DIR/pgsql/data';
+****
+background
+/usr/bin/postgres -D DIR/pgsql/data -p PORT_N -k DIR/pgsql
+****
+perl
+system 'createdb -h localhost -p PORT_N test';
+system 'psql -h localhost -p PORT_N -d test \
+ -c "CREATE TABLE them ( name text, id text );" \
+ -c "INSERT INTO them VALUES ( \'Philip Hazel\', \'ph10\' );" \
+ -c "INSERT INTO them VALUES ( \'Aristotle\',    \'aaaa\' );" \
+ -c "INSERT INTO them VALUES ( \'\', \'nothing\' );" \
+ -c "INSERT INTO them VALUES ( \'\"stquot\', \'quote2\' );" \
+ -c "INSERT INTO them VALUES ( \'before\' || CHR(13) || CHR(10) || \'after\', \'newline\' );" \
+ -c "INSERT INTO them VALUES ( \'x\' || CHR(9) || \'x\', \'tab\' );" \
+ -c "INSERT INTO them VALUES ( CHR(39) || \'stquot\', \'quote1\' );" \
+ ';
+****
+#
+# now, the tests
+exim -d-all+lookup -be
+${lookup pgsql {select name from them where id='ph10';}}
+${lookup pgsql {select name from them where id='ph10';}}
+${lookup pgsql {select name from them where id='xxxx';}}
+${lookup pgsql {select name from them where id='nothing';}}
+${lookup pgsql {select id,name from them where id='nothing';}}
+${lookup pgsql {delete from them where id='nonexist';}}
+${lookup pgsql {select * from them where id='quote2';}}
+${lookup pgsql {select * from them where id='newline';}}
+${lookup pgsql {select * from them where id='tab';}}
+${lookup pgsql {select * from them where name='${quote_pgsql:'stquot}';}}
+${lookup pgsql {servers=x:localhost; select name from them where id='ph10';}}
+${lookup pgsql {servers=localhost::PORT_N:x; select name from them where id='ph10';}}
+${lookup pgsql {servers=localhost::PORT_N/test/CALLER/:x; select name from them where id='ph10';}}
+${lookup pgsql {servers=(DIR/pgsql/.s.PGSQL.PORT_N)/test/CALLER/:x; select name from them where id='ph10';}}
+x
+${lookup pgsql {SELECT name FROM them WHERE id IN ('ph10', 'aaaa');}}
+${lookup pgsql {SELECT *    FROM them WHERE id IN ('ph10', 'aaaa');}}
+****
+exim -d -bh 10.0.0.0
+mail from:<a@b>
+rcpt to:<c@d>
+rcpt to:<c@d>
+quit
+****
+exim -odi -d CALLER
+Test message
+.
+****
+exim -DSERVERS=\(DIR/pgsql/.s.PGSQL.PORT_N\)/test/CALLER/ -d-all+lookup -be
+${lookup pgsql {select name from them where id='ph10';}}
+****
+#
+perl
+system 'pg_ctl stop -D DIR/pgsql/data -m immediate';
+****
+killdaemon
+sudo rm -fr DIR/pgsql
diff --git a/test/scripts/2620-Postgresql/REQUIRES b/test/scripts/2620-Postgresql/REQUIRES
new file mode 100644 (file)
index 0000000..5303be6
--- /dev/null
@@ -0,0 +1 @@
+lookup pgsql
diff --git a/test/scripts/9200-PostgreSQL/9200 b/test/scripts/9200-PostgreSQL/9200
deleted file mode 100644 (file)
index 2dfb15b..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-# pgsql lookups - expects specific data
-exim -d-all+lookup -be
-${lookup pgsql {select name from them where id='ph10';}}
-${lookup pgsql {select name from them where id='ph10';}}
-${lookup pgsql {select name from them where id='xxxx';}}
-${lookup pgsql {select name from them where id='nothing';}}
-${lookup pgsql {select id,name from them where id='nothing';}}
-${lookup pgsql {delete from them where id='nonexist';}}
-${lookup pgsql {select * from them where id='quote2';}}
-${lookup pgsql {select * from them where id='newline';}}
-${lookup pgsql {select * from them where id='tab';}}
-${lookup pgsql {select * from them where name='${quote_pgsql:'stquot}';}}
-${lookup pgsql {servers=x:localhost; select name from them where id='ph10';}}
-${lookup pgsql {servers=localhost:x; select name from them where id='ph10';}}
-${lookup pgsql {servers=localhost/test/CALLER/:x; select name from them where id='ph10';}}
-${lookup pgsql {servers=(/tmp/.s.PGSQL.5432)/test/ph10/:x; select name from them where id='ph10';}}
-****
-exim -d -bh 10.0.0.0
-mail from:<a@b>
-rcpt to:<c@d>
-rcpt to:<c@d>
-quit
-****
-exim -odi -d CALLER
-Test message
-.
-****
-exim -DSERVERS=\(/tmp/.s.PGSQL.5432\)/test/ph10/ -d-all+lookup -be
-${lookup pgsql {select name from them where id='CALLER';}}
-****
similarity index 60%
rename from test/stderr/9200
rename to test/stderr/2620
index 2fff471a35eb502fa20c50885649b6f7ee168159..b0bed620945752c665bf629bd510addfc98405f7 100644 (file)
@@ -1,24 +1,28 @@
+
+WARNING: enabling "trust" authentication for local connections
+You can change this by editing pg_hba.conf or using the option -A, or
+--auth-local and --auth-host, the next time you run initdb.
 Exim version x.yz ....
 configuration file is TESTSUITE/test-config
 admin user
 search_open: pgsql "NULL"
 search_find: file="NULL"
-  key="select name from them where id='CALLER';" partial=-1 affix=NULL starflags=0
+  key="select name from them where id='ph10';" partial=-1 affix=NULL starflags=0
 LRU list:
 internal_search_find: file="NULL"
-  type=pgsql key="select name from them where id='CALLER';"
-database lookup required for select name from them where id='CALLER';
-PostgreSQL query: select name from them where id='CALLER';
-PGSQL new connection: host=localhost port= database=test user=CALLER
+  type=pgsql key="select name from them where id='ph10';"
+database lookup required for select name from them where id='ph10';
+PostgreSQL query: select name from them where id='ph10';
+PGSQL new connection: host=localhost port=1223 database=test user=CALLER
 lookup yielded: Philip Hazel
 search_open: pgsql "NULL"
   cached open
 search_find: file="NULL"
-  key="select name from them where id='CALLER';" partial=-1 affix=NULL starflags=0
+  key="select name from them where id='ph10';" partial=-1 affix=NULL starflags=0
 LRU list:
 internal_search_find: file="NULL"
-  type=pgsql key="select name from them where id='CALLER';"
-cached data used for lookup of select name from them where id='CALLER';
+  type=pgsql key="select name from them where id='ph10';"
+cached data used for lookup of select name from them where id='ph10';
 lookup yielded: Philip Hazel
 search_open: pgsql "NULL"
   cached open
@@ -29,7 +33,7 @@ internal_search_find: file="NULL"
   type=pgsql key="select name from them where id='xxxx';"
 database lookup required for select name from them where id='xxxx';
 PostgreSQL query: select name from them where id='xxxx';
-PGSQL using cached connection for localhost/test/CALLER
+PGSQL using cached connection for localhost:1223/test/CALLER
 PGSQL: no data found
 lookup failed
 search_open: pgsql "NULL"
@@ -41,7 +45,7 @@ internal_search_find: file="NULL"
   type=pgsql key="select name from them where id='nothing';"
 database lookup required for select name from them where id='nothing';
 PostgreSQL query: select name from them where id='nothing';
-PGSQL using cached connection for localhost/test/CALLER
+PGSQL using cached connection for localhost:1223/test/CALLER
 lookup yielded: 
 search_open: pgsql "NULL"
   cached open
@@ -52,7 +56,7 @@ internal_search_find: file="NULL"
   type=pgsql key="select id,name from them where id='nothing';"
 database lookup required for select id,name from them where id='nothing';
 PostgreSQL query: select id,name from them where id='nothing';
-PGSQL using cached connection for localhost/test/CALLER
+PGSQL using cached connection for localhost:1223/test/CALLER
 lookup yielded: id=nothing name="" 
 search_open: pgsql "NULL"
   cached open
@@ -63,7 +67,7 @@ internal_search_find: file="NULL"
   type=pgsql key="delete from them where id='nonexist';"
 database lookup required for delete from them where id='nonexist';
 PostgreSQL query: delete from them where id='nonexist';
-PGSQL using cached connection for localhost/test/CALLER
+PGSQL using cached connection for localhost:1223/test/CALLER
 PGSQL: command does not return any data but was successful. Rows affected: 0
 lookup forced cache cleanup
 lookup yielded: 0
@@ -76,7 +80,7 @@ internal_search_find: file="NULL"
   type=pgsql key="select * from them where id='quote2';"
 database lookup required for select * from them where id='quote2';
 PostgreSQL query: select * from them where id='quote2';
-PGSQL using cached connection for localhost/test/CALLER
+PGSQL using cached connection for localhost:1223/test/CALLER
 lookup yielded: name="\"stquot" id=quote2 
 search_open: pgsql "NULL"
   cached open
@@ -87,8 +91,8 @@ internal_search_find: file="NULL"
   type=pgsql key="select * from them where id='newline';"
 database lookup required for select * from them where id='newline';
 PostgreSQL query: select * from them where id='newline';
-PGSQL using cached connection for localhost/test/CALLER
-lookup yielded: name="before
+PGSQL using cached connection for localhost:1223/test/CALLER
+lookup yielded: name="before\r
 after" id=newline 
 search_open: pgsql "NULL"
   cached open
@@ -99,7 +103,7 @@ internal_search_find: file="NULL"
   type=pgsql key="select * from them where id='tab';"
 database lookup required for select * from them where id='tab';
 PostgreSQL query: select * from them where id='tab';
-PGSQL using cached connection for localhost/test/CALLER
+PGSQL using cached connection for localhost:1223/test/CALLER
 lookup yielded: name="x        x" id=tab 
 search_open: pgsql "NULL"
   cached open
@@ -110,55 +114,79 @@ internal_search_find: file="NULL"
   type=pgsql key="select * from them where name='''stquot';"
 database lookup required for select * from them where name='''stquot';
 PostgreSQL query: select * from them where name='''stquot';
-PGSQL using cached connection for localhost/test/CALLER
+PGSQL using cached connection for localhost:1223/test/CALLER
 lookup yielded: name='stquot id=quote1 
 search_open: pgsql "NULL"
   cached open
 search_find: file="NULL"
-  key="servers=x:localhost; select name from them where id='CALLER';" partial=-1 affix=NULL starflags=0
+  key="servers=x:localhost; select name from them where id='ph10';" partial=-1 affix=NULL starflags=0
 LRU list:
 internal_search_find: file="NULL"
-  type=pgsql key="servers=x:localhost; select name from them where id='CALLER';"
-database lookup required for servers=x:localhost; select name from them where id='CALLER';
-PostgreSQL query: servers=x:localhost; select name from them where id='CALLER';
+  type=pgsql key="servers=x:localhost; select name from them where id='ph10';"
+database lookup required for servers=x:localhost; select name from them where id='ph10';
+PostgreSQL query: servers=x:localhost; select name from them where id='ph10';
 lookup deferred: PostgreSQL server "x" not found in pgsql_servers
 search_open: pgsql "NULL"
   cached open
 search_find: file="NULL"
-  key="servers=localhost:x; select name from them where id='CALLER';" partial=-1 affix=NULL starflags=0
+  key="servers=localhost::1223:x; select name from them where id='ph10';" partial=-1 affix=NULL starflags=0
+LRU list:
+internal_search_find: file="NULL"
+  type=pgsql key="servers=localhost::1223:x; select name from them where id='ph10';"
+database lookup required for servers=localhost::1223:x; select name from them where id='ph10';
+PostgreSQL query: servers=localhost::1223:x; select name from them where id='ph10';
+PGSQL using cached connection for localhost:1223/test/CALLER
+lookup yielded: Philip Hazel
+search_open: pgsql "NULL"
+  cached open
+search_find: file="NULL"
+  key="servers=localhost::1223/test/CALLER/:x; select name from them where id='ph10';" partial=-1 affix=NULL starflags=0
 LRU list:
 internal_search_find: file="NULL"
-  type=pgsql key="servers=localhost:x; select name from them where id='CALLER';"
-database lookup required for servers=localhost:x; select name from them where id='CALLER';
-PostgreSQL query: servers=localhost:x; select name from them where id='CALLER';
-PGSQL using cached connection for localhost/test/CALLER
+  type=pgsql key="servers=localhost::1223/test/CALLER/:x; select name from them where id='ph10';"
+database lookup required for servers=localhost::1223/test/CALLER/:x; select name from them where id='ph10';
+PostgreSQL query: servers=localhost::1223/test/CALLER/:x; select name from them where id='ph10';
+PGSQL using cached connection for localhost:1223/test/CALLER
 lookup yielded: Philip Hazel
 search_open: pgsql "NULL"
   cached open
 search_find: file="NULL"
-  key="servers=localhost/test/CALLER/:x; select name from them where id='CALLER';" partial=-1 affix=NULL starflags=0
+  key="servers=(TESTSUITE/pgsql/.s.PGSQL.1223)/test/CALLER/:x; select name from them where id='ph10';" partial=-1 affix=NULL starflags=0
 LRU list:
 internal_search_find: file="NULL"
-  type=pgsql key="servers=localhost/test/CALLER/:x; select name from them where id='CALLER';"
-database lookup required for servers=localhost/test/CALLER/:x; select name from them where id='CALLER';
-PostgreSQL query: servers=localhost/test/CALLER/:x; select name from them where id='CALLER';
-PGSQL using cached connection for localhost/test/CALLER
+  type=pgsql key="servers=(TESTSUITE/pgsql/.s.PGSQL.1223)/test/CALLER/:x; select name from them where id='ph10';"
+database lookup required for servers=(TESTSUITE/pgsql/.s.PGSQL.1223)/test/CALLER/:x; select name from them where id='ph10';
+PostgreSQL query: servers=(TESTSUITE/pgsql/.s.PGSQL.1223)/test/CALLER/:x; select name from them where id='ph10';
+PGSQL new connection: socket=TESTSUITE/pgsql/.s.PGSQL.1223 database=test user=CALLER
 lookup yielded: Philip Hazel
 search_open: pgsql "NULL"
   cached open
 search_find: file="NULL"
-  key="servers=(/tmp/.s.PGSQL.5432)/test/CALLER/:x; select name from them where id='CALLER';" partial=-1 affix=NULL starflags=0
+  key="SELECT name FROM them WHERE id IN ('ph10', 'aaaa');" partial=-1 affix=NULL starflags=0
 LRU list:
 internal_search_find: file="NULL"
-  type=pgsql key="servers=(/tmp/.s.PGSQL.5432)/test/CALLER/:x; select name from them where id='CALLER';"
-database lookup required for servers=(/tmp/.s.PGSQL.5432)/test/CALLER/:x; select name from them where id='CALLER';
-PostgreSQL query: servers=(/tmp/.s.PGSQL.5432)/test/CALLER/:x; select name from them where id='CALLER';
-PGSQL new connection: socket=/tmp/.s.PGSQL.5432 database=test user=CALLER
+  type=pgsql key="SELECT name FROM them WHERE id IN ('ph10', 'aaaa');"
+database lookup required for SELECT name FROM them WHERE id IN ('ph10', 'aaaa');
+PostgreSQL query: SELECT name FROM them WHERE id IN ('ph10', 'aaaa');
+PGSQL using cached connection for localhost:1223/test/CALLER
 lookup yielded: Philip Hazel
+Aristotle
+search_open: pgsql "NULL"
+  cached open
+search_find: file="NULL"
+  key="SELECT *    FROM them WHERE id IN ('ph10', 'aaaa');" partial=-1 affix=NULL starflags=0
+LRU list:
+internal_search_find: file="NULL"
+  type=pgsql key="SELECT *    FROM them WHERE id IN ('ph10', 'aaaa');"
+database lookup required for SELECT *    FROM them WHERE id IN ('ph10', 'aaaa');
+PostgreSQL query: SELECT *    FROM them WHERE id IN ('ph10', 'aaaa');
+PGSQL using cached connection for localhost:1223/test/CALLER
+lookup yielded: name="Philip Hazel" id=ph10 
+name=Aristotle id=aaaa 
 search_tidyup called
-close PGSQL connection: (/tmp/.s.PGSQL.5432)/test/CALLER
-close PGSQL connection: localhost/test/CALLER
->>>>>>>>>>>>>>>> Exim pid=pppp terminating with rc=0 >>>>>>>>>>>>>>>>
+close PGSQL connection: (TESTSUITE/pgsql/.s.PGSQL.1223)/test/CALLER
+close PGSQL connection: localhost:1223/test/CALLER
+>>>>>>>>>>>>>>>> Exim pid=pppp (main: expansion test) terminating with rc=0 >>>>>>>>>>>>>>>>
 Exim version x.yz ....
 changed uid/gid: forcing real = effective
   uid=uuuu gid=CALLER_GID pid=pppp
@@ -186,6 +214,8 @@ host in helo_accept_junk_hosts? no (option unset)
 SMTP>> 220 myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000
 smtp_setup_msg entered
 SMTP<< mail from:<a@b>
+spool directory space = nnnnnK inodes = nnnnn check_space = 10240K inodes = 100 msg_size = 0
+log directory space = nnnnnK inodes = nnnnn check_space = 10240K inodes = 100
 SMTP>> 250 OK
 SMTP<< rcpt to:<c@d>
 using ACL "check_recipient"
@@ -193,7 +223,7 @@ processing "accept"
 check domains = +local_domains
 d in "@"? no (end of list)
 d in "+local_domains"? no (end of list)
-accept: condition test failed
+accept: condition test failed in ACL "check_recipient"
 processing "accept"
 check hosts = +relay_hosts
 search_open: pgsql "NULL"
@@ -204,14 +234,16 @@ internal_search_find: file="NULL"
   type=pgsql key="select * from them where id='10.0.0.0'"
 database lookup required for select * from them where id='10.0.0.0'
 PostgreSQL query: select * from them where id='10.0.0.0'
-PGSQL new connection: host=localhost port= database=test user=CALLER
+PGSQL new connection: host=localhost port=1223 database=test user=CALLER
 PGSQL: no data found
 lookup failed
 host in "net-pgsql;select * from them where id='10.0.0.0'"? no (end of list)
 host in "+relay_hosts"? no (end of list)
-accept: condition test failed
+accept: condition test failed in ACL "check_recipient"
 processing "deny"
-deny: condition test succeeded
+  message: relay not permitted
+deny: condition test succeeded in ACL "check_recipient"
+end of ACL "check_recipient": DENY
 SMTP>> 550 relay not permitted
 LOG: MAIN REJECT
   H=[10.0.0.0] F=<a@b> rejected RCPT <c@d>: relay not permitted
@@ -221,7 +253,7 @@ processing "accept"
 check domains = +local_domains
 d in "@"? no (end of list)
 d in "+local_domains"? no (end of list)
-accept: condition test failed
+accept: condition test failed in ACL "check_recipient"
 processing "accept"
 check hosts = +relay_hosts
 search_open: pgsql "NULL"
@@ -235,9 +267,11 @@ cached data used for lookup of select * from them where id='10.0.0.0'
 lookup failed
 host in "net-pgsql;select * from them where id='10.0.0.0'"? no (end of list)
 host in "+relay_hosts"? no (end of list)
-accept: condition test failed
+accept: condition test failed in ACL "check_recipient"
 processing "deny"
-deny: condition test succeeded
+  message: relay not permitted
+deny: condition test succeeded in ACL "check_recipient"
+end of ACL "check_recipient": DENY
 SMTP>> 550 relay not permitted
 LOG: MAIN REJECT
   H=[10.0.0.0] F=<a@b> rejected RCPT <c@d>: relay not permitted
@@ -246,8 +280,8 @@ SMTP>> 221 myhost.test.ex closing connection
 LOG: smtp_connection MAIN
   SMTP connection from [10.0.0.0] closed by QUIT
 search_tidyup called
-close PGSQL connection: localhost/test/CALLER
->>>>>>>>>>>>>>>> Exim pid=pppp terminating with rc=0 >>>>>>>>>>>>>>>>
+close PGSQL connection: localhost:1223/test/CALLER
+>>>>>>>>>>>>>>>> Exim pid=pppp (main) terminating with rc=0 >>>>>>>>>>>>>>>>
 Exim version x.yz ....
 changed uid/gid: forcing real = effective
   uid=uuuu gid=CALLER_GID pid=pppp
@@ -260,6 +294,8 @@ getpwnam() succeeded uid=CALLER_UID gid=CALLER_GID
 originator: uid=CALLER_UID gid=CALLER_GID login=CALLER name=CALLER_NAME
 sender address = CALLER@myhost.test.ex
 set_process_info: pppp accepting a local non-SMTP message from <CALLER@myhost.test.ex>
+spool directory space = nnnnnK inodes = nnnnn check_space = 10240K inodes = 100 msg_size = 0
+log directory space = nnnnnK inodes = nnnnn check_space = 10240K inodes = 100
 Sender: CALLER@myhost.test.ex
 Recipients:
   CALLER
@@ -274,6 +310,7 @@ I Message-Id: <E10HmaX-0005vi-00@myhost.test.ex>
 F From: CALLER_NAME <CALLER@myhost.test.ex>
   Date: Tue, 2 Mar 1999 09:44:33 +0000
 
+Data file name: TESTSUITE/spool//input//10HmaX-0005vi-00-D
 Data file written for message 10HmaX-0005vi-00
 >>Generated Received: header line
 P Received: from CALLER by myhost.test.ex with local (Exim x.yz)
@@ -282,7 +319,12 @@ P Received: from CALLER by myhost.test.ex with local (Exim x.yz)
        for CALLER@myhost.test.ex; Tue, 2 Mar 1999 09:44:33 +0000
 calling local_scan(); timeout=300
 local_scan() returned 0 NULL
-Writing spool header file
+Writing spool header file: TESTSUITE/spool//input//hdr.pppp
+DSN: Write SPOOL :-dsn_envid NULL
+DSN: Write SPOOL :-dsn_ret 0
+DSN: Flags :0
+DSN: **** SPOOL_OUT - address: |CALLER@myhost.test.ex| errorsto: |NULL| orcpt: |NULL| dsn_flags: 0
+Renaming spool header file: TESTSUITE/spool//input//10HmaX-0005vi-00-H
 Size of headers = sss
 LOG: MAIN
   <= CALLER@myhost.test.ex U=CALLER P=local S=sss
@@ -295,11 +337,11 @@ changed uid/gid: forcing real = effective
 configuration file is TESTSUITE/test-config
 trusted user
 admin user
-skipping ACL configuration - not needed
 seeking password data for user "CALLER": cache not available
 getpwnam() succeeded uid=CALLER_UID gid=CALLER_GID
 set_process_info: pppp delivering specified messages
 set_process_info: pppp delivering 10HmaX-0005vi-00
+Trying spool file TESTSUITE/spool//input//10HmaX-0005vi-00-D
 reading spool file 10HmaX-0005vi-00-H
 user=CALLER uid=CALLER_UID gid=CALLER_GID sender=CALLER@myhost.test.ex
 sender_local=1 ident=CALLER
@@ -307,14 +349,17 @@ Non-recipients:
 Empty Tree
 ---- End of tree ----
 recipients_count=1
+**** SPOOL_IN - No additional fields
 body_linecount=1 message_linecount=7
+DSN: set orcpt: NULL  flags: 0
 Delivery address list:
   CALLER@myhost.test.ex 
 locking TESTSUITE/spool/db/retry.lockfile
-locked TESTSUITE/spool/db/retry.lockfile
-EXIM_DBOPEN(TESTSUITE/spool/db/retry)
-returned from EXIM_DBOPEN
+locked  TESTSUITE/spool/db/retry.lockfile
+EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
+returned from EXIM_DBOPEN: (nil)
 ensuring TESTSUITE/spool/db/retry.lockfile is owned by exim
+failed to open DB file TESTSUITE/spool/db/retry.lockfile: No such file or directory
 no retry data available
 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 Considering: CALLER@myhost.test.ex
@@ -329,13 +374,13 @@ local_part=CALLER domain=myhost.test.ex
 processing address_data
 search_open: pgsql "NULL"
 search_find: file="NULL"
-  key="select name from them where id='CALLER'" partial=-1 affix=NULL starflags=0
+  key="select name from them where id='ph10'" partial=-1 affix=NULL starflags=0
 LRU list:
 internal_search_find: file="NULL"
-  type=pgsql key="select name from them where id='CALLER'"
-database lookup required for select name from them where id='CALLER'
-PostgreSQL query: select name from them where id='CALLER'
-PGSQL new connection: host=localhost port= database=test user=CALLER
+  type=pgsql key="select name from them where id='ph10'"
+database lookup required for select name from them where id='ph10'
+PostgreSQL query: select name from them where id='ph10'
+PGSQL new connection: host=localhost port=1223 database=test user=CALLER
 lookup yielded: Philip Hazel
 calling r1 router
 r1 router called for CALLER@myhost.test.ex
@@ -356,13 +401,14 @@ After routing:
   Failed addresses:
   Deferred addresses:
 search_tidyup called
-close PGSQL connection: localhost/test/CALLER
+close PGSQL connection: localhost:1223/test/CALLER
 >>>>>>>>>>>>>>>> Local deliveries >>>>>>>>>>>>>>>>
 --------> CALLER@myhost.test.ex <--------
 locking TESTSUITE/spool/db/retry.lockfile
-locked TESTSUITE/spool/db/retry.lockfile
-EXIM_DBOPEN(TESTSUITE/spool/db/retry)
-returned from EXIM_DBOPEN
+locked  TESTSUITE/spool/db/retry.lockfile
+EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
+returned from EXIM_DBOPEN: (nil)
+failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 search_tidyup called
 changed uid/gid: local delivery to CALLER <CALLER@myhost.test.ex> transport=t1
@@ -372,31 +418,32 @@ set_process_info: pppp delivering 10HmaX-0005vi-00 to CALLER using t1
 appendfile transport entered
 search_open: pgsql "NULL"
 search_find: file="NULL"
-  key="select id from them where id='CALLER'" partial=-1 affix=NULL starflags=0
+  key="select id from them where id='ph10'" partial=-1 affix=NULL starflags=0
 LRU list:
 internal_search_find: file="NULL"
-  type=pgsql key="select id from them where id='CALLER'"
-database lookup required for select id from them where id='CALLER'
-PostgreSQL query: select id from them where id='CALLER'
-PGSQL new connection: host=localhost port= database=test user=CALLER
-lookup yielded: CALLER
+  type=pgsql key="select id from them where id='ph10'"
+database lookup required for select id from them where id='ph10'
+PostgreSQL query: select id from them where id='ph10'
+PGSQL new connection: host=localhost port=1223 database=test user=CALLER
+lookup yielded: ph10
 appendfile: mode=600 notify_comsat=0 quota=0 warning=0
-  file=TESTSUITE/test-mail/CALLER format=unix
+  file=TESTSUITE/test-mail/ph10 format=unix
   message_prefix=From ${if def:return_path{$return_path}{MAILER-DAEMON}} ${tod_bsdinbox}\n
   message_suffix=\n
   maildir_use_size_file=no
   locking by lockfile fcntl 
-lock name: TESTSUITE/test-mail/CALLER.lock
-hitch name: TESTSUITE/test-mail/CALLER.lock.test.ex.dddddddd.pppppppp
+lock name: TESTSUITE/test-mail/ph10.lock
+hitch name: TESTSUITE/test-mail/ph10.lock.test.ex.dddddddd.pppppppp
 lock file created
-mailbox TESTSUITE/test-mail/CALLER is locked
-writing to file TESTSUITE/test-mail/CALLER
+mailbox TESTSUITE/test-mail/ph10 is locked
+writing to file TESTSUITE/test-mail/ph10
 writing data block fd=dddd size=sss timeout=0
+cannot use sendfile for body: spoolfile not wireformat
 writing data block fd=dddd size=sss timeout=0
 writing data block fd=dddd size=sss timeout=0
 appendfile yields 0 with errno=dd more_errno=dd
 search_tidyup called
-close PGSQL connection: localhost/test/CALLER
+close PGSQL connection: localhost:1223/test/CALLER
 journalling CALLER@myhost.test.ex
 t1 transport returned OK for CALLER@myhost.test.ex
 post-process CALLER@myhost.test.ex (0)
@@ -409,31 +456,43 @@ changed uid/gid: post-delivery tidying
 set_process_info: pppp tidying up after delivering 10HmaX-0005vi-00
 Processing retry items
 Succeeded addresses:
-CALLER@myhost.test.ex: no retry items
+ CALLER@myhost.test.ex: no retry items
 Failed addresses:
 Deferred addresses:
 end of retry processing
+DSN: processing router : r1
+DSN: processing successful delivery address: CALLER@myhost.test.ex
+DSN: Sender_address: CALLER@myhost.test.ex
+DSN: orcpt: NULL  flags: 0
+DSN: envid: NULL  ret: 0
+DSN: Final recipient: CALLER@myhost.test.ex
+DSN: Remote SMTP server supports DSN: 0
+DSN: not sending DSN success message
 LOG: MAIN
   Completed
 end delivery of 10HmaX-0005vi-00
 search_tidyup called
 search_tidyup called
->>>>>>>>>>>>>>>> Exim pid=pppp terminating with rc=0 >>>>>>>>>>>>>>>>
+>>>>>>>>>>>>>>>> Exim pid=pppp (main) terminating with rc=0 >>>>>>>>>>>>>>>>
 search_tidyup called
->>>>>>>>>>>>>>>> Exim pid=pppp terminating with rc=0 >>>>>>>>>>>>>>>>
+>>>>>>>>>>>>>>>> Exim pid=pppp (main) terminating with rc=0 >>>>>>>>>>>>>>>>
 Exim version x.yz ....
 configuration file is TESTSUITE/test-config
 admin user
 search_open: pgsql "NULL"
 search_find: file="NULL"
-  key="select name from them where id='CALLER';" partial=-1 affix=NULL starflags=0
+  key="select name from them where id='ph10';" partial=-1 affix=NULL starflags=0
 LRU list:
 internal_search_find: file="NULL"
-  type=pgsql key="select name from them where id='CALLER';"
-database lookup required for select name from them where id='CALLER';
-PostgreSQL query: select name from them where id='CALLER';
-PGSQL new connection: socket=/tmp/.s.PGSQL.5432 database=test user=CALLER
+  type=pgsql key="select name from them where id='ph10';"
+database lookup required for select name from them where id='ph10';
+PostgreSQL query: select name from them where id='ph10';
+PGSQL new connection: socket=TESTSUITE/pgsql/.s.PGSQL.1223 database=test user=CALLER
 lookup yielded: Philip Hazel
 search_tidyup called
-close PGSQL connection: (/tmp/.s.PGSQL.5432)/test/CALLER
->>>>>>>>>>>>>>>> Exim pid=pppp terminating with rc=0 >>>>>>>>>>>>>>>>
+close PGSQL connection: (TESTSUITE/pgsql/.s.PGSQL.1223)/test/CALLER
+>>>>>>>>>>>>>>>> Exim pid=pppp (main: expansion test) terminating with rc=0 >>>>>>>>>>>>>>>>
+
+******** SERVER ********
+LOG:  redirecting log output to logging collector process
+HINT:  Future log output will appear in directory "pg_log".
diff --git a/test/stdout/2620 b/test/stdout/2620
new file mode 100644 (file)
index 0000000..668eca7
--- /dev/null
@@ -0,0 +1,66 @@
+The files belonging to this database system will be owned by user "CALLER".
+This user must also own the server process.
+
+The database cluster will be initialized with locale "C".
+The default database encoding has accordingly been set to "SQL_ASCII".
+The default text search configuration will be set to "english".
+
+Data page checksums are disabled.
+
+creating directory TESTSUITE/pgsql/data ... ok
+creating subdirectories ... ok
+selecting default max_connections ... 100
+selecting default shared_buffers ... 128MB
+selecting dynamic shared memory implementation ... posix
+creating configuration files ... ok
+running bootstrap script ... ok
+performing post-bootstrap initialization ... ok
+syncing data to disk ... ok
+
+Success. You can now start the database server using:
+
+    pg_ctl -D TESTSUITE/pgsql/data -l logfile start
+
+CREATE TABLE
+INSERT 0 1
+INSERT 0 1
+INSERT 0 1
+INSERT 0 1
+INSERT 0 1
+INSERT 0 1
+INSERT 0 1
+> Philip Hazel
+> Philip Hazel
+> 
+> 
+> id=nothing name="" 
+> 0
+> name="\"stquot" id=quote2 
+> name="before\r
+after" id=newline 
+> name="x      x" id=tab 
+> name='stquot id=quote1 
+> Failed: lookup of "servers=x:localhost; select name from them where id='ph10';" gave DEFER: PostgreSQL server "x" not found in pgsql_servers
+> Philip Hazel
+> Philip Hazel
+> Philip Hazel
+> x
+> Philip Hazel
+Aristotle
+> name="Philip Hazel" id=ph10 
+name=Aristotle id=aaaa 
+> 
+
+**** SMTP testing session as if from host 10.0.0.0
+**** but without any ident (RFC 1413) callback.
+**** This is not for real!
+
+220 myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000\r
+250 OK\r
+550 relay not permitted\r
+550 relay not permitted\r
+221 myhost.test.ex closing connection\r
+> Philip Hazel
+> 
+waiting for server to shut down.... done
+server stopped
diff --git a/test/stdout/9200 b/test/stdout/9200
deleted file mode 100644 (file)
index d2ec96f..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-> Philip Hazel
-> Philip Hazel
-> 
-> 
-> id=nothing name="" 
-> 0
-> name="\"stquot" id=quote2 
-> name="before
-after" id=newline 
-> name="x      x" id=tab 
-> name='stquot id=quote1 
-> Failed: lookup of "servers=x:localhost; select name from them where id='CALLER';" gave DEFER: PostgreSQL server "x" not found in pgsql_servers
-> Philip Hazel
-> Philip Hazel
-> Philip Hazel
-> 
-
-**** SMTP testing session as if from host 10.0.0.0
-**** but without any ident (RFC 1413) callback.
-**** This is not for real!
-
-220 myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000\r
-250 OK\r
-550 relay not permitted\r
-550 relay not permitted\r
-221 myhost.test.ex closing connection\r
-> Philip Hazel
->