diff --git a/lib/modules/Sql.pmod/rsql.pike b/lib/modules/Sql.pmod/rsql.pike
index aaedb0a2a5962af7903f9c232c18a4888fb633cd..f2c1b9b7989fa74e15eabeaed5f1d848f3ce10cd 100644
--- a/lib/modules/Sql.pmod/rsql.pike
+++ b/lib/modules/Sql.pmod/rsql.pike
@@ -187,59 +187,82 @@ string quote(string s)
   return do_request('q');
 }
 
-int|object big_query(object|string q, mapping(string|int:mixed)|void bindings)
+protected class RemoteResult(protected function(int,mixed:mixed) do_request,
+			     protected mixed qid)
 {
-  if(bindings)
-    q=.sql_util.emulate_bindings(q,bindings,this);
+  void destroy()
+  {
+    do_request('Z', qid);
+  }
 
-  mixed qid = do_request('Q', q);
-  return qid && class {
+  int|array(string|int) fetch_row()
+  {
+    return do_request('R', qid);
+  }
 
-    protected function(int,mixed:mixed) do_request;
-    protected mixed qid;
+  array(mapping(string:mixed)) fetch_fields()
+  {
+    return do_request('F', qid);
+  }
 
-    void destroy()
-    {
-      do_request('Z', qid);
-    }
+  int num_rows()
+  {
+    return do_request('N', qid);
+  }
 
-    int|array(string|int) fetch_row()
-    {
-      return do_request('R', qid);
-    }
+  int num_fields()
+  {
+    return do_request('n', qid);
+  }
 
-    array(mapping(string:mixed)) fetch_fields()
-    {
-      return do_request('F', qid);
-    }
+  int eof()
+  {
+    return do_request('e', qid);
+  }
 
-    int num_rows()
-    {
-      return do_request('N', qid);
-    }
+  void seek(int skip)
+  {
+    do_request('S', ({qid,skip}));
+  }
+}
 
-    int num_fields()
-    {
-      return do_request('n', qid);
-    }
+int|object big_query(object|string q, mapping(string|int:mixed)|void bindings)
+{
+  if(bindings)
+    q=.sql_util.emulate_bindings(q,bindings,this);
 
-    int eof()
-    {
-      return do_request('e', qid);
-    }
+  mixed qid = do_request('Q', q);
+  return qid && RemoteResult(do_request, qid);
+}
 
-    void seek(int skip)
-    {
-      do_request('S', ({qid,skip}));
-    }
+int|object big_typed_query(object|string q,
+			   mapping(string|int:mixed)|void bindings)
+{
+  if(bindings)
+    q=.sql_util.emulate_bindings(q,bindings,this);
 
-    void create(function(int,mixed:mixed) d_r, mixed i)
-    {
-      do_request = d_r;
-      qid = i;
-    }
+  mixed qid = do_request('Q', ({ "big_typed_query", q }));
+  return qid && RemoteResult(do_request, qid);
+}
+
+int|object streaming_query(object|string q,
+			   mapping(string|int:mixed)|void bindings)
+{
+  if(bindings)
+    q=.sql_util.emulate_bindings(q,bindings,this);
+
+  mixed qid = do_request('Q', ({ "streaming_query", q }));
+  return qid && RemoteResult(do_request, qid);
+}
+
+int|object streaming_typed_query(object|string q,
+				 mapping(string|int:mixed)|void bindings)
+{
+  if(bindings)
+    q=.sql_util.emulate_bindings(q,bindings,this);
 
-  }(do_request, qid);
+  mixed qid = do_request('Q', ({ "streaming_typed_query", q }));
+  return qid && RemoteResult(do_request, qid);
 }
 
 array(mapping(string:mixed)) query(mixed ... args)
diff --git a/lib/modules/Tools.pmod/Standalone.pmod/rsqld.pike b/lib/modules/Tools.pmod/Standalone.pmod/rsqld.pike
index b8d00ecef5dde1ff1b7f8f10c702946acc78ac03..55d55a3ae934c74f277bcffe0ac8461d722be6f5 100644
--- a/lib/modules/Tools.pmod/Standalone.pmod/rsqld.pike
+++ b/lib/modules/Tools.pmod/Standalone.pmod/rsqld.pike
@@ -212,9 +212,14 @@ class Connection
     return sprintf("%4c%4c", qbase, qid++);
   }
 
-  protected string cmd_bigquery(string q)
+  protected string cmd_bigquery(string|array(string) q)
   {
-    object res = sqlobj->big_query(q);
+    object res;
+    if (arrayp(q)) {
+      res = predef::`->(sqlobj, q[0])(@q[1..]);
+    } else {
+      res = sqlobj->big_query(q);
+    }
     if(!res)
       return 0;
     string qid = make_id();