Completed
Push — master ( 3ca682...b22cda )
by Marco
09:29
created

LanguageRecognitionTest::testMemberOfExpression()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 2

Duplication

Lines 0
Ratio 0 %
Metric Value
dl 0
loc 5
rs 9.4286
cc 1
eloc 2
nc 1
nop 0
1
<?php
2
namespace Doctrine\Tests\ORM\Query;
3
4
use Doctrine\ORM\EntityManagerInterface;
5
use Doctrine\ORM\Query,
6
    Doctrine\ORM\Query\QueryException;
7
8
class LanguageRecognitionTest extends \Doctrine\Tests\OrmTestCase
9
{
10
    /**
11
     * @var EntityManagerInterface
12
     */
13
    private $_em;
14
15
    protected function setUp()
16
    {
17
        $this->_em = $this->_getTestEntityManager();
18
    }
19
20
    public function assertValidDQL($dql, $debug = false)
21
    {
22
        try {
23
            $parserResult = $this->parseDql($dql);
0 ignored issues
show
Unused Code introduced by
$parserResult is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
24
        } catch (QueryException $e) {
25
            if ($debug) {
26
                echo $e->getTraceAsString() . PHP_EOL;
27
            }
28
29
            $this->fail($e->getMessage());
30
        }
31
    }
32
33
    public function assertInvalidDQL($dql, $debug = false)
34
    {
35
        try {
36
            $parserResult = $this->parseDql($dql);
0 ignored issues
show
Unused Code introduced by
$parserResult is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
37
38
            $this->fail('No syntax errors were detected, when syntax errors were expected');
39
        } catch (QueryException $e) {
40
            if ($debug) {
41
                echo $e->getMessage() . PHP_EOL;
42
                echo $e->getTraceAsString() . PHP_EOL;
43
            }
44
        }
45
    }
46
47
    public function parseDql($dql, $hints = array())
48
    {
49
        $query = $this->_em->createQuery($dql);
50
        $query->setHint(Query::HINT_FORCE_PARTIAL_LOAD, true);
51
        $query->setDql($dql);
52
53
        foreach ($hints as $key => $value) {
54
        	$query->setHint($key, $value);
55
        }
56
57
        $parser = new \Doctrine\ORM\Query\Parser($query);
58
59
        // We do NOT test SQL output here. That only unnecessarily slows down the tests!
60
        $parser->setCustomOutputTreeWalker('Doctrine\Tests\Mocks\MockTreeWalker');
61
62
        return $parser->parse();
63
    }
64
65
    public function testEmptyQueryString()
66
    {
67
        $this->assertInvalidDQL('');
68
    }
69
70
    public function testPlainFromClauseWithAlias()
71
    {
72
        $this->assertValidDQL('SELECT u.id FROM Doctrine\Tests\Models\CMS\CmsUser u');
73
    }
74
75
    public function testSelectSingleComponentWithAsterisk()
76
    {
77
        $this->assertValidDQL('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u');
78
    }
79
80
    /**
81
     * @dataProvider invalidDQL
82
     */
83
    public function testRejectsInvalidDQL($dql)
84
    {
85
        $this->setExpectedException('\Doctrine\ORM\Query\QueryException');
86
87
        $this->_em->getConfiguration()->setEntityNamespaces(array(
88
            'Unknown' => 'Unknown',
89
            'CMS' => 'Doctrine\Tests\Models\CMS'
90
        ));
91
92
        $this->parseDql($dql);
93
    }
94
95
    public function invalidDQL()
96
    {
97
        return array(
98
99
            array('SELECT \'foo\' AS foo\bar FROM Doctrine\Tests\Models\CMS\CmsUser u'),
100
            /* Checks for invalid IdentificationVariables and AliasIdentificationVariables */
101
            array('SELECT \foo FROM Doctrine\Tests\Models\CMS\CmsUser \foo'),
102
            array('SELECT foo\ FROM Doctrine\Tests\Models\CMS\CmsUser foo\\'),
103
            array('SELECT foo\bar FROM Doctrine\Tests\Models\CMS\CmsUser foo\bar'),
104
            array('SELECT foo:bar FROM Doctrine\Tests\Models\CMS\CmsUser foo:bar'),
105
            array('SELECT foo: FROM Doctrine\Tests\Models\CMS\CmsUser foo:'),
106
107
            /* Checks for invalid AbstractSchemaName */
108
            array('SELECT u FROM UnknownClass u'),  // unknown
109
            array('SELECT u FROM Unknown\Class u'), // unknown with namespace
110
            array('SELECT u FROM \Unknown\Class u'), // unknown, leading backslash
111
            array('SELECT u FROM Unknown\\\\Class u'), // unknown, syntactically bogus (duplicate \\)
112
            array('SELECT u FROM Unknown\Class\ u'), // unknown, syntactically bogus (trailing \)
113
            array('SELECT u FROM Unknown:Class u'), // unknown, with namespace alias
114
            array('SELECT u FROM Unknown::Class u'), // unknown, with PAAMAYIM_NEKUDOTAYIM
115
            array('SELECT u FROM Unknown:Class:Name u'), // unknown, with invalid namespace alias
116
            array('SELECT u FROM UnknownClass: u'), // unknown, with invalid namespace alias
117
            array('SELECT u FROM Unknown:Class: u'), // unknown, with invalid namespace alias
118
            array('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 \)
119
            array('SELECT u FROM CMS::User u'),
120
            array('SELECT u FROM CMS:User: u'),
121
            array('SELECT u FROM CMS:User:Foo u'),
122
123
            /* Checks for invalid AliasResultVariable */
124
            array('SELECT \'foo\' AS \foo FROM Doctrine\Tests\Models\CMS\CmsUser u'),
125
            array('SELECT \'foo\' AS \foo\bar FROM Doctrine\Tests\Models\CMS\CmsUser u'),
126
            array('SELECT \'foo\' AS foo\ FROM Doctrine\Tests\Models\CMS\CmsUser u'),
127
            array('SELECT \'foo\' AS foo\\\\bar FROM Doctrine\Tests\Models\CMS\CmsUser u'),
128
            array('SELECT \'foo\' AS foo: FROM Doctrine\Tests\Models\CMS\CmsUser u'),
129
            array('SELECT \'foo\' AS foo:bar FROM Doctrine\Tests\Models\CMS\CmsUser u'),
130
        );
131
    }
132
133
    public function testSelectSingleComponentWithMultipleColumns()
134
    {
135
        $this->assertValidDQL('SELECT u.name, u.username FROM Doctrine\Tests\Models\CMS\CmsUser u');
136
    }
137
138
    public function testSelectMultipleComponentsUsingMultipleFrom()
139
    {
140
        $this->assertValidDQL('SELECT u, p FROM Doctrine\Tests\Models\CMS\CmsUser u, Doctrine\Tests\Models\CMS\CmsPhonenumber p WHERE u = p.user');
141
    }
142
143
    public function testSelectMultipleComponentsWithAsterisk()
144
    {
145
        $this->assertValidDQL('SELECT u, p FROM Doctrine\Tests\Models\CMS\CmsUser u JOIN u.phonenumbers p');
146
    }
147
148
    public function testSelectDistinctIsSupported()
149
    {
150
        $this->assertValidDQL('SELECT DISTINCT u.name FROM Doctrine\Tests\Models\CMS\CmsUser u');
151
    }
152
153
    public function testAggregateFunctionInSelect()
154
    {
155
        $this->assertValidDQL('SELECT COUNT(u.id) FROM Doctrine\Tests\Models\CMS\CmsUser u');
156
    }
157
158
    public function testMultipleParenthesisInSelect()
159
    {
160
        $this->assertValidDQL('SELECT (((u.id))) as v FROM Doctrine\Tests\Models\CMS\CmsUser u');
161
    }
162
163
    public function testDuplicatedAliasInAggregateFunction()
164
    {
165
        $this->assertInvalidDQL('SELECT COUNT(u.id) AS num, SUM(u.id) AS num FROM Doctrine\Tests\Models\CMS\CmsUser u');
166
    }
167
168
    public function testAggregateFunctionWithDistinctInSelect()
169
    {
170
        $this->assertValidDQL('SELECT COUNT(DISTINCT u.name) FROM Doctrine\Tests\Models\CMS\CmsUser u');
171
    }
172
173
    public function testFunctionalExpressionsSupportedInWherePart()
174
    {
175
        $this->assertValidDQL("SELECT u.name FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE TRIM(u.name) = 'someone'");
176
    }
177
178
    public function testArithmeticExpressionsSupportedInWherePart()
179
    {
180
        $this->assertValidDQL('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE ((u.id + 5000) * u.id + 3) < 10000000');
181
    }
182
183
    public function testInExpressionSupportedInWherePart()
184
    {
185
        $this->assertValidDQL('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id IN (1, 2)');
186
    }
187
188
    public function testInExpressionWithoutSpacesSupportedInWherePart()
189
    {
190
        $this->assertValidDQL('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id IN (1,2,3)');
191
    }
192
193
    public function testNotInExpressionSupportedInWherePart()
194
    {
195
        $this->assertValidDQL('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id NOT IN (1)');
196
    }
197
198
    public function testInExpressionWithSingleValuedAssociationPathExpression()
199
    {
200
        $this->assertValidDQL("SELECT u FROM Doctrine\Tests\Models\Forum\ForumUser u WHERE u.avatar IN (?1, ?2)");
201
    }
202
203
    public function testInvalidInExpressionWithCollectionValuedAssociationPathExpression()
204
    {
205
        $this->assertInvalidDQL("SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.phonenumbers IN (?1, ?2)");
206
    }
207
208
    public function testInstanceOfExpressionSupportedInWherePart()
209
    {
210
        $this->assertValidDQL('SELECT u FROM Doctrine\Tests\Models\Company\CompanyPerson u WHERE u INSTANCE OF Doctrine\Tests\Models\Company\CompanyEmployee');
211
    }
212
213
    public function testInstanceOfExpressionWithInputParamSupportedInWherePart()
214
    {
215
        $this->assertValidDQL('SELECT u FROM Doctrine\Tests\Models\Company\CompanyPerson u WHERE u INSTANCE OF ?1');
216
    }
217
218
    public function testNotInstanceOfExpressionSupportedInWherePart()
219
    {
220
        $this->assertValidDQL('SELECT u FROM Doctrine\Tests\Models\Company\CompanyPerson u WHERE u NOT INSTANCE OF ?1');
221
    }
222
223
    public function testExistsExpressionSupportedInWherePart()
224
    {
225
        $this->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)');
226
    }
227
228
    public function testNotExistsExpressionSupportedInWherePart()
229
    {
230
        $this->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)');
231
    }
