diff options
author | Dan Ungureanu <udan1107@gmail.com> | 2015-08-11 21:17:06 +0300 |
---|---|---|
committer | Dan Ungureanu <udan1107@gmail.com> | 2015-08-11 21:17:06 +0300 |
commit | c496216ded89fe56faddb621298db07be5e038d1 (patch) | |
tree | 1ee0a4967a29fa4c575c2cbe9e4bc558f3317d28 /tests/Utils/BufferedQueryTest.php | |
parent | 95d7fa76579e2d0bf3c9b449f1a4ca28ee822f30 (diff) | |
download | sql-parser-c496216ded89fe56faddb621298db07be5e038d1.zip sql-parser-c496216ded89fe56faddb621298db07be5e038d1.tar.gz sql-parser-c496216ded89fe56faddb621298db07be5e038d1.tar.bz2 |
Added tests for BufferedQuery and Parser.
Diffstat (limited to 'tests/Utils/BufferedQueryTest.php')
-rw-r--r-- | tests/Utils/BufferedQueryTest.php | 257 |
1 files changed, 257 insertions, 0 deletions
diff --git a/tests/Utils/BufferedQueryTest.php b/tests/Utils/BufferedQueryTest.php new file mode 100644 index 0000000..fe2b0c8 --- /dev/null +++ b/tests/Utils/BufferedQueryTest.php @@ -0,0 +1,257 @@ +<?php + +namespace SqlParser\Tests\Utils; + +use SqlParser\Utils\BufferedQuery; + +use SqlParser\Tests\TestCase; + +class BufferedQueryTest extends TestCase +{ + + /** + * @dataProvider testExtractProvider + */ + public function testExtract( + $query, $chunkSize, array $options = array(), array $expected + ) { + $chunks = str_split($query, $chunkSize); + $count = count($chunks); + + /** + * The array of extracted statements. + * @var array $statements + */ + $statements = array(); + + /** + * The `BufferedQuery` instance used for extraction. + * @var BufferedQuery $bq + */ + $bq = new BufferedQuery('', $options); + + // Feeding chunks and extracting queries. + $i = 0; + while ($i < $count) { + if (($stmt = $bq->extract())) { + $statements[] = $stmt; + } else { + $bq->query .= $chunks[$i++]; + } + } + + // Feeding ended, extracting remaining queries. + while (($stmt = $bq->extract(true))) { + $statements[] = $stmt; + } + + $this->assertEquals($expected, $statements); + } + + public function testExtractProvider() + { + $query = + '/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;' . "\n" . + '/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;' . "\n" . + '/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;' . "\n" . + '/*!40101 SET NAMES utf8mb4 */;' . "\n" . + '' . "\n" . + 'SET SQL_MODE = \'NO_AUTO_VALUE_ON_ZERO\';' . "\n" . + 'SET time_zone = "+00:00";' . "\n" . + '' . "\n" . + '/* a comment */ DELIMITER $$' . "\n" . + '' . "\n" . + '# Bash-like comment sytanx.' . "\n" . + 'CREATE DEFINER=`root`@`localhost` PROCEDURE `film_in_stock` (IN `p_film_id` INT, IN `p_store_id` INT, OUT `p_film_count` INT) READS SQL DATA' . "\n" . + 'BEGIN' . "\n" . + ' SELECT inventory_id' . "\n" . + ' FROM inventory' . "\n" . + ' WHERE film_id = p_film_id' . "\n" . + ' AND store_id = p_store_id' . "\n" . + ' AND inventory_in_stock(inventory_id);' . "\n" . + '' . "\n" . + ' SELECT FOUND_ROWS() INTO p_film_count;' . "\n" . + 'END$$' . "\n" . + '' . "\n" . + 'DELIMITER ;' . "\n" . + '' . "\n" . + '-- --------------------------------------------------------' . "\n" . + '' . "\n" . + '--' . "\n" . + '-- Table structure for `actor`' . "\n" . + '--' . "\n" . + '' . "\n" . + '/* C-like comment syntax. */' . "\n" . + 'CREATE TABLE IF NOT EXISTS `actor` (' . "\n" . + '`actor_id` SMALLINT(5) UNSIGNED NOT NULL,' . "\n" . + '`first_name` VARCHAR(45) NOT NULL,' . "\n" . + '`last_name` VARCHAR(45) NOT NULL,' . "\n" . + '`last_update` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP' . "\n" . + ') ENGINE=InnoDB DEFAULT CHARSET=utf8;' . "\n" . + '' . "\n" . + '/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;' . "\n" . + '/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;' . "\n" . + '/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */'; + + return array( + + array( + 'DELIMITER A_VERY_LONG_DEL' . "\n" . + 'SELECT 1 A_VERY_LONG_DEL' . "\n" . + 'DELIMITER ;', + 3, + array( + 'parse_delimiter' => true, + 'add_delimiter' => true, + ), + array( + 'DELIMITER A_VERY_LONG_DEL', + 'SELECT 1 A_VERY_LONG_DEL', + 'DELIMITER ;' + ) + ), + + array( + $query, + 32, + array( + 'parse_delimiter' => false, + 'add_delimiter' => false, + ), + array( + '/*!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 */', + + 'SET SQL_MODE = \'NO_AUTO_VALUE_ON_ZERO\'', + + 'SET time_zone = "+00:00"', + + 'CREATE DEFINER=`root`@`localhost` PROCEDURE `film_in_stock` (IN `p_film_id` INT, IN `p_store_id` INT, OUT `p_film_count` INT) READS SQL DATA' . "\n" . + 'BEGIN' . "\n" . + ' SELECT inventory_id' . "\n" . + ' FROM inventory' . "\n" . + ' WHERE film_id = p_film_id' . "\n" . + ' AND store_id = p_store_id' . "\n" . + ' AND inventory_in_stock(inventory_id);' . "\n" . + '' . "\n" . + ' SELECT FOUND_ROWS() INTO p_film_count;' . "\n" . + 'END', + + 'CREATE TABLE IF NOT EXISTS `actor` (' . "\n" . + '`actor_id` SMALLINT(5) UNSIGNED NOT NULL,' . "\n" . + '`first_name` VARCHAR(45) NOT NULL,' . "\n" . + '`last_name` VARCHAR(45) NOT NULL,' . "\n" . + '`last_update` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP' . "\n" . + ') ENGINE=InnoDB DEFAULT CHARSET=utf8', + + '/*!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 */' + ) + ), + + array( + $query, + 32, + array( + 'parse_delimiter' => true, + 'add_delimiter' => false, + ), + array( + '/*!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 */', + + 'SET SQL_MODE = \'NO_AUTO_VALUE_ON_ZERO\'', + + 'SET time_zone = "+00:00"', + + 'DELIMITER $$', + + 'CREATE DEFINER=`root`@`localhost` PROCEDURE `film_in_stock` (IN `p_film_id` INT, IN `p_store_id` INT, OUT `p_film_count` INT) READS SQL DATA' . "\n" . + 'BEGIN' . "\n" . + ' SELECT inventory_id' . "\n" . + ' FROM inventory' . "\n" . + ' WHERE film_id = p_film_id' . "\n" . + ' AND store_id = p_store_id' . "\n" . + ' AND inventory_in_stock(inventory_id);' . "\n" . + '' . "\n" . + ' SELECT FOUND_ROWS() INTO p_film_count;' . "\n" . + 'END', + + 'DELIMITER ;', + + 'CREATE TABLE IF NOT EXISTS `actor` (' . "\n" . + '`actor_id` SMALLINT(5) UNSIGNED NOT NULL,' . "\n" . + '`first_name` VARCHAR(45) NOT NULL,' . "\n" . + '`last_name` VARCHAR(45) NOT NULL,' . "\n" . + '`last_update` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP' . "\n" . + ') ENGINE=InnoDB DEFAULT CHARSET=utf8', + + '/*!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 */', + ) + ), + + array( + $query, + 64, + array( + 'parse_delimiter' => false, + 'add_delimiter' => true, + ), + array( + '/*!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 */;', + + 'SET SQL_MODE = \'NO_AUTO_VALUE_ON_ZERO\';', + + 'SET time_zone = "+00:00";', + + 'CREATE DEFINER=`root`@`localhost` PROCEDURE `film_in_stock` (IN `p_film_id` INT, IN `p_store_id` INT, OUT `p_film_count` INT) READS SQL DATA' . "\n" . + 'BEGIN' . "\n" . + ' SELECT inventory_id' . "\n" . + ' FROM inventory' . "\n" . + ' WHERE film_id = p_film_id' . "\n" . + ' AND store_id = p_store_id' . "\n" . + ' AND inventory_in_stock(inventory_id);' . "\n" . + '' . "\n" . + ' SELECT FOUND_ROWS() INTO p_film_count;' . "\n" . + 'END$$', + + 'CREATE TABLE IF NOT EXISTS `actor` (' . "\n" . + '`actor_id` SMALLINT(5) UNSIGNED NOT NULL,' . "\n" . + '`first_name` VARCHAR(45) NOT NULL,' . "\n" . + '`last_name` VARCHAR(45) NOT NULL,' . "\n" . + '`last_update` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP' . "\n" . + ') ENGINE=InnoDB DEFAULT CHARSET=utf8;', + + '/*!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 */' + ) + ) + ); + } +} |