123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482 |
- <?php
- /**
- * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
- * SPDX-FileCopyrightText: 2016 ownCloud, Inc.
- * SPDX-License-Identifier: AGPL-3.0-only
- */
- namespace Test\DB\QueryBuilder;
- use Doctrine\DBAL\Query\Expression\CompositeExpression;
- use Doctrine\DBAL\Query\QueryException;
- use OC\DB\QueryBuilder\Literal;
- use OC\DB\QueryBuilder\Parameter;
- use OC\DB\QueryBuilder\QueryBuilder;
- use OC\SystemConfig;
- use OCP\DB\IResult;
- use OCP\DB\QueryBuilder\IQueryBuilder;
- use OCP\DB\QueryBuilder\IQueryFunction;
- use OCP\IDBConnection;
- use Psr\Log\LoggerInterface;
- /**
- * Class QueryBuilderTest
- *
- * @group DB
- *
- * @package Test\DB\QueryBuilder
- */
- class QueryBuilderTest extends \Test\TestCase {
- /** @var QueryBuilder */
- protected $queryBuilder;
- /** @var IDBConnection */
- protected $connection;
- /** @var SystemConfig|\PHPUnit\Framework\MockObject\MockObject */
- protected $config;
- /** @var LoggerInterface|\PHPUnit\Framework\MockObject\MockObject */
- protected $logger;
- protected function setUp(): void {
- parent::setUp();
- $this->connection = \OC::$server->getDatabaseConnection();
- $this->config = $this->createMock(SystemConfig::class);
- $this->logger = $this->createMock(LoggerInterface::class);
- $this->queryBuilder = new QueryBuilder($this->connection, $this->config, $this->logger);
- }
- protected function createTestingRows($appId = 'testFirstResult') {
- $qB = $this->connection->getQueryBuilder();
- for ($i = 1; $i < 10; $i++) {
- $qB->insert('*PREFIX*appconfig')
- ->values([
- 'appid' => $qB->expr()->literal($appId),
- 'configkey' => $qB->expr()->literal('testing' . $i),
- 'configvalue' => $qB->expr()->literal(100 - $i),
- ])
- ->execute();
- }
- }
- protected function getTestingRows(QueryBuilder $queryBuilder) {
- $queryBuilder->select('configvalue')
- ->from('*PREFIX*appconfig')
- ->where($queryBuilder->expr()->eq(
- 'appid',
- $queryBuilder->expr()->literal('testFirstResult')
- ))
- ->orderBy('configkey', 'ASC');
- $query = $queryBuilder->execute();
- $rows = [];
- while ($row = $query->fetch()) {
- $rows[] = $row['configvalue'];
- }
- $query->closeCursor();
- return $rows;
- }
- protected function deleteTestingRows($appId = 'testFirstResult') {
- $qB = $this->connection->getQueryBuilder();
- $qB->delete('*PREFIX*appconfig')
- ->where($qB->expr()->eq('appid', $qB->expr()->literal($appId)))
- ->execute();
- }
- public function dataFirstResult() {
- return [
- [0, [99, 98, 97, 96, 95, 94, 93, 92, 91]],
- [0, [99, 98, 97, 96, 95, 94, 93, 92, 91]],
- [1, [98, 97, 96, 95, 94, 93, 92, 91]],
- [5, [94, 93, 92, 91]],
- ];
- }
- /**
- * @dataProvider dataFirstResult
- *
- * @param int|null $firstResult
- * @param array $expectedSet
- */
- public function testFirstResult($firstResult, $expectedSet): void {
- $this->deleteTestingRows();
- $this->createTestingRows();
- if ($firstResult !== null) {
- $this->queryBuilder->setFirstResult($firstResult);
- }
- $this->assertSame(
- $firstResult ?? 0,
- $this->queryBuilder->getFirstResult()
- );
- $rows = $this->getTestingRows($this->queryBuilder);
- $this->assertCount(sizeof($expectedSet), $rows);
- $this->assertEquals($expectedSet, $rows);
- $this->deleteTestingRows();
- }
- public function dataMaxResults() {
- return [
- [null, [99, 98, 97, 96, 95, 94, 93, 92, 91]],
- // Limit 0 gives mixed results: either all entries or none is returned
- //[0, []],
- [1, [99]],
- [5, [99, 98, 97, 96, 95]],
- ];
- }
- /**
- * @dataProvider dataMaxResults
- *
- * @param int $maxResult
- * @param array $expectedSet
- */
- public function testMaxResults($maxResult, $expectedSet): void {
- $this->deleteTestingRows();
- $this->createTestingRows();
- if ($maxResult !== null) {
- $this->queryBuilder->setMaxResults($maxResult);
- }
- $this->assertSame(
- $maxResult,
- $this->queryBuilder->getMaxResults()
- );
- $rows = $this->getTestingRows($this->queryBuilder);
- $this->assertCount(sizeof($expectedSet), $rows);
- $this->assertEquals($expectedSet, $rows);
- $this->deleteTestingRows();
- }
- public function dataSelect() {
- $config = $this->createMock(SystemConfig::class);
- $logger = $this->createMock(LoggerInterface::class);
- $queryBuilder = new QueryBuilder(\OC::$server->getDatabaseConnection(), $config, $logger);
- return [
- // select('column1')
- [['configvalue'], ['configvalue' => '99']],
- // select('column1', 'column2')
- [['configvalue', 'configkey'], ['configvalue' => '99', 'configkey' => 'testing1']],
- // select(['column1', 'column2'])
- [[['configvalue', 'configkey']], ['configvalue' => '99', 'configkey' => 'testing1']],
- // select(new Literal('column1'))
- [[$queryBuilder->expr()->literal('column1')], [], 'column1'],
- // select('column1', 'column2')
- [[$queryBuilder->expr()->literal('column1'), 'configkey'], ['configkey' => 'testing1'], 'column1'],
- // select(['column1', 'column2'])
- [[[$queryBuilder->expr()->literal('column1'), 'configkey']], ['configkey' => 'testing1'], 'column1'],
- ];
- }
- /**
- * @dataProvider dataSelect
- *
- * @param array $selectArguments
- * @param array $expected
- * @param string $expectedLiteral
- */
- public function testSelect($selectArguments, $expected, $expectedLiteral = ''): void {
- $this->deleteTestingRows();
- $this->createTestingRows();
- call_user_func_array(
- [$this->queryBuilder, 'select'],
- $selectArguments
- );
- $this->queryBuilder->from('*PREFIX*appconfig')
- ->where($this->queryBuilder->expr()->eq(
- 'appid',
- $this->queryBuilder->expr()->literal('testFirstResult')
- ))
- ->orderBy('configkey', 'ASC')
- ->setMaxResults(1);
- $query = $this->queryBuilder->execute();
- $row = $query->fetch();
- $query->closeCursor();
- foreach ($expected as $key => $value) {
- $this->assertArrayHasKey($key, $row);
- $this->assertEquals($value, $row[$key]);
- unset($row[$key]);
- }
- if ($expectedLiteral) {
- $this->assertEquals([$expectedLiteral], array_values($row));
- } else {
- $this->assertEmpty($row);
- }
- $this->deleteTestingRows();
- }
- public function dataSelectAlias() {
- $config = $this->createMock(SystemConfig::class);
- $logger = $this->createMock(LoggerInterface::class);
- $queryBuilder = new QueryBuilder(\OC::$server->getDatabaseConnection(), $config, $logger);
- return [
- ['configvalue', 'cv', ['cv' => '99']],
- [$queryBuilder->expr()->literal('column1'), 'thing', ['thing' => 'column1']],
- ];
- }
- /**
- * @dataProvider dataSelectAlias
- *
- * @param mixed $select
- * @param array $alias
- * @param array $expected
- */
- public function testSelectAlias($select, $alias, $expected): void {
- $this->deleteTestingRows();
- $this->createTestingRows();
- $this->queryBuilder->selectAlias($select, $alias);
- $this->queryBuilder->from('*PREFIX*appconfig')
- ->where($this->queryBuilder->expr()->eq(
- 'appid',
- $this->queryBuilder->expr()->literal('testFirstResult')
- ))
- ->orderBy('configkey', 'ASC')
- ->setMaxResults(1);
- $query = $this->queryBuilder->execute();
- $row = $query->fetch();
- $query->closeCursor();
- $this->assertEquals(
- $expected,
- $row
- );
- $this->deleteTestingRows();
- }
- public function testSelectDistinct(): void {
- $this->deleteTestingRows('testFirstResult1');
- $this->deleteTestingRows('testFirstResult2');
- $this->createTestingRows('testFirstResult1');
- $this->createTestingRows('testFirstResult2');
- $this->queryBuilder->selectDistinct('appid');
- $this->queryBuilder->from('*PREFIX*appconfig')
- ->where($this->queryBuilder->expr()->in(
- 'appid',
- [$this->queryBuilder->expr()->literal('testFirstResult1'), $this->queryBuilder->expr()->literal('testFirstResult2')]
- ))
- ->orderBy('appid', 'DESC');
- $query = $this->queryBuilder->execute();
- $rows = $query->fetchAll();
- $query->closeCursor();
- $this->assertEquals(
- [['appid' => 'testFirstResult2'], ['appid' => 'testFirstResult1']],
- $rows
- );
- $this->deleteTestingRows('testFirstResult1');
- $this->deleteTestingRows('testFirstResult2');
- }
- public function testSelectDistinctMultiple(): void {
- $this->deleteTestingRows('testFirstResult1');
- $this->deleteTestingRows('testFirstResult2');
- $this->createTestingRows('testFirstResult1');
- $this->createTestingRows('testFirstResult2');
- $this->queryBuilder->selectDistinct(['appid', 'configkey']);
- $this->queryBuilder->from('*PREFIX*appconfig')
- ->where($this->queryBuilder->expr()->eq(
- 'appid',
- $this->queryBuilder->expr()->literal('testFirstResult1')
- ))
- ->orderBy('configkey', 'ASC');
- $query = $this->queryBuilder->execute();
- $rows = $query->fetchAll();
- $query->closeCursor();
- $this->assertEquals(
- [
- ['appid' => 'testFirstResult1', 'configkey' => 'testing1'],
- ['appid' => 'testFirstResult1', 'configkey' => 'testing2'],
- ['appid' => 'testFirstResult1', 'configkey' => 'testing3'],
- ['appid' => 'testFirstResult1', 'configkey' => 'testing4'],
- ['appid' => 'testFirstResult1', 'configkey' => 'testing5'],
- ['appid' => 'testFirstResult1', 'configkey' => 'testing6'],
- ['appid' => 'testFirstResult1', 'configkey' => 'testing7'],
- ['appid' => 'testFirstResult1', 'configkey' => 'testing8'],
- ['appid' => 'testFirstResult1', 'configkey' => 'testing9'],
- ],
- $rows
- );
- $this->deleteTestingRows('testFirstResult1');
- $this->deleteTestingRows('testFirstResult2');
- }
- public function dataAddSelect() {
- $config = $this->createMock(SystemConfig::class);
- $logger = $this->createMock(LoggerInterface::class);
- $queryBuilder = new QueryBuilder(\OC::$server->getDatabaseConnection(), $config, $logger);
- return [
- // addSelect('column1')
- [['configvalue'], ['appid' => 'testFirstResult', 'configvalue' => '99']],
- // addSelect('column1', 'column2')
- [['configvalue', 'configkey'], ['appid' => 'testFirstResult', 'configvalue' => '99', 'configkey' => 'testing1']],
- // addSelect(['column1', 'column2'])
- [[['configvalue', 'configkey']], ['appid' => 'testFirstResult', 'configvalue' => '99', 'configkey' => 'testing1']],
- // select(new Literal('column1'))
- [[$queryBuilder->expr()->literal('column1')], ['appid' => 'testFirstResult'], 'column1'],
- // select('column1', 'column2')
- [[$queryBuilder->expr()->literal('column1'), 'configkey'], ['appid' => 'testFirstResult', 'configkey' => 'testing1'], 'column1'],
- // select(['column1', 'column2'])
- [[[$queryBuilder->expr()->literal('column1'), 'configkey']], ['appid' => 'testFirstResult', 'configkey' => 'testing1'], 'column1'],
- ];
- }
- /**
- * @dataProvider dataAddSelect
- *
- * @param array $selectArguments
- * @param array $expected
- * @param string $expectedLiteral
- */
- public function testAddSelect($selectArguments, $expected, $expectedLiteral = ''): void {
- $this->deleteTestingRows();
- $this->createTestingRows();
- $this->queryBuilder->select('appid');
- call_user_func_array(
- [$this->queryBuilder, 'addSelect'],
- $selectArguments
- );
- $this->queryBuilder->from('*PREFIX*appconfig')
- ->where($this->queryBuilder->expr()->eq(
- 'appid',
- $this->queryBuilder->expr()->literal('testFirstResult')
- ))
- ->orderBy('configkey', 'ASC')
- ->setMaxResults(1);
- $query = $this->queryBuilder->execute();
- $row = $query->fetch();
- $query->closeCursor();
- foreach ($expected as $key => $value) {
- $this->assertArrayHasKey($key, $row);
- $this->assertEquals($value, $row[$key]);
- unset($row[$key]);
- }
- if ($expectedLiteral) {
- $this->assertEquals([$expectedLiteral], array_values($row));
- } else {
- $this->assertEmpty($row);
- }
- $this->deleteTestingRows();
- }
- public function dataDelete() {
- return [
- ['data', null, ['table' => '`*PREFIX*data`', 'alias' => null], '`*PREFIX*data`'],
- ['data', 't', ['table' => '`*PREFIX*data`', 'alias' => 't'], '`*PREFIX*data` t'],
- ];
- }
- /**
- * @dataProvider dataDelete
- *
- * @param string $tableName
- * @param string $tableAlias
- * @param array $expectedQueryPart
- * @param string $expectedQuery
- */
- public function testDelete($tableName, $tableAlias, $expectedQueryPart, $expectedQuery): void {
- $this->queryBuilder->delete($tableName, $tableAlias);
- $this->assertSame(
- $expectedQueryPart,
- $this->queryBuilder->getQueryPart('from')
- );
- $this->assertSame(
- 'DELETE FROM ' . $expectedQuery,
- $this->queryBuilder->getSQL()
- );
- }
- public function dataUpdate() {
- return [
- ['data', null, ['table' => '`*PREFIX*data`', 'alias' => null], '`*PREFIX*data`'],
- ['data', 't', ['table' => '`*PREFIX*data`', 'alias' => 't'], '`*PREFIX*data` t'],
- ];
- }
- /**
- * @dataProvider dataUpdate
- *
- * @param string $tableName
- * @param string $tableAlias
- * @param array $expectedQueryPart
- * @param string $expectedQuery
- */
- public function testUpdate($tableName, $tableAlias, $expectedQueryPart, $expectedQuery): void {
- $this->queryBuilder->update($tableName, $tableAlias);
- $this->assertSame(
- $expectedQueryPart,
- $this->queryBuilder->getQueryPart('from')
- );
- $this->assertSame(
- 'UPDATE ' . $expectedQuery . ' SET ',
- $this->queryBuilder->getSQL()
- );
- }
- public function dataInsert() {
- return [
- ['data', ['table' => '`*PREFIX*data`'], '`*PREFIX*data`'],
- ];
- }
- /**
- * @dataProvider dataInsert
- *
- * @param string $tableName
- * @param array $expectedQueryPart
- * @param string $expectedQuery
- */
- public function testInsert($tableName, $expectedQueryPart, $expectedQuery): void {
- $this->queryBuilder->insert($tableName);
- $this->assertSame(
- $expectedQueryPart,
- $this->queryBuilder->getQueryPart('from')
- );
- $this->assertSame(
- 'INSERT INTO ' . $expectedQuery . ' () VALUES()',
- $this->queryBuilder->getSQL()
- );
- }
- public function dataFrom() {
- $config = $this->createMock(SystemConfig::class);
- $logger = $this->createMock(LoggerInterface::class);
- $qb = new QueryBuilder(\OC::$server->getDatabaseConnection(), $config, $logger);
- return [
- [$qb->createFunction('(' . $qb->select('*')->from('test')->getSQL() . ')'), 'q', null, null, [
- ['table' => '(SELECT * FROM `*PREFIX*test`)', 'alias' => '`q`']
- ], '(SELECT * FROM `*PREFIX*test`) `q`'],
- ['data', null, null, null, [['table' => '`*PREFIX*data`', 'alias' => null]], '`*PREFIX*data`'],
- ['data', 't', null, null, [['table' => '`*PREFIX*data`', 'alias' => '`t`']], '`*PREFIX*data` `t`'],
- ['data1', null, 'data2', null, [
- ['table' => '`*PREFIX*data1`', 'alias' => null],
- ['table' => '`*PREFIX*data2`', 'alias' => null]
- ], '`*PREFIX*data1`, `*PREFIX*data2`'],
- ['data', 't1', 'data', 't2', [
- ['table' => '`*PREFIX*data`', 'alias' => '`t1`'],
- ['table' => '`*PREFIX*data`', 'alias' => '`t2`']
- ], '`*PREFIX*data` `t1`, `*PREFIX*data` `t2`'],
- ];
- }
- /**
- * @dataProvider dataFrom
- *
- * @param string|IQueryFunction $table1Name
- * @param string $table1Alias
- * @param string|IQueryFunction $table2Name
- * @param string $table2Alias
- * @param array $expectedQueryPart
- * @param string $expectedQuery
- */
- public function testFrom($table1Name, $table1Alias, $table2Name, $table2Alias, $expectedQueryPart, $expectedQuery): void {
- $this->queryBuilder->from($table1Name, $table1Alias);
- if ($table2Name !== null) {
- $this->queryBuilder->from($table2Name, $table2Alias);
- }
- $this->assertSame(
- $expectedQueryPart,
- $this->queryBuilder->getQueryPart('from')
- );
- $this->assertSame(
- 'SELECT FROM ' . $expectedQuery,
- $this->queryBuilder->getSQL()
- );
- }
- public function dataJoin() {
- return [
- [
- 'd1', 'data2', null, null,
- ['`d1`' => [['joinType' => 'inner', 'joinTable' => '`*PREFIX*data2`', 'joinAlias' => null, 'joinCondition' => null]]],
- '`*PREFIX*data1` `d1` INNER JOIN `*PREFIX*data2` '
- ],
- [
- 'd1', 'data2', 'd2', null,
- ['`d1`' => [['joinType' => 'inner', 'joinTable' => '`*PREFIX*data2`', 'joinAlias' => '`d2`', 'joinCondition' => null]]],
- '`*PREFIX*data1` `d1` INNER JOIN `*PREFIX*data2` `d2`'
- ],
- [
- 'd1', 'data2', 'd2', '`d1`.`field1` = `d2`.`field2`',
- ['`d1`' => [['joinType' => 'inner', 'joinTable' => '`*PREFIX*data2`', 'joinAlias' => '`d2`', 'joinCondition' => '`d1`.`field1` = `d2`.`field2`']]],
- '`*PREFIX*data1` `d1` INNER JOIN `*PREFIX*data2` `d2` ON `d1`.`field1` = `d2`.`field2`'
- ],
- ];
- }
- /**
- * @dataProvider dataJoin
- *
- * @param string $fromAlias
- * @param string $tableName
- * @param string $tableAlias
- * @param string $condition
- * @param array $expectedQueryPart
- * @param string $expectedQuery
- */
- public function testJoin($fromAlias, $tableName, $tableAlias, $condition, $expectedQueryPart, $expectedQuery): void {
- $this->queryBuilder->from('data1', 'd1');
- $this->queryBuilder->join(
- $fromAlias,
- $tableName,
- $tableAlias,
- $condition
- );
- $this->assertSame(
- $expectedQueryPart,
- $this->queryBuilder->getQueryPart('join')
- );
- $this->assertSame(
- 'SELECT FROM ' . $expectedQuery,
- $this->queryBuilder->getSQL()
- );
- }
- /**
- * @dataProvider dataJoin
- *
- * @param string $fromAlias
- * @param string $tableName
- * @param string $tableAlias
- * @param string $condition
- * @param array $expectedQueryPart
- * @param string $expectedQuery
- */
- public function testInnerJoin($fromAlias, $tableName, $tableAlias, $condition, $expectedQueryPart, $expectedQuery): void {
- $this->queryBuilder->from('data1', 'd1');
- $this->queryBuilder->innerJoin(
- $fromAlias,
- $tableName,
- $tableAlias,
- $condition
- );
- $this->assertSame(
- $expectedQueryPart,
- $this->queryBuilder->getQueryPart('join')
- );
- $this->assertSame(
- 'SELECT FROM ' . $expectedQuery,
- $this->queryBuilder->getSQL()
- );
- }
- public function dataLeftJoin() {
- return [
- [
- 'd1', 'data2', null, null,
- ['`d1`' => [['joinType' => 'left', 'joinTable' => '`*PREFIX*data2`', 'joinAlias' => null, 'joinCondition' => null]]],
- '`*PREFIX*data1` `d1` LEFT JOIN `*PREFIX*data2` '
- ],
- [
- 'd1', 'data2', 'd2', null,
- ['`d1`' => [['joinType' => 'left', 'joinTable' => '`*PREFIX*data2`', 'joinAlias' => '`d2`', 'joinCondition' => null]]],
- '`*PREFIX*data1` `d1` LEFT JOIN `*PREFIX*data2` `d2`'
- ],
- [
- 'd1', 'data2', 'd2', '`d1`.`field1` = `d2`.`field2`',
- ['`d1`' => [['joinType' => 'left', 'joinTable' => '`*PREFIX*data2`', 'joinAlias' => '`d2`', 'joinCondition' => '`d1`.`field1` = `d2`.`field2`']]],
- '`*PREFIX*data1` `d1` LEFT JOIN `*PREFIX*data2` `d2` ON `d1`.`field1` = `d2`.`field2`'
- ],
- ];
- }
- /**
- * @dataProvider dataLeftJoin
- *
- * @param string $fromAlias
- * @param string $tableName
- * @param string $tableAlias
- * @param string $condition
- * @param array $expectedQueryPart
- * @param string $expectedQuery
- */
- public function testLeftJoin($fromAlias, $tableName, $tableAlias, $condition, $expectedQueryPart, $expectedQuery): void {
- $this->queryBuilder->from('data1', 'd1');
- $this->queryBuilder->leftJoin(
- $fromAlias,
- $tableName,
- $tableAlias,
- $condition
- );
- $this->assertSame(
- $expectedQueryPart,
- $this->queryBuilder->getQueryPart('join')
- );
- $this->assertSame(
- 'SELECT FROM ' . $expectedQuery,
- $this->queryBuilder->getSQL()
- );
- }
- public function dataRightJoin() {
- return [
- [
- 'd1', 'data2', null, null,
- ['`d1`' => [['joinType' => 'right', 'joinTable' => '`*PREFIX*data2`', 'joinAlias' => null, 'joinCondition' => null]]],
- '`*PREFIX*data1` `d1` RIGHT JOIN `*PREFIX*data2` '
- ],
- [
- 'd1', 'data2', 'd2', null,
- ['`d1`' => [['joinType' => 'right', 'joinTable' => '`*PREFIX*data2`', 'joinAlias' => '`d2`', 'joinCondition' => null]]],
- '`*PREFIX*data1` `d1` RIGHT JOIN `*PREFIX*data2` `d2`'
- ],
- [
- 'd1', 'data2', 'd2', '`d1`.`field1` = `d2`.`field2`',
- ['`d1`' => [['joinType' => 'right', 'joinTable' => '`*PREFIX*data2`', 'joinAlias' => '`d2`', 'joinCondition' => '`d1`.`field1` = `d2`.`field2`']]],
- '`*PREFIX*data1` `d1` RIGHT JOIN `*PREFIX*data2` `d2` ON `d1`.`field1` = `d2`.`field2`'
- ],
- ];
- }
- /**
- * @dataProvider dataRightJoin
- *
- * @param string $fromAlias
- * @param string $tableName
- * @param string $tableAlias
- * @param string $condition
- * @param array $expectedQueryPart
- * @param string $expectedQuery
- */
- public function testRightJoin($fromAlias, $tableName, $tableAlias, $condition, $expectedQueryPart, $expectedQuery): void {
- $this->queryBuilder->from('data1', 'd1');
- $this->queryBuilder->rightJoin(
- $fromAlias,
- $tableName,
- $tableAlias,
- $condition
- );
- $this->assertSame(
- $expectedQueryPart,
- $this->queryBuilder->getQueryPart('join')
- );
- $this->assertSame(
- 'SELECT FROM ' . $expectedQuery,
- $this->queryBuilder->getSQL()
- );
- }
- public function dataSet() {
- return [
- ['column1', new Literal('value'), null, null, ['`column1` = value'], '`column1` = value'],
- ['column1', new Parameter(':param'), null, null, ['`column1` = :param'], '`column1` = :param'],
- ['column1', 'column2', null, null, ['`column1` = `column2`'], '`column1` = `column2`'],
- ['column1', 'column2', 'column3', new Literal('value'), ['`column1` = `column2`', '`column3` = value'], '`column1` = `column2`, `column3` = value'],
- ];
- }
- /**
- * @dataProvider dataSet
- *
- * @param string $partOne1
- * @param string $partOne2
- * @param string $partTwo1
- * @param string $partTwo2
- * @param array $expectedQueryPart
- * @param string $expectedQuery
- */
- public function testSet($partOne1, $partOne2, $partTwo1, $partTwo2, $expectedQueryPart, $expectedQuery): void {
- $this->queryBuilder->update('data');
- $this->queryBuilder->set($partOne1, $partOne2);
- if ($partTwo1 !== null) {
- $this->queryBuilder->set($partTwo1, $partTwo2);
- }
- $this->assertSame(
- $expectedQueryPart,
- $this->queryBuilder->getQueryPart('set')
- );
- $this->assertSame(
- 'UPDATE `*PREFIX*data` SET ' . $expectedQuery,
- $this->queryBuilder->getSQL()
- );
- }
- public function dataWhere() {
- return [
- [['where1'], new CompositeExpression('AND', ['where1']), 'where1'],
- [['where1', 'where2'], new CompositeExpression('AND', ['where1', 'where2']), '(where1) AND (where2)'],
- ];
- }
- /**
- * @dataProvider dataWhere
- *
- * @param array $whereArguments
- * @param array $expectedQueryPart
- * @param string $expectedQuery
- */
- public function testWhere($whereArguments, $expectedQueryPart, $expectedQuery): void {
- $this->queryBuilder->select('column');
- call_user_func_array(
- [$this->queryBuilder, 'where'],
- $whereArguments
- );
- $this->assertEquals(
- $expectedQueryPart,
- $this->queryBuilder->getQueryPart('where')
- );
- $this->assertSame(
- 'SELECT `column` WHERE ' . $expectedQuery,
- $this->queryBuilder->getSQL()
- );
- }
- /**
- * @dataProvider dataWhere
- *
- * @param array $whereArguments
- * @param array $expectedQueryPart
- * @param string $expectedQuery
- */
- public function testAndWhere($whereArguments, $expectedQueryPart, $expectedQuery): void {
- $this->queryBuilder->select('column');
- call_user_func_array(
- [$this->queryBuilder, 'andWhere'],
- $whereArguments
- );
- $this->assertEquals(
- $expectedQueryPart,
- $this->queryBuilder->getQueryPart('where')
- );
- $this->assertSame(
- 'SELECT `column` WHERE ' . $expectedQuery,
- $this->queryBuilder->getSQL()
- );
- }
- public function dataOrWhere() {
- return [
- [['where1'], new CompositeExpression('OR', ['where1']), 'where1'],
- [['where1', 'where2'], new CompositeExpression('OR', ['where1', 'where2']), '(where1) OR (where2)'],
- ];
- }
- /**
- * @dataProvider dataOrWhere
- *
- * @param array $whereArguments
- * @param array $expectedQueryPart
- * @param string $expectedQuery
- */
- public function testOrWhere($whereArguments, $expectedQueryPart, $expectedQuery): void {
- $this->queryBuilder->select('column');
- call_user_func_array(
- [$this->queryBuilder, 'orWhere'],
- $whereArguments
- );
- $this->assertEquals(
- $expectedQueryPart,
- $this->queryBuilder->getQueryPart('where')
- );
- $this->assertSame(
- 'SELECT `column` WHERE ' . $expectedQuery,
- $this->queryBuilder->getSQL()
- );
- }
- public function dataGroupBy() {
- return [
- [['column1'], ['`column1`'], '`column1`'],
- [['column1', 'column2'], ['`column1`', '`column2`'], '`column1`, `column2`'],
- ];
- }
- /**
- * @dataProvider dataGroupBy
- *
- * @param array $groupByArguments
- * @param array $expectedQueryPart
- * @param string $expectedQuery
- */
- public function testGroupBy($groupByArguments, $expectedQueryPart, $expectedQuery): void {
- $this->queryBuilder->select('column');
- call_user_func_array(
- [$this->queryBuilder, 'groupBy'],
- $groupByArguments
- );
- $this->assertEquals(
- $expectedQueryPart,
- $this->queryBuilder->getQueryPart('groupBy')
- );
- $this->assertSame(
- 'SELECT `column` GROUP BY ' . $expectedQuery,
- $this->queryBuilder->getSQL()
- );
- }
- public function dataAddGroupBy() {
- return [
- [['column2'], ['`column1`', '`column2`'], '`column1`, `column2`'],
- [['column2', 'column3'], ['`column1`', '`column2`', '`column3`'], '`column1`, `column2`, `column3`'],
- ];
- }
- /**
- * @dataProvider dataAddGroupBy
- *
- * @param array $groupByArguments
- * @param array $expectedQueryPart
- * @param string $expectedQuery
- */
- public function testAddGroupBy($groupByArguments, $expectedQueryPart, $expectedQuery): void {
- $this->queryBuilder->select('column');
- $this->queryBuilder->groupBy('column1');
- call_user_func_array(
- [$this->queryBuilder, 'addGroupBy'],
- $groupByArguments
- );
- $this->assertEquals(
- $expectedQueryPart,
- $this->queryBuilder->getQueryPart('groupBy')
- );
- $this->assertSame(
- 'SELECT `column` GROUP BY ' . $expectedQuery,
- $this->queryBuilder->getSQL()
- );
- }
- public function dataSetValue() {
- return [
- ['column', 'value', ['`column`' => 'value'], '(`column`) VALUES(value)'],
- ];
- }
- /**
- * @dataProvider dataSetValue
- *
- * @param string $column
- * @param string $value
- * @param array $expectedQueryPart
- * @param string $expectedQuery
- */
- public function testSetValue($column, $value, $expectedQueryPart, $expectedQuery): void {
- $this->queryBuilder->insert('data');
- $this->queryBuilder->setValue($column, $value);
- $this->assertEquals(
- $expectedQueryPart,
- $this->queryBuilder->getQueryPart('values')
- );
- $this->assertSame(
- 'INSERT INTO `*PREFIX*data` ' . $expectedQuery,
- $this->queryBuilder->getSQL()
- );
- }
- /**
- * @dataProvider dataSetValue
- *
- * @param string $column
- * @param string $value
- * @param array $expectedQueryPart
- * @param string $expectedQuery
- */
- public function testValues($column, $value, $expectedQueryPart, $expectedQuery): void {
- $this->queryBuilder->insert('data');
- $this->queryBuilder->values([
- $column => $value,
- ]);
- $this->assertEquals(
- $expectedQueryPart,
- $this->queryBuilder->getQueryPart('values')
- );
- $this->assertSame(
- 'INSERT INTO `*PREFIX*data` ' . $expectedQuery,
- $this->queryBuilder->getSQL()
- );
- }
- public function dataHaving() {
- return [
- [['condition1'], new CompositeExpression('AND', ['condition1']), 'HAVING condition1'],
- [['condition1', 'condition2'], new CompositeExpression('AND', ['condition1', 'condition2']), 'HAVING (condition1) AND (condition2)'],
- [
- [new CompositeExpression('OR', ['condition1', 'condition2'])],
- new CompositeExpression('OR', ['condition1', 'condition2']),
- 'HAVING (condition1) OR (condition2)'
- ],
- [
- [new CompositeExpression('AND', ['condition1', 'condition2'])],
- new CompositeExpression('AND', ['condition1', 'condition2']),
- 'HAVING (condition1) AND (condition2)'
- ],
- ];
- }
- /**
- * @dataProvider dataHaving
- *
- * @param array $havingArguments
- * @param array $expectedQueryPart
- * @param string $expectedQuery
- */
- public function testHaving($havingArguments, $expectedQueryPart, $expectedQuery): void {
- call_user_func_array(
- [$this->queryBuilder, 'having'],
- $havingArguments
- );
- $this->assertEquals(
- $expectedQueryPart,
- $this->queryBuilder->getQueryPart('having')
- );
- $this->assertSame(
- 'SELECT ' . $expectedQuery,
- $this->queryBuilder->getSQL()
- );
- }
- public function dataAndHaving() {
- return [
- [['condition2'], new CompositeExpression('AND', ['condition1', 'condition2']), 'HAVING (condition1) AND (condition2)'],
- [['condition2', 'condition3'], new CompositeExpression('AND', ['condition1', 'condition2', 'condition3']), 'HAVING (condition1) AND (condition2) AND (condition3)'],
- [
- [new CompositeExpression('OR', ['condition2', 'condition3'])],
- new CompositeExpression('AND', ['condition1', new CompositeExpression('OR', ['condition2', 'condition3'])]),
- 'HAVING (condition1) AND ((condition2) OR (condition3))'
- ],
- [
- [new CompositeExpression('AND', ['condition2', 'condition3'])],
- new CompositeExpression('AND', ['condition1', new CompositeExpression('AND', ['condition2', 'condition3'])]),
- 'HAVING (condition1) AND ((condition2) AND (condition3))'
- ],
- ];
- }
- /**
- * @dataProvider dataAndHaving
- *
- * @param array $havingArguments
- * @param array $expectedQueryPart
- * @param string $expectedQuery
- */
- public function testAndHaving($havingArguments, $expectedQueryPart, $expectedQuery): void {
- $this->queryBuilder->having('condition1');
- call_user_func_array(
- [$this->queryBuilder, 'andHaving'],
- $havingArguments
- );
- $this->assertEquals(
- $expectedQueryPart,
- $this->queryBuilder->getQueryPart('having')
- );
- $this->assertSame(
- 'SELECT ' . $expectedQuery,
- $this->queryBuilder->getSQL()
- );
- }
- public function dataOrHaving() {
- return [
- [['condition2'], new CompositeExpression('OR', ['condition1', 'condition2']), 'HAVING (condition1) OR (condition2)'],
- [['condition2', 'condition3'], new CompositeExpression('OR', ['condition1', 'condition2', 'condition3']), 'HAVING (condition1) OR (condition2) OR (condition3)'],
- [
- [new CompositeExpression('OR', ['condition2', 'condition3'])],
- new CompositeExpression('OR', ['condition1', new CompositeExpression('OR', ['condition2', 'condition3'])]),
- 'HAVING (condition1) OR ((condition2) OR (condition3))'
- ],
- [
- [new CompositeExpression('AND', ['condition2', 'condition3'])],
- new CompositeExpression('OR', ['condition1', new CompositeExpression('AND', ['condition2', 'condition3'])]),
- 'HAVING (condition1) OR ((condition2) AND (condition3))'
- ],
- ];
- }
- /**
- * @dataProvider dataOrHaving
- *
- * @param array $havingArguments
- * @param array $expectedQueryPart
- * @param string $expectedQuery
- */
- public function testOrHaving($havingArguments, $expectedQueryPart, $expectedQuery): void {
- $this->queryBuilder->having('condition1');
- call_user_func_array(
- [$this->queryBuilder, 'orHaving'],
- $havingArguments
- );
- $this->assertEquals(
- $expectedQueryPart,
- $this->queryBuilder->getQueryPart('having')
- );
- $this->assertSame(
- 'SELECT ' . $expectedQuery,
- $this->queryBuilder->getSQL()
- );
- }
- public function dataOrderBy() {
- return [
- ['column', null, ['`column` ASC'], 'ORDER BY `column` ASC'],
- ['column', 'ASC', ['`column` ASC'], 'ORDER BY `column` ASC'],
- ['column', 'DESC', ['`column` DESC'], 'ORDER BY `column` DESC'],
- ];
- }
- /**
- * @dataProvider dataOrderBy
- *
- * @param string $sort
- * @param string $order
- * @param array $expectedQueryPart
- * @param string $expectedQuery
- */
- public function testOrderBy($sort, $order, $expectedQueryPart, $expectedQuery): void {
- $this->queryBuilder->orderBy($sort, $order);
- $this->assertEquals(
- $expectedQueryPart,
- $this->queryBuilder->getQueryPart('orderBy')
- );
- $this->assertSame(
- 'SELECT ' . $expectedQuery,
- $this->queryBuilder->getSQL()
- );
- }
- public function dataAddOrderBy() {
- return [
- ['column2', null, null, ['`column1` ASC', '`column2` ASC'], 'ORDER BY `column1` ASC, `column2` ASC'],
- ['column2', null, 'ASC', ['`column1` ASC', '`column2` ASC'], 'ORDER BY `column1` ASC, `column2` ASC'],
- ['column2', null, 'DESC', ['`column1` DESC', '`column2` ASC'], 'ORDER BY `column1` DESC, `column2` ASC'],
- ['column2', 'ASC', null, ['`column1` ASC', '`column2` ASC'], 'ORDER BY `column1` ASC, `column2` ASC'],
- ['column2', 'ASC', 'ASC', ['`column1` ASC', '`column2` ASC'], 'ORDER BY `column1` ASC, `column2` ASC'],
- ['column2', 'ASC', 'DESC', ['`column1` DESC', '`column2` ASC'], 'ORDER BY `column1` DESC, `column2` ASC'],
- ['column2', 'DESC', null, ['`column1` ASC', '`column2` DESC'], 'ORDER BY `column1` ASC, `column2` DESC'],
- ['column2', 'DESC', 'ASC', ['`column1` ASC', '`column2` DESC'], 'ORDER BY `column1` ASC, `column2` DESC'],
- ['column2', 'DESC', 'DESC', ['`column1` DESC', '`column2` DESC'], 'ORDER BY `column1` DESC, `column2` DESC'],
- ];
- }
- /**
- * @dataProvider dataAddOrderBy
- *
- * @param string $sort2
- * @param string $order2
- * @param string $order1
- * @param array $expectedQueryPart
- * @param string $expectedQuery
- */
- public function testAddOrderBy($sort2, $order2, $order1, $expectedQueryPart, $expectedQuery): void {
- $this->queryBuilder->orderBy('column1', $order1);
- $this->queryBuilder->addOrderBy($sort2, $order2);
- $this->assertEquals(
- $expectedQueryPart,
- $this->queryBuilder->getQueryPart('orderBy')
- );
- $this->assertSame(
- 'SELECT ' . $expectedQuery,
- $this->queryBuilder->getSQL()
- );
- }
- public function testGetLastInsertId(): void {
- $qB = $this->connection->getQueryBuilder();
- try {
- $qB->getLastInsertId();
- $this->fail('getLastInsertId() should throw an exception, when being called before insert()');
- } catch (\BadMethodCallException $e) {
- $this->addToAssertionCount(1);
- }
- $qB->insert('properties')
- ->values([
- 'userid' => $qB->expr()->literal('testFirstResult'),
- 'propertypath' => $qB->expr()->literal('testing'),
- 'propertyname' => $qB->expr()->literal('testing'),
- 'propertyvalue' => $qB->expr()->literal('testing'),
- ])
- ->execute();
- $actual = $qB->getLastInsertId();
- $this->assertNotNull($actual);
- $this->assertIsInt($actual);
- $this->assertEquals($this->connection->lastInsertId('*PREFIX*properties'), $actual);
- $qB->delete('properties')
- ->where($qB->expr()->eq('userid', $qB->expr()->literal('testFirstResult')))
- ->execute();
- try {
- $qB->getLastInsertId();
- $this->fail('getLastInsertId() should throw an exception, when being called after delete()');
- } catch (\BadMethodCallException $e) {
- $this->addToAssertionCount(1);
- }
- }
- public function dataGetTableName() {
- $config = $this->createMock(SystemConfig::class);
- $logger = $this->createMock(LoggerInterface::class);
- $qb = new QueryBuilder(\OC::$server->getDatabaseConnection(), $config, $logger);
- return [
- ['*PREFIX*table', null, '`*PREFIX*table`'],
- ['*PREFIX*table', true, '`*PREFIX*table`'],
- ['*PREFIX*table', false, '`*PREFIX*table`'],
- ['table', null, '`*PREFIX*table`'],
- ['table', true, '`*PREFIX*table`'],
- ['table', false, '`table`'],
- [$qb->createFunction('(' . $qb->select('*')->from('table')->getSQL() . ')'), null, '(SELECT * FROM `*PREFIX*table`)'],
- [$qb->createFunction('(' . $qb->select('*')->from('table')->getSQL() . ')'), true, '(SELECT * FROM `*PREFIX*table`)'],
- [$qb->createFunction('(' . $qb->select('*')->from('table')->getSQL() . ')'), false, '(SELECT * FROM `*PREFIX*table`)'],
- ];
- }
- /**
- * @dataProvider dataGetTableName
- *
- * @param string|IQueryFunction $tableName
- * @param bool $automatic
- * @param string $expected
- */
- public function testGetTableName($tableName, $automatic, $expected): void {
- if ($automatic !== null) {
- $this->queryBuilder->automaticTablePrefix($automatic);
- }
- $this->assertSame(
- $expected,
- $this->queryBuilder->getTableName($tableName)
- );
- }
- public function dataGetColumnName() {
- return [
- ['column', '', '`column`'],
- ['column', 'a', '`a`.`column`'],
- ];
- }
- /**
- * @dataProvider dataGetColumnName
- * @param string $column
- * @param string $prefix
- * @param string $expected
- */
- public function testGetColumnName($column, $prefix, $expected): void {
- $this->assertSame(
- $expected,
- $this->queryBuilder->getColumnName($column, $prefix)
- );
- }
- private function getConnection(): IDBConnection {
- $connection = $this->createMock(IDBConnection::class);
- $connection->method('executeStatement')
- ->willReturn(3);
- $connection->method('executeQuery')
- ->willReturn($this->createMock(IResult::class));
- return $connection;
- }
- public function testExecuteWithoutLogger(): void {
- $queryBuilder = $this->createMock(\Doctrine\DBAL\Query\QueryBuilder::class);
- $queryBuilder
- ->method('getSQL')
- ->willReturn('');
- $queryBuilder
- ->method('getParameters')
- ->willReturn([]);
- $queryBuilder
- ->method('getParameterTypes')
- ->willReturn([]);
- $queryBuilder
- ->method('getType')
- ->willReturn(\Doctrine\DBAL\Query\QueryBuilder::UPDATE);
- $this->logger
- ->expects($this->never())
- ->method('debug');
- $this->config
- ->expects($this->once())
- ->method('getValue')
- ->with('log_query', false)
- ->willReturn(false);
- $this->invokePrivate($this->queryBuilder, 'queryBuilder', [$queryBuilder]);
- $this->invokePrivate($this->queryBuilder, 'connection', [$this->getConnection()]);
- $this->assertEquals(3, $this->queryBuilder->execute());
- }
- public function testExecuteWithLoggerAndNamedArray(): void {
- $queryBuilder = $this->createMock(\Doctrine\DBAL\Query\QueryBuilder::class);
- $queryBuilder
- ->expects($this->any())
- ->method('getParameters')
- ->willReturn([
- 'foo' => 'bar',
- 'key' => 'value',
- ]);
- $queryBuilder
- ->method('getParameterTypes')
- ->willReturn([
- 'foo' => IQueryBuilder::PARAM_STR,
- 'key' => IQueryBuilder::PARAM_STR,
- ]);
- $queryBuilder
- ->method('getType')
- ->willReturn(\Doctrine\DBAL\Query\QueryBuilder::UPDATE);
- $queryBuilder
- ->expects($this->any())
- ->method('getSQL')
- ->willReturn('UPDATE FOO SET bar = 1 WHERE BAR = ?');
- $this->logger
- ->expects($this->once())
- ->method('debug')
- ->with(
- 'DB QueryBuilder: \'{query}\' with parameters: {params}',
- [
- 'query' => 'UPDATE FOO SET bar = 1 WHERE BAR = ?',
- 'params' => 'foo => \'bar\', key => \'value\'',
- 'app' => 'core',
- ]
- );
- $this->config
- ->expects($this->once())
- ->method('getValue')
- ->with('log_query', false)
- ->willReturn(true);
- $this->invokePrivate($this->queryBuilder, 'queryBuilder', [$queryBuilder]);
- $this->invokePrivate($this->queryBuilder, 'connection', [$this->getConnection()]);
- $this->assertEquals(3, $this->queryBuilder->execute());
- }
- public function testExecuteWithLoggerAndUnnamedArray(): void {
- $queryBuilder = $this->createMock(\Doctrine\DBAL\Query\QueryBuilder::class);
- $queryBuilder
- ->expects($this->any())
- ->method('getParameters')
- ->willReturn(['Bar']);
- $queryBuilder
- ->method('getParameterTypes')
- ->willReturn([IQueryBuilder::PARAM_STR]);
- $queryBuilder
- ->method('getType')
- ->willReturn(\Doctrine\DBAL\Query\QueryBuilder::UPDATE);
- $queryBuilder
- ->expects($this->any())
- ->method('getSQL')
- ->willReturn('UPDATE FOO SET bar = false WHERE BAR = ?');
- $this->logger
- ->expects($this->once())
- ->method('debug')
- ->with(
- 'DB QueryBuilder: \'{query}\' with parameters: {params}',
- [
- 'query' => 'UPDATE FOO SET bar = false WHERE BAR = ?',
- 'params' => '0 => \'Bar\'',
- 'app' => 'core',
- ]
- );
- $this->config
- ->expects($this->once())
- ->method('getValue')
- ->with('log_query', false)
- ->willReturn(true);
- $this->invokePrivate($this->queryBuilder, 'queryBuilder', [$queryBuilder]);
- $this->invokePrivate($this->queryBuilder, 'connection', [$this->getConnection()]);
- $this->assertEquals(3, $this->queryBuilder->execute());
- }
- public function testExecuteWithLoggerAndNoParams(): void {
- $queryBuilder = $this->createMock(\Doctrine\DBAL\Query\QueryBuilder::class);
- $queryBuilder
- ->expects($this->any())
- ->method('getParameters')
- ->willReturn([]);
- $queryBuilder
- ->method('getParameterTypes')
- ->willReturn([]);
- $queryBuilder
- ->method('getType')
- ->willReturn(\Doctrine\DBAL\Query\QueryBuilder::UPDATE);
- $queryBuilder
- ->expects($this->any())
- ->method('getSQL')
- ->willReturn('UPDATE FOO SET bar = false WHERE BAR = ?');
- $this->logger
- ->expects($this->once())
- ->method('debug')
- ->with(
- 'DB QueryBuilder: \'{query}\'',
- [
- 'query' => 'UPDATE FOO SET bar = false WHERE BAR = ?',
- 'app' => 'core',
- ]
- );
- $this->config
- ->expects($this->once())
- ->method('getValue')
- ->with('log_query', false)
- ->willReturn(true);
- $this->invokePrivate($this->queryBuilder, 'queryBuilder', [$queryBuilder]);
- $this->invokePrivate($this->queryBuilder, 'connection', [$this->getConnection()]);
- $this->assertEquals(3, $this->queryBuilder->execute());
- }
- public function testExecuteWithParameterTooLarge(): void {
- $queryBuilder = $this->createMock(\Doctrine\DBAL\Query\QueryBuilder::class);
- $p = array_fill(0, 1001, 'foo');
- $queryBuilder
- ->expects($this->any())
- ->method('getParameters')
- ->willReturn([$p]);
- $queryBuilder
- ->method('getParameterTypes')
- ->willReturn([IQueryBuilder::PARAM_STR_ARRAY]);
- $queryBuilder
- ->expects($this->any())
- ->method('getSQL')
- ->willReturn('SELECT * FROM FOO WHERE BAR IN (?)');
- $this->logger
- ->expects($this->once())
- ->method('error')
- ->willReturnCallback(function ($message, $parameters) {
- $this->assertInstanceOf(QueryException::class, $parameters['exception']);
- $this->assertSame(
- 'More than 1000 expressions in a list are not allowed on Oracle.',
- $message
- );
- });
- $this->config
- ->expects($this->once())
- ->method('getValue')
- ->with('log_query', false)
- ->willReturn(false);
- $this->invokePrivate($this->queryBuilder, 'queryBuilder', [$queryBuilder]);
- $this->invokePrivate($this->queryBuilder, 'connection', [$this->getConnection()]);
- $this->queryBuilder->execute();
- }
- public function testExecuteWithParametersTooMany(): void {
- $queryBuilder = $this->createMock(\Doctrine\DBAL\Query\QueryBuilder::class);
- $p = array_fill(0, 999, 'foo');
- $queryBuilder
- ->expects($this->any())
- ->method('getParameters')
- ->willReturn(array_fill(0, 66, $p));
- $queryBuilder
- ->method('getParameterTypes')
- ->willReturn([IQueryBuilder::PARAM_STR_ARRAY]);
- $queryBuilder
- ->expects($this->any())
- ->method('getSQL')
- ->willReturn('SELECT * FROM FOO WHERE BAR IN (?) OR BAR IN (?)');
- $this->logger
- ->expects($this->once())
- ->method('error')
- ->willReturnCallback(function ($message, $parameters) {
- $this->assertInstanceOf(QueryException::class, $parameters['exception']);
- $this->assertSame(
- 'The number of parameters must not exceed 65535. Restriction by PostgreSQL.',
- $message
- );
- });
- $this->config
- ->expects($this->once())
- ->method('getValue')
- ->with('log_query', false)
- ->willReturn(false);
- $this->invokePrivate($this->queryBuilder, 'queryBuilder', [$queryBuilder]);
- $this->invokePrivate($this->queryBuilder, 'connection', [$this->getConnection()]);
- $this->queryBuilder->execute();
- }
- }
|