232
233
    public function testAggregateFunctionInHavingClause()
234
    {
235
        $this->assertValidDQL('SELECT u.name FROM Doctrine\Tests\Models\CMS\CmsUser u LEFT JOIN u.phonenumbers p HAVING COUNT(p.phonenumber) > 2');
236
        $this->assertValidDQL("SELECT u.name FROM Doctrine\Tests\Models\CMS\CmsUser u LEFT JOIN u.phonenumbers p HAVING MAX(u.name) = 'romanb'");
237
    }
238
239
    public function testLeftJoin()
240
    {
241
        $this->assertValidDQL('SELECT u, p FROM Doctrine\Tests\Models\CMS\CmsUser u LEFT JOIN u.phonenumbers p');
242
    }
243
244
    public function testJoin()
245
    {
246
        $this->assertValidDQL('SELECT u,p FROM Doctrine\Tests\Models\CMS\CmsUser u JOIN u.phonenumbers p');
247
    }
248
249
    public function testInnerJoin()
250
    {
251
        $this->assertValidDQL('SELECT u, p FROM Doctrine\Tests\Models\CMS\CmsUser u INNER JOIN u.phonenumbers p');
252
    }
253
254
    public function testMultipleLeftJoin()
255
    {
256
        $this->assertValidDQL('SELECT u, a, p FROM Doctrine\Tests\Models\CMS\CmsUser u LEFT JOIN u.articles a LEFT JOIN u.phonenumbers p');
257
    }
