resolved conflicts

This commit is contained in:
2025-03-31 03:46:05 +03:00
6454 changed files with 1520539 additions and 9 deletions
@@ -0,0 +1,114 @@
<?php
declare(strict_types=1);
namespace PhpMyAdmin\SqlParser\Tests\Parser;
use PhpMyAdmin\SqlParser\Tests\TestCase;
class AlterStatementTest extends TestCase
{
/**
* @dataProvider alterProvider
*/
public function testAlter(string $test): void
{
$this->runParserTest($test);
}
/**
* @return string[][]
*/
public static function alterProvider(): array
{
return [
['parser/parseAlter'],
['parser/parseAlter2'],
['parser/parseAlter3'],
['parser/parseAlter4'],
['parser/parseAlter5'],
['parser/parseAlter6'],
['parser/parseAlter7'],
['parser/parseAlter8'],
['parser/parseAlter9'],
['parser/parseAlter10'],
['parser/parseAlter11'],
['parser/parseAlter12'],
['parser/parseAlter13'],
['parser/parseAlter14'],
['parser/parseAlterErr'],
['parser/parseAlterErr2'],
['parser/parseAlterErr3'],
['parser/parseAlterErr4'],
['parser/parseAlterTableRenameIndex1'],
['parser/parseAlterTableRenameIndex2'],
['parser/parseAlterTableRenameKey1'],
['parser/parseAlterTableRenameKey2'],
['parser/parseAlterTablePartitionByRange1'],
['parser/parseAlterTablePartitionByRange2'],
['parser/parseAlterTableCoalescePartition'],
['parser/parseAlterTableAddColumnWithCheck'],
['parser/parseAlterTableAddSpatialIndex1'],
['parser/parseAlterTableDropAddIndex1'],
['parser/parseAlterTableDropColumn1'],
['parser/parseAlterTableModifyColumn'],
['parser/parseAlterTableModifyColumnEnum1'],
['parser/parseAlterTableModifyColumnEnum2'],
['parser/parseAlterTableModifyColumnEnum3'],
['parser/parseAlterWithInvisible'],
['parser/parseAlterTableCharacterSet1'],
['parser/parseAlterTableCharacterSet2'],
['parser/parseAlterTableCharacterSet3'],
['parser/parseAlterTableCharacterSet4'],
['parser/parseAlterTableCharacterSet5'],
['parser/parseAlterTableCharacterSet6'],
['parser/parseAlterTableCharacterSet7'],
['parser/parseAlterUser'],
['parser/parseAlterUser1'],
['parser/parseAlterUser2'],
['parser/parseAlterUser3'],
['parser/parseAlterUser4'],
['parser/parseAlterUser5'],
['parser/parseAlterUser6'],
['parser/parseAlterUser7'],
['parser/parseAlterUser8'],
['parser/parseAlterUser9'],
['parser/parseAlterUser10'],
['parser/parseAlterEvent'],
['parser/parseAlterEvent2'],
['parser/parseAlterEvent3'],
['parser/parseAlterEvent4'],
['parser/parseAlterEvent5'],
['parser/parseAlterEvent6'],
['parser/parseAlterEvent7'],
['parser/parseAlterEvent8'],
['parser/parseAlterEvent9'],
['parser/parseAlterEventComplete'],
['parser/parseAlterEventErr'],
['parser/parseAlterEventOnScheduleAt'],
['parser/parseAlterEventOnScheduleAt2'],
['parser/parseAlterEventOnScheduleEvery'],
['parser/parseAlterEventOnScheduleEvery2'],
['parser/parseAlterEventOnScheduleEvery3'],
['parser/parseAlterEventOnScheduleEvery4'],
['parser/parseAlterEventOnScheduleEvery5'],
['parser/parseAlterEventOnScheduleEvery6'],
['parser/parseAlterEventWithDefiner'],
['parser/parseAlterEventWithOtherDefiners'],
['parser/parseAlterRenameColumn'],
['parser/parseAlterRenameColumns'],
['parser/parseAlterFunction1'],
['parser/parseAlterFunction2'],
['parser/parseAlterFunction3'],
['parser/parseAlterFunction4'],
['parser/parseAlterFunction5'],
['parser/parseAlterFunction6'],
['parser/parseAlterProcedure1'],
['parser/parseAlterProcedure2'],
['parser/parseAlterProcedure3'],
['parser/parseAlterProcedure4'],
['parser/parseAlterProcedure5'],
['parser/parseAlterProcedure6'],
];
}
}
@@ -0,0 +1,31 @@
<?php
declare(strict_types=1);
namespace PhpMyAdmin\SqlParser\Tests\Parser;
use PhpMyAdmin\SqlParser\Tests\TestCase;
class AnalyzeStatementTest extends TestCase
{
/**
* @dataProvider analyzeProvider
*/
public function testAnalyze(string $test): void
{
$this->runParserTest($test);
}
/**
* @return string[][]
*/
public static function analyzeProvider(): array
{
return [
['parser/parseAnalyzeTable'],
['parser/parseAnalyzeTable1'],
['parser/parseAnalyzeErr1'],
['parser/parseAnalyzeErr2'],
];
}
}
@@ -0,0 +1,32 @@
<?php
declare(strict_types=1);
namespace PhpMyAdmin\SqlParser\Tests\Parser;
use PhpMyAdmin\SqlParser\Tests\TestCase;
class CallStatementTest extends TestCase
{
/**
* @dataProvider callProvider
*/
public function testCall(string $test): void
{
$this->runParserTest($test);
}
/**
* @return string[][]
*/
public static function callProvider(): array
{
return [
['parser/parseCall'],
['parser/parseCall2'],
['parser/parseCall3'],
['parser/parseCall4'],
['parser/parseCall5'],
];
}
}
@@ -0,0 +1,88 @@
<?php
declare(strict_types=1);
namespace PhpMyAdmin\SqlParser\Tests\Parser;
use PhpMyAdmin\SqlParser\Tests\TestCase;
class CreateStatementTest extends TestCase
{
/**
* @dataProvider createProvider
*/
public function testCreate(string $test): void
{
$this->runParserTest($test);
}
/**
* @return string[][]
*/
public static function createProvider(): array
{
return [
['parser/parseCreateDatabase'],
['parser/parseCreateDatabaseErr'],
['parser/parseCreateFunction'],
['parser/parseCreateFunctionErr1'],
['parser/parseCreateFunctionErr2'],
['parser/parseCreateFunctionErr3'],
['parser/parseCreateProcedure'],
['parser/parseCreateProcedure1'],
['parser/parseCreateProcedure2'],
['parser/parseCreateProcedure3'],
['parser/parseCreateProcedure4'],
['parser/parseCreateSchema'],
['parser/parseCreateSchemaErr'],
['parser/parseCreateTable'],
['parser/parseCreateTable2'],
['parser/parseCreateTable3'],
['parser/parseCreateTable4'],
['parser/parseCreateTable5'],
['parser/parseCreateTable6'],
['parser/parseCreateTable7'],
['parser/parseCreateTable8'],
['parser/parseCreateTable9'],
['parser/parseCreateTable10'],
['parser/parseCreateTable11'],
['parser/parseCreateTable12'],
['parser/parseCreateTable13'],
['parser/parseCreateTable14'],
['parser/parseCreateTable15'],
['parser/parseCreateTable16'],
['parser/parseCreateTable17'],
['parser/parseCreateTable18'],
['parser/parseCreateTableErr1'],
['parser/parseCreateTableErr2'],
['parser/parseCreateTableErr3'],
['parser/parseCreateTableErr4'],
['parser/parseCreateTableErr5'],
['parser/parseCreateTableSelect'],
['parser/parseCreateTableAsSelect'],
['parser/parseCreateTableLike'],
['parser/parseCreateTableSpatial'],
['parser/parseCreateTableSRID'],
['parser/parseCreateTableTimestampWithPrecision'],
['parser/parseCreateTableEnforcedCheck'],
['parser/parseCreateTableNotEnforcedCheck'],
['parser/parseCreateTableWithInvisibleKey'],
['parser/parseCreateTableWithParser'],
['parser/parseCreateTrigger'],
['parser/parseCreateUser1'],
['parser/parseCreateUser2'],
['parser/parseCreateView'],
['parser/parseCreateView2'],
['parser/parseCreateView3'],
['parser/parseCreateView4'],
['parser/parseCreateView5'],
['parser/parseCreateViewMultiple'],
['parser/parseCreateViewWithoutQuotes'],
['parser/parseCreateViewWithQuotes'],
['parser/parseCreateViewWithWrongSyntax'],
['parser/parseCreateViewWithUnion'],
['parser/parseCreateViewAsWithAs'],
['parser/parseCreateOrReplaceView1'],
];
}
}
@@ -0,0 +1,52 @@
<?php
declare(strict_types=1);
namespace PhpMyAdmin\SqlParser\Tests\Parser;
use PhpMyAdmin\SqlParser\Tests\TestCase;
class DeleteStatementTest extends TestCase
{
/**
* @dataProvider deleteProvider
*/
public function testDelete(string $test): void
{
$this->runParserTest($test);
}
/**
* @return string[][]
*/
public static function deleteProvider(): array
{
return [
['parser/parseDelete'],
['parser/parseDelete2'],
['parser/parseDelete3'],
['parser/parseDelete4'],
['parser/parseDelete5'],
['parser/parseDelete6'],
['parser/parseDelete7'],
['parser/parseDelete8'],
['parser/parseDelete9'],
['parser/parseDelete10'],
['parser/parseDelete11'],
['parser/parseDelete12'],
['parser/parseDeleteErr1'],
['parser/parseDeleteErr2'],
['parser/parseDeleteErr3'],
['parser/parseDeleteErr4'],
['parser/parseDeleteErr5'],
['parser/parseDeleteErr6'],
['parser/parseDeleteErr7'],
['parser/parseDeleteErr8'],
['parser/parseDeleteErr9'],
['parser/parseDeleteErr10'],
['parser/parseDeleteErr11'],
['parser/parseDeleteErr12'],
['parser/parseDeleteJoin'],
];
}
}
@@ -0,0 +1,29 @@
<?php
declare(strict_types=1);
namespace PhpMyAdmin\SqlParser\Tests\Parser;
use PhpMyAdmin\SqlParser\Tests\TestCase;
class DropStatementTest extends TestCase
{
/**
* @dataProvider dropProvider
*/
public function testDrop(string $test): void
{
$this->runParserTest($test);
}
/**
* @return string[][]
*/
public static function dropProvider(): array
{
return [
['parser/parseDrop'],
['parser/parseDrop2'],
];
}
}
@@ -0,0 +1,46 @@
<?php
declare(strict_types=1);
namespace PhpMyAdmin\SqlParser\Tests\Parser;
use PhpMyAdmin\SqlParser\Tests\TestCase;
class ExplainStatementTest extends TestCase
{
/**
* @dataProvider explainProvider
*/
public function testExplain(string $test): void
{
$this->runParserTest($test);
}
/**
* @return string[][]
*/
public static function explainProvider(): array
{
return [
['parser/parseExplain'],
['parser/parseExplain1'],
['parser/parseExplain2'],
['parser/parseExplain3'],
['parser/parseExplain4'],
['parser/parseExplain5'],
['parser/parseExplain6'],
['parser/parseExplain7'],
['parser/parseExplain8'],
['parser/parseExplain9'],
['parser/parseExplain10'],
['parser/parseExplain11'],
['parser/parseExplain12'],
['parser/parseExplain13'],
['parser/parseExplain14'],
['parser/parseExplainErr'],
['parser/parseExplainErr1'],
['parser/parseExplainErr2'],
['parser/parseExplainErr3'],
];
}
}
@@ -0,0 +1,37 @@
<?php
declare(strict_types=1);
namespace PhpMyAdmin\SqlParser\Tests\Parser;
use PhpMyAdmin\SqlParser\Tests\TestCase;
class InsertStatementTest extends TestCase
{
/**
* @dataProvider insertProvider
*/
public function testInsert(string $test): void
{
$this->runParserTest($test);
}
/**
* @return string[][]
*/
public static function insertProvider(): array
{
return [
['parser/parseInsert'],
['parser/parseInsertFunction'],
['parser/parseInsertSelect'],
['parser/parseInsertOnDuplicateKey'],
['parser/parseInsertSetOnDuplicateKey'],
['parser/parseInsertSelectOnDuplicateKey'],
['parser/parseInsertOnDuplicateKeyErr'],
['parser/parseInsertErr'],
['parser/parseInsertErr2'],
['parser/parseInsertIntoErr'],
];
}
}
@@ -0,0 +1,69 @@
<?php
declare(strict_types=1);
namespace PhpMyAdmin\SqlParser\Tests\Parser;
use PhpMyAdmin\SqlParser\Parser;
use PhpMyAdmin\SqlParser\Statements\KillStatement;
use PhpMyAdmin\SqlParser\Tests\TestCase;
class KillStatementTest extends TestCase
{
/** @dataProvider killProvider */
public function testKill(string $test): void
{
$this->runParserTest($test);
}
/**
* @return string[][]
*/
public static function killProvider(): array
{
return [
['parser/parseKill'],
['parser/parseKill2'],
['parser/parseKill3'],
['parser/parseKillConnection'],
['parser/parseKillQuery'],
['parser/parseKillErr1'],
['parser/parseKillErr2'],
['parser/parseKillErr3'],
['parser/parseKillErr4'],
];
}
/** @dataProvider buildKillProvider */
public function testBuildKill(string $sql): void
{
$parser = new Parser($sql);
$this->assertCount(1, $parser->statements);
$statement = $parser->statements[0];
$this->assertInstanceOf(KillStatement::class, $statement);
$builtSql = $statement->build();
$this->assertEquals($sql, $builtSql);
}
/**
* @return array<int, array<int, string>>
* @psalm-return list<list<string>>
*/
public static function buildKillProvider(): array
{
return [
['KILL (SELECT 3 + 4)'],
['KILL QUERY 4'],
['KILL CONNECTION 5'],
['KILL 6'],
['KILL QUERY (SELECT 7)'],
['KILL SOFT QUERY (SELECT 8)'],
['KILL HARD 9'],
['KILL USER 10'],
['KILL SOFT (SELECT 1)'],
['KILL (2)'],
['KILL QUERY ID (2)'],
['KILL QUERY ID (SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST LIMIT 0, 1)'],
];
}
}
@@ -0,0 +1,50 @@
<?php
declare(strict_types=1);
namespace PhpMyAdmin\SqlParser\Tests\Parser;
use PhpMyAdmin\SqlParser\Parser;
use PhpMyAdmin\SqlParser\Tests\TestCase;
class LoadStatementTest extends TestCase
{
public function testLoadOptions(): void
{
$data = $this->getData('parser/parseLoad1');
$parser = new Parser($data['query']);
$stmt = $parser->statements[0];
$this->assertEquals(10, $stmt->options->has('CONCURRENT'));
}
/**
* @dataProvider loadProvider
*/
public function testLoad(string $test): void
{
$this->runParserTest($test);
}
/**
* @return string[][]
*/
public static function loadProvider(): array
{
return [
['parser/parseLoad1'],
['parser/parseLoad2'],
['parser/parseLoad3'],
['parser/parseLoad4'],
['parser/parseLoad5'],
['parser/parseLoad6'],
['parser/parseLoad7'],
['parser/parseLoad8'],
['parser/parseLoadErr1'],
['parser/parseLoadErr2'],
['parser/parseLoadErr3'],
['parser/parseLoadErr4'],
['parser/parseLoadErr5'],
['parser/parseLoadErr6'],
];
}
}
@@ -0,0 +1,44 @@
<?php
declare(strict_types=1);
namespace PhpMyAdmin\SqlParser\Tests\Parser;
use PhpMyAdmin\SqlParser\Tests\TestCase;
class LockStatementTest extends TestCase
{
/**
* @dataProvider lockProvider
*/
public function testLock(string $test): void
{
$this->runParserTest($test);
}
/**
* @return string[][]
*/
public static function lockProvider(): array
{
return [
['parser/parseLock1'],
['parser/parseLock2'],
['parser/parseLock3'],
['parser/parseLock4'],
['parser/parseLock5'],
['parser/parseLockErr1'],
['parser/parseLockErr2'],
['parser/parseLockErr3'],
['parser/parseLockErr4'],
['parser/parseLockErr5'],
['parser/parseLockErr6'],
['parser/parseLockErr7'],
['parser/parseLockErr8'],
['parser/parseLockErr9'],
['parser/parseLockErr10'],
['parser/parseUnlock1'],
['parser/parseUnlockErr1'],
];
}
}
@@ -0,0 +1,120 @@
<?php
declare(strict_types=1);
namespace PhpMyAdmin\SqlParser\Tests\Parser;
use PhpMyAdmin\SqlParser\Parser;
use PhpMyAdmin\SqlParser\Statements\SetStatement;
use PhpMyAdmin\SqlParser\Statements\TransactionStatement;
use PhpMyAdmin\SqlParser\Tests\TestCase;
class ParserLongExportsTest extends TestCase
{
public function testMysqldump(): void
{
$sql = <<<SQL
-- MySQL dump 10.13 Distrib 5.7.24, for Linux (x86_64)ldump e-nocleg-2-dev 01-te
--
-- Host: localhost Database: x
-- ------------------------------------------------------
-- Server version 5.7.24
/*!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 utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
SQL;
$expectedSql = [
'SET @OLD_CHARACTER_SET_CLIENT = @@CHARACTER_SET_CLIENT',
'SET @OLD_CHARACTER_SET_RESULTS = @@CHARACTER_SET_RESULTS',
'SET @OLD_COLLATION_CONNECTION = @@COLLATION_CONNECTION',
'SET NAMES utf8',
'SET @OLD_TIME_ZONE = @@TIME_ZONE',
"SET TIME_ZONE = '+00:00'",
'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 = 'NO_AUTO_VALUE_ON_ZERO'",
'SET @OLD_SQL_NOTES = @@SQL_NOTES, SQL_NOTES = 0',
];
$parser = new Parser($sql, true);
$parser->parse();
$sql = [];
foreach ($parser->statements as $stmt) {
$sql[] = $stmt->__toString();
}
$this->assertEquals($expectedSql, $sql);
}
public function testParsephpMyAdminDump(): void
{
$data = $this->getData('parser/parsephpMyAdminExport1');
$parser = new Parser($data['query']);
$collectedSetStatements = [];
foreach ($parser->statements as $statement) {
if ($statement instanceof TransactionStatement) {
foreach ($statement->statements as $transactionStatement) {
if (! $transactionStatement instanceof SetStatement) {
continue;
}
$collectedSetStatements[] = $transactionStatement->build();
}
continue;
}
if (! $statement instanceof SetStatement) {
continue;
}
$collectedSetStatements[] = $statement->build();
}
$this->assertEquals([
'SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"',
'SET AUTOCOMMIT = 0',
'SET time_zone = "+00:00"',
'SET @OLD_CHARACTER_SET_CLIENT = @@CHARACTER_SET_CLIENT',
'SET @OLD_CHARACTER_SET_RESULTS = @@CHARACTER_SET_RESULTS',
'SET @OLD_COLLATION_CONNECTION = @@COLLATION_CONNECTION',
'SET NAMES utf8mb4',
'SET CHARACTER_SET_CLIENT = @OLD_CHARACTER_SET_CLIENT',
'SET CHARACTER_SET_RESULTS = @OLD_CHARACTER_SET_RESULTS',
'SET COLLATION_CONNECTION = @OLD_COLLATION_CONNECTION',
], $collectedSetStatements);
foreach ($parser->statements as $stmt) {
// Check they all build
$this->assertIsString($stmt->build());
}
}
/**
* @dataProvider exportFileProvider
*/
public function testParseExport(string $test): void
{
$this->runParserTest($test);
}
/**
* @return string[][]
*/
public static function exportFileProvider(): array
{
return [
['parser/parsephpMyAdminExport1'],
];
}
}
@@ -0,0 +1,85 @@
<?php
declare(strict_types=1);
namespace PhpMyAdmin\SqlParser\Tests\Parser;
use PhpMyAdmin\SqlParser\Exceptions\ParserException;
use PhpMyAdmin\SqlParser\Parser;
use PhpMyAdmin\SqlParser\Tests\TestCase;
use PhpMyAdmin\SqlParser\Token;
use PhpMyAdmin\SqlParser\TokensList;
use function sprintf;
class ParserTest extends TestCase
{
/**
* @dataProvider parseProvider
*/
public function testParse(string $test): void
{
$this->runParserTest($test);
}
/**
* @return string[][]
*/
public static function parseProvider(): array
{
return [
['parser/parse'],
['parser/parse2'],
['parser/parseDelimiter'],
];
}
public function testUnrecognizedStatement(): void
{
$parser = new Parser('SELECT 1; FROM');
$this->assertEquals(
'Unrecognized statement type.',
$parser->errors[0]->getMessage()
);
}
public function testUnrecognizedKeyword(): void
{
$parser = new Parser('SELECT 1 FROM foo PARTITION(bar, baz) AS');
$this->assertEquals(
'Unrecognized keyword.',
$parser->errors[0]->getMessage()
);
}
/**
* @runInSeparateProcess
* @preserveGlobalState disabled
*/
public function testError(): void
{
$parser = new Parser(new TokensList());
$parser->error('error #1', new Token('foo'), 1);
$parser->error(sprintf('%2$s #%1$d', 2, 'error'), new Token('bar'), 2);
$this->assertEquals(
$parser->errors,
[
new ParserException('error #1', new Token('foo'), 1),
new ParserException('error #2', new Token('bar'), 2),
]
);
}
public function testErrorStrict(): void
{
$this->expectExceptionCode(3);
$this->expectExceptionMessage('strict error');
$this->expectException(ParserException::class);
$parser = new Parser(new TokensList());
$parser->strict = true;
$parser->error('strict error', new Token('foo'), 3);
}
}
@@ -0,0 +1,34 @@
<?php
declare(strict_types=1);
namespace PhpMyAdmin\SqlParser\Tests\Parser;
use PhpMyAdmin\SqlParser\Tests\TestCase;
class PurgeStatementTest extends TestCase
{
/**
* @dataProvider purgeProvider
*/
public function testPurge(string $test): void
{
$this->runParserTest($test);
}
/**
* @return string[][]
*/
public static function purgeProvider(): array
{
return [
['parser/parsePurge'],
['parser/parsePurge2'],
['parser/parsePurge3'],
['parser/parsePurge4'],
['parser/parsePurgeErr'],
['parser/parsePurgeErr2'],
['parser/parsePurgeErr3'],
];
}
}
@@ -0,0 +1,34 @@
<?php
declare(strict_types=1);
namespace PhpMyAdmin\SqlParser\Tests\Parser;
use PhpMyAdmin\SqlParser\Tests\TestCase;
class RenameStatementTest extends TestCase
{
/**
* @dataProvider renameProvider
*/
public function testRename(string $test): void
{
$this->runParserTest($test);
}
/**
* @return string[][]
*/
public static function renameProvider(): array
{
return [
['parser/parseRename'],
['parser/parseRename2'],
['parser/parseRenameErr1'],
['parser/parseRenameErr2'],
['parser/parseRenameErr3'],
['parser/parseRenameErr4'],
['parser/parseRenameErr5'],
];
}
}
@@ -0,0 +1,36 @@
<?php
declare(strict_types=1);
namespace PhpMyAdmin\SqlParser\Tests\Parser;
use PhpMyAdmin\SqlParser\Tests\TestCase;
class ReplaceStatementTest extends TestCase
{
/**
* @dataProvider replaceProvider
*/
public function testReplace(string $test): void
{
$this->runParserTest($test);
}
/**
* @return string[][]
*/
public static function replaceProvider(): array
{
return [
['parser/parseReplace'],
['parser/parseReplace2'],
['parser/parseReplaceValues'],
['parser/parseReplaceSet'],
['parser/parseReplaceSelect'],
['parser/parseReplaceErr'],
['parser/parseReplaceErr2'],
['parser/parseReplaceErr3'],
['parser/parseReplaceIntoErr'],
];
}
}
@@ -0,0 +1,28 @@
<?php
declare(strict_types=1);
namespace PhpMyAdmin\SqlParser\Tests\Parser;
use PhpMyAdmin\SqlParser\Tests\TestCase;
class RestoreStatementTest extends TestCase
{
/**
* @dataProvider restoreProvider
*/
public function testRestore(string $test): void
{
$this->runParserTest($test);
}
/**
* @return string[][]
*/
public static function restoreProvider(): array
{
return [
['parser/parseRestore'],
];
}
}
@@ -0,0 +1,110 @@
<?php
declare(strict_types=1);
namespace PhpMyAdmin\SqlParser\Tests\Parser;
use PhpMyAdmin\SqlParser\Parser;
use PhpMyAdmin\SqlParser\Tests\TestCase;
class SelectStatementTest extends TestCase
{
public function testSelectOptions(): void
{
$data = $this->getData('parser/parseSelect');
$parser = new Parser($data['query']);
$stmt = $parser->statements[0];
$this->assertEquals(10, $stmt->options->has('MAX_STATEMENT_TIME'));
}
/**
* @dataProvider selectProvider
*/
public function testSelect(string $test): void
{
$this->runParserTest($test);
}
/**
* @return string[][]
*/
public static function selectProvider(): array
{
return [
['parser/parseSelect2'],
['parser/parseSelect3'],
['parser/parseSelect4'],
['parser/parseSelect5'],
['parser/parseSelect6'],
['parser/parseSelect7'],
['parser/parseSelect8'],
['parser/parseSelect9'],
['parser/parseSelect10'],
['parser/parseSelect11'],
['parser/parseSelect12'],
['parser/parseSelect13'],
['parser/parseSelect14'],
['parser/parseSelect15'],
['parser/parseSelect16'],
['parser/parseSelectAggregateWithPartitionAndAlias'],
['parser/parseSelectErr1'],
['parser/parseSelectErr2'],
['parser/parseSelectNested'],
['parser/parseSelectCase1'],
['parser/parseSelectCase2'],
['parser/parseSelectCase3'],
['parser/parseSelectCase4'],
['parser/parseSelectCase5'],
['parser/parseSelectCaseErr1'],
['parser/parseSelectCaseErr2'],
['parser/parseSelectCaseErr3'],
['parser/parseSelectCaseErr4'],
['parser/parseSelectCaseErr5'],
['parser/parseSelectCaseAlias1'],
['parser/parseSelectCaseAlias2'],
['parser/parseSelectCaseAlias3'],
['parser/parseSelectCaseAlias4'],
['parser/parseSelectCaseAlias5'],
['parser/parseSelectCaseAlias6'],
['parser/parseSelectCaseAliasErr1'],
['parser/parseSelectCaseAliasErr2'],
['parser/parseSelectCaseAliasErr3'],
['parser/parseSelectCaseAliasErr4'],
['parser/parseSelectExists'],
['parser/parseSelectIntoOptions1'],
['parser/parseSelectIntoOptions2'],
['parser/parseSelectIntoOptions3'],
['parser/parseSelectJoinCross'],
['parser/parseSelectJoinNatural'],
['parser/parseSelectJoinNaturalLeft'],
['parser/parseSelectJoinNaturalRight'],
['parser/parseSelectJoinNaturalLeftOuter'],
['parser/parseSelectJoinNaturalRightOuter'],
['parser/parseSelectJoinMultiple'],
['parser/parseSelectJoinMultiple2'],
['parser/parseSelectWrongOrder'],
['parser/parseSelectWrongOrder2'],
['parser/parseSelectEndOptions1'],
['parser/parseSelectEndOptions2'],
['parser/parseSelectEndOptionsErr'],
['parser/parseSelectUnion'],
['parser/parseSelectUnion2'],
['parser/parseSelectWhere'],
['parser/parseSelectWhereCollate'],
['parser/parseSelectIndexHint1'],
['parser/parseSelectIndexHint2'],
['parser/parseSelectOrderByIsNull'],
['parser/parseSelectIndexHintErr1'],
['parser/parseSelectIndexHintErr2'],
['parser/parseSelectIndexHintErr3'],
['parser/parseSelectIndexHintErr4'],
['parser/parseSelectWithParenthesis'],
['parser/parseSelectOrderByComment'],
['parser/parseSelectOverAlias_mariadb_100600'],
['parser/parseSelectGroupBy'],
['parser/parseSelectGroupByErr'],
['parser/parseSelectGroupByWithComments'],
['parser/parseTable1'],
];
}
}
@@ -0,0 +1,39 @@
<?php
declare(strict_types=1);
namespace PhpMyAdmin\SqlParser\Tests\Parser;
use PhpMyAdmin\SqlParser\Tests\TestCase;
class SetStatementTest extends TestCase
{
/**
* @dataProvider setProvider
*/
public function testSet(string $test): void
{
$this->runParserTest($test);
}
/**
* @return string[][]
*/
public static function setProvider(): array
{
return [
['parser/parseSetCharset'],
['parser/parseSetCharsetError'],
['parser/parseSetCharacterSet'],
['parser/parseSetCharacterSetError'],
['parser/parseAlterTableSetAutoIncrementError'],
['parser/parseSetNames'],
['parser/parseSetNamesError'],
['parser/parseSetError1'],
['parser/parseInsertIntoSet'],
['parser/parseSetVariable'],
['parser/parseSetVariable2'],
['parser/parseSetGlobalVariable'],
];
}
}
@@ -0,0 +1,47 @@
<?php
declare(strict_types=1);
namespace PhpMyAdmin\SqlParser\Tests\Parser;
use PhpMyAdmin\SqlParser\Parser;
use PhpMyAdmin\SqlParser\Tests\TestCase;
class TransactionStatementTest extends TestCase
{
public function testBuildWithoutEnd(): void
{
$data = $this->getData('parser/parseTransaction4');
$parser = new Parser($data['query']);
$stmt = $parser->statements[0];
$this->assertEquals(
'START TRANSACTION;SET time_zone = "+00:00";',
$stmt->build()
);
}
/**
* @dataProvider transactionProvider
*/
public function testTransaction(string $test): void
{
$this->runParserTest($test);
}
/**
* @return string[][]
*/
public static function transactionProvider(): array
{
return [
['parser/parseTransaction'],
['parser/parseTransaction2'],
['parser/parseTransaction3'],
['parser/parseTransaction4'],
['parser/parseTransaction5'],
['parser/parseTransaction6'],
['parser/parseTransaction7'],
['parser/parseTransactionErr1'],
];
}
}
@@ -0,0 +1,36 @@
<?php
declare(strict_types=1);
namespace PhpMyAdmin\SqlParser\Tests\Parser;
use PhpMyAdmin\SqlParser\Tests\TestCase;
class UpdateStatementTest extends TestCase
{
/**
* @dataProvider updateProvider
*/
public function testUpdate(string $test): void
{
$this->runParserTest($test);
}
/**
* @return string[][]
*/
public static function updateProvider(): array
{
return [
['parser/parseUpdate1'],
['parser/parseUpdate2'],
['parser/parseUpdate3'],
['parser/parseUpdate4'],
['parser/parseUpdate5'],
['parser/parseUpdate6'],
['parser/parseUpdate7'],
['parser/parseUpdateErr'],
['parser/parseUpdateEmptySet'],
];
}
}
@@ -0,0 +1,148 @@
<?php
declare(strict_types=1);
namespace PhpMyAdmin\SqlParser\Tests\Parser;
use PhpMyAdmin\SqlParser\Components\WithKeyword;
use PhpMyAdmin\SqlParser\Lexer;
use PhpMyAdmin\SqlParser\Parser;
use PhpMyAdmin\SqlParser\Tests\TestCase;
use stdClass;
class WithStatementTest extends TestCase
{
/**
* @dataProvider parseWith
*/
public function testParse(string $test): void
{
$this->runParserTest($test);
}
/**
* @return string[][]
*/
public static function parseWith(): array
{
return [
['parser/parseWithStatement'],
['parser/parseWithStatement1'],
['parser/parseWithStatement2'],
['parser/parseWithStatement3'],
['parser/parseWithStatement4'],
['parser/parseWithStatement5'],
['parser/parseWithStatement6'],
['parser/parseWithStatement7'],
['parser/parseWithStatementErr'],
['parser/parseWithStatementErr1'],
['parser/parseWithStatementErr2'],
['parser/parseWithStatementErr3'],
['parser/parseWithStatementErr4'],
['parser/parseWithStatementErr5'],
['parser/parseWithStatementErr6'],
['parser/parseWithStatementErr7'],
['parser/parseWithStatementErr8'],
];
}
public function testWith(): void
{
$sql = <<<SQL
WITH categories(identifier, name, parent_id) AS (
SELECT c.identifier, c.name, c.parent_id FROM category c WHERE c.identifier = 'a'
UNION ALL
SELECT c.identifier, c.name, c.parent_id FROM categories, category c WHERE c.identifier = categories.parent_id
), foo AS ( SELECT * FROM test )
SELECT * FROM categories
SQL;
$lexer = new Lexer($sql);
$lexerErrors = $this->getErrorsAsArray($lexer);
$this->assertCount(0, $lexerErrors);
$parser = new Parser($lexer->list);
$parserErrors = $this->getErrorsAsArray($parser);
$this->assertCount(0, $parserErrors);
$this->assertCount(1, $parser->statements);
// phpcs:disable Generic.Files.LineLength.TooLong
$expected = <<<SQL
WITH categories(identifier, name, parent_id) AS (SELECT c.identifier, c.name, c.parent_id FROM category AS `c` WHERE c.identifier = 'a' UNION ALL SELECT c.identifier, c.name, c.parent_id FROM categories, category AS `c` WHERE c.identifier = categories.parent_id), foo AS (SELECT * FROM test) SELECT * FROM categories
SQL;
// phpcs:enable
$this->assertEquals($expected, $parser->statements[0]->build());
}
public function testWithHasErrors(): void
{
$sql = <<<SQL
WITH categories(identifier, name, parent_id) AS (
SOMETHING * FROM foo
)
SELECT * FROM categories
SQL;
$lexer = new Lexer($sql);
$lexerErrors = $this->getErrorsAsArray($lexer);
$this->assertCount(0, $lexerErrors);
$parser = new Parser($lexer->list);
$parserErrors = $this->getErrorsAsArray($parser);
$this->assertCount(4, $parserErrors);
}
public function testWithEmbedParenthesis(): void
{
$sql = <<<SQL
WITH categories AS (
SELECT * FROM (SELECT * FROM foo)
)
SELECT * FROM categories
SQL;
$lexer = new Lexer($sql);
$lexerErrors = $this->getErrorsAsArray($lexer);
$this->assertCount(0, $lexerErrors);
$parser = new Parser($lexer->list);
$parserErrors = $this->getErrorsAsArray($parser);
$this->assertCount(0, $parserErrors);
// phpcs:disable Generic.Files.LineLength.TooLong
$expected = <<<SQL
WITH categories AS (SELECT * FROM (SELECT * FROM foo)) SELECT * FROM categories
SQL;
// phpcs:enable
$this->assertEquals($expected, $parser->statements[0]->build());
}
public function testWithHasUnclosedParenthesis(): void
{
$sql = <<<SQL
WITH categories(identifier, name, parent_id) AS (
SELECT * FROM (SELECT * FROM foo
)
SELECT * FROM categories
SQL;
$lexer = new Lexer($sql);
$lexerErrors = $this->getErrorsAsArray($lexer);
$this->assertCount(0, $lexerErrors);
$parser = new Parser($lexer->list);
$parserErrors = $this->getErrorsAsArray($parser);
$this->assertEquals($parserErrors[0][0], 'A closing bracket was expected.');
}
public function testBuildWrongWithKeyword(): void
{
$this->expectExceptionMessage('Can not build a component that is not a WithKeyword');
WithKeyword::build(new stdClass());
}
public function testBuildBadWithKeyword(): void
{
$this->expectExceptionMessage('No statement inside WITH');
WithKeyword::build(new WithKeyword('test'));
}
}