--source include/have_utf8.inc --source include/have_type_mysql_json.inc --echo # --echo # The following test takes 2 tables containing a JSON column and attempts --echo # to repair them. --echo # --echo # The tables header is (Description, Expected, Actual), where description --echo # shows a brief description what the JSON value is testing in the MariaDB --echo # implementation. Expected is the longtext string and actual is the JSON --echo # column that needs to be converted to MariaDB's representation of --echo # LONGTEXT. --echo # call mtr.add_suppression("Table rebuild required"); call mtr.add_suppression("is marked as crashed"); call mtr.add_suppression("Checking"); let $MYSQLD_DATADIR= `select @@datadir`; SET NAMES utf8; --copy_file std_data/mysql_json/tempty.frm $MYSQLD_DATADIR/test/tempty.frm --copy_file std_data/mysql_json/tempty.MYI $MYSQLD_DATADIR/test/tempty.MYI --copy_file std_data/mysql_json/tempty.MYD $MYSQLD_DATADIR/test/tempty.MYD --copy_file std_data/mysql_json/mysql_json_test.frm $MYSQLD_DATADIR/test/mysql_json_test.frm --copy_file std_data/mysql_json/mysql_json_test.MYI $MYSQLD_DATADIR/test/mysql_json_test.MYI --copy_file std_data/mysql_json/mysql_json_test.MYD $MYSQLD_DATADIR/test/mysql_json_test.MYD --copy_file std_data/mysql_json/mysql_json_test_big.frm $MYSQLD_DATADIR/test/mysql_json_test_big.frm --copy_file std_data/mysql_json/mysql_json_test_big.MYI $MYSQLD_DATADIR/test/mysql_json_test_big.MYI --copy_file std_data/mysql_json/mysql_json_test_big.MYD $MYSQLD_DATADIR/test/mysql_json_test_big.MYD --echo # --echo # Check that only ALTER TABLE ... FORCE is allowed on a MySQL 5.7 table --echo # with a JSON column. --echo # --error ER_TABLE_NEEDS_REBUILD show create table tempty; --error ER_TABLE_NEEDS_REBUILD select * from tempty; alter table tempty force; show create table tempty; --error ER_TABLE_NEEDS_REBUILD show create table mysql_json_test; --error ER_TABLE_NEEDS_REBUILD select * from mysql_json_test; --error ER_TABLE_NEEDS_REBUILD CREATE TABLE t2 AS SELECT * FROM mysql_json_test; --error ER_NOT_ALLOWED_IN_THIS_CONTEXT CREATE TABLE t2 (a mysql_json /*new column*/) AS SELECT * FROM mysql_json_test; --error ER_NOT_ALLOWED_IN_THIS_CONTEXT CREATE TABLE t2 (actual mysql_json /*existing column*/) AS SELECT * FROM mysql_json_test; --error ER_TABLE_NEEDS_REBUILD LOCK TABLES mysql_json_test WRITE; alter table mysql_json_test force; --sorted_result select description, expected, actual, expected = actual from mysql_json_test; --echo # --echo # A quick check that all rows match from the original MySQL Table. --echo # select count(*) as 'Total_Number_of_Tests', sum(expected = actual) as 'Succesful_Tests' from mysql_json_test; show create table mysql_json_test; --error ER_TABLE_NEEDS_REBUILD show create table mysql_json_test_big; --error ER_TABLE_NEEDS_REBUILD select * from mysql_json_test_big; --echo # --echo # This test checks the long format implementation of MySQL's JSON --echo # Not printing the actual contents as they are not readable by a human, --echo # just compare the strings, make sure they match. --echo # alter table mysql_json_test_big force; select count(*) as 'Total_Number_of_Tests', sum(expected = actual) as 'Succesful_Tests', sum(JSON_VALID(actual)) as 'String_is_valid_JSON' from mysql_json_test_big; drop table tempty; drop table mysql_json_test; drop table mysql_json_test_big; --echo # --echo # MDEV-32790: Output result in show create table --echo # for mysql_json type should be longtext --echo # create table t1(j json); show create table t1; drop table t1; --error ER_NOT_ALLOWED_IN_THIS_CONTEXT create table t1(j mysql_json); # `json` type should not have character set and collation other than utf8mb4_bin --error ER_PARSE_ERROR create table `testjson` ( `t` json /* JSON from MySQL 5.7*/ CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci; # By removing character set from `json` field query should work and # expand to `longtext` with characterset create table `testjson` ( `t` json /* JSON from MySQL 5.7*/ COLLATE utf8mb4_bin NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci; show create table testjson; drop table testjson; # `longtext` that is alias can have character set create table `testjson` ( `t` longtext /* JSON from MySQL 5.7 */ CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci; show create table testjson; drop table testjson; --echo # --echo # MDEV-32235: mysql_json cannot be used on newly created table --echo # --error ER_NOT_ALLOWED_IN_THIS_CONTEXT CREATE TABLE t(j mysql_json); --error ER_NOT_ALLOWED_IN_THIS_CONTEXT CREATE TABLE IF NOT EXISTS t(j mysql_json); --error ER_NOT_ALLOWED_IN_THIS_CONTEXT CREATE OR REPLACE TABLE t(j mysql_json); --error ER_NOT_ALLOWED_IN_THIS_CONTEXT CREATE TEMPORARY TABLE t(j mysql_json); CREATE TABLE t1 (a TEXT); --error ER_NOT_ALLOWED_IN_THIS_CONTEXT ALTER TABLE t1 MODIFY a mysql_json; DROP TABLE t1; --error ER_NOT_ALLOWED_IN_THIS_CONTEXT CREATE FUNCTION f1() RETURNS mysql_json RETURN NULL; --error ER_NOT_ALLOWED_IN_THIS_CONTEXT CREATE FUNCTION f1(a mysql_json) RETURNS INT RETURN 0; DELIMITER $$; --error ER_NOT_ALLOWED_IN_THIS_CONTEXT CREATE PROCEDURE p1() BEGIN DECLARE a mysql_json; END; $$ DELIMITER ;$$ --echo # --echo # End of 10.5 tests --echo #