258
259
    public function testMultipleInnerJoin()
260
    {
261
        $this->assertValidDQL('SELECT u.name FROM Doctrine\Tests\Models\CMS\CmsUser u INNER JOIN u.articles a INNER JOIN u.phonenumbers p');
262
    }
263
264
    public function testMixingOfJoins()
265
    {
266
        $this->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');
267
    }
268
269
    public function testJoinClassPathUsingWITH()
270
    {
271
        $this->assertValidDQL('SELECT u.name FROM Doctrine\Tests\Models\CMS\CmsUser u JOIN Doctrine\Tests\Models\CMS\CmsArticle a WITH a.user = u.id');
272
    }
273
274
    /**
275
     * @group DDC-3701
276
     */
277
    public function testJoinClassPathUsingWHERE()
278
    {
279
        $this->assertValidDQL('SELECT u.name FROM Doctrine\Tests\Models\CMS\CmsUser u JOIN Doctrine\Tests\Models\CMS\CmsArticle a WHERE a.user = u.id');
280
    }
281
282
    /**
283
     * @group DDC-3701
284
     */
285
    public function testDDC3701WHEREIsNotWITH()
286
    {
287
        $this->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');
288
    }
289
290
    public function testOrderBySingleColumn()
291
    {
292
        $this->assertValidDQL('SELECT u.name FROM Doctrine\Tests\Models\CMS\CmsUser u ORDER BY u.name');
293
    }
