Files
EasySoft-ZenTaoPMS/lib/sqlparser/vendor/phpmyadmin/sql-parser/tests/Utils/BufferedQueryTest.php
T

348 lines
13 KiB
PHP

<?php
namespace PhpMyAdmin\SqlParser\Tests\Utils;
use PhpMyAdmin\SqlParser\Tests\TestCase;
use PhpMyAdmin\SqlParser\Utils\BufferedQuery;
class BufferedQueryTest extends TestCase
{
/**
* @dataProvider extractProvider
*
* @param mixed $query
* @param mixed $chunkSize
*/
public function testExtract(
$query,
$chunkSize,
array $options,
array $expected
) {
$chunks = str_split($query, $chunkSize);
$count = count($chunks);
/**
* The array of extracted statements.
*
* @var array
*/
$statements = array();
/**
* The `BufferedQuery` instance used for extraction.
*
* @var BufferedQuery
*/
$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 extractProvider()
{
$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(
"SELECT '\'';\nSELECT '\'';",
8,
array(
'parse_delimiter' => true,
'add_delimiter' => true,
),
array(
"SELECT '\'';",
"SELECT '\'';",
),
),
array(
"SELECT \\",
8,
array(
'parse_delimiter' => false,
'add_delimiter' => false,
),
array(
"SELECT \\",
),
),
array(
"CREATE TABLE `test` (\n" .
" `txt` varchar(10)\n" .
");\n" .
"INSERT INTO `test` (`txt`) VALUES('abc');\n" .
"INSERT INTO `test` (`txt`) VALUES('\\\\');\n" .
"INSERT INTO `test` (`txt`) VALUES('xyz');\n",
8,
array(
'parse_delimiter' => true,
'add_delimiter' => true,
),
array(
"CREATE TABLE `test` (\n" .
" `txt` varchar(10)\n" .
');',
"INSERT INTO `test` (`txt`) VALUES('abc');",
"INSERT INTO `test` (`txt`) VALUES('\\\\');",
"INSERT INTO `test` (`txt`) VALUES('xyz');",
),
),
array(
'SELECT """""""";' .
'SELECT """\\\\"""',
8,
array(
'parse_delimiter' => true,
'add_delimiter' => true,
),
array(
'SELECT """""""";',
'SELECT """\\\\"""',
),
),
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"',
'# 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" .
'--' . "\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',
'/*!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"',
'/* a comment */ DELIMITER $$',
'# 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',
'DELIMITER ;',
'-- --------------------------------------------------------' . "\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',
'/*!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";',
'# 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" .
'--' . "\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;',
'/*!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 */',
),
)
);
}
}