mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Merge bk@192.168.21.1:mysql-5.0-opt
into mysql.com:/home/hf/work/mrg/my50-mrg tests/mysql_client_test.c: Auto merged
This commit is contained in:
@ -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.
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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)
|
||||
|
@ -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,
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user