294
295
    public function testOrderBySingleColumnAscending()
296
    {
297
        $this->assertValidDQL('SELECT u.name FROM Doctrine\Tests\Models\CMS\CmsUser u ORDER BY u.name ASC');
298
    }
299
300
    public function testOrderBySingleColumnDescending()
301
    {
302
        $this->assertValidDQL('SELECT u.name FROM Doctrine\Tests\Models\CMS\CmsUser u ORDER BY u.name DESC');
303
    }
304
305
    public function testOrderByMultipleColumns()
306
    {
307
        $this->assertValidDQL('SELECT u.name, u.username FROM Doctrine\Tests\Models\CMS\CmsUser u ORDER BY u.username DESC, u.name DESC');
308
    }
309
310
    public function testSubselectInInExpression()
311
    {
312
        $this->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')");
313
    }
314
315
    public function testSubselectInSelectPart()
316
    {
317
        $this->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'");
318
    }
319
320
    public function testArithmeticExpressionInSelectPart()
321
    {
322
        $this->assertValidDQL("SELECT SUM(u.id) / COUNT(u.id) FROM Doctrine\Tests\Models\CMS\CmsUser u");
323
    }
324
325
    public function testArithmeticExpressionInSubselectPart()
326
    {
327
        $this->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'");
328
    }
329
330
    public function testArithmeticExpressionWithParenthesisInSubselectPart()
331
    {
332
        $this->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'");
333
    }
334
335
    /**
336
     * @group DDC-1079
337
     */
338
    public function testSelectLiteralInSubselect()
