← Back to team overview

maria-developers team mailing list archive

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

 

Hi, Alexander!

See comments below

> diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet6_innodb.test b/plugin/type_inet/mysql-test/type_inet/type_inet6_innodb.test
> index dd6049abbf3..3f3a6fdac2c 100644
> --- a/plugin/type_inet/mysql-test/type_inet/type_inet6_innodb.test
> +++ b/plugin/type_inet/mysql-test/type_inet/type_inet6_innodb.test
> @@ -12,6 +12,30 @@
>  SET default_storage_engine=InnoDB;
>  --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);
> +--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;
> +
> +CREATE TABLE t1 (pk inet6, c text) engine=myisam;
> +INSERT INTO t1 VALUES ('::',1);
> +CREATE TABLE t2 ( d text, KEY (d)) engine=innodb ;

I don't get it, why do you recreate tables with exactly  the same
definition and exactly the same content?

> +INSERT INTO t2 VALUES (2);
> +SELECT * FROM t2 JOIN t1 ON ( t1.pk > t2.d);
> +DROP TABLE t1, t2;
> +
>  
>  --echo #
>  --echo # End of 10.5 tests
> diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet6_myisam.test b/plugin/type_inet/mysql-test/type_inet/type_inet6_myisam.test
> index c5183f01cf0..1ccd654181c 100644
> --- a/plugin/type_inet/mysql-test/type_inet/type_inet6_myisam.test
> +++ b/plugin/type_inet/mysql-test/type_inet/type_inet6_myisam.test
> @@ -10,6 +10,21 @@
>  SET default_storage_engine=MyISAM;
>  --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 ('::1'),('::2');
> +SELECT * FROM t1 WHERE c>CAST('::1' AS INET6);
> +DROP TABLE t1;
> +
> +CREATE TABLE t1 (c varchar(64), key(c)) engine=myisam;
> +INSERT INTO t1 VALUES ('::1'),('0::1');

also don't see much point in recreating

> +SELECT * FROM t1 WHERE c=CAST('::1' AS INET6);
> +EXPLAIN SELECT * FROM t1 WHERE c=CAST('::1' AS INET6);
> +DROP TABLE t1;
> +
>  
>  --echo #
>  --echo # End of 10.5 tests
> diff --git a/plugin/type_uuid/mysql-test/type_uuid/type_uuid_innodb.test b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_innodb.test
> index 062e25d366b..27e3214af15 100644
> --- a/plugin/type_uuid/mysql-test/type_uuid/type_uuid_innodb.test
> +++ b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_innodb.test
> @@ -12,5 +12,27 @@ SET default_storage_engine=InnoDB;
>  --source type_uuid_engines.inc
>  
>  --echo #
> ---echo # End of 10.5 tests
> +--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 uuid, c text) engine=myisam;
> +INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000000',1);
> +CREATE TABLE t2 ( d text, KEY (d)) engine=innodb ;
> +INSERT INTO t2 VALUES (2);
> +--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;
> +DROP TABLE t1, t2;
> +
> +CREATE TABLE t1 (pk uuid, c text) engine=myisam;
> +INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000000',1);
> +CREATE TABLE t2 ( d text, KEY (d)) engine=innodb ;
> +INSERT INTO t2 VALUES (2);

same here

> +SELECT * FROM t2 JOIN t1 ON ( t1.pk > t2.d);
> +DROP TABLE t1, t2;
> +
> +--echo #
> +--echo # End of 10.7 tests
>  --echo #
> diff --git a/sql/field.cc b/sql/field.cc
> index 46a3a1deea3..fc3456e2ccb 100644
> --- a/sql/field.cc
> +++ b/sql/field.cc
> @@ -7368,7 +7368,9 @@ bool
>  Field_longstr::cmp_to_string_with_same_collation(const Item_bool_func *cond,
>                                                   const Item *item) const
>  {
> +  Type_handler_hybrid_field_type cmp(type_handler_for_comparison());

Can this be anything else but type_handler_long_blob ?
if not, then I'd suggest

   Type_handler_hybrid_field_type cmp(type_handler_long_blob);
   DBUG_ASSERT(type_handler_for_comparison() == &type_handler_long_blob);

> +  return !cmp.aggregate_for_comparison(item->type_handler_for_comparison()) &&
> +         cmp.type_handler() == type_handler_for_comparison() &&
> -  return item->cmp_type() == STRING_RESULT &&
>           charset() == cond->compare_collation();

This, basically, means, that cmp_type() is now meaningless, one cannot
use it anymore? There's no INET6_RESULT and UUID_RESULT for comparison,
so what's the point of cmp_type() now?

One more question. What type do we have where you need to aggregate here
and simple

   item->type_handler_for_comparison() != &type_handler_long_blob

won't do?

>  }
>  

Regards,
Sergei
VP of MariaDB Server Engineering
and security@xxxxxxxxxxx


Follow ups