diff --git a/include/mysql_com.h b/include/mysql_com.h
index fc03d98194b639d0c1ad698604f3328fd9faf028..94b34c1c3f07f338fd2d52a11b812cf6e53c3d43 100644
--- a/include/mysql_com.h
+++ b/include/mysql_com.h
@@ -387,11 +387,11 @@ typedef struct st_udf_args
 
 typedef struct st_udf_init
 {
-  my_bool maybe_null;			/* 1 if function can return NULL */
-  unsigned int decimals;		/* for real functions */
-  unsigned long max_length;		/* For string functions */
-  char	  *ptr;				/* free pointer for function data */
-  my_bool const_item;			/* 0 if result is independent of arguments */
+  my_bool maybe_null;          /* 1 if function can return NULL */
+  unsigned int decimals;       /* for real functions */
+  unsigned long max_length;    /* For string functions */
+  char *ptr;                   /* free pointer for function data */
+  my_bool const_item;          /* 1 if function always returns the same value */
 } UDF_INIT;
 /* 
   TODO: add a notion for determinism of the UDF. 
diff --git a/libmysqld/lib_sql.cc b/libmysqld/lib_sql.cc
index 7ac663480c897196b21dc5bc06778fc09a5dd982..ce692169a5fd3f751130a30598cd9dc104af947e 100644
--- a/libmysqld/lib_sql.cc
+++ b/libmysqld/lib_sql.cc
@@ -73,6 +73,7 @@ void embedded_get_error(MYSQL *mysql, MYSQL_DATA *data)
   net->last_errno= ei->last_errno;
   strmake(net->last_error, ei->info, sizeof(net->last_error));
   memcpy(net->sqlstate, ei->sqlstate, sizeof(net->sqlstate));
+  mysql->server_status= ei->server_status;
   my_free((gptr) data, MYF(0));
 }
 
@@ -1027,6 +1028,7 @@ void net_send_error_packet(THD *thd, uint sql_errno, const char *err)
   ei->last_errno= sql_errno;
   strmake(ei->info, err, sizeof(ei->info)-1);
   strmov(ei->sqlstate, mysql_errno_to_sqlstate(sql_errno));
+  ei->server_status= thd->server_status;
   thd->cur_data= 0;
 }
 
diff --git a/mysql-test/r/federated.result b/mysql-test/r/federated.result
index 2e7d0ddcea77f89d37f4525a14f7779a44247be2..a005db4deac0ea5174d8392059c8a15b6d917532 100644
--- a/mysql-test/r/federated.result
+++ b/mysql-test/r/federated.result
@@ -1934,6 +1934,117 @@ select * from federated.t2;
 a
 1
 drop table federated.t1, federated.t2;
+create table t1 (a varchar(256));
+drop view if exists v1;
+create view v1 as select a from t1;
+create table t1
+(a varchar(256)) engine=federated
+connection='mysql://root@127.0.0.1:SLAVE_PORT/test/v1';
+select 1 from t1 order by a;
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+drop table t1;
+drop table t1;
+drop view v1;
 DROP TABLE IF EXISTS federated.t1;
 DROP DATABASE IF EXISTS federated;
 DROP TABLE IF EXISTS federated.t1;
diff --git a/mysql-test/t/federated.test b/mysql-test/t/federated.test
index cc66a6ab4bcade44e1317a59fd218eeed801046f..d4f22650a32132f0c56bfe790a10839b0a1327ea 100644
--- a/mysql-test/t/federated.test
+++ b/mysql-test/t/federated.test
@@ -1686,4 +1686,35 @@ insert into federated.t1 (a) values (1);
 select * from federated.t2;
 drop table federated.t1, federated.t2;
 
+#
+# Bug #32374 crash with filesort when selecting from federated table and view
+#
+connection slave;
+create table t1 (a varchar(256));
+--disable_warnings
+drop view if exists v1;
+--enable_warnings
+create view v1 as select a from t1;
+--disable_query_log
+let $n= 100;
+while ($n)
+{
+  insert into t1 values (repeat('a',200));
+  dec $n;
+}
+--enable_query_log
+
+connection master;
+--replace_result $SLAVE_MYPORT SLAVE_PORT
+eval create table t1
+  (a varchar(256)) engine=federated
+  connection='mysql://root@127.0.0.1:$SLAVE_MYPORT/test/v1';
+
+select 1 from t1 order by a;
+drop table t1;
+connection slave;
+drop table t1;
+drop view v1;
+
+
 source include/federated_cleanup.inc;
diff --git a/sql/ha_federated.cc b/sql/ha_federated.cc
index d7f2309657b3a9d81ec10d33ac44e05edba07030..ac1e0962ffbb177a343f09ae630f8f45d73d1ad0 100644
--- a/sql/ha_federated.cc
+++ b/sql/ha_federated.cc
@@ -2166,6 +2166,24 @@ error:
 }
 
 
+/*
+  This method is used exlusevely by filesort() to check if we
+  can create sorting buffers of necessary size.
+  If the handler returns more records that it declares
+  here server can just crash on filesort().
+  We cannot guarantee that's not going to happen with
+  the FEDERATED engine, as we have records==0 always if the
+  client is a VIEW, and for the table the number of
+  records can inpredictably change during execution.
+  So we return maximum possible value here.
+*/
+
+ha_rows ha_federated::estimate_rows_upper_bound()
+{
+  return HA_POS_ERROR;
+}
+
+
 /* Initialized at each key walk (called multiple times unlike rnd_init()) */
 
 int ha_federated::index_init(uint keynr)