339
    {
340
        $this->assertValidDQL('SELECT (SELECT 1 FROM Doctrine\Tests\Models\CMS\CmsUser u2) value FROM Doctrine\Tests\Models\CMS\CmsUser u');
341
        $this->assertValidDQL('SELECT (SELECT 0 FROM Doctrine\Tests\Models\CMS\CmsUser u2) value FROM Doctrine\Tests\Models\CMS\CmsUser u');
342
    }
343
344
    /**
345
     * @group DDC-1077
346
     */
347
    public function testConstantValueInSelect()
348
    {
349
        $this->assertValidDQL("SELECT u.name, 'foo' AS bar FROM Doctrine\Tests\Models\CMS\CmsUser u", true);
350
    }
351
352
    public function testDuplicateAliasInSubselectPart()
353
    {
354
        $this->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'");
355
    }
356
357
    public function testPositionalInputParameter()
358
    {
359
        $this->assertValidDQL('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = ?1');
360
    }
361
362
    public function testNamedInputParameter()
363
    {
364
        $this->assertValidDQL('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = :id');
365
    }
366
367
    public function testJoinConditionOverrideNotSupported()
368
    {
369
        $this->assertInvalidDQL("SELECT u.name, p FROM Doctrine\Tests\Models\CMS\CmsUser u LEFT JOIN u.phonenumbers p ON p.phonenumber = '123 123'");
370
    }
371
372
    public function testIndexByClauseWithOneComponent()
373
    {
374
        $this->assertValidDQL('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u INDEX BY u.id');
375
    }
376
377
    public function testIndexBySupportsJoins()
378
    {
379
        $this->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
380
    }
381
382
    public function testIndexBySupportsJoins2()
383
    {
384
        $this->assertValidDQL('SELECT u, p FROM Doctrine\Tests\Models\CMS\CmsUser u INDEX BY u.id LEFT JOIN u.phonenumbers p INDEX BY p.phonenumber');
385
    }
386
387
    public function testBetweenExpressionSupported()
388
    {
389
        $this->assertValidDQL("SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.name BETWEEN 'jepso' AND 'zYne'");
390
    }
391
392
    public function testNotBetweenExpressionSupported()
393
    {
394
        $this->assertValidDQL("SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.name NOT BETWEEN 'jepso' AND 'zYne'");
395
    }
396
397
    public function testLikeExpression()
398
    {
399
        $this->assertValidDQL("SELECT u.id FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.name LIKE 'z%'");
400
    }
401
402
    public function testNotLikeExpression()
403
    {
404
        $this->assertValidDQL("SELECT u.id FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.name NOT LIKE 'z%'");
405
    }
406
407
    public function testLikeExpressionWithCustomEscapeCharacter()
408
    {
409
        $this->assertValidDQL("SELECT u.id FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.name LIKE 'z|%' ESCAPE '|'");
410
    }
411
412
    public function testFieldComparisonWithoutAlias()
413
    {
414
        $this->assertInvalidDQL("SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE id = 1");
415
    }
416
417
    public function testDuplicatedAliasDeclaration()
418
    {
419
        $this->assertInvalidDQL("SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u INNER JOIN u.articles u WHERE u.id = 1");
420
    }
421
422
    public function testImplicitJoinInWhereOnSingleValuedAssociationPathExpression()
423
    {
424
        // This should be allowed because avatar is a single-value association.
425
        // SQL: SELECT ... FROM forum_user fu INNER JOIN forum_avatar fa ON fu.avatar_id = fa.id WHERE fa.id = ?
426
        $this->assertValidDQL("SELECT u FROM Doctrine\Tests\Models\Forum\ForumUser u JOIN u.avatar a WHERE a.id = ?1");
427
    }
428
429
    public function testImplicitJoinInWhereOnCollectionValuedPathExpression()
430
    {
431
        // This should be forbidden, because articles is a collection
432
        $this->assertInvalidDQL("SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u JOIN u.articles a WHERE a.title = ?");
433
    }
434
435
    public function testInvalidSyntaxIsRejected()
