MDEV-29653 Make sure Item_cache_row has the correct type handler.

The incorrect type handler caused an incorrect result_type() for
Item_cache_row (STRING_RESULT rather than ROW_RESULT). By updating the
constructor of Item_cache_row with the correct type handler, it fixes
this problem.

Signed-off-by: Yuchen Pei <yuchen.pei@mariadb.com>
Reviewed-by: Sergei Golubchik <serg@mariadb.com>
This commit is contained in:
Yuchen Pei 2022-12-20 10:38:35 +11:00
parent c21566a78a
commit fb41117c90
No known key found for this signature in database
GPG Key ID: 3DD1B35105743563
4 changed files with 74 additions and 1 deletions

View File

@ -7305,7 +7305,7 @@ class Item_cache_row: public Item_cache
bool save_array;
public:
Item_cache_row(THD *thd):
Item_cache(thd), values(0), item_count(2),
Item_cache(thd, &type_handler_row), values(0), item_count(2),
save_array(0) {}
/*

View File

@ -0,0 +1,33 @@
#
# MDEV-29653 Assertion `0' failed in Item_cache_row::illegal_method_call on SELECT from Spider table
#
for master_1
for child2
child2_1
child2_2
child2_3
for child3
connection child2_1;
CREATE DATABASE auto_test_remote;
USE auto_test_remote;
CREATE TABLE t (
c INT
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
connection master_1;
CREATE DATABASE auto_test_local;
USE auto_test_local;
CREATE TABLE ts (
c INT
) ENGINE=Spider COMMENT='table "t", srv "s_2_1"';
SELECT 1 FROM ts WHERE ROW(c, c) NOT IN ((0,0),(1,1));
1
connection master_1;
DROP DATABASE IF EXISTS auto_test_local;
connection child2_1;
DROP DATABASE IF EXISTS auto_test_remote;
for master_1
for child2
child2_1
child2_2
child2_3
for child3

View File

@ -0,0 +1,3 @@
!include include/default_mysqld.cnf
!include ../my_1_1.cnf
!include ../my_2_1.cnf

View File

@ -0,0 +1,37 @@
--echo #
--echo # MDEV-29653 Assertion `0' failed in Item_cache_row::illegal_method_call on SELECT from Spider table
--echo #
--disable_query_log
--disable_result_log
--source ../../t/test_init.inc
--enable_result_log
--enable_query_log
--connection child2_1
CREATE DATABASE auto_test_remote;
USE auto_test_remote;
eval CREATE TABLE t (
c INT
) $CHILD2_1_ENGINE $CHILD2_1_CHARSET;
--connection master_1
CREATE DATABASE auto_test_local;
USE auto_test_local;
eval CREATE TABLE ts (
c INT
) $MASTER_1_ENGINE COMMENT='table "t", srv "s_2_1"';
SELECT 1 FROM ts WHERE ROW(c, c) NOT IN ((0,0),(1,1));
--connection master_1
DROP DATABASE IF EXISTS auto_test_local;
--connection child2_1
DROP DATABASE IF EXISTS auto_test_remote;
--disable_query_log
--disable_result_log
--source ../t/test_deinit.inc
--enable_query_log
--enable_result_log