Skip to content

Commit

Permalink
MariaDB can now use mytap-user functions (hepabolu#41)
Browse files Browse the repository at this point in the history
  • Loading branch information
Michał Sadowski committed Oct 28, 2019
1 parent 00f14b1 commit 662c0d9
Show file tree
Hide file tree
Showing 5 changed files with 71 additions and 7 deletions.
16 changes: 16 additions & 0 deletions install.sh
Expand Up @@ -91,6 +91,15 @@ MYVER=$(mysql ${MYSQLOPTS} --execute "
+ CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(VERSION(), '-', 1),'.', 3), '.', -1) AS UNSIGNED);
")

MYVARIANT=$(mysql ${MYSQLOPTS} --execute "
SELECT
CASE
WHEN version() REGEXP 'MariaDB' = 1 THEN 'MariaDB'
WHEN version() REGEXP 'Percona' = 1 THEN 'Percona'
ELSE 'MySQL'
END;
")

# checking thread_stack settings. See #44 for reference.

thread_stack=$(mysql ${MYSQLOPTS} --execute "SELECT @@thread_stack" --skip_column_names)
Expand Down Expand Up @@ -146,6 +155,13 @@ if [[ ${NOINSTALL} -eq 0 ]]; then
mysql ${MYSQLOPTS} --execute 'source ./mytap-role-8011.sql';
mysql ${MYSQLOPTS} --execute 'source ./mytap-table-8011.sql';
fi

echo "Importing cross-variant compatibility layer";
if [ "${MYVARIANT}" == "MariaDB" ]; then
mysql ${MYSQLOPTS} --execute 'source ./mytap-compat-mariadb.sql';
else
mysql ${MYSQLOPTS} --execute 'source ./mytap-compat-mysql.sql';
fi
fi

if [[ ${NOTESTS} -eq 0 ]]; then
Expand Down
21 changes: 21 additions & 0 deletions mytap-compat-mariadb.sql
@@ -0,0 +1,21 @@
/* References:
- https://jira.mariadb.org/browse/MDEV-10959
- https://mariadb.com/kb/en/library/account-locking/
*/

DROP VIEW IF EXISTS tap.mysql__user;
CREATE SQL SECURITY INVOKER VIEW tap.mysql__user AS
SELECT
u.`user`
, u.`host`
/* ... */
, u.`password_expired`
, CASE JSON_EXTRACT(gp.Priv, '$.account_locked')
WHEN TRUE THEN 'Y'
ELSE 'N'
END AS `account_locked`
, JSON_EXTRACT(gp.Priv, '$.password_lifetime') AS password_lifetime
FROM
`mysql`.`user` AS u
JOIN `mysql`.`global_priv` AS gp USING (`user`)
;
4 changes: 4 additions & 0 deletions mytap-compat-mysql.sql
@@ -0,0 +1,4 @@
DROP VIEW IF EXISTS tap.mysql__user;
CREATE SQL SECURITY INVOKER VIEW tap.mysql__user AS
SELECT * FROM `mysql`.`user`
;
4 changes: 2 additions & 2 deletions mytap-user-576.sql
Expand Up @@ -26,7 +26,7 @@ BEGIN
DECLARE ret BOOLEAN;

SELECT 1 INTO ret
FROM `mysql`.`user`
FROM tap.mysql__user
WHERE `host` = hname
AND `user` = uname
AND `password_expired` <> 'Y'
Expand Down Expand Up @@ -89,7 +89,7 @@ BEGIN
DECLARE ret BOOLEAN;

SELECT 1 INTO ret
FROM `mysql`.`user`
FROM tap.mysql__user
WHERE `Host` = hname
AND `User` = uname
AND `password_lifetime` IS NOT NULL AND `password_lifetime` != 0;
Expand Down
33 changes: 28 additions & 5 deletions tests/test-mytap-user.my
Expand Up @@ -35,12 +35,14 @@ BEGIN
-- This procedure allows create user syntax to accomodate changes in
-- CREATE USER in 5.7.6
DECLARE myver INT;
DECLARE myvariant TEXT;

SET myver = (SELECT tap.mysql_version());
SET myvariant = (SELECT tap.mysql_variant());
SET @sql1 = "CREATE USER '__tapuser__'@'localhost' IDENTIFIED BY '__dgfjhasdkfa__'";
SET @sql2 = "CREATE USER '__locked__'@'localhost' IDENTIFIED BY '__dgfjhasdkfa__'";

IF myver > 507006 THEN
IF myvariant = 'MySQL' AND myver > 507006 THEN
SET @sql1 = CONCAT(@sql1, ' PASSWORD EXPIRE NEVER ACCOUNT UNLOCK');
SET @sql2 = CONCAT(@sql2, ' PASSWORD EXPIRE INTERVAL 180 DAY ACCOUNT LOCK');
END IF;
Expand All @@ -53,6 +55,18 @@ BEGIN
EXECUTE stmt2;
DEALLOCATE PREPARE stmt2;

IF myvariant = 'MariaDB' THEN
SET @sql1 = "ALTER USER '__tapuser__'@'localhost' ACCOUNT UNLOCK";
SET @sql2 = "ALTER USER '__locked__'@'localhost' ACCOUNT LOCK";

PREPARE stmt1 FROM @sql1;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;

PREPARE stmt2 FROM @sql2;
EXECUTE stmt2;
DEALLOCATE PREPARE stmt2;
END IF;
END //

DELIMITER ;
Expand Down Expand Up @@ -388,7 +402,10 @@ END;
/****************************************************************************/
-- user_has_lifetime(hname CHAR(60), uname CHAR(32), description TEXT)

SELECT CASE WHEN tap.mysql_version() >= 507006 THEN
/* This should work in MariaDB, but apparently does not.
See https://jira.mariadb.org/browse/MDEV-7597 */

SELECT CASE WHEN tap.mysql_variant() = 'MySQL' AND tap.mysql_version() >= 507006 THEN
tap.check_test(
tap.user_has_lifetime('localhost', '__locked__', ''),
true,
Expand All @@ -412,7 +429,9 @@ SELECT CASE WHEN tap.mysql_version() >= 507006 THEN
tap.skip(1,'user_has_lifetime() requires MySQL version >= 5.7.6')
END;

SELECT CASE WHEN tap.mysql_version() >= 507006 THEN
/* This should work in MariaDB, but apparently does not.
See https://jira.mariadb.org/browse/MDEV-7597 */
SELECT CASE WHEN tap.mysql_variant() = 'MySQL' AND tap.mysql_version() >= 507006 THEN
tap.check_test(
tap.user_has_lifetime('localhost', '__locked__', ''),
true,
Expand All @@ -424,7 +443,9 @@ SELECT CASE WHEN tap.mysql_version() >= 507006 THEN
tap.skip(2,'user_has_lifetime() requires MySQL version >= 5.7.6')
END;

SELECT CASE WHEN tap.mysql_version() >= 507006 THEN
/* This should work in MariaDB, but apparently does not.
See https://jira.mariadb.org/browse/MDEV-7597 */
SELECT CASE WHEN tap.mysql_variant() = 'MySQL' AND tap.mysql_version() >= 507006 THEN
tap.check_test(
tap.user_has_lifetime('localhost', '__locked__', 'desc'),
true,
Expand Down Expand Up @@ -465,7 +486,9 @@ SELECT CASE WHEN tap.mysql_version() >= 507006 THEN
tap.skip(1,'user_hasnt_lifetime() requires MySQL version >= 5.7.6')
END;

SELECT CASE WHEN tap.mysql_version() >= 507006 THEN
/* This should work in MariaDB, but apparently does not.
See https://jira.mariadb.org/browse/MDEV-7597 */
SELECT CASE WHEN tap.mysql_variant() = 'MySQL' AND tap.mysql_version() >= 507006 THEN
tap.check_test(
tap.user_hasnt_lifetime('localhost', '__locked__', ''),
false,
Expand Down

0 comments on commit 662c0d9

Please sign in to comment.