mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 20:42:30 +01:00
791374354c
- Adding Type_handler::make_table_field() and moving pieces of the code from Item::tmp_table_field_from_field_type() to virtual implementations for various type handlers. - Adding a new Type_all_attributes, to access to Item's extended attributes, such as decimal_precision() and geometry_type(). - Adding a new class Record_addr, to pass record related information to Type_handler methods (ptr, null_ptr and null_bit) as a single structure. Note, later it will possibly be extended for BIT-alike field purposes, by adding new members (bit_ptr_arg, bit_ofs_arg). - Moving the code from Field_new_decimal::create_from_item() to Type_handler_newdecimal::make_table_field(). - Removing Field_new_decimal() and Field_geom() helper constructor variants that were used for temporary field creation. - Adding Item_field::type_handler(), Field::type_handler() and Field_blob::type_handler() to return correct type handlers for blob variants, according to Field_blob::packlength. - Adding Type_handler_blob_common, as a common parent for Type_handler_tiny_blob, Type_handler_blob, Type_handler_medium_blob and Type_handler_long_blob. - Implementing Type_handler_blob_common::Item_hybrid_func_fix_attributes(). It's needed for cases when TEXT variants of different character sets are mixed in LEAST, GREATEST, CASE and its abreviations (IF, IFNULL, COALESCE), e.g.: CREATE TABLE t1 ( a TINYTEXT CHARACTER SET latin1, b TINYTEXT CHARACTER SET utf8 ); CREATE TABLE t2 AS SELECT COALESCE(a,b) FROM t1; Type handler aggregation returns TINYTEXT as a common data type for the two columns. But as conversion from latin1 to utf8 happens for "a", the maximum possible length of "a" grows from 255 to 255*3. Type_handler_blob_common::Item_hybrid_func_fix_attributes() makes sure to update the blob type handler according to max_length. - Adding Type_handler::blob_type_handler(uint max_octet_length). - Adding a few m_type_aggregator_for_result.add() pairs, because now Item_xxx::type_handler() can return pointers to type_handler_tiny_blob, type_handler_blob, type_handler_medium_blob, type_handler_long_blob. Before the patch only type_handler_blob was possible result of type_handler(). - Making type_handler_tiny_blob, type_handler_blob, type_handler_medium_blob, type_handler_long_blob public. - Removing the condition in Item_sum_avg::create_tmp_field() checking Item_sum_avg::result_type() against DECIMAL_RESULT. Now both REAL_RESULT and DECIMAL_RESULT are symmetrically handled by tmp_table_field_from_field_type(). - Removing Item_geometry_func::create_field_for_create_select(), as the inherited version perfectly works. - Fixing Item_func_as_wkb::field_type() to return MYSQL_TYPE_LONG_BLOB rather than MYSQL_TYPE_BLOB. It's needed to make sure that tmp_table_field_from_field_type() creates a LONGBLOB field for AsWKB(). - Fixing Item_func_as_wkt::fix_length_and_dec() to set max_length to UINT32_MAX rather than MAX_BLOB_WIDTH, to make sure that tmp_table_field_from_field_type() creates a LONGTEXT field for AsWKT(). - Removing Item_func_set_user_var::create_field_for_create_select(), as the inherited version works fine. - Adding Item_func_get_user_var::create_field_for_create_select() to make sure that "CREATE TABLE t1 AS SELECT @string_user variable" always creates a field of LONGTEXT/LONGBLOB type. - Item_func_ifnull::create_field_for_create_select() behavior has changed. Before the patch it passed set_blob_packflag=false, which meant to create LONGBLOB for all blob variants. Now it takes into account max_length, which gives better column data types for: CREATE TABLE t2 AS SELECT IFNULL(blob_column1, blob_column2) FROM t1; - Fixing Item_func_nullif::fix_length_and_dec() to use set_handler(args[2]->type_handler()) instead of set_handler_by_field_type(args[2]->field_type()). This is needed to distinguish between BLOB variants. - Implementing Item_blob::type_handler(), to make sure to create proper BLOB field variant, according to max_length, for queries like: CREATE TABLE t1 AS SELECT some_blob_field FROM INFORMATION_SCHEMA.SOME_TABLE; - Fixing Item_field::real_type_handler() to make sure that the code aggregating fields for UNION gets a proper BLOB variant type handler from fields. - Adding a special code into Item_type_holder::make_field_by_type(), to make sure that after aggregating field types it also properly takes into account max_length when mixing TEXT variants of different character sets and chooses a proper TEXT variant: CREATE TABLE t1 ( a TINYTEXT CHARACTER SET latin1, b TINYTEXT CHARACTER SET utf8 ); CREATE TABLE t2 AS SELECT a FROM t1 UNION SELECT b FROM t1; - Adding tests, for better coverage of IFNULL, NULLIF, UNION. - The fact that tmp_table_field_from_field_type() now takes into account BLOB variants (instead of always creating LONGBLOB), tests results for WEIGHT_STRING() and NULLIF() and UNION have become more precise.
172 lines
6 KiB
Text
172 lines
6 KiB
Text
drop table if exists t1;
|
|
set global max_allowed_packet=1048576;
|
|
connect conn1,localhost,root,,;
|
|
connection conn1;
|
|
set names latin1;
|
|
select hex(weight_string(0x010203));
|
|
hex(weight_string(0x010203))
|
|
010203
|
|
select hex(weight_string('aa' as char(3)));
|
|
hex(weight_string('aa' as char(3)))
|
|
414120
|
|
select hex(weight_string('a' as char(-1)));
|
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '-1)))' at line 1
|
|
select hex(weight_string('a' as char(0)));
|
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '0)))' at line 1
|
|
select hex(weight_string('a' as char(1)));
|
|
hex(weight_string('a' as char(1)))
|
|
41
|
|
select hex(weight_string('ab' as char(1)));
|
|
hex(weight_string('ab' as char(1)))
|
|
41
|
|
select hex(weight_string('ab'));
|
|
hex(weight_string('ab'))
|
|
4142
|
|
select hex(weight_string('aa' as binary(3)));
|
|
hex(weight_string('aa' as binary(3)))
|
|
616100
|
|
select hex(weight_string(cast('aa' as binary(3))));
|
|
hex(weight_string(cast('aa' as binary(3))))
|
|
616100
|
|
select hex(weight_string('ab' level 1-1 ASC));
|
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'ASC))' at line 1
|
|
select hex(weight_string('ab' level 1-1 DESC));
|
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'DESC))' at line 1
|
|
select hex(weight_string('ab' level 1-1 REVERSE));
|
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'REVERSE))' at line 1
|
|
select hex(weight_string('ab' level 1 ASC));
|
|
hex(weight_string('ab' level 1 ASC))
|
|
4142
|
|
select hex(weight_string('ab' level 1 DESC));
|
|
hex(weight_string('ab' level 1 DESC))
|
|
BEBD
|
|
select hex(weight_string('ab' level 1 REVERSE));
|
|
hex(weight_string('ab' level 1 REVERSE))
|
|
4241
|
|
select hex(weight_string('ab' level 1 DESC REVERSE));
|
|
hex(weight_string('ab' level 1 DESC REVERSE))
|
|
BDBE
|
|
create table t1 select weight_string('test') as w;
|
|
show create table t1;
|
|
Table Create Table
|
|
t1 CREATE TABLE `t1` (
|
|
`w` varbinary(4) DEFAULT NULL
|
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
|
drop table t1;
|
|
create table t1 select weight_string(repeat('t',66000)) as w;
|
|
show create table t1;
|
|
Table Create Table
|
|
t1 CREATE TABLE `t1` (
|
|
`w` mediumblob DEFAULT NULL
|
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
|
drop table t1;
|
|
select weight_string(NULL);
|
|
weight_string(NULL)
|
|
NULL
|
|
select 1 as weight_string, 2 as reverse;
|
|
weight_string reverse
|
|
1 2
|
|
select coercibility(weight_string('test'));
|
|
coercibility(weight_string('test'))
|
|
4
|
|
select coercibility(weight_string('test' collate latin1_swedish_ci));
|
|
coercibility(weight_string('test' collate latin1_swedish_ci))
|
|
0
|
|
create table t1 (s1 varchar(5));
|
|
insert into t1 values ('a'),(null);
|
|
select hex(weight_string(s1)) from t1 order by s1;
|
|
hex(weight_string(s1))
|
|
NULL
|
|
41
|
|
drop table t1;
|
|
#
|
|
# BUG#11898467 - SERVER CRASHES ON SELECT HEX(WEIGHT_STRING(STR AS [CHAR|BINARY](N))) IF N IS BIG
|
|
#
|
|
SELECT HEX(WEIGHT_STRING('ab' AS CHAR(1000000000000000000)));
|
|
HEX(WEIGHT_STRING('ab' AS CHAR(1000000000000000000)))
|
|
NULL
|
|
Warnings:
|
|
Warning 1301 Result of weight_string() was larger than max_allowed_packet (1048576) - truncated
|
|
SELECT HEX(WEIGHT_STRING('ab' AS BINARY(1000000000000000000)));
|
|
HEX(WEIGHT_STRING('ab' AS BINARY(1000000000000000000)))
|
|
NULL
|
|
Warnings:
|
|
Warning 1301 Result of cast_as_binary() was larger than max_allowed_packet (1048576) - truncated
|
|
Warning 1301 Result of weight_string() was larger than max_allowed_packet (1048576) - truncated
|
|
disconnect conn1;
|
|
connection default;
|
|
set global max_allowed_packet=default;
|
|
#
|
|
# Start of 10.1 tests
|
|
#
|
|
#
|
|
# MDEV-8369 Unexpected impossible WHERE for a condition on a ZEROFILL field
|
|
#
|
|
CREATE TABLE t1 (a INT(6) ZEROFILL);
|
|
INSERT INTO t1 VALUES (1),(2);
|
|
SELECT * FROM t1 WHERE a=1;
|
|
a
|
|
000001
|
|
SELECT * FROM t1 WHERE WEIGHT_STRING(a) IS NULL;
|
|
a
|
|
000001
|
|
000002
|
|
SELECT * FROM t1 WHERE a=1 AND WEIGHT_STRING(a) IS NULL;
|
|
a
|
|
000001
|
|
EXPLAIN EXTENDED
|
|
SELECT * FROM t1 WHERE a=1 AND WEIGHT_STRING(a) IS NULL;
|
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 2 100.00 Using where
|
|
Warnings:
|
|
Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where `test`.`t1`.`a` = 1 and weight_string(`test`.`t1`.`a`,0,0,1) is null
|
|
ALTER TABLE t1 MODIFY a DOUBLE ZEROFILL;
|
|
SELECT * FROM t1 WHERE a=1 AND WEIGHT_STRING(a) IS NULL;
|
|
a
|
|
0000000000000000000001
|
|
EXPLAIN EXTENDED
|
|
SELECT * FROM t1 WHERE a=1 AND WEIGHT_STRING(a) IS NULL;
|
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 2 100.00 Using where
|
|
Warnings:
|
|
Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where `test`.`t1`.`a` = 1 and weight_string(`test`.`t1`.`a`,0,0,1) is null
|
|
ALTER TABLE t1 MODIFY a DECIMAL(10,1) ZEROFILL;
|
|
SELECT * FROM t1 WHERE a=1 AND WEIGHT_STRING(a) IS NULL;
|
|
a
|
|
000000001.0
|
|
EXPLAIN EXTENDED
|
|
SELECT * FROM t1 WHERE a=1 AND WEIGHT_STRING(a) IS NULL;
|
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 2 100.00 Using where
|
|
Warnings:
|
|
Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where `test`.`t1`.`a` = 1 and weight_string(`test`.`t1`.`a`,0,0,1) is null
|
|
DROP TABLE t1;
|
|
#
|
|
# End of 10.1 tests
|
|
#
|
|
#
|
|
# Start of 10.2 tests
|
|
#
|
|
#
|
|
# MDEV-10134 Add full support for DEFAULT
|
|
#
|
|
CREATE TABLE t1 (a VARCHAR(10) CHARACTER SET latin1, b VARBINARY(10) DEFAULT WEIGHT_STRING(a AS CHAR(10)));
|
|
SHOW CREATE TABLE t1;
|
|
Table Create Table
|
|
t1 CREATE TABLE `t1` (
|
|
`a` varchar(10) DEFAULT NULL,
|
|
`b` varbinary(10) DEFAULT weight_string(`a`,0,10,65)
|
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
|
INSERT INTO t1 (a) VALUES ('a');
|
|
SELECT a, HEX(b) FROM t1;
|
|
a HEX(b)
|
|
a 41202020202020202020
|
|
DROP TABLE t1;
|
|
create view v1 as select weight_string("MySQL" as char(4));
|
|
select * from v1;
|
|
weight_string("MySQL" as char(4))
|
|
MYSQ
|
|
drop view v1;
|
|
#
|
|
# End of 10.2 tests
|
|
#
|