Skip to content

Commit 8cf9ada

Browse files
author
bar@bar.mysql.r18.ru
committed
Use of CHARSWT_INFO *result_collation
instead of bool convert_result_charset SET CHARACTER SET inststead of SET NAMES in tests
1 parent 2cdc21d commit 8cf9ada

10 files changed

+118
-77
lines changed

mysql-test/r/ctype_collate.result

+12-12
Original file line numberDiff line numberDiff line change
@@ -510,11 +510,11 @@ t1 CREATE TABLE `t1` (
510510
SHOW FIELDS FROM t1;
511511
Field Type Collation Null Key Default Extra
512512
latin1_f char(32) latin1_bin YES NULL
513-
SET NAMES 'latin1';
513+
SET CHARACTER SET 'latin1';
514514
SHOW VARIABLES LIKE 'client_collation';
515515
Variable_name Value
516516
client_collation latin1_swedish_ci
517-
SET NAMES latin1;
517+
SET CHARACTER SET latin1;
518518
SHOW VARIABLES LIKE 'client_collation';
519519
Variable_name Value
520520
client_collation latin1_swedish_ci
@@ -524,51 +524,51 @@ client_collation latin1_swedish_ci
524524
SELECT charset('a'),collation('a'),coercibility('a'),'a'='A';
525525
charset('a') collation('a') coercibility('a') 'a'='A'
526526
latin1 latin1_swedish_ci 3 1
527-
SET NAMES latin1 COLLATE latin1_bin;
527+
SET CHARACTER SET latin1 COLLATE latin1_bin;
528528
SHOW VARIABLES LIKE 'client_collation';
529529
Variable_name Value
530530
client_collation latin1_bin
531-
SET NAMES LATIN1 COLLATE Latin1_Bin;
531+
SET CHARACTER SET LATIN1 COLLATE Latin1_Bin;
532532
SHOW VARIABLES LIKE 'client_collation';
533533
Variable_name Value
534534
client_collation latin1_bin
535-
SET NAMES 'latin1' COLLATE 'latin1_bin';
535+
SET CHARACTER SET 'latin1' COLLATE 'latin1_bin';
536536
SHOW VARIABLES LIKE 'client_collation';
537537
Variable_name Value
538538
client_collation latin1_bin
539539
SELECT charset('a'),collation('a'),coercibility('a'),'a'='A';
540540
charset('a') collation('a') coercibility('a') 'a'='A'
541-
latin1 latin1_bin 3 0
542-
SET NAMES koi8r;
541+
latin1 latin1_swedish_ci 3 1
542+
SET CHARACTER SET koi8r;
543543
SHOW VARIABLES LIKE 'client_collation';
544544
Variable_name Value
545545
client_collation koi8r_general_ci
546546
SELECT charset('a'),collation('a'),coercibility('a'),'a'='A';
547547
charset('a') collation('a') coercibility('a') 'a'='A'
548548
latin1 latin1_swedish_ci 3 1
549-
SET NAMES koi8r COLLATE koi8r_bin;
549+
SET CHARACTER SET koi8r COLLATE koi8r_bin;
550550
SHOW VARIABLES LIKE 'client_collation';
551551
Variable_name Value
552552
client_collation koi8r_bin
553553
SELECT charset('a'),collation('a'),coercibility('a'),'a'='A';
554554
charset('a') collation('a') coercibility('a') 'a'='A'
555555
latin1 latin1_swedish_ci 3 1
556-
SET NAMES koi8r COLLATE DEFAULT;
556+
SET CHARACTER SET koi8r COLLATE DEFAULT;
557557
SHOW VARIABLES LIKE 'client_collation';
558558
Variable_name Value
559559
client_collation koi8r_general_ci
560560
SELECT charset('a'),collation('a'),coercibility('a'),'a'='A';
561561
charset('a') collation('a') coercibility('a') 'a'='A'
562562
latin1 latin1_swedish_ci 3 1
563-
SET NAMES DEFAULT;
563+
SET CHARACTER SET DEFAULT;
564564
SHOW VARIABLES LIKE 'client_collation';
565565
Variable_name Value
566566
client_collation latin1_swedish_ci
567567
SELECT charset('a'),collation('a'),coercibility('a'),'a'='A';
568568
charset('a') collation('a') coercibility('a') 'a'='A'
569569
latin1 latin1_swedish_ci 3 1
570-
SET NAMES latin1 COLLATE koi8r;
570+
SET CHARACTER SET latin1 COLLATE koi8r;
571571
COLLATION 'koi8r_general_ci' is not valid for CHARACTER SET 'latin1'
572-
SET NAMES 'DEFAULT';
572+
SET CHARACTER SET 'DEFAULT';
573573
Unknown character set: 'DEFAULT'
574574
DROP TABLE t1;

mysql-test/r/ctype_recoding.result

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
1-
SET NAMES koi8r;
1+
SET CHARACTER SET koi8r;
22
DROP TABLE IF EXISTS �������;
33
CREATE TABLE �������
44
(
55
���� CHAR(32) CHARACTER SET koi8r NOT NULL
66
);
77
SHOW TABLES;
88
Tables_in_test
9-
таблица
9+
�������
1010
SHOW CREATE TABLE �������;
1111
Table Create Table
12-
таблица CREATE TABLE `таблица` (
13-
`поле` char(32) character set koi8r NOT NULL default ''
12+
������� CREATE TABLE `�������` (
13+
`����` char(32) character set koi8r NOT NULL default ''
1414
) TYPE=MyISAM CHARSET=latin1
1515
SHOW FIELDS FROM �������;
1616
Field Type Collation Null Key Default Extra
17-
поле char(32) character set koi8r koi8r_general_ci
17+
���� char(32) character set koi8r koi8r_general_ci
1818
SET CHARACTER SET cp1251;
1919
SHOW TABLES;
2020
Tables_in_test

mysql-test/t/ctype_collate.test

+11-11
Original file line numberDiff line numberDiff line change
@@ -127,35 +127,35 @@ ALTER TABLE t1 CHARACTER SET latin1 COLLATE latin1_bin;
127127
SHOW CREATE TABLE t1;
128128
SHOW FIELDS FROM t1;
129129

130-
SET NAMES 'latin1';
130+
SET CHARACTER SET 'latin1';
131131
SHOW VARIABLES LIKE 'client_collation';
132-
SET NAMES latin1;
132+
SET CHARACTER SET latin1;
133133
SHOW VARIABLES LIKE 'client_collation';
134134
SHOW VARIABLES LIKE 'client_collation';
135135
SELECT charset('a'),collation('a'),coercibility('a'),'a'='A';
136-
SET NAMES latin1 COLLATE latin1_bin;
136+
SET CHARACTER SET latin1 COLLATE latin1_bin;
137137
SHOW VARIABLES LIKE 'client_collation';
138-
SET NAMES LATIN1 COLLATE Latin1_Bin;
138+
SET CHARACTER SET LATIN1 COLLATE Latin1_Bin;
139139
SHOW VARIABLES LIKE 'client_collation';
140-
SET NAMES 'latin1' COLLATE 'latin1_bin';
140+
SET CHARACTER SET 'latin1' COLLATE 'latin1_bin';
141141
SHOW VARIABLES LIKE 'client_collation';
142142
SELECT charset('a'),collation('a'),coercibility('a'),'a'='A';
143-
SET NAMES koi8r;
143+
SET CHARACTER SET koi8r;
144144
SHOW VARIABLES LIKE 'client_collation';
145145
SELECT charset('a'),collation('a'),coercibility('a'),'a'='A';
146-
SET NAMES koi8r COLLATE koi8r_bin;
146+
SET CHARACTER SET koi8r COLLATE koi8r_bin;
147147
SHOW VARIABLES LIKE 'client_collation';
148148
SELECT charset('a'),collation('a'),coercibility('a'),'a'='A';
149-
SET NAMES koi8r COLLATE DEFAULT;
149+
SET CHARACTER SET koi8r COLLATE DEFAULT;
150150
SHOW VARIABLES LIKE 'client_collation';
151151
SELECT charset('a'),collation('a'),coercibility('a'),'a'='A';
152-
SET NAMES DEFAULT;
152+
SET CHARACTER SET DEFAULT;
153153
SHOW VARIABLES LIKE 'client_collation';
154154
SELECT charset('a'),collation('a'),coercibility('a'),'a'='A';
155155
--error 1251
156-
SET NAMES latin1 COLLATE koi8r;
156+
SET CHARACTER SET latin1 COLLATE koi8r;
157157
--error 1115
158-
SET NAMES 'DEFAULT';
158+
SET CHARACTER SET 'DEFAULT';
159159

160160

161161
DROP TABLE t1;

mysql-test/t/ctype_recoding.test

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
SET NAMES koi8r;
1+
SET CHARACTER SET koi8r;
22

33
--disable_warnings
44
DROP TABLE IF EXISTS �������;

sql/mysqld.cc

+5-1
Original file line numberDiff line numberDiff line change
@@ -2087,6 +2087,10 @@ static int init_common_variables(const char *conf_file_name, int argc,
20872087
#endif
20882088
if (!(default_charset_info= get_charset_by_name(sys_charset.value, MYF(MY_WME))))
20892089
return 1;
2090+
global_system_variables.result_collation= default_charset_info;
2091+
global_system_variables.client_collation= default_charset_info;
2092+
global_system_variables.literal_collation= default_charset_info;
2093+
20902094
charsets_list= list_charsets(MYF(MY_CS_COMPILED | MY_CS_CONFIG));
20912095

20922096
if (use_temp_pool && bitmap_init(&temp_pool,1024,1))
@@ -4566,7 +4570,7 @@ static void set_options(void)
45664570
sizeof(mysql_real_data_home)-1);
45674571

45684572
/* Set default values for some variables */
4569-
global_system_variables.convert_result_charset= TRUE;
4573+
global_system_variables.result_collation= default_charset_info;
45704574
global_system_variables.client_collation= default_charset_info;
45714575
global_system_variables.literal_collation= default_charset_info;
45724576
global_system_variables.table_type= DB_TYPE_MYISAM;

sql/protocol.cc

+2-3
Original file line numberDiff line numberDiff line change
@@ -724,7 +724,7 @@ bool Protocol_simple::store(const char *from, uint length,
724724
bool Protocol_simple::store(const char *from, uint length,
725725
CHARSET_INFO *fromcs)
726726
{
727-
CHARSET_INFO *tocs= this->thd->result_charset(fromcs);
727+
CHARSET_INFO *tocs= this->thd->variables.result_collation;
728728
#ifndef DEBUG_OFF
729729
DBUG_ASSERT(field_types == 0 ||
730730
field_types[field_pos] == MYSQL_TYPE_DECIMAL ||
@@ -834,8 +834,7 @@ bool Protocol_simple::store(Field *field)
834834
field->val_str(&str,&str);
835835
if (!my_charset_same(field->charset(), this->thd->charset()) &&
836836
(field->charset() != &my_charset_bin) &&
837-
(this->thd->charset() != &my_charset_bin) &&
838-
(this->thd->variables.convert_result_charset))
837+
(this->thd->charset() != &my_charset_bin))
839838
{
840839
convert.copy(str.ptr(), str.length(), str.charset(), this->thd->charset());
841840
return net_store_data(convert.ptr(), convert.length());

sql/set_var.cc

+31-17
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,6 @@ sys_var_bool_ptr sys_concurrent_insert("concurrent_insert",
110110
&myisam_concurrent_insert);
111111
sys_var_long_ptr sys_connect_timeout("connect_timeout",
112112
&connect_timeout);
113-
sys_var_thd_bool sys_convert_result_charset("convert_result_charset",
114-
&SV::convert_result_charset);
115113
sys_var_enum sys_delay_key_write("delay_key_write",
116114
&delay_key_write_options,
117115
&delay_key_write_typelib,
@@ -202,6 +200,7 @@ sys_var_thd_ulong sys_read_buff_size("read_buffer_size",
202200
&SV::read_buff_size);
203201
sys_var_thd_ulong sys_read_rnd_buff_size("read_rnd_buffer_size",
204202
&SV::read_rnd_buff_size);
203+
sys_var_result_collation sys_result_collation("result_collation");
205204
sys_var_long_ptr sys_rpl_recovery_rank("rpl_recovery_rank",
206205
&rpl_recovery_rank);
207206
sys_var_long_ptr sys_query_cache_size("query_cache_size",
@@ -347,7 +346,6 @@ sys_var *sys_variables[]=
347346
&sys_client_collation,
348347
&sys_concurrent_insert,
349348
&sys_connect_timeout,
350-
&sys_convert_result_charset,
351349
&sys_default_week_format,
352350
&sys_delay_key_write,
353351
&sys_delayed_insert_limit,
@@ -408,6 +406,7 @@ sys_var *sys_variables[]=
408406
&sys_rand_seed2,
409407
&sys_read_buff_size,
410408
&sys_read_rnd_buff_size,
409+
&sys_result_collation,
411410
&sys_rpl_recovery_rank,
412411
&sys_safe_updates,
413412
&sys_select_limit,
@@ -459,7 +458,6 @@ struct show_var_st init_vars[]= {
459458
{sys_client_collation.name, (char*) &sys_client_collation, SHOW_SYS},
460459
{sys_concurrent_insert.name,(char*) &sys_concurrent_insert, SHOW_SYS},
461460
{sys_connect_timeout.name, (char*) &sys_connect_timeout, SHOW_SYS},
462-
{sys_convert_result_charset.name, (char*) &sys_convert_result_charset, SHOW_SYS},
463461
{"datadir", mysql_real_data_home, SHOW_CHAR},
464462
{"default_week_format", (char*) &sys_default_week_format, SHOW_SYS},
465463
{sys_delay_key_write.name, (char*) &sys_delay_key_write, SHOW_SYS},
@@ -563,6 +561,7 @@ struct show_var_st init_vars[]= {
563561
{sys_pseudo_thread_id.name, (char*) &sys_pseudo_thread_id, SHOW_SYS},
564562
{sys_read_buff_size.name, (char*) &sys_read_buff_size, SHOW_SYS},
565563
{sys_read_rnd_buff_size.name,(char*) &sys_read_rnd_buff_size, SHOW_SYS},
564+
{sys_result_collation.name, (char*) &sys_result_collation, SHOW_SYS},
566565
{sys_rpl_recovery_rank.name,(char*) &sys_rpl_recovery_rank, SHOW_SYS},
567566
#ifdef HAVE_QUERY_CACHE
568567
{sys_query_cache_limit.name,(char*) &sys_query_cache_limit, SHOW_SYS},
@@ -1267,31 +1266,46 @@ void sys_var_literal_collation::set_default(THD *thd, enum_var_type type)
12671266
thd->variables.literal_collation= global_system_variables.literal_collation;
12681267
}
12691268

1269+
bool sys_var_result_collation::update(THD *thd, set_var *var)
1270+
{
1271+
if (var->type == OPT_GLOBAL)
1272+
global_system_variables.result_collation= var->save_result.charset;
1273+
else
1274+
thd->variables.result_collation= var->save_result.charset;
1275+
return 0;
1276+
}
1277+
1278+
byte *sys_var_result_collation::value_ptr(THD *thd, enum_var_type type)
1279+
{
1280+
CHARSET_INFO *cs= ((type == OPT_GLOBAL) ?
1281+
global_system_variables.result_collation :
1282+
thd->variables.result_collation);
1283+
return cs ? (byte*) cs->name : (byte*) "";
1284+
}
1285+
1286+
void sys_var_result_collation::set_default(THD *thd, enum_var_type type)
1287+
{
1288+
if (type == OPT_GLOBAL)
1289+
global_system_variables.result_collation= default_charset_info;
1290+
else
1291+
thd->variables.result_collation= global_system_variables.result_collation;
1292+
}
1293+
12701294

12711295
/*****************************************************************************
12721296
Functions to handle SET NAMES and SET CHARACTER SET
12731297
*****************************************************************************/
12741298

12751299
int set_var_client_collation::check(THD *thd)
12761300
{
1277-
client_charset= client_charset ?
1278-
client_charset : global_system_variables.client_collation;
1279-
client_collation= client_collation ? client_collation : client_charset;
1280-
if (!my_charset_same(client_charset, client_collation))
1281-
{
1282-
my_error(ER_COLLATION_CHARSET_MISMATCH, MYF(0),
1283-
client_collation->name, client_charset->csname);
1284-
return -1;
1285-
}
12861301
return 0;
12871302
}
12881303

12891304
int set_var_client_collation::update(THD *thd)
12901305
{
1291-
thd->variables.client_collation= client_collation;
1292-
thd->variables.literal_collation= convert_result_charset ?
1293-
thd->db_charset: client_collation;
1294-
thd->variables.convert_result_charset= convert_result_charset;
1306+
thd->variables.client_collation= client_collation;
1307+
thd->variables.literal_collation= literal_collation;
1308+
thd->variables.result_collation= result_collation;
12951309
thd->protocol_simple.init(thd);
12961310
thd->protocol_prep.init(thd);
12971311
return 0;

sql/set_var.h

+17-6
Original file line numberDiff line numberDiff line change
@@ -438,6 +438,15 @@ class sys_var_literal_collation :public sys_var_collation
438438
byte *value_ptr(THD *thd, enum_var_type type);
439439
};
440440

441+
class sys_var_result_collation :public sys_var_collation
442+
{
443+
public:
444+
sys_var_result_collation(const char *name_arg) :sys_var_collation(name_arg) {}
445+
bool update(THD *thd, set_var *var);
446+
void set_default(THD *thd, enum_var_type type);
447+
byte *value_ptr(THD *thd, enum_var_type type);
448+
};
449+
441450

442451
/* Variable that you can only read from */
443452

@@ -546,14 +555,16 @@ class set_var_password: public set_var_base
546555

547556
class set_var_client_collation: public set_var_base
548557
{
549-
CHARSET_INFO *client_charset;
550558
CHARSET_INFO *client_collation;
551-
my_bool convert_result_charset;
559+
CHARSET_INFO *literal_collation;
560+
CHARSET_INFO *result_collation;
552561
public:
553-
set_var_client_collation(CHARSET_INFO *cset_arg,
554-
CHARSET_INFO *coll_arg ,my_bool conv_arg)
555-
:client_charset(cset_arg), client_collation(coll_arg),
556-
convert_result_charset(conv_arg)
562+
set_var_client_collation(CHARSET_INFO *client_coll_arg,
563+
CHARSET_INFO *literal_coll_arg,
564+
CHARSET_INFO *result_coll_arg)
565+
:client_collation(client_coll_arg),
566+
literal_collation(literal_coll_arg),
567+
result_collation(result_coll_arg)
557568
{}
558569
int check(THD *thd);
559570
int update(THD *thd);

sql/sql_class.h

+2-4
Original file line numberDiff line numberDiff line change
@@ -378,10 +378,10 @@ struct system_variables
378378
my_bool log_warnings;
379379
my_bool low_priority_updates;
380380
my_bool new_mode;
381-
my_bool convert_result_charset;
382-
381+
383382
CHARSET_INFO *client_collation;
384383
CHARSET_INFO *literal_collation;
384+
CHARSET_INFO *result_collation;
385385
};
386386

387387
void free_tmp_table(THD *thd, TABLE *entry);
@@ -663,8 +663,6 @@ class THD :public ilink
663663
DBUG_PRINT("error",("Fatal error set"));
664664
}
665665
inline CHARSET_INFO *charset() { return variables.client_collation; }
666-
inline CHARSET_INFO *result_charset(CHARSET_INFO *cs)
667-
{ return variables.convert_result_charset ? charset() : cs; }
668666
};
669667

670668
/*

0 commit comments

Comments
 (0)