diff options
author | unknown <holyfoot/hf@hfmain.(none)> | 2007-12-01 00:46:44 +0400 |
---|---|---|
committer | unknown <holyfoot/hf@hfmain.(none)> | 2007-12-01 00:46:44 +0400 |
commit | 51f5ac6b29a7823836695d0f2dcfd4e3ef89bdb2 (patch) | |
tree | fc471579f6612b624f72147feb84761b29806c2b | |
parent | 65b77b9df6c0cb53a7b77e83d9e3a74d5c07972f (diff) | |
parent | 4100e3e4c2408cb1f28823842db8d8d448aebe4b (diff) | |
download | mariadb-git-51f5ac6b29a7823836695d0f2dcfd4e3ef89bdb2.tar.gz |
Merge mysql.com:/home/hf/work/mrg/my50-mrg
into mysql.com:/home/hf/work/mrg/my51-mrg
sql/mysqld.cc:
Auto merged
sql/protocol.cc:
Auto merged
storage/federated/ha_federated.cc:
Auto merged
tests/mysql_client_test.c:
Auto merged
include/mysql_com.h:
merging
libmysqld/lib_sql.cc:
merging
mysql-test/r/federated.result:
merging
mysql-test/t/federated.test:
merging
storage/federated/ha_federated.h:
mergin
-rw-r--r-- | include/mysql_com.h | 11 | ||||
-rw-r--r-- | libmysqld/lib_sql.cc | 2 | ||||
-rw-r--r-- | mysql-test/r/federated.result | 111 | ||||
-rw-r--r-- | mysql-test/t/federated.test | 31 | ||||
-rw-r--r-- | sql/mysqld.cc | 20 | ||||
-rw-r--r-- | sql/protocol.cc | 5 | ||||
-rw-r--r-- | storage/federated/ha_federated.cc | 18 | ||||
-rw-r--r-- | storage/federated/ha_federated.h | 1 | ||||
-rw-r--r-- | tests/mysql_client_test.c | 14 |
9 files changed, 201 insertions, 12 deletions
diff --git a/include/mysql_com.h b/include/mysql_com.h index d850c149bde..aef7c7c0584 100644 --- a/include/mysql_com.h +++ b/include/mysql_com.h @@ -397,12 +397,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 */ - /* 0 if result is independent of arguments */ - my_bool const_item; + 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 */ void *extension; } UDF_INIT; /* diff --git a/libmysqld/lib_sql.cc b/libmysqld/lib_sql.cc index f5bfe97a38e..28f6d8d354f 100644 --- a/libmysqld/lib_sql.cc +++ b/libmysqld/lib_sql.cc @@ -64,6 +64,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(data, MYF(0)); } @@ -1029,6 +1030,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 8f1fe20ea3b..08270241ff3 100644 --- a/mysql-test/r/federated.result +++ b/mysql-test/r/federated.result @@ -1956,6 +1956,117 @@ a DROP TABLE federated.t1; DROP TABLE federated.t1; End of 5.1 tests +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 90f1fa36bb4..76cb5fd4793 100644 --- a/mysql-test/t/federated.test +++ b/mysql-test/t/federated.test @@ -1764,6 +1764,35 @@ DROP TABLE federated.t1; connection slave; DROP TABLE federated.t1; ---echo End of 5.1 tests +# +# 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; + +--echo End of 5.1 tests source include/federated_cleanup.inc; diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 752826662e4..79563285054 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -174,7 +174,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__) @@ -185,8 +185,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 */ @@ -3244,7 +3258,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 bf8faec006a..c6f264c4b20 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/storage/federated/ha_federated.cc b/storage/federated/ha_federated.cc index 8673847fcac..091a26f6f36 100644 --- a/storage/federated/ha_federated.cc +++ b/storage/federated/ha_federated.cc @@ -2408,6 +2408,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, bool sorted) diff --git a/storage/federated/ha_federated.h b/storage/federated/ha_federated.h index 40bcf9cc402..1974f9936fc 100644 --- a/storage/federated/ha_federated.h +++ b/storage/federated/ha_federated.h @@ -210,6 +210,7 @@ public: int update_row(const uchar *old_data, uchar *new_data); int delete_row(const uchar *buf); int index_init(uint keynr, bool sorted); + ha_rows estimate_rows_upper_bound(); int index_read(uchar *buf, const uchar *key, uint key_len, enum ha_rkey_function find_flag); int index_read_idx(uchar *buf, uint idx, const uchar *key, diff --git a/tests/mysql_client_test.c b/tests/mysql_client_test.c index 08805c4bcc1..409d67faf90 100644 --- a/tests/mysql_client_test.c +++ b/tests/mysql_client_test.c @@ -5914,6 +5914,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); } |