436
    {
437
        $this->assertInvalidDQL("FOOBAR CmsUser");
438
        $this->assertInvalidDQL("DELETE FROM Doctrine\Tests\Models\CMS\CmsUser.articles");
439
        $this->assertInvalidDQL("SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u JOIN u.articles.comments");
440
441
        // Currently UNDEFINED OFFSET error
442
        $this->assertInvalidDQL("SELECT c FROM CmsUser.articles.comments c");
443
    }
444
445
    public function testUpdateWorksWithOneField()
446
    {
447
        $this->assertValidDQL("UPDATE Doctrine\Tests\Models\CMS\CmsUser u SET u.name = 'someone'");
448
    }
449
450
    public function testUpdateWorksWithMultipleFields()
451
    {
452
        $this->assertValidDQL("UPDATE Doctrine\Tests\Models\CMS\CmsUser u SET u.name = 'someone', u.username = 'some'");
453
    }
454
455
    public function testUpdateSupportsConditions()
456
    {
457
        $this->assertValidDQL("UPDATE Doctrine\Tests\Models\CMS\CmsUser u SET u.name = 'someone' WHERE u.id = 5");
458
    }
459
460
    public function testDeleteAll()
461
    {
462
        $this->assertValidDQL('DELETE FROM Doctrine\Tests\Models\CMS\CmsUser u');
463
    }
464
465
    public function testDeleteWithCondition()
466
    {
467
        $this->assertValidDQL('DELETE FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = 3');
468
    }
469
470
    /**
471
     * The main use case for this generalized style of join is when a join condition
472
     * does not involve a foreign key relationship that is mapped to an entity relationship.
473
     */
474
    public function testImplicitJoinWithCartesianProductAndConditionInWhere()
475
    {
476
        $this->assertValidDQL("SELECT u, a FROM Doctrine\Tests\Models\CMS\CmsUser u, Doctrine\Tests\Models\CMS\CmsArticle a WHERE u.name = a.topic");
477
    }
478
479
    public function testAllExpressionWithCorrelatedSubquery()
480
    {
481
        $this->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)');
482
    }
483
484
    public function testCustomJoinsAndWithKeywordSupported()
485
    {
486
        $this->assertValidDQL('SELECT u, p FROM Doctrine\Tests\Models\CMS\CmsUser u INNER JOIN u.phonenumbers p WITH p.phonenumber = 123 WHERE u.id = 1');
487
    }
488
489
    public function testAnyExpressionWithCorrelatedSubquery()
490
    {
491
        $this->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)');
492
    }
493
494
    public function testSomeExpressionWithCorrelatedSubquery()
495
    {
496
        $this->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)');
497
    }
498
499
    public function testArithmeticExpressionWithoutParenthesisInWhereClause()
500
    {
501
        $this->assertValidDQL('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE SIZE(u.phonenumbers) + 1 > 10');
502
    }
503
504
    public function testMemberOfExpression()
505
    {
506
        $this->assertValidDQL('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE :param MEMBER OF u.phonenumbers');
507
        //$this->assertValidDQL("SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE 'Joe' MEMBER OF u.nicknames");
508
    }
509
510
    public function testSizeFunction()
511
    {
512
        $this->assertValidDQL('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE SIZE(u.phonenumbers) > 1');
513
    }
514
515
    public function testEmptyCollectionComparisonExpression()
516
    {
517
        $this->assertValidDQL('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.phonenumbers IS EMPTY');
518
    }
519
520
    public function testSingleValuedAssociationFieldInWhere()
521
    {
522
        $this->assertValidDQL('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.address = ?1');
523
        $this->assertValidDQL('SELECT p FROM Doctrine\Tests\Models\CMS\CmsPhonenumber p WHERE p.user = ?1');
524
    }
525
526
    public function testBooleanLiteralInWhere()
527
    {
528
        $this->assertValidDQL('SELECT b FROM Doctrine\Tests\Models\Generic\BooleanModel b WHERE b.booleanField = true');
529
    }
