Failed Conditions
Push — master ( ddb3cd...4476ec )
by Marco
11:47
created

testAnyExpressionWithCorrelatedSubquery()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 0
dl 0
loc 3
rs 10
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Doctrine\Tests\ORM\Query;
6
7
use Doctrine\ORM\Annotation as ORM;
8
use Doctrine\ORM\EntityManagerInterface;
9
use Doctrine\ORM\Query;
10
use Doctrine\ORM\Query\QueryException;
11
use Doctrine\Tests\Mocks\MockTreeWalker;
12
use Doctrine\Tests\OrmTestCase;
13
14
class LanguageRecognitionTest extends OrmTestCase
15
{
16
    /**
17
     * @var EntityManagerInterface
18
     */
19
    private $em;
20
21
    protected function setUp()
22
    {
23
        $this->em = $this->getTestEntityManager();
24
    }
25
26
    public function assertValidDQL($dql, $debug = false)
27
    {
28
        try {
29
            $parserResult = $this->parseDql($dql);
30
            $this->addToAssertionCount(1);
31
        } catch (QueryException $e) {
32
            if ($debug) {
33
                echo $e->getTraceAsString() . PHP_EOL;
34
            }
35
36
            $this->fail($e->getMessage());
37
        }
38
    }
39
40
    public function assertInvalidDQL($dql, $debug = false)
41
    {
42
        try {
43
            $parserResult = $this->parseDql($dql);
44
45
            $this->fail('No syntax errors were detected, when syntax errors were expected');
46
        } catch (QueryException $e) {
47
            if ($debug) {
48
                echo $e->getMessage() . PHP_EOL;
49
                echo $e->getTraceAsString() . PHP_EOL;
50
            }
51
            $this->addToAssertionCount(1);
52
        }
53
    }
54
55
    public function parseDql($dql, $hints = [])
56
    {
57
        $query = $this->em->createQuery($dql);
58
        $query->setHint(Query::HINT_FORCE_PARTIAL_LOAD, true);
59
        $query->setDQL($dql);
60
61
        foreach ($hints as $key => $value) {
62
            $query->setHint($key, $value);
63
        }
64
65
        $parser = new Query\Parser($query);
66
67
        // We do NOT test SQL output here. That only unnecessarily slows down the tests!
68
        $parser->setCustomOutputTreeWalker(MockTreeWalker::class);
69
70
        return $parser->parse();
71
    }
72
73
    public function testEmptyQueryString()
74
    {
75
        self::assertInvalidDQL('');
76
    }
77
78
    public function testPlainFromClauseWithAlias()
79
    {
80
        self::assertValidDQL('SELECT u.id FROM Doctrine\Tests\Models\CMS\CmsUser u');
81
    }
82
83
    public function testSelectSingleComponentWithAsterisk()
84
    {
85
        self::assertValidDQL('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u');
86
    }
87
88
    /**
89
     * @dataProvider invalidDQL
90
     */
91
    public function testRejectsInvalidDQL($dql)
92
    {
93
        $this->expectException(QueryException::class);
94
95
        $this->parseDql($dql);
96
    }
97
98
    public function invalidDQL()
99
    {
100
        return [
101
102
            ['SELECT \'foo\' AS foo\bar FROM Doctrine\Tests\Models\CMS\CmsUser u'],
103
            /* Checks for invalid IdentificationVariables and AliasIdentificationVariables */
104
            ['SELECT \foo FROM Doctrine\Tests\Models\CMS\CmsUser \foo'],
105
            ['SELECT foo\ FROM Doctrine\Tests\Models\CMS\CmsUser foo\\'],
106
            ['SELECT foo\bar FROM Doctrine\Tests\Models\CMS\CmsUser foo\bar'],
107
            ['SELECT foo:bar FROM Doctrine\Tests\Models\CMS\CmsUser foo:bar'],
108
            ['SELECT foo: FROM Doctrine\Tests\Models\CMS\CmsUser foo:'],
109
110
            /* Checks for invalid AbstractSchemaName */
111
            ['SELECT u FROM UnknownClass u'],  // unknown
112
            ['SELECT u FROM \Unknown\Class u'], // unknown, leading backslash
113
            ['SELECT u FROM Unknown\\\\Class u'], // unknown, syntactically bogus (duplicate \\)
114
            ['SELECT u FROM Unknown\Class\ u'], // unknown, syntactically bogus (trailing \)
115
            ['SELECT u FROM Unknown::Class u'], // unknown, with PAAMAYIM_NEKUDOTAYIM
116
            ['SELECT u FROM Doctrine\Tests\Models\CMS\\\\CmsUser u'], // syntactically bogus (duplicate \\)array('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser\ u'), // syntactically bogus (trailing \)
0 ignored issues
show
Unused Code Comprehensibility introduced by
44% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
117
            ['SELECT u FROM CMS::User u'],
118
119
            /* Checks for invalid AliasResultVariable */
120
            ['SELECT \'foo\' AS \foo FROM Doctrine\Tests\Models\CMS\CmsUser u'],
121
            ['SELECT \'foo\' AS \foo\bar FROM Doctrine\Tests\Models\CMS\CmsUser u'],
122
            ['SELECT \'foo\' AS foo\ FROM Doctrine\Tests\Models\CMS\CmsUser u'],
123
            ['SELECT \'foo\' AS foo\\\\bar FROM Doctrine\Tests\Models\CMS\CmsUser u'],
124
            ['SELECT \'foo\' AS foo: FROM Doctrine\Tests\Models\CMS\CmsUser u'],
125
            ['SELECT \'foo\' AS foo:bar FROM Doctrine\Tests\Models\CMS\CmsUser u'],
126
        ];
127
    }
128
129
    public function testSelectSingleComponentWithMultipleColumns()
130
    {
131
        self::assertValidDQL('SELECT u.name, u.username FROM Doctrine\Tests\Models\CMS\CmsUser u');
132
    }
133
134
    public function testSelectMultipleComponentsUsingMultipleFrom()
135
    {
136
        self::assertValidDQL('SELECT u, p FROM Doctrine\Tests\Models\CMS\CmsUser u, Doctrine\Tests\Models\CMS\CmsPhonenumber p WHERE u = p.user');
137
    }
138
139
    public function testSelectMultipleComponentsWithAsterisk()
140
    {
141
        self::assertValidDQL('SELECT u, p FROM Doctrine\Tests\Models\CMS\CmsUser u JOIN u.phonenumbers p');
142
    }
143
144
    public function testSelectDistinctIsSupported()
145
    {
146
        self::assertValidDQL('SELECT DISTINCT u.name FROM Doctrine\Tests\Models\CMS\CmsUser u');
147
    }
148
149
    public function testAggregateFunctionInSelect()
150
    {
151
        self::assertValidDQL('SELECT COUNT(u.id) FROM Doctrine\Tests\Models\CMS\CmsUser u');
152
    }
153
154
    public function testMultipleParenthesisInSelect()
155
    {
156
        self::assertValidDQL('SELECT (((u.id))) as v FROM Doctrine\Tests\Models\CMS\CmsUser u');
157
    }
158
159
    public function testDuplicatedAliasInAggregateFunction()
160
    {
161
        self::assertInvalidDQL('SELECT COUNT(u.id) AS num, SUM(u.id) AS num FROM Doctrine\Tests\Models\CMS\CmsUser u');
162
    }
163
164
    public function testAggregateFunctionWithDistinctInSelect()
165
    {
166
        self::assertValidDQL('SELECT COUNT(DISTINCT u.name) FROM Doctrine\Tests\Models\CMS\CmsUser u');
167
    }
168
169
    public function testFunctionalExpressionsSupportedInWherePart()
170
    {
171
        self::assertValidDQL("SELECT u.name FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE TRIM(u.name) = 'someone'");
172
    }
173
174
    public function testArithmeticExpressionsSupportedInWherePart()
175
    {
176
        self::assertValidDQL('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE ((u.id + 5000) * u.id + 3) < 10000000');
177
    }
178
179
    public function testInExpressionSupportedInWherePart()
180
    {
181
        self::assertValidDQL('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id IN (1, 2)');
182
    }
183
184
    public function testInExpressionWithoutSpacesSupportedInWherePart()
185
    {
186
        self::assertValidDQL('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id IN (1,2,3)');
187
    }
188
189
    public function testNotInExpressionSupportedInWherePart()
190
    {
191
        self::assertValidDQL('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id NOT IN (1)');
192
    }
193
194
    public function testInExpressionWithSingleValuedAssociationPathExpression()
195
    {
196
        self::assertValidDQL("SELECT u FROM Doctrine\Tests\Models\Forum\ForumUser u WHERE u.avatar IN (?1, ?2)");
197
    }
198
199
    public function testInvalidInExpressionWithCollectionValuedAssociationPathExpression()
200
    {
201
        self::assertInvalidDQL("SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.phonenumbers IN (?1, ?2)");
202
    }
203
204
    public function testInstanceOfExpressionSupportedInWherePart()
205
    {
206
        self::assertValidDQL('SELECT u FROM Doctrine\Tests\Models\Company\CompanyPerson u WHERE u INSTANCE OF Doctrine\Tests\Models\Company\CompanyEmployee');
207
    }
208
209
    public function testInstanceOfExpressionWithInputParamSupportedInWherePart()
210
    {
211
        self::assertValidDQL('SELECT u FROM Doctrine\Tests\Models\Company\CompanyPerson u WHERE u INSTANCE OF ?1');
212
    }
213
214
    public function testNotInstanceOfExpressionSupportedInWherePart()
215
    {
216
        self::assertValidDQL('SELECT u FROM Doctrine\Tests\Models\Company\CompanyPerson u WHERE u NOT INSTANCE OF ?1');
217
    }
218
219
    public function testExistsExpressionSupportedInWherePart()
220
    {
221
        self::assertValidDQL('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE EXISTS (SELECT p.phonenumber FROM Doctrine\Tests\Models\CMS\CmsPhonenumber p WHERE p.phonenumber = 1234)');
222
    }
223
224
    public function testNotExistsExpressionSupportedInWherePart()
225
    {
226
        self::assertValidDQL('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE NOT EXISTS (SELECT p.phonenumber FROM Doctrine\Tests\Models\CMS\CmsPhonenumber p WHERE p.phonenumber = 1234)');
227
    }
228
229
    public function testAggregateFunctionInHavingClause()
230
    {
231
        self::assertValidDQL('SELECT u.name FROM Doctrine\Tests\Models\CMS\CmsUser u LEFT JOIN u.phonenumbers p HAVING COUNT(p.phonenumber) > 2');
232
        self::assertValidDQL("SELECT u.name FROM Doctrine\Tests\Models\CMS\CmsUser u LEFT JOIN u.phonenumbers p HAVING MAX(u.name) = 'romanb'");
233
    }
234
235
    public function testLeftJoin()
236
    {
237
        self::assertValidDQL('SELECT u, p FROM Doctrine\Tests\Models\CMS\CmsUser u LEFT JOIN u.phonenumbers p');
238
    }
239
240
    public function testJoin()
241
    {
242
        self::assertValidDQL('SELECT u,p FROM Doctrine\Tests\Models\CMS\CmsUser u JOIN u.phonenumbers p');
243
    }
244
245
    public function testInnerJoin()
246
    {
247
        self::assertValidDQL('SELECT u, p FROM Doctrine\Tests\Models\CMS\CmsUser u INNER JOIN u.phonenumbers p');
248
    }
249
250
    public function testMultipleLeftJoin()
251
    {
252
        self::assertValidDQL('SELECT u, a, p FROM Doctrine\Tests\Models\CMS\CmsUser u LEFT JOIN u.articles a LEFT JOIN u.phonenumbers p');
253
    }
254
255
    public function testMultipleInnerJoin()
256
    {
257
        self::assertValidDQL('SELECT u.name FROM Doctrine\Tests\Models\CMS\CmsUser u INNER JOIN u.articles a INNER JOIN u.phonenumbers p');
258
    }
259
260
    public function testMixingOfJoins()
261
    {
262
        self::assertValidDQL('SELECT u.name, a.topic, p.phonenumber FROM Doctrine\Tests\Models\CMS\CmsUser u INNER JOIN u.articles a LEFT JOIN u.phonenumbers p');
263
    }
264
265
    public function testJoinClassPathUsingWITH()
266
    {
267
        self::assertValidDQL('SELECT u.name FROM Doctrine\Tests\Models\CMS\CmsUser u JOIN Doctrine\Tests\Models\CMS\CmsArticle a WITH a.user = u.id');
268
    }
269
270
    /**
271
     * @group DDC-3701
272
     */
273
    public function testJoinClassPathUsingWHERE()
274
    {
275
        self::assertValidDQL('SELECT u.name FROM Doctrine\Tests\Models\CMS\CmsUser u JOIN Doctrine\Tests\Models\CMS\CmsArticle a WHERE a.user = u.id');
276
    }
277
278
    /**
279
     * @group DDC-3701
280
     */
281
    public function testDDC3701WHEREIsNotWITH()
282
    {
283
        self::assertInvalidDQL('SELECT c FROM Doctrine\Tests\Models\Company\CompanyContract c JOIN Doctrine\Tests\Models\Company\CompanyEmployee e WHERE e.id = c.salesPerson WHERE c.completed = true');
284
    }
285
286
    public function testOrderBySingleColumn()
287
    {
288
        self::assertValidDQL('SELECT u.name FROM Doctrine\Tests\Models\CMS\CmsUser u ORDER BY u.name');
289
    }
290
291
    public function testOrderBySingleColumnAscending()
292
    {
293
        self::assertValidDQL('SELECT u.name FROM Doctrine\Tests\Models\CMS\CmsUser u ORDER BY u.name ASC');
294
    }
295
296
    public function testOrderBySingleColumnDescending()
297
    {
298
        self::assertValidDQL('SELECT u.name FROM Doctrine\Tests\Models\CMS\CmsUser u ORDER BY u.name DESC');
299
    }
300
301
    public function testOrderByMultipleColumns()
302
    {
303
        self::assertValidDQL('SELECT u.name, u.username FROM Doctrine\Tests\Models\CMS\CmsUser u ORDER BY u.username DESC, u.name DESC');
304
    }
305
306
    public function testSubselectInInExpression()
307
    {
308
        self::assertValidDQL("SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id NOT IN (SELECT u2.id FROM Doctrine\Tests\Models\CMS\CmsUser u2 WHERE u2.name = 'zYne')");
309
    }
310
311
    public function testSubselectInSelectPart()
312
    {
313
        self::assertValidDQL("SELECT u.name, (SELECT COUNT(p.phonenumber) FROM Doctrine\Tests\Models\CMS\CmsPhonenumber p WHERE p.phonenumber = 1234) pcount FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.name = 'jon'");
314
    }
315
316
    public function testArithmeticExpressionInSelectPart()
317
    {
318
        self::assertValidDQL("SELECT SUM(u.id) / COUNT(u.id) FROM Doctrine\Tests\Models\CMS\CmsUser u");
319
    }
320
321
    public function testArithmeticExpressionInSubselectPart()
322
    {
323
        self::assertValidDQL("SELECT (SELECT SUM(u.id) / COUNT(u.id) FROM Doctrine\Tests\Models\CMS\CmsUser u2) value FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.name = 'jon'");
324
    }
325
326
    public function testArithmeticExpressionWithParenthesisInSubselectPart()
327
    {
328
        self::assertValidDQL("SELECT (SELECT (SUM(u.id) / COUNT(u.id)) FROM Doctrine\Tests\Models\CMS\CmsUser u2) value FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.name = 'jon'");
329
    }
330
331
    /**
332
     * @group DDC-1079
333
     */
334
    public function testSelectLiteralInSubselect()
335
    {
336
        self::assertValidDQL('SELECT (SELECT 1 FROM Doctrine\Tests\Models\CMS\CmsUser u2) value FROM Doctrine\Tests\Models\CMS\CmsUser u');
337
        self::assertValidDQL('SELECT (SELECT 0 FROM Doctrine\Tests\Models\CMS\CmsUser u2) value FROM Doctrine\Tests\Models\CMS\CmsUser u');
338
    }
339
340
    /**
341
     * @group DDC-1077
342
     */
343
    public function testConstantValueInSelect()
344
    {
345
        self::assertValidDQL("SELECT u.name, 'foo' AS bar FROM Doctrine\Tests\Models\CMS\CmsUser u", true);
346
    }
347
348
    public function testDuplicateAliasInSubselectPart()
349
    {
350
        self::assertInvalidDQL("SELECT (SELECT SUM(u.id) / COUNT(u.id) AS foo FROM Doctrine\Tests\Models\CMS\CmsUser u2) foo FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.name = 'jon'");
351
    }
352
353
    public function testPositionalInputParameter()
354
    {
355
        self::assertValidDQL('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = ?1');
356
    }
357
358
    public function testNamedInputParameter()
359
    {
360
        self::assertValidDQL('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = :id');
361
    }
362
363
    public function testJoinConditionOverrideNotSupported()
364
    {
365
        self::assertInvalidDQL("SELECT u.name, p FROM Doctrine\Tests\Models\CMS\CmsUser u LEFT JOIN u.phonenumbers p ON p.phonenumber = '123 123'");
366
    }
367
368
    public function testIndexByClauseWithOneComponent()
369
    {
370
        self::assertValidDQL('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u INDEX BY u.id');
371
    }
372
373
    public function testIndexBySupportsJoins()
374
    {
375
        self::assertValidDQL('SELECT u, a FROM Doctrine\Tests\Models\CMS\CmsUser u LEFT JOIN u.articles a INDEX BY a.id'); // INDEX BY is now referring to articles
376
    }
377
378
    public function testIndexBySupportsJoins2()
379
    {
380
        self::assertValidDQL('SELECT u, p FROM Doctrine\Tests\Models\CMS\CmsUser u INDEX BY u.id LEFT JOIN u.phonenumbers p INDEX BY p.phonenumber');
381
    }
382
383
    public function testBetweenExpressionSupported()
384
    {
385
        self::assertValidDQL("SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.name BETWEEN 'jepso' AND 'zYne'");
386
    }
387
388
    public function testNotBetweenExpressionSupported()
389
    {
390
        self::assertValidDQL("SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.name NOT BETWEEN 'jepso' AND 'zYne'");
391
    }
392
393
    public function testLikeExpression()
394
    {
395
        self::assertValidDQL("SELECT u.id FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.name LIKE 'z%'");
396
    }
397
398
    public function testNotLikeExpression()
399
    {
400
        self::assertValidDQL("SELECT u.id FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.name NOT LIKE 'z%'");
401
    }
402
403
    public function testLikeExpressionWithCustomEscapeCharacter()
404
    {
405
        self::assertValidDQL("SELECT u.id FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.name LIKE 'z|%' ESCAPE '|'");
406
    }
407
408
    public function testFieldComparisonWithoutAlias()
409
    {
410
        self::assertInvalidDQL("SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE id = 1");
411
    }
412
413
    public function testDuplicatedAliasDeclaration()
414
    {
415
        self::assertInvalidDQL("SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u INNER JOIN u.articles u WHERE u.id = 1");
416
    }
417
418
    public function testImplicitJoinInWhereOnSingleValuedAssociationPathExpression()
419
    {
420
        // This should be allowed because avatar is a single-value association.
421
        // SQL: SELECT ... FROM forum_user fu INNER JOIN forum_avatar fa ON fu.avatar_id = fa.id WHERE fa.id = ?
422
        self::assertValidDQL("SELECT u FROM Doctrine\Tests\Models\Forum\ForumUser u JOIN u.avatar a WHERE a.id = ?1");
423
    }
424
425
    public function testImplicitJoinInWhereOnCollectionValuedPathExpression()
426
    {
427
        // This should be forbidden, because articles is a collection
428
        self::assertInvalidDQL("SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u JOIN u.articles a WHERE a.title = ?");
429
    }
430
431
    public function testInvalidSyntaxIsRejected()
432
    {
433
        self::assertInvalidDQL("FOOBAR CmsUser");
434
        self::assertInvalidDQL("DELETE FROM Doctrine\Tests\Models\CMS\CmsUser.articles");
435
        self::assertInvalidDQL("SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u JOIN u.articles.comments");
436
437
        // Currently UNDEFINED OFFSET error
438
        self::assertInvalidDQL("SELECT c FROM CmsUser.articles.comments c");
439
    }
440
441
    public function testUpdateWorksWithOneField()
442
    {
443
        self::assertValidDQL("UPDATE Doctrine\Tests\Models\CMS\CmsUser u SET u.name = 'someone'");
444
    }
445
446
    public function testUpdateWorksWithMultipleFields()
447
    {
448
        self::assertValidDQL("UPDATE Doctrine\Tests\Models\CMS\CmsUser u SET u.name = 'someone', u.username = 'some'");
449
    }
450
451
    public function testUpdateSupportsConditions()
452
    {
453
        self::assertValidDQL("UPDATE Doctrine\Tests\Models\CMS\CmsUser u SET u.name = 'someone' WHERE u.id = 5");
454
    }
455
456
    public function testDeleteAll()
457
    {
458
        self::assertValidDQL('DELETE FROM Doctrine\Tests\Models\CMS\CmsUser u');
459
    }
460
461
    public function testDeleteWithCondition()
462
    {
463
        self::assertValidDQL('DELETE FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = 3');
464
    }
465
466
    /**
467
     * The main use case for this generalized style of join is when a join condition
468
     * does not involve a foreign key relationship that is mapped to an entity relationship.
469
     */
470
    public function testImplicitJoinWithCartesianProductAndConditionInWhere()
471
    {
472
        self::assertValidDQL("SELECT u, a FROM Doctrine\Tests\Models\CMS\CmsUser u, Doctrine\Tests\Models\CMS\CmsArticle a WHERE u.name = a.topic");
473
    }
474
475
    public function testAllExpressionWithCorrelatedSubquery()
476
    {
477
        self::assertValidDQL('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id > ALL (SELECT u2.id FROM Doctrine\Tests\Models\CMS\CmsUser u2 WHERE u2.name = u.name)');
478
    }
479
480
    public function testCustomJoinsAndWithKeywordSupported()
481
    {
482
        self::assertValidDQL('SELECT u, p FROM Doctrine\Tests\Models\CMS\CmsUser u INNER JOIN u.phonenumbers p WITH p.phonenumber = 123 WHERE u.id = 1');
483
    }
484
485
    public function testAnyExpressionWithCorrelatedSubquery()
486
    {
487
        self::assertValidDQL('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id > ANY (SELECT u2.id FROM Doctrine\Tests\Models\CMS\CmsUser u2 WHERE u2.name = u.name)');
488
    }
489
490
    public function testSomeExpressionWithCorrelatedSubquery()
491
    {
492
        self::assertValidDQL('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id > SOME (SELECT u2.id FROM Doctrine\Tests\Models\CMS\CmsUser u2 WHERE u2.name = u.name)');
493
    }
494
495
    public function testArithmeticExpressionWithoutParenthesisInWhereClause()
496
    {
497
        self::assertValidDQL('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE SIZE(u.phonenumbers) + 1 > 10');
498
    }
499
500
    public function testMemberOfExpression()
501
    {
502
        self::assertValidDQL('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE :param MEMBER OF u.phonenumbers');
503
        //self::assertValidDQL("SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE 'Joe' MEMBER OF u.nicknames");
0 ignored issues
show
Unused Code Comprehensibility introduced by
86% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
504
    }
505
506
    public function testSizeFunction()
507
    {
508
        self::assertValidDQL('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE SIZE(u.phonenumbers) > 1');
509
    }
510
511
    public function testEmptyCollectionComparisonExpression()
512
    {
513
        self::assertValidDQL('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.phonenumbers IS EMPTY');
514
    }
515
516
    public function testSingleValuedAssociationFieldInWhere()
517
    {
518
        self::assertValidDQL('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.address = ?1');
519
        self::assertValidDQL('SELECT p FROM Doctrine\Tests\Models\CMS\CmsPhonenumber p WHERE p.user = ?1');
520
    }
521
522
    public function testBooleanLiteralInWhere()
523
    {
524
        self::assertValidDQL('SELECT b FROM Doctrine\Tests\Models\Generic\BooleanModel b WHERE b.booleanField = true');
525
    }
526
527
    public function testSubqueryInSelectExpression()
528
    {
529
        self::assertValidDQL('select u, (select max(p.phonenumber) from Doctrine\Tests\Models\CMS\CmsPhonenumber p) maxId from Doctrine\Tests\Models\CMS\CmsUser u');
530
    }
531
532
    public function testUsageOfQComponentOutsideSubquery()
533
    {
534
        self::assertInvalidDQL('select u, (select max(p.phonenumber) from Doctrine\Tests\Models\CMS\CmsPhonenumber p) maxId from Doctrine\Tests\Models\CMS\CmsUser u WHERE p.user = ?1');
535
    }
536
537
    public function testUnknownAbstractSchemaName()
538
    {
539
        self::assertInvalidDQL('SELECT u FROM UnknownClassName u');
540
    }
541
542
    public function testCorrectPartialObjectLoad()
543
    {
544
        self::assertValidDQL('SELECT PARTIAL u.{id,name} FROM Doctrine\Tests\Models\CMS\CmsUser u');
545
    }
546
547
    public function testIncorrectPartialObjectLoadBecauseOfMissingIdentifier()
548
    {
549
        self::assertInvalidDQL('SELECT PARTIAL u.{name} FROM Doctrine\Tests\Models\CMS\CmsUser u');
550
    }
551
552
    public function testScalarExpressionInSelect()
553
    {
554
        self::assertValidDQL('SELECT u, 42 + u.id AS someNumber FROM Doctrine\Tests\Models\CMS\CmsUser u');
555
    }
556
557
    public function testInputParameterInSelect()
558
    {
559
        self::assertValidDQL('SELECT u, u.id + ?1 AS someNumber FROM Doctrine\Tests\Models\CMS\CmsUser u');
560
    }
561
562
    /**
563
     * @group DDC-1091
564
     */
565
    public function testCustomFunctionsReturningStringInStringPrimary()
566
    {
567
        $this->em->getConfiguration()->addCustomStringFunction('CC', Query\AST\Functions\ConcatFunction::class);
568
569
        self::assertValidDQL("SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE CC('%', u.name) LIKE '%foo%'", true);
570
    }
571
572
    /**
573
     * @group DDC-505
574
     */
575
    public function testDQLKeywordInJoinIsAllowed()
576
    {
577
        self::assertValidDQL('SELECT u FROM ' . __NAMESPACE__ . '\DQLKeywordsModelUser u JOIN u.group g');
578
    }
579
580
    /**
581
     * @group DDC-505
582
     */
583
    public function testDQLKeywordInConditionIsAllowed()
584
    {
585
        self::assertValidDQL('SELECT g FROM ' . __NAMESPACE__ . '\DQLKeywordsModelGroup g WHERE g.from=0');
586
    }
587
588
    /* The exception is currently thrown in the SQLWalker, not earlier.
589
    public function testInverseSideSingleValuedAssociationPathNotAllowed()
590
    {
591
        self::assertInvalidDQL('SELECT u.id FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.address = ?1');
592
    }
593
    */
594
595
    /**
596
     * @group DDC-617
597
     */
598
    public function testSelectOnlyNonRootEntityAlias()
599
    {
600
        self::assertInvalidDQL('SELECT g FROM Doctrine\Tests\Models\CMS\CmsUser u JOIN u.groups g');
601
    }
602
603
    /**
604
     * @group DDC-1108
605
     */
606
    public function testInputParameterSingleChar()
607
    {
608
        self::assertValidDQL('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.name = :q');
609
    }
610
611
    /**
612
     * @group DDC-1053
613
     */
614
    public function testGroupBy()
615
    {
616
        self::assertValidDQL('SELECT g.id, count(u.id) FROM Doctrine\Tests\Models\CMS\CmsGroup g JOIN g.users u GROUP BY g.id');
617
    }
618
619
    /**
620
     * @group DDC-1053
621
     */
622
    public function testGroupByIdentificationVariable()
623
    {
624
        self::assertValidDQL('SELECT g, count(u.id) FROM Doctrine\Tests\Models\CMS\CmsGroup g JOIN g.users u GROUP BY g');
625
    }
626
627
    /**
628
     * @group DDC-1053
629
     */
630
    public function testGroupByUnknownIdentificationVariable()
631
    {
632
        self::assertInvalidDQL('SELECT g, count(u.id) FROM Doctrine\Tests\Models\CMS\CmsGroup g JOIN g.users u GROUP BY m');
633
    }
634
635
    /**
636
     * @group DDC-117
637
     */
638
    public function testSizeOfForeignKeyOneToManyPrimaryKeyEntity()
639
    {
640
        self::assertValidDQL("SELECT a, t FROM Doctrine\Tests\Models\DDC117\DDC117Article a JOIN a.translations t WHERE SIZE(a.translations) > 0");
641
    }
642
643
    /**
644
     * @group DDC-117
645
     */
646
    public function testSizeOfForeignKeyManyToManyPrimaryKeyEntity()
647
    {
648
        self::assertValidDQL("SELECT e, t FROM Doctrine\Tests\Models\DDC117\DDC117Editor e JOIN e.reviewingTranslations t WHERE SIZE(e.reviewingTranslations) > 0");
649
    }
650
651
    public function testCaseSupportContainingNullIfExpression()
652
    {
653
        self::assertValidDQL("SELECT u.id, NULLIF(u.name, u.name) AS shouldBeNull FROM Doctrine\Tests\Models\CMS\CmsUser u");
654
    }
655
656
    public function testCaseSupportContainingCoalesceExpression()
657
    {
658
        self::assertValidDQL("select COALESCE(NULLIF(u.name, ''), u.username) as Display FROM Doctrine\Tests\Models\CMS\CmsUser u");
659
    }
660
661
    /**
662
     * @group DDC-1858
663
     */
664
    public function testHavingSupportIsNullExpression()
665
    {
666
        self::assertValidDQL("SELECT u.name FROM Doctrine\Tests\Models\CMS\CmsUser u HAVING u.username IS NULL");
667
    }
668
669
    /**
670
     * @group DDC-3085
671
     */
672
    public function testHavingSupportResultVariableInNullComparisonExpression()
673
    {
674
        self::assertValidDQL("SELECT u AS user, SUM(a.id) AS score FROM Doctrine\Tests\Models\CMS\CmsUser u LEFT JOIN Doctrine\Tests\Models\CMS\CmsAddress a WITH a.user = u GROUP BY u HAVING score IS NOT NULL AND score >= 5");
675
    }
676
677
    /**
678
     * @group DDC-1858
679
     */
680
    public function testHavingSupportLikeExpression()
681
    {
682
        self::assertValidDQL("SELECT _u.id, count(_articles) as uuuu FROM Doctrine\Tests\Models\CMS\CmsUser _u LEFT JOIN _u.articles _articles GROUP BY _u HAVING uuuu LIKE '3'");
683
    }
684
685
    /**
686
     * @group DDC-3018
687
     */
688
    public function testNewLiteralExpression()
689
    {
690
        self::assertValidDQL("SELECT new " . __NAMESPACE__ . "\\DummyStruct(u.id, 'foo', 1, true) FROM Doctrine\Tests\Models\CMS\CmsUser u");
691
    }
692
693
    /**
694
     * @group DDC-3075
695
     */
696
    public function testNewLiteralWithSubselectExpression()
697
    {
698
        self::assertValidDQL("SELECT new " . __NAMESPACE__ . "\\DummyStruct(u.id, 'foo', (SELECT 1 FROM Doctrine\Tests\Models\CMS\CmsUser su), true) FROM Doctrine\Tests\Models\CMS\CmsUser u");
699
    }
700
}
701
702
/** @ORM\Entity */
703
class DQLKeywordsModelUser
704
{
705
    /** @ORM\Id @ORM\Column(type="integer") @ORM\GeneratedValue */
706
    private $id;
707
    /** @ORM\OneToOne(targetEntity=DQLKeywordsModelGroup::class) */
708
    private $group;
709
}
710
711
/** @ORM\Entity */
712
class DQLKeywordsModelGroup
713
{
714
    /** @ORM\Id @ORM\Column(type="integer") @ORM\GeneratedValue */
715
    private $id;
716
    /** @ORM\Column */
717
    private $from;
718
}
719
720
class DummyStruct
721
{
722
    public function __construct($id, $arg1, $arg2, $arg3)
723
    {
724
    }
725
}
726