mirror of
https://github.com/percona/percona-toolkit.git
synced 2025-09-10 05:00:45 +00:00
pt-find.t: Create a second, old-style sakila db to do the trigger/function/proc tests
This commit is contained in:
@@ -111,80 +111,6 @@ SKIP: {
|
||||
"--view that doesn't match"
|
||||
);
|
||||
|
||||
# Test --procedure.
|
||||
$output = `$cmd sakila --procedure min_monthly_purchases --print`;
|
||||
is(
|
||||
$output,
|
||||
"`sakila`.`PROCEDURE rewards_report`\n",
|
||||
'--procedure that matches'
|
||||
);
|
||||
|
||||
$output = `$cmd sakila --procedure blah --print`;
|
||||
is(
|
||||
$output,
|
||||
'',
|
||||
"--procedure that doesn't match"
|
||||
);
|
||||
|
||||
# Test --function.
|
||||
$output = `$cmd sakila --function v_out --print`;
|
||||
is(
|
||||
$output,
|
||||
"`sakila`.`FUNCTION inventory_in_stock`\n",
|
||||
'--function that matches'
|
||||
);
|
||||
|
||||
$output = `$cmd sakila --function blah --print`;
|
||||
is(
|
||||
$output,
|
||||
'',
|
||||
"--function that doesn't match"
|
||||
);
|
||||
|
||||
# Test --trigger without --trigger-table.
|
||||
$output = `$cmd sakila --trigger 'UPDATE film_text' --print`;
|
||||
is(
|
||||
$output,
|
||||
"`sakila`.`UPDATE TRIGGER upd_film on film`\n",
|
||||
'--trigger that matches without --trigger-table'
|
||||
);
|
||||
|
||||
$output = `$cmd sakila --trigger blah --print`;
|
||||
is(
|
||||
$output,
|
||||
'',
|
||||
"--trigger that doesn't match without --trigger-table"
|
||||
);
|
||||
|
||||
# Test --trigger with --trigger-table.
|
||||
$output = `$cmd sakila --trigger 'UPDATE film_text' --trigger-table film --print`;
|
||||
is(
|
||||
$output,
|
||||
"`sakila`.`UPDATE TRIGGER upd_film on film`\n",
|
||||
'--trigger that matches with matching --trigger-table'
|
||||
);
|
||||
|
||||
$output = `$cmd sakila --trigger blah --trigger-table film --print`;
|
||||
is(
|
||||
$output,
|
||||
'',
|
||||
"--trigger that doesn't match with matching --trigger-table"
|
||||
);
|
||||
|
||||
$output = `$cmd sakila --trigger 'UPDATE film_text' --trigger-table foo --print`;
|
||||
is(
|
||||
$output,
|
||||
'',
|
||||
'--trigger that matches with non-matching --trigger-table'
|
||||
);
|
||||
|
||||
$output = `$cmd sakila --trigger blah --trigger-table foo --print`;
|
||||
is(
|
||||
$output,
|
||||
'',
|
||||
"--trigger that doesn't match with non-matching --trigger-table"
|
||||
);
|
||||
|
||||
# Test NULL sizes.
|
||||
$output = `$cmd sakila --datasize NULL`,
|
||||
is(
|
||||
@@ -201,6 +127,84 @@ SKIP: {
|
||||
);
|
||||
};
|
||||
|
||||
$sb->load_file('master', "t/pt-find/samples/pseudo-sakila.sql");
|
||||
|
||||
# Test --procedure.
|
||||
$output = `$cmd sakila_test --procedure min_monthly_purchases --print`;
|
||||
is(
|
||||
$output,
|
||||
"`sakila_test`.`PROCEDURE rewards_report`\n",
|
||||
'--procedure that matches'
|
||||
);
|
||||
|
||||
$output = `$cmd sakila_test --procedure blah --print`;
|
||||
is(
|
||||
$output,
|
||||
'',
|
||||
"--procedure that doesn't match"
|
||||
);
|
||||
|
||||
# Test --function.
|
||||
$output = `$cmd sakila_test --function v_out --print`;
|
||||
is(
|
||||
$output,
|
||||
"`sakila_test`.`FUNCTION inventory_in_stock`\n",
|
||||
'--function that matches'
|
||||
);
|
||||
|
||||
$output = `$cmd sakila_test --function blah --print`;
|
||||
is(
|
||||
$output,
|
||||
'',
|
||||
"--function that doesn't match"
|
||||
);
|
||||
|
||||
# Test --trigger without --trigger-table.
|
||||
$output = `$cmd sakila_test --trigger 'UPDATE film_text' --print`;
|
||||
is(
|
||||
$output,
|
||||
"`sakila_test`.`UPDATE TRIGGER upd_film on film`\n",
|
||||
'--trigger that matches without --trigger-table'
|
||||
);
|
||||
|
||||
$output = `$cmd sakila_test --trigger blah --print`;
|
||||
is(
|
||||
$output,
|
||||
'',
|
||||
"--trigger that doesn't match without --trigger-table"
|
||||
);
|
||||
|
||||
# Test --trigger with --trigger-table.
|
||||
$output = `$cmd sakila_test --trigger 'UPDATE film_text' --trigger-table film --print`;
|
||||
is(
|
||||
$output,
|
||||
"`sakila_test`.`UPDATE TRIGGER upd_film on film`\n",
|
||||
'--trigger that matches with matching --trigger-table'
|
||||
);
|
||||
|
||||
$output = `$cmd sakila_test --trigger blah --trigger-table film --print`;
|
||||
is(
|
||||
$output,
|
||||
'',
|
||||
"--trigger that doesn't match with matching --trigger-table"
|
||||
);
|
||||
|
||||
$output = `$cmd sakila_test --trigger 'UPDATE film_text' --trigger-table foo --print`;
|
||||
is(
|
||||
$output,
|
||||
'',
|
||||
'--trigger that matches with non-matching --trigger-table'
|
||||
);
|
||||
|
||||
$output = `$cmd sakila_test --trigger blah --trigger-table foo --print`;
|
||||
is(
|
||||
$output,
|
||||
'',
|
||||
"--trigger that doesn't match with non-matching --trigger-table"
|
||||
);
|
||||
|
||||
$dbh->do("DROP DATABASE sakila_test");
|
||||
|
||||
# #########################################################################
|
||||
# Issue 391: Add --pid option to all scripts
|
||||
# #########################################################################
|
||||
|
313
t/pt-find/samples/pseudo-sakila.sql
Normal file
313
t/pt-find/samples/pseudo-sakila.sql
Normal file
@@ -0,0 +1,313 @@
|
||||
-- Sakila Sample Database Schema
|
||||
-- Version 0.8
|
||||
|
||||
-- Copyright (c) 2006, MySQL AB
|
||||
-- All rights reserved.
|
||||
|
||||
-- Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
|
||||
-- * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
-- * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
-- * Neither the name of MySQL AB nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
|
||||
|
||||
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
|
||||
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
|
||||
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
|
||||
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';
|
||||
|
||||
DROP SCHEMA IF EXISTS sakila_test;
|
||||
CREATE SCHEMA sakila_test;
|
||||
USE sakila_test;
|
||||
|
||||
--
|
||||
-- Table structure for table `customer`
|
||||
--
|
||||
|
||||
CREATE TABLE customer (
|
||||
customer_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
store_id TINYINT UNSIGNED NOT NULL,
|
||||
first_name VARCHAR(45) NOT NULL,
|
||||
last_name VARCHAR(45) NOT NULL,
|
||||
email VARCHAR(50) DEFAULT NULL,
|
||||
address_id SMALLINT UNSIGNED NOT NULL,
|
||||
active BOOLEAN NOT NULL DEFAULT TRUE,
|
||||
create_date DATETIME NOT NULL,
|
||||
last_update TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (customer_id),
|
||||
KEY idx_fk_store_id (store_id),
|
||||
KEY idx_fk_address_id (address_id),
|
||||
KEY idx_last_name (last_name),
|
||||
CONSTRAINT fk_customer_address FOREIGN KEY (address_id) REFERENCES address (address_id) ON DELETE RESTRICT ON UPDATE CASCADE,
|
||||
CONSTRAINT fk_customer_store FOREIGN KEY (store_id) REFERENCES store (store_id) ON DELETE RESTRICT ON UPDATE CASCADE
|
||||
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
--
|
||||
-- Table structure for table `film`
|
||||
--
|
||||
|
||||
CREATE TABLE film (
|
||||
film_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
title VARCHAR(255) NOT NULL,
|
||||
description TEXT DEFAULT NULL,
|
||||
release_year YEAR DEFAULT NULL,
|
||||
language_id TINYINT UNSIGNED NOT NULL,
|
||||
original_language_id TINYINT UNSIGNED DEFAULT NULL,
|
||||
rental_duration TINYINT UNSIGNED NOT NULL DEFAULT 3,
|
||||
rental_rate DECIMAL(4,2) NOT NULL DEFAULT 4.99,
|
||||
length SMALLINT UNSIGNED DEFAULT NULL,
|
||||
replacement_cost DECIMAL(5,2) NOT NULL DEFAULT 19.99,
|
||||
rating ENUM('G','PG','PG-13','R','NC-17') DEFAULT 'G',
|
||||
special_features SET('Trailers','Commentaries','Deleted Scenes','Behind the Scenes') DEFAULT NULL,
|
||||
last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (film_id),
|
||||
KEY idx_title (title),
|
||||
KEY idx_fk_language_id (language_id),
|
||||
KEY idx_fk_original_language_id (original_language_id),
|
||||
CONSTRAINT fk_film_language FOREIGN KEY (language_id) REFERENCES language (language_id) ON DELETE RESTRICT ON UPDATE CASCADE,
|
||||
CONSTRAINT fk_film_language_original FOREIGN KEY (original_language_id) REFERENCES language (language_id) ON DELETE RESTRICT ON UPDATE CASCADE
|
||||
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
--
|
||||
-- Table structure for table `film_actor`
|
||||
--
|
||||
|
||||
CREATE TABLE film_actor (
|
||||
actor_id SMALLINT UNSIGNED NOT NULL,
|
||||
film_id SMALLINT UNSIGNED NOT NULL,
|
||||
last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (actor_id,film_id),
|
||||
KEY idx_fk_film_id (`film_id`),
|
||||
CONSTRAINT fk_film_actor_actor FOREIGN KEY (actor_id) REFERENCES actor (actor_id) ON DELETE RESTRICT ON UPDATE CASCADE,
|
||||
CONSTRAINT fk_film_actor_film FOREIGN KEY (film_id) REFERENCES film (film_id) ON DELETE RESTRICT ON UPDATE CASCADE
|
||||
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
--
|
||||
-- Table structure for table `film_category`
|
||||
--
|
||||
|
||||
CREATE TABLE film_category (
|
||||
film_id SMALLINT UNSIGNED NOT NULL,
|
||||
category_id TINYINT UNSIGNED NOT NULL,
|
||||
last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (film_id, category_id),
|
||||
CONSTRAINT fk_film_category_film FOREIGN KEY (film_id) REFERENCES film (film_id) ON DELETE RESTRICT ON UPDATE CASCADE,
|
||||
CONSTRAINT fk_film_category_category FOREIGN KEY (category_id) REFERENCES category (category_id) ON DELETE RESTRICT ON UPDATE CASCADE
|
||||
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
--
|
||||
-- Table structure for table `film_text`
|
||||
--
|
||||
|
||||
CREATE TABLE film_text (
|
||||
film_id SMALLINT NOT NULL,
|
||||
title VARCHAR(255) NOT NULL,
|
||||
description TEXT,
|
||||
PRIMARY KEY (film_id),
|
||||
FULLTEXT KEY idx_title_description (title,description)
|
||||
)ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||
|
||||
-- Triggers for loading film_text from film
|
||||
|
||||
DELIMITER ;;
|
||||
CREATE TRIGGER `ins_film` AFTER INSERT ON `film` FOR EACH ROW BEGIN
|
||||
INSERT INTO film_text (film_id, title, description)
|
||||
VALUES (new.film_id, new.title, new.description);
|
||||
END;;
|
||||
|
||||
|
||||
CREATE TRIGGER `upd_film` AFTER UPDATE ON `film` FOR EACH ROW BEGIN
|
||||
IF (old.title != new.title) or (old.description != new.description)
|
||||
THEN
|
||||
UPDATE film_text
|
||||
SET title=new.title,
|
||||
description=new.description,
|
||||
film_id=new.film_id
|
||||
WHERE film_id=old.film_id;
|
||||
END IF;
|
||||
END;;
|
||||
|
||||
|
||||
CREATE TRIGGER `del_film` AFTER DELETE ON `film` FOR EACH ROW BEGIN
|
||||
DELETE FROM film_text WHERE film_id = old.film_id;
|
||||
END;;
|
||||
|
||||
DELIMITER ;
|
||||
|
||||
--
|
||||
-- Table structure for table `language`
|
||||
--
|
||||
|
||||
CREATE TABLE language (
|
||||
language_id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
name CHAR(20) NOT NULL,
|
||||
last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (language_id)
|
||||
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
-- Procedure structure for procedure `rewards_report`
|
||||
|
||||
DELIMITER //
|
||||
|
||||
CREATE PROCEDURE rewards_report (
|
||||
IN min_monthly_purchases TINYINT UNSIGNED
|
||||
, IN min_dollar_amount_purchased DECIMAL(10,2) UNSIGNED
|
||||
, OUT count_rewardees INT
|
||||
)
|
||||
LANGUAGE SQL
|
||||
NOT DETERMINISTIC
|
||||
READS SQL DATA
|
||||
SQL SECURITY DEFINER
|
||||
COMMENT 'Provides a customizable report on best customers'
|
||||
proc: BEGIN
|
||||
|
||||
DECLARE last_month_start DATE;
|
||||
DECLARE last_month_end DATE;
|
||||
|
||||
/* Some sanity checks... */
|
||||
IF min_monthly_purchases = 0 THEN
|
||||
SELECT 'Minimum monthly purchases parameter must be > 0';
|
||||
LEAVE proc;
|
||||
END IF;
|
||||
IF min_dollar_amount_purchased = 0.00 THEN
|
||||
SELECT 'Minimum monthly dollar amount purchased parameter must be > $0.00';
|
||||
LEAVE proc;
|
||||
END IF;
|
||||
END //
|
||||
|
||||
DELIMITER ;
|
||||
|
||||
DELIMITER $$
|
||||
|
||||
CREATE FUNCTION get_customer_balance(p_customer_id INT, p_effective_date DATETIME) RETURNS DECIMAL(5,2)
|
||||
DETERMINISTIC
|
||||
READS SQL DATA
|
||||
BEGIN
|
||||
|
||||
#OK, WE NEED TO CALCULATE THE CURRENT BALANCE GIVEN A CUSTOMER_ID AND A DATE
|
||||
#THAT WE WANT THE BALANCE TO BE EFFECTIVE FOR. THE BALANCE IS:
|
||||
# 1) RENTAL FEES FOR ALL PREVIOUS RENTALS
|
||||
# 2) ONE DOLLAR FOR EVERY DAY THE PREVIOUS RENTALS ARE OVERDUE
|
||||
# 3) IF A FILM IS MORE THAN RENTAL_DURATION * 2 OVERDUE, CHARGE THE REPLACEMENT_COST
|
||||
# 4) SUBTRACT ALL PAYMENTS MADE BEFORE THE DATE SPECIFIED
|
||||
|
||||
DECLARE v_rentfees DECIMAL(5,2); #FEES PAID TO RENT THE VIDEOS INITIALLY
|
||||
DECLARE v_overfees INTEGER; #LATE FEES FOR PRIOR RENTALS
|
||||
DECLARE v_payments DECIMAL(5,2); #SUM OF PAYMENTS MADE PREVIOUSLY
|
||||
|
||||
SELECT IFNULL(SUM(film.rental_rate),0) INTO v_rentfees
|
||||
FROM film, inventory, rental
|
||||
WHERE film.film_id = inventory.film_id
|
||||
AND inventory.inventory_id = rental.inventory_id
|
||||
AND rental.rental_date <= p_effective_date
|
||||
AND rental.customer_id = p_customer_id;
|
||||
|
||||
SELECT IFNULL(SUM(IF((TO_DAYS(rental.return_date) - TO_DAYS(rental.rental_date)) > film.rental_duration,
|
||||
((TO_DAYS(rental.return_date) - TO_DAYS(rental.rental_date)) - film.rental_duration),0)),0) INTO v_overfees
|
||||
FROM rental, inventory, film
|
||||
WHERE film.film_id = inventory.film_id
|
||||
AND inventory.inventory_id = rental.inventory_id
|
||||
AND rental.rental_date <= p_effective_date
|
||||
AND rental.customer_id = p_customer_id;
|
||||
|
||||
|
||||
SELECT IFNULL(SUM(payment.amount),0) INTO v_payments
|
||||
FROM payment
|
||||
|
||||
WHERE payment.payment_date <= p_effective_date
|
||||
AND payment.customer_id = p_customer_id;
|
||||
|
||||
RETURN v_rentfees + v_overfees - v_payments;
|
||||
END $$
|
||||
|
||||
DELIMITER ;
|
||||
|
||||
DELIMITER $$
|
||||
|
||||
CREATE PROCEDURE film_in_stock(IN p_film_id INT, IN p_store_id INT, OUT p_film_count INT)
|
||||
READS SQL DATA
|
||||
BEGIN
|
||||
SELECT inventory_id
|
||||
FROM inventory
|
||||
WHERE film_id = p_film_id
|
||||
AND store_id = p_store_id
|
||||
AND inventory_in_stock(inventory_id);
|
||||
|
||||
SELECT FOUND_ROWS() INTO p_film_count;
|
||||
END $$
|
||||
|
||||
DELIMITER ;
|
||||
|
||||
DELIMITER $$
|
||||
|
||||
CREATE PROCEDURE film_not_in_stock(IN p_film_id INT, IN p_store_id INT, OUT p_film_count INT)
|
||||
READS SQL DATA
|
||||
BEGIN
|
||||
SELECT inventory_id
|
||||
FROM inventory
|
||||
WHERE film_id = p_film_id
|
||||
AND store_id = p_store_id
|
||||
AND NOT inventory_in_stock(inventory_id);
|
||||
|
||||
SELECT FOUND_ROWS() INTO p_film_count;
|
||||
END $$
|
||||
|
||||
DELIMITER ;
|
||||
|
||||
DELIMITER $$
|
||||
|
||||
CREATE FUNCTION inventory_held_by_customer(p_inventory_id INT) RETURNS INT
|
||||
READS SQL DATA
|
||||
BEGIN
|
||||
DECLARE v_customer_id INT;
|
||||
DECLARE EXIT HANDLER FOR NOT FOUND RETURN NULL;
|
||||
|
||||
SELECT customer_id INTO v_customer_id
|
||||
FROM rental
|
||||
WHERE return_date IS NULL
|
||||
AND inventory_id = p_inventory_id;
|
||||
|
||||
RETURN v_customer_id;
|
||||
END $$
|
||||
|
||||
DELIMITER ;
|
||||
|
||||
DELIMITER $$
|
||||
|
||||
CREATE FUNCTION inventory_in_stock(p_inventory_id INT) RETURNS BOOLEAN
|
||||
READS SQL DATA
|
||||
BEGIN
|
||||
DECLARE v_rentals INT;
|
||||
DECLARE v_out INT;
|
||||
|
||||
#AN ITEM IS IN-STOCK IF THERE ARE EITHER NO ROWS IN THE rental TABLE
|
||||
#FOR THE ITEM OR ALL ROWS HAVE return_date POPULATED
|
||||
|
||||
SELECT COUNT(*) INTO v_rentals
|
||||
FROM rental
|
||||
WHERE inventory_id = p_inventory_id;
|
||||
|
||||
IF v_rentals = 0 THEN
|
||||
RETURN TRUE;
|
||||
END IF;
|
||||
|
||||
SELECT COUNT(rental_id) INTO v_out
|
||||
FROM inventory LEFT JOIN rental USING(inventory_id)
|
||||
WHERE inventory.inventory_id = p_inventory_id
|
||||
AND rental.return_date IS NULL;
|
||||
|
||||
IF v_out > 0 THEN
|
||||
RETURN FALSE;
|
||||
ELSE
|
||||
RETURN TRUE;
|
||||
END IF;
|
||||
END $$
|
||||
|
||||
DELIMITER ;
|
||||
|
||||
SET SQL_MODE=@OLD_SQL_MODE;
|
||||
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
|
||||
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
|
||||
|
||||
|
Reference in New Issue
Block a user