mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
insert table select * from table2 now converts charsets correctly
This commit is contained in:
@@ -1,7 +1,8 @@
|
|||||||
SET CHARACTER SET koi8r;
|
SET CHARACTER SET koi8r;
|
||||||
DROP TABLE IF EXISTS <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, t1;
|
DROP TABLE IF EXISTS <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, t1, t2;
|
||||||
SET CHARACTER SET koi8r;
|
SET CHARACTER SET koi8r;
|
||||||
CREATE TABLE t1 (a CHAR(10) CHARACTER SET cp1251) SELECT _koi8r'<27><><EFBFBD><EFBFBD><EFBFBD>' AS a;
|
CREATE TABLE t1 (a CHAR(10) CHARACTER SET cp1251) SELECT _koi8r'<27><><EFBFBD><EFBFBD><EFBFBD>' AS a;
|
||||||
|
CREATE TABLE t2 (a CHAR(10) CHARACTER SET utf8);
|
||||||
SHOW CREATE TABLE t1;
|
SHOW CREATE TABLE t1;
|
||||||
Table Create Table
|
Table Create Table
|
||||||
t1 CREATE TABLE `t1` (
|
t1 CREATE TABLE `t1` (
|
||||||
@@ -13,7 +14,26 @@ a
|
|||||||
SELECT HEX(a) FROM t1;
|
SELECT HEX(a) FROM t1;
|
||||||
HEX(a)
|
HEX(a)
|
||||||
EFF0EEE1E0
|
EFF0EEE1E0
|
||||||
DROP TABLE t1;
|
INSERT t2 SELECT * FROM t1;
|
||||||
|
SELECT HEX(a) FROM t2;
|
||||||
|
HEX(a)
|
||||||
|
D0BFD180D0BED0B1D0B0
|
||||||
|
DROP TABLE t1, t2;
|
||||||
|
CREATE TABLE t1 (a TEXT CHARACTER SET cp1251) SELECT _koi8r'<27><><EFBFBD><EFBFBD><EFBFBD>' AS a;
|
||||||
|
CREATE TABLE t2 (a TEXT CHARACTER SET utf8);
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`a` text character set cp1251
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
|
SELECT HEX(a) FROM t1;
|
||||||
|
HEX(a)
|
||||||
|
EFF0EEE1E0
|
||||||
|
INSERT t2 SELECT * FROM t1;
|
||||||
|
SELECT HEX(a) FROM t2;
|
||||||
|
HEX(a)
|
||||||
|
D0BFD180D0BED0B1D0B0
|
||||||
|
DROP TABLE t1, t2;
|
||||||
CREATE TABLE `<60><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>`
|
CREATE TABLE `<60><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>`
|
||||||
(
|
(
|
||||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> CHAR(32) CHARACTER SET koi8r NOT NULL COMMENT "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>"
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> CHAR(32) CHARACTER SET koi8r NOT NULL COMMENT "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>"
|
||||||
|
@@ -1,15 +1,27 @@
|
|||||||
SET CHARACTER SET koi8r;
|
SET CHARACTER SET koi8r;
|
||||||
|
|
||||||
--disable_warnings
|
--disable_warnings
|
||||||
DROP TABLE IF EXISTS <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, t1;
|
DROP TABLE IF EXISTS <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, t1, t2;
|
||||||
--enable_warnings
|
--enable_warnings
|
||||||
|
|
||||||
SET CHARACTER SET koi8r;
|
SET CHARACTER SET koi8r;
|
||||||
CREATE TABLE t1 (a CHAR(10) CHARACTER SET cp1251) SELECT _koi8r'<27><><EFBFBD><EFBFBD><EFBFBD>' AS a;
|
CREATE TABLE t1 (a CHAR(10) CHARACTER SET cp1251) SELECT _koi8r'<27><><EFBFBD><EFBFBD><EFBFBD>' AS a;
|
||||||
|
CREATE TABLE t2 (a CHAR(10) CHARACTER SET utf8);
|
||||||
SHOW CREATE TABLE t1;
|
SHOW CREATE TABLE t1;
|
||||||
SELECT a FROM t1;
|
SELECT a FROM t1;
|
||||||
SELECT HEX(a) FROM t1;
|
SELECT HEX(a) FROM t1;
|
||||||
DROP TABLE t1;
|
INSERT t2 SELECT * FROM t1;
|
||||||
|
SELECT HEX(a) FROM t2;
|
||||||
|
DROP TABLE t1, t2;
|
||||||
|
|
||||||
|
# same with TEXT
|
||||||
|
CREATE TABLE t1 (a TEXT CHARACTER SET cp1251) SELECT _koi8r'<27><><EFBFBD><EFBFBD><EFBFBD>' AS a;
|
||||||
|
CREATE TABLE t2 (a TEXT CHARACTER SET utf8);
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
SELECT HEX(a) FROM t1;
|
||||||
|
INSERT t2 SELECT * FROM t1;
|
||||||
|
SELECT HEX(a) FROM t2;
|
||||||
|
DROP TABLE t1, t2;
|
||||||
|
|
||||||
CREATE TABLE `<60><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>`
|
CREATE TABLE `<60><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>`
|
||||||
(
|
(
|
||||||
|
@@ -17,7 +17,7 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
Functions to copy data to or from fields
|
Functions to copy data to or from fields
|
||||||
This could be done with a single short function but opencooding this
|
This could be done with a single short function but opencoding this
|
||||||
gives much more speed.
|
gives much more speed.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -549,6 +549,7 @@ void field_conv(Field *to,Field *from)
|
|||||||
if (to->pack_length() == from->pack_length() &&
|
if (to->pack_length() == from->pack_length() &&
|
||||||
to->real_type() != FIELD_TYPE_ENUM &&
|
to->real_type() != FIELD_TYPE_ENUM &&
|
||||||
to->real_type() != FIELD_TYPE_SET &&
|
to->real_type() != FIELD_TYPE_SET &&
|
||||||
|
from->charset() == to->charset() &&
|
||||||
to->table->db_low_byte_first == from->table->db_low_byte_first)
|
to->table->db_low_byte_first == from->table->db_low_byte_first)
|
||||||
{ // Identical fields
|
{ // Identical fields
|
||||||
memcpy(to->ptr,from->ptr,to->pack_length());
|
memcpy(to->ptr,from->ptr,to->pack_length());
|
||||||
@@ -562,7 +563,7 @@ void field_conv(Field *to,Field *from)
|
|||||||
if (!blob->value.is_alloced() &&
|
if (!blob->value.is_alloced() &&
|
||||||
from->real_type() != FIELD_TYPE_STRING)
|
from->real_type() != FIELD_TYPE_STRING)
|
||||||
blob->value.copy();
|
blob->value.copy();
|
||||||
blob->store(blob->value.ptr(),blob->value.length(),to->charset());
|
blob->store(blob->value.ptr(),blob->value.length(),from->charset());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if ((from->result_type() == STRING_RESULT &&
|
if ((from->result_type() == STRING_RESULT &&
|
||||||
@@ -574,8 +575,7 @@ void field_conv(Field *to,Field *from)
|
|||||||
char buff[MAX_FIELD_WIDTH];
|
char buff[MAX_FIELD_WIDTH];
|
||||||
String result(buff,sizeof(buff),from->charset());
|
String result(buff,sizeof(buff),from->charset());
|
||||||
from->val_str(&result,&result);
|
from->val_str(&result,&result);
|
||||||
to->store(result.c_ptr_quick(),result.length(),to->charset());
|
to->store(result.c_ptr_quick(),result.length(),from->charset());
|
||||||
// QQ: what to do if "from" and "to" are of dirrent charsets?
|
|
||||||
}
|
}
|
||||||
else if (from->result_type() == REAL_RESULT)
|
else if (from->result_type() == REAL_RESULT)
|
||||||
to->store(from->val_real());
|
to->store(from->val_real());
|
||||||
|
Reference in New Issue
Block a user