diff --git a/sql/ha_federated.h b/sql/ha_federated.h
index dc4f976c5786626c07159deeaf8769ef01bad984..349c596ae5a8d5024ccc2bfb75d20bcf254c69bf 100644
--- a/sql/ha_federated.h
+++ b/sql/ha_federated.h
@@ -277,6 +277,7 @@ public:
   int update_row(const byte *old_data, byte *new_data);
   int delete_row(const byte *buf);
   int index_init(uint keynr);
+  ha_rows estimate_rows_upper_bound();
   int index_read(byte *buf, const byte *key,
                  uint key_len, enum ha_rkey_function find_flag);
   int index_read_idx(byte *buf, uint idx, const byte *key,
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index 4c459d34a55b73638ee322aed39d75bf4920075a..4e06a8d1551c97d2705ec16138cceb041d549544 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -184,7 +184,7 @@ typedef fp_except fp_except_t;
      this on freebsd
   */
 
-inline void reset_floating_point_exceptions()
+inline void set_proper_floating_point_mode()
 {
   /* Don't fall for overflow, underflow,divide-by-zero or loss of precision */
 #if defined(__i386__)
@@ -195,8 +195,22 @@ inline void reset_floating_point_exceptions()
 	     FP_X_IMP));
 #endif
 }
+#elif defined(__sgi)
+/* for IRIX to use set_fpc_csr() */
+#include <sys/fpu.h>
+
+inline void set_proper_floating_point_mode()
+{
+  /* Enable denormalized DOUBLE values support for IRIX */
+  {
+    union fpc_csr n;
+    n.fc_word = get_fpc_csr();
+    n.fc_struct.flush = 0;
+    set_fpc_csr(n.fc_word);
+  }
+}
 #else
-#define reset_floating_point_exceptions()
+#define set_proper_floating_point_mode()
 #endif /* __FreeBSD__ && HAVE_IEEEFP_H */
 
 } /* cplusplus */
@@ -3125,7 +3139,7 @@ static int init_server_components()
   query_cache_init();
   query_cache_resize(query_cache_size);
   randominit(&sql_rand,(ulong) server_start_time,(ulong) server_start_time/2);
-  reset_floating_point_exceptions();
+  set_proper_floating_point_mode();
   init_thr_lock();
 #ifdef HAVE_REPLICATION
   init_slave_list();
diff --git a/sql/protocol.cc b/sql/protocol.cc
index 2bdbe83eea1c72d62b711f8e749133e88e31f9aa..ac562a9f5ab7f8ab1f712097849f186b6b6ecb12 100644
--- a/sql/protocol.cc
+++ b/sql/protocol.cc
@@ -110,13 +110,14 @@ void net_send_error(THD *thd, uint sql_errno, const char *err)
     push_warning(thd, MYSQL_ERROR::WARN_LEVEL_ERROR, sql_errno, err);
   }
 
+  /* Abort multi-result sets */
+  thd->server_status&= ~SERVER_MORE_RESULTS_EXISTS;
+
   net_send_error_packet(thd, sql_errno, err);
 
   thd->is_fatal_error=0;			// Error message is given
   thd->net.report_error= 0;
 
-  /* Abort multi-result sets */
-  thd->server_status&= ~SERVER_MORE_RESULTS_EXISTS;
   DBUG_VOID_RETURN;
 }
 
diff --git a/tests/mysql_client_test.c b/tests/mysql_client_test.c
index c0b8bd610f463d024ab5b1c92b36ca3856ef5014..9cc2af25529ed95aed8814c2ee1b748569380b4f 100644
--- a/tests/mysql_client_test.c
+++ b/tests/mysql_client_test.c
@@ -5643,6 +5643,20 @@ DROP TABLE IF EXISTS test_multi_tab";
   (void) my_process_result_set(result);
   mysql_free_result(result);
 
+  /*
+    Check if errors in one of the queries handled properly.
+  */
+  rc= mysql_query(mysql_local, "select 1; select * from not_existing_table");
+  myquery(rc);
+  result= mysql_store_result(mysql_local);
+  mysql_free_result(result);
+
+  rc= mysql_next_result(mysql_local);
+  DIE_UNLESS(rc > 0);
+
+  rc= mysql_next_result(mysql_local);
+  DIE_UNLESS(rc < 0);
+
   mysql_close(mysql_local);
 }