diff --git a/src/modules/mysql/mysql.c b/src/modules/mysql/mysql.c
index bc92ee3fd1813ae2d7895ffd76d08268a2081f92..06e898be5eb3c2ba6fd01687fce3b6bec0bff7f9 100644
--- a/src/modules/mysql/mysql.c
+++ b/src/modules/mysql/mysql.c
@@ -1,5 +1,5 @@
 /*
- * $Id: mysql.c,v 1.5 1997/01/08 01:49:25 grubba Exp $
+ * $Id: mysql.c,v 1.6 1997/01/08 13:19:19 grubba Exp $
  *
  * SQL database functionality for Pike
  *
@@ -59,7 +59,7 @@ typedef struct dynamic_buffer_s dynamic_buffer;
  * Globals
  */
 
-RCSID("$Id: mysql.c,v 1.5 1997/01/08 01:49:25 grubba Exp $");
+RCSID("$Id: mysql.c,v 1.6 1997/01/08 13:19:19 grubba Exp $");
 
 struct program *mysql_program = NULL;
 
@@ -100,13 +100,14 @@ static void exit_mysql_struct(struct object *o)
  * Methods
  */
 
-/* void create(string|void host, string|void database, string|void password) */
+/* void create(string|void host, string|void database, string|void user, string|void password) */
 static void f_create(INT32 args)
 {
   MYSQL *mysql = &PIKE_MYSQL->mysql;
   MYSQL *socket;
   char *host = NULL;
   char *database = NULL;
+  char *user = NULL;
   char *password = NULL;
 
   if (args >= 1) {
@@ -121,7 +122,7 @@ static void f_create(INT32 args)
       if (sp[1-args].type != T_STRING) {
 	error("Bad argument 2 to mysql()\n");
       }
-      if (sp[-args].u.string->len) {
+      if (sp[1-args].u.string->len) {
 	database = sp[1-args].u.string->str;
       }
 
@@ -129,8 +130,17 @@ static void f_create(INT32 args)
 	if (sp[2-args].type != T_STRING) {
 	  error("Bad argument 3 to mysql()\n");
 	}
-	if (sp[-args].u.string->len) {
-	  password = sp[2-args].u.string->str;
+	if (sp[2-args].u.string->len) {
+	  user = sp[2-args].u.string->str;
+	}
+
+	if (args >= 4) {
+	  if (sp[3-args].type != T_STRING) {
+	    error("Bad argument 4 to mysql()\n");
+	  }
+	  if (sp[3-args].u.string->len) {
+	    password = sp[3-args].u.string->str;
+	  }
 	}
       }
     }
@@ -138,7 +148,7 @@ static void f_create(INT32 args)
 
   THREADS_ALLOW();
 
-  socket = mysql_connect(mysql, host, 0, password);
+  socket = mysql_connect(mysql, host, user, password);
 
   THREADS_DISALLOW();
 
@@ -255,16 +265,23 @@ static void f_query(INT32 args)
 
   THREADS_DISALLOW();
 
+  pop_n_elems(args);
+
   if (!(PIKE_MYSQL->last_result = result)) {
-    error("mysql->query(): Couldn't create result for query\n");
-  }
+    if (mysql_num_fields(socket)) {
+      error("mysql->query(): Couldn't create result for query\n");
+    }
+    /* query was INSERT or similar - return 0 */
 
-  pop_n_elems(args);
+    push_int(0);
+  } else {
+    /* Return the result-object */
 
-  push_object(fp->current_object);
-  fp->current_object->refs++;
+    push_object(fp->current_object);
+    fp->current_object->refs++;
 
-  push_object(clone(mysql_result_program, 1));
+    push_object(clone(mysql_result_program, 1));
+  }
 }
 
 /* void create_db(string database) */
@@ -408,35 +425,17 @@ static void f_server_info(INT32 args)
 /* string host_info() */
 static void f_host_info(INT32 args)
 {
-  MYSQL *socket = PIKE_MYSQL->socket;
-  char *info;
-
   pop_n_elems(args);
 
-  THREADS_ALLOW();
-
-  info = mysql_get_host_info(socket);
-
-  THREADS_DISALLOW();
-
-  push_text(info);
+  push_text(mysql_get_host_info(PIKE_MYSQL->socket));
 }
 
 /* int protocol_info() */
 static void f_protocol_info(INT32 args)
 {
-  MYSQL *socket = PIKE_MYSQL->socket;
-  int proto;
-
   pop_n_elems(args);
 
-  THREADS_ALLOW();
-
-  proto = mysql_get_proto_info(socket);
-
-  THREADS_DISALLOW();
-
-  push_int(proto);
+  push_int(mysql_get_proto_info(PIKE_MYSQL->socket));
 }
 
 /* object(mysql_res) list_dbs(void|string wild) */
@@ -617,11 +616,11 @@ void init_mysql_programs(void)
   add_storage(sizeof(struct precompiled_mysql));
 
   add_function("error", f_error, "function(void:string)", OPT_EXTERNAL_DEPEND);
-  add_function("create", f_create, "function(string|void, string|void, string|void:void)", OPT_SIDE_EFFECT);
+  add_function("create", f_create, "function(string|void, string|void, string|void:void, string|void)", OPT_SIDE_EFFECT);
   add_function("affected_rows", f_affected_rows, "function(void:int)", OPT_EXTERNAL_DEPEND);
   add_function("insert_id", f_insert_id, "function(void:int)", OPT_EXTERNAL_DEPEND);
   add_function("select_db", f_select_db, "function(string:void)", OPT_SIDE_EFFECT);
-  add_function("query", f_query, "function(string:object)", OPT_EXTERNAL_DEPEND);
+  add_function("query", f_query, "function(string:int|object)", OPT_EXTERNAL_DEPEND);
   add_function("create_db", f_create_db, "function(string:void)", OPT_SIDE_EFFECT);
   add_function("drop_db", f_drop_db, "function(string:void)", OPT_SIDE_EFFECT);
   add_function("shutdown", f_shutdown, "function(void:void)", OPT_SIDE_EFFECT);