530
531
    public function testSubqueryInSelectExpression()
532
    {
533
        $this->assertValidDQL('select u, (select max(p.phonenumber) from Doctrine\Tests\Models\CMS\CmsPhonenumber p) maxId from Doctrine\Tests\Models\CMS\CmsUser u');
534
    }
535
536
    public function testUsageOfQComponentOutsideSubquery()
537
    {
538
        $this->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');
539
    }
540
541
    public function testUnknownAbstractSchemaName()
542
    {
543
        $this->assertInvalidDQL('SELECT u FROM UnknownClassName u');
544
    }
545
546
    public function testCorrectPartialObjectLoad()
547
    {
548
        $this->assertValidDQL('SELECT PARTIAL u.{id,name} FROM Doctrine\Tests\Models\CMS\CmsUser u');
549
    }
550
551
    public function testIncorrectPartialObjectLoadBecauseOfMissingIdentifier()
552
    {
553
        $this->assertInvalidDQL('SELECT PARTIAL u.{name} FROM Doctrine\Tests\Models\CMS\CmsUser u');
554
    }
555
556
    public function testScalarExpressionInSelect()
557
    {
558
        $this->assertValidDQL('SELECT u, 42 + u.id AS someNumber FROM Doctrine\Tests\Models\CMS\CmsUser u');
559
    }
560
561
    public function testInputParameterInSelect()
562
    {
563
        $this->assertValidDQL('SELECT u, u.id + ?1 AS someNumber FROM Doctrine\Tests\Models\CMS\CmsUser u');
564
    }
565
566
    /**
567
     * @group DDC-1091
568
     */
569
    public function testCustomFunctionsReturningStringInStringPrimary()
570
    {
571
        $this->_em->getConfiguration()->addCustomStringFunction('CC', 'Doctrine\ORM\Query\AST\Functions\ConcatFunction');
572
573
        $this->assertValidDQL("SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE CC('%', u.name) LIKE '%foo%'", true);
574
    }
575
576
    /**
577
     * @group DDC-505
578
     */
579
    public function testDQLKeywordInJoinIsAllowed()
580
    {
581
        $this->assertValidDQL('SELECT u FROM ' . __NAMESPACE__ . '\DQLKeywordsModelUser u JOIN u.group g');
582
    }
583
584
    /**
585
     * @group DDC-505
586
     */
587
    public function testDQLKeywordInConditionIsAllowed()
588
    {
589
        $this->assertValidDQL('SELECT g FROM ' . __NAMESPACE__ . '\DQLKeywordsModelGroup g WHERE g.from=0');
590
    }
591
592
    /* The exception is currently thrown in the SQLWalker, not earlier.
593
    public function testInverseSideSingleValuedAssociationPathNotAllowed()
594
    {
595
        $this->assertInvalidDQL('SELECT u.id FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.address = ?1');
596
    }
597
    */
598
599
    /**
600
     * @group DDC-617
601
     */
602
    public function testSelectOnlyNonRootEntityAlias()
603
    {
604
        $this->assertInvalidDQL('SELECT g FROM Doctrine\Tests\Models\CMS\CmsUser u JOIN u.groups g');
605
    }
606
607
    /**
608
     * @group DDC-1108
609
     */
610
    public function testInputParameterSingleChar()
611
    {
612
        $this->assertValidDQL('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.name = :q');
613
    }
614
615
    /**
616
     * @group DDC-1053
617
     */
618
    public function testGroupBy()
619
    {
620
        $this->assertValidDQL('SELECT g.id, count(u.id) FROM Doctrine\Tests\Models\CMS\CmsGroup g JOIN g.users u GROUP BY g.id');
621
    }
622
623
    /**
624
     * @group DDC-1053
625
     */
626
    public function testGroupByIdentificationVariable()
