summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <holyfoot/hf@hfmain.(none)>2007-11-30 22:28:23 +0400
committerunknown <holyfoot/hf@hfmain.(none)>2007-11-30 22:28:23 +0400
commit11c17294216119ed521003226888a6f7199671d0 (patch)
tree6ad525c112c8130f6217e4ebfccff15bd7e1d227
parent1d062682f5098ea5c30b9b3fef844195790a095e (diff)
parent104bba773b6be5d9b77258b5a328ee1fff7604e3 (diff)
downloadmariadb-git-11c17294216119ed521003226888a6f7199671d0.tar.gz
Merge mysql.com:/home/hf/work/32624/my50-32624
into mysql.com:/home/hf/work/mrg/my50-mrg
-rw-r--r--mysql-test/r/federated.result111
-rw-r--r--mysql-test/t/federated.test31
-rw-r--r--sql/ha_federated.cc18
-rw-r--r--sql/ha_federated.h1
4 files changed, 161 insertions, 0 deletions
diff --git a/mysql-test/r/federated.result b/mysql-test/r/federated.result
index 2e7d0ddcea7..a005db4deac 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 cc66a6ab4bc..d4f22650a32 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 d7f2309657b..ac1e0962ffb 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 dc4f976c578..349c596ae5a 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,