Commit df383043 authored by Alexander Barkov's avatar Alexander Barkov

MDEV-26742 Assertion `field->type_handler() == this' failed in...

MDEV-26742 Assertion `field->type_handler() == this' failed in FixedBinTypeBundle<NATIVE_LEN, MAX_CHAR_LEN>::Type_handler_fbt::stored_field_cmp_to_item
parent bd1573b0
...@@ -88,5 +88,32 @@ Warnings: ...@@ -88,5 +88,32 @@ Warnings:
Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where `test`.`t1`.`a` = INET6'::ff' Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where `test`.`t1`.`a` = INET6'::ff'
DROP TABLE t1; DROP TABLE t1;
# #
# MDEV-26742 Assertion `field->type_handler() == this' failed in FixedBinTypeBundle<NATIVE_LEN, MAX_CHAR_LEN>::Type_handler_fbt::stored_field_cmp_to_item
#
CREATE TABLE t1 (pk inet6, c text) engine=myisam;
INSERT INTO t1 VALUES ('::',1);
CREATE TABLE t2 (d text, KEY (d)) engine=innodb ;
Warnings:
Note 1071 Specified key was too long; max key length is 3072 bytes
INSERT INTO t2 VALUES (2);
SELECT * FROM t2 JOIN t1 ON ( t1.pk > t2.d);
d pk c
Warnings:
Warning 1292 Incorrect inet6 value: '2'
UPDATE t2 JOIN t1 ON ( t1.pk > t2.d) SET t1.c = 1;
ERROR 22007: Incorrect inet6 value: '2'
SET sql_mode='';
UPDATE t2 JOIN t1 ON ( t1.pk > t2.d) SET t1.c = 1;
Warnings:
Warning 1292 Incorrect inet6 value: '2'
SET sql_mode=DEFAULT;
SELECT * FROM t1;
pk c
:: 1
SELECT * FROM t2;
d
2
DROP TABLE t1, t2;
#
# End of 10.5 tests # End of 10.5 tests
# #
...@@ -12,6 +12,24 @@ ...@@ -12,6 +12,24 @@
SET default_storage_engine=InnoDB; SET default_storage_engine=InnoDB;
--source type_inet6_engines.inc --source type_inet6_engines.inc
--echo #
--echo # MDEV-26742 Assertion `field->type_handler() == this' failed in FixedBinTypeBundle<NATIVE_LEN, MAX_CHAR_LEN>::Type_handler_fbt::stored_field_cmp_to_item
--echo #
CREATE TABLE t1 (pk inet6, c text) engine=myisam;
INSERT INTO t1 VALUES ('::',1);
CREATE TABLE t2 (d text, KEY (d)) engine=innodb ;
INSERT INTO t2 VALUES (2);
SELECT * FROM t2 JOIN t1 ON ( t1.pk > t2.d);
--error ER_TRUNCATED_WRONG_VALUE
UPDATE t2 JOIN t1 ON ( t1.pk > t2.d) SET t1.c = 1;
SET sql_mode='';
UPDATE t2 JOIN t1 ON ( t1.pk > t2.d) SET t1.c = 1;
SET sql_mode=DEFAULT;
SELECT * FROM t1;
SELECT * FROM t2;
DROP TABLE t1, t2;
--echo # --echo #
--echo # End of 10.5 tests --echo # End of 10.5 tests
......
...@@ -88,5 +88,24 @@ Warnings: ...@@ -88,5 +88,24 @@ Warnings:
Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where `test`.`t1`.`a` = INET6'::ff' Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where `test`.`t1`.`a` = INET6'::ff'
DROP TABLE t1; DROP TABLE t1;
# #
# MDEV-26742 Assertion `field->type_handler() == this' failed in FixedBinTypeBundle<NATIVE_LEN, MAX_CHAR_LEN>::Type_handler_fbt::stored_field_cmp_to_item
#
CREATE TABLE t1 (c varchar(64), key(c)) engine=myisam;
INSERT INTO t1 VALUES ('0::1'),('::1'),('::2');
SELECT * FROM t1 WHERE c>CAST('::1' AS INET6);
c
::2
EXPLAIN SELECT * FROM t1 WHERE c>CAST('::1' AS INET6);
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 index c c 67 NULL 3 Using where; Using index
SELECT * FROM t1 WHERE c=CAST('::1' AS INET6);
c
0::1
::1
EXPLAIN SELECT * FROM t1 WHERE c=CAST('::1' AS INET6);
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 index c c 67 NULL 3 Using where; Using index
DROP TABLE t1;
#
# End of 10.5 tests # End of 10.5 tests
# #
...@@ -10,6 +10,18 @@ ...@@ -10,6 +10,18 @@
SET default_storage_engine=MyISAM; SET default_storage_engine=MyISAM;
--source type_inet6_engines.inc --source type_inet6_engines.inc
--echo #
--echo # MDEV-26742 Assertion `field->type_handler() == this' failed in FixedBinTypeBundle<NATIVE_LEN, MAX_CHAR_LEN>::Type_handler_fbt::stored_field_cmp_to_item
--echo #
CREATE TABLE t1 (c varchar(64), key(c)) engine=myisam;
INSERT INTO t1 VALUES ('0::1'),('::1'),('::2');
SELECT * FROM t1 WHERE c>CAST('::1' AS INET6);
EXPLAIN SELECT * FROM t1 WHERE c>CAST('::1' AS INET6);
SELECT * FROM t1 WHERE c=CAST('::1' AS INET6);
EXPLAIN SELECT * FROM t1 WHERE c=CAST('::1' AS INET6);
DROP TABLE t1;
--echo # --echo #
--echo # End of 10.5 tests --echo # End of 10.5 tests
......
...@@ -1276,6 +1276,21 @@ bool Field::can_be_substituted_to_equal_item(const Context &ctx, ...@@ -1276,6 +1276,21 @@ bool Field::can_be_substituted_to_equal_item(const Context &ctx,
} }
bool Field::cmp_is_done_using_type_handler_of_this(const Item_bool_func *cond,
const Item *item) const
{
/*
We could eventually take comparison_type_handler() from cond,
instead of calculating it again. But only some descendants of
Item_bool_func has this method. So this needs some hierarchy changes.
Another option is to pass "class Context" to this method.
*/
Type_handler_hybrid_field_type cmp(type_handler_for_comparison());
return !cmp.aggregate_for_comparison(item->type_handler_for_comparison()) &&
cmp.type_handler() == type_handler_for_comparison();
}
/* /*
This handles all numeric and BIT data types. This handles all numeric and BIT data types.
*/ */
...@@ -7356,7 +7371,7 @@ bool ...@@ -7356,7 +7371,7 @@ bool
Field_longstr::cmp_to_string_with_same_collation(const Item_bool_func *cond, Field_longstr::cmp_to_string_with_same_collation(const Item_bool_func *cond,
const Item *item) const const Item *item) const
{ {
return item->cmp_type() == STRING_RESULT && return cmp_is_done_using_type_handler_of_this(cond, item) &&
charset() == cond->compare_collation(); charset() == cond->compare_collation();
} }
...@@ -7365,7 +7380,7 @@ bool ...@@ -7365,7 +7380,7 @@ bool
Field_longstr::cmp_to_string_with_stricter_collation(const Item_bool_func *cond, Field_longstr::cmp_to_string_with_stricter_collation(const Item_bool_func *cond,
const Item *item) const const Item *item) const
{ {
return item->cmp_type() == STRING_RESULT && return cmp_is_done_using_type_handler_of_this(cond, item) &&
(charset() == cond->compare_collation() || (charset() == cond->compare_collation() ||
cond->compare_collation()->state & MY_CS_BINSORT); cond->compare_collation()->state & MY_CS_BINSORT);
} }
......
...@@ -1648,6 +1648,8 @@ class Field: public Value_source ...@@ -1648,6 +1648,8 @@ class Field: public Value_source
} }
int warn_if_overflow(int op_result); int warn_if_overflow(int op_result);
Copy_func *get_identical_copy_func() const; Copy_func *get_identical_copy_func() const;
bool cmp_is_done_using_type_handler_of_this(const Item_bool_func *cond,
const Item *item) const;
bool can_optimize_scalar_range(const RANGE_OPT_PARAM *param, bool can_optimize_scalar_range(const RANGE_OPT_PARAM *param,
const KEY_PART *key_part, const KEY_PART *key_part,
const Item_bool_func *cond, const Item_bool_func *cond,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment