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 @@ int ha_federated::index_read_idx_with_result_set(byte *buf, uint index,
 }
 
 
+/*
+  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 @@ class ha_federated: public handler
   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,