627
    {
628
        $this->assertValidDQL('SELECT g, count(u.id) FROM Doctrine\Tests\Models\CMS\CmsGroup g JOIN g.users u GROUP BY g');
629
    }
630
631
    /**
632
     * @group DDC-1053
633
     */
634
    public function testGroupByUnknownIdentificationVariable()
635
    {
636
        $this->assertInvalidDQL('SELECT g, count(u.id) FROM Doctrine\Tests\Models\CMS\CmsGroup g JOIN g.users u GROUP BY m');
637
    }
638
639
    /**
640
     * @group DDC-117
641
     */
642
    public function testSizeOfForeignKeyOneToManyPrimaryKeyEntity()
643
    {
644
        $this->assertValidDQL("SELECT a, t FROM Doctrine\Tests\Models\DDC117\DDC117Article a JOIN a.translations t WHERE SIZE(a.translations) > 0");
645
    }
646
647
    /**
648
     * @group DDC-117
649
     */
650
    public function testSizeOfForeignKeyManyToManyPrimaryKeyEntity()
651
    {
652
        $this->assertValidDQL("SELECT e, t FROM Doctrine\Tests\Models\DDC117\DDC117Editor e JOIN e.reviewingTranslations t WHERE SIZE(e.reviewingTranslations) > 0");
653
    }
654
655
    public function testCaseSupportContainingNullIfExpression()
656
    {
657
        $this->assertValidDQL("SELECT u.id, NULLIF(u.name, u.name) AS shouldBeNull FROM Doctrine\Tests\Models\CMS\CmsUser u");
658
    }
659
660
    public function testCaseSupportContainingCoalesceExpression()
661
    {
662
        $this->assertValidDQL("select COALESCE(NULLIF(u.name, ''), u.username) as Display FROM Doctrine\Tests\Models\CMS\CmsUser u");
663
    }
664
665
    /**
666
     * @group DDC-1858
667
     */
668
    public function testHavingSupportIsNullExpression()
669
    {
670
        $this->assertValidDQL("SELECT u.name FROM Doctrine\Tests\Models\CMS\CmsUser u HAVING u.username IS NULL");
671
    }
672
    
673
    /**
674
     * @group DDC-3085
675
     */
676
    public function testHavingSupportResultVariableInNullComparisonExpression()
677
    {
678
        $this->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");
679
    }
680
681
    /**
682
     * @group DDC-1858
683
     */
684
    public function testHavingSupportLikeExpression()
685
    {
686
        $this->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'");
687
    }
688
689
    /**
690
     * @group DDC-3018
691
     */
692
    public function testNewLiteralExpression()
693
    {
694
        $this->assertValidDQL("SELECT new " . __NAMESPACE__ . "\\DummyStruct(u.id, 'foo', 1, true) FROM Doctrine\Tests\Models\CMS\CmsUser u");
695
    }
696
697
    /**
698
     * @group DDC-3075
699
     */
700
    public function testNewLiteralWithSubselectExpression()
701
    {
702
        $this->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");
703
    }
704
}
705
706
/** @Entity */
707
class DQLKeywordsModelUser
708
{
709
    /** @Id @Column(type="integer") @GeneratedValue */
710
    private $id;
711
    /** @OneToOne(targetEntity="DQLKeywordsModelGroup") */
712
    private $group;
713
}
714
715
/** @Entity */
716
class DQLKeywordsModelGroup
717
{
718
    /** @Id @Column(type="integer") @GeneratedValue */
719
    private $id;
720
    /** @Column */
721
    private $from;
722
}
723
724
class DummyStruct
725
{
726
    public function __construct($id, $arg1, $arg2, $arg3)
0 ignored issues
show
Unused Code introduced by
The parameter $id is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Unused Code introduced by
The parameter $arg1 is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Unused Code introduced by
The parameter $arg2 is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Unused Code introduced by
The parameter $arg3 is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
727
    {
728
    }
729
}
730