Browse Source
MDEV-19650: Privilege bug on MariaDB 10.4
MDEV-19650: Privilege bug on MariaDB 10.4
Also fixes: MDEV-21487: Implement option for mysql_upgrade that allows root@localhost to be replaced MDEV-21486: Implement option for mysql_install_db that allows root@localhost to be replaced Add user mariadb.sys to be definer of user view (and has right on underlying table global_priv for required operation over global_priv (SELECT,UPDATE,DELETE)) Also changed definer of gis functions in case of creation, but they work with any definer so upgrade script do not try to push this change.pull/1604/head
51 changed files with 597 additions and 90 deletions
-
2mysql-test/main/explain_non_select.result
-
16mysql-test/main/failed_auth_3909.result
-
8mysql-test/main/failed_auth_3909.test
-
4mysql-test/main/failed_auth_unixsocket.result
-
4mysql-test/main/failed_auth_unixsocket.test
-
4mysql-test/main/gis_notembedded.result
-
26mysql-test/main/grant.result
-
4mysql-test/main/grant.test
-
2mysql-test/main/grant2.result
-
2mysql-test/main/grant2.test
-
5mysql-test/main/information_schema.result
-
1mysql-test/main/lowercase_fs_off.test
-
4mysql-test/main/mysql_upgrade-6984.result
-
4mysql-test/main/mysql_upgrade-6984.test
-
2mysql-test/main/mysql_upgrade.result
-
42mysql-test/main/plugin_auth_qa.result
-
15mysql-test/main/plugin_auth_qa_1.result
-
9mysql-test/main/plugin_auth_qa_2.result
-
18mysql-test/main/ps_grant.result
-
7mysql-test/main/ps_grant.test
-
2mysql-test/main/set_password.result
-
2mysql-test/main/stat_tables.result
-
2mysql-test/main/stat_tables_innodb.result
-
2mysql-test/main/system_mysql_db.result
-
2mysql-test/main/system_mysql_db_fix40123.result
-
2mysql-test/main/system_mysql_db_fix50030.result
-
2mysql-test/main/system_mysql_db_fix50117.result
-
209mysql-test/main/upgrade_MDEV-19650.result
-
159mysql-test/main/upgrade_MDEV-19650.test
-
3mysql-test/main/view_grant.result
-
12mysql-test/suite/funcs_1/r/is_routines_embedded.result
-
4mysql-test/suite/funcs_1/r/is_statistics.result
-
7mysql-test/suite/funcs_1/r/is_table_privileges.result
-
2mysql-test/suite/perfschema/r/privilege_table_io.result
-
16mysql-test/suite/roles/acl_statistics.result
-
2mysql-test/suite/roles/grant_revoke_current.result
-
2mysql-test/suite/roles/grant_revoke_current.test
-
1mysql-test/suite/roles/set_role-database-recursive.result
-
1mysql-test/suite/roles/set_role-database-simple.result
-
1mysql-test/suite/roles/set_role-recursive.result
-
1mysql-test/suite/roles/set_role-routine-simple.result
-
1mysql-test/suite/roles/set_role-simple.result
-
2mysql-test/suite/roles/set_role-table-column-priv.result
-
2mysql-test/suite/roles/set_role-table-simple.result
-
1mysql-test/suite/roles/show_grants.result
-
1mysql-test/suite/rpl/disabled.def
-
28mysql-test/suite/rpl/r/rpl_ignore_table.result
-
13mysql-test/suite/rpl/t/rpl_ignore_table.test
-
4scripts/maria_add_gis_sp.sql.in
-
17scripts/mysql_system_tables.sql
-
5scripts/mysql_system_tables_fix.sql
@ -1,7 +1,7 @@ |
|||
update mysql.global_priv set priv=json_insert(priv, '$.plugin', 'unix_socket'); |
|||
update mysql.global_priv set priv=json_insert(priv, '$.plugin', 'unix_socket') where user='root'; |
|||
flush privileges; |
|||
connect(localhost,USER,,test,MASTER_PORT,MASTER_SOCKET); |
|||
ERROR 28000: Access denied for user 'USER'@'localhost' |
|||
ERROR 28000: Access denied for user 'USER'@'localhost' |
|||
update mysql.global_priv set priv=json_compact(json_remove(priv, '$.plugin')); |
|||
update mysql.global_priv set priv=json_compact(json_remove(priv, '$.plugin')) where user='root'; |
|||
flush privileges; |
@ -0,0 +1,209 @@ |
|||
call mtr.add_suppression("Cannot load from mysql.proc. The table is probably corrupted"); |
|||
create database mysqltest1; |
|||
use mysqltest1; |
|||
create table save_global_priv as select * from mysql.global_priv; |
|||
create table save_tables_priv as select * from mysql.tables_priv; |
|||
create table save_proxies_priv as select * from mysql.proxies_priv; |
|||
create table mysql.save_proc like mysql.proc; |
|||
insert into mysql.save_proc select * from mysql.proc; |
|||
set @save_sql_mode= @@sql_mode; |
|||
use mysql; |
|||
# make old definition of gis procedures and user view |
|||
drop view user; |
|||
CREATE DEFINER='root'@'localhost' SQL SECURITY DEFINER VIEW IF NOT EXISTS user AS SELECT |
|||
Host, |
|||
User, |
|||
IF(JSON_VALUE(Priv, '$.plugin') IN ('mysql_native_password', 'mysql_old_password'), IFNULL(JSON_VALUE(Priv, '$.authentication_string'), ''), '') AS Password, |
|||
IF(JSON_VALUE(Priv, '$.access') & 1, 'Y', 'N') AS Select_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 2, 'Y', 'N') AS Insert_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 4, 'Y', 'N') AS Update_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 8, 'Y', 'N') AS Delete_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 16, 'Y', 'N') AS Create_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 32, 'Y', 'N') AS Drop_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 64, 'Y', 'N') AS Reload_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 128, 'Y', 'N') AS Shutdown_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 256, 'Y', 'N') AS Process_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 512, 'Y', 'N') AS File_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 1024, 'Y', 'N') AS Grant_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 2048, 'Y', 'N') AS References_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 4096, 'Y', 'N') AS Index_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 8192, 'Y', 'N') AS Alter_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 16384, 'Y', 'N') AS Show_db_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 32768, 'Y', 'N') AS Super_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 65536, 'Y', 'N') AS Create_tmp_table_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 131072, 'Y', 'N') AS Lock_tables_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 262144, 'Y', 'N') AS Execute_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 524288, 'Y', 'N') AS Repl_slave_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 1048576, 'Y', 'N') AS Repl_client_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 2097152, 'Y', 'N') AS Create_view_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 4194304, 'Y', 'N') AS Show_view_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 8388608, 'Y', 'N') AS Create_routine_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 16777216, 'Y', 'N') AS Alter_routine_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 33554432, 'Y', 'N') AS Create_user_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 67108864, 'Y', 'N') AS Event_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 134217728, 'Y', 'N') AS Trigger_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 268435456, 'Y', 'N') AS Create_tablespace_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 536870912, 'Y', 'N') AS Delete_history_priv, |
|||
ELT(IFNULL(JSON_VALUE(Priv, '$.ssl_type'), 0) + 1, '', 'ANY','X509', 'SPECIFIED') AS ssl_type, |
|||
IFNULL(JSON_VALUE(Priv, '$.ssl_cipher'), '') AS ssl_cipher, |
|||
IFNULL(JSON_VALUE(Priv, '$.x509_issuer'), '') AS x509_issuer, |
|||
IFNULL(JSON_VALUE(Priv, '$.x509_subject'), '') AS x509_subject, |
|||
CAST(IFNULL(JSON_VALUE(Priv, '$.max_questions'), 0) AS UNSIGNED) AS max_questions, |
|||
CAST(IFNULL(JSON_VALUE(Priv, '$.max_updates'), 0) AS UNSIGNED) AS max_updates, |
|||
CAST(IFNULL(JSON_VALUE(Priv, '$.max_connections'), 0) AS UNSIGNED) AS max_connections, |
|||
CAST(IFNULL(JSON_VALUE(Priv, '$.max_user_connections'), 0) AS SIGNED) AS max_user_connections, |
|||
IFNULL(JSON_VALUE(Priv, '$.plugin'), '') AS plugin, |
|||
IFNULL(JSON_VALUE(Priv, '$.authentication_string'), '') AS authentication_string, |
|||
'N' AS password_expired, |
|||
ELT(IFNULL(JSON_VALUE(Priv, '$.is_role'), 0) + 1, 'N', 'Y') AS is_role, |
|||
IFNULL(JSON_VALUE(Priv, '$.default_role'), '') AS default_role, |
|||
CAST(IFNULL(JSON_VALUE(Priv, '$.max_statement_time'), 0.0) AS DECIMAL(12,6)) AS max_statement_time |
|||
FROM global_priv; |
|||
SET sql_mode=''; |
|||
DROP PROCEDURE IF EXISTS mysql.AddGeometryColumn; |
|||
DROP PROCEDURE IF EXISTS mysql.DropGeometryColumn; |
|||
CREATE DEFINER=`root`@`localhost` PROCEDURE AddGeometryColumn(catalog varchar(64), t_schema varchar(64), |
|||
t_name varchar(64), geometry_column varchar(64), t_srid int) SQL SECURITY INVOKER |
|||
begin |
|||
set @qwe= concat('ALTER TABLE ', t_schema, '.', t_name, ' ADD ', geometry_column,' GEOMETRY REF_SYSTEM_ID=', t_srid); PREPARE ls from @qwe; execute ls; deallocate prepare ls; end | |
|||
CREATE DEFINER=`root`@`localhost` PROCEDURE DropGeometryColumn(catalog varchar(64), t_schema varchar(64), |
|||
t_name varchar(64), geometry_column varchar(64)) SQL SECURITY INVOKER |
|||
begin |
|||
set @qwe= concat('ALTER TABLE ', t_schema, '.', t_name, ' DROP ', geometry_column); PREPARE ls from @qwe; execute ls; deallocate prepare ls; end | |
|||
set @@sql_mode= @save_sql_mode; |
|||
drop user 'mariadb.sys'@'localhost'; |
|||
# check old definitions mysql_upgrade |
|||
SELECT count(*) FROM information_schema.VIEWS WHERE TABLE_CATALOG = 'def' and TABLE_SCHEMA = 'mysql' and TABLE_NAME='user' and DEFINER = 'root@localhost'; |
|||
count(*) |
|||
1 |
|||
SELECT count(*) FROM information_schema.VIEWS WHERE TABLE_CATALOG = 'def' and TABLE_SCHEMA = 'mysql' and TABLE_NAME='user' and DEFINER = 'mariadb.sys@localhost'; |
|||
count(*) |
|||
0 |
|||
SELECT * FROM information_schema.USER_PRIVILEGES WHERE GRANTEE="'mariadb.sys'@'localhost'"; |
|||
GRANTEE TABLE_CATALOG PRIVILEGE_TYPE IS_GRANTABLE |
|||
SELECT * FROM information_schema.TABLE_PRIVILEGES WHERE GRANTEE="'mariadb.sys'@'localhost'"; |
|||
GRANTEE TABLE_CATALOG TABLE_SCHEMA TABLE_NAME PRIVILEGE_TYPE IS_GRANTABLE |
|||
# Run mysql_upgrade |
|||
Phase 1/7: Checking and upgrading mysql database |
|||
Processing databases |
|||
mysql |
|||
mysql.column_stats OK |
|||
mysql.columns_priv OK |
|||
mysql.db OK |
|||
mysql.event OK |
|||
mysql.func OK |
|||
mysql.global_priv OK |
|||
mysql.gtid_slave_pos OK |
|||
mysql.help_category OK |
|||
mysql.help_keyword OK |
|||
mysql.help_relation OK |
|||
mysql.help_topic OK |
|||
mysql.index_stats OK |
|||
mysql.innodb_index_stats |
|||
Error : Unknown storage engine 'InnoDB' |
|||
error : Corrupt |
|||
mysql.innodb_table_stats |
|||
Error : Unknown storage engine 'InnoDB' |
|||
error : Corrupt |
|||
mysql.plugin OK |
|||
mysql.proc OK |
|||
mysql.procs_priv OK |
|||
mysql.proxies_priv OK |
|||
mysql.roles_mapping OK |
|||
mysql.save_proc OK |
|||
mysql.servers OK |
|||
mysql.table_stats OK |
|||
mysql.tables_priv OK |
|||
mysql.time_zone OK |
|||
mysql.time_zone_leap_second OK |
|||
mysql.time_zone_name OK |
|||
mysql.time_zone_transition OK |
|||
mysql.time_zone_transition_type OK |
|||
mysql.transaction_registry |
|||
Error : Unknown storage engine 'InnoDB' |
|||
error : Corrupt |
|||
|
|||
Repairing tables |
|||
mysql.innodb_index_stats |
|||
Error : Unknown storage engine 'InnoDB' |
|||
error : Corrupt |
|||
mysql.innodb_table_stats |
|||
Error : Unknown storage engine 'InnoDB' |
|||
error : Corrupt |
|||
mysql.transaction_registry |
|||
Error : Unknown storage engine 'InnoDB' |
|||
error : Corrupt |
|||
Phase 2/7: Installing used storage engines... Skipped |
|||
Phase 3/7: Fixing views |
|||
mysql.user OK |
|||
Phase 4/7: Running 'mysql_fix_privilege_tables' |
|||
Phase 5/7: Fixing table and database names |
|||
Phase 6/7: Checking and upgrading tables |
|||
Processing databases |
|||
information_schema |
|||
mtr |
|||
mtr.global_suppressions OK |
|||
mtr.test_suppressions OK |
|||
mysqltest1 |
|||
mysqltest1.save_global_priv OK |
|||
mysqltest1.save_proxies_priv OK |
|||
mysqltest1.save_tables_priv OK |
|||
performance_schema |
|||
test |
|||
Phase 7/7: Running 'FLUSH PRIVILEGES' |
|||
OK |
|||
# check new definitions mysql_upgrade |
|||
SELECT count(*) FROM information_schema.VIEWS WHERE TABLE_CATALOG = 'def' and TABLE_SCHEMA = 'mysql' and TABLE_NAME='user' and DEFINER = 'root@localhost'; |
|||
count(*) |
|||
0 |
|||
SELECT count(*) FROM information_schema.VIEWS WHERE TABLE_CATALOG = 'def' and TABLE_SCHEMA = 'mysql' and TABLE_NAME='user' and DEFINER = 'mariadb.sys@localhost'; |
|||
count(*) |
|||
1 |
|||
SELECT * FROM information_schema.USER_PRIVILEGES WHERE GRANTEE="'mariadb.sys'@'localhost'"; |
|||
GRANTEE TABLE_CATALOG PRIVILEGE_TYPE IS_GRANTABLE |
|||
'mariadb.sys'@'localhost' def USAGE NO |
|||
SELECT * FROM information_schema.TABLE_PRIVILEGES WHERE GRANTEE="'mariadb.sys'@'localhost'"; |
|||
GRANTEE TABLE_CATALOG TABLE_SCHEMA TABLE_NAME PRIVILEGE_TYPE IS_GRANTABLE |
|||
'mariadb.sys'@'localhost' def mysql global_priv SELECT NO |
|||
'mariadb.sys'@'localhost' def mysql global_priv UPDATE NO |
|||
'mariadb.sys'@'localhost' def mysql global_priv DELETE NO |
|||
# check non root |
|||
CREATE USER 'not_root'@'localhost'; |
|||
GRANT ALL PRIVILEGES ON *.* TO 'not_root'@'localhost'; |
|||
GRANT PROXY ON ''@'%' TO 'not_root'@'localhost' WITH GRANT OPTION; |
|||
connect con1,localhost,not_root,,; |
|||
connection con1; |
|||
DROP USER 'root'@'localhost'; |
|||
DROP USER 'root'@'127.0.0.1'; |
|||
DROP USER 'root'@'::1'; |
|||
use mysqltest1; |
|||
create table t1 (a int); |
|||
call mysql.AddGeometryColumn("def", "mysqltest1", "t1", "g", 101); |
|||
show create table t1; |
|||
Table Create Table |
|||
t1 CREATE TABLE `t1` ( |
|||
`a` int(11) DEFAULT NULL, |
|||
`g` geometry DEFAULT NULL |
|||
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |
|||
use mysql; |
|||
select count(*) from user; |
|||
count(*) |
|||
3 |
|||
# restore environment |
|||
delete from global_priv; |
|||
delete from tables_priv; |
|||
delete from proxies_priv; |
|||
delete from proc; |
|||
insert into mysql.global_priv select * from mysqltest1.save_global_priv; |
|||
insert into mysql.tables_priv select * from mysqltest1.save_tables_priv; |
|||
insert into mysql.proxies_priv select * from mysqltest1.save_proxies_priv; |
|||
rename table proc to bad_proc; |
|||
rename table save_proc to proc; |
|||
drop table bad_proc; |
|||
flush privileges; |
|||
disconnect default; |
|||
connect default,localhost,root,,; |
|||
connection default; |
|||
disconnect con1; |
|||
drop database mysqltest1; |
|||
# End of 10.4 tests (but better do not add other tests here) |
@ -0,0 +1,159 @@ |
|||
|
|||
-- source include/mysql_upgrade_preparation.inc |
|||
|
|||
call mtr.add_suppression("Cannot load from mysql.proc. The table is probably corrupted"); |
|||
create database mysqltest1; |
|||
use mysqltest1; |
|||
create table save_global_priv as select * from mysql.global_priv; |
|||
create table save_tables_priv as select * from mysql.tables_priv; |
|||
create table save_proxies_priv as select * from mysql.proxies_priv; |
|||
create table mysql.save_proc like mysql.proc; |
|||
insert into mysql.save_proc select * from mysql.proc; |
|||
set @save_sql_mode= @@sql_mode; |
|||
|
|||
use mysql; |
|||
|
|||
--echo # make old definition of gis procedures and user view |
|||
|
|||
drop view user; |
|||
|
|||
CREATE DEFINER='root'@'localhost' SQL SECURITY DEFINER VIEW IF NOT EXISTS user AS SELECT |
|||
Host, |
|||
User, |
|||
IF(JSON_VALUE(Priv, '$.plugin') IN ('mysql_native_password', 'mysql_old_password'), IFNULL(JSON_VALUE(Priv, '$.authentication_string'), ''), '') AS Password, |
|||
IF(JSON_VALUE(Priv, '$.access') & 1, 'Y', 'N') AS Select_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 2, 'Y', 'N') AS Insert_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 4, 'Y', 'N') AS Update_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 8, 'Y', 'N') AS Delete_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 16, 'Y', 'N') AS Create_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 32, 'Y', 'N') AS Drop_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 64, 'Y', 'N') AS Reload_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 128, 'Y', 'N') AS Shutdown_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 256, 'Y', 'N') AS Process_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 512, 'Y', 'N') AS File_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 1024, 'Y', 'N') AS Grant_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 2048, 'Y', 'N') AS References_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 4096, 'Y', 'N') AS Index_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 8192, 'Y', 'N') AS Alter_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 16384, 'Y', 'N') AS Show_db_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 32768, 'Y', 'N') AS Super_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 65536, 'Y', 'N') AS Create_tmp_table_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 131072, 'Y', 'N') AS Lock_tables_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 262144, 'Y', 'N') AS Execute_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 524288, 'Y', 'N') AS Repl_slave_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 1048576, 'Y', 'N') AS Repl_client_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 2097152, 'Y', 'N') AS Create_view_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 4194304, 'Y', 'N') AS Show_view_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 8388608, 'Y', 'N') AS Create_routine_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 16777216, 'Y', 'N') AS Alter_routine_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 33554432, 'Y', 'N') AS Create_user_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 67108864, 'Y', 'N') AS Event_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 134217728, 'Y', 'N') AS Trigger_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 268435456, 'Y', 'N') AS Create_tablespace_priv, |
|||
IF(JSON_VALUE(Priv, '$.access') & 536870912, 'Y', 'N') AS Delete_history_priv, |
|||
ELT(IFNULL(JSON_VALUE(Priv, '$.ssl_type'), 0) + 1, '', 'ANY','X509', 'SPECIFIED') AS ssl_type, |
|||
IFNULL(JSON_VALUE(Priv, '$.ssl_cipher'), '') AS ssl_cipher, |
|||
IFNULL(JSON_VALUE(Priv, '$.x509_issuer'), '') AS x509_issuer, |
|||
IFNULL(JSON_VALUE(Priv, '$.x509_subject'), '') AS x509_subject, |
|||
CAST(IFNULL(JSON_VALUE(Priv, '$.max_questions'), 0) AS UNSIGNED) AS max_questions, |
|||
CAST(IFNULL(JSON_VALUE(Priv, '$.max_updates'), 0) AS UNSIGNED) AS max_updates, |
|||
CAST(IFNULL(JSON_VALUE(Priv, '$.max_connections'), 0) AS UNSIGNED) AS max_connections, |
|||
CAST(IFNULL(JSON_VALUE(Priv, '$.max_user_connections'), 0) AS SIGNED) AS max_user_connections, |
|||
IFNULL(JSON_VALUE(Priv, '$.plugin'), '') AS plugin, |
|||
IFNULL(JSON_VALUE(Priv, '$.authentication_string'), '') AS authentication_string, |
|||
'N' AS password_expired, |
|||
ELT(IFNULL(JSON_VALUE(Priv, '$.is_role'), 0) + 1, 'N', 'Y') AS is_role, |
|||
IFNULL(JSON_VALUE(Priv, '$.default_role'), '') AS default_role, |
|||
CAST(IFNULL(JSON_VALUE(Priv, '$.max_statement_time'), 0.0) AS DECIMAL(12,6)) AS max_statement_time |
|||
FROM global_priv; |
|||
|
|||
|
|||
SET sql_mode=''; |
|||
|
|||
delimiter |; |
|||
|
|||
DROP PROCEDURE IF EXISTS mysql.AddGeometryColumn; |
|||
DROP PROCEDURE IF EXISTS mysql.DropGeometryColumn; |
|||
|
|||
CREATE DEFINER=`root`@`localhost` PROCEDURE AddGeometryColumn(catalog varchar(64), t_schema varchar(64), |
|||
t_name varchar(64), geometry_column varchar(64), t_srid int) SQL SECURITY INVOKER |
|||
begin |
|||
set @qwe= concat('ALTER TABLE ', t_schema, '.', t_name, ' ADD ', geometry_column,' GEOMETRY REF_SYSTEM_ID=', t_srid); PREPARE ls from @qwe; execute ls; deallocate prepare ls; end | |
|||
|
|||
CREATE DEFINER=`root`@`localhost` PROCEDURE DropGeometryColumn(catalog varchar(64), t_schema varchar(64), |
|||
t_name varchar(64), geometry_column varchar(64)) SQL SECURITY INVOKER |
|||
begin |
|||
set @qwe= concat('ALTER TABLE ', t_schema, '.', t_name, ' DROP ', geometry_column); PREPARE ls from @qwe; execute ls; deallocate prepare ls; end | |
|||
|
|||
delimiter ;| |
|||
set @@sql_mode= @save_sql_mode; |
|||
|
|||
drop user 'mariadb.sys'@'localhost'; |
|||
|
|||
--echo # check old definitions mysql_upgrade |
|||
|
|||
SELECT count(*) FROM information_schema.VIEWS WHERE TABLE_CATALOG = 'def' and TABLE_SCHEMA = 'mysql' and TABLE_NAME='user' and DEFINER = 'root@localhost'; |
|||
SELECT count(*) FROM information_schema.VIEWS WHERE TABLE_CATALOG = 'def' and TABLE_SCHEMA = 'mysql' and TABLE_NAME='user' and DEFINER = 'mariadb.sys@localhost'; |
|||
SELECT * FROM information_schema.USER_PRIVILEGES WHERE GRANTEE="'mariadb.sys'@'localhost'"; |
|||
SELECT * FROM information_schema.TABLE_PRIVILEGES WHERE GRANTEE="'mariadb.sys'@'localhost'"; |
|||
|
|||
let $MYSQLD_DATADIR= `select @@datadir`; |
|||
|
|||
--echo # Run mysql_upgrade |
|||
--exec $MYSQL_UPGRADE 2>&1 |
|||
--file_exists $MYSQLD_DATADIR/mysql_upgrade_info |
|||
--remove_file $MYSQLD_DATADIR/mysql_upgrade_info |
|||
|
|||
--echo # check new definitions mysql_upgrade |
|||
|
|||
SELECT count(*) FROM information_schema.VIEWS WHERE TABLE_CATALOG = 'def' and TABLE_SCHEMA = 'mysql' and TABLE_NAME='user' and DEFINER = 'root@localhost'; |
|||
SELECT count(*) FROM information_schema.VIEWS WHERE TABLE_CATALOG = 'def' and TABLE_SCHEMA = 'mysql' and TABLE_NAME='user' and DEFINER = 'mariadb.sys@localhost'; |
|||
SELECT * FROM information_schema.USER_PRIVILEGES WHERE GRANTEE="'mariadb.sys'@'localhost'"; |
|||
SELECT * FROM information_schema.TABLE_PRIVILEGES WHERE GRANTEE="'mariadb.sys'@'localhost'"; |
|||
|
|||
--echo # check non root |
|||
|
|||
CREATE USER 'not_root'@'localhost'; |
|||
GRANT ALL PRIVILEGES ON *.* TO 'not_root'@'localhost'; |
|||
GRANT PROXY ON ''@'%' TO 'not_root'@'localhost' WITH GRANT OPTION; |
|||
|
|||
connect con1,localhost,not_root,,; |
|||
|
|||
connection con1; |
|||
|
|||
DROP USER 'root'@'localhost'; |
|||
DROP USER 'root'@'127.0.0.1'; |
|||
DROP USER 'root'@'::1'; |
|||
|
|||
use mysqltest1; |
|||
|
|||
create table t1 (a int); |
|||
call mysql.AddGeometryColumn("def", "mysqltest1", "t1", "g", 101); |
|||
|
|||
show create table t1; |
|||
use mysql; |
|||
|
|||
select count(*) from user; |
|||
|
|||
--echo # restore environment |
|||
|
|||
delete from global_priv; |
|||
delete from tables_priv; |
|||
delete from proxies_priv; |
|||
delete from proc; |
|||
insert into mysql.global_priv select * from mysqltest1.save_global_priv; |
|||
insert into mysql.tables_priv select * from mysqltest1.save_tables_priv; |
|||
insert into mysql.proxies_priv select * from mysqltest1.save_proxies_priv; |
|||
rename table proc to bad_proc; |
|||
rename table save_proc to proc; |
|||
drop table bad_proc; |
|||
flush privileges; |
|||
|
|||
disconnect default; |
|||
connect default,localhost,root,,; |
|||
connection default; |
|||
disconnect con1; |
|||
|
|||
drop database mysqltest1; |
|||
|
|||
--echo # End of 10.4 tests (but better do not add other tests here) |
Write
Preview
Loading…
Cancel
Save
Reference in new issue