mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
Merge mysql.com:/opt/local/work/mysql-4.1-root
into mysql.com:/opt/local/work/mysql-5.0-root mysql-test/r/ndb_alter_table.result: Auto merged mysql-test/r/ndb_basic.result: Auto merged mysql-test/t/select.test: Auto merged sql/handler.cc: Auto merged sql/mysql_priv.h: Auto merged sql/table.cc: Auto merged vio/vio.c: Auto merged vio/viossl.c: Auto merged include/my_base.h: Manual merge. mysql-test/r/ps.result: Manual merge. mysql-test/r/select.result: Manual merge. mysql-test/t/ndb_alter_table.test: Manual merge. mysql-test/t/ndb_basic.test: Manual merge. mysql-test/t/ps.test: Manual merge. sql-common/client.c: k sql/ha_ndbcluster.cc: Manual merge. sql/item.cc: Manual merge. sql/sql_table.cc: Manual merge.
This commit is contained in:
@ -248,7 +248,7 @@ enum ha_base_keytype {
|
|||||||
#define HA_OPTION_CHECKSUM 32
|
#define HA_OPTION_CHECKSUM 32
|
||||||
#define HA_OPTION_DELAY_KEY_WRITE 64
|
#define HA_OPTION_DELAY_KEY_WRITE 64
|
||||||
#define HA_OPTION_NO_PACK_KEYS 128 /* Reserved for MySQL */
|
#define HA_OPTION_NO_PACK_KEYS 128 /* Reserved for MySQL */
|
||||||
#define HA_OPTION_CREATE_FROM_ENGINE 256
|
#define HA_OPTION_CREATE_FROM_ENGINE 256
|
||||||
#define HA_OPTION_TEMP_COMPRESS_RECORD ((uint) 16384) /* set by isamchk */
|
#define HA_OPTION_TEMP_COMPRESS_RECORD ((uint) 16384) /* set by isamchk */
|
||||||
#define HA_OPTION_READ_ONLY_DATA ((uint) 32768) /* Set by isamchk */
|
#define HA_OPTION_READ_ONLY_DATA ((uint) 32768) /* Set by isamchk */
|
||||||
|
|
||||||
|
@ -179,7 +179,7 @@ a b c
|
|||||||
2 two two
|
2 two two
|
||||||
alter table t1 drop index c;
|
alter table t1 drop index c;
|
||||||
select * from t1 where b = 'two';
|
select * from t1 where b = 'two';
|
||||||
ERROR HY000: Table definition has changed, please retry transaction
|
ERROR HY000: Can't lock file (errno: 241)
|
||||||
select * from t1 where b = 'two';
|
select * from t1 where b = 'two';
|
||||||
a b c
|
a b c
|
||||||
2 two two
|
2 two two
|
||||||
|
@ -153,7 +153,7 @@ connection server1;
|
|||||||
alter table t1 drop index c;
|
alter table t1 drop index c;
|
||||||
connection server2;
|
connection server2;
|
||||||
# This should fail since index information is not automatically refreshed
|
# This should fail since index information is not automatically refreshed
|
||||||
--error 1412
|
--error 1015
|
||||||
select * from t1 where b = 'two';
|
select * from t1 where b = 'two';
|
||||||
select * from t1 where b = 'two';
|
select * from t1 where b = 'two';
|
||||||
connection server1;
|
connection server1;
|
||||||
|
@ -606,6 +606,14 @@ select * from t1 order by counter;
|
|||||||
|
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# BUG#14514 Creating table with packed key fails silently
|
||||||
|
#
|
||||||
|
|
||||||
|
CREATE TABLE t1 ( b INT ) PACK_KEYS = 0 ENGINE = ndb;
|
||||||
|
select * from t1;
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
# End of 4.1 tests
|
# End of 4.1 tests
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -615,12 +623,3 @@ create table atablewithareallylongandirritatingname (a int);
|
|||||||
insert into atablewithareallylongandirritatingname values (2);
|
insert into atablewithareallylongandirritatingname values (2);
|
||||||
select * from atablewithareallylongandirritatingname;
|
select * from atablewithareallylongandirritatingname;
|
||||||
drop table atablewithareallylongandirritatingname;
|
drop table atablewithareallylongandirritatingname;
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# BUG#14514
|
|
||||||
#
|
|
||||||
|
|
||||||
CREATE TABLE t1 ( b INT ) PACK_KEYS = 0 ENGINE = ndb;
|
|
||||||
select * from t1;
|
|
||||||
drop table t1;
|
|
||||||
|
@ -842,4 +842,32 @@ set @@tx_isolation=default;
|
|||||||
execute stmt;
|
execute stmt;
|
||||||
deallocate prepare stmt;
|
deallocate prepare stmt;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug#14410 "Crash in Enum or Set type in CREATE TABLE and PS/SP"
|
||||||
|
#
|
||||||
|
# Part I. Make sure the typelib for ENUM is created in the statement memory
|
||||||
|
# root.
|
||||||
|
prepare stmt from "create temporary table t1 (letter enum('','a','b','c')
|
||||||
|
not null)";
|
||||||
|
execute stmt;
|
||||||
|
drop table t1;
|
||||||
|
execute stmt;
|
||||||
|
drop table t1;
|
||||||
|
execute stmt;
|
||||||
|
drop table t1;
|
||||||
|
# Part II. Make sure that when the default value is converted to UTF-8,
|
||||||
|
# the new item is # created in the statement memory root.
|
||||||
|
set names latin1;
|
||||||
|
prepare stmt from "create table t1 (a enum('test') default 'test')
|
||||||
|
character set utf8";
|
||||||
|
execute stmt;
|
||||||
|
drop table t1;
|
||||||
|
execute stmt;
|
||||||
|
drop table t1;
|
||||||
|
execute stmt;
|
||||||
|
drop table t1;
|
||||||
|
# Cleanup
|
||||||
|
set names default;
|
||||||
|
deallocate prepare stmt;
|
||||||
|
|
||||||
# End of 4.1 tests
|
# End of 4.1 tests
|
||||||
|
@ -2253,6 +2253,17 @@ insert into t1 values (1,1);
|
|||||||
insert into t2 values (1,1),(1,2);
|
insert into t2 values (1,1),(1,2);
|
||||||
select distinct count(f2) >0 from t1 left join t2 on f1=f3 group by f1;
|
select distinct count(f2) >0 from t1 left join t2 on f1=f3 group by f1;
|
||||||
drop table t1,t2;
|
drop table t1,t2;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug #14482 Server crash when subselecting from the same table
|
||||||
|
#
|
||||||
|
create table t1 (f1 int,f2 int);
|
||||||
|
insert into t1 values(1,1);
|
||||||
|
create table t2 (f3 int, f4 int, primary key(f3,f4));
|
||||||
|
insert into t2 values(1,1);
|
||||||
|
select * from t1 where f1 in (select f3 from t2 where (f3,f4)= (select f3,f4 from t2));
|
||||||
|
drop table t1,t2;
|
||||||
|
|
||||||
# End of 4.1 tests
|
# End of 4.1 tests
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -1495,12 +1495,17 @@ mysql_ssl_set(MYSQL *mysql __attribute__((unused)) ,
|
|||||||
static void
|
static void
|
||||||
mysql_ssl_free(MYSQL *mysql __attribute__((unused)))
|
mysql_ssl_free(MYSQL *mysql __attribute__((unused)))
|
||||||
{
|
{
|
||||||
|
struct st_VioSSLConnectorFd *st=
|
||||||
|
(struct st_VioSSLConnectorFd*) mysql->connector_fd;
|
||||||
DBUG_ENTER("mysql_ssl_free");
|
DBUG_ENTER("mysql_ssl_free");
|
||||||
|
|
||||||
my_free(mysql->options.ssl_key, MYF(MY_ALLOW_ZERO_PTR));
|
my_free(mysql->options.ssl_key, MYF(MY_ALLOW_ZERO_PTR));
|
||||||
my_free(mysql->options.ssl_cert, MYF(MY_ALLOW_ZERO_PTR));
|
my_free(mysql->options.ssl_cert, MYF(MY_ALLOW_ZERO_PTR));
|
||||||
my_free(mysql->options.ssl_ca, MYF(MY_ALLOW_ZERO_PTR));
|
my_free(mysql->options.ssl_ca, MYF(MY_ALLOW_ZERO_PTR));
|
||||||
my_free(mysql->options.ssl_capath, MYF(MY_ALLOW_ZERO_PTR));
|
my_free(mysql->options.ssl_capath, MYF(MY_ALLOW_ZERO_PTR));
|
||||||
my_free(mysql->options.ssl_cipher, MYF(MY_ALLOW_ZERO_PTR));
|
my_free(mysql->options.ssl_cipher, MYF(MY_ALLOW_ZERO_PTR));
|
||||||
|
if (st)
|
||||||
|
SSL_CTX_free(st->ssl_context);
|
||||||
my_free(mysql->connector_fd,MYF(MY_ALLOW_ZERO_PTR));
|
my_free(mysql->connector_fd,MYF(MY_ALLOW_ZERO_PTR));
|
||||||
mysql->options.ssl_key = 0;
|
mysql->options.ssl_key = 0;
|
||||||
mysql->options.ssl_cert = 0;
|
mysql->options.ssl_cert = 0;
|
||||||
|
@ -3332,17 +3332,20 @@ int ha_ndbcluster::external_lock(THD *thd, int lock_type)
|
|||||||
DBUG_PRINT("info", ("Table schema version: %d",
|
DBUG_PRINT("info", ("Table schema version: %d",
|
||||||
tab->getObjectVersion()));
|
tab->getObjectVersion()));
|
||||||
}
|
}
|
||||||
if (m_table != (void *)tab)
|
if (m_table_version < tab->getObjectVersion())
|
||||||
{
|
|
||||||
m_table= (void *)tab;
|
|
||||||
m_table_version = tab->getObjectVersion();
|
|
||||||
}
|
|
||||||
else if (m_table_version < tab->getObjectVersion())
|
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
The table has been altered, caller has to retry
|
The table has been altered, caller has to retry
|
||||||
*/
|
*/
|
||||||
DBUG_RETURN(my_errno= HA_ERR_TABLE_DEF_CHANGED);
|
NdbError err= ndb->getNdbError(NDB_INVALID_SCHEMA_OBJECT);
|
||||||
|
DBUG_RETURN(ndb_to_mysql_error(&err));
|
||||||
|
}
|
||||||
|
if (m_table != (void *)tab)
|
||||||
|
{
|
||||||
|
m_table= (void *)tab;
|
||||||
|
m_table_version = tab->getObjectVersion();
|
||||||
|
if (!(my_errno= build_index_list(ndb, table, ILBP_OPEN)))
|
||||||
|
DBUG_RETURN(my_errno);
|
||||||
}
|
}
|
||||||
m_table_info= tab_info;
|
m_table_info= tab_info;
|
||||||
}
|
}
|
||||||
@ -3880,9 +3883,8 @@ int ha_ndbcluster::create(const char *name,
|
|||||||
uint pack_length, length, i, pk_length= 0;
|
uint pack_length, length, i, pk_length= 0;
|
||||||
const void *data, *pack_data;
|
const void *data, *pack_data;
|
||||||
char name2[FN_HEADLEN];
|
char name2[FN_HEADLEN];
|
||||||
bool create_from_engine= test(info->table_options &
|
bool create_from_engine= (info->table_options & HA_OPTION_CREATE_FROM_ENGINE);
|
||||||
HA_OPTION_CREATE_FROM_ENGINE);
|
|
||||||
|
|
||||||
DBUG_ENTER("ha_ndbcluster::create");
|
DBUG_ENTER("ha_ndbcluster::create");
|
||||||
DBUG_PRINT("enter", ("name: %s", name));
|
DBUG_PRINT("enter", ("name: %s", name));
|
||||||
fn_format(name2, name, "", "",2); // Remove the .frm extension
|
fn_format(name2, name, "", "",2); // Remove the .frm extension
|
||||||
|
12
sql/item.cc
12
sql/item.cc
@ -5260,7 +5260,7 @@ Item_result item_cmp_type(Item_result a,Item_result b)
|
|||||||
void resolve_const_item(THD *thd, Item **ref, Item *comp_item)
|
void resolve_const_item(THD *thd, Item **ref, Item *comp_item)
|
||||||
{
|
{
|
||||||
Item *item= *ref;
|
Item *item= *ref;
|
||||||
Item *new_item;
|
Item *new_item= NULL;
|
||||||
if (item->basic_const_item())
|
if (item->basic_const_item())
|
||||||
return; // Can't be better
|
return; // Can't be better
|
||||||
Item_result res_type=item_cmp_type(comp_item->result_type(),
|
Item_result res_type=item_cmp_type(comp_item->result_type(),
|
||||||
@ -5293,7 +5293,16 @@ void resolve_const_item(THD *thd, Item **ref, Item *comp_item)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ROW_RESULT:
|
case ROW_RESULT:
|
||||||
|
if (item->type() == Item::ROW_ITEM && comp_item->type() == Item::ROW_ITEM)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
Substitute constants only in Item_rows. Don't affect other Items
|
||||||
|
with ROW_RESULT (eg Item_singlerow_subselect).
|
||||||
|
|
||||||
|
For such Items more optimal is to detect if it is constant and replace
|
||||||
|
it with Item_row. This would optimize queries like this:
|
||||||
|
SELECT * FROM t1 WHERE (a,b) = (SELECT a,b FROM t2 LIMIT 1);
|
||||||
|
*/
|
||||||
Item_row *item_row= (Item_row*) item;
|
Item_row *item_row= (Item_row*) item;
|
||||||
Item_row *comp_item_row= (Item_row*) comp_item;
|
Item_row *comp_item_row= (Item_row*) comp_item;
|
||||||
uint col;
|
uint col;
|
||||||
@ -5311,6 +5320,7 @@ void resolve_const_item(THD *thd, Item **ref, Item *comp_item)
|
|||||||
resolve_const_item(thd, item_row->addr(col), comp_item_row->el(col));
|
resolve_const_item(thd, item_row->addr(col), comp_item_row->el(col));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
/* Fallthrough */
|
||||||
case REAL_RESULT:
|
case REAL_RESULT:
|
||||||
{ // It must REAL_RESULT
|
{ // It must REAL_RESULT
|
||||||
double result= item->val_real();
|
double result= item->val_real();
|
||||||
|
@ -1362,7 +1362,7 @@ int calc_weekday(long daynr,bool sunday_first_day_of_week);
|
|||||||
uint calc_week(TIME *l_time, uint week_behaviour, uint *year);
|
uint calc_week(TIME *l_time, uint week_behaviour, uint *year);
|
||||||
void find_date(char *pos,uint *vek,uint flag);
|
void find_date(char *pos,uint *vek,uint flag);
|
||||||
TYPELIB *convert_strings_to_array_type(my_string *typelibs, my_string *end);
|
TYPELIB *convert_strings_to_array_type(my_string *typelibs, my_string *end);
|
||||||
TYPELIB *typelib(List<String> &strings);
|
TYPELIB *typelib(MEM_ROOT *mem_root, List<String> &strings);
|
||||||
ulong get_form_pos(File file, uchar *head, TYPELIB *save_names);
|
ulong get_form_pos(File file, uchar *head, TYPELIB *save_names);
|
||||||
ulong make_new_entry(File file,uchar *fileinfo,TYPELIB *formnames,
|
ulong make_new_entry(File file,uchar *fileinfo,TYPELIB *formnames,
|
||||||
const char *newname);
|
const char *newname);
|
||||||
|
@ -725,7 +725,14 @@ static int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info,
|
|||||||
*/
|
*/
|
||||||
if (!interval)
|
if (!interval)
|
||||||
{
|
{
|
||||||
interval= sql_field->interval= typelib(sql_field->interval_list);
|
/*
|
||||||
|
Create the typelib in prepared statement memory if we're
|
||||||
|
executing one.
|
||||||
|
*/
|
||||||
|
MEM_ROOT *stmt_root= thd->current_arena->mem_root;
|
||||||
|
|
||||||
|
interval= sql_field->interval= typelib(stmt_root,
|
||||||
|
sql_field->interval_list);
|
||||||
List_iterator<String> it(sql_field->interval_list);
|
List_iterator<String> it(sql_field->interval_list);
|
||||||
String conv, *tmp;
|
String conv, *tmp;
|
||||||
for (uint i= 0; (tmp= it++); i++)
|
for (uint i= 0; (tmp= it++); i++)
|
||||||
@ -736,7 +743,7 @@ static int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info,
|
|||||||
{
|
{
|
||||||
uint cnv_errs;
|
uint cnv_errs;
|
||||||
conv.copy(tmp->ptr(), tmp->length(), tmp->charset(), cs, &cnv_errs);
|
conv.copy(tmp->ptr(), tmp->length(), tmp->charset(), cs, &cnv_errs);
|
||||||
interval->type_names[i]= strmake_root(thd->mem_root, conv.ptr(),
|
interval->type_names[i]= strmake_root(stmt_root, conv.ptr(),
|
||||||
conv.length());
|
conv.length());
|
||||||
interval->type_lengths[i]= conv.length();
|
interval->type_lengths[i]= conv.length();
|
||||||
}
|
}
|
||||||
@ -756,8 +763,23 @@ static int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info,
|
|||||||
*/
|
*/
|
||||||
if (sql_field->def && cs != sql_field->def->collation.collation)
|
if (sql_field->def && cs != sql_field->def->collation.collation)
|
||||||
{
|
{
|
||||||
if (!(sql_field->def=
|
Item_arena backup_arena;
|
||||||
sql_field->def->safe_charset_converter(cs)))
|
bool need_to_change_arena=
|
||||||
|
!thd->current_arena->is_conventional_execution();
|
||||||
|
if (need_to_change_arena)
|
||||||
|
{
|
||||||
|
/* Asser that we don't do that at every PS execute */
|
||||||
|
DBUG_ASSERT(thd->current_arena->is_first_stmt_execute() ||
|
||||||
|
thd->current_arena->is_first_sp_execute());
|
||||||
|
thd->set_n_backup_item_arena(thd->current_arena, &backup_arena);
|
||||||
|
}
|
||||||
|
|
||||||
|
sql_field->def= sql_field->def->safe_charset_converter(cs);
|
||||||
|
|
||||||
|
if (need_to_change_arena)
|
||||||
|
thd->restore_backup_item_arena(thd->current_arena, &backup_arena);
|
||||||
|
|
||||||
|
if (! sql_field->def)
|
||||||
{
|
{
|
||||||
/* Could not convert */
|
/* Could not convert */
|
||||||
my_error(ER_INVALID_DEFAULT, MYF(0), sql_field->field_name);
|
my_error(ER_INVALID_DEFAULT, MYF(0), sql_field->field_name);
|
||||||
|
@ -1247,15 +1247,15 @@ fix_type_pointers(const char ***array, TYPELIB *point_to_type, uint types,
|
|||||||
} /* fix_type_pointers */
|
} /* fix_type_pointers */
|
||||||
|
|
||||||
|
|
||||||
TYPELIB *typelib(List<String> &strings)
|
TYPELIB *typelib(MEM_ROOT *mem_root, List<String> &strings)
|
||||||
{
|
{
|
||||||
TYPELIB *result=(TYPELIB*) sql_alloc(sizeof(TYPELIB));
|
TYPELIB *result= (TYPELIB*) alloc_root(mem_root, sizeof(TYPELIB));
|
||||||
if (!result)
|
if (!result)
|
||||||
return 0;
|
return 0;
|
||||||
result->count=strings.elements;
|
result->count=strings.elements;
|
||||||
result->name="";
|
result->name="";
|
||||||
uint nbytes= (sizeof(char*) + sizeof(uint)) * (result->count + 1);
|
uint nbytes= (sizeof(char*) + sizeof(uint)) * (result->count + 1);
|
||||||
if (!(result->type_names= (const char**) sql_alloc(nbytes)))
|
if (!(result->type_names= (const char**) alloc_root(mem_root, nbytes)))
|
||||||
return 0;
|
return 0;
|
||||||
result->type_lengths= (uint*) (result->type_names + result->count + 1);
|
result->type_lengths= (uint*) (result->type_names + result->count + 1);
|
||||||
List_iterator<String> it(strings);
|
List_iterator<String> it(strings);
|
||||||
|
@ -87,7 +87,7 @@ static void vio_init(Vio* vio, enum enum_vio_type type,
|
|||||||
#ifdef HAVE_OPENSSL
|
#ifdef HAVE_OPENSSL
|
||||||
if (type == VIO_TYPE_SSL)
|
if (type == VIO_TYPE_SSL)
|
||||||
{
|
{
|
||||||
vio->viodelete =vio_ssl_delete;
|
vio->viodelete =vio_delete;
|
||||||
vio->vioerrno =vio_ssl_errno;
|
vio->vioerrno =vio_ssl_errno;
|
||||||
vio->read =vio_ssl_read;
|
vio->read =vio_ssl_read;
|
||||||
vio->write =vio_ssl_write;
|
vio->write =vio_ssl_write;
|
||||||
|
@ -28,7 +28,6 @@ void vio_ignore_timeout(Vio *vio, uint which, uint timeout);
|
|||||||
#ifdef HAVE_OPENSSL
|
#ifdef HAVE_OPENSSL
|
||||||
#include "my_net.h" /* needed because of struct in_addr */
|
#include "my_net.h" /* needed because of struct in_addr */
|
||||||
|
|
||||||
void vio_ssl_delete(Vio* vio);
|
|
||||||
int vio_ssl_read(Vio *vio,gptr buf, int size);
|
int vio_ssl_read(Vio *vio,gptr buf, int size);
|
||||||
int vio_ssl_write(Vio *vio,const gptr buf,int size);
|
int vio_ssl_write(Vio *vio,const gptr buf,int size);
|
||||||
void vio_ssl_timeout(Vio *vio, uint which, uint timeout);
|
void vio_ssl_timeout(Vio *vio, uint which, uint timeout);
|
||||||
|
19
vio/viossl.c
19
vio/viossl.c
@ -69,25 +69,6 @@ report_errors()
|
|||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
Delete a vio object
|
|
||||||
|
|
||||||
SYNPOSIS
|
|
||||||
vio_ssl_delete()
|
|
||||||
vio Vio object. May be 0.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
void vio_ssl_delete(Vio * vio)
|
|
||||||
{
|
|
||||||
if (vio)
|
|
||||||
{
|
|
||||||
if (vio->type != VIO_CLOSED)
|
|
||||||
vio_close(vio);
|
|
||||||
my_free((gptr) vio,MYF(0));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int vio_ssl_errno(Vio *vio __attribute__((unused)))
|
int vio_ssl_errno(Vio *vio __attribute__((unused)))
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user