summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <bar@bar.mysql.r18.ru>2003-05-21 17:44:12 +0500
committerunknown <bar@bar.mysql.r18.ru>2003-05-21 17:44:12 +0500
commit4637832fa19b2866929c1e5cb7c9dd0a40db15c9 (patch)
treec1d41d9ae86450c3c93a4424253c8553ffcec322
parent01add721927cf92ec3368cb56d685777aacbfe42 (diff)
downloadmariadb-git-4637832fa19b2866929c1e5cb7c9dd0a40db15c9.tar.gz
Some SHOW VARIABLES have been renamed:
collation_client -> character_set_client collation_results -> character_set_results character_set -> character_set_server SET NAMES now doesn't start client->server conversion SET CHARACTER SET now starts both client->server and server->client conversion
-rw-r--r--mysql-test/r/ctype_collate.result74
-rw-r--r--mysql-test/r/variables.result6
-rw-r--r--mysql-test/t/ctype_collate.test46
-rw-r--r--mysql-test/t/variables.test4
-rw-r--r--mysys/charset.c4
-rw-r--r--sql/mysqld.cc8
-rw-r--r--sql/protocol.cc14
-rw-r--r--sql/set_var.cc82
-rw-r--r--sql/set_var.h39
-rw-r--r--sql/sql_class.h6
-rw-r--r--sql/sql_yacc.yy18
11 files changed, 133 insertions, 168 deletions
diff --git a/mysql-test/r/ctype_collate.result b/mysql-test/r/ctype_collate.result
index 6e09cff7fd8..e06651da30e 100644
--- a/mysql-test/r/ctype_collate.result
+++ b/mysql-test/r/ctype_collate.result
@@ -4,7 +4,7 @@ CREATE TABLE t1 (
latin1_f CHAR(32) CHARACTER SET latin1 NOT NULL
);
CREATE TABLE t2 (
-latin1_f CHAR(32) CHARACTER SET latin1 COLLATE koi8r NOT NULL
+latin1_f CHAR(32) CHARACTER SET latin1 COLLATE koi8r_general_ci NOT NULL
);
COLLATION 'koi8r_general_ci' is not valid for CHARACTER SET 'latin1'
INSERT INTO t1 (latin1_f) VALUES (_latin1'A');
@@ -63,7 +63,7 @@ z
Ä
ä
ß
-SELECT latin1_f FROM t1 ORDER BY latin1_f COLLATE latin1;
+SELECT latin1_f FROM t1 ORDER BY latin1_f COLLATE latin1_swedish_ci;
latin1_f
A
a
@@ -179,9 +179,9 @@ z
ä
å
ü
-SELECT latin1_f FROM t1 ORDER BY latin1_f COLLATE koi8r;
-COLLATION 'koi8r' is not valid for CHARACTER SET 'latin1'
-SELECT latin1_f COLLATE latin1 AS latin1_f_as FROM t1 ORDER BY latin1_f_as;
+SELECT latin1_f FROM t1 ORDER BY latin1_f COLLATE koi8r_general_ci;
+COLLATION 'koi8r_general_ci' is not valid for CHARACTER SET 'latin1'
+SELECT latin1_f COLLATE latin1_swedish_ci AS latin1_f_as FROM t1 ORDER BY latin1_f_as;
latin1_f_as
A
a
@@ -297,8 +297,8 @@ z
ä
å
ü
-SELECT latin1_f COLLATE koi8r AS latin1_f_as FROM t1 ORDER BY latin1_f_as;
-COLLATION 'koi8r' is not valid for CHARACTER SET 'latin1'
+SELECT latin1_f COLLATE koi8r_general_ci AS latin1_f_as FROM t1 ORDER BY latin1_f_as;
+COLLATION 'koi8r_general_ci' is not valid for CHARACTER SET 'latin1'
SELECT latin1_f,count(*) FROM t1 GROUP BY latin1_f;
latin1_f count(*)
A 2
@@ -314,7 +314,7 @@ Z 2
Å 2
Ä 2
ß 1
-SELECT latin1_f,count(*) FROM t1 GROUP BY latin1_f COLLATE latin1;
+SELECT latin1_f,count(*) FROM t1 GROUP BY latin1_f COLLATE latin1_swedish_ci;
latin1_f count(*)
A 2
AD 2
@@ -389,8 +389,8 @@ z 1
ä 1
å 1
ü 1
-SELECT latin1_f,count(*) FROM t1 GROUP BY latin1_f COLLATE koi8r;
-COLLATION 'koi8r' is not valid for CHARACTER SET 'latin1'
+SELECT latin1_f,count(*) FROM t1 GROUP BY latin1_f COLLATE koi8r_general_ci;
+COLLATION 'koi8r_general_ci' is not valid for CHARACTER SET 'latin1'
SELECT DISTINCT latin1_f FROM t1;
latin1_f
A
@@ -406,8 +406,8 @@ UE
SS
ß
Z
-SELECT DISTINCT latin1_f COLLATE latin1 FROM t1;
-latin1_f COLLATE latin1
+SELECT DISTINCT latin1_f COLLATE latin1_swedish_ci FROM t1;
+latin1_f COLLATE latin1_swedish_ci
A
AD
AE
@@ -511,64 +511,18 @@ SHOW FIELDS FROM t1;
Field Type Collation Null Key Default Extra
latin1_f char(32) latin1_bin YES NULL
SET CHARACTER SET 'latin1';
-SHOW VARIABLES LIKE 'collation_client';
-Variable_name Value
-collation_client latin1_swedish_ci
-SET CHARACTER SET latin1;
-SHOW VARIABLES LIKE 'collation_client';
-Variable_name Value
-collation_client latin1_swedish_ci
-SHOW VARIABLES LIKE 'collation_client';
-Variable_name Value
-collation_client latin1_swedish_ci
-SELECT charset('a'),collation('a'),coercibility('a'),'a'='A';
-charset('a') collation('a') coercibility('a') 'a'='A'
-latin1 latin1_swedish_ci 3 1
-SET CHARACTER SET latin1 COLLATE latin1_bin;
-SHOW VARIABLES LIKE 'collation_client';
-Variable_name Value
-collation_client latin1_bin
-SET CHARACTER SET LATIN1 COLLATE Latin1_Bin;
-SHOW VARIABLES LIKE 'collation_client';
+SHOW VARIABLES LIKE 'character_set_client';
Variable_name Value
-collation_client latin1_bin
-SET CHARACTER SET 'latin1' COLLATE 'latin1_bin';
-SHOW VARIABLES LIKE 'collation_client';
-Variable_name Value
-collation_client latin1_bin
+character_set_client latin1
SELECT charset('a'),collation('a'),coercibility('a'),'a'='A';
charset('a') collation('a') coercibility('a') 'a'='A'
latin1 latin1_swedish_ci 3 1
SET CHARACTER SET koi8r;
SHOW VARIABLES LIKE 'collation_client';
Variable_name Value
-collation_client koi8r_general_ci
-SELECT charset('a'),collation('a'),coercibility('a'),'a'='A';
-charset('a') collation('a') coercibility('a') 'a'='A'
-latin1 latin1_swedish_ci 3 1
-SET CHARACTER SET koi8r COLLATE koi8r_bin;
-SHOW VARIABLES LIKE 'collation_client';
-Variable_name Value
-collation_client koi8r_bin
-SELECT charset('a'),collation('a'),coercibility('a'),'a'='A';
-charset('a') collation('a') coercibility('a') 'a'='A'
-latin1 latin1_swedish_ci 3 1
-SET CHARACTER SET koi8r COLLATE DEFAULT;
-SHOW VARIABLES LIKE 'collation_client';
-Variable_name Value
-collation_client koi8r_general_ci
SELECT charset('a'),collation('a'),coercibility('a'),'a'='A';
charset('a') collation('a') coercibility('a') 'a'='A'
latin1 latin1_swedish_ci 3 1
-SET CHARACTER SET DEFAULT;
-SHOW VARIABLES LIKE 'collation_client';
-Variable_name Value
-collation_client latin1_swedish_ci
-SELECT charset('a'),collation('a'),coercibility('a'),'a'='A';
-charset('a') collation('a') coercibility('a') 'a'='A'
-latin1 latin1_swedish_ci 3 1
-SET CHARACTER SET latin1 COLLATE koi8r;
-COLLATION 'koi8r_general_ci' is not valid for CHARACTER SET 'latin1'
SET CHARACTER SET 'DEFAULT';
Unknown character set: 'DEFAULT'
DROP TABLE t1;
diff --git a/mysql-test/r/variables.result b/mysql-test/r/variables.result
index 5e613418ea1..f1afcedac83 100644
--- a/mysql-test/r/variables.result
+++ b/mysql-test/r/variables.result
@@ -156,9 +156,9 @@ show variables like 'net_buffer_length';
Variable_name Value
net_buffer_length 1048576
set character set cp1251_koi8;
-show variables like "collation_client";
+show variables like "character_set_client";
Variable_name Value
-collation_client cp1251_bulgarian_ci
+character_set_client cp1251
select @@timestamp>0;
@@timestamp>0
1
@@ -185,7 +185,7 @@ set SESSION query_cache_size=10000;
Variable 'query_cache_size' is a GLOBAL variable and should be set with SET GLOBAL
set GLOBAL table_type=DEFAULT;
Variable 'table_type' doesn't have a default value
-set collation_client=UNKNOWN_CHARACTER_SET;
+set character_set_client=UNKNOWN_CHARACTER_SET;
Unknown character set: 'UNKNOWN_CHARACTER_SET'
set global autocommit=1;
Variable 'autocommit' is a LOCAL variable and can't be used with SET GLOBAL
diff --git a/mysql-test/t/ctype_collate.test b/mysql-test/t/ctype_collate.test
index 0b32c3ccf88..0cf531156a9 100644
--- a/mysql-test/t/ctype_collate.test
+++ b/mysql-test/t/ctype_collate.test
@@ -9,7 +9,7 @@ CREATE TABLE t1 (
--error 1251
CREATE TABLE t2 (
- latin1_f CHAR(32) CHARACTER SET latin1 COLLATE koi8r NOT NULL
+ latin1_f CHAR(32) CHARACTER SET latin1 COLLATE koi8r_general_ci NOT NULL
);
@@ -57,39 +57,39 @@ INSERT INTO t1 (latin1_f) VALUES (_latin1'z');
-- ORDER BY
SELECT latin1_f FROM t1 ORDER BY latin1_f;
-SELECT latin1_f FROM t1 ORDER BY latin1_f COLLATE latin1;
+SELECT latin1_f FROM t1 ORDER BY latin1_f COLLATE latin1_swedish_ci;
SELECT latin1_f FROM t1 ORDER BY latin1_f COLLATE latin1_german2_ci;
SELECT latin1_f FROM t1 ORDER BY latin1_f COLLATE latin1_general_ci;
SELECT latin1_f FROM t1 ORDER BY latin1_f COLLATE latin1_bin;
--error 1251
-SELECT latin1_f FROM t1 ORDER BY latin1_f COLLATE koi8r;
+SELECT latin1_f FROM t1 ORDER BY latin1_f COLLATE koi8r_general_ci;
--SELECT latin1_f COLLATE koi8r FROM t1 ;
-- AS + ORDER BY
-SELECT latin1_f COLLATE latin1 AS latin1_f_as FROM t1 ORDER BY latin1_f_as;
+SELECT latin1_f COLLATE latin1_swedish_ci AS latin1_f_as FROM t1 ORDER BY latin1_f_as;
SELECT latin1_f COLLATE latin1_german2_ci AS latin1_f_as FROM t1 ORDER BY latin1_f_as;
SELECT latin1_f COLLATE latin1_general_ci AS latin1_f_as FROM t1 ORDER BY latin1_f_as;
SELECT latin1_f COLLATE latin1_bin AS latin1_f_as FROM t1 ORDER BY latin1_f_as;
--error 1251
-SELECT latin1_f COLLATE koi8r AS latin1_f_as FROM t1 ORDER BY latin1_f_as;
+SELECT latin1_f COLLATE koi8r_general_ci AS latin1_f_as FROM t1 ORDER BY latin1_f_as;
-- GROUP BY
SELECT latin1_f,count(*) FROM t1 GROUP BY latin1_f;
-SELECT latin1_f,count(*) FROM t1 GROUP BY latin1_f COLLATE latin1;
+SELECT latin1_f,count(*) FROM t1 GROUP BY latin1_f COLLATE latin1_swedish_ci;
SELECT latin1_f,count(*) FROM t1 GROUP BY latin1_f COLLATE latin1_german2_ci;
SELECT latin1_f,count(*) FROM t1 GROUP BY latin1_f COLLATE latin1_general_ci;
SELECT latin1_f,count(*) FROM t1 GROUP BY latin1_f COLLATE latin1_bin;
--error 1251
-SELECT latin1_f,count(*) FROM t1 GROUP BY latin1_f COLLATE koi8r;
+SELECT latin1_f,count(*) FROM t1 GROUP BY latin1_f COLLATE koi8r_general_ci;
-- DISTINCT
SELECT DISTINCT latin1_f FROM t1;
-SELECT DISTINCT latin1_f COLLATE latin1 FROM t1;
+SELECT DISTINCT latin1_f COLLATE latin1_swedish_ci FROM t1;
SELECT DISTINCT latin1_f COLLATE latin1_german2_ci FROM t1;
SELECT DISTINCT latin1_f COLLATE latin1_general_ci FROM t1;
SELECT DISTINCT latin1_f COLLATE latin1_bin FROM t1;
@@ -127,35 +127,19 @@ ALTER TABLE t1 CHARACTER SET latin1 COLLATE latin1_bin;
SHOW CREATE TABLE t1;
SHOW FIELDS FROM t1;
+#
+# Check SET CHARACTER SET
+#
+
SET CHARACTER SET 'latin1';
-SHOW VARIABLES LIKE 'collation_client';
-SET CHARACTER SET latin1;
-SHOW VARIABLES LIKE 'collation_client';
-SHOW VARIABLES LIKE 'collation_client';
-SELECT charset('a'),collation('a'),coercibility('a'),'a'='A';
-SET CHARACTER SET latin1 COLLATE latin1_bin;
-SHOW VARIABLES LIKE 'collation_client';
-SET CHARACTER SET LATIN1 COLLATE Latin1_Bin;
-SHOW VARIABLES LIKE 'collation_client';
-SET CHARACTER SET 'latin1' COLLATE 'latin1_bin';
-SHOW VARIABLES LIKE 'collation_client';
+SHOW VARIABLES LIKE 'character_set_client';
SELECT charset('a'),collation('a'),coercibility('a'),'a'='A';
+
SET CHARACTER SET koi8r;
SHOW VARIABLES LIKE 'collation_client';
SELECT charset('a'),collation('a'),coercibility('a'),'a'='A';
-SET CHARACTER SET koi8r COLLATE koi8r_bin;
-SHOW VARIABLES LIKE 'collation_client';
-SELECT charset('a'),collation('a'),coercibility('a'),'a'='A';
-SET CHARACTER SET koi8r COLLATE DEFAULT;
-SHOW VARIABLES LIKE 'collation_client';
-SELECT charset('a'),collation('a'),coercibility('a'),'a'='A';
-SET CHARACTER SET DEFAULT;
-SHOW VARIABLES LIKE 'collation_client';
-SELECT charset('a'),collation('a'),coercibility('a'),'a'='A';
---error 1251
-SET CHARACTER SET latin1 COLLATE koi8r;
+
--error 1115
SET CHARACTER SET 'DEFAULT';
-
DROP TABLE t1;
diff --git a/mysql-test/t/variables.test b/mysql-test/t/variables.test
index d1c8df64be2..32e7db12136 100644
--- a/mysql-test/t/variables.test
+++ b/mysql-test/t/variables.test
@@ -92,7 +92,7 @@ set net_buffer_length=2000000000;
show variables like 'net_buffer_length';
set character set cp1251_koi8;
-show variables like "collation_client";
+show variables like "character_set_client";
select @@timestamp>0;
set @@rand_seed1=10000000,@@rand_seed2=1000000;
@@ -119,7 +119,7 @@ set SESSION query_cache_size=10000;
--error 1230
set GLOBAL table_type=DEFAULT;
--error 1115
-set collation_client=UNKNOWN_CHARACTER_SET;
+set character_set_client=UNKNOWN_CHARACTER_SET;
--error 1228
set global autocommit=1;
--error 1228
diff --git a/mysys/charset.c b/mysys/charset.c
index 2d9500e4b0d..d685104abac 100644
--- a/mysys/charset.c
+++ b/mysys/charset.c
@@ -548,9 +548,7 @@ uint get_charset_number(const char *charset_name)
for (cs= all_charsets; cs < all_charsets+255; ++cs)
{
if ( cs[0] && cs[0]->name &&
- (!my_strcasecmp(&my_charset_latin1, cs[0]->name, charset_name) ||
- (!my_strcasecmp(&my_charset_latin1, cs[0]->csname, charset_name) &&
- (cs[0]->state & MY_CS_PRIMARY))))
+ !my_strcasecmp(&my_charset_latin1, cs[0]->name, charset_name))
return cs[0]->number;
}
return 0; /* this mimics find_type() */
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index b8b57f4e2f3..1036e4d2835 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -2106,8 +2106,8 @@ static int init_common_variables(const char *conf_file_name, int argc,
}
default_charset_info= default_collation;
}
- global_system_variables.collation_results= default_charset_info;
- global_system_variables.collation_client= default_charset_info;
+ global_system_variables.character_set_results= NULL;
+ global_system_variables.character_set_client= default_charset_info;
global_system_variables.collation_connection= default_charset_info;
if (use_temp_pool && bitmap_init(&temp_pool,1024,1))
@@ -4610,8 +4610,8 @@ static void set_options(void)
sizeof(mysql_real_data_home)-1);
/* Set default values for some variables */
- global_system_variables.collation_results= default_charset_info;
- global_system_variables.collation_client= default_charset_info;
+ global_system_variables.character_set_results= NULL;
+ global_system_variables.character_set_client= default_charset_info;
global_system_variables.collation_connection= default_charset_info;
global_system_variables.table_type= DB_TYPE_MYISAM;
global_system_variables.tx_isolation= ISO_REPEATABLE_READ;
diff --git a/sql/protocol.cc b/sql/protocol.cc
index d00ecb5dbc4..09531f0922c 100644
--- a/sql/protocol.cc
+++ b/sql/protocol.cc
@@ -709,7 +709,7 @@ bool Protocol_simple::store(const char *from, uint length,
field_types[field_pos] <= MYSQL_TYPE_GEOMETRY));
field_pos++;
#endif
- if (!my_charset_same(fromcs, tocs) &&
+ if (tocs && !my_charset_same(fromcs, tocs) &&
(fromcs != &my_charset_bin) &&
(tocs != &my_charset_bin))
{
@@ -724,7 +724,7 @@ bool Protocol_simple::store(const char *from, uint length,
bool Protocol_simple::store(const char *from, uint length,
CHARSET_INFO *fromcs)
{
- CHARSET_INFO *tocs= this->thd->variables.collation_results;
+ CHARSET_INFO *tocs= this->thd->variables.character_set_results;
#ifndef DEBUG_OFF
DBUG_ASSERT(field_types == 0 ||
field_types[field_pos] == MYSQL_TYPE_DECIMAL ||
@@ -732,7 +732,7 @@ bool Protocol_simple::store(const char *from, uint length,
field_types[field_pos] <= MYSQL_TYPE_GEOMETRY));
field_pos++;
#endif
- if (!my_charset_same(fromcs, tocs) &&
+ if (tocs && !my_charset_same(fromcs, tocs) &&
(fromcs != &my_charset_bin) &&
(tocs != &my_charset_bin))
{
@@ -831,12 +831,14 @@ bool Protocol_simple::store(Field *field)
#endif
char buff[MAX_FIELD_WIDTH];
String str(buff,sizeof(buff), &my_charset_bin);
+ CHARSET_INFO *tocs= this->thd->variables.character_set_results;
+
field->val_str(&str,&str);
- if (!my_charset_same(field->charset(), this->thd->charset()) &&
+ if (tocs && !my_charset_same(field->charset(), tocs) &&
(field->charset() != &my_charset_bin) &&
- (this->thd->charset() != &my_charset_bin))
+ (tocs != &my_charset_bin))
{
- convert.copy(str.ptr(), str.length(), str.charset(), this->thd->charset());
+ convert.copy(str.ptr(), str.length(), str.charset(), tocs);
return net_store_data(convert.ptr(), convert.length());
}
else
diff --git a/sql/set_var.cc b/sql/set_var.cc
index c9b8584e672..a102991a0f2 100644
--- a/sql/set_var.cc
+++ b/sql/set_var.cc
@@ -101,7 +101,7 @@ sys_var_long_ptr sys_binlog_cache_size("binlog_cache_size",
&binlog_cache_size);
sys_var_thd_ulong sys_bulk_insert_buff_size("bulk_insert_buffer_size",
&SV::bulk_insert_buff_size);
-sys_var_str sys_charset("character_set",
+sys_var_str sys_charset("character_set_server",
sys_check_charset,
sys_update_charset,
sys_set_default_charset);
@@ -109,9 +109,9 @@ sys_var_str sys_charset_system("character_set_system",
sys_check_charset,
sys_update_charset,
sys_set_default_charset);
-sys_var_collation_client sys_collation_client("collation_client");
+sys_var_character_set_client sys_character_set_client("character_set_client");
+sys_var_character_set_results sys_character_set_results("character_set_results");
sys_var_collation_connection sys_collation_connection("collation_connection");
-sys_var_collation_results sys_collation_results("collation_results");
sys_var_bool_ptr sys_concurrent_insert("concurrent_insert",
&myisam_concurrent_insert);
sys_var_long_ptr sys_connect_timeout("connect_timeout",
@@ -353,9 +353,9 @@ sys_var *sys_variables[]=
&sys_binlog_cache_size,
&sys_buffer_results,
&sys_bulk_insert_buff_size,
- &sys_collation_client,
+ &sys_character_set_client,
+ &sys_character_set_results,
&sys_collation_connection,
- &sys_collation_results,
&sys_concurrent_insert,
&sys_connect_timeout,
&sys_default_week_format,
@@ -469,9 +469,9 @@ struct show_var_st init_vars[]= {
{sys_bulk_insert_buff_size.name,(char*) &sys_bulk_insert_buff_size,SHOW_SYS},
{sys_charset.name, (char*) &sys_charset, SHOW_SYS},
{sys_charset_system.name, (char*) &sys_charset_system, SHOW_SYS},
- {sys_collation_client.name, (char*) &sys_collation_client, SHOW_SYS},
+ {sys_character_set_client.name,(char*) &sys_character_set_client,SHOW_SYS},
+ {sys_character_set_results.name,(char*) &sys_character_set_results, SHOW_SYS},
{sys_collation_connection.name,(char*) &sys_collation_connection, SHOW_SYS},
- {sys_collation_results.name, (char*) &sys_collation_results, SHOW_SYS},
{sys_concurrent_insert.name,(char*) &sys_concurrent_insert, SHOW_SYS},
{sys_connect_timeout.name, (char*) &sys_connect_timeout, SHOW_SYS},
{"datadir", mysql_real_data_home, SHOW_CHAR},
@@ -1207,7 +1207,7 @@ CHARSET_INFO *get_old_charset_by_name(const char *name)
for (c= old_conv; c->old_name; c++)
{
if (!my_strcasecmp(&my_charset_latin1,name,c->old_name))
- return get_charset_by_name(c->new_name,MYF(0));
+ return get_charset_by_csname(c->new_name,MY_CS_PRIMARY,MYF(0));
}
return NULL;
}
@@ -1221,7 +1221,25 @@ bool sys_var_collation::check(THD *thd, set_var *var)
if (!(res=var->value->val_str(&str)))
res= &empty_string;
- if (!(tmp=get_charset_by_name(res->c_ptr(),MYF(0))) &&
+ if (!(tmp=get_charset_by_name(res->c_ptr(),MYF(0))))
+ {
+ my_error(ER_UNKNOWN_CHARACTER_SET, MYF(0), res->c_ptr());
+ return 1;
+ }
+ var->save_result.charset= tmp; // Save for update
+ return 0;
+}
+
+bool sys_var_character_set::check(THD *thd, set_var *var)
+{
+ CHARSET_INFO *tmp;
+ char buff[80];
+ String str(buff,sizeof(buff), system_charset_info), *res;
+
+ if (!(res=var->value->val_str(&str)))
+ res= &empty_string;
+
+ if (!(tmp=get_charset_by_csname(res->c_ptr(),MY_CS_PRIMARY,MYF(0))) &&
!(tmp=get_old_charset_by_name(res->c_ptr())))
{
my_error(ER_UNKNOWN_CHARACTER_SET, MYF(0), res->c_ptr());
@@ -1231,29 +1249,29 @@ bool sys_var_collation::check(THD *thd, set_var *var)
return 0;
}
-bool sys_var_collation_client::update(THD *thd, set_var *var)
+bool sys_var_character_set_client::update(THD *thd, set_var *var)
{
if (var->type == OPT_GLOBAL)
- global_system_variables.collation_client= var->save_result.charset;
+ global_system_variables.character_set_client= var->save_result.charset;
else
- thd->variables.collation_client= var->save_result.charset;
+ thd->variables.character_set_client= var->save_result.charset;
return 0;
}
-byte *sys_var_collation_client::value_ptr(THD *thd, enum_var_type type)
+byte *sys_var_character_set_client::value_ptr(THD *thd, enum_var_type type)
{
CHARSET_INFO *cs= ((type == OPT_GLOBAL) ?
- global_system_variables.collation_client :
- thd->variables.collation_client);
- return cs ? (byte*) cs->name : (byte*) "";
+ global_system_variables.character_set_client :
+ thd->variables.character_set_client);
+ return cs ? (byte*) cs->csname : (byte*) "NULL";
}
-void sys_var_collation_client::set_default(THD *thd, enum_var_type type)
+void sys_var_character_set_client::set_default(THD *thd, enum_var_type type)
{
if (type == OPT_GLOBAL)
- global_system_variables.collation_client= default_charset_info;
+ global_system_variables.character_set_client= default_charset_info;
else
- thd->variables.collation_client= global_system_variables.collation_client;
+ thd->variables.character_set_client= global_system_variables.character_set_client;
}
@@ -1271,7 +1289,7 @@ byte *sys_var_collation_connection::value_ptr(THD *thd, enum_var_type type)
CHARSET_INFO *cs= ((type == OPT_GLOBAL) ?
global_system_variables.collation_connection :
thd->variables.collation_connection);
- return cs ? (byte*) cs->name : (byte*) "";
+ return cs ? (byte*) cs->name : (byte*) "NULL";
}
void sys_var_collation_connection::set_default(THD *thd, enum_var_type type)
@@ -1282,29 +1300,29 @@ void sys_var_collation_connection::set_default(THD *thd, enum_var_type type)
thd->variables.collation_connection= global_system_variables.collation_connection;
}
-bool sys_var_collation_results::update(THD *thd, set_var *var)
+bool sys_var_character_set_results::update(THD *thd, set_var *var)
{
if (var->type == OPT_GLOBAL)
- global_system_variables.collation_results= var->save_result.charset;
+ global_system_variables.character_set_results= var->save_result.charset;
else
- thd->variables.collation_results= var->save_result.charset;
+ thd->variables.character_set_results= var->save_result.charset;
return 0;
}
-byte *sys_var_collation_results::value_ptr(THD *thd, enum_var_type type)
+byte *sys_var_character_set_results::value_ptr(THD *thd, enum_var_type type)
{
CHARSET_INFO *cs= ((type == OPT_GLOBAL) ?
- global_system_variables.collation_results :
- thd->variables.collation_results);
- return cs ? (byte*) cs->name : (byte*) "";
+ global_system_variables.character_set_results :
+ thd->variables.character_set_results);
+ return cs ? (byte*) cs->csname : (byte*) "NULL";
}
-void sys_var_collation_results::set_default(THD *thd, enum_var_type type)
+void sys_var_character_set_results::set_default(THD *thd, enum_var_type type)
{
if (type == OPT_GLOBAL)
- global_system_variables.collation_results= default_charset_info;
+ global_system_variables.character_set_results= NULL;
else
- thd->variables.collation_results= global_system_variables.collation_results;
+ thd->variables.character_set_results= global_system_variables.character_set_results;
}
@@ -1319,9 +1337,9 @@ int set_var_collation_client::check(THD *thd)
int set_var_collation_client::update(THD *thd)
{
- thd->variables.collation_client= collation_client;
+ thd->variables.character_set_client= character_set_client;
+ thd->variables.character_set_results= character_set_results;
thd->variables.collation_connection= collation_connection;
- thd->variables.collation_results= collation_results;
thd->protocol_simple.init(thd);
thd->protocol_prep.init(thd);
return 0;
diff --git a/sql/set_var.h b/sql/set_var.h
index 03cc3b30a03..d381843df0d 100644
--- a/sql/set_var.h
+++ b/sql/set_var.h
@@ -420,34 +420,49 @@ SHOW_TYPE type() { return SHOW_CHAR; }
virtual void set_default(THD *thd, enum_var_type type)= 0;
};
-class sys_var_collation_client :public sys_var_collation
+class sys_var_character_set :public sys_var_thd
{
public:
- sys_var_collation_client(const char *name_arg) :sys_var_collation(name_arg) {}
+ sys_var_character_set(const char *name_arg) :sys_var_thd(name_arg) {}
+ bool check(THD *thd, set_var *var);
+SHOW_TYPE type() { return SHOW_CHAR; }
+ bool check_update_type(Item_result type)
+ {
+ return type != STRING_RESULT; /* Only accept strings */
+ }
+ bool check_default(enum_var_type type) { return 0; }
+ virtual void set_default(THD *thd, enum_var_type type)= 0;
+};
+
+class sys_var_character_set_client :public sys_var_character_set
+{
+public:
+ sys_var_character_set_client(const char *name_arg) :
+ sys_var_character_set(name_arg) {}
bool update(THD *thd, set_var *var);
void set_default(THD *thd, enum_var_type type);
byte *value_ptr(THD *thd, enum_var_type type);
};
-class sys_var_collation_connection :public sys_var_collation
+class sys_var_character_set_results :public sys_var_character_set
{
public:
- sys_var_collation_connection(const char *name_arg) :sys_var_collation(name_arg) {}
+ sys_var_character_set_results(const char *name_arg) :
+ sys_var_character_set(name_arg) {}
bool update(THD *thd, set_var *var);
void set_default(THD *thd, enum_var_type type);
byte *value_ptr(THD *thd, enum_var_type type);
};
-class sys_var_collation_results :public sys_var_collation
+class sys_var_collation_connection :public sys_var_collation
{
public:
- sys_var_collation_results(const char *name_arg) :sys_var_collation(name_arg) {}
+ sys_var_collation_connection(const char *name_arg) :sys_var_collation(name_arg) {}
bool update(THD *thd, set_var *var);
void set_default(THD *thd, enum_var_type type);
byte *value_ptr(THD *thd, enum_var_type type);
};
-
/* Variable that you can only read from */
class sys_var_readonly: public sys_var
@@ -555,16 +570,16 @@ public:
class set_var_collation_client: public set_var_base
{
- CHARSET_INFO *collation_client;
+ CHARSET_INFO *character_set_client;
+ CHARSET_INFO *character_set_results;
CHARSET_INFO *collation_connection;
- CHARSET_INFO *collation_results;
public:
set_var_collation_client(CHARSET_INFO *client_coll_arg,
CHARSET_INFO *connection_coll_arg,
CHARSET_INFO *result_coll_arg)
- :collation_client(client_coll_arg),
- collation_connection(connection_coll_arg),
- collation_results(result_coll_arg)
+ :character_set_client(client_coll_arg),
+ character_set_results(result_coll_arg),
+ collation_connection(connection_coll_arg)
{}
int check(THD *thd);
int update(THD *thd);
diff --git a/sql/sql_class.h b/sql/sql_class.h
index 36427eae43e..08043e7e626 100644
--- a/sql/sql_class.h
+++ b/sql/sql_class.h
@@ -385,9 +385,9 @@ struct system_variables
my_bool low_priority_updates;
my_bool new_mode;
- CHARSET_INFO *collation_client;
+ CHARSET_INFO *character_set_client;
+ CHARSET_INFO *character_set_results;
CHARSET_INFO *collation_connection;
- CHARSET_INFO *collation_results;
};
void free_tmp_table(THD *thd, TABLE *entry);
@@ -670,7 +670,7 @@ public:
net.report_error= 1;
DBUG_PRINT("error",("Fatal error set"));
}
- inline CHARSET_INFO *charset() { return variables.collation_client; }
+ inline CHARSET_INFO *charset() { return variables.character_set_client; }
};
/*
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index e3b2c738949..4de0e2f8c13 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -1411,7 +1411,7 @@ opt_binary:
| BINARY { Lex->charset=&my_charset_bin; }
| UNICODE_SYM
{
- if (!(Lex->charset=get_charset_by_name("ucs2",MYF(0))))
+ if (!(Lex->charset=get_charset_by_csname("ucs2",MY_CS_PRIMARY,MYF(0))))
{
net_printf(YYTHD,ER_UNKNOWN_CHARACTER_SET,"ucs2");
YYABORT;
@@ -4420,31 +4420,25 @@ option_value:
find_sys_var("tx_isolation"),
new Item_int((int32) $4)));
}
- | charset old_or_new_charset_name_or_default opt_collate
+ | charset old_or_new_charset_name_or_default
{
THD *thd= YYTHD;
LEX *lex= Lex;
- $2= $2 ? $2: global_system_variables.collation_client;
- $3= $3 ? $3 : $2;
- if (!my_charset_same($2,$3))
- {
- net_printf(thd,ER_COLLATION_CHARSET_MISMATCH,$3->name,$2->csname);
- YYABORT;
- }
- lex->var_list.push_back(new set_var_collation_client($3,thd->db_charset,$3));
+ $2= $2 ? $2: global_system_variables.character_set_client;
+ lex->var_list.push_back(new set_var_collation_client($2,thd->db_charset,$2));
}
| NAMES_SYM charset_name_or_default opt_collate
{
THD *thd= YYTHD;
LEX *lex= Lex;
- $2= $2 ? $2 : global_system_variables.collation_client;
+ $2= $2 ? $2 : global_system_variables.character_set_client;
$3= $3 ? $3 : $2;
if (!my_charset_same($2,$3))
{
net_printf(thd,ER_COLLATION_CHARSET_MISMATCH,$3->name,$2->csname);
YYABORT;
}
- lex->var_list.push_back(new set_var_collation_client($3,$3,$3));
+ lex->var_list.push_back(new set_var_collation_client($3,$3,NULL));
}
| PASSWORD equal text_or_password
{