diff --git a/lib/modules/Sql.pmod/pgsql.h b/lib/modules/Sql.pmod/pgsql.h
index 95f2b662d9a0483810da9443dfc8255099936cab..67d8301899df71c846370c9b4979a3fe6c8750d9 100644
--- a/lib/modules/Sql.pmod/pgsql.h
+++ b/lib/modules/Sql.pmod/pgsql.h
@@ -10,6 +10,9 @@
 //#define PG_DEBUGRACE	1
 
 //#define PG_STATS	1	    // Collect extra usage statistics
+#define PG_DEBUGHISTORY	     0	    // If >0, it is the number of records
+				    // we keep history on the connection
+				    // with the database
 #define PG_DEADLOCK_SENTINEL 0	    // If >0, defines the number seconds
 				    // a lock can be held before the deadlock
 				    // report is being dumped to stderr
diff --git a/lib/modules/Sql.pmod/pgsql_util.pmod b/lib/modules/Sql.pmod/pgsql_util.pmod
index 361887e077610e4468dfb312a5f8a0c10aef8c1e..fdd19aa21cadf47c63bb99ee4588838a5ce97d14 100644
--- a/lib/modules/Sql.pmod/pgsql_util.pmod
+++ b/lib/modules/Sql.pmod/pgsql_util.pmod
@@ -345,6 +345,22 @@ class conxiin {
   final int procmsg;
   private int didreadcb;
 
+#if PG_DEBUGHISTORY > 0
+  final array history = ({});
+
+  final int(-1..) input_from(Stdio.Stream stm, void|int(0..) nbytes) {
+    int oldsize = sizeof(this);
+    int ret = i::input_from(stm, nbytes);
+    if (ret) {
+      Stdio.Buffer tb = Stdio.Buffer(this);
+      tb->consume(oldsize);
+      history += ({"<<"+tb->read(ret)});
+      history = history[<PG_DEBUGHISTORY - 1 ..];
+    }
+    return ret;
+  }
+#endif
+
   protected final bool range_error(int howmuch) {
 #ifdef PG_DEBUG
     if (howmuch < 0) {
@@ -426,6 +442,18 @@ class conxion {
   final int queueinidx = -1;
 #endif
 
+#if PG_DEBUGHISTORY > 0
+  final int(-1..) output_to(Stdio.Stream stm, void|int(0..) nbytes) {
+    Stdio.Buffer tb = Stdio.Buffer(this);
+    int ret = o::output_to(stm, nbytes);
+    if (ret) {
+      i->history += ({">>" + tb->read(ret)});
+      i->history = i->history[<PG_DEBUGHISTORY - 1 ..];
+    }
+    return ret;
+  }
+#endif
+
   private inline void queueup(sql_result portal) {
     qportals->write(portal); portal->_synctransact = synctransact;
     PD("%d>%O %d %d Queue portal %d bytes\n", socket->query_fd(),
@@ -769,10 +797,17 @@ class sql_result {
           catch(fd = c->socket->query_fd());
         res = sprintf("sql_result state: %d numrows: %d eof: %d inflight: %d\n"
                     "query: %O\n"
+#if PG_DEBUGHISTORY > 0
+                    "history: %O\n"
+#endif
                     "fd: %O portalname: %O  datarows: %d"
                     "  synctransact: %d laststatus: %s\n",
                     _state, index, eoffound, inflight,
-                    qalreadyprinted == this ? "..." : _query, fd, _portalname,
+                    qalreadyprinted == this ? "..." : _query,
+#if PG_DEBUGHISTORY > 0
+                    qalreadyprinted == this ? 0 : c && c->i->history,
+#endif
+		    fd, _portalname,
                     datarowtypes && sizeof(datarowtypes), _synctransact,
                     statuscmdcomplete
                     || (_unnamedstatementkey ? "*parsing*" : ""));