Skip to content

Commit e5dbc49

Browse files
author
gluh@mysql.com
committed
Merge sgluhov@bk-internal.mysql.com:/home/bk/mysql-5.0
into mysql.com:/home/gluh/MySQL/Merge/5.0-kt
2 parents 2ac82c1 + 475911d commit e5dbc49

18 files changed

+229
-129
lines changed

include/sql_common.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ extern const char *not_error_sqlstate;
2222
extern "C" {
2323
#endif
2424

25+
extern CHARSET_INFO *default_client_charset_info;
2526
MYSQL_FIELD *unpack_fields(MYSQL_DATA *data,MEM_ROOT *alloc,uint fields,
2627
my_bool default_value, uint server_capabilities);
2728
void free_rows(MYSQL_DATA *cur);

libmysqld/lib_sql.cc

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ extern "C"
3737
int check_user(THD *thd, enum enum_server_command command,
3838
const char *passwd, uint passwd_len, const char *db,
3939
bool check_count);
40+
void thd_init_client_charset(THD *thd, uint cs_number);
41+
4042
C_MODE_START
4143

4244
#include <mysql.h>
@@ -600,11 +602,14 @@ void *create_embedded_thd(int client_flag, char *db)
600602
return NULL;
601603
}
602604

605+
603606
#ifdef NO_EMBEDDED_ACCESS_CHECKS
604607
int check_embedded_connection(MYSQL *mysql)
605608
{
606609
int result;
607610
THD *thd= (THD*)mysql->thd;
611+
thd_init_client_charset(thd, mysql->charset->number);
612+
thd->update_charset();
608613
Security_context *sctx= thd->security_ctx;
609614
sctx->host_or_ip= sctx->host= (char*) my_localhost;
610615
strmake(sctx->priv_host, (char*) my_localhost, MAX_HOSTNAME-1);
@@ -623,6 +628,8 @@ int check_embedded_connection(MYSQL *mysql)
623628
char scramble_buff[SCRAMBLE_LENGTH];
624629
int passwd_len;
625630

631+
thd_init_client_charset(thd, mysql->charset->number);
632+
thd->update_charset();
626633
if (mysql->options.client_ip)
627634
{
628635
sctx->host= my_strdup(mysql->options.client_ip, MYF(0));

libmysqld/libmysqld.c

Lines changed: 3 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -90,49 +90,7 @@ static void end_server(MYSQL *mysql)
9090
}
9191

9292

93-
static int mysql_init_charset(MYSQL *mysql)
94-
{
95-
char charset_name_buff[16], *charset_name;
96-
97-
if ((charset_name=mysql->options.charset_name))
98-
{
99-
const char *save=charsets_dir;
100-
if (mysql->options.charset_dir)
101-
charsets_dir=mysql->options.charset_dir;
102-
mysql->charset=get_charset_by_name(mysql->options.charset_name,
103-
MYF(MY_WME));
104-
charsets_dir=save;
105-
}
106-
else if (mysql->server_language)
107-
{
108-
charset_name=charset_name_buff;
109-
sprintf(charset_name,"%d",mysql->server_language); /* In case of errors */
110-
mysql->charset=get_charset((uint8) mysql->server_language, MYF(MY_WME));
111-
}
112-
else
113-
mysql->charset=default_charset_info;
114-
115-
if (!mysql->charset)
116-
{
117-
mysql->net.last_errno=CR_CANT_READ_CHARSET;
118-
strmov(mysql->net.sqlstate, "HY0000");
119-
if (mysql->options.charset_dir)
120-
sprintf(mysql->net.last_error,ER(mysql->net.last_errno),
121-
charset_name ? charset_name : "unknown",
122-
mysql->options.charset_dir);
123-
else
124-
{
125-
char cs_dir_name[FN_REFLEN];
126-
get_charsets_dir(cs_dir_name);
127-
sprintf(mysql->net.last_error,ER(mysql->net.last_errno),
128-
charset_name ? charset_name : "unknown",
129-
cs_dir_name);
130-
}
131-
return mysql->net.last_errno;
132-
}
133-
return 0;
134-
}
135-
93+
int mysql_init_character_set(MYSQL *mysql);
13694

13795
MYSQL * STDCALL
13896
mysql_real_connect(MYSQL *mysql,const char *host, const char *user,
@@ -222,10 +180,10 @@ mysql_real_connect(MYSQL *mysql,const char *host, const char *user,
222180

223181
init_embedded_mysql(mysql, client_flag, db_name);
224182

225-
if (check_embedded_connection(mysql))
183+
if (mysql_init_character_set(mysql))
226184
goto error;
227185

228-
if (mysql_init_charset(mysql))
186+
if (check_embedded_connection(mysql))
229187
goto error;
230188

231189
mysql->server_status= SERVER_STATUS_AUTOCOMMIT;

mysql-test/r/ctype_ucs2_def.result

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
show variables like 'collation_server';
2+
Variable_name Value
3+
collation_server ucs2_unicode_ci
14
show variables like "%character_set_ser%";
25
Variable_name Value
36
character_set_server ucs2

mysql-test/r/gis.result

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -694,3 +694,13 @@ alter table t1 add primary key pti(pt);
694694
ERROR 42000: BLOB/TEXT column 'pt' used in key specification without a key length
695695
alter table t1 add primary key pti(pt(20));
696696
drop table t1;
697+
create table t1 (g GEOMETRY);
698+
select * from t1;
699+
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
700+
def test t1 t1 g g 255 4294967295 0 Y 144 0 63
701+
g
702+
select asbinary(g) from t1;
703+
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
704+
def asbinary(g) 252 8192 0 Y 128 0 63
705+
asbinary(g)
706+
drop table t1;

mysql-test/r/information_schema.result

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -369,11 +369,11 @@ show keys from v4;
369369
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
370370
select * from information_schema.views where TABLE_NAME like "v%";
371371
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME VIEW_DEFINITION CHECK_OPTION IS_UPDATABLE DEFINER SECURITY_TYPE
372-
NULL test v0 select sql_no_cache `schemata`.`SCHEMA_NAME` AS `c` from `information_schema`.`schemata` NONE NO root@localhost DEFINER
373-
NULL test v1 select sql_no_cache `tables`.`TABLE_NAME` AS `c` from `information_schema`.`tables` where (`tables`.`TABLE_NAME` = _utf8'v1') NONE NO root@localhost DEFINER
374-
NULL test v2 select sql_no_cache `columns`.`COLUMN_NAME` AS `c` from `information_schema`.`columns` where (`columns`.`TABLE_NAME` = _utf8'v2') NONE NO root@localhost DEFINER
375-
NULL test v3 select sql_no_cache `character_sets`.`CHARACTER_SET_NAME` AS `c` from `information_schema`.`character_sets` where (`character_sets`.`CHARACTER_SET_NAME` like _utf8'latin1%') NONE NO root@localhost DEFINER
376-
NULL test v4 select sql_no_cache `collations`.`COLLATION_NAME` AS `c` from `information_schema`.`collations` where (`collations`.`COLLATION_NAME` like _utf8'latin1%') NONE NO root@localhost DEFINER
372+
NULL test v0 /* ALGORITHM=UNDEFINED */ select sql_no_cache `schemata`.`SCHEMA_NAME` AS `c` from `information_schema`.`schemata` NONE NO root@localhost DEFINER
373+
NULL test v1 /* ALGORITHM=UNDEFINED */ select sql_no_cache `tables`.`TABLE_NAME` AS `c` from `information_schema`.`tables` where (`tables`.`TABLE_NAME` = _utf8'v1') NONE NO root@localhost DEFINER
374+
NULL test v2 /* ALGORITHM=UNDEFINED */ select sql_no_cache `columns`.`COLUMN_NAME` AS `c` from `information_schema`.`columns` where (`columns`.`TABLE_NAME` = _utf8'v2') NONE NO root@localhost DEFINER
375+
NULL test v3 /* ALGORITHM=UNDEFINED */ select sql_no_cache `character_sets`.`CHARACTER_SET_NAME` AS `c` from `information_schema`.`character_sets` where (`character_sets`.`CHARACTER_SET_NAME` like _utf8'latin1%') NONE NO root@localhost DEFINER
376+
NULL test v4 /* ALGORITHM=UNDEFINED */ select sql_no_cache `collations`.`COLLATION_NAME` AS `c` from `information_schema`.`collations` where (`collations`.`COLLATION_NAME` like _utf8'latin1%') NONE NO root@localhost DEFINER
377377
drop view v0, v1, v2, v3, v4;
378378
create table t1 (a int);
379379
grant select,update,insert on t1 to mysqltest_1@localhost;
@@ -464,9 +464,9 @@ create view v2 (c) as select a from t1 WITH LOCAL CHECK OPTION;
464464
create view v3 (c) as select a from t1 WITH CASCADED CHECK OPTION;
465465
select * from information_schema.views;
466466
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME VIEW_DEFINITION CHECK_OPTION IS_UPDATABLE DEFINER SECURITY_TYPE
467-
NULL test v1 select `test`.`t1`.`a` AS `c` from `test`.`t1` CASCADED YES root@localhost DEFINER
468-
NULL test v2 select `test`.`t1`.`a` AS `c` from `test`.`t1` LOCAL YES root@localhost DEFINER
469-
NULL test v3 select `test`.`t1`.`a` AS `c` from `test`.`t1` CASCADED YES root@localhost DEFINER
467+
NULL test v1 /* ALGORITHM=UNDEFINED */ select `test`.`t1`.`a` AS `c` from `test`.`t1` CASCADED YES root@localhost DEFINER
468+
NULL test v2 /* ALGORITHM=UNDEFINED */ select `test`.`t1`.`a` AS `c` from `test`.`t1` LOCAL YES root@localhost DEFINER
469+
NULL test v3 /* ALGORITHM=UNDEFINED */ select `test`.`t1`.`a` AS `c` from `test`.`t1` CASCADED YES root@localhost DEFINER
470470
grant select (a) on test.t1 to joe@localhost with grant option;
471471
select * from INFORMATION_SCHEMA.COLUMN_PRIVILEGES;
472472
GRANTEE TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME PRIVILEGE_TYPE IS_GRANTABLE
@@ -1121,7 +1121,7 @@ select * from information_schema.views
11211121
where table_name='v1' or table_name='v2';
11221122
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME VIEW_DEFINITION CHECK_OPTION IS_UPDATABLE DEFINER SECURITY_TYPE
11231123
NULL test v1 NONE YES root@localhost DEFINER
1124-
NULL test v2 select 1 AS `1` NONE NO mysqltest_1@localhost DEFINER
1124+
NULL test v2 /* ALGORITHM=UNDEFINED */ select 1 AS `1` NONE NO mysqltest_1@localhost DEFINER
11251125
drop view v1, v2;
11261126
drop table t1;
11271127
drop user mysqltest_1@localhost;

mysql-test/r/variables.result

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -421,6 +421,28 @@ set tmp_table_size=100;
421421
set tx_isolation="READ-COMMITTED";
422422
set wait_timeout=100;
423423
set log_warnings=1;
424+
select @@session.insert_id;
425+
@@session.insert_id
426+
1
427+
set @save_insert_id=@@session.insert_id;
428+
set session insert_id=20;
429+
select @@session.insert_id;
430+
@@session.insert_id
431+
20
432+
set session last_insert_id=100;
433+
select @@session.insert_id;
434+
@@session.insert_id
435+
20
436+
select @@session.last_insert_id;
437+
@@session.last_insert_id
438+
100
439+
select @@session.insert_id;
440+
@@session.insert_id
441+
20
442+
set @@session.insert_id=@save_insert_id;
443+
select @@session.insert_id;
444+
@@session.insert_id
445+
1
424446
create table t1 (a int not null auto_increment, primary key(a));
425447
create table t2 (a int not null auto_increment, primary key(a));
426448
insert into t1 values(null),(null),(null);
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
--default-character-set=ucs2 --default-collation=ucs2_unicode_ci
1+
--default-collation=ucs2_unicode_ci --default-character-set=ucs2

mysql-test/t/ctype_ucs2_def.test

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
#
2+
# MySQL Bug#15276: MySQL ignores collation-server
3+
#
4+
show variables like 'collation_server';
5+
16
#
27
# Bug#18004 Connecting crashes server when default charset is UCS2
38
#

mysql-test/t/gis.test

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -409,3 +409,10 @@ create table t1(pt GEOMETRY);
409409
alter table t1 add primary key pti(pt);
410410
alter table t1 add primary key pti(pt(20));
411411
drop table t1;
412+
413+
--enable_metadata
414+
create table t1 (g GEOMETRY);
415+
select * from t1;
416+
select asbinary(g) from t1;
417+
--disable_metadata
418+
drop table t1;

mysql-test/t/variables.test

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,22 @@ set tx_isolation="READ-COMMITTED";
301301
set wait_timeout=100;
302302
set log_warnings=1;
303303

304+
#
305+
# Bugs: #20392: INSERT_ID session variable has weird value
306+
#
307+
select @@session.insert_id;
308+
set @save_insert_id=@@session.insert_id;
309+
set session insert_id=20;
310+
select @@session.insert_id;
311+
312+
set session last_insert_id=100;
313+
select @@session.insert_id;
314+
select @@session.last_insert_id;
315+
select @@session.insert_id;
316+
317+
set @@session.insert_id=@save_insert_id;
318+
select @@session.insert_id;
319+
304320
#
305321
# key buffer
306322
#

mysys/my_init.c

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,22 @@ void setEnvString(char *ret, const char *name, const char *value)
245245
DBUG_VOID_RETURN ;
246246
}
247247

248+
/*
249+
my_paramter_handler
250+
Invalid paramter handler we will use instead of the one "baked" into the CRT
251+
for MSC v8. This one just prints out what invalid parameter was encountered.
252+
By providing this routine, routines like lseek will return -1 when we expect them
253+
to instead of crash.
254+
*/
255+
void my_parameter_handler(const wchar_t * expression, const wchar_t * function,
256+
const wchar_t * file, unsigned int line,
257+
uintptr_t pReserved)
258+
{
259+
DBUG_PRINT("my",("Expression: %s function: %s file: %s, line: %d",
260+
expression, function, file, line));
261+
}
262+
263+
248264
static void my_win_init(void)
249265
{
250266
HKEY hSoftMysql ;
@@ -262,12 +278,18 @@ static void my_win_init(void)
262278

263279
setlocale(LC_CTYPE, ""); /* To get right sortorder */
264280

265-
#if defined(_MSC_VER) && (_MSC_VER < 1300)
281+
#if defined(_MSC_VER)
282+
#if _MSC_VER < 1300
266283
/*
267284
Clear the OS system variable TZ and avoid the 100% CPU usage
268285
Only for old versions of Visual C++
269286
*/
270287
_putenv( "TZ=" );
288+
#endif
289+
#if _MSC_VER >= 1400
290+
/* this is required to make crt functions return -1 appropriately */
291+
_set_invalid_parameter_handler(my_parameter_handler);
292+
#endif
271293
#endif
272294
_tzset();
273295

sql-common/client.c

Lines changed: 49 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,8 @@ static void mysql_close_free(MYSQL *mysql);
130130
static int wait_for_data(my_socket fd, uint timeout);
131131
#endif
132132

133+
CHARSET_INFO *default_client_charset_info = &my_charset_latin1;
134+
133135

134136
/****************************************************************************
135137
A modified version of connect(). my_connect() allows you to specify
@@ -1431,7 +1433,7 @@ mysql_init(MYSQL *mysql)
14311433
bzero((char*) (mysql), sizeof(*(mysql)));
14321434
mysql->options.connect_timeout= CONNECT_TIMEOUT;
14331435
mysql->last_used_con= mysql->next_slave= mysql->master = mysql;
1434-
mysql->charset=default_charset_info;
1436+
mysql->charset=default_client_charset_info;
14351437
strmov(mysql->net.sqlstate, not_error_sqlstate);
14361438
/*
14371439
By default, we are a replication pivot. The caller must reset it
@@ -1660,7 +1662,51 @@ static MYSQL_METHODS client_methods=
16601662
#endif
16611663
};
16621664

1663-
MYSQL *
1665+
C_MODE_START
1666+
int mysql_init_character_set(MYSQL *mysql)
1667+
{
1668+
NET *net= &mysql->net;
1669+
/* Set character set */
1670+
if (!mysql->options.charset_name &&
1671+
!(mysql->options.charset_name=
1672+
my_strdup(MYSQL_DEFAULT_CHARSET_NAME,MYF(MY_WME))))
1673+
return 1;
1674+
1675+
{
1676+
const char *save= charsets_dir;
1677+
if (mysql->options.charset_dir)
1678+
charsets_dir=mysql->options.charset_dir;
1679+
mysql->charset=get_charset_by_csname(mysql->options.charset_name,
1680+
MY_CS_PRIMARY, MYF(MY_WME));
1681+
charsets_dir= save;
1682+
}
1683+
1684+
if (!mysql->charset)
1685+
{
1686+
net->last_errno=CR_CANT_READ_CHARSET;
1687+
strmov(net->sqlstate, unknown_sqlstate);
1688+
if (mysql->options.charset_dir)
1689+
my_snprintf(net->last_error, sizeof(net->last_error)-1,
1690+
ER(net->last_errno),
1691+
mysql->options.charset_name,
1692+
mysql->options.charset_dir);
1693+
else
1694+
{
1695+
char cs_dir_name[FN_REFLEN];
1696+
get_charsets_dir(cs_dir_name);
1697+
my_snprintf(net->last_error, sizeof(net->last_error)-1,
1698+
ER(net->last_errno),
1699+
mysql->options.charset_name,
1700+
cs_dir_name);
1701+
}
1702+
return 1;
1703+
}
1704+
return 0;
1705+
}
1706+
C_MODE_END
1707+
1708+
1709+
MYSQL * STDCALL
16641710
CLI_MYSQL_REAL_CONNECT(MYSQL *mysql,const char *host, const char *user,
16651711
const char *passwd, const char *db,
16661712
uint port, const char *unix_socket,ulong client_flag)
@@ -1997,42 +2043,8 @@ CLI_MYSQL_REAL_CONNECT(MYSQL *mysql,const char *host, const char *user,
19972043
goto error;
19982044
}
19992045

2000-
/* Set character set */
2001-
if (!mysql->options.charset_name &&
2002-
!(mysql->options.charset_name=
2003-
my_strdup(MYSQL_DEFAULT_CHARSET_NAME,MYF(MY_WME))))
2004-
goto error;
2005-
2006-
{
2007-
const char *save= charsets_dir;
2008-
if (mysql->options.charset_dir)
2009-
charsets_dir=mysql->options.charset_dir;
2010-
mysql->charset=get_charset_by_csname(mysql->options.charset_name,
2011-
MY_CS_PRIMARY, MYF(MY_WME));
2012-
charsets_dir= save;
2013-
}
2014-
2015-
if (!mysql->charset)
2016-
{
2017-
net->last_errno=CR_CANT_READ_CHARSET;
2018-
strmov(net->sqlstate, unknown_sqlstate);
2019-
if (mysql->options.charset_dir)
2020-
my_snprintf(net->last_error, sizeof(net->last_error)-1,
2021-
ER(net->last_errno),
2022-
mysql->options.charset_name,
2023-
mysql->options.charset_dir);
2024-
else
2025-
{
2026-
char cs_dir_name[FN_REFLEN];
2027-
get_charsets_dir(cs_dir_name);
2028-
my_snprintf(net->last_error, sizeof(net->last_error)-1,
2029-
ER(net->last_errno),
2030-
mysql->options.charset_name,
2031-
cs_dir_name);
2032-
}
2046+
if (mysql_init_character_set(mysql))
20332047
goto error;
2034-
}
2035-
20362048

20372049
/* Save connection information */
20382050
if (!my_multi_malloc(MYF(0),

0 commit comments

Comments
 (0)