diff --git a/mysql-test/suite/json/r/json_table.result b/mysql-test/suite/json/r/json_table.result index 8b5fc2bb40f..6cb197890c1 100644 --- a/mysql-test/suite/json/r/json_table.result +++ b/mysql-test/suite/json/r/json_table.result @@ -265,7 +265,7 @@ from t1, json_table(t1.json, '$' columns (value varchar(32) PATH '$.value')) T; show create table tj1; Table Create Table tj1 CREATE TABLE `tj1` ( - `value` varchar(32) CHARACTER SET utf8 DEFAULT NULL + `value` varchar(32) CHARACTER SET utf8mb4 DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 drop table t1; drop table tj1; @@ -841,5 +841,18 @@ f FOR ORDINALITY, g INT PATH '$', h VARCHAR(36) PATH '$', i DATE PATH '$', j CHA a b c d e f g h i j 1 NULL NULL NULL 1 NULL NULL NULL NULL # +# MDEV-25373 JSON_TABLE: Illegal mix of collations upon executing PS once, or SP/function twice. +# +SELECT * FROM JSON_TABLE (CONVERT('[1,2]' USING koi8u), '$[*]' COLUMNS(a CHAR(8) PATH '$')) AS jt1 NATURAL JOIN JSON_TABLE (CONVERT('[2,3]' USING eucjpms), '$[*]' COLUMNS(a CHAR(8) PATH '$')) AS jt2; +a +2 +PREPARE stmt1 FROM " +SELECT * FROM JSON_TABLE (CONVERT('[1,2]' USING koi8u), '$[*]' COLUMNS(a CHAR(8) PATH '$')) AS jt1 NATURAL JOIN JSON_TABLE (CONVERT('[2,3]' USING eucjpms), '$[*]' COLUMNS(a CHAR(8) PATH '$')) AS jt2; +"; +EXECUTE stmt1; +a +2 +DEALLOCATE PREPARE stmt1; +# # End of 10.6 tests # diff --git a/mysql-test/suite/json/r/json_table_mysql.result b/mysql-test/suite/json/r/json_table_mysql.result index ffe94da2750..31acd80f011 100644 --- a/mysql-test/suite/json/r/json_table_mysql.result +++ b/mysql-test/suite/json/r/json_table_mysql.result @@ -1081,7 +1081,7 @@ SELECT col_varchar_key FROM JSON_TABLE( (col_varchar_key VARCHAR(10) PATH "$.col_key")) AS innr1); id select_type table type possible_keys key key_len ref rows Extra 1 PRIMARY t1 ALL NULL NULL NULL NULL 2 Using where -2 MATERIALIZED innr1 ALL NULL NULL NULL NULL 40 Table function: json_table +2 DEPENDENT SUBQUERY innr1 ALL NULL NULL NULL NULL 40 Table function: json_table; Using where SELECT * FROM t1 WHERE col_varchar_key IN ( SELECT col_varchar_key FROM JSON_TABLE( '[{"col_key": 1},{"col_key": 2}]', "$[*]" COLUMNS @@ -1094,8 +1094,7 @@ SELECT col_varchar_key FROM JSON_TABLE( (col_varchar_key VARCHAR(10) PATH "$.col_key")) AS innr1); id select_type table type possible_keys key key_len ref rows Extra 1 PRIMARY t1 ALL NULL NULL NULL NULL 2 -1 PRIMARY eq_ref distinct_key distinct_key 13 func 1 Using where -2 MATERIALIZED innr1 ALL NULL NULL NULL NULL 40 Table function: json_table +1 PRIMARY innr1 ALL NULL NULL NULL NULL 40 Table function: json_table; Using where; FirstMatch(t1); Using join buffer (flat, BNL join) DROP TABLE t1; # # Bug#26711551: WL8867:CONDITIONAL JUMP IN JSON_TABLE_COLUMN::CLEANUP @@ -1422,7 +1421,7 @@ FROM JSON_TABLE('"test"', '$' COLUMNS(col VARCHAR(10) PATH '$')) AS a; SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `col` varchar(10) CHARACTER SET ascii DEFAULT NULL + `col` varchar(10) CHARACTER SET utf8mb4 DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 SET @@SESSION.collation_connection = latin1_bin; CREATE TABLE t2 SELECT a.col @@ -1430,7 +1429,7 @@ FROM JSON_TABLE('"test"', '$' COLUMNS(col VARCHAR(10) PATH '$')) AS a; SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `col` varchar(10) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL + `col` varchar(10) CHARACTER SET utf8mb4 DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1, t2; SET @@SESSION.character_set_connection = DEFAULT; diff --git a/mysql-test/suite/json/t/json_table.test b/mysql-test/suite/json/t/json_table.test index dae538e9f9e..41233c8a8ea 100644 --- a/mysql-test/suite/json/t/json_table.test +++ b/mysql-test/suite/json/t/json_table.test @@ -735,6 +735,18 @@ SELECT * FROM JSON_TABLE('{}', '$' COLUMNS( a TEXT EXISTS PATH '$', b VARCHAR(40) PATH '$', c BIT(60) PATH '$', d VARCHAR(60) PATH '$', e BIT(62) PATH '$', f FOR ORDINALITY, g INT PATH '$', h VARCHAR(36) PATH '$', i DATE PATH '$', j CHAR(4) PATH '$' )) AS jt; + +--echo # +--echo # MDEV-25373 JSON_TABLE: Illegal mix of collations upon executing PS once, or SP/function twice. +--echo # +SELECT * FROM JSON_TABLE (CONVERT('[1,2]' USING koi8u), '$[*]' COLUMNS(a CHAR(8) PATH '$')) AS jt1 NATURAL JOIN JSON_TABLE (CONVERT('[2,3]' USING eucjpms), '$[*]' COLUMNS(a CHAR(8) PATH '$')) AS jt2; + +PREPARE stmt1 FROM " +SELECT * FROM JSON_TABLE (CONVERT('[1,2]' USING koi8u), '$[*]' COLUMNS(a CHAR(8) PATH '$')) AS jt1 NATURAL JOIN JSON_TABLE (CONVERT('[2,3]' USING eucjpms), '$[*]' COLUMNS(a CHAR(8) PATH '$')) AS jt2; +"; +EXECUTE stmt1; +DEALLOCATE PREPARE stmt1; + --echo # --echo # End of 10.6 tests --echo # diff --git a/sql/json_table.cc b/sql/json_table.cc index ba14c5b01fd..a16adc25f08 100644 --- a/sql/json_table.cc +++ b/sql/json_table.cc @@ -1077,40 +1077,6 @@ int Table_function_json_table::setup(THD *thd, TABLE_LIST *sql_table, return TRUE; } - { - /* - The m_json defines it's charset during the fix_fields stage so we're - changing the field's current charsets with it. - The complicated part is that the length of the field can be changed so - in this case we should move all the consequent fiedlds. - */ - List_iterator_fast jc_i(m_columns); - int field_offset= 0; - Field *f; - for (uint i= 0; (f= t->field[i]); i++) - { - Json_table_column *jc= jc_i++; - uint32 old_pack_length= f->pack_length(); - - f->change_charset( - jc->m_explicit_cs ? jc->m_explicit_cs : m_json->collation); - - if (field_offset) - f->move_field(f->ptr + field_offset, f->null_ptr, f->null_bit); - - f->reset(); - - field_offset= (field_offset + f->pack_length()) - old_pack_length; - - /* - The m_field->charset is going to be reused if it's the prepared - statement running several times. So should restored the original - value. - */ - jc->m_field->charset= jc->m_explicit_cs; - } - store_record(t, s->default_values); - } return FALSE; }