iclop_v1/database/tap.sql
2022-09-14 21:19:48 +07:00

4826 lines
170 KiB
SQL

-- phpMyAdmin SQL Dump
-- version 4.9.5deb2
-- https://www.phpmyadmin.net/
--
-- Host: localhost:3306
-- Waktu pembuatan: 14 Sep 2022 pada 11.30
-- Versi server: 10.3.34-MariaDB-0ubuntu0.20.04.1
-- Versi PHP: 7.4.3
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
--
-- Database: `tap`
--
DELIMITER $$
--
-- Prosedur
--
CREATE DEFINER=`root`@`localhost` PROCEDURE `finish` () READS SQL DATA
BEGIN
DECLARE msg TEXT DEFAULT _finish(
_get('tnumb'),
_get('plan'),
num_failed()
);
if msg IS NOT NULL AND msg <> '' THEN SELECT msg; END IF;
END$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `no_plan` () BEGIN
DECLARE hide TEXT DEFAULT plan(0);
END$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `todo` (`how_many` INT, `why` TEXT) BEGIN
DECLARE hide INTEGER DEFAULT _add('todo', COALESCE(how_many, 1), COALESCE(why, ''));
END$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `todo_end` () MODIFIES SQL DATA
DETERMINISTIC
BEGIN
DECLARE tid INTEGER DEFAULT _get_latest_with_value( 'todo', -1 );
DECLARE trash TEXT;
IF tid IS NULL THEN
CALL _cleanup();
SELECT `todo_end() called without todo_start()` INTO trash;
END IF;
DELETE FROM __tcache__ WHERE id = tid;
END$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `todo_start` (`why` TEXT) BEGIN
DECLARE hide INTEGER DEFAULT _add('todo', -1, COALESCE(why, ''));
END$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `_cleanup` () MODIFIES SQL DATA
DETERMINISTIC
BEGIN
DELETE FROM __tcache__ WHERE cid = connection_id();
DELETE FROM __tresults__ WHERE cid = connection_id();
end$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `_idset` (`vid` INTEGER, `vvalue` INTEGER) MODIFIES SQL DATA
DETERMINISTIC
BEGIN
UPDATE __tcache__
SET value = vvalue
WHERE id = vid;
END$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `_populate_have` (IN `have` TEXT) MODIFIES SQL DATA
DETERMINISTIC
COMMENT 'Create a temp table and populate with comma-separated data'
BEGIN
DECLARE sep CHAR(1) DEFAULT ',';
DECLARE seplength INTEGER DEFAULT CHAR_LENGTH(sep);
SET have = _fixCSL(have);
DROP TEMPORARY TABLE IF EXISTS `have`;
CREATE TEMPORARY TABLE `tap`.`have` (ident VARCHAR(64) PRIMARY KEY)
ENGINE MEMORY CHARSET utf8 COLLATE utf8_general_ci;
WHILE have != '' > 0 DO
SET @val = TRIM(SUBSTRING_INDEX(have, sep, 1));
SET @val = uqi(@val);
IF @val <> '' THEN
INSERT IGNORE INTO `have` VALUE(@val);
END IF;
SET have = SUBSTRING(have, CHAR_LENGTH(@val) + seplength + 1);
END WHILE;
END$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `_populate_want` (IN `want` TEXT) MODIFIES SQL DATA
DETERMINISTIC
COMMENT 'Create a temp table and populate with comma-separated data'
BEGIN
DECLARE sep CHAR(1) DEFAULT ',';
DECLARE seplength INTEGER DEFAULT CHAR_LENGTH(sep);
SET want = _fixCSL(want);
DROP TEMPORARY TABLE IF EXISTS `want`;
CREATE TEMPORARY TABLE `tap`.`want` (ident VARCHAR(64) PRIMARY KEY)
ENGINE MEMORY CHARSET utf8 COLLATE utf8_general_ci;
WHILE want != '' > 0 DO
SET @val = TRIM(SUBSTRING_INDEX(want, sep, 1));
SET @val = uqi(@val);
IF @val <> '' THEN
INSERT IGNORE INTO `want` VALUE(@val);
END IF;
SET want = SUBSTRING(want, CHAR_LENGTH(@val) + seplength + 1);
END WHILE;
END$$
--
-- Fungsi
--
CREATE DEFINER=`root`@`localhost` FUNCTION `add_result` (`vok` BOOL, `vaok` BOOL, `vdescr` TEXT, `vtype` TEXT, `vreason` TEXT) RETURNS INT(11) MODIFIES SQL DATA
DETERMINISTIC
BEGIN
DECLARE tnumb INTEGER DEFAULT _nextnumb();
INSERT INTO __tresults__ ( numb, cid, ok, aok, descr, type, reason )
VALUES(tnumb, connection_id(), vok, vaok, coalesce(vdescr, ''), coalesce(vtype, ''), coalesce(vreason, ''));
RETURN tnumb;
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `alike` (`got` TEXT, `pat` TEXT, `descr` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
RETURN _alike( got LIKE pat, got, pat, descr );
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `check_test` (`have` TEXT, `eok` BOOLEAN, `name` TEXT, `edescr` TEXT, `ediag` TEXT, `matchit` BOOLEAN) RETURNS TEXT CHARSET utf8mb4 MODIFIES SQL DATA
DETERMINISTIC
BEGIN
DECLARE tnumb INTEGER DEFAULT _get('tnumb');
DECLARE hok BOOLEAN;
DECLARE hdescr TEXT;
DECLARE ddescr TEXT;
DECLARE hdiag TEXT;
DECLARE tap TEXT;
DECLARE myok BOOLEAN;
SELECT aok, descr INTO hok ,hdescr
FROM __tresults__ WHERE numb = tnumb;
SET myok = CASE WHEN hok = eok THEN 1 ELSE 0 END;
SET ddescr = concat(coalesce( concat(name, ' '), 'Test ' ), 'should ');
UPDATE __tresults__
SET ok = myok,
aok = myok,
descr = concat(ddescr, CASE WHEN eok then 'pass' ELSE 'fail' END),
type = '',
reason = ''
WHERE numb = tnumb;
SET tap = _tap(myok, tnumb, concat(ddescr, CASE WHEN eok then 'pass' ELSE 'fail' END), NULL);
IF edescr IS NOT NULL THEN
SET tap = concat(tap, '\n', eq(
hdescr,
edescr,
concat(ddescr, 'have the proper description')
));
END IF;
IF ediag IS NOT NULL THEN
SET hdiag = substring(
have
FROM (CASE WHEN hok THEN 4 ELSE 9 END) + char_length(tnumb)
);
IF hdescr <> '' THEN
SET hdiag = substring( hdiag FROM 3 + char_length( diag( hdescr ) ) );
END IF;
IF NOT hok THEN
SET hdiag = substring(
hdiag
FROM 14 + char_length(tnumb)
+ CASE hdescr WHEN '' THEN 3 ELSE 3 + char_length( diag( hdescr ) ) END
);
END IF;
SET hdiag = replace( substring(hdiag from 3), '\n# ', '\n' );
IF matchit THEN
SET tap = concat(tap, '\n', matches(
hdiag,
ediag,
concat(ddescr, 'have the proper diagnostics')
));
ELSE
SET tap = concat(tap, '\n', eq(
hdiag,
ediag,
concat(ddescr, 'have the proper diagnostics')
));
END IF;
END IF;
RETURN tap;
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `columns_are` (`sname` VARCHAR(64), `tname` VARCHAR(64), `want` TEXT, `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
SET @want = want;
SET @have = (SELECT GROUP_CONCAT('`',column_name,'`')
FROM `information_schema`.`columns`
WHERE `table_schema` = sname
AND `table_name` = tname);
IF description = '' THEN
SET description = CONCAT('Table ', quote_ident(sname), '.', quote_ident(tname),
' should have the correct Columns');
END IF;
IF NOT _has_table(sname,tname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Table ', quote_ident(sname), '.', quote_ident(tname),
' does not exist')));
END IF;
CALL _populate_want(@want);
CALL _populate_have(@have);
SET @missing = (SELECT _missing(@have));
SET @extras = (SELECT _extra(@want));
RETURN _are('columns', @extras, @missing, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `column_privileges_are` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64), `gtee` VARCHAR(81), `ptypes` TEXT, `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
SET @gtee = _format_user(gtee);
SET @want = ptypes;
SET @have = _column_privileges(sname, tname, cname, @gtee);
IF description = '' THEN
SET description = CONCAT('Account ', gtee, ' should have the correct column privileges');
END IF;
IF NOT _has_column(sname, tname, cname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Column `', tname,'`.`', cname, '` does not exist')));
END IF;
IF NOT _has_user_at_host(@gtee) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Account ', gtee, ' does not exist')));
END IF;
CALL _populate_want(@want);
CALL _populate_have(@have);
SET @missing = (SELECT _missing(@have));
SET @extras = (SELECT _extra(@want));
RETURN _are('Column Privileges', @extras, @missing, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `col_character_set_is` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64), `cset` VARCHAR(32), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
RETURN col_charset_is(sname, tname, cname, cset, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `col_charset_is` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64), `cset` VARCHAR(32), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Column ', quote_ident(tname), '.', quote_ident(cname),
' should have Character Set ' , quote_ident(cset));
END IF;
IF NOT _has_column(sname, tname, cname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Column ', quote_ident(tname), '.', quote_ident(cname),
' does not exist')));
END IF;
RETURN eq(_col_charset(sname, tname, cname), cset, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `col_collation_is` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64), `ccoll` VARCHAR(32), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Column ', quote_ident(tname), '.',
quote_ident(cname), ' should have collation ' , quote_ident(ccoll));
END IF;
IF NOT _has_column(sname, tname, cname)THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Column ', quote_ident(tname), '.', quote_ident(cname),
' does not exist')));
END IF;
RETURN eq(_col_collation(sname, tname, cname), ccoll, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `col_column_type_is` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64), `ctype` LONGTEXT, `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Column ', quote_ident(tname), '.', quote_ident(cname),
' should have Column Type ', qv(ctype));
END IF;
IF NOT _has_column(sname, tname, cname) THEN
RETURN CONCAT(ok(FALSE,description),'\n',
diag(CONCAT('Column ', quote_ident(tname), '.', quote_ident(cname),
' does not exist')));
END IF;
RETURN eq(_column_type(sname, tname, cname), ctype, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `col_data_type_is` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64), `dtype` LONGTEXT, `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Column ', quote_ident(tname), '.', quote_ident(cname),
' should have Data Type ', qv(dtype));
END IF;
IF NOT _has_column(sname, tname, cname) THEN
RETURN CONCAT(ok(FALSE,description),'\n',
diag(CONCAT('Column ', quote_ident(tname), '.', quote_ident(cname),
' does not exist')));
END IF;
RETURN eq(_data_type(sname, tname, cname), dtype, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `col_default_is` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64), `cdefault` LONGTEXT, `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Column ', quote_ident(tname), '.', quote_ident(cname),
' should have Default ', qv(cdefault));
END IF;
IF NOT _has_column(sname, tname, cname) THEN
RETURN CONCAT(ok(FALSE,description),'\n',
diag(CONCAT('Column ', quote_ident(tname), '.', quote_ident(cname),
' does not exist')));
END IF;
RETURN eq(_col_default(sname, tname, cname), cdefault, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `col_extra_is` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64), `cextra` VARCHAR(30), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Column ', quote_ident(tname), '.', quote_ident(cname),
' should have Extra ', quote_ident(cextra));
END IF;
IF NOT _has_column(sname, tname, cname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Column ', quote_ident(tname), '.', quote_ident(cname),
' does not exist')));
END IF;
RETURN eq(_col_extra_is(sname, tname, cname), cextra, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `col_hasnt_default` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Column ',
quote_ident(tname), '.', quote_ident(cname), ' should not have a default');
END IF;
IF NOT _has_column(sname, tname, cname) THEN
RETURN CONCAT(ok(FALSE,description),'\n',
diag(CONCAT('Column ', quote_ident(tname), '.', quote_ident(cname),
' does not exist')));
END IF;
RETURN ok(NOT _col_has_default(sname, tname, cname), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `col_hasnt_index_key` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = concat('Column ',
quote_ident(tname), '.', quote_ident(cname), ' should not have Index Key');
END IF;
IF NOT _has_column(sname, tname, cname) THEN
RETURN CONCAT(ok(FALSE,description), '\n',
diag(CONCAT('Column ', quote_ident(tname), '.', quote_ident(cname),
' does not exist')));
END IF;
RETURN ok(NOT _col_has_index_key(sname, tname, cname), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `col_hasnt_named_index` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64), `kname` TEXT, `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
SET kname := COALESCE(kname, cname);
IF description = '' THEN
SET description = CONCAT('Column ', quote_ident(tname), '.', quote_ident(cname),
' should not have INDEX Key ', quote_ident(kname));
END IF;
IF NOT _has_column(sname, tname, cname) THEN
RETURN CONCAT(ok(FALSE,description), '\n',
diag(CONCAT('Column ', quote_ident(tname), '.', quote_ident(cname),
' does not exist')));
END IF;
RETURN ok(NOT _col_has_named_index(sname, tname, cname, kname), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `col_hasnt_non_unique_index` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 READS SQL DATA
DETERMINISTIC
BEGIN
IF description = '' THEN
SET description = concat('Column ',
quote_ident(tname), '.', quote_ident(cname), ' should not have non unique INDEX');
END IF;
IF NOT _has_column(sname, tname, cname) THEN
RETURN CONCAT(ok(FALSE,description), '\n',
diag(CONCAT('Column ', quote_ident(tname), '.', quote_ident(cname),
' does not exist')));
END IF;
RETURN ok(NOT _col_has_non_unique_index(sname, tname, cname), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `col_hasnt_pos_in_named_index` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64), `kname` VARCHAR(64), `pos` INT, `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
SET kname := COALESCE(kname, cname);
IF description = '' THEN
SET description = CONCAT('Column ',
quote_ident(tname), '.', quote_ident(cname), ' should not have position ',
pos, ' in INDEX ', quote_ident(kname));
END IF;
IF NOT _has_column(sname, tname, cname) THEN
RETURN CONCAT(ok(FALSE,description), '\n',
diag(CONCAT('Column ', quote_ident(tname), '.', quote_ident(cname),
' does not exist')));
END IF;
RETURN ok(NOT _col_has_pos_in_named_index(sname, tname, cname, kname, pos), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `col_hasnt_primary_key` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Column ',
quote_ident(tname), '.', quote_ident(cname), ' should not be a Primary Key (or part thereof)');
END IF;
IF NOT _has_column(sname, tname, cname) THEN
RETURN CONCAT(ok(FALSE,description), '\n',
diag(CONCAT('Column ', quote_ident(tname), '.', quote_ident(cname),
' does not exist')));
END IF;
RETURN ok(NOT _col_has_primary_key(sname, tname, cname), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `col_hasnt_unique_index` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 READS SQL DATA
DETERMINISTIC
BEGIN
IF description = '' THEN
SET description = concat('Column ',
quote_ident(tname), '.', quote_ident(cname), ' should not have unique INDEX');
END IF;
IF NOT _has_column(sname, tname, cname) THEN
RETURN CONCAT(ok(FALSE,description), '\n',
diag(CONCAT('Column ', quote_ident(tname), '.', quote_ident(cname),
' does not exist')));
END IF;
RETURN ok(NOT _col_has_unique_index(sname, tname, cname), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `col_has_default` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Column ',
quote_ident(tname), '.', quote_ident(cname), ' should have a default');
END IF;
IF NOT _has_column(sname, tname, cname) THEN
RETURN CONCAT(ok(FALSE,description),'\n',
diag(CONCAT('Column ', quote_ident(tname), '.', quote_ident(cname),
' does not exist')));
END IF;
RETURN ok(_col_has_default(sname, tname, cname), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `col_has_index_key` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = concat('Column ',
quote_ident(tname), '.', quote_ident(cname), ' should have Index Key');
END IF;
IF NOT _has_column(sname, tname, cname) THEN
RETURN CONCAT(ok(FALSE,description), '\n',
diag(CONCAT('Column ', quote_ident(tname), '.', quote_ident(cname),
' does not exist')));
END IF;
RETURN ok(_col_has_index_key(sname, tname, cname), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `col_has_named_index` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64), `kname` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 NO SQL
DETERMINISTIC
BEGIN
SET kname := COALESCE(kname, cname);
IF description = '' THEN
SET description = concat('Column ', quote_ident(tname), '.', quote_ident(cname),
' should have Index Key ', quote_ident(kname));
END IF;
IF NOT _has_column(sname, tname, cname) THEN
RETURN CONCAT(ok(FALSE,description), '\n',
diag(CONCAT('Column ', quote_ident(tname), '.', quote_ident(cname),
' does not exist')));
END IF;
RETURN ok(_col_has_named_index(sname, tname, cname, kname), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `col_has_non_unique_index` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 READS SQL DATA
DETERMINISTIC
BEGIN
IF description = '' THEN
SET description = concat('Column ',
quote_ident(tname), '.', quote_ident(cname), ' should have non unique INDEX');
END IF;
IF NOT _has_column(sname, tname, cname) THEN
RETURN CONCAT(ok(FALSE,description), '\n',
diag(CONCAT('Column ', quote_ident(tname), '.', quote_ident(cname),
' does not exist')));
END IF;
RETURN ok( _col_has_non_unique_index(sname, tname, cname), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `col_has_pos_in_named_index` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64), `kname` VARCHAR(64), `pos` INT, `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
SET kname := COALESCE(kname, cname);
IF description = '' THEN
SET description = concat('Column ',
quote_ident(tname), '.', quote_ident(cname), ' should have position ',
pos, ' in Index ', quote_ident(kname));
END IF;
IF NOT _has_column(sname, tname, cname) THEN
RETURN CONCAT(ok(FALSE,description), '\n',
diag(CONCAT('Column ', quote_ident(tname), '.', quote_ident(cname),
' does not exist')));
END IF;
RETURN ok(_col_has_pos_in_named_index(sname, tname, cname, kname, pos), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `col_has_primary_key` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Column ',
quote_ident(tname), '.', quote_ident(cname), ' should be a Primary Key (or part thereof)');
END IF;
IF NOT _has_column(sname, tname, cname) THEN
RETURN CONCAT(ok(FALSE,description), '\n',
diag(CONCAT('Column ', quote_ident(tname), '.', quote_ident(cname),
' does not exist')));
END IF;
RETURN ok(_col_has_primary_key(sname, tname, cname), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `col_has_type` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64), `ctype` LONGTEXT, `description` TEXT) RETURNS TEXT CHARSET utf8mb4 NO SQL
DETERMINISTIC
BEGIN
IF description = '' THEN
SET description = CONCAT('Column ', quote_ident(tname), '.', quote_ident(cname),
' should have Column Type ', qv(ctype));
END IF;
IF NOT _has_column(sname, tname, cname) THEN
RETURN CONCAT(ok(FALSE,description), '\n',
diag(CONCAT('Column ', quote_ident(tname), '.', quote_ident(cname),
' does not exist')));
END IF;
RETURN ok(_col_has_type(sname, tname, cname, ctype), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `col_has_unique_index` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 READS SQL DATA
DETERMINISTIC
BEGIN
IF description = '' THEN
SET description = concat('Column ',
quote_ident(tname), '.', quote_ident(cname), ' should have unique INDEX');
END IF;
IF NOT _has_column(sname, tname, cname) THEN
RETURN CONCAT(ok(FALSE,description), '\n',
diag(CONCAT('Column ', quote_ident(tname), '.', quote_ident(cname),
' does not exist')));
END IF;
RETURN ok(_col_has_unique_index(sname, tname, cname), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `col_is_null` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Column ',
quote_ident(tname), '.', quote_ident(cname), ' should allow NULL');
END IF;
IF NOT _has_column(sname, tname, cname) THEN
RETURN CONCAT(ok(FALSE,description), '\n',
diag(CONCAT('Column ', quote_ident(tname), '.', quote_ident(cname),
' does not exist')));
END IF;
RETURN eq(_col_nullable(sname, tname, cname),'YES', description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `col_is_pk` (`sname` VARCHAR(64), `tname` VARCHAR(64), `want` TEXT, `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF NOT LOCATE(',', want) AND NOT LOCATE('`', want) THEN
SET want = CONCAT('`', want, '`');
END IF;
IF description = '' THEN
SET description = CONCAT('Primary Key for ', quote_ident(sname), '.', quote_ident(tname),
' should exist on ', want);
END IF;
IF NOT _has_table( sname, tname ) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Table ', quote_ident(sname), '.', quote_ident(tname),
' does not exist')));
END IF;
RETURN ok(_col_is_pk( sname, tname, want), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `col_is_unique` (`sname` VARCHAR(64), `tname` VARCHAR(64), `want` TEXT, `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF NOT LOCATE(',', want) AND NOT LOCATE('`', want) THEN
SET want = CONCAT('`', want, '`');
END IF;
IF description = '' THEN
SET description = CONCAT('Unique Index for ', quote_ident(sname), '.', quote_ident(tname),
' should exist on ', want);
END IF;
IF NOT _has_table(sname, tname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Table ', quote_ident(sname), '.', quote_ident(tname),
' does not exist')));
END IF;
RETURN ok(_col_is_unique( sname, tname, want), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `col_not_null` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Column ',
quote_ident(tname), '.', quote_ident(cname), ' should be NOT NULL');
END IF;
IF NOT _has_column(sname, tname, cname) THEN
RETURN CONCAT(ok(FALSE,description), '\n',
diag(CONCAT('Column ', quote_ident(tname), '.', quote_ident(cname),
' does not exist')));
END IF;
RETURN eq(_col_nullable(sname, tname, cname), 'NO', description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `constraints_are` (`sname` VARCHAR(64), `tname` VARCHAR(64), `want` TEXT, `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
SET @want = want;
SET @have = (SELECT GROUP_CONCAT('`', `constraint_name`,'`')
FROM `information_schema`.`table_constraints`
WHERE `table_schema` = sname
AND `table_name` = tname);
IF description = '' THEN
SET description = CONCAT('Table ', quote_ident(sname), '.', quote_ident(tname),
' should have the correct Constraints');
END IF;
IF NOT _has_table( sname, tname ) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Table ', quote_ident(sname), '.', quote_ident(tname),
' does not exist' )));
END IF;
CALL _populate_want(@want);
CALL _populate_have(@have);
SET @missing = (SELECT _missing(@have));
SET @extras = (SELECT _extra(@want));
RETURN _are('constraints', @extras, @missing, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `constraint_type_is` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64), `ctype` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Constraint ', quote_ident(tname), '.', quote_ident(cname),
' should have Constraint Type ' , qv(ctype));
END IF;
IF NOT _has_constraint(sname, tname, cname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Constraint ', quote_ident(tname), '.', quote_ident(cname),
' does not exist')));
END IF;
RETURN eq(_constraint_type(sname, tname, cname), ctype, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `diag` (`msg` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
RETURN concat('# ', replace(
replace(
replace( msg, '\r\n', '\n# ' ),
'\n',
'\n# '
),
'\r',
'\n# '
));
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `doesnt_match` (`got` TEXT, `pat` TEXT, `descr` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
RETURN _unalike( got NOT REGEXP pat, got, pat, descr );
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `dqv` (`val` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF ISNULL(val) THEN
RETURN 'NULL';
END IF;
IF val REGEXP '^[[:digit:]]+$' THEN
RETURN val;
END IF;
RETURN CONCAT('"', REPLACE(val, '''', '\\\''), '"');
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `engine_is_default` (`ename` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Storage Engine ', quote_ident(ename),
' should be the default');
END IF;
IF NOT _has_engine(ename) THEN
RETURN CONCAT(ok(FALSE, description),'\n',
diag (CONCAT('Storage engine ', quote_ident(ename), ' is not available')));
END IF;
RETURN eq(_engine_default(), ename, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `eq` (`have` TEXT, `want` TEXT, `descr` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF _eq(have, want) THEN RETURN ok(1, descr); END IF;
RETURN concat( ok(0, descr), '\n', diag(concat(
' have: ', COALESCE(have, 'NULL'),
'\n want: ', COALESCE(want, 'NULL')
)));
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `events_are` (`sname` VARCHAR(64), `want` TEXT, `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
SET @want = want;
SET @have = (SELECT GROUP_CONCAT('`',`event_name`,'`')
FROM `information_schema`.`events`
WHERE `event_schema` = sname);
IF description = '' THEN
SET description = CONCAT('Schema ', quote_ident(sname), ' should have the correct Events');
END IF;
IF NOT _has_schema(sname) THEN
RETURN CONCAT( ok(FALSE, description), '\n',
diag(CONCAT('Schema ', quote_ident(sname), ' does not exist' )));
END IF;
CALL _populate_want(@want);
CALL _populate_have(@have);
SET @missing = (SELECT _missing(@have));
SET @extras = (SELECT _extra(@want));
RETURN _are('events', @extras, @missing, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `event_interval_field_is` (`sname` VARCHAR(64), `ename` VARCHAR(64), `ifield` VARCHAR(18), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
DECLARE valid ENUM('YEAR','QUARTER','MONTH','DAY','HOUR','MINUTE ',
'WEEK','SECOND','YEAR_MONTH','DAY_HOUR','DAY_MINUTE',
'DAY_SECOND','HOUR_MINUTE','HOUR_SECOND','MINUTE_SECOND');
DECLARE CONTINUE HANDLER FOR 1265
RETURN CONCAT(ok(FALSE, description), '\n',
diag('Event Interval must be { YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND }'));
IF description = '' THEN
SET description = CONCAT('Event ', quote_ident(sname), '.', quote_ident(ename),
' should have Interval Field ', qv(ifield));
END IF;
SET valid = ifield;
IF NOT _has_event(sname,ename) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Event ', quote_ident(sname), '.', quote_ident(ename),
' does not exist')));
END IF;
RETURN eq(_event_interval_field(sname, ename), ifield, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `event_interval_value_is` (`sname` VARCHAR(64), `ename` VARCHAR(64), `ivalue` VARCHAR(256), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Event ', quote_ident(sname), '.', quote_ident(ename),
' should have Interval Value ', qv(ivalue));
END IF;
IF NOT _has_event(sname,ename) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Event ', quote_ident(sname), '.', quote_ident(ename),
' does not exist')));
END IF;
RETURN eq(_event_interval_value(sname, ename), ivalue, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `event_status_is` (`sname` VARCHAR(64), `ename` VARCHAR(64), `stat` VARCHAR(18), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
DECLARE valid ENUM('ENABLED','DISABLED','SLAVESIDE DISABLED');
DECLARE CONTINUE HANDLER FOR 1265
RETURN CONCAT(ok(FALSE, description), '\n',
diag('Event Status must be { ENABLED | DISABLED | SLAVESIDE DISABLED }'));
IF description = '' THEN
SET description = CONCAT('Event ', quote_ident(sname), '.', quote_ident(ename),
' should have Status ', qv(stat));
END IF;
SET valid = stat;
IF NOT _has_event(sname,ename) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Event ', quote_ident(sname), '.', quote_ident(ename),
' does not exist')));
END IF;
RETURN eq(_event_status(sname, ename), stat, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `event_type_is` (`sname` VARCHAR(64), `ename` VARCHAR(64), `etype` VARCHAR(9), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
DECLARE valid ENUM('ONE TIME','RECURRING');
DECLARE CONTINUE HANDLER FOR 1265
RETURN CONCAT(ok(FALSE, description), '\n',
diag('Event Type must be { ONE TIME | RECURRING }'));
IF description = '' THEN
SET description = CONCAT('Event ', quote_ident(sname), '.', quote_ident(ename),
' should have Event Type ', qv(etype));
END IF;
SET valid = etype;
IF NOT _has_event(sname,ename) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Event ', quote_ident(sname), '.', quote_ident(ename),
' does not exist')));
END IF;
RETURN eq(_event_type(sname, ename), etype, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `fail` (`descr` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
RETURN ok(0, descr);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `fk_ok` (`csch` VARCHAR(64), `ctab` VARCHAR(64), `ccol` TEXT, `usch` VARCHAR(64), `utab` VARCHAR(64), `ucol` TEXT, `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF NOT LOCATE(',', ccol) AND NOT LOCATE('`', ccol) THEN
SET ccol = CONCAT('`', ccol, '`');
END IF;
IF NOT LOCATE(',', ucol) AND NOT LOCATE('`', ucol) THEN
SET ucol = CONCAT('`', ucol, '`');
END IF;
IF description = '' THEN
SET description = CONCAT('Constraint Foreign Key ', quote_ident(ctab), '(', ccol,
') should reference ' , quote_ident(utab), '(', ucol, ')');
END IF;
IF NOT _has_table(csch, ctab) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Table ', quote_ident(csch), '.', quote_ident(ctab),
' does not exist')));
END IF;
IF NOT _has_table(usch, utab) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Table ', quote_ident(usch), '.', quote_ident(utab),
' does not exist')));
END IF;
RETURN ok(_fk_ok(csch, ctab, ccol, usch, utab, ucol), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `fk_on_delete` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64), `rule` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Constraint ', quote_ident(tname), '.', quote_ident(cname),
' should have rule ON DELETE ', qv(rule));
END IF;
IF NOT _has_constraint(sname, tname, cname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Constraint ', quote_ident(tname), '.', quote_ident(cname),
' does not exist')));
END IF;
RETURN eq(_fk_on_delete(sname, tname, cname), rule, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `fk_on_update` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64), `rule` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Constraint ', quote_ident(tname), '.', quote_ident(cname),
' should have rule ON UPDATE ' , qv(rule));
END IF;
IF NOT _has_constraint(sname, tname, cname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Constraint ', quote_ident(tname), '.', quote_ident(cname),
' does not exist')));
END IF;
RETURN eq(_fk_on_update(sname, tname, cname), rule, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `function_data_type_is` (`sname` VARCHAR(64), `rname` VARCHAR(64), `dtype` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = concat('Function ', quote_ident(sname), '.', quote_ident(rname),
' should return ', quote_ident(_datatype(dtype)));
END IF;
IF NOT _has_routine(sname, rname, 'FUNCTION') THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Function ', quote_ident(sname),'.', quote_ident(rname),
' does not exist')));
END IF;
RETURN eq(_function_data_type(sname, rname), _datatype(dtype), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `function_is_deterministic` (`sname` VARCHAR(64), `rname` VARCHAR(64), `val` VARCHAR(3), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
RETURN routine_is_deterministic(sname, rname, 'Function', val, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `function_security_type_is` (`sname` VARCHAR(64), `rname` VARCHAR(64), `stype` VARCHAR(7), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
RETURN routine_security_type_is(sname, rname, 'Function', stype, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `function_sql_data_access_is` (`sname` VARCHAR(64), `rname` VARCHAR(64), `sda` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
RETURN routine_sql_data_access_is(sname, rname, 'Function', sda, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `global_is` (`var` VARCHAR(64), `want` VARCHAR(1024), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('@@GLOBAL.' , var, ' should be correctly set');
END IF;
IF NOT tap.mysql_version() >= 507006 THEN
RETURN CONCAT(ok(FALSE, description),'\n',
diag (CONCAT('This version of MySQL requires the previous version of this function')));
END IF;
RETURN eq(_global_var(var), want, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `global_privileges_are` (`gtee` VARCHAR(81), `ptypes` TEXT, `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
SET @gtee = _format_user(gtee);
SET @want = ptypes;
SET @have = _global_privileges(@gtee);
IF description = '' THEN
SET description = CONCAT('Account ', gtee, ' should have the correct global privileges');
END IF;
IF NOT _has_user_at_host(@gtee) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Account ', gtee, ' does not exist')));
END IF;
CALL _populate_want(@want);
CALL _populate_have(@have);
SET @missing = (SELECT _missing(@have));
SET @extras = (SELECT _extra(@want));
RETURN _are('Global Privileges', @extras, @missing, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `hasnt_character_set` (`cname` VARCHAR(32), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
RETURN hasnt_charset(cname, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `hasnt_charset` (`cname` VARCHAR(32), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Character Set ', quote_ident(cname), ' should not be available' );
END IF;
RETURN ok(NOT _has_charset(cname), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `hasnt_collation` (`cname` VARCHAR(32), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = concat('Collation ', quote_ident(cname), ' should not be available');
END IF;
RETURN ok(NOT _has_collation(cname), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `hasnt_column` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = concat('Column ',
quote_ident(tname), '.', quote_ident(cname), ' should not exist');
END IF;
IF NOT _has_table(sname, tname) THEN
RETURN CONCAT(ok(FALSE,description), '\n',
diag(CONCAT('Table ', quote_ident(sname), '.', quote_ident(tname),
' does not exist')));
END IF;
RETURN ok(NOT _has_column(sname, tname, cname), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `hasnt_column_privilege` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64), `gtee` VARCHAR(81), `ptype` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
SET @gtee = _format_user(gtee);
IF description = '' THEN
SET description = concat('Account ', gtee,
' should not have column privilege ''', ptype, '''');
END IF;
IF NOT _has_column(sname,tname,cname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Column `', tname, '`.`', cname, '` does not exist')));
END IF;
IF NOT _has_user_at_host(@gtee) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Account ', gtee, ' does not exist')));
END IF;
IF NOT _column_privs(ptype) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Privilege ''', ptype, ''' is not a valid column privilege type')));
END IF;
RETURN ok(NOT _has_column_priv(sname, tname, cname, @gtee, ptype), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `hasnt_constraint` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Constraint ', quote_ident(tname),'.',quote_ident(cname),
' should not exist');
END IF;
IF NOT _has_table( sname, tname ) THEN
RETURN CONCAT( ok( FALSE, description), '\n',
diag(CONCAT('Table ', quote_ident(sname), '.', quote_ident(tname),
' does not exist')));
END IF;
RETURN ok(NOT _has_constraint(sname, tname, cname), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `hasnt_event` (`sname` VARCHAR(64), `ename` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Event ', quote_ident(sname), '.', quote_ident(ename),
' should not exist');
END IF;
IF NOT _has_schema(sname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Schema ', quote_ident(sname), ' does not exist')));
END IF;
RETURN ok(NOT _has_event(sname, ename), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `hasnt_fk` (`sname` VARCHAR(64), `tname` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Table ', quote_ident(sname), '.', quote_ident(tname),
' should not have a Foreign Key');
END IF;
IF NOT _has_table(sname, tname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Table ', quote_ident(sname), '.', quote_ident(tname),
' does not exist')));
END IF;
RETURN ok(NOT _has_constraint_type(sname, tname, 'FOREIGN KEY'), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `hasnt_function` (`sname` VARCHAR(64), `rname` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
RETURN hasnt_routine(sname, rname, 'Function', description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `hasnt_global_privilege` (`gtee` VARCHAR(81), `ptype` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
SET @gtee = _format_user(gtee);
IF description = '' THEN
SET description = concat('Account ', gtee, ' should not have global privilege ''', ptype, '''');
END IF;
IF NOT _has_user_at_host(@gtee) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Account ', gtee, ' does not exist')));
END IF;
IF NOT _global_privs(ptype) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Privilege ''', ptype, ''' is not a valid global privilege type')));
END IF;
RETURN ok(NOT _has_global_priv(@gtee, ptype), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `hasnt_index` (`sname` VARCHAR(64), `tname` VARCHAR(64), `iname` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Index ', quote_ident(tname), '.', quote_ident(iname),
' should not exist');
END IF;
IF NOT _has_table( sname, tname ) THEN
RETURN CONCAT( ok( FALSE, description), '\n',
diag(CONCAT('Table ', quote_ident(sname), '.', quote_ident(tname),
' does not exist')));
END IF;
RETURN ok(NOT _has_index(sname, tname, iname), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `hasnt_partition` (`sname` VARCHAR(64), `tname` VARCHAR(64), `part` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Partition ', quote_ident(tname), '.', quote_ident(part),
' should not exist');
END IF;
IF NOT _has_table(sname, tname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Table ', quote_ident(sname), '.', quote_ident(tname),
' does not exist')));
END IF;
RETURN ok(NOT _has_partition(sname, tname, part), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `hasnt_pk` (`sname` VARCHAR(64), `tname` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Table ', quote_ident(sname), '.', quote_ident(tname),
' should not have a Primary Key');
END IF;
IF NOT _has_table(sname, tname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Table ', quote_ident(sname), '.', quote_ident(tname),
' does not exist')));
END IF;
RETURN ok(NOT _has_constraint(sname, tname, 'PRIMARY'), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `hasnt_privilege` (`gtee` VARCHAR(81), `ptype` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
SET @gtee = _format_user(gtee);
IF description = '' THEN
SET description = concat('Account ', gtee, ' should not have privilege ''', ptype, '''');
END IF;
IF NOT _has_user_at_host(@gtee) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Account ', gtee, ' does not exist')));
END IF;
RETURN ok(NOT _has_priv(@gtee, ptype), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `hasnt_procedure` (`sname` VARCHAR(64), `rname` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
RETURN hasnt_routine(sname, rname, 'Procedure', description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `hasnt_role` (`rname` CHAR(97), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
SET @rname = _format_user(rname);
IF description = '' THEN
SET description = CONCAT('Role ', rname, ' should not be active');
END IF;
RETURN ok(NOT _has_role(@rname), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `hasnt_routine` (`sname` VARCHAR(64), `rname` VARCHAR(64), `rtype` VARCHAR(9), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT(rtype ,' ',
quote_ident(sname), '.', quote_ident(rname), ' should not exist');
END IF;
RETURN ok(NOT _has_routine(sname, rname, rtype), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `hasnt_schema` (`sname` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Schema ', quote_ident(sname), ' should not exist');
END IF;
RETURN ok(NOT _has_schema(sname), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `hasnt_schema_privilege` (`sname` VARCHAR(64), `gtee` VARCHAR(81), `ptype` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
SET @gtee = _format_user(gtee);
IF description = '' THEN
SET description = concat('Account ', gtee, ' should not have schema privilege ''', ptype, '''');
END IF;
IF NOT _has_user_at_host(@gtee) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Account ', gtee, ' does not exist')));
END IF;
IF NOT _has_schema(sname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Schema ', sname, ' does not exist')));
END IF;
IF NOT _schema_privs(ptype) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Privilege ''', ptype, ''' is not a valid schema privilege type')));
END IF;
RETURN ok(NOT _has_schema_priv(sname, @gtee, ptype), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `hasnt_subpartition` (`sname` VARCHAR(64), `tname` VARCHAR(64), `subp` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Subpartition ', quote_ident(tname),
'.', quote_ident(subp), ' should not exist');
END IF;
IF NOT _has_table(sname, tname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Table ', quote_ident(sname), '.', quote_ident(tname),
' does not exist')));
END IF;
RETURN ok(NOT _has_subpartition(sname, tname, subp), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `hasnt_table` (`sname` VARCHAR(64), `tname` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Table ',
quote_ident(sname), '.', quote_ident(tname), ' should not exist');
END IF;
RETURN ok(NOT _has_table(sname, tname), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `hasnt_table_privilege` (`sname` VARCHAR(64), `tname` VARCHAR(64), `gtee` VARCHAR(81), `ptype` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
SET @gtee = _format_user(gtee);
IF description = '' THEN
SET description = concat('Account ', gtee, ' should not have table privilege ''', ptype, '''');
END IF;
IF NOT _has_table(sname,tname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Table `', sname, '`.`', tname, '` does not exist')));
END IF;
IF NOT _has_user_at_host(@gtee) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Account ', gtee, ' does not exist')));
END IF;
IF NOT _table_privs(ptype) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Privilege ''', ptype, ''' is not a valid table privilege type')));
END IF;
RETURN ok(NOT _has_table_priv(sname, tname, @gtee, ptype), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `hasnt_timezones` (`description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = concat('Table `mysql`.`time_zone_data` should be empty');
END IF;
RETURN ok(NOT _has_timezones(), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `hasnt_trigger` (`sname` VARCHAR(64), `tname` VARCHAR(64), `trgr` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Trigger ', quote_ident(tname), '.', quote_ident(trgr),
' should not exist');
END IF;
IF NOT _has_table(sname, tname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Table ', quote_ident(sname), '.', quote_ident(tname),
' does not exist')));
END IF;
RETURN ok(NOT _has_trigger(sname, tname, trgr), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `hasnt_user` (`hname` CHAR(60), `uname` CHAR(32), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('User \'', uname, '\'@\'', hname, '\' should not exist');
END IF;
RETURN ok(NOT _has_user(hname, uname), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `hasnt_user_at_host` (`uname` CHAR(97), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
SET @uname = _format_user(uname);
IF description = '' THEN
SET description = CONCAT('User ', uname, ' should not exist');
END IF;
RETURN ok(NOT _has_user_at_host(@uname), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `hasnt_view` (`sname` VARCHAR(64), `vname` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('View ',
quote_ident(sname), '.', quote_ident(vname), ' should not exist' );
END IF;
RETURN ok(NOT _has_view(sname, vname), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `has_character_set` (`cname` VARCHAR(32), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
RETURN has_charset(cname, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `has_charset` (`cname` VARCHAR(32), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Character Set ', quote_ident(cname), ' should be available');
END IF;
RETURN ok(_has_charset(cname), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `has_collation` (`cname` VARCHAR(32), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = concat('Collation ', quote_ident(cname), ' should be available');
END IF;
RETURN ok(_has_collation(cname), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `has_column` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Column ',
quote_ident(tname), '.', quote_ident(cname), ' should exist');
END IF;
IF NOT _has_table(sname, tname) THEN
RETURN CONCAT(ok(FALSE,description), '\n',
diag(CONCAT('Table ', quote_ident(sname), '.', quote_ident(tname),
' does not exist')));
END IF;
RETURN ok(_has_column(sname, tname, cname), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `has_column_privilege` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64), `gtee` VARCHAR(81), `ptype` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
SET @gtee = _format_user(gtee);
IF description = '' THEN
SET description = concat('Account ', gtee, ' should have column privilege ''', ptype, '''');
END IF;
IF NOT _has_column(sname,tname,cname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Column `', tname, '`.`', cname, '` does not exist')));
END IF;
IF NOT _has_user_at_host(@gtee) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Account ', gtee, ' does not exist')));
END IF;
IF NOT _column_privs(ptype) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Privilege ''', ptype, ''' is not a valid column privilege type')));
END IF;
RETURN ok(_has_column_priv(sname, tname, cname, @gtee, ptype), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `has_constraint` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Constraint ', quote_ident(tname), '.', quote_ident(cname),
' should exist');
END IF;
IF NOT _has_table(sname, tname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Table ', quote_ident(sname), '.', quote_ident(tname),
' does not exist')));
END IF;
RETURN ok(_has_constraint(sname, tname, cname), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `has_engine` (`ename` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Storage Engine ', quote_ident(ename), ' should be available');
END IF;
RETURN ok(_has_engine(ename), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `has_event` (`sname` VARCHAR(64), `ename` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Event ', quote_ident(sname), '.', quote_ident(ename),
' should exist');
END IF;
IF NOT _has_schema(sname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Schema ', quote_ident(sname), ' does not exist')));
END IF;
RETURN ok(_has_event(sname, ename), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `has_fk` (`sname` VARCHAR(64), `tname` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Table ', quote_ident(sname), '.', quote_ident(tname),
' should have a Foreign Key');
END IF;
IF NOT _has_table(sname, tname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Table ', quote_ident(sname), '.', quote_ident(tname),
' does not exist')));
END IF;
RETURN ok(_has_constraint_type(sname, tname, 'FOREIGN KEY'), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `has_function` (`sname` VARCHAR(64), `rname` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
RETURN has_routine(sname, rname, 'Function', description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `has_global_privilege` (`gtee` VARCHAR(81), `ptype` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
SET @gtee = _format_user(gtee);
IF description = '' THEN
SET description = concat('Account ', gtee, ' should have global privilege ''', ptype, '''');
END IF;
IF NOT _has_user_at_host(@gtee) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Account ', gtee, ' does not exist')));
END IF;
IF NOT _global_privs(ptype) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Privilege ''', ptype, ''' is not a valid global privilege type')));
END IF;
RETURN ok(_has_global_priv(@gtee, ptype), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `has_index` (`sname` VARCHAR(64), `tname` VARCHAR(64), `iname` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Index ', quote_ident(tname), '.', quote_ident(iname),
' should exist');
END IF;
IF NOT _has_table(sname, tname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Table ', quote_ident(sname), '.', quote_ident(tname),
' does not exist')));
END IF;
RETURN ok(_has_index( sname, tname, iname), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `has_partition` (`sname` VARCHAR(64), `tname` VARCHAR(64), `part` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Partition ', quote_ident(tname), '.', quote_ident(part),
' should exist');
END IF;
IF NOT _has_table(sname, tname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Table ', quote_ident(sname), '.', quote_ident(tname),
' does not exist')));
END IF;
RETURN ok(_has_partition(sname, tname, part), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `has_partitioning` (`description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = 'Partitioning should be active';
END IF;
IF tap.mysql_version() >= 800011 THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag('Partitioning support is part of specific ENGINE post 8.0.11'));
END IF;
RETURN ok(_has_partitioning(), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `has_pk` (`sname` VARCHAR(64), `tname` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Table ', quote_ident(sname), '.', quote_ident(tname),
' should have a Primary Key');
END IF;
IF NOT _has_table(sname, tname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Table ', quote_ident(sname), '.', quote_ident(tname),
' does not exist')));
END IF;
RETURN ok(_has_constraint(sname, tname, 'PRIMARY'), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `has_privilege` (`gtee` VARCHAR(81), `ptype` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
SET @gtee = _format_user(gtee);
IF description = '' THEN
SET description = CONCAT('Account ', gtee, ' should have privilege ''', ptype, '''');
END IF;
IF NOT _has_user_at_host(@gtee) THEN
RETURN CONCAT(ok(FALSE, description),'\n',
diag (CONCAT('Account ', gtee, ' does not exist')));
END IF;
RETURN ok(_has_priv(@gtee, ptype), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `has_procedure` (`sname` VARCHAR(64), `rname` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
RETURN has_routine(sname, rname, 'Procedure', description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `has_role` (`rname` CHAR(97), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
SET @rname = _format_user(rname);
IF description = '' THEN
SET description = CONCAT('Role ', rname, ' should be active');
END IF;
IF NOT _has_user_at_host(@rname) THEN
RETURN CONCAT(ok(FALSE, description),'\n',
diag (CONCAT('Role ', rname, ' is not defined')));
END IF;
RETURN ok(_has_role(@rname), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `has_routine` (`sname` VARCHAR(64), `rname` VARCHAR(64), `rtype` VARCHAR(9), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT(rtype ,' ',
quote_ident(sname), '.', quote_ident(rname), ' should exist');
END IF;
RETURN ok(_has_routine(sname, rname, rtype), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `has_schema` (`sname` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Schema ', quote_ident(sname), ' should exist');
END IF;
RETURN ok(_has_schema(sname), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `has_schema_privilege` (`sname` VARCHAR(64), `gtee` VARCHAR(81), `ptype` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
SET @gtee = _format_user(gtee);
IF description = '' THEN
SET description = concat('Account ', gtee, ' should have schema privilege ''', ptype, '''');
END IF;
IF NOT _has_user_at_host(@gtee) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Account ', gtee, ' does not exist')));
END IF;
IF NOT _has_schema(sname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Schema ', sname, ' does not exist')));
END IF;
IF NOT _schema_privs(ptype) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Privilege ''', ptype, ''' is not a valid schema privilege type')));
END IF;
RETURN ok(_has_schema_priv(sname, @gtee, ptype), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `has_security_definer` (`sname` VARCHAR(64), `vname` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('View ',
quote_ident(sname), '.', quote_ident(vname), ' should have security DEFINER');
END IF;
IF NOT _has_view(sname, vname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('View ', quote_ident(sname), '.', quote_ident(vname),
' does not exist')));
END IF;
RETURN ok(_has_security(sname, vname, 'DEFINER'), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `has_security_invoker` (`sname` VARCHAR(64), `vname` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('View ',
quote_ident(sname), '.', quote_ident(vname), ' should have security INVOKER');
END IF;
IF NOT _has_view(sname, vname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('View ', quote_ident(sname), '.', quote_ident(vname),
' does not exist')));
END IF;
RETURN ok(_has_security(sname, vname, 'INVOKER'), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `has_subpartition` (`sname` VARCHAR(64), `tname` VARCHAR(64), `subp` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Subpartition ', quote_ident(tname),
'.' , quote_ident(subp), ' should exist');
END IF;
IF NOT _has_table(sname, tname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Table ', quote_ident(sname), '.', quote_ident(tname),
' does not exist')));
END IF;
RETURN ok(_has_subpartition(sname, tname, subp), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `has_table` (`sname` VARCHAR(64), `tname` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = concat('Table ',
quote_ident(sname), '.', quote_ident(tname), ' should exist');
END IF;
RETURN ok(_has_table(sname, tname), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `has_table_privilege` (`sname` VARCHAR(64), `tname` VARCHAR(64), `gtee` VARCHAR(81), `ptype` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
SET @gtee = _format_user(gtee);
IF description = '' THEN
SET description = concat('Account ', gtee, ' should have table privilege ''', ptype, '''');
END IF;
IF NOT _has_table(sname,tname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Table `', sname, '`.`', tname, '` does not exist')));
END IF;
IF NOT _has_user_at_host(@gtee) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Account ', gtee, ' does not exist')));
END IF;
IF NOT _table_privs(ptype) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Privilege ''', ptype, ''' is not a valid table privilege type')));
END IF;
RETURN ok(_has_table_priv(sname, tname, @gtee, ptype), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `has_timezones` (`description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = concat('Table `mysql`.`time_zone_data` should be populated');
END IF;
RETURN ok(_has_timezones(), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `has_trigger` (`sname` VARCHAR(64), `tname` VARCHAR(64), `trgr` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Trigger ', quote_ident(tname), '.', quote_ident(trgr),
' should exist');
END IF;
IF NOT _has_table(sname, tname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Table ', quote_ident(sname), '.', quote_ident(tname),
' does not exist')));
END IF;
RETURN ok(_has_trigger(sname, tname, trgr), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `has_unique` (`sname` VARCHAR(64), `tname` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Table ', quote_ident(sname), '.', quote_ident(tname),
' should have a Unique Index');
END IF;
IF NOT _has_table(sname, tname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Table ', quote_ident(sname), '.', quote_ident(tname),
' does not exist')));
END IF;
RETURN ok(_has_unique(sname, tname), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `has_user` (`hname` CHAR(60), `uname` CHAR(32), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('User \'', uname, '\'@\'', quote_ident(hname), '\' should exist');
END IF;
RETURN ok(_has_user (hname, uname), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `has_user_at_host` (`uname` CHAR(97), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
SET @uname = _format_user(uname);
IF description = '' THEN
SET description = CONCAT('User ', uname, ' should exist');
END IF;
RETURN ok(_has_user_at_host(@uname), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `has_view` (`sname` VARCHAR(64), `vname` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('View ',
quote_ident(sname), '.', quote_ident(vname), ' should exist');
END IF;
RETURN ok(_has_view(sname, vname), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `indexes_are` (`sname` VARCHAR(64), `tname` VARCHAR(64), `want` TEXT, `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
SET @want = want;
SET @have = (SELECT GROUP_CONCAT('`', s.`index_name`,'`')
FROM `information_schema`.`statistics` s
LEFT JOIN `information_schema`.`table_constraints` c
ON (s.`table_schema` = c.`table_schema`
AND s.`table_name` = c.`table_name`
AND s.`index_name` = c.`constraint_name`)
WHERE s.`table_schema` = sname
AND s.`table_name` = tname
AND c.`constraint_name` IS NULL);
IF description = '' THEN
SET description = CONCAT('Table ', quote_ident(sname), '.', quote_ident(tname),
' should have the correct indexes');
END IF;
IF NOT _has_table(sname, tname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Table ', quote_ident(sname), '.', quote_ident(tname),
' does not exist' )));
END IF;
CALL _populate_want(@want);
CALL _populate_have(@have);
SET @missing = (SELECT _missing(@have));
SET @extras = (SELECT _extra(@want));
RETURN _are('indexes', @extras, @missing, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `index_is` (`sname` VARCHAR(64), `tname` VARCHAR(64), `iname` VARCHAR(64), `want` TEXT, `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Index ', quote_ident(tname), '.', quote_ident(iname),
' should exist on ' , want);
END IF;
IF NOT _has_index(sname, tname, iname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Index ', quote_ident(tname), '.', quote_ident(iname),
' does not exist' )));
END IF;
RETURN eq(_index_def(sname, tname, iname), want, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `index_is_type` (`sname` VARCHAR(64), `tname` VARCHAR(64), `iname` VARCHAR(64), `itype` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Index ', quote_ident(tname), '.', quote_ident(iname),
' should be of Type ', qv(itype));
END IF;
IF NOT _has_table( sname, tname ) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Table ', quote_ident(sname), '.', quote_ident(tname),
'does not exist' )));
END IF;
IF NOT _has_index( sname, tname, iname ) THEN
RETURN CONCAT(ok(FALSE,description),'\n',
diag(CONCAT('Index ', quote_ident(tname), '.', quote_ident(iname),
' does not exist')));
END IF;
RETURN eq(_index_type( sname, tname, iname), itype, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `in_todo` () RETURNS TINYINT(1) READS SQL DATA
BEGIN
RETURN CASE WHEN _get('todo') IS NULL THEN 0 ELSE 1 END;
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `is_indexed` (`sname` VARCHAR(64), `tname` VARCHAR(64), `want` TEXT, `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Index for ', quote_ident(sname), '.', quote_ident(tname),
' should exist on ' , want);
END IF;
IF NOT _has_table( sname, tname ) THEN
RETURN CONCAT(ok( FALSE, description), '\n',
diag(CONCAT('Table ', quote_ident(sname), '.', quote_ident(tname),
' does not exist' )));
END IF;
RETURN ok(_is_indexed(sname, tname, want), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `is_reserved` (`word` TEXT) RETURNS TINYINT(1) BEGIN
RETURN UPPER(word) IN (
'ADD', 'ALL', 'ALTER',
'ANALYZE', 'AND', 'AS',
'ASC', 'ASENSITIVE', 'BEFORE',
'BETWEEN', 'BIGINT', 'BINARY',
'BLOB', 'BOTH', 'BY',
'CALL', 'CASCADE', 'CASE',
'CHANGE', 'CHAR', 'CHARACTER',
'CHECK', 'COLLATE', 'COLUMN',
'CONDITION', 'CONSTRAINT', 'CONTINUE',
'CONVERT', 'CREATE', 'CROSS',
'CURRENT_DATE', 'CURRENT_TIME', 'CURRENT_TIMESTAMP',
'CURRENT_USER', 'CURSOR', 'DATABASE',
'DATABASES', 'DAY_HOUR', 'DAY_MICROSECOND',
'DAY_MINUTE', 'DAY_SECOND', 'DEC',
'DECIMAL', 'DECLARE', 'DEFAULT',
'DELAYED', 'DELETE', 'DESC',
'DESCRIBE', 'DETERMINISTIC', 'DISTINCT',
'DISTINCTROW', 'DIV', 'DOUBLE',
'DROP', 'DUAL', 'EACH',
'ELSE', 'ELSEIF', 'ENCLOSED',
'ESCAPED', 'EXISTS', 'EXIT',
'EXPLAIN', 'FALSE', 'FETCH',
'FLOAT', 'FLOAT4', 'FLOAT8',
'FOR', 'FORCE', 'FOREIGN',
'FROM', 'FULLTEXT', 'GRANT',
'GROUP', 'HAVING', 'HIGH_PRIORITY',
'HOUR_MICROSECOND', 'HOUR_MINUTE', 'HOUR_SECOND',
'IF', 'IGNORE', 'IN',
'INDEX', 'INFILE', 'INNER',
'INOUT', 'INSENSITIVE', 'INSERT',
'INT', 'INT1', 'INT2',
'INT3', 'INT4', 'INT8',
'INTEGER', 'INTERVAL', 'INTO',
'IS', 'ITERATE', 'JOIN',
'KEY', 'KEYS', 'KILL',
'LEADING', 'LEAVE', 'LEFT',
'LIKE', 'LIMIT', 'LINES',
'LOAD', 'LOCALTIME', 'LOCALTIMESTAMP',
'LOCK', 'LONG', 'LONGBLOB',
'LONGTEXT', 'LOOP', 'LOW_PRIORITY',
'MATCH', 'MEDIUMBLOB', 'MEDIUMINT',
'MEDIUMTEXT', 'MIDDLEINT', 'MINUTE_MICROSECOND',
'MINUTE_SECOND', 'MOD', 'MODIFIES',
'NATURAL', 'NOT', 'NO_WRITE_TO_BINLOG',
'NULL', 'NUMERIC', 'ON',
'OPTIMIZE', 'OPTION', 'OPTIONALLY',
'OR', 'ORDER', 'OUT',
'OUTER', 'OUTFILE', 'PRECISION',
'PRIMARY', 'PROCEDURE', 'PURGE',
'RAID0', 'READ', 'READS',
'REAL', 'REFERENCES', 'REGEXP',
'RELEASE', 'RENAME', 'REPEAT',
'REPLACE', 'REQUIRE', 'RESTRICT',
'RETURN', 'REVOKE', 'RIGHT',
'RLIKE', 'SCHEMA', 'SCHEMAS',
'SECOND_MICROSECOND', 'SELECT', 'SENSITIVE',
'SEPARATOR', 'SET', 'SHOW',
'SMALLINT', 'SONAME', 'SPATIAL',
'SPECIFIC', 'SQL', 'SQLEXCEPTION',
'SQLSTATE', 'SQLWARNING', 'SQL_BIG_RESULT',
'SQL_CALC_FOUND_ROWS', 'SQL_SMALL_RESULT', 'SSL',
'STARTING', 'STRAIGHT_JOIN', 'TABLE',
'TERMINATED', 'THEN', 'TINYBLOB',
'TINYINT', 'TINYTEXT', 'TO',
'TRAILING', 'TRIGGER', 'TRUE',
'UNDO', 'UNION', 'UNIQUE',
'UNLOCK', 'UNSIGNED', 'UPDATE',
'USAGE', 'USE', 'USING',
'UTC_DATE', 'UTC_TIME', 'UTC_TIMESTAMP',
'VALUES', 'VARBINARY', 'VARCHAR',
'VARCHARACTER', 'VARYING', 'WHEN',
'WHERE', 'WHILE', 'WITH',
'WRITE', 'X509', 'XOR',
'YEAR_MONTH', 'ZEROFILL',
'ASENSITIVE', 'CALL', 'CONDITION',
'CONTINUE', 'CURSOR', 'DECLARE',
'DETERMINISTIC', 'EACH', 'ELSEIF',
'EXIT', 'FETCH', 'INOUT',
'INSENSITIVE', 'ITERATE', 'LEAVE',
'LOOP', 'MODIFIES', 'OUT',
'READS', 'RELEASE', 'REPEAT',
'RETURN', 'SCHEMA', 'SCHEMAS',
'SENSITIVE', 'SPECIFIC', 'SQL',
'SQLEXCEPTION', 'SQLSTATE', 'SQLWARNING',
'TRIGGER', 'UNDO', 'WHILE',
'ACTION', 'BIT', 'DATE', 'ENUM', 'NO', 'TEXT', 'TIME', 'TIMESTAMP'
);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `matches` (`got` TEXT, `pat` TEXT, `descr` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
RETURN _alike( got REGEXP pat, got, pat, descr );
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `mysql_variant` () RETURNS VARCHAR(7) CHARSET utf8mb4 BEGIN
RETURN (SELECT
CASE
WHEN version() REGEXP 'MariaDB' = 1 THEN 'MariaDB'
WHEN version() REGEXP 'Percona' = 1 THEN 'Percona'
ELSE 'MySQL'
END);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `mysql_version` () RETURNS INT(11) BEGIN
RETURN (substring_index(version(), '.', 1) * 100000)
+ (substring_index(substring_index(version(), '.', 2), '.', -1) * 1000)
+ CAST(substring_index(substring_index(substring_index(version(), '-', 1),'.', 3), '.', -1) AS UNSIGNED);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `mytap_version` () RETURNS VARCHAR(10) CHARSET utf8mb4 NO SQL
DETERMINISTIC
BEGIN
RETURN '1.0';
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `not_eq` (`have` TEXT, `want` TEXT, `descr` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF NOT _eq(have, want) THEN RETURN ok(1, descr); END IF;
RETURN concat( ok(0, descr), '\n', diag(concat(
' have: ', COALESCE(have, 'NULL'),
'\n want: anything else'
)));
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `num_failed` () RETURNS INT(11) READS SQL DATA
BEGIN
DECLARE ret integer;
SELECT COUNT(*) INTO ret
FROM __tresults__
WHERE cid = connection_id()
AND ok = 0;
RETURN ret;
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `ok` (`aok` BOOLEAN, `descr` TEXT) RETURNS TEXT CHARSET utf8mb4 MODIFIES SQL DATA
DETERMINISTIC
BEGIN
DECLARE todo_why TEXT DEFAULT _todo();
DECLARE ok BOOLEAN;
DECLARE test_num INTEGER;
SET ok = CASE
WHEN aok THEN aok
WHEN todo_why IS NULL THEN COALESCE(aok, 0)
ELSE 1
END;
SET test_num = add_result(
ok,
COALESCE(aok, false),
descr,
CASE WHEN todo_why IS NULL THEN '' ELSE 'todo' END,
COALESCE(todo_why, '')
);
RETURN _tap(aok, test_num, descr, todo_why);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `partitions_are` (`sname` VARCHAR(64), `tname` VARCHAR(64), `want` TEXT, `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
SET @want = want;
SET @have = (SELECT GROUP_CONCAT('`', COALESCE(`subpartition_name`, `partition_name`) ,'`')
FROM `information_schema`.`partitions`
WHERE `table_schema` = sname
AND `table_name` = tname);
IF description = '' THEN
SET description = CONCAT('Table ', quote_ident(sname), '.', quote_ident(tname),
' should have the correct partitions');
END IF;
IF NOT _has_table(sname,tname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Table ', quote_ident(sname), '.', quote_ident(tname),
' does not exist')));
END IF;
CALL _populate_want(@want);
CALL _populate_have(@have);
SET @missing = (SELECT _missing(@have));
SET @extras = (SELECT _extra(@want));
RETURN _are('partitions', @extras, @missing, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `partition_count_is` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cnt` SMALLINT, `description` TEXT) RETURNS LONGTEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Table ', quote_ident(sname), '.', quote_ident(tname),
' should have a Partition Count of ', qv(cnt));
END IF;
IF NOT _has_table(sname, tname) THEN
RETURN CONCAT(ok( FALSE, description), '\n',
diag(CONCAT('Table ', quote_ident(sname),'.', quote_ident(tname),
' does not exist')));
END IF;
RETURN eq(_partition_count(sname, tname), cnt, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `partition_expression_is` (`sname` VARCHAR(64), `tname` VARCHAR(64), `part` VARCHAR(64), `expr` LONGTEXT, `description` TEXT) RETURNS LONGTEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = concat('Partition ', quote_ident(tname), '.', quote_ident(part),
' should have Partition Expression ', qv(TRIM(expr)));
END IF;
IF NOT _has_partition(sname, tname, part) THEN
RETURN CONCAT(ok( FALSE, description), '\n',
diag(CONCAT('Partition ', quote_ident(tname),'.', quote_ident(part),
' does not exist')));
END IF;
RETURN eq(_partition_expression(sname, tname, part), TRIM(expr), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `partition_method_is` (`sname` VARCHAR(64), `tname` VARCHAR(64), `part` VARCHAR(64), `pmeth` VARCHAR(18), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
DECLARE valid ENUM('RANGE', 'LIST', 'HASH', 'LINEAR HASH', 'KEY', 'LINEAR KEY');
DECLARE EXIT HANDLER FOR 1265
RETURN CONCAT(ok(FALSE, description), '\n',
diag('Partitioning Method must be { RANGE | LIST | HASH | LINEAR HASH | KEY | LINEAR KEY }'));
IF description = '' THEN
SET description = CONCAT('Partition ', quote_ident(tname), '.', quote_ident(part),
' should have Partition Method ', qv(pmeth));
END IF;
SET valid = pmeth;
IF NOT _has_partition(sname, tname, part) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Partition ', quote_ident(tname),'.', quote_ident(part),
' does not exist')));
END IF;
RETURN eq(_partition_method(sname, tname, part), pmeth, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `pass` (`descr` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
RETURN ok(1, descr);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `plan` (`numb` INTEGER) RETURNS TEXT CHARSET utf8mb4 READS SQL DATA
DETERMINISTIC
BEGIN
DECLARE trash TEXT;
IF _get('plan') IS NOT NULL THEN
CALL _cleanup();
SELECT `You tried to plan twice!` INTO trash;
END IF;
RETURN concat('1..', _set('plan', numb, NULL ));
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `procedure_is_deterministic` (`sname` VARCHAR(64), `rname` VARCHAR(64), `val` VARCHAR(3), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
RETURN routine_is_deterministic(sname, rname, 'Procedure', val, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `procedure_security_type_is` (`sname` VARCHAR(64), `rname` VARCHAR(64), `stype` VARCHAR(7), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
RETURN routine_security_type_is(sname, rname, 'Procedure', stype, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `procedure_sql_data_access_is` (`sname` VARCHAR(64), `rname` VARCHAR(64), `sda` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
RETURN routine_sql_data_access_is(sname, rname, 'Procedure', sda, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `qi` (`ident` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF LEFT(ident,1) = '`' AND RIGHT(ident,1) = '`' THEN
RETURN ident;
END IF;
IF LEFT(ident,1) = '"' AND RIGHT(ident,1) = '"' THEN
RETURN CONCAT('`', TRIM(BOTH '"' FROM ident) ,'`');
END IF;
RETURN CONCAT('`', ident, '`');
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `qs` (`val` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF ISNULL(val) THEN
RETURN 'NULL';
END IF;
RETURN CONCAT('\'', REPLACE(val, '''', '\\\''), '\'');
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `quote_ident` (`ident` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF ISNULL(ident) THEN
RETURN 'NULL';
END IF;
IF ident = '' THEN
RETURN '\'\'';
END IF;
IF LOCATE('ANSI_QUOTES', @@SQL_MODE) > 0 THEN
IF is_reserved(ident) OR locate('"', ident) > 0 THEN
RETURN concat('"', replace(ident, '"', '""'), '"');
END IF;
ELSE
IF is_reserved(ident) OR locate('`', ident) > 0 THEN
RETURN concat('`', replace(ident, '`', '``'), '`');
END IF;
END IF;
RETURN ident;
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `qv` (`val` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF ISNULL(val) THEN
RETURN 'NULL';
END IF;
IF val REGEXP '^[[:digit:]]+$' THEN
RETURN val;
END IF;
RETURN CONCAT('\'', REPLACE(val, '''', '\\\''), '\'');
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `role_isnt_default` (`rname` CHAR(97), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
SET @rname = _format_user(rname);
IF description = '' THEN
SET description = CONCAT('Role ', rname, ' should not be a DEFAULT role');
END IF;
RETURN ok(NOT _role_is_default(@rname), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `role_is_default` (`rname` CHAR(97), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
SET @rname = _format_user(rname);
IF description = '' THEN
SET description = CONCAT('Role ', rname, ' should be a DEFAULT role');
END IF;
IF NOT _has_user_at_host(@rname) THEN
RETURN CONCAT(ok(FALSE, description),'\n',
diag (CONCAT('Role ', rname, ' is not defined')));
END IF;
RETURN ok(_role_is_default(@rname), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `routines_are` (`sname` VARCHAR(64), `rtype` VARCHAR(9), `want` TEXT, `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
SET @want = want;
SET @have = (SELECT GROUP_CONCAT('`',routine_name,'`')
FROM `information_schema`.`routines`
WHERE `routine_schema` = sname
AND `routine_type` = rtype);
IF description = '' THEN
SET description = CONCAT('Schema ', quote_ident(sname),
' should have the correct ', LOWER(rtype), 's');
END IF;
IF NOT _has_schema(sname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Schema ', quote_ident(sname), ' does not exist')));
END IF;
CALL _populate_want(@want);
CALL _populate_have(@have);
SET @missing = (SELECT _missing(@have));
SET @extras = (SELECT _extra(@want));
RETURN _are(CONCAT(rtype, 's'), @extras, @missing, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `routine_has_sql_mode` (`sname` VARCHAR(64), `rname` VARCHAR(64), `rtype` VARCHAR(64), `smode` VARCHAR(8192), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
DECLARE valid ENUM('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE',
'NOT_USED','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE',
'POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS',
'NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES',
'STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES',
'ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE',
'NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH');
DECLARE EXIT HANDLER FOR 1265
RETURN CONCAT(ok(FALSE,description), '\n',
diag(CONCAT('SQL Mode ', quote_ident(smode), ' is invalid')));
IF description = '' THEN
SET description = CONCAT(UPPER(rtype), ' ', quote_ident(sname), '.', quote_ident(rname),
' requires SQL Mode ', quote_ident(smode));
END IF;
SET valid = smode;
IF NOT _has_routine(sname, rname, 'FUNCTION') THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT(UPPER(rtype),' ', quote_ident(sname), '.', quote_ident(rname), ' does not exist')));
END IF;
RETURN ok(_routine_has_sql_mode(sname, rname, rtype, smode), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `routine_is_deterministic` (`sname` VARCHAR(64), `rname` VARCHAR(64), `rtype` VARCHAR(9), `val` VARCHAR(3), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT(rtype, ' ', quote_ident(sname), '.', quote_ident(rname),
' should have IS_DETERMINISTIC ', quote_ident(val));
END IF;
IF val NOT IN('YES','NO') THEN
RETURN CONCAT(ok(FALSE, description),'\n',
diag('Is Deterministic must be { YES | NO }'));
END IF;
IF NOT _has_routine(sname, rname, rtype) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT(ucf(rtype), ' ', quote_ident(sname), '.', quote_ident(rname),
' does not exist')));
END IF;
RETURN eq(_routine_is_deterministic(sname, rname, rtype), val, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `routine_privileges_are` (`sname` VARCHAR(64), `rtype` VARCHAR(9), `rname` VARCHAR(64), `gtee` VARCHAR(81), `ptypes` TEXT, `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
SET @gtee = _format_user(gtee);
SET @want = ptypes;
SET @have = _routine_privileges(sname, rtype, rname, @gtee);
IF description = '' THEN
SET description = CONCAT('Account ', gtee, ' should have the correct routine privileges');
END IF;
IF NOT _has_routine(sname, rname, rtype) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT(rtype, ' `', sname, '`.`', rname, '` does not exist')));
END IF;
IF NOT _has_user_at_host(@gtee) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Account ', gtee, ' does not exist')));
END IF;
CALL _populate_want(@want);
CALL _populate_have(@have);
SET @missing = (SELECT _missing(@have));
SET @extras = (SELECT _extra(@want));
RETURN _are('Routine Privileges', @extras, @missing, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `routine_security_type_is` (`sname` VARCHAR(64), `rname` VARCHAR(64), `rtype` VARCHAR(9), `stype` VARCHAR(7), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT(rtype, ' ', quote_ident(sname), '.', quote_ident(rname),
' should have Security Type ' , quote_ident(stype));
END IF;
IF stype NOT IN('INVOKER','DEFINER') THEN
RETURN CONCAT(ok(FALSE, description),'\n',
diag('Security Type must be { INVOKER | DEFINER }'));
END IF;
IF NOT _has_routine(sname, rname, rtype) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT(ucf(rtype), ' ', quote_ident(sname), '.', quote_ident(rname), ' does not exist')));
END IF;
RETURN eq(_routine_security_type(sname, rname, rtype), stype, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `routine_sha1_is` (`sname` VARCHAR(64), `rname` VARCHAR(64), `rtype` VARCHAR(9), `sha1` VARCHAR(40), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT(ucf(rtype), ' ', quote_ident(sname), '.', quote_ident(rname),
' definition should match expected value');
END IF;
IF NOT _has_routine(sname, rname, rtype) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT(ucf(rtype), ' ', quote_ident(sname), '.', quote_ident(rname), ' does not exist')));
END IF;
RETURN eq(LEFT(_routine_sha1(sname, rname, rtype), LENGTH(sha1)), sha1, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `routine_sql_data_access_is` (`sname` VARCHAR(64), `rname` VARCHAR(64), `rtype` VARCHAR(9), `sda` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT(rtype ,' ', quote_ident(sname), '.', quote_ident(rname),
' should have SQL Data Access ', quote_ident(sda));
END IF;
IF NOT rtype IN('FUNCTION','PROCEDURE') THEN
RETURN CONCAT(ok(FALSE,description), '\n',
diag('Routine Type must be { FUNCTION | PROCEDURE }'));
END IF;
IF NOT sda IN('CONTAINS SQL','NO SQL','READS SQL DATA','MODIFIES SQL DATA') THEN
RETURN CONCAT(ok(FALSE,description), '\n',
diag('SQL Data Access must be { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }'));
END IF;
IF NOT _has_routine(sname, rname, rtype) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT(ucf(rtype), ' ', quote_ident(sname), '.', quote_ident(rname), ' does not exist')));
END IF;
RETURN eq(_routine_sql_data_access(sname, rname, rtype), sda, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `scheduler_is` (`want` VARCHAR(3), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = 'Event scheduler process should be correctly set';
END IF;
RETURN eq(_scheduler(), want, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `schemas_are` (`want` TEXT, `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
SET @want = want;
SET @have = (SELECT GROUP_CONCAT('`', `schema_name` ,'`')
FROM `information_schema`.`schemata`);
IF description = '' THEN
SET description = 'The correct Schemas should be defined';
END IF;
CALL _populate_want(@want);
CALL _populate_have(@have);
SET @missing = (SELECT _missing(@have));
SET @extras = (SELECT _extra(@want));
RETURN _are('schemas', @extras, @missing, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `schema_character_set_is` (`sname` VARCHAR(64), `cname` VARCHAR(32), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
RETURN schema_charset_is(sname, cname, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `schema_charset_is` (`sname` VARCHAR(64), `cname` VARCHAR(32), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Schema ', quote_ident(sname),
' should use Character Set ', quote_ident(cname));
END IF;
IF NOT _has_schema(sname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Schema ', quote_ident(sname), ' does not exist')));
END IF;
IF NOT _has_charset(cname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Character Set ', quote_ident(cname), ' is not available')));
END IF;
RETURN eq(_schema_charset_is(sname), cname, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `schema_collation_is` (`sname` VARCHAR(64), `cname` VARCHAR(32), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Schema ', quote_ident(sname), ' should have Collation ', qv(cname));
END IF;
IF NOT _has_schema(sname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Schema ', quote_ident(sname), ' does not exist')));
END IF;
IF NOT _has_collation(cname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Collation ', quote_ident(cname), ' is not available')));
END IF;
RETURN eq(_schema_collation_is(sname), cname , description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `schema_privileges_are` (`sname` VARCHAR(64), `gtee` VARCHAR(81), `ptypes` TEXT, `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
SET @gtee = _format_user(gtee);
SET @want = ptypes;
SET @have = _schema_privileges(sname, @gtee);
IF description = '' THEN
SET description = CONCAT('Account ', gtee, ' should have the correct schema privileges');
END IF;
IF NOT _has_schema(sname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Schema ', sname, ' does not exist')));
END IF;
IF NOT _has_user_at_host(@gtee) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Account ', gtee, ' does not exist')));
END IF;
CALL _populate_want(@want);
CALL _populate_have(@have);
SET @missing = (SELECT _missing(@have));
SET @extras = (SELECT _extra(@want));
RETURN _are('Schema Privileges', @extras, @missing, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `single_schema_privileges` (`sname` VARCHAR(64), `gtee` VARCHAR(81), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
SET @gtee = _format_user(gtee);
IF description = '' THEN
SET description = concat('Account ', gtee, ' should have privileges on a single schema');
END IF;
IF NOT _has_schema(sname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Schema `', sname, '` does not exist')));
END IF;
IF NOT _has_user_at_host(@gtee) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Account ', gtee, ' does not exist')));
END IF;
RETURN ok(_single_schema_priv(sname, @gtee), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `single_table_privileges` (`sname` VARCHAR(64), `tname` VARCHAR(64), `gtee` VARCHAR(81), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
SET @gtee = _format_user(gtee);
IF description = '' THEN
SET description = concat('Account ', gtee, ' should have privileges on a single table');
END IF;
IF NOT _has_table(sname,tname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Table `', sname, '`.`', tname, '` does not exist')));
END IF;
IF NOT _has_user_at_host(@gtee) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Account ', gtee, ' does not exist')));
END IF;
RETURN ok(_single_table_priv(sname, tname, @gtee), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `skip` (`how_many` INT, `why` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
DECLARE tap TEXT DEFAULT '';
REPEAT
SET tap = concat(
tap,
CASE WHEN tap = '' THEN '' ELSE '\n' END,
ok(1, concat('SKIP: ', COALESCE(why, '')))
);
SET how_many = how_many - 1;
UNTIL how_many = 0 END REPEAT;
RETURN tap;
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `subpartition_expression_is` (`sname` VARCHAR(64), `tname` VARCHAR(64), `subp` VARCHAR(64), `expr` LONGTEXT, `description` TEXT) RETURNS LONGTEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = concat('Subpartition ', quote_ident(tname), '.', quote_ident(subp),
' should have Subpartition Expression ', qv(TRIM(expr)));
END IF;
IF NOT _has_subpartition(sname, tname, subp) THEN
RETURN CONCAT(ok( FALSE, description), '\n',
diag(CONCAT('Subpartition ', quote_ident(tname), '.', quote_ident(subp),
' does not exist')));
END IF;
RETURN eq(_subpartition_expression(sname, tname, subp), TRIM(expr), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `subpartition_method_is` (`sname` VARCHAR(64), `tname` VARCHAR(64), `subp` VARCHAR(64), `smeth` VARCHAR(18), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
DECLARE valid ENUM('HASH', 'LINEAR HASH', 'KEY', 'LINEAR KEY');
DECLARE EXIT HANDLER FOR 1265
RETURN CONCAT(ok(FALSE, description), '\n',
diag('Subpartition Method must be { HASH | LINEAR HASH | KEY | LINEAR KEY }'));
IF description = '' THEN
SET description = CONCAT('Subpartition ', quote_ident(tname), '.', quote_ident(subp),
' should have SubPartition Method ', qv(smeth));
END IF;
SET valid = smeth;
IF NOT _has_subpartition(sname, tname, subp) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Subpartition ', quote_ident(tname),'.', quote_ident(subp),
' does not exist')));
END IF;
RETURN eq(_subpartition_method(sname, tname, subp), smeth, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `tables_are` (`sname` VARCHAR(64), `want` TEXT, `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
SET @want = want;
SET @have = (SELECT GROUP_CONCAT('`',table_name,'`')
FROM `information_schema`.`tables`
WHERE `table_schema` = sname
AND `table_type` = 'BASE TABLE');
IF description = '' THEN
SET description = CONCAT('Schema ', quote_ident(sname),
' should have the correct Tables');
END IF;
IF NOT _has_schema(sname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Schema ', quote_ident(sname), ' does not exist')));
END IF;
CALL _populate_want(@want);
CALL _populate_have(@have);
SET @missing = (SELECT _missing(@have));
SET @extras = (SELECT _extra(@want));
RETURN _are('tables', @extras, @missing, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `table_character_set_is` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(32), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Table ', quote_ident(sname), '.',
quote_ident(tname), ' should have Character Set ', qv(cname));
END IF;
IF NOT _has_table(sname, tname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Table ', quote_ident(sname), '.', quote_ident(tname),
' does not exist')));
END IF;
IF NOT _has_charset(cname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Character Set ', quote_ident(cname), ' is not available')));
END IF;
RETURN eq(_table_character_set(sname, tname), cname, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `table_collation_is` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = concat('Table ', quote_ident(sname), '.',
quote_ident(tname), ' should have Collation ', qv(cname));
END IF;
IF NOT _has_table(sname, tname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Table ', quote_ident(sname), '.',
quote_ident(tname), ' does not exist')));
END IF;
IF NOT _has_collation(cname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Collation ', quote_ident(cname), ' is not available')));
END IF;
RETURN eq(_table_collation(sname, tname), cname, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `table_engine_is` (`sname` VARCHAR(64), `tname` VARCHAR(64), `ename` VARCHAR(32), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = concat('Table ', quote_ident(sname), '.',
quote_ident(tname), ' should have Storage Engine ', quote_ident(ename));
END IF;
IF NOT _has_table(sname, tname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Table ', quote_ident(sname), '.', quote_ident(tname), ' does not exist')));
END IF;
IF NOT _has_engine(ename) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Storage Engine ', quote_ident(ename), ' is not available')));
END IF;
RETURN eq(_table_engine(sname, tname), ename , description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `table_privileges_are` (`sname` VARCHAR(64), `tname` VARCHAR(64), `gtee` VARCHAR(81), `ptypes` TEXT, `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
SET @gtee = _format_user(gtee);
SET @want = ptypes;
SET @have = _table_privileges(sname, tname, @gtee);
IF description = '' THEN
SET description = CONCAT('Account ', gtee, ' should have the correct table privileges');
END IF;
IF NOT _has_table(sname, tname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Table `', sname,'`.`', tname, '` does not exist')));
END IF;
IF NOT _has_user_at_host(@gtee) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Account ', gtee, ' does not exist')));
END IF;
CALL _populate_want(@want);
CALL _populate_have(@have);
SET @missing = (SELECT _missing(@have));
SET @extras = (SELECT _extra(@want));
RETURN _are('Table Privileges', @extras, @missing, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `table_sha1_is` (`sname` VARCHAR(64), `tname` VARCHAR(64), `sha1` VARCHAR(40), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Table ', quote_ident(sname), '.', quote_ident(tname),
' definition should match expected value');
END IF;
IF NOT _has_table(sname, tname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Table ', quote_ident(sname), '.', quote_ident(tname), ' does not exist')));
END IF;
RETURN eq(LEFT(_table_sha1(sname, tname), LENGTH(sha1)), sha1, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `timezones_updated` (`description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = concat('Timezones data should be updated for changes');
END IF;
IF NOT _has_timezones() THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Table `mysql`.`time_zone_data` is empty')));
END IF;
RETURN ok(_timezones_updated(), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `triggers_are` (`sname` VARCHAR(64), `tname` VARCHAR(64), `want` TEXT, `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
SET @want = want;
SET @have = (SELECT GROUP_CONCAT('`', `trigger_name` ,'`')
FROM `information_schema`.`triggers`
WHERE `trigger_schema` = sname
AND `event_object_table` = tname);
IF description = '' THEN
SET description = CONCAT('Table ', quote_ident(sname), '.', quote_ident(tname),
' should have the correct Triggers');
END IF;
IF NOT _has_table(sname,tname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Table ', quote_ident(sname), '.', quote_ident(tname),
' does not exist')));
END IF;
CALL _populate_want(@want);
CALL _populate_have(@have);
SET @missing = (SELECT _missing(@have));
SET @extras = (SELECT _extra(@want));
RETURN _are('triggers', @extras, @missing, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `trigger_event_is` (`sname` VARCHAR(64), `tname` VARCHAR(64), `trgr` VARCHAR(64), `evnt` VARCHAR(6), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = concat('Trigger ', quote_ident(tname), '.', quote_ident(trgr),
' Event should occur for ', qv(UPPER(evnt)));
END IF;
IF NOT _has_trigger(sname, tname, trgr) THEN
RETURN CONCAT(ok( FALSE, description), '\n',
diag(CONCAT('Trigger ', quote_ident(tname),'.', quote_ident(trgr),
' does not exist')));
END IF;
RETURN eq(_trigger_event(sname, tname, trgr), evnt, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `trigger_is` (`sname` VARCHAR(64), `tname` VARCHAR(64), `trgr` VARCHAR(64), `act_state` LONGTEXT, `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Trigger ', quote_ident(tname), '.', quote_ident(trgr),
' should have the correct action');
END IF;
IF NOT _has_trigger(sname, tname, trgr) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Trigger ', quote_ident(tname),'.', quote_ident(trgr),
' does not exist')));
END IF;
RETURN eq(_trigger_is(sname, tname, trgr), act_state, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `trigger_order_is` (`sname` VARCHAR(64), `tname` VARCHAR(64), `trgr` VARCHAR(64), `seq` BIGINT, `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Trigger ', quote_ident(tname), '.', quote_ident(trgr),
' should have Action Order ', qv(seq));
END IF;
IF NOT _has_trigger(sname, tname, trgr) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Trigger ', quote_ident(tname),'.', quote_ident(trgr),
' does not exist')));
END IF;
RETURN eq(_trigger_order(sname, tname, trgr), seq, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `trigger_timing_is` (`sname` VARCHAR(64), `tname` VARCHAR(64), `trgr` VARCHAR(64), `timing` VARCHAR(6), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('Trigger ', quote_ident(tname), '.', quote_ident(trgr),
' should have Timing ', qv(UPPER(timing)));
END IF;
IF NOT _has_trigger(sname, tname, trgr) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Trigger ', quote_ident(tname),'.', quote_ident(trgr),
' does not exist')));
END IF;
RETURN eq(_trigger_timing(sname, tname, trgr), timing, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `ucf` (`val` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
RETURN CONCAT(UPPER(LEFT(val, 1)), LOWER(SUBSTRING(val, 2)));
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `unalike` (`got` TEXT, `pat` TEXT, `descr` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
RETURN _unalike( got NOT LIKE pat, got, pat, descr );
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `uqi` (`ident` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF LEFT(ident,1) = '`' AND RIGHT(ident,1) = '`' THEN
RETURN TRIM(BOTH '`' FROM REPLACE(ident,'``','`'));
END IF;
IF LEFT(ident,1) = '"' AND RIGHT(ident,1) = '"' THEN
RETURN TRIM(BOTH '"' FROM REPLACE(ident,'""','"'));
END IF;
RETURN ident;
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `user_hasnt_lifetime` (`hname` CHAR(60), `uname` CHAR(32), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('User \'', uname, '\'@\'', hname, '\' Password should not expire');
END IF;
IF NOT _has_user(hname, uname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('User \'', uname, '\'@\'', hname, '\' does not exist')));
END IF;
RETURN ok(NOT _user_has_lifetime(hname, uname), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `user_has_lifetime` (`hname` CHAR(60), `uname` CHAR(32), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('User \'', uname, '\'@\'', hname, '\' Password should expire');
END IF;
IF NOT _has_user(hname, uname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('User \'', uname, '\'@\'', hname, '\' does not exist')));
END IF;
RETURN ok(_user_has_lifetime(hname, uname), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `user_not_ok` (`hname` CHAR(60), `uname` CHAR(32), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('User \'', uname, '\'@\'',
hname, '\' should be locked out or have an expired password');
END IF;
IF NOT _has_user(hname, uname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('User \'', uname, '\'@\'', hname, '\' does not exist')));
END IF;
RETURN ok(NOT _user_ok( hname, uname ), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `user_ok` (`hname` CHAR(60), `uname` CHAR(32), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('User \'', uname, '\'@\'',
hname, '\' should not be locked or have expired password');
END IF;
IF NOT _has_user(hname, uname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('User \'', uname, '\'@\'', hname, '\' does not exist')));
END IF;
RETURN ok(_user_ok(hname, uname), description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `views_are` (`sname` VARCHAR(64), `want` TEXT, `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
SET @want = want;
SET @have = (SELECT GROUP_CONCAT('`',table_name,'`')
FROM `information_schema`.`tables`
WHERE `table_schema` = sname
AND `table_type` = 'VIEW');
IF description = '' THEN
SET description = CONCAT('Schema ', quote_ident(sname),
' should have the correct Views');
END IF;
IF NOT _has_schema(sname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Schema ', quote_ident(sname), ' does not exist')));
END IF;
CALL _populate_want(@want);
CALL _populate_have(@have);
SET @missing = (SELECT _missing(@have));
SET @extras = (SELECT _extra(@want));
RETURN _are('views', @extras, @missing, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `view_check_option_is` (`sname` VARCHAR(64), `vname` VARCHAR(64), `copt` VARCHAR(8), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('View ', quote_ident(sname), '.', quote_ident(vname),
' should have Check Option ', qv(copt));
END IF;
IF NOT _has_view(sname, vname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('View ', quote_ident(sname), '.', quote_ident(vname),
' does not exist')));
END IF;
RETURN eq(_view_check_option(sname, vname), copt, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `view_definer_is` (`sname` VARCHAR(64), `vname` VARCHAR(64), `dfnr` VARCHAR(93), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('View ',
quote_ident(sname), '.', quote_ident(vname), ' should have Definer ', qv(dfnr));
END IF;
IF NOT _has_view(sname, vname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('View ', quote_ident(sname), '.', quote_ident(vname),
' does not exist')));
END IF;
RETURN eq(_view_definer(sname, vname), dfnr, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `view_is_updatable` (`sname` VARCHAR(64), `vname` VARCHAR(64), `updl` VARCHAR(3), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('View ', quote_ident(sname), '.', quote_ident(vname),
' should have Is Updatable ', qv(updl));
END IF;
IF NOT _has_view(sname, vname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('View ', quote_ident(sname), '.', quote_ident(vname),
' does not exist')));
END IF;
RETURN eq(_view_is_updatable(sname, vname), updl, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `view_security_type_is` (`sname` VARCHAR(64), `vname` VARCHAR(64), `stype` VARCHAR(7), `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF description = '' THEN
SET description = CONCAT('View ', quote_ident(sname), '.', quote_ident(vname),
' should have Security Type ', qv(stype));
END IF;
IF NOT _has_view(sname, vname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('View ', quote_ident(sname), '.', quote_ident(vname),
' does not exist')));
END IF;
RETURN eq(_view_security_type( sname, vname), stype, description);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_add` (`vlabel` TEXT, `vvalue` INTEGER, `vnote` TEXT) RETURNS INT(11) MODIFIES SQL DATA
DETERMINISTIC
BEGIN
INSERT INTO __tcache__ (label, cid, value, note)
VALUES (vlabel, connection_id(), vvalue, COALESCE(vnote, ''));
RETURN vvalue;
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_alike` (`res` BOOLEAN, `got` TEXT, `pat` TEXT, `descr` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF res THEN RETURN ok( res, descr ); END IF;
RETURN concat(ok(res, descr), '\n', diag(concat(
' ', COALESCE( quote(got), 'NULL' ),
'\n doesn''t match: ', COALESCE( quote(pat), 'NULL' )
)));
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_are` (`what` TEXT, `extras` TEXT, `missing` TEXT, `description` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
DECLARE msg TEXT DEFAULT '';
DECLARE res BOOLEAN DEFAULT TRUE;
IF extras <> '' THEN
SET res = FALSE;
SET msg = CONCAT('\n', CONCAT('\n'
' Extra ', what, ':\n ' , REPLACE( extras, ',', '\n ')));
END IF;
IF missing <> '' THEN
SET res = FALSE;
SET msg = CONCAT(msg, CONCAT('\n'
' Missing ', what, ':\n ' , REPLACE( missing, ',', '\n ')));
END IF;
RETURN CONCAT(ok(res, description), diag(msg));
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_column_privileges` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64), `gtee` VARCHAR(81)) RETURNS TEXT CHARSET utf8mb4 BEGIN
DECLARE rtn TEXT;
IF @rollup = 1 THEN
SELECT GROUP_CONCAT(`privilege_type`) INTO rtn
FROM
( SELECT `privilege_type`
FROM `information_schema`.`user_privileges`
WHERE `grantee` = gtee AND _column_privs(`privilege_type`) > 0
UNION
SELECT `privilege_type`
FROM `information_schema`.`schema_privileges`
WHERE `grantee` = gtee AND `table_schema` = sname AND _column_privs (`privilege_type`) > 0
UNION
SELECT `privilege_type`
FROM `information_schema`.`table_privileges`
WHERE `grantee` = gtee AND `table_schema` = sname AND `table_name` = tname AND _column_privs (`privilege_type`) > 0
UNION
SELECT `privilege_type`
FROM `information_schema`.`column_privileges`
WHERE `grantee` = gtee AND `table_schema` = sname AND `table_name` = tname AND `column_name` = cname
) u;
ELSE
SELECT GROUP_CONCAT(`privilege_type`) INTO rtn
FROM `information_schema`.`column_privileges`
WHERE `grantee` = gtee AND `table_schema` = sname AND `table_name` = tname AND `column_name` = cname;
END IF;
RETURN rtn;
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_column_privs` (`ptype` VARCHAR(64)) RETURNS TINYINT(1) BEGIN
RETURN FIND_IN_SET(ptype, 'INSERT,REFERENCES,SELECT,UPDATE');
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_column_type` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64)) RETURNS LONGTEXT CHARSET utf8mb4 READS SQL DATA
DETERMINISTIC
BEGIN
DECLARE ret LONGTEXT;
SELECT `column_type` INTO ret
FROM `information_schema`.`columns`
WHERE `table_schema` = sname
AND `table_name` = tname
AND `column_name` = cname;
RETURN COALESCE(ret, NULL);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_col_charset` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64)) RETURNS VARCHAR(32) CHARSET utf8mb4 READS SQL DATA
DETERMINISTIC
BEGIN
DECLARE ret VARCHAR(32);
SELECT `character_set_name` INTO ret
FROM `information_schema`.`columns`
WHERE `table_schema` = sname
AND `table_name` = tname
AND `column_name` = cname;
RETURN COALESCE(ret, NULL);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_col_collation` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64)) RETURNS VARCHAR(32) CHARSET utf8mb4 READS SQL DATA
DETERMINISTIC
BEGIN
DECLARE ret VARCHAR(32);
SELECT `collation_name` INTO ret
FROM `information_schema`.`columns`
WHERE `table_schema` = sname
AND `table_name` = tname
AND `column_name` = cname;
RETURN COALESCE(ret, NULL);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_col_default` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64)) RETURNS LONGTEXT CHARSET utf8mb4 READS SQL DATA
DETERMINISTIC
BEGIN
DECLARE ret LONGTEXT;
SELECT `column_default` INTO ret
FROM `information_schema`.`columns`
WHERE `table_schema` = sname
AND `table_name` = tname
AND `column_name` = cname;
RETURN ret ;
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_col_extra_is` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64)) RETURNS VARCHAR(30) CHARSET utf8mb4 READS SQL DATA
DETERMINISTIC
BEGIN
DECLARE ret VARCHAR(30);
SELECT `extra` INTO ret
FROM `information_schema`.`columns`
WHERE `table_schema` = sname
AND `table_name` = tname
AND `column_name` = cname;
RETURN ret;
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_col_has_default` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64)) RETURNS TINYINT(1) READS SQL DATA
DETERMINISTIC
BEGIN
DECLARE ret BOOLEAN;
SELECT 1 INTO ret
FROM `information_schema`.`columns`
WHERE `table_schema` = sname
AND `table_name` = tname
AND `column_name` = cname
AND CASE tap.mysql_variant()
WHEN 'MariaDB' THEN `column_default` <> 'NULL'
ELSE `column_default` IS NOT NULL
END;
RETURN coalesce(ret, 0);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_col_has_index_key` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64)) RETURNS TINYINT(1) READS SQL DATA
DETERMINISTIC
BEGIN
DECLARE ret BOOLEAN;
SELECT 1 INTO ret
FROM `information_schema`.`statistics`
WHERE `table_schema` = sname
AND `table_name` = tname
AND `column_name` = cname
AND `index_name` <> 'PRIMARY'
LIMIT 1;
RETURN coalesce(ret, false);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_col_has_named_index` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64), `kname` VARCHAR(64)) RETURNS TINYINT(1) READS SQL DATA
DETERMINISTIC
BEGIN
DECLARE ret BOOLEAN;
SELECT 1 INTO ret
FROM `information_schema`.`statistics`
WHERE `table_schema` = sname
AND `table_name` = tname
AND `column_name` = cname
AND `index_name` = kname;
RETURN COALESCE(ret, 0);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_col_has_non_unique_index` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64)) RETURNS TINYINT(1) READS SQL DATA
DETERMINISTIC
BEGIN
DECLARE ret BOOLEAN;
SELECT true into ret
FROM `information_schema`.`statistics`
WHERE `table_schema` = sname
AND `table_name` = tname
AND `column_name` = cname
AND `index_name` <> 'PRIMARY'
AND `non_unique` = 1
limit 1;
RETURN coalesce(ret, false);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_col_has_pos_in_named_index` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64), `kname` VARCHAR(64), `pos` INT) RETURNS TINYINT(1) READS SQL DATA
DETERMINISTIC
BEGIN
DECLARE ret BOOLEAN;
SELECT 1 INTO ret
FROM `information_schema`.`statistics`
WHERE `table_schema` = sname
AND `table_name` = tname
AND `column_name` = cname
AND `index_name` = kname
AND `seq_in_index` = pos;
RETURN coalesce(ret, 0);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_col_has_primary_key` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64)) RETURNS TINYINT(1) READS SQL DATA
DETERMINISTIC
BEGIN
DECLARE ret BOOLEAN;
SELECT 1 INTO ret
FROM `information_schema`.`columns`
WHERE `table_schema` = sname
AND `table_name` = tname
AND `column_name` = cname
AND `column_key` = 'PRI';
RETURN coalesce(ret, false);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_col_has_type` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64), `ctype` LONGTEXT) RETURNS TINYINT(1) READS SQL DATA
DETERMINISTIC
BEGIN
DECLARE ret BOOLEAN;
SELECT 1 INTO ret
FROM `information_schema`.`columns`
WHERE `table_schema` = sname
AND `table_name` = tname
AND `column_name` = cname
AND `column_type` = ctype;
RETURN COALESCE(ret, 0);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_col_has_unique_index` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64)) RETURNS TINYINT(1) READS SQL DATA
DETERMINISTIC
BEGIN
DECLARE ret BOOLEAN;
SELECT true into ret
FROM `information_schema`.`statistics`
WHERE `table_schema` = sname
AND `table_name` = tname
AND `column_name` = cname
AND `index_name` <> 'PRIMARY'
AND `non_unique` = 0
limit 1;
RETURN coalesce(ret, false);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_col_is_pk` (`sname` VARCHAR(64), `tname` VARCHAR(64), `want` TEXT) RETURNS TINYINT(1) BEGIN
DECLARE ret BOOLEAN;
SELECT COUNT(`indexdef`) INTO ret
FROM
(
SELECT `table_name`, `index_name`,
GROUP_CONCAT(CONCAT('`', `column_name`, '`') ORDER BY `seq_in_index`) AS `indexdef`
FROM `information_schema`.`statistics`
WHERE `table_schema` = sname
AND `table_name` = tname
GROUP BY `table_name`,`index_name`
) indices
WHERE `index_name` = 'PRIMARY'
AND `indexdef` = want;
RETURN IF(ret <> 0 , TRUE, FALSE);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_col_is_unique` (`sname` VARCHAR(64), `tname` VARCHAR(64), `want` TEXT) RETURNS TINYINT(1) BEGIN
DECLARE ret BOOLEAN;
SELECT COUNT(`indexdef`) INTO ret
FROM
(
SELECT `table_name`, `index_name`,
GROUP_CONCAT(CONCAT('`', `column_name`, '`') ORDER BY `seq_in_index`) AS `indexdef`
FROM `information_schema`.`statistics`
WHERE `table_schema` = sname
AND `table_name` = tname
AND `non_unique` = 0
GROUP BY `table_name`,`index_name`
) indices
WHERE `indexdef` = want;
RETURN IF(ret > 0 , 1, 0);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_col_nullable` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64)) RETURNS VARCHAR(3) CHARSET utf8mb4 READS SQL DATA
DETERMINISTIC
BEGIN
DECLARE ret VARCHAR(3);
SELECT `is_nullable` INTO ret
FROM `information_schema`.`columns`
WHERE `table_schema` = sname
AND `table_name` = tname
AND `column_name` = cname;
RETURN ret;
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_constraint_type` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64)) RETURNS VARCHAR(64) CHARSET utf8mb4 BEGIN
DECLARE ret VARCHAR(64);
SELECT `constraint_type` INTO ret
FROM `information_schema`.`table_constraints`
WHERE `constraint_schema` = sname
AND `table_name` = tname
AND `constraint_name` = cname;
RETURN ret;
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_datatype` (`word` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
SET word =
CASE
WHEN word IN ('BOOL', 'BOOLEAN') THEN 'TINYINT'
WHEN word = 'INTEGER' THEN 'INT'
WHEN word IN ('DEC', 'NUMERIC', 'FIXED') THEN 'DECIMAL'
WHEN word IN ('DOUBLE_PRECISION') THEN 'DOUBLE'
WHEN word = 'REAL' THEN IF (INSTR(@@GLOBAL.sql_mode, 'REAL_AS_FLOAT') > 0 , 'FLOAT' , 'DOUBLE')
WHEN word IN ('NCHAR', 'CHARACTER', 'NATIONAL_CHARACTER') THEN 'CHAR'
WHEN word IN ('NVARCHAR', 'VARCHARACTER', 'CHARACTER_VARYING', 'NATIONAL_VARCHAR') THEN 'VARCHAR'
WHEN word = 'CHAR_BYTE' THEN 'BIT'
ELSE word
END ;
RETURN word;
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_data_type` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64)) RETURNS LONGTEXT CHARSET utf8mb4 READS SQL DATA
DETERMINISTIC
BEGIN
DECLARE ret LONGTEXT;
SELECT `data_type` INTO ret
FROM `information_schema`.`columns`
WHERE `table_schema` = sname
AND `table_name` = tname
AND `column_name` = cname;
RETURN COALESCE(ret, NULL);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_engine_default` () RETURNS VARCHAR(64) CHARSET utf8mb4 BEGIN
DECLARE ret VARCHAR(64);
SELECT `engine` INTO ret
FROM `information_schema`.`engines`
WHERE `support` = 'DEFAULT';
RETURN COALESCE(ret, 0);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_eq` (`have` TEXT, `want` TEXT) RETURNS TINYINT(1) BEGIN
RETURN (have IS NOT NULL AND want IS NOT NULL AND have = want)
OR (have IS NULL AND want IS NULL)
OR 0;
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_event_interval_field` (`sname` VARCHAR(64), `ename` VARCHAR(64)) RETURNS VARCHAR(18) CHARSET utf8mb4 BEGIN
DECLARE ret VARCHAR(18);
SELECT `interval_field` INTO ret
FROM `information_schema`.`events`
WHERE `event_schema` = sname
AND `event_name` = ename;
RETURN ret;
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_event_interval_value` (`sname` VARCHAR(64), `ename` VARCHAR(64)) RETURNS VARCHAR(256) CHARSET utf8mb4 BEGIN
DECLARE ret VARCHAR(256);
SELECT `interval_value` INTO ret
FROM `information_schema`.`events`
WHERE `event_schema` = sname
AND `event_name` = ename;
RETURN ret;
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_event_status` (`sname` VARCHAR(64), `ename` VARCHAR(64)) RETURNS VARCHAR(18) CHARSET utf8mb4 BEGIN
DECLARE ret VARCHAR(18);
SELECT `status` INTO ret
FROM `information_schema`.`events`
WHERE `event_schema` = sname
AND `event_name` = ename;
RETURN ret;
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_event_type` (`sname` VARCHAR(64), `ename` VARCHAR(64)) RETURNS VARCHAR(9) CHARSET utf8mb4 BEGIN
DECLARE ret VARCHAR(9);
SELECT `event_type` INTO ret
FROM `information_schema`.`events`
WHERE `event_schema` = sname
AND `event_name` = ename;
RETURN ret;
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_extra` (`want` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
DECLARE ret TEXT;
SET @want = REPLACE(want,'`','');
SELECT GROUP_CONCAT(qi(`ident`)) INTO ret
FROM `have`
WHERE NOT COALESCE(FIND_IN_SET(`ident`, @want),0);
RETURN COALESCE(ret, '');
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_finish` (`curr_test` INTEGER, `exp_tests` INTEGER, `num_faild` INTEGER) RETURNS TEXT CHARSET utf8mb4 MODIFIES SQL DATA
DETERMINISTIC
BEGIN
DECLARE ret TEXT DEFAULT '';
DECLARE plural CHAR DEFAULT '';
IF exp_tests = 1 THEN SET plural = 's'; END IF;
IF curr_test IS NULL THEN
CALL _cleanup();
SELECT `# No tests run!` INTO ret;
END IF;
IF exp_tests = 0 OR exp_tests IS NULL THEN
SET exp_tests = curr_test;
SET ret = concat('1..', COALESCE(exp_tests, 0));
END IF;
IF curr_test <> exp_tests THEN
SET ret = concat(ret, CASE WHEN ret THEN '\n' ELSE '' END, diag(concat(
'Looks like you planned ', exp_tests, ' test',
plural, ' but ran ', curr_test
)));
ELSEIF num_faild > 0 THEN
SET ret = concat(ret, CASE WHEN ret THEN '\n' ELSE '' END, diag(concat(
'Looks like you failed ', num_faild, ' test',
CASE num_faild WHEN 1 THEN '' ELSE 's' END,
' of ', exp_tests
)));
END IF;
CALL _cleanup();
RETURN ret;
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_fixCSL` (`want` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
SET want = REPLACE(want, '''','');
SET want = REPLACE(want, '"','');
SET want = REPLACE(want, '\n','');
RETURN want;
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_fk_ok` (`csch` VARCHAR(64), `ctab` VARCHAR(64), `ccol` TEXT, `usch` VARCHAR(64), `utab` VARCHAR(64), `ucol` TEXT) RETURNS TINYINT(1) BEGIN
DECLARE ret BOOLEAN;
SELECT COUNT(*) INTO ret
FROM
(
SELECT kc.`constraint_schema` AS `csch`,
kc.`table_name` AS `ctab`,
GROUP_CONCAT(CONCAT('`',kc.`column_name`,'`') ORDER BY kc.`ordinal_position`) AS `cols1`,
kc.`referenced_table_schema` AS `usch`,
kc.`referenced_table_name` AS `utab`,
GROUP_CONCAT(CONCAT('`',kc.`referenced_column_name`,'`') ORDER BY `position_in_unique_constraint`) AS `cols2`
FROM `information_schema`.`key_column_usage` kc
WHERE kc.`constraint_schema` = csch AND kc.`referenced_table_schema` = usch
AND kc.`table_name` = ctab AND kc.`referenced_table_name` = utab
GROUP BY 1,2,4,5
HAVING GROUP_CONCAT(CONCAT('`',kc.`column_name`,'`') ORDER BY kc.`ordinal_position`) = ccol
AND GROUP_CONCAT(CONCAT('`',kc.`referenced_column_name`,'`') ORDER BY `position_in_unique_constraint`) = ucol
) fkey;
RETURN COALESCE(ret,0);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_fk_on_delete` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64)) RETURNS VARCHAR(64) CHARSET utf8mb4 BEGIN
DECLARE ret VARCHAR(64);
SELECT `delete_rule` INTO ret
FROM `information_schema`.`referential_constraints`
WHERE `constraint_schema` = sname
AND `table_name` = tname
AND `constraint_name` = cname;
RETURN ret;
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_fk_on_update` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64)) RETURNS VARCHAR(64) CHARSET utf8mb4 BEGIN
DECLARE ret VARCHAR(64);
SELECT `update_rule` INTO ret
FROM `information_schema`.`referential_constraints`
WHERE `constraint_schema` = sname
AND `table_name` = tname
AND `constraint_name` = cname;
RETURN ret;
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_format_user` (`uname` CHAR(97)) RETURNS CHAR(97) CHARSET utf8mb4 BEGIN
SET @uname = uname;
SET @uname = REPLACE(@uname, '"','''');
SET @uname = REPLACE(@uname, '`','''');
IF @uname REGEXP '@' = 0 THEN
SET @uname = CONCAT(@uname, '@\'%\'');
END IF;
IF LEFT(@uname,1) != '''' THEN
SET @uname = CONCAT('''', @uname);
END IF;
IF LOCATE('''@', @uname) = 0 THEN
SET @uname = REPLACE(@uname, '@', '''@');
END IF;
IF LOCATE('@''', @uname) = 0 THEN
SET @uname = REPLACE(@uname, '@', '@''');
END IF;
IF RIGHT(@uname,1) != '''' THEN
SET @uname = CONCAT(@uname,'''');
END IF;
RETURN @uname;
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_function_data_type` (`sname` VARCHAR(64), `rname` VARCHAR(64)) RETURNS VARCHAR(64) CHARSET utf8mb4 BEGIN
DECLARE ret VARCHAR(64);
SELECT `data_type` INTO ret
FROM `information_schema`.`routines`
WHERE `routine_schema` = sname
AND `routine_name` = rname
AND `routine_type` = 'FUNCTION';
RETURN COALESCE(ret, NULL);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_get` (`vlabel` TEXT) RETURNS INT(11) READS SQL DATA
BEGIN
DECLARE ret integer;
SELECT value INTO ret
FROM __tcache__
WHERE cid = connection_id()
AND label = vlabel LIMIT 1;
RETURN ret;
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_get_latest_id` (`vlabel` TEXT) RETURNS INT(11) READS SQL DATA
BEGIN
DECLARE ret integer;
SELECT id INTO ret
FROM __tcache__
WHERE cid = connection_id()
AND label = vlabel
AND id = (SELECT MAX(id) FROM __tcache__ WHERE cid = connection_id() AND label = vlabel)
LIMIT 1;
RETURN ret;
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_get_latest_value` (`vlabel` TEXT) RETURNS INT(11) READS SQL DATA
BEGIN
DECLARE ret integer;
SELECT value INTO ret
FROM __tcache__
WHERE cid = connection_id()
AND label = vlabel
AND id = (SELECT MAX(id) FROM __tcache__ WHERE cid = connection_id() AND label = vlabel)
LIMIT 1;
RETURN ret;
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_get_latest_with_value` (`vlabel` TEXT, `vvalue` INTEGER) RETURNS INT(11) READS SQL DATA
BEGIN
DECLARE ret integer;
SELECT MAX(id)
INTO ret
FROM __tcache__
WHERE label = vlabel
AND value = vvalue
AND cid = connection_id();
RETURN ret;
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_get_note_by_id` (`vid` INTEGER) RETURNS TEXT CHARSET utf8mb4 READS SQL DATA
BEGIN
DECLARE ret TEXT;
SELECT note INTO ret FROM __tcache__ WHERE id = vid LIMIT 1;
RETURN ret;
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_global_privileges` (`gtee` VARCHAR(81)) RETURNS TEXT CHARSET utf8mb4 BEGIN
DECLARE rtn TEXT;
SELECT GROUP_CONCAT(`privilege_type`) INTO rtn
FROM `information_schema`.`user_privileges`
WHERE `grantee` = gtee;
RETURN rtn;
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_global_privs` (`ptype` VARCHAR(64)) RETURNS TINYINT(1) BEGIN
RETURN FIND_IN_SET(ptype,
'ALTER,ALTER ROUTINE,CREATE,CREATE ROUTINE,CREATE TABLESPACE,CREATE TEMPORARY TABLES,CREATE USER,CREATE VIEW,DELETE,DROP,EVENT,EXECUTE,FILE,GRANT,INDEX,INSERT,LOCK TABLES,PROCESS,REFERENCES,RELOAD,REPLICATION CLIENT,REPLICATION SLAVE,SELECT,SHOW DATABASES,SHOW VIEW,SHUTDOWN,SUPER,TRIGGER,UPDATE,USAGE');
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_global_var` (`var` VARCHAR(64)) RETURNS VARCHAR(1024) CHARSET utf8mb4 BEGIN
DECLARE ret VARCHAR(1024);
SELECT `variable_value` INTO ret
FROM `performance_schema`.`global_variables`
WHERE `variable_name` = var;
RETURN COALESCE(ret, 0);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_has_charset` (`cname` VARCHAR(32)) RETURNS TINYINT(1) BEGIN
DECLARE ret BOOLEAN;
SELECT 1 INTO ret
FROM `information_schema`.`character_sets`
WHERE `character_set_name` = cname;
RETURN COALESCE(ret, 0);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_has_collation` (`cname` VARCHAR(32)) RETURNS TINYINT(1) BEGIN
DECLARE ret BOOLEAN;
SELECT 1 INTO ret
FROM `information_schema`.`collations`
WHERE `collation_name` = cname
AND `is_compiled` = 'YES';
RETURN COALESCE(ret, 0);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_has_column` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64)) RETURNS TINYINT(1) READS SQL DATA
DETERMINISTIC
BEGIN
DECLARE ret BOOLEAN;
SELECT 1 INTO ret
FROM `information_schema`.`columns`
WHERE `table_schema` = sname
AND `table_name` = tname
AND `column_name` = cname;
RETURN coalesce(ret, 0);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_has_column_priv` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64), `gtee` VARCHAR(81), `ptype` VARCHAR(64)) RETURNS TINYINT(1) BEGIN
DECLARE rtn INT;
IF @rollup = 1 THEN
SELECT SUM(priv) INTO rtn
FROM
(
SELECT 1 AS priv
FROM `information_schema`.`user_privileges`
WHERE `grantee` = gtee
AND `privilege_type` = ptype
UNION ALL
SELECT 1 AS priv
FROM `information_schema`.`schema_privileges`
WHERE `grantee` = gtee
AND `privilege_type` = ptype
AND `table_schema` = sname
UNION ALL
SELECT 1 AS priv
FROM `information_schema`.`table_privileges`
WHERE `grantee` = gtee
AND `privilege_type` = ptype
AND `table_schema` = sname
AND `table_name` = tname
UNION ALL
SELECT 1 AS priv
FROM `information_schema`.`column_privileges`
WHERE `grantee` = gtee
AND `privilege_type` = ptype
AND `table_schema` = sname
AND `table_name` = tname
AND `column_name` = cname
) a;
ELSE
SELECT 1 INTO rtn
FROM `information_schema`.`column_privileges`
WHERE `grantee` = gtee
AND `privilege_type` = ptype
AND `table_schema` = sname
AND `table_name` = tname
AND `column_name` = cname;
END IF;
RETURN IF(rtn > 0, 1, 0);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_has_constraint` (`sname` VARCHAR(64), `tname` VARCHAR(64), `cname` VARCHAR(64)) RETURNS TINYINT(1) BEGIN
DECLARE ret INT;
SELECT COUNT(*) INTO ret
FROM `information_schema`.`table_constraints`
WHERE `constraint_schema` = sname
AND `table_name` = tname
AND `constraint_name` = cname;
RETURN IF(ret > 0 , 1, 0);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_has_constraint_type` (`sname` VARCHAR(64), `tname` VARCHAR(64), `ctype` VARCHAR(64)) RETURNS TINYINT(1) BEGIN
DECLARE ret INT;
SELECT COUNT(*) INTO ret
FROM `information_schema`.`table_constraints`
WHERE `constraint_schema` = sname
AND `table_name` = tname
AND `constraint_type` = ctype;
RETURN IF(ret > 0 , 1, 0);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_has_engine` (`ename` VARCHAR(64)) RETURNS TINYINT(1) BEGIN
DECLARE ret BOOLEAN;
SELECT 1 INTO ret
FROM `information_schema`.`engines`
WHERE `engine` = ename
AND (`support` = 'YES' OR `support` = 'DEFAULT');
RETURN COALESCE(ret, 0);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_has_event` (`sname` VARCHAR(64), `ename` VARCHAR(64)) RETURNS TINYINT(1) BEGIN
DECLARE ret BOOLEAN;
SELECT 1 INTO ret
FROM `information_schema`.`events`
WHERE `event_schema` = sname
AND `event_name` = ename;
RETURN COALESCE(ret, 0);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_has_global_priv` (`gtee` VARCHAR(81), `ptype` VARCHAR(64)) RETURNS TINYINT(1) BEGIN
DECLARE rtn INT DEFAULT 0;
SELECT 1 INTO rtn
FROM `information_schema`.`user_privileges`
WHERE `grantee` = gtee
AND `privilege_type` = ptype;
RETURN rtn;
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_has_index` (`sname` VARCHAR(64), `tname` VARCHAR(64), `iname` VARCHAR(64)) RETURNS TINYINT(1) BEGIN
DECLARE ret BOOLEAN;
SELECT 1 INTO ret
FROM `information_schema`.`statistics`
WHERE `table_schema` = sname
AND `table_name` = tname
AND `index_name` = iname
LIMIT 1;
RETURN COALESCE(ret, 0);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_has_partition` (`sname` VARCHAR(64), `tname` VARCHAR(64), `part` VARCHAR(64)) RETURNS TINYINT(1) BEGIN
DECLARE ret BOOLEAN;
SELECT 1 INTO ret
FROM `information_schema`.`partitions`
WHERE `table_schema` = sname
AND `table_name` = tname
AND `partition_name` = part
LIMIT 1;
RETURN COALESCE(ret, 0);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_has_partitioning` () RETURNS TINYINT(1) BEGIN
DECLARE ret BOOLEAN;
SELECT 1 INTO ret
FROM `information_schema`.`plugins`
WHERE `plugin_type`='STORAGE ENGINE'
AND `plugin_name` = 'partition'
AND `plugin_status` = 'active';
RETURN COALESCE(ret, 0);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_has_priv` (`gtee` VARCHAR(81), `ptype` VARCHAR(64)) RETURNS TINYINT(1) BEGIN
DECLARE rtn INT;
SELECT SUM(priv) INTO rtn
FROM
(
SELECT 1 AS priv
FROM `information_schema`.`user_privileges`
WHERE `grantee` = gtee
AND `privilege_type` = ptype
UNION ALL
SELECT 1 AS priv
FROM `information_schema`.`schema_privileges`
WHERE `grantee` = gtee
AND `privilege_type` = ptype
UNION ALL
SELECT 1 AS priv
FROM `information_schema`.`table_privileges`
WHERE `grantee` = gtee
AND `privilege_type` = ptype
UNION ALL
SELECT 1 AS priv
FROM `information_schema`.`column_privileges`
WHERE `grantee` = gtee
AND `privilege_type` = ptype
) a;
RETURN IF(rtn > 0, 1, 0);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_has_role` (`rname` CHAR(93)) RETURNS TINYINT(1) BEGIN
DECLARE ret BOOLEAN;
SELECT COUNT(*) INTO ret
FROM `mysql`.`role_edges`
WHERE CONCAT('''', `from_user`, '''@''', from_host, '''') = rname;
RETURN IF(ret > 0, 1, 0);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_has_routine` (`sname` VARCHAR(64), `rname` VARCHAR(64), `rtype` VARCHAR(9)) RETURNS TINYINT(1) BEGIN
DECLARE ret BOOLEAN;
SELECT 1 INTO ret
FROM `information_schema`.`routines`
WHERE `routine_schema` = sname
AND `routine_name` = rname
AND `routine_type` = rtype;
RETURN COALESCE(ret,0);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_has_schema` (`sname` VARCHAR(64)) RETURNS TINYINT(1) BEGIN
DECLARE ret BOOLEAN;
SELECT 1 INTO ret
FROM `information_schema`.`schemata`
WHERE `schema_name` = sname;
RETURN COALESCE(ret, 0);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_has_schema_priv` (`sname` VARCHAR(64), `gtee` VARCHAR(81), `ptype` VARCHAR(64)) RETURNS TINYINT(1) BEGIN
DECLARE rtn INT;
IF @rollup = 1 THEN
SELECT SUM(priv) INTO rtn
FROM
(
SELECT 1 AS priv
FROM `information_schema`.`user_privileges`
WHERE `grantee` = gtee
AND `privilege_type` = ptype
UNION ALL
SELECT 1 AS priv
FROM `information_schema`.`schema_privileges`
WHERE `grantee` = gtee
AND `privilege_type` = ptype
AND `table_schema` = sname
) a;
ELSE
SELECT 1 INTO rtn
FROM `information_schema`.`schema_privileges`
WHERE `grantee` = gtee
AND `privilege_type` = ptype
AND `table_schema` = sname;
END IF;
RETURN IF(rtn > 0, 1, 0);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_has_security` (`sname` VARCHAR(64), `vname` VARCHAR(64), `vsecurity` VARCHAR(9)) RETURNS TINYINT(1) BEGIN
DECLARE ret boolean;
SELECT 1 INTO ret
FROM `information_schema`.`views`
WHERE `table_schema` = sname
AND `table_name` = vname
AND `security_type` = vsecurity;
RETURN coalesce(ret, false);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_has_subpartition` (`sname` VARCHAR(64), `tname` VARCHAR(64), `subp` VARCHAR(64)) RETURNS TINYINT(1) BEGIN
DECLARE ret BOOLEAN;
SELECT 1 INTO ret
FROM `information_schema`.`partitions`
WHERE `table_schema` = sname
AND `table_name` = tname
AND `subpartition_name` = subp;
RETURN COALESCE(ret, 0);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_has_table` (`sname` VARCHAR(64), `tname` VARCHAR(64)) RETURNS TINYINT(1) BEGIN
DECLARE ret BOOLEAN;
SELECT 1 INTO ret
FROM `information_schema`.`tables`
WHERE `table_name` = tname
AND `table_schema` = sname;
RETURN COALESCE(ret, 0);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_has_table_priv` (`sname` VARCHAR(64), `tname` VARCHAR(64), `gtee` VARCHAR(81), `ptype` VARCHAR(64)) RETURNS TINYINT(1) BEGIN
DECLARE rtn INT;
IF @rollup = 1 THEN
SELECT SUM(priv) INTO rtn
FROM
(
SELECT 1 AS priv
FROM `information_schema`.`user_privileges`
WHERE `grantee` = gtee
AND `privilege_type` = ptype
UNION ALL
SELECT 1 AS priv
FROM `information_schema`.`schema_privileges`
WHERE `grantee` = gtee
AND `privilege_type` = ptype
AND `table_schema` = sname
UNION ALL
SELECT 1 AS priv
FROM `information_schema`.`table_privileges`
WHERE `grantee` = gtee
AND `privilege_type` = ptype
AND `table_schema` = sname
AND `table_name` = tname
) a;
ELSE
SELECT 1 INTO rtn
FROM `information_schema`.`table_privileges`
WHERE `grantee` = gtee
AND `privilege_type` = ptype
AND `table_schema` = sname
AND `table_name` = tname;
END IF;
RETURN IF(rtn > 0, 1, 0);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_has_timezones` () RETURNS TINYINT(1) BEGIN
DECLARE ret INT;
SELECT count(*) INTO ret
FROM `mysql`.`time_zone_name`;
RETURN IF(ret > 0, 1, 0);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_has_trigger` (`sname` VARCHAR(64), `tname` VARCHAR(64), `trgr` VARCHAR(64)) RETURNS TINYINT(1) BEGIN
DECLARE ret BOOLEAN;
SELECT 1 INTO ret
FROM `information_schema`.`triggers`
WHERE `trigger_schema` = sname
AND `event_object_table` = tname
AND `trigger_name` = trgr;
RETURN COALESCE(ret, 0);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_has_unique` (`sname` VARCHAR(64), `tname` VARCHAR(64)) RETURNS TINYINT(1) BEGIN
DECLARE ret BOOLEAN;
SELECT COUNT(`table_name`) INTO ret
FROM `information_schema`.`statistics`
WHERE `table_schema` = sname
AND `table_name` = tname
AND `non_unique` = 0;
RETURN IF(ret <> 0 , TRUE, FALSE);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_has_user` (`hname` CHAR(60), `uname` CHAR(32)) RETURNS TINYINT(1) BEGIN
DECLARE ret BOOLEAN;
SELECT 1 INTO ret
FROM `mysql`.`user`
WHERE `host` = hname
AND `user` = uname;
RETURN COALESCE(ret, 0);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_has_user_at_host` (`uname` CHAR(97)) RETURNS TINYINT(1) BEGIN
DECLARE ret BOOLEAN;
SELECT 1 INTO ret
FROM `mysql`.`user`
WHERE CONCAT('\'',`user`, '\'@\'', `host`, '\'') = uname;
RETURN COALESCE(ret, 0);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_has_view` (`sname` VARCHAR(64), `vname` VARCHAR(64)) RETURNS TINYINT(1) BEGIN
DECLARE ret BOOLEAN;
SELECT 1 INTO ret
FROM `information_schema`.`tables`
WHERE `table_schema` = sname
AND `table_name` = vname
AND `table_type` = 'VIEW';
RETURN coalesce(ret, false);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_index_def` (`sname` VARCHAR(64), `tname` VARCHAR(64), `iname` VARCHAR(64)) RETURNS TEXT CHARSET utf8mb4 BEGIN
DECLARE ret TEXT;
SELECT GROUP_CONCAT(CONCAT('`', `column_name`, '`'),
IF(`sub_part` IS NULL, '', CONCAT('(', `sub_part`, ')'))) AS 'column_name' INTO ret
FROM `information_schema`.`statistics`
WHERE `table_schema` = sname
AND `table_name` = tname
AND `index_name` = iname
ORDER BY `seq_in_index`;
RETURN ret;
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_index_type` (`sname` VARCHAR(64), `tname` VARCHAR(64), `iname` VARCHAR(64)) RETURNS VARCHAR(16) CHARSET utf8mb4 BEGIN
DECLARE ret VARCHAR(16);
SELECT `index_type` INTO ret
FROM `information_schema`.`statistics`
WHERE `table_schema` = sname
AND `table_name` = tname
AND `index_name` = iname
LIMIT 1;
RETURN COALESCE(ret, NULL);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_is_indexed` (`sname` VARCHAR(64), `tname` VARCHAR(64), `want` TEXT) RETURNS TINYINT(1) BEGIN
DECLARE ret BOOLEAN;
SELECT COUNT(`indexdef`) INTO ret
FROM
(
SELECT `table_name`, `index_name`,
GROUP_CONCAT(CONCAT('`', `column_name`, '`') ORDER BY `seq_in_index`) AS `indexdef`
FROM `information_schema`.`statistics`
WHERE `table_schema` = sname
AND `table_name` = tname
GROUP BY `table_name`,`index_name`
) indices
WHERE `indexdef` = want;
RETURN IF(ret <> 0 , TRUE, FALSE);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_missing` (`have` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
DECLARE ret TEXT;
SET @have = REPLACE(have,'`','');
SELECT GROUP_CONCAT(qi(`ident`)) INTO ret
FROM `want`
WHERE NOT COALESCE(FIND_IN_SET(`ident`, @have),0);
RETURN COALESCE(ret, '');
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_nextnumb` () RETURNS INT(11) BEGIN
DECLARE nextnumb INTEGER DEFAULT COALESCE(_get('tnumb'), 0) + 1;
RETURN _set('tnumb', nextnumb, '');
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_partition_count` (`sname` VARCHAR(64), `tname` VARCHAR(64)) RETURNS SMALLINT(6) BEGIN
DECLARE ret SMALLINT;
SELECT COUNT(*) INTO ret
FROM `information_schema`.`partitions`
WHERE `table_schema` = sname
AND `table_name` = tname
AND `partition_name` IS NOT NULL;
RETURN COALESCE(ret, 0);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_partition_expression` (`sname` VARCHAR(64), `tname` VARCHAR(64), `part` VARCHAR(64)) RETURNS LONGTEXT CHARSET utf8mb4 BEGIN
DECLARE ret LONGTEXT;
SELECT TRIM(`partition_expression`) INTO ret
FROM `information_schema`.`partitions`
WHERE `table_schema` = sname
AND `table_name` = tname
AND `partition_name` = part
LIMIT 1;
RETURN COALESCE(ret, NULL);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_partition_method` (`sname` VARCHAR(64), `tname` VARCHAR(64), `part` VARCHAR(64)) RETURNS VARCHAR(18) CHARSET utf8mb4 BEGIN
DECLARE ret VARCHAR(18);
SELECT `partition_method` INTO ret
FROM `information_schema`.`partitions`
WHERE `table_schema` = sname
AND `table_name` = tname
AND `partition_name` = part
LIMIT 1;
RETURN COALESCE(ret, NULL);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_role_is_default` (`rname` CHAR(93)) RETURNS TINYINT(1) BEGIN
DECLARE ret BOOLEAN;
SELECT COUNT(*) INTO ret
FROM `mysql`.`default_roles`
WHERE CONCAT('''', `default_role_user`, '''@''', `default_role_host`, '''') = rname;
RETURN IF(ret > 0, 1, 0);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_routine_has_sql_mode` (`sname` VARCHAR(64), `rname` VARCHAR(64), `rtype` VARCHAR(9), `smode` VARCHAR(8192)) RETURNS TINYINT(1) BEGIN
DECLARE ret BOOLEAN;
SELECT LOCATE(smode, `sql_mode`) INTO ret
FROM `information_schema`.`routines`
WHERE `routine_schema` = sname
AND `routine_name` = rname
AND `routine_type` = rtype;
RETURN COALESCE(ret, 0);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_routine_is_deterministic` (`sname` VARCHAR(64), `rname` VARCHAR(64), `rtype` VARCHAR(9)) RETURNS VARCHAR(3) CHARSET utf8mb4 BEGIN
DECLARE ret VARCHAR(3);
SELECT `is_deterministic` INTO ret
FROM `information_schema`.`routines`
WHERE `routine_schema` = sname
AND `routine_name` = rname
AND `routine_type` = rtype;
RETURN COALESCE(ret, NULL);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_routine_privileges` (`sname` VARCHAR(64), `rtype` VARCHAR(9), `rname` VARCHAR(64), `gtee` VARCHAR(81)) RETURNS TEXT CHARSET utf8mb4 BEGIN
DECLARE rtn TEXT;
IF @rollup = 1 THEN
SELECT GROUP_CONCAT(`privilege_type`) INTO rtn
FROM
( SELECT `privilege_type`
FROM `information_schema`.`user_privileges`
WHERE `grantee` = gtee AND _routine_privs(`privilege_type`) > 0
UNION
SELECT `privilege_type`
FROM `information_schema`.`schema_privileges`
WHERE `table_schema` = sname AND `grantee` = gtee AND _routine_privs(`privilege_type`) > 0
UNION
SELECT `privilege_type`
FROM `tap`.`proc_privileges`
WHERE `routine_schema` = sname AND `routine_name` = rname AND `routine_type` = rtype AND `grantee` = gtee
) u;
ELSE
SELECT GROUP_CONCAT(`privilege_type`) INTO rtn
FROM `tap`.`proc_privileges`
WHERE `routine_schema` = sname AND `routine_name` = rname AND `routine_type` = rtype AND `grantee` = gtee;
END IF;
RETURN rtn;
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_routine_privs` (`ptype` VARCHAR(64)) RETURNS TINYINT(1) BEGIN
RETURN FIND_IN_SET(ptype, 'ALTER ROUTINE,CREATE ROUTINE,EXECUTE,GRANT');
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_routine_security_type` (`sname` VARCHAR(64), `rname` VARCHAR(64), `rtype` VARCHAR(9)) RETURNS VARCHAR(7) CHARSET utf8mb4 BEGIN
DECLARE ret VARCHAR(7);
SELECT `security_type` INTO ret
FROM `information_schema`.`routines`
WHERE `routine_schema` = sname
AND `routine_name` = rname
AND `routine_type` = rtype ;
RETURN COALESCE(ret, NULL);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_routine_sha1` (`sname` VARCHAR(64), `rname` VARCHAR(64), `rtype` VARCHAR(9)) RETURNS CHAR(40) CHARSET utf8mb4 BEGIN
DECLARE ret CHAR(40);
SELECT SHA1(`routine_definition`) INTO ret
FROM `information_schema`.`routines`
WHERE `routine_schema` = sname
AND `routine_name` = rname;
RETURN COALESCE(ret, NULL);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_routine_sql_data_access` (`sname` VARCHAR(64), `rname` VARCHAR(64), `rtype` VARCHAR(9)) RETURNS VARCHAR(64) CHARSET utf8mb4 BEGIN
DECLARE ret VARCHAR(64);
SELECT `sql_data_access` INTO ret
FROM `information_schema`.`routines`
WHERE `routine_schema` = sname
AND `routine_name` = rname
AND `routine_type` = rtype ;
RETURN COALESCE(ret, NULL);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_scheduler` () RETURNS VARCHAR(3) CHARSET utf8mb4 BEGIN
DECLARE ret VARCHAR(3);
SELECT @@GLOBAL.event_scheduler INTO ret;
RETURN ret;
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_schema_charset_is` (`sname` VARCHAR(64)) RETURNS VARCHAR(32) CHARSET utf8mb4 BEGIN
DECLARE ret VARCHAR(32);
SELECT `default_character_set_name` INTO ret
FROM `information_schema`.`schemata`
WHERE `schema_name` = sname;
RETURN COALESCE(ret, NULL);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_schema_collation_is` (`sname` VARCHAR(64)) RETURNS VARCHAR(32) CHARSET utf8mb4 BEGIN
DECLARE ret VARCHAR(32);
SELECT `default_collation_name` INTO ret
FROM `information_schema`.`schemata`
WHERE `schema_name` = sname;
RETURN COALESCE(ret, NULL);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_schema_privileges` (`sname` VARCHAR(64), `gtee` VARCHAR(81)) RETURNS TEXT CHARSET utf8mb4 BEGIN
DECLARE rtn TEXT;
IF @rollup = 1 THEN
SELECT GROUP_CONCAT(`privilege_type`) INTO rtn
FROM
( SELECT `privilege_type`
FROM `information_schema`.`user_privileges`
WHERE `grantee` = gtee AND _schema_privs(`privilege_type`) > 0
UNION
SELECT `privilege_type`
FROM `information_schema`.`schema_privileges`
WHERE `grantee` = gtee AND `table_schema` = sname
) u;
ELSE
SELECT GROUP_CONCAT(`privilege_type`) INTO rtn
FROM `information_schema`.`schema_privileges`
WHERE `grantee` = gtee AND `table_schema` = sname;
END IF;
RETURN rtn;
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_schema_privs` (`ptype` VARCHAR(64)) RETURNS TINYINT(1) BEGIN
RETURN FIND_IN_SET(ptype,
'ALTER,ALTER ROUTINE,CREATE,CREATE ROUTINE,CREATE TEMPORARY TABLES,CREATE VIEW,DELETE,DROP,EVENT,EXECUTE,GRANT,INDEX,INSERT,LOCK TABLES,REFERENCES,SELECT,SHOW VIEW,TRIGGER,UPDATE');
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_set` (`vlabel` TEXT, `vvalue` INTEGER, `vnote` TEXT) RETURNS INT(11) READS SQL DATA
BEGIN
UPDATE __tcache__
SET value = vvalue,
note = COALESCE(vnote, '')
WHERE cid = connection_id()
AND label = vlabel;
IF ROW_COUNT() = 0 THEN
RETURN _add( vlabel, vvalue, vnote );
END IF;
RETURN vvalue;
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_single_schema_priv` (`sname` VARCHAR(64), `gtee` VARCHAR(81)) RETURNS TINYINT(1) BEGIN
DECLARE rtn INT;
SELECT COUNT(DISTINCT `table_schema`) INTO rtn
FROM `information_schema`.`schema_privileges`
WHERE `grantee` = gtee
AND `table_schema` = sname
AND NOT EXISTS (
SELECT *
FROM information_schema.schema_privileges
WHERE `grantee` = gtee
AND `table_schema` != sname
)
AND NOT EXISTS (
SELECT *
FROM `information_schema`.`user_privileges`
WHERE `grantee` = gtee
AND _schema_privs(`privilege_type`) > 0
)
AND NOT EXISTS (
SELECT *
FROM `information_schema`.`table_privileges`
WHERE `grantee` = gtee
AND `table_schema` != sname
)
AND NOT EXISTS (
SELECT *
FROM `information_schema`.`column_privileges`
WHERE `grantee` = gtee
AND `table_schema` != sname
)
AND NOT EXISTS (
SELECT *
FROM `tap`.`proc_privileges`
WHERE `grantee` = gtee
AND `routine_schema` != sname
);
RETURN rtn;
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_single_table_priv` (`sname` VARCHAR(64), `tname` VARCHAR(64), `gtee` VARCHAR(81)) RETURNS TINYINT(1) BEGIN
DECLARE rtn INT;
SELECT COUNT(DISTINCT `table_name`) INTO rtn
FROM `information_schema`.`table_privileges`
WHERE `grantee` = gtee
AND `table_schema` = sname
AND `table_name` = tname
AND NOT EXISTS (
SELECT *
FROM `information_schema`.`table_privileges`
WHERE `grantee` = gtee
AND `table_name` != tname
)
AND NOT EXISTS (
SELECT *
FROM `information_schema`.`user_privileges`
WHERE `grantee` = gtee
AND _table_privs(`privilege_type`) > 0
)
AND NOT EXISTS (
SELECT *
FROM `information_schema`.`schema_privileges`
WHERE `grantee` = gtee
AND _table_privs(`privilege_type`) > 0
)
AND NOT EXISTS (
SELECT *
FROM `information_schema`.`column_privileges`
WHERE `grantee` = gtee
AND `table_name` != tname
);
RETURN rtn;
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_subpartition_expression` (`sname` VARCHAR(64), `tname` VARCHAR(64), `subp` VARCHAR(64)) RETURNS LONGTEXT CHARSET utf8mb4 BEGIN
DECLARE ret LONGTEXT;
SELECT TRIM(`subpartition_expression`) INTO ret
FROM `information_schema`.`partitions`
WHERE `table_schema` = sname
AND `table_name` = tname
AND `subpartition_name` = subp;
RETURN COALESCE(ret, NULL);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_subpartition_method` (`sname` VARCHAR(64), `tname` VARCHAR(64), `subp` VARCHAR(64)) RETURNS VARCHAR(12) CHARSET utf8mb4 BEGIN
DECLARE ret VARCHAR(12);
SELECT `subpartition_method` INTO ret
FROM `information_schema`.`partitions`
WHERE `table_schema` = sname
AND `table_name` = tname
AND `subpartition_name` = subp;
RETURN COALESCE(ret, NULL);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_table_character_set` (`sname` VARCHAR(64), `tname` VARCHAR(64)) RETURNS VARCHAR(32) CHARSET utf8mb4 BEGIN
DECLARE ret VARCHAR(32);
SELECT c.`character_set_name` INTO ret
FROM `information_schema`.`tables` AS t
INNER JOIN `information_schema`.`collation_character_set_applicability` AS c
ON (t.`table_collation` = c.`collation_name`)
WHERE t.`table_schema` = sname
AND t.`table_name` = tname;
RETURN COALESCE(ret, NULL);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_table_collation` (`sname` VARCHAR(64), `tname` VARCHAR(64)) RETURNS VARCHAR(32) CHARSET utf8mb4 BEGIN
DECLARE ret VARCHAR(32);
SELECT `table_collation` INTO ret
FROM `information_schema`.`tables`
WHERE `table_schema` = sname
AND `table_name` = tname;
RETURN COALESCE(ret, NULL);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_table_engine` (`sname` VARCHAR(64), `tname` VARCHAR(64)) RETURNS VARCHAR(32) CHARSET utf8mb4 BEGIN
DECLARE ret VARCHAR(32);
SELECT `engine` INTO ret
FROM `information_schema`.`tables`
WHERE `table_schema` = sname
AND `table_name` = tname;
RETURN COALESCE(ret, NULL);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_table_privileges` (`sname` VARCHAR(64), `tname` VARCHAR(64), `gtee` VARCHAR(81)) RETURNS TEXT CHARSET utf8mb4 BEGIN
DECLARE rtn TEXT;
IF @rollup = 1 THEN
SELECT GROUP_CONCAT(`privilege_type`) INTO rtn
FROM
( SELECT `privilege_type`
FROM `information_schema`.`user_privileges`
WHERE `grantee` = gtee AND _table_privs(`privilege_type`) > 0
UNION
SELECT `privilege_type`
FROM `information_schema`.`schema_privileges`
WHERE `grantee` = gtee AND `table_schema` = sname AND _table_privs (`privilege_type`) > 0
UNION
SELECT `privilege_type`
FROM `information_schema`.`table_privileges`
WHERE `grantee` = gtee AND `table_schema` = sname AND `table_name` = tname
) u;
ELSE
SELECT GROUP_CONCAT(`privilege_type`) INTO rtn
FROM `information_schema`.`table_privileges`
WHERE `grantee` = gtee AND `table_schema` = sname AND `table_name` = tname;
END IF;
RETURN rtn;
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_table_privs` (`ptype` VARCHAR(64)) RETURNS TINYINT(1) BEGIN
RETURN FIND_IN_SET(ptype,
'ALTER,CREATE,CREATE VIEW,DELETE,DROP,GRANT,INDEX,INSERT,REFERENCES,SELECT,SHOW VIEW,TRIGGER,UPDATE');
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_table_sha1` (`sname` VARCHAR(64), `tname` VARCHAR(64)) RETURNS CHAR(40) CHARSET utf8mb4 BEGIN
DECLARE ret CHAR(40);
SELECT SHA1(GROUP_CONCAT(sha)) INTO ret
FROM
(
(SELECT SHA1(
GROUP_CONCAT(
SHA1(
CONCAT_WS('',`table_catalog`,`table_schema`,`table_name`,`column_name`,
`ordinal_position`,`column_default`,`is_nullable`,`data_type`,
`character_maximum_length`,`character_octet_length`,`numeric_precision`,
`numeric_scale`,`datetime_precision`,`character_set_name`,`collation_name`,
`column_type`,`column_key`,`extra`,`privileges`,`column_comment`,
`generation_expression`,`srs_id`)
))) sha
FROM `information_schema`.`columns`
WHERE `table_schema` = sname
AND `table_name` = tname
ORDER BY `table_name` ASC,`column_name` ASC)
UNION ALL
(SELECT SHA1(
GROUP_CONCAT(
SHA1(
CONCAT_WS('',`constraint_catalog`,`constraint_schema`,`constraint_name`,
`unique_constraint_catalog`,`unique_constraint_schema`,`unique_constraint_name`,
`match_option`,`update_rule`,`delete_rule`,`table_name`,`referenced_table_name`)
))) sha
FROM `information_schema`.`referential_constraints`
WHERE `constraint_schema` = sname
AND `table_name` = tname
ORDER BY `table_name` ASC,`constraint_name` ASC)
UNION ALL
(SELECT SHA1(
GROUP_CONCAT(
SHA1(
CONCAT_WS('',`table_catalog`,`table_schema`,`table_name`,`non_unique`,
`index_schema`,`index_name`,`seq_in_index`,`column_name`,`collation`,`cardinality`,
`sub_part`,`packed`,`nullable`,`index_type`,`comment`,`index_comment`,`is_visible`)
))) sha
FROM `information_schema`.`statistics`
WHERE `table_schema` = sname
AND `table_name` = tname
ORDER BY `table_name` ASC,`index_name` ASC,`seq_in_index` ASC)
UNION ALL
(SELECT SHA1(
GROUP_CONCAT(
SHA1(
CONCAT_WS('',`trigger_catalog`,`trigger_schema`,`trigger_name`,`event_manipulation`,
`event_object_catalog`,`event_object_schema`,`event_object_table`,`action_order`,
`action_condition`,`action_statement`,`action_orientation`,`action_timing`,
`action_reference_old_table`,`action_reference_new_table`,`action_reference_old_row`,
`action_reference_new_row`,`sql_mode`,`definer`,`database_collation`)
))) sha
FROM `information_schema`.`triggers`
WHERE `trigger_schema` = sname
AND `event_object_table` = tname
ORDER BY `event_object_table` ASC,`trigger_name` ASC)
) objects;
RETURN COALESCE(ret, NULL);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_tap` (`aok` BOOLEAN, `test_num` INTEGER, `descr` TEXT, `todo_why` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
RETURN concat(CASE aok WHEN TRUE THEN '' ELSE 'not ' END,
'ok ', test_num,
CASE descr WHEN '' THEN '' ELSE COALESCE( concat(' - ', substr(diag( descr ), 3)), '' ) END,
COALESCE( concat(' ', diag( concat('TODO ', todo_why) )), ''),
CASE WHEN aok THEN '' ELSE concat('\n',
diag(concat('Failed ',
CASE WHEN todo_why IS NULL THEN '' ELSE '(TODO) ' END,
'test ', test_num,
CASE descr WHEN '' THEN '' ELSE COALESCE(concat(': "', descr, '"'), '') END,
CASE WHEN aok IS NULL THEN concat('\n', ' (test result was NULL)') ELSE '' END
))) END
);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_timezones_updated` () RETURNS TINYINT(1) BEGIN
DECLARE pre DATETIME;
DECLARE post DATETIME;
SET pre = (SELECT CONVERT_TZ('2007-03-11 2:00:00','US/Eastern','US/Central'));
SET post = (SELECT CONVERT_TZ('2007-03-11 3:00:00','US/Eastern','US/Central'));
RETURN IF(pre = post, 1, 0);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_todo` () RETURNS TEXT CHARSET utf8mb4 MODIFIES SQL DATA
DETERMINISTIC
BEGIN
DECLARE todos INTEGER DEFAULT _get_latest_value('todo');
DECLARE todo_id INTEGER;
DECLARE note TEXT;
IF todos IS NULL THEN
RETURN NULL;
END IF;
SET todo_id = _get_latest_id('todo');
IF todos = 0 THEN
DELETE FROM __tcache__ WHERE id = todo_id;
RETURN NULL;
END IF;
IF todos <> -1 THEN
CALL _idset(todo_id, todos - 1);
END IF;
SET note = _get_note_by_id(todo_id);
IF todos = 1 THEN
DELETE FROM __tcache__ WHERE id = todo_id;
END IF;
RETURN note;
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_trigger_event` (`sname` VARCHAR(64), `tname` VARCHAR(64), `trgr` VARCHAR(64)) RETURNS VARCHAR(6) CHARSET utf8mb4 BEGIN
DECLARE ret VARCHAR(6);
SELECT `event_manipulation` INTO ret
FROM `information_schema`.`triggers`
WHERE `event_object_schema` = sname
AND `event_object_table` = tname
AND `trigger_name` = trgr;
RETURN COALESCE(ret, NULL);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_trigger_is` (`sname` VARCHAR(64), `tname` VARCHAR(64), `trgr` VARCHAR(64)) RETURNS LONGTEXT CHARSET utf8mb4 BEGIN
DECLARE ret LONGTEXT;
SELECT `action_statement` INTO ret
FROM `information_schema`.`triggers`
WHERE `event_object_schema` = sname
AND `event_object_table` = tname
AND `trigger_name` = trgr;
RETURN COALESCE(ret, NULL);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_trigger_order` (`sname` VARCHAR(64), `tname` VARCHAR(64), `trgr` VARCHAR(64)) RETURNS BIGINT(20) BEGIN
DECLARE ret BIGINT;
SELECT `action_order` INTO ret
FROM `information_schema`.`triggers`
WHERE `event_object_schema` = sname
AND `event_object_table` = tname
AND `trigger_name` = trgr;
RETURN COALESCE(ret, NULL);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_trigger_timing` (`sname` VARCHAR(64), `tname` VARCHAR(64), `trgr` VARCHAR(64)) RETURNS VARCHAR(6) CHARSET utf8mb4 BEGIN
DECLARE ret VARCHAR(6);
SELECT `action_timing` INTO ret
FROM `information_schema`.`triggers`
WHERE `event_object_schema` = sname
AND `event_object_table` = tname
AND `trigger_name` = trgr;
RETURN COALESCE(ret, NULL);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_unalike` (`res` BOOLEAN, `got` TEXT, `pat` TEXT, `descr` TEXT) RETURNS TEXT CHARSET utf8mb4 BEGIN
IF res THEN RETURN ok( res, descr ); END IF;
RETURN concat(ok(res, descr), '\n', diag(concat(
' ', COALESCE( quote(got), 'NULL' ),
'\n matches: ', COALESCE( quote(pat), 'NULL' )
)));
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_user_has_lifetime` (`hname` CHAR(60), `uname` CHAR(32)) RETURNS TINYINT(1) BEGIN
DECLARE ret BOOLEAN;
SELECT 1 INTO ret
FROM tap.mysql__user
WHERE `Host` = hname
AND `User` = uname
AND `password_lifetime` IS NOT NULL AND `password_lifetime` != 0;
RETURN COALESCE(ret, 0);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_user_ok` (`hname` CHAR(60), `uname` CHAR(32)) RETURNS TINYINT(1) BEGIN
DECLARE ret BOOLEAN;
SELECT 1 INTO ret
FROM tap.mysql__user
WHERE `host` = hname
AND `user` = uname
AND `password_expired` <> 'Y'
AND `account_locked` <> 'Y';
RETURN COALESCE(ret, 0);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_view_check_option` (`sname` VARCHAR(64), `vname` VARCHAR(64)) RETURNS VARCHAR(8) CHARSET utf8mb4 BEGIN
DECLARE ret VARCHAR(8);
SELECT `check_option` INTO ret
FROM `information_schema`.`views`
WHERE `table_schema` = sname
AND `table_name` = vname;
RETURN COALESCE(ret, NULL);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_view_definer` (`sname` VARCHAR(64), `vname` VARCHAR(64)) RETURNS VARCHAR(93) CHARSET utf8mb4 BEGIN
DECLARE ret VARCHAR(93);
SELECT `definer` INTO ret
FROM `information_schema`.`views`
WHERE `table_schema` = sname
AND `table_name` = vname;
RETURN COALESCE(ret, NULL);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_view_is_updatable` (`sname` VARCHAR(64), `vname` VARCHAR(64)) RETURNS VARCHAR(3) CHARSET utf8mb4 BEGIN
DECLARE ret VARCHAR(3);
SELECT `is_updatable` INTO ret
FROM `information_schema`.`views`
WHERE `table_schema` = sname
AND `table_name` = vname;
RETURN COALESCE(ret, NULL);
END$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_view_security_type` (`sname` VARCHAR(64), `vname` VARCHAR(64)) RETURNS VARCHAR(7) CHARSET utf8mb4 BEGIN
DECLARE ret VARCHAR(7);
SELECT `security_type` INTO ret
FROM `information_schema`.`views`
WHERE `table_schema` = sname
AND `table_name` = vname;
RETURN COALESCE(ret, NULL);
END$$
DELIMITER ;
-- --------------------------------------------------------
--
-- Stand-in struktur untuk tampilan `proc_privileges`
-- (Lihat di bawah untuk tampilan aktual)
--
CREATE TABLE `proc_privileges` (
`GRANTEE` varchar(145)
,`ROUTINE_SCHEMA` char(64)
,`ROUTINE_NAME` char(64)
,`ROUTINE_TYPE` varchar(12)
,`PRIVILEGE_TYPE` varchar(13)
);
-- --------------------------------------------------------
--
-- Struktur dari tabel `__tcache__`
--
CREATE TABLE `__tcache__` (
`id` int(11) NOT NULL,
`cid` int(11) NOT NULL,
`label` text NOT NULL,
`value` int(11) NOT NULL,
`note` text NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- --------------------------------------------------------
--
-- Struktur dari tabel `__tresults__`
--
CREATE TABLE `__tresults__` (
`numb` int(11) NOT NULL,
`cid` int(11) NOT NULL,
`ok` tinyint(1) NOT NULL DEFAULT 1,
`aok` tinyint(1) NOT NULL DEFAULT 1,
`descr` text NOT NULL,
`type` text NOT NULL,
`reason` text NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- --------------------------------------------------------
--
-- Struktur untuk view `proc_privileges`
--
DROP TABLE IF EXISTS `proc_privileges`;
CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `proc_privileges` AS select concat('\'',`mysql`.`procs_priv`.`User`,'\'@\'',`mysql`.`procs_priv`.`Host`,'\'') AS `GRANTEE`,`mysql`.`procs_priv`.`Db` AS `ROUTINE_SCHEMA`,`mysql`.`procs_priv`.`Routine_name` AS `ROUTINE_NAME`,`mysql`.`procs_priv`.`Routine_type` AS `ROUTINE_TYPE`,'EXECUTE' AS `PRIVILEGE_TYPE` from `mysql`.`procs_priv` where find_in_set('EXECUTE',`mysql`.`procs_priv`.`Proc_priv`) > 0 union select concat('\'',`mysql`.`procs_priv`.`User`,'\'@\'',`mysql`.`procs_priv`.`Host`,'\'') AS `GRANTEE`,`mysql`.`procs_priv`.`Db` AS `ROUTINE_SCHEMA`,`mysql`.`procs_priv`.`Routine_name` AS `ROUTINE_NAME`,`mysql`.`procs_priv`.`Routine_type` AS `ROUTINE_TYPE`,'ALTER ROUTINE' AS `PRIVILEGE_TYPE` from `mysql`.`procs_priv` where find_in_set('ALTER ROUTINE',`mysql`.`procs_priv`.`Proc_priv`) > 0 union select concat('\'',`mysql`.`procs_priv`.`User`,'\'@\'',`mysql`.`procs_priv`.`Host`,'\'') AS `GRANTEE`,`mysql`.`procs_priv`.`Db` AS `ROUTINE_SCHEMA`,`mysql`.`procs_priv`.`Routine_name` AS `ROUTINE_NAME`,`mysql`.`procs_priv`.`Routine_type` AS `ROUTINE_TYPE`,'GRANT' AS `PRIVILEGE_TYPE` from `mysql`.`procs_priv` where find_in_set('GRANT',`mysql`.`procs_priv`.`Proc_priv`) > 0 ;
--
-- Indexes for dumped tables
--
--
-- Indeks untuk tabel `__tcache__`
--
ALTER TABLE `__tcache__`
ADD PRIMARY KEY (`id`);
--
-- AUTO_INCREMENT untuk tabel yang dibuang
--
--
-- AUTO_INCREMENT untuk tabel `__tcache__`
--
ALTER TABLE `__tcache__`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=909;
COMMIT;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;