mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 03:52:35 +01:00
8a763c014e
- Closes PR #2839
- Usage of `Column_definition_fix_attributes()` suggested by Alexandar
Barkov - thanks bar, that is better than hook in server code
(reverted 22f3ebe4bf
)
- This method is called after parsing the data type:
* in `CREATE/ALTER TABLE`
* in SP: return data type, parameter data type, variable data type
- We want to disallow all these use cases of MYSQL_JSON.
- Reviewer: bar@mariadb.com
cvicentiu@mariadb.org
163 lines
5.3 KiB
Text
163 lines
5.3 KiB
Text
--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 #
|