Rajout de doctrine/orm
[zf2.biz/galerie.git] / vendor / doctrine / orm / tests / Doctrine / Tests / ORM / Query / SelectSqlGenerationTest.php
1 <?php
2
3 namespace Doctrine\Tests\ORM\Query;
4
5 use Doctrine\DBAL\Types\Type as DBALType;
6 use Doctrine\ORM\Query;
7
8 require_once __DIR__ . '/../../TestInit.php';
9
10 class SelectSqlGenerationTest extends \Doctrine\Tests\OrmTestCase
11 {
12     private $_em;
13
14     protected function setUp()
15     {
16         $this->_em = $this->_getTestEntityManager();
17     }
18
19     /**
20      * Assert a valid SQL generation.
21      *
22      * @param string $dqlToBeTested
23      * @param string $sqlToBeConfirmed
24      * @param array $queryHints
25      * @param array $queryParams
26      */
27     public function assertSqlGeneration($dqlToBeTested, $sqlToBeConfirmed, array $queryHints = array(), array $queryParams = array())
28     {
29         try {
30             $query = $this->_em->createQuery($dqlToBeTested);
31
32             foreach ($queryParams AS $name => $value) {
33                 $query->setParameter($name, $value);
34             }
35
36             $query->setHint(Query::HINT_FORCE_PARTIAL_LOAD, true)
37                   ->useQueryCache(false);
38
39             foreach ($queryHints AS $name => $value) {
40                 $query->setHint($name, $value);
41             }
42
43             $sqlGenerated = $query->getSQL();
44
45             parent::assertEquals(
46                 $sqlToBeConfirmed,
47                 $sqlGenerated,
48                 sprintf('"%s" is not equal of "%s"', $sqlGenerated, $sqlToBeConfirmed)
49             );
50
51             $query->free();
52         } catch (\Exception $e) {
53             $this->fail($e->getMessage() ."\n".$e->getTraceAsString());
54         }
55     }
56
57     /**
58      * Asser an invalid SQL generation.
59      *
60      * @param string $dqlToBeTested
61      * @param string $expectedException
62      * @param array $queryHints
63      * @param array $queryParams
64      */
65     public function assertInvalidSqlGeneration($dqlToBeTested, $expectedException, array $queryHints = array(), array $queryParams = array())
66     {
67         $this->setExpectedException($expectedException);
68
69         $query = $this->_em->createQuery($dqlToBeTested);
70
71         foreach ($queryParams AS $name => $value) {
72             $query->setParameter($name, $value);
73         }
74
75         $query->setHint(Query::HINT_FORCE_PARTIAL_LOAD, true)
76               ->useQueryCache(false);
77
78         foreach ($queryHints AS $name => $value) {
79             $query->setHint($name, $value);
80         }
81
82         $sql = $query->getSql();
83         $query->free();
84
85         // If we reached here, test failed
86         $this->fail($sql);
87     }
88
89
90     public function testSupportsSelectForAllFields()
91     {
92         $this->assertSqlGeneration(
93             'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u',
94             'SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 FROM cms_users c0_'
95         );
96     }
97
98     public function testSupportsSelectForOneField()
99     {
100         $this->assertSqlGeneration(
101             'SELECT u.id FROM Doctrine\Tests\Models\CMS\CmsUser u',
102             'SELECT c0_.id AS id0 FROM cms_users c0_'
103         );
104     }
105
106     public function testSupportsSelectForOneNestedField()
107     {
108         $this->assertSqlGeneration(
109             'SELECT u.id FROM Doctrine\Tests\Models\CMS\CmsArticle a JOIN a.user u',
110             'SELECT c0_.id AS id0 FROM cms_articles c1_ INNER JOIN cms_users c0_ ON c1_.user_id = c0_.id'
111         );
112     }
113
114     public function testSupportsSelectForAllNestedField()
115     {
116         $this->assertSqlGeneration(
117             'SELECT a FROM Doctrine\Tests\Models\CMS\CmsArticle a JOIN a.user u ORDER BY u.name ASC',
118             'SELECT c0_.id AS id0, c0_.topic AS topic1, c0_.text AS text2, c0_.version AS version3 FROM cms_articles c0_ INNER JOIN cms_users c1_ ON c0_.user_id = c1_.id ORDER BY c1_.name ASC'
119         );
120     }
121
122     public function testSupportsSelectForMultipleColumnsOfASingleComponent()
123     {
124         $this->assertSqlGeneration(
125             'SELECT u.username, u.name FROM Doctrine\Tests\Models\CMS\CmsUser u',
126             'SELECT c0_.username AS username0, c0_.name AS name1 FROM cms_users c0_'
127         );
128     }
129
130     public function testSupportsSelectUsingMultipleFromComponents()
131     {
132         $this->assertSqlGeneration(
133             'SELECT u, p FROM Doctrine\Tests\Models\CMS\CmsUser u, Doctrine\Tests\Models\CMS\CmsPhonenumber p WHERE u = p.user',
134             'SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3, c1_.phonenumber AS phonenumber4 FROM cms_users c0_, cms_phonenumbers c1_ WHERE c0_.id = c1_.user_id'
135         );
136     }
137
138     public function testSupportsJoinOnMultipleComponents()
139     {
140         $this->assertSqlGeneration(
141             'SELECT u, p FROM Doctrine\Tests\Models\CMS\CmsUser u JOIN Doctrine\Tests\Models\CMS\CmsPhonenumber p WITH u = p.user',
142             'SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3, c1_.phonenumber AS phonenumber4 FROM cms_users c0_ INNER JOIN cms_phonenumbers c1_ ON (c0_.id = c1_.user_id)'
143         );
144     }
145
146     public function testSupportsSelectWithCollectionAssociationJoin()
147     {
148         $this->assertSqlGeneration(
149             'SELECT u, p FROM Doctrine\Tests\Models\CMS\CmsUser u JOIN u.phonenumbers p',
150             'SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3, c1_.phonenumber AS phonenumber4 FROM cms_users c0_ INNER JOIN cms_phonenumbers c1_ ON c0_.id = c1_.user_id'
151         );
152     }
153
154     public function testSupportsSelectWithSingleValuedAssociationJoin()
155     {
156         $this->assertSqlGeneration(
157             'SELECT u, a FROM Doctrine\Tests\Models\Forum\ForumUser u JOIN u.avatar a',
158             'SELECT f0_.id AS id0, f0_.username AS username1, f1_.id AS id2 FROM forum_users f0_ INNER JOIN forum_avatars f1_ ON f0_.avatar_id = f1_.id'
159         );
160     }
161
162     public function testSelectCorrelatedSubqueryComplexMathematicalExpression()
163     {
164         $this->assertSqlGeneration(
165             'SELECT (SELECT (count(p.phonenumber)+5)*10 FROM Doctrine\Tests\Models\CMS\CmsPhonenumber p JOIN p.user ui WHERE ui.id = u.id) AS c FROM Doctrine\Tests\Models\CMS\CmsUser u',
166             'SELECT (SELECT (count(c0_.phonenumber) + 5) * 10 AS sclr1 FROM cms_phonenumbers c0_ INNER JOIN cms_users c1_ ON c0_.user_id = c1_.id WHERE c1_.id = c2_.id) AS sclr0 FROM cms_users c2_'
167         );
168     }
169
170     public function testSelectComplexMathematicalExpression()
171     {
172         $this->assertSqlGeneration(
173             'SELECT (count(p.phonenumber)+5)*10 FROM Doctrine\Tests\Models\CMS\CmsPhonenumber p JOIN p.user ui WHERE ui.id = ?1',
174             'SELECT (count(c0_.phonenumber) + 5) * 10 AS sclr0 FROM cms_phonenumbers c0_ INNER JOIN cms_users c1_ ON c0_.user_id = c1_.id WHERE c1_.id = ?'
175         );
176     }
177
178     /* NOT (YET?) SUPPORTED.
179        Can be supported if SimpleSelectExpresion supports SingleValuedPathExpression instead of StateFieldPathExpression.
180
181     public function testSingleAssociationPathExpressionInSubselect()
182     {
183         $this->assertSqlGeneration(
184             'SELECT (SELECT p.user FROM Doctrine\Tests\Models\CMS\CmsPhonenumber p WHERE p.user = u) user_id FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = ?1',
185             'SELECT (SELECT c0_.user_id FROM cms_phonenumbers c0_ WHERE c0_.user_id = c1_.id) AS sclr0 FROM cms_users c1_ WHERE c1_.id = ?'
186         );
187     }*/
188
189     /**
190      * @group DDC-1077
191      */
192     public function testConstantValueInSelect()
193     {
194         $this->assertSqlGeneration(
195             "SELECT u.name, 'foo' AS bar FROM Doctrine\Tests\Models\CMS\CmsUser u",
196             "SELECT c0_.name AS name0, 'foo' AS sclr1 FROM cms_users c0_"
197         );
198     }
199
200     public function testSupportsOrderByWithAscAsDefault()
201     {
202         $this->assertSqlGeneration(
203             'SELECT u FROM Doctrine\Tests\Models\Forum\ForumUser u ORDER BY u.id',
204             'SELECT f0_.id AS id0, f0_.username AS username1 FROM forum_users f0_ ORDER BY f0_.id ASC'
205         );
206     }
207
208     public function testSupportsOrderByAsc()
209     {
210         $this->assertSqlGeneration(
211             'SELECT u FROM Doctrine\Tests\Models\Forum\ForumUser u ORDER BY u.id asc',
212             'SELECT f0_.id AS id0, f0_.username AS username1 FROM forum_users f0_ ORDER BY f0_.id ASC'
213         );
214     }
215     public function testSupportsOrderByDesc()
216     {
217         $this->assertSqlGeneration(
218             'SELECT u FROM Doctrine\Tests\Models\Forum\ForumUser u ORDER BY u.id desc',
219             'SELECT f0_.id AS id0, f0_.username AS username1 FROM forum_users f0_ ORDER BY f0_.id DESC'
220         );
221     }
222
223     public function testSupportsSelectDistinct()
224     {
225         $this->assertSqlGeneration(
226             'SELECT DISTINCT u.name FROM Doctrine\Tests\Models\CMS\CmsUser u',
227             'SELECT DISTINCT c0_.name AS name0 FROM cms_users c0_'
228         );
229     }
230
231     public function testSupportsAggregateFunctionInSelectedFields()
232     {
233         $this->assertSqlGeneration(
234             'SELECT COUNT(u.id) FROM Doctrine\Tests\Models\CMS\CmsUser u GROUP BY u.id',
235             'SELECT COUNT(c0_.id) AS sclr0 FROM cms_users c0_ GROUP BY c0_.id'
236         );
237     }
238
239     public function testSupportsAggregateFunctionWithSimpleArithmetic()
240     {
241         $this->assertSqlGeneration(
242             'SELECT MAX(u.id + 4) * 2 FROM Doctrine\Tests\Models\CMS\CmsUser u',
243             'SELECT MAX(c0_.id + 4) * 2 AS sclr0 FROM cms_users c0_'
244         );
245     }
246
247     public function testSupportsWhereClauseWithPositionalParameter()
248     {
249         $this->assertSqlGeneration(
250             'select u from Doctrine\Tests\Models\Forum\ForumUser u where u.id = ?1',
251             'SELECT f0_.id AS id0, f0_.username AS username1 FROM forum_users f0_ WHERE f0_.id = ?'
252         );
253     }
254
255     public function testSupportsWhereClauseWithNamedParameter()
256     {
257         $this->assertSqlGeneration(
258             'select u from Doctrine\Tests\Models\Forum\ForumUser u where u.username = :name',
259             'SELECT f0_.id AS id0, f0_.username AS username1 FROM forum_users f0_ WHERE f0_.username = ?'
260         );
261     }
262
263     public function testSupportsWhereAndClauseWithNamedParameters()
264     {
265         $this->assertSqlGeneration(
266             'select u from Doctrine\Tests\Models\Forum\ForumUser u where u.username = :name and u.username = :name2',
267             'SELECT f0_.id AS id0, f0_.username AS username1 FROM forum_users f0_ WHERE f0_.username = ? AND f0_.username = ?'
268         );
269     }
270
271     public function testSupportsCombinedWhereClauseWithNamedParameter()
272     {
273         $this->assertSqlGeneration(
274             'select u from Doctrine\Tests\Models\Forum\ForumUser u where (u.username = :name OR u.username = :name2) AND u.id = :id',
275             'SELECT f0_.id AS id0, f0_.username AS username1 FROM forum_users f0_ WHERE (f0_.username = ? OR f0_.username = ?) AND f0_.id = ?'
276         );
277     }
278
279     public function testSupportsAggregateFunctionInASelectDistinct()
280     {
281         $this->assertSqlGeneration(
282             'SELECT COUNT(DISTINCT u.name) FROM Doctrine\Tests\Models\CMS\CmsUser u',
283             'SELECT COUNT(DISTINCT c0_.name) AS sclr0 FROM cms_users c0_'
284         );
285     }
286
287     // Ticket #668
288     public function testSupportsASqlKeywordInAStringLiteralParam()
289     {
290         $this->assertSqlGeneration(
291             "SELECT u.name FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.name LIKE '%foo OR bar%'",
292             "SELECT c0_.name AS name0 FROM cms_users c0_ WHERE c0_.name LIKE '%foo OR bar%'"
293         );
294     }
295
296     public function testSupportsArithmeticExpressionsInWherePart()
297     {
298         $this->assertSqlGeneration(
299             'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE ((u.id + 5000) * u.id + 3) < 10000000',
300             'SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 FROM cms_users c0_ WHERE (c0_.id + 5000) * c0_.id + 3 < 10000000'
301         );
302     }
303
304     public function testSupportsMultipleEntitiesInFromClause()
305     {
306         $this->assertSqlGeneration(
307             'SELECT u, a FROM Doctrine\Tests\Models\CMS\CmsUser u, Doctrine\Tests\Models\CMS\CmsArticle a JOIN a.user u2 WHERE u.id = u2.id',
308             'SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3, c1_.id AS id4, c1_.topic AS topic5, c1_.text AS text6, c1_.version AS version7 FROM cms_users c0_, cms_articles c1_ INNER JOIN cms_users c2_ ON c1_.user_id = c2_.id WHERE c0_.id = c2_.id'
309         );
310     }
311
312     public function testSupportsMultipleEntitiesInFromClauseUsingPathExpression()
313     {
314         $this->assertSqlGeneration(
315             'SELECT u, a FROM Doctrine\Tests\Models\CMS\CmsUser u, Doctrine\Tests\Models\CMS\CmsArticle a WHERE u.id = a.user',
316             'SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3, c1_.id AS id4, c1_.topic AS topic5, c1_.text AS text6, c1_.version AS version7 FROM cms_users c0_, cms_articles c1_ WHERE c0_.id = c1_.user_id'
317         );
318     }
319
320     public function testSupportsPlainJoinWithoutClause()
321     {
322         $this->assertSqlGeneration(
323             'SELECT u.id, a.id from Doctrine\Tests\Models\CMS\CmsUser u LEFT JOIN u.articles a',
324             'SELECT c0_.id AS id0, c1_.id AS id1 FROM cms_users c0_ LEFT JOIN cms_articles c1_ ON c0_.id = c1_.user_id'
325         );
326         $this->assertSqlGeneration(
327             'SELECT u.id, a.id from Doctrine\Tests\Models\CMS\CmsUser u JOIN u.articles a',
328             'SELECT c0_.id AS id0, c1_.id AS id1 FROM cms_users c0_ INNER JOIN cms_articles c1_ ON c0_.id = c1_.user_id'
329         );
330     }
331
332     /**
333      * @group DDC-135
334      */
335     public function testSupportsJoinAndWithClauseRestriction()
336     {
337         $this->assertSqlGeneration(
338             "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u LEFT JOIN u.articles a WITH a.topic LIKE '%foo%'",
339             "SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 FROM cms_users c0_ LEFT JOIN cms_articles c1_ ON c0_.id = c1_.user_id AND (c1_.topic LIKE '%foo%')"
340         );
341         $this->assertSqlGeneration(
342             "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u INNER JOIN u.articles a WITH a.topic LIKE '%foo%'",
343             "SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 FROM cms_users c0_ INNER JOIN cms_articles c1_ ON c0_.id = c1_.user_id AND (c1_.topic LIKE '%foo%')"
344         );
345     }
346
347     /**
348      * @group DDC-135
349      * @group DDC-177
350      */
351     public function testJoinOnClause_NotYetSupported_ThrowsException()
352     {
353         $this->setExpectedException('Doctrine\ORM\Query\QueryException');
354
355         $sql = $this->_em->createQuery(
356             "SELECT u, a FROM Doctrine\Tests\Models\CMS\CmsUser u LEFT JOIN u.articles a ON a.topic LIKE '%foo%'"
357         )->getSql();
358     }
359
360     public function testSupportsMultipleJoins()
361     {
362         $this->assertSqlGeneration(
363             'SELECT u.id, a.id, p.phonenumber, c.id from Doctrine\Tests\Models\CMS\CmsUser u JOIN u.articles a JOIN u.phonenumbers p JOIN a.comments c',
364             'SELECT c0_.id AS id0, c1_.id AS id1, c2_.phonenumber AS phonenumber2, c3_.id AS id3 FROM cms_users c0_ INNER JOIN cms_articles c1_ ON c0_.id = c1_.user_id INNER JOIN cms_phonenumbers c2_ ON c0_.id = c2_.user_id INNER JOIN cms_comments c3_ ON c1_.id = c3_.article_id'
365         );
366     }
367
368     public function testSupportsTrimFunction()
369     {
370         $this->assertSqlGeneration(
371             "SELECT u.name FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE TRIM(TRAILING ' ' FROM u.name) = 'someone'",
372             "SELECT c0_.name AS name0 FROM cms_users c0_ WHERE TRIM(TRAILING ' ' FROM c0_.name) = 'someone'"
373         );
374     }
375
376     // Ticket 894
377     public function testSupportsBetweenClauseWithPositionalParameters()
378     {
379         $this->assertSqlGeneration(
380             "SELECT u.name FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id BETWEEN ?1 AND ?2",
381             "SELECT c0_.name AS name0 FROM cms_users c0_ WHERE c0_.id BETWEEN ? AND ?"
382         );
383     }
384
385     /**
386      * @group DDC-1802
387      */
388     public function testSupportsNotBetweenForSizeFunction()
389     {
390         $this->assertSqlGeneration(
391             "SELECT m.name FROM Doctrine\Tests\Models\StockExchange\Market m WHERE SIZE(m.stocks) NOT BETWEEN ?1 AND ?2",
392             "SELECT e0_.name AS name0 FROM exchange_markets e0_ WHERE (SELECT COUNT(*) FROM exchange_stocks e1_ WHERE e1_.market_id = e0_.id) NOT BETWEEN ? AND ?"
393         );
394     }
395
396     public function testSupportsFunctionalExpressionsInWherePart()
397     {
398         $this->assertSqlGeneration(
399             "SELECT u.name FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE TRIM(u.name) = 'someone'",
400             // String quoting in the SQL usually depends on the database platform.
401             // This test works with a mock connection which uses ' for string quoting.
402             "SELECT c0_.name AS name0 FROM cms_users c0_ WHERE TRIM(c0_.name) = 'someone'"
403         );
404     }
405
406     public function testSupportsInstanceOfExpressionsInWherePart()
407     {
408         $this->assertSqlGeneration(
409             "SELECT u FROM Doctrine\Tests\Models\Company\CompanyPerson u WHERE u INSTANCE OF Doctrine\Tests\Models\Company\CompanyEmployee",
410             "SELECT c0_.id AS id0, c0_.name AS name1, c0_.discr AS discr2 FROM company_persons c0_ WHERE c0_.discr IN ('employee')"
411         );
412     }
413
414     public function testSupportsInstanceOfExpressionInWherePartWithMultipleValues()
415     {
416         $this->assertSqlGeneration(
417             "SELECT u FROM Doctrine\Tests\Models\Company\CompanyPerson u WHERE u INSTANCE OF (Doctrine\Tests\Models\Company\CompanyEmployee, \Doctrine\Tests\Models\Company\CompanyManager)",
418             "SELECT c0_.id AS id0, c0_.name AS name1, c0_.discr AS discr2 FROM company_persons c0_ WHERE c0_.discr IN ('employee', 'manager')"
419         );
420     }
421
422     /**
423      * @group DDC-1194
424      */
425     public function testSupportsInstanceOfExpressionsInWherePartPrefixedSlash()
426     {
427         $this->assertSqlGeneration(
428             "SELECT u FROM Doctrine\Tests\Models\Company\CompanyPerson u WHERE u INSTANCE OF \Doctrine\Tests\Models\Company\CompanyEmployee",
429             "SELECT c0_.id AS id0, c0_.name AS name1, c0_.discr AS discr2 FROM company_persons c0_ WHERE c0_.discr IN ('employee')"
430         );
431     }
432
433     /**
434      * @group DDC-1194
435      */
436     public function testSupportsInstanceOfExpressionsInWherePartWithUnrelatedClass()
437     {
438         $this->assertInvalidSqlGeneration(
439             "SELECT u FROM Doctrine\Tests\Models\Company\CompanyPerson u WHERE u INSTANCE OF \Doctrine\Tests\Models\CMS\CmsUser",
440             "Doctrine\ORM\Query\QueryException"
441         );
442     }
443
444     public function testSupportsInstanceOfExpressionsInWherePartInDeeperLevel()
445     {
446         $this->assertSqlGeneration(
447             "SELECT u FROM Doctrine\Tests\Models\Company\CompanyEmployee u WHERE u INSTANCE OF Doctrine\Tests\Models\Company\CompanyManager",
448             "SELECT c0_.id AS id0, c0_.name AS name1, c1_.salary AS salary2, c1_.department AS department3, c1_.startDate AS startDate4, c0_.discr AS discr5 FROM company_employees c1_ INNER JOIN company_persons c0_ ON c1_.id = c0_.id WHERE c0_.discr IN ('manager')"
449         );
450     }
451
452     public function testSupportsInstanceOfExpressionsInWherePartInDeepestLevel()
453     {
454         $this->assertSqlGeneration(
455             "SELECT u FROM Doctrine\Tests\Models\Company\CompanyManager u WHERE u INSTANCE OF Doctrine\Tests\Models\Company\CompanyManager",
456             "SELECT c0_.id AS id0, c0_.name AS name1, c1_.salary AS salary2, c1_.department AS department3, c1_.startDate AS startDate4, c2_.title AS title5, c0_.discr AS discr6 FROM company_managers c2_ INNER JOIN company_employees c1_ ON c2_.id = c1_.id INNER JOIN company_persons c0_ ON c2_.id = c0_.id WHERE c0_.discr IN ('manager')"
457         );
458     }
459
460     public function testSupportsInstanceOfExpressionsUsingInputParameterInWherePart()
461     {
462         $this->assertSqlGeneration(
463             "SELECT u FROM Doctrine\Tests\Models\Company\CompanyPerson u WHERE u INSTANCE OF ?1",
464             "SELECT c0_.id AS id0, c0_.name AS name1, c0_.discr AS discr2 FROM company_persons c0_ WHERE c0_.discr IN ('employee')",
465             array(), array(1 => $this->_em->getClassMetadata('Doctrine\Tests\Models\Company\CompanyEmployee'))
466         );
467     }
468
469     // Ticket #973
470     public function testSupportsSingleValuedInExpressionWithoutSpacesInWherePart()
471     {
472         $this->assertSqlGeneration(
473             "SELECT u.name FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE IDENTITY(u.email) IN(46)",
474             "SELECT c0_.name AS name0 FROM cms_users c0_ WHERE c0_.email_id IN (46)"
475         );
476     }
477
478     public function testSupportsMultipleValuedInExpressionInWherePart()
479     {
480         $this->assertSqlGeneration(
481             'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id IN (1, 2)',
482             'SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 FROM cms_users c0_ WHERE c0_.id IN (1, 2)'
483         );
484     }
485
486     public function testSupportsNotInExpressionInWherePart()
487     {
488         $this->assertSqlGeneration(
489             'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE :id NOT IN (1)',
490             'SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 FROM cms_users c0_ WHERE ? NOT IN (1)'
491         );
492     }
493
494     /**
495      * @group DDC-1802
496      */
497     public function testSupportsNotInExpressionForModFunction()
498     {
499         $this->assertSqlGeneration(
500             "SELECT u.name FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE MOD(u.id, 5) NOT IN(1,3,4)",
501             "SELECT c0_.name AS name0 FROM cms_users c0_ WHERE MOD(c0_.id, 5) NOT IN (1, 3, 4)"
502         );
503     }
504
505     public function testInExpressionWithSingleValuedAssociationPathExpressionInWherePart()
506     {
507         $this->assertSqlGeneration(
508             'SELECT u FROM Doctrine\Tests\Models\Forum\ForumUser u WHERE u.avatar IN (?1, ?2)',
509             'SELECT f0_.id AS id0, f0_.username AS username1 FROM forum_users f0_ WHERE f0_.avatar_id IN (?, ?)'
510         );
511     }
512
513     public function testInvalidInExpressionWithSingleValuedAssociationPathExpressionOnInverseSide()
514     {
515         // We do not support SingleValuedAssociationPathExpression on inverse side
516         $this->assertInvalidSqlGeneration(
517             "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.address IN (?1, ?2)",
518             "Doctrine\ORM\Query\QueryException"
519         );
520     }
521
522     public function testSupportsConcatFunctionForMysqlAndPostgresql()
523     {
524         $connMock = $this->_em->getConnection();
525         $orgPlatform = $connMock->getDatabasePlatform();
526
527         $connMock->setDatabasePlatform(new \Doctrine\DBAL\Platforms\MySqlPlatform);
528         $this->assertSqlGeneration(
529             "SELECT u.id FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE CONCAT(u.name, 's') = ?1",
530             "SELECT c0_.id AS id0 FROM cms_users c0_ WHERE CONCAT(c0_.name, 's') = ?"
531         );
532         $this->assertSqlGeneration(
533             "SELECT CONCAT(u.id, u.name) FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = ?1",
534             "SELECT CONCAT(c0_.id, c0_.name) AS sclr0 FROM cms_users c0_ WHERE c0_.id = ?"
535         );
536
537         $connMock->setDatabasePlatform(new \Doctrine\DBAL\Platforms\PostgreSqlPlatform);
538         $this->assertSqlGeneration(
539             "SELECT u.id FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE CONCAT(u.name, 's') = ?1",
540             "SELECT c0_.id AS id0 FROM cms_users c0_ WHERE c0_.name || 's' = ?"
541         );
542         $this->assertSqlGeneration(
543             "SELECT CONCAT(u.id, u.name) FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = ?1",
544             "SELECT c0_.id || c0_.name AS sclr0 FROM cms_users c0_ WHERE c0_.id = ?"
545         );
546
547         $connMock->setDatabasePlatform($orgPlatform);
548     }
549
550     public function testSupportsExistsExpressionInWherePartWithCorrelatedSubquery()
551     {
552         $this->assertSqlGeneration(
553             'SELECT u.id FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE EXISTS (SELECT p.phonenumber FROM Doctrine\Tests\Models\CMS\CmsPhonenumber p WHERE p.phonenumber = u.id)',
554             'SELECT c0_.id AS id0 FROM cms_users c0_ WHERE EXISTS (SELECT c1_.phonenumber FROM cms_phonenumbers c1_ WHERE c1_.phonenumber = c0_.id)'
555         );
556     }
557
558     /**
559      * @group DDC-593
560      */
561     public function testSubqueriesInComparisonExpression()
562     {
563         $this->assertSqlGeneration(
564             'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE (u.id >= (SELECT u2.id FROM Doctrine\Tests\Models\CMS\CmsUser u2 WHERE u2.name = :name)) AND (u.id <= (SELECT u3.id FROM Doctrine\Tests\Models\CMS\CmsUser u3 WHERE u3.name = :name))',
565             'SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 FROM cms_users c0_ WHERE (c0_.id >= (SELECT c1_.id FROM cms_users c1_ WHERE c1_.name = ?)) AND (c0_.id <= (SELECT c2_.id FROM cms_users c2_ WHERE c2_.name = ?))'
566         );
567     }
568
569     public function testSupportsMemberOfExpressionOneToMany()
570     {
571         // "Get all users who have $phone as a phonenumber." (*cough* doesnt really make sense...)
572         $q = $this->_em->createQuery('SELECT u.id FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE :param MEMBER OF u.phonenumbers');
573         $q->setHint(Query::HINT_FORCE_PARTIAL_LOAD, true);
574
575         $phone = new \Doctrine\Tests\Models\CMS\CmsPhonenumber;
576         $phone->phonenumber = 101;
577         $q->setParameter('param', $phone);
578
579         $this->assertEquals(
580             'SELECT c0_.id AS id0 FROM cms_users c0_ WHERE EXISTS (SELECT 1 FROM cms_phonenumbers c1_ WHERE c0_.id = c1_.user_id AND c1_.phonenumber = ?)',
581             $q->getSql()
582         );
583     }
584
585     public function testSupportsMemberOfExpressionManyToMany()
586     {
587         // "Get all users who are members of $group."
588         $q = $this->_em->createQuery('SELECT u.id FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE :param MEMBER OF u.groups');
589         $q->setHint(Query::HINT_FORCE_PARTIAL_LOAD, true);
590
591         $group = new \Doctrine\Tests\Models\CMS\CmsGroup;
592         $group->id = 101;
593         $q->setParameter('param', $group);
594
595         $this->assertEquals(
596             'SELECT c0_.id AS id0 FROM cms_users c0_ WHERE EXISTS (SELECT 1 FROM cms_users_groups c1_ INNER JOIN cms_groups c2_ ON c1_.group_id = c2_.id WHERE c1_.user_id = c0_.id AND c2_.id = ?)',
597             $q->getSql()
598         );
599     }
600
601     public function testSupportsMemberOfExpressionSelfReferencing()
602     {
603         // "Get all persons who have $person as a friend."
604         // Tough one: Many-many self-referencing ("friends") with class table inheritance
605         $q = $this->_em->createQuery('SELECT p FROM Doctrine\Tests\Models\Company\CompanyPerson p WHERE :param MEMBER OF p.friends');
606         $person = new \Doctrine\Tests\Models\Company\CompanyPerson;
607         $this->_em->getClassMetadata(get_class($person))->setIdentifierValues($person, array('id' => 101));
608         $q->setParameter('param', $person);
609         $this->assertEquals(
610             'SELECT c0_.id AS id0, c0_.name AS name1, c1_.title AS title2, c2_.salary AS salary3, c2_.department AS department4, c2_.startDate AS startDate5, c0_.discr AS discr6, c0_.spouse_id AS spouse_id7, c1_.car_id AS car_id8 FROM company_persons c0_ LEFT JOIN company_managers c1_ ON c0_.id = c1_.id LEFT JOIN company_employees c2_ ON c0_.id = c2_.id WHERE EXISTS (SELECT 1 FROM company_persons_friends c3_ INNER JOIN company_persons c4_ ON c3_.friend_id = c4_.id WHERE c3_.person_id = c0_.id AND c4_.id = ?)',
611             $q->getSql()
612         );
613     }
614
615     public function testSupportsMemberOfWithSingleValuedAssociation()
616     {
617         // Impossible example, but it illustrates the purpose
618         $q = $this->_em->createQuery('SELECT u.id FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.email MEMBER OF u.groups');
619
620         $this->assertEquals(
621             'SELECT c0_.id AS id0 FROM cms_users c0_ WHERE EXISTS (SELECT 1 FROM cms_users_groups c1_ INNER JOIN cms_groups c2_ ON c1_.group_id = c2_.id WHERE c1_.user_id = c0_.id AND c2_.id = c0_.email_id)',
622             $q->getSql()
623         );
624     }
625
626     public function testSupportsMemberOfWithIdentificationVariable()
627     {
628         // Impossible example, but it illustrates the purpose
629         $q = $this->_em->createQuery('SELECT u.id FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u MEMBER OF u.groups');
630
631         $this->assertEquals(
632             'SELECT c0_.id AS id0 FROM cms_users c0_ WHERE EXISTS (SELECT 1 FROM cms_users_groups c1_ INNER JOIN cms_groups c2_ ON c1_.group_id = c2_.id WHERE c1_.user_id = c0_.id AND c2_.id = c0_.id)',
633             $q->getSql()
634         );
635     }
636
637     public function testSupportsCurrentDateFunction()
638     {
639         $q = $this->_em->createQuery('SELECT d.id FROM Doctrine\Tests\Models\Generic\DateTimeModel d WHERE d.datetime > current_date()');
640         $q->setHint(Query::HINT_FORCE_PARTIAL_LOAD, true);
641         $this->assertEquals('SELECT d0_.id AS id0 FROM date_time_model d0_ WHERE d0_.col_datetime > CURRENT_DATE', $q->getSql());
642     }
643
644     public function testSupportsCurrentTimeFunction()
645     {
646         $q = $this->_em->createQuery('SELECT d.id FROM Doctrine\Tests\Models\Generic\DateTimeModel d WHERE d.time > current_time()');
647         $q->setHint(Query::HINT_FORCE_PARTIAL_LOAD, true);
648         $this->assertEquals('SELECT d0_.id AS id0 FROM date_time_model d0_ WHERE d0_.col_time > CURRENT_TIME', $q->getSql());
649     }
650
651     public function testSupportsCurrentTimestampFunction()
652     {
653         $q = $this->_em->createQuery('SELECT d.id FROM Doctrine\Tests\Models\Generic\DateTimeModel d WHERE d.datetime > current_timestamp()');
654         $q->setHint(Query::HINT_FORCE_PARTIAL_LOAD, true);
655         $this->assertEquals('SELECT d0_.id AS id0 FROM date_time_model d0_ WHERE d0_.col_datetime > CURRENT_TIMESTAMP', $q->getSql());
656     }
657
658     public function testExistsExpressionInWhereCorrelatedSubqueryAssocCondition()
659     {
660         $this->assertSqlGeneration(
661             // DQL
662             // The result of this query consists of all employees whose spouses are also employees.
663             'SELECT DISTINCT emp FROM Doctrine\Tests\Models\CMS\CmsEmployee emp
664                 WHERE EXISTS (
665                     SELECT spouseEmp
666                     FROM Doctrine\Tests\Models\CMS\CmsEmployee spouseEmp
667                     WHERE spouseEmp = emp.spouse)',
668             // SQL
669             'SELECT DISTINCT c0_.id AS id0, c0_.name AS name1 FROM cms_employees c0_'
670                 . ' WHERE EXISTS ('
671                     . 'SELECT c1_.id FROM cms_employees c1_ WHERE c1_.id = c0_.spouse_id'
672                     . ')'
673         );
674     }
675
676     public function testExistsExpressionWithSimpleSelectReturningScalar()
677     {
678         $this->assertSqlGeneration(
679             // DQL
680             // The result of this query consists of all employees whose spouses are also employees.
681             'SELECT DISTINCT emp FROM Doctrine\Tests\Models\CMS\CmsEmployee emp
682                 WHERE EXISTS (
683                     SELECT 1
684                     FROM Doctrine\Tests\Models\CMS\CmsEmployee spouseEmp
685                     WHERE spouseEmp = emp.spouse)',
686             // SQL
687             'SELECT DISTINCT c0_.id AS id0, c0_.name AS name1 FROM cms_employees c0_'
688                 . ' WHERE EXISTS ('
689                     . 'SELECT 1 AS sclr2 FROM cms_employees c1_ WHERE c1_.id = c0_.spouse_id'
690                     . ')'
691         );
692     }
693
694     public function testLimitFromQueryClass()
695     {
696         $q = $this->_em
697             ->createQuery('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u')
698             ->setMaxResults(10);
699
700         $this->assertEquals('SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3, c0_.email_id AS email_id4 FROM cms_users c0_ LIMIT 10', $q->getSql());
701     }
702
703     public function testLimitAndOffsetFromQueryClass()
704     {
705         $q = $this->_em
706             ->createQuery('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u')
707             ->setMaxResults(10)
708             ->setFirstResult(0);
709
710         $this->assertEquals('SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3, c0_.email_id AS email_id4 FROM cms_users c0_ LIMIT 10 OFFSET 0', $q->getSql());
711     }
712
713     public function testSizeFunction()
714     {
715         $this->assertSqlGeneration(
716             "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE SIZE(u.phonenumbers) > 1",
717             "SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 FROM cms_users c0_ WHERE (SELECT COUNT(*) FROM cms_phonenumbers c1_ WHERE c1_.user_id = c0_.id) > 1"
718         );
719     }
720
721     public function testSizeFunctionSupportsManyToMany()
722     {
723         $this->assertSqlGeneration(
724             "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE SIZE(u.groups) > 1",
725             "SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 FROM cms_users c0_ WHERE (SELECT COUNT(*) FROM cms_users_groups c1_ WHERE c1_.user_id = c0_.id) > 1"
726         );
727     }
728
729     public function testEmptyCollectionComparisonExpression()
730     {
731         $this->assertSqlGeneration(
732             "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.phonenumbers IS EMPTY",
733             "SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 FROM cms_users c0_ WHERE (SELECT COUNT(*) FROM cms_phonenumbers c1_ WHERE c1_.user_id = c0_.id) = 0"
734         );
735         $this->assertSqlGeneration(
736             "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.phonenumbers IS NOT EMPTY",
737             "SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 FROM cms_users c0_ WHERE (SELECT COUNT(*) FROM cms_phonenumbers c1_ WHERE c1_.user_id = c0_.id) > 0"
738         );
739     }
740
741     public function testNestedExpressions()
742     {
743         $this->assertSqlGeneration(
744             "select u from Doctrine\Tests\Models\CMS\CmsUser u where u.id > 10 and u.id < 42 and ((u.id * 2) > 5)",
745             "SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 FROM cms_users c0_ WHERE c0_.id > 10 AND c0_.id < 42 AND (c0_.id * 2 > 5)"
746         );
747     }
748
749     public function testNestedExpressions2()
750     {
751         $this->assertSqlGeneration(
752             "select u from Doctrine\Tests\Models\CMS\CmsUser u where (u.id > 10) and (u.id < 42 and ((u.id * 2) > 5)) or u.id <> 42",
753             "SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 FROM cms_users c0_ WHERE (c0_.id > 10) AND (c0_.id < 42 AND (c0_.id * 2 > 5)) OR c0_.id <> 42"
754         );
755     }
756
757     public function testNestedExpressions3()
758     {
759         $this->assertSqlGeneration(
760             "select u from Doctrine\Tests\Models\CMS\CmsUser u where (u.id > 10) and (u.id between 1 and 10 or u.id in (1, 2, 3, 4, 5))",
761             "SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 FROM cms_users c0_ WHERE (c0_.id > 10) AND (c0_.id BETWEEN 1 AND 10 OR c0_.id IN (1, 2, 3, 4, 5))"
762         );
763     }
764
765     public function testOrderByCollectionAssociationSize()
766     {
767         $this->assertSqlGeneration(
768             "select u, size(u.articles) as numArticles from Doctrine\Tests\Models\CMS\CmsUser u order by numArticles",
769             "SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3, (SELECT COUNT(*) FROM cms_articles c1_ WHERE c1_.user_id = c0_.id) AS sclr4 FROM cms_users c0_ ORDER BY sclr4 ASC"
770         );
771     }
772
773     public function testOrderBySupportsSingleValuedPathExpressionOwningSide()
774     {
775         $this->assertSqlGeneration(
776             "select a from Doctrine\Tests\Models\CMS\CmsArticle a order by a.user",
777             "SELECT c0_.id AS id0, c0_.topic AS topic1, c0_.text AS text2, c0_.version AS version3 FROM cms_articles c0_ ORDER BY c0_.user_id ASC"
778         );
779     }
780
781     /**
782      * @expectedException Doctrine\ORM\Query\QueryException
783      */
784     public function testOrderBySupportsSingleValuedPathExpressionInverseSide()
785     {
786         $q = $this->_em->createQuery("select u from Doctrine\Tests\Models\CMS\CmsUser u order by u.address");
787         $q->getSQL();
788     }
789
790     public function testBooleanLiteralInWhereOnSqlite()
791     {
792         $oldPlat = $this->_em->getConnection()->getDatabasePlatform();
793         $this->_em->getConnection()->setDatabasePlatform(new \Doctrine\DBAL\Platforms\SqlitePlatform);
794
795         $this->assertSqlGeneration(
796             "SELECT b FROM Doctrine\Tests\Models\Generic\BooleanModel b WHERE b.booleanField = true",
797             "SELECT b0_.id AS id0, b0_.booleanField AS booleanField1 FROM boolean_model b0_ WHERE b0_.booleanField = 1"
798         );
799
800         $this->assertSqlGeneration(
801             "SELECT b FROM Doctrine\Tests\Models\Generic\BooleanModel b WHERE b.booleanField = false",
802             "SELECT b0_.id AS id0, b0_.booleanField AS booleanField1 FROM boolean_model b0_ WHERE b0_.booleanField = 0"
803         );
804
805         $this->_em->getConnection()->setDatabasePlatform($oldPlat);
806     }
807
808     public function testBooleanLiteralInWhereOnPostgres()
809     {
810         $oldPlat = $this->_em->getConnection()->getDatabasePlatform();
811         $this->_em->getConnection()->setDatabasePlatform(new \Doctrine\DBAL\Platforms\PostgreSqlPlatform);
812
813         $this->assertSqlGeneration(
814             "SELECT b FROM Doctrine\Tests\Models\Generic\BooleanModel b WHERE b.booleanField = true",
815             "SELECT b0_.id AS id0, b0_.booleanField AS booleanfield1 FROM boolean_model b0_ WHERE b0_.booleanField = true"
816         );
817
818         $this->assertSqlGeneration(
819             "SELECT b FROM Doctrine\Tests\Models\Generic\BooleanModel b WHERE b.booleanField = false",
820             "SELECT b0_.id AS id0, b0_.booleanField AS booleanfield1 FROM boolean_model b0_ WHERE b0_.booleanField = false"
821         );
822
823         $this->_em->getConnection()->setDatabasePlatform($oldPlat);
824     }
825
826     public function testSingleValuedAssociationFieldInWhere()
827     {
828         $this->assertSqlGeneration(
829             "SELECT p FROM Doctrine\Tests\Models\CMS\CmsPhonenumber p WHERE p.user = ?1",
830             "SELECT c0_.phonenumber AS phonenumber0 FROM cms_phonenumbers c0_ WHERE c0_.user_id = ?"
831         );
832     }
833
834     public function testSingleValuedAssociationNullCheckOnOwningSide()
835     {
836         $this->assertSqlGeneration(
837             "SELECT a FROM Doctrine\Tests\Models\CMS\CmsAddress a WHERE a.user IS NULL",
838             "SELECT c0_.id AS id0, c0_.country AS country1, c0_.zip AS zip2, c0_.city AS city3 FROM cms_addresses c0_ WHERE c0_.user_id IS NULL"
839         );
840     }
841
842     // Null check on inverse side has to happen through explicit JOIN.
843     // "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.address IS NULL"
844     // where the CmsUser is the inverse side is not supported.
845     public function testSingleValuedAssociationNullCheckOnInverseSide()
846     {
847         $this->assertSqlGeneration(
848             "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u LEFT JOIN u.address a WHERE a.id IS NULL",
849             "SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 FROM cms_users c0_ LEFT JOIN cms_addresses c1_ ON c0_.id = c1_.user_id WHERE c1_.id IS NULL"
850         );
851     }
852
853     /**
854      * @group DDC-339
855      * @group DDC-1572
856      */
857     public function testStringFunctionLikeExpression()
858     {
859         $this->assertSqlGeneration(
860             "SELECT u.name FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE LOWER(u.name) LIKE '%foo OR bar%'",
861             "SELECT c0_.name AS name0 FROM cms_users c0_ WHERE LOWER(c0_.name) LIKE '%foo OR bar%'"
862         );
863         $this->assertSqlGeneration(
864             "SELECT u.name FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE LOWER(u.name) LIKE :str",
865             "SELECT c0_.name AS name0 FROM cms_users c0_ WHERE LOWER(c0_.name) LIKE ?"
866         );
867         $this->assertSqlGeneration(
868             "SELECT u.name FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE CONCAT(UPPER(u.name), '_moo') LIKE :str",
869             "SELECT c0_.name AS name0 FROM cms_users c0_ WHERE UPPER(c0_.name) || '_moo' LIKE ?"
870         );
871
872         // DDC-1572
873         $this->assertSqlGeneration(
874             "SELECT u.name FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE UPPER(u.name) LIKE UPPER(:str)",
875             "SELECT c0_.name AS name0 FROM cms_users c0_ WHERE UPPER(c0_.name) LIKE UPPER(?)"
876         );
877         $this->assertSqlGeneration(
878             "SELECT u.name FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE UPPER(LOWER(u.name)) LIKE UPPER(LOWER(:str))",
879             "SELECT c0_.name AS name0 FROM cms_users c0_ WHERE UPPER(LOWER(c0_.name)) LIKE UPPER(LOWER(?))"
880         );
881         $this->assertSqlGeneration(
882             "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u LEFT JOIN u.articles a WITH a.topic LIKE u.name",
883             "SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 FROM cms_users c0_ LEFT JOIN cms_articles c1_ ON c0_.id = c1_.user_id AND (c1_.topic LIKE c0_.name)"
884         );
885     }
886
887     /**
888      * @group DDC-1802
889      */
890     public function testStringFunctionNotLikeExpression()
891     {
892         $this->assertSqlGeneration(
893                 "SELECT u.name FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE LOWER(u.name) NOT LIKE '%foo OR bar%'",
894                 "SELECT c0_.name AS name0 FROM cms_users c0_ WHERE LOWER(c0_.name) NOT LIKE '%foo OR bar%'"
895         );
896
897         $this->assertSqlGeneration(
898                 "SELECT u.name FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE UPPER(LOWER(u.name)) NOT LIKE UPPER(LOWER(:str))",
899                 "SELECT c0_.name AS name0 FROM cms_users c0_ WHERE UPPER(LOWER(c0_.name)) NOT LIKE UPPER(LOWER(?))"
900         );
901         $this->assertSqlGeneration(
902                 "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u LEFT JOIN u.articles a WITH a.topic NOT LIKE u.name",
903                 "SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 FROM cms_users c0_ LEFT JOIN cms_articles c1_ ON c0_.id = c1_.user_id AND (c1_.topic NOT LIKE c0_.name)"
904         );
905     }
906
907     /**
908      * @group DDC-338
909      */
910     public function testOrderedCollectionFetchJoined()
911     {
912         $this->assertSqlGeneration(
913             "SELECT r, l FROM Doctrine\Tests\Models\Routing\RoutingRoute r JOIN r.legs l",
914             "SELECT r0_.id AS id0, r1_.id AS id1, r1_.departureDate AS departureDate2, r1_.arrivalDate AS arrivalDate3 FROM RoutingRoute r0_ INNER JOIN RoutingRouteLegs r2_ ON r0_.id = r2_.route_id INNER JOIN RoutingLeg r1_ ON r1_.id = r2_.leg_id ".
915             "ORDER BY r1_.departureDate ASC"
916         );
917     }
918
919     public function testSubselectInSelect()
920     {
921         $this->assertSqlGeneration(
922             "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'",
923             "SELECT c0_.name AS name0, (SELECT COUNT(c1_.phonenumber) AS dctrn__1 FROM cms_phonenumbers c1_ WHERE c1_.phonenumber = 1234) AS sclr1 FROM cms_users c0_ WHERE c0_.name = 'jon'"
924         );
925     }
926
927     /**
928      * @group locking
929      * @group DDC-178
930      */
931     public function testPessimisticWriteLockQueryHint()
932     {
933         if ($this->_em->getConnection()->getDatabasePlatform() instanceof \Doctrine\DBAL\Platforms\SqlitePlatform) {
934             $this->markTestSkipped('SqLite does not support Row locking at all.');
935         }
936
937         $this->assertSqlGeneration(
938             "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.username = 'gblanco'",
939             "SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 ".
940             "FROM cms_users c0_ WHERE c0_.username = 'gblanco' FOR UPDATE",
941             array(Query::HINT_LOCK_MODE => \Doctrine\DBAL\LockMode::PESSIMISTIC_WRITE)
942         );
943     }
944
945     /**
946      * @group locking
947      * @group DDC-178
948      */
949     public function testPessimisticReadLockQueryHintPostgreSql()
950     {
951         $this->_em->getConnection()->setDatabasePlatform(new \Doctrine\DBAL\Platforms\PostgreSqlPlatform);
952
953         $this->assertSqlGeneration(
954             "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.username = 'gblanco'",
955             "SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 ".
956             "FROM cms_users c0_ WHERE c0_.username = 'gblanco' FOR SHARE",
957             array(Query::HINT_LOCK_MODE => \Doctrine\DBAL\LockMode::PESSIMISTIC_READ)
958                 );
959     }
960
961     /**
962      * @group DDC-1693
963      * @group locking
964      */
965     public function testLockModeNoneQueryHint()
966     {
967         $this->assertSqlGeneration(
968             "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.username = 'gblanco'",
969             "SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 ".
970             "FROM cms_users c0_ WHERE c0_.username = 'gblanco'",
971             array(Query::HINT_LOCK_MODE => \Doctrine\DBAL\LockMode::NONE)
972                 );
973     }
974
975     /**
976      * @group DDC-430
977      */
978     public function testSupportSelectWithMoreThan10InputParameters()
979     {
980         $this->assertSqlGeneration(
981             "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = ?1 OR u.id = ?2 OR u.id = ?3 OR u.id = ?4 OR u.id = ?5 OR u.id = ?6 OR u.id = ?7 OR u.id = ?8 OR u.id = ?9 OR u.id = ?10 OR u.id = ?11",
982             "SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 FROM cms_users c0_ WHERE c0_.id = ? OR c0_.id = ? OR c0_.id = ? OR c0_.id = ? OR c0_.id = ? OR c0_.id = ? OR c0_.id = ? OR c0_.id = ? OR c0_.id = ? OR c0_.id = ? OR c0_.id = ?"
983         );
984     }
985
986     /**
987      * @group locking
988      * @group DDC-178
989      */
990     public function testPessimisticReadLockQueryHintMySql()
991     {
992         $this->_em->getConnection()->setDatabasePlatform(new \Doctrine\DBAL\Platforms\MySqlPlatform);
993
994         $this->assertSqlGeneration(
995             "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.username = 'gblanco'",
996             "SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 ".
997             "FROM cms_users c0_ WHERE c0_.username = 'gblanco' LOCK IN SHARE MODE",
998             array(Query::HINT_LOCK_MODE => \Doctrine\DBAL\LockMode::PESSIMISTIC_READ)
999         );
1000     }
1001
1002     /**
1003      * @group locking
1004      * @group DDC-178
1005      */
1006     public function testPessimisticReadLockQueryHintOracle()
1007     {
1008         $this->_em->getConnection()->setDatabasePlatform(new \Doctrine\DBAL\Platforms\OraclePlatform);
1009
1010         $this->assertSqlGeneration(
1011             "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.username = 'gblanco'",
1012             "SELECT c0_.id AS ID0, c0_.status AS STATUS1, c0_.username AS USERNAME2, c0_.name AS NAME3 ".
1013             "FROM cms_users c0_ WHERE c0_.username = 'gblanco' FOR UPDATE",
1014             array(Query::HINT_LOCK_MODE => \Doctrine\DBAL\LockMode::PESSIMISTIC_READ)
1015         );
1016     }
1017
1018     /**
1019      * @group DDC-431
1020      */
1021     public function testSupportToCustomDQLFunctions()
1022     {
1023         $config = $this->_em->getConfiguration();
1024         $config->addCustomNumericFunction('MYABS', 'Doctrine\Tests\ORM\Query\MyAbsFunction');
1025
1026         $this->assertSqlGeneration(
1027             'SELECT MYABS(p.phonenumber) FROM Doctrine\Tests\Models\CMS\CmsPhonenumber p',
1028             'SELECT ABS(c0_.phonenumber) AS sclr0 FROM cms_phonenumbers c0_'
1029         );
1030
1031         $config->setCustomNumericFunctions(array());
1032     }
1033
1034     /**
1035      * @group DDC-826
1036      */
1037     public function testMappedSuperclassAssociationJoin()
1038     {
1039         $this->assertSqlGeneration(
1040             'SELECT f FROM Doctrine\Tests\Models\DirectoryTree\File f JOIN f.parentDirectory d WHERE f.id = ?1',
1041             'SELECT f0_.id AS id0, f0_.extension AS extension1, f0_.name AS name2 FROM "file" f0_ INNER JOIN Directory d1_ ON f0_.parentDirectory_id = d1_.id WHERE f0_.id = ?'
1042         );
1043     }
1044
1045     /**
1046      * @group DDC-1053
1047      */
1048     public function testGroupBy()
1049     {
1050         $this->assertSqlGeneration(
1051             'SELECT g.id, count(u.id) FROM Doctrine\Tests\Models\CMS\CmsGroup g JOIN g.users u GROUP BY g.id',
1052             'SELECT c0_.id AS id0, count(c1_.id) AS sclr1 FROM cms_groups c0_ INNER JOIN cms_users_groups c2_ ON c0_.id = c2_.group_id INNER JOIN cms_users c1_ ON c1_.id = c2_.user_id GROUP BY c0_.id'
1053         );
1054     }
1055
1056     /**
1057      * @group DDC-1053
1058      */
1059     public function testGroupByIdentificationVariable()
1060     {
1061         $this->assertSqlGeneration(
1062             'SELECT g, count(u.id) FROM Doctrine\Tests\Models\CMS\CmsGroup g JOIN g.users u GROUP BY g',
1063             'SELECT c0_.id AS id0, c0_.name AS name1, count(c1_.id) AS sclr2 FROM cms_groups c0_ INNER JOIN cms_users_groups c2_ ON c0_.id = c2_.group_id INNER JOIN cms_users c1_ ON c1_.id = c2_.user_id GROUP BY c0_.id, c0_.name'
1064         );
1065     }
1066
1067     public function testCaseContainingNullIf()
1068     {
1069         $this->assertSqlGeneration(
1070             "SELECT NULLIF(g.id, g.name) AS NullIfEqual FROM Doctrine\Tests\Models\CMS\CmsGroup g",
1071             'SELECT NULLIF(c0_.id, c0_.name) AS sclr0 FROM cms_groups c0_'
1072         );
1073     }
1074
1075     public function testCaseContainingCoalesce()
1076     {
1077         $this->assertSqlGeneration(
1078             "SELECT COALESCE(NULLIF(u.name, ''), u.username) as Display FROM Doctrine\Tests\Models\CMS\CmsUser u",
1079             "SELECT COALESCE(NULLIF(c0_.name, ''), c0_.username) AS sclr0 FROM cms_users c0_"
1080         );
1081     }
1082
1083     /**
1084      * Test that the right discriminator data is inserted in a subquery.
1085      */
1086     public function testSubSelectDiscriminator()
1087     {
1088         $this->assertSqlGeneration(
1089             "SELECT u.name, (SELECT COUNT(cfc.id) total FROM Doctrine\Tests\Models\Company\CompanyFixContract cfc) as cfc_count FROM Doctrine\Tests\Models\CMS\CmsUser u",
1090             "SELECT c0_.name AS name0, (SELECT COUNT(c1_.id) AS dctrn__total FROM company_contracts c1_ WHERE c1_.discr IN ('fix')) AS sclr1 FROM cms_users c0_"
1091         );
1092     }
1093
1094     public function testIdVariableResultVariableReuse()
1095     {
1096         $exceptionThrown = false;
1097         try {
1098             $query = $this->_em->createQuery("SELECT u.name FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.name IN (SELECT u.name FROM Doctrine\Tests\Models\CMS\CmsUser u)");
1099
1100             $query->getSql();
1101             $query->free();
1102         } catch (\Exception $e) {
1103             $exceptionThrown = true;
1104         }
1105
1106         $this->assertTrue($exceptionThrown);
1107
1108     }
1109
1110     public function testSubSelectAliasesFromOuterQuery()
1111     {
1112         $this->assertSqlGeneration(
1113             "SELECT uo, (SELECT ui.name FROM Doctrine\Tests\Models\CMS\CmsUser ui WHERE ui.id = uo.id) AS bar FROM Doctrine\Tests\Models\CMS\CmsUser uo",
1114             "SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3, (SELECT c1_.name FROM cms_users c1_ WHERE c1_.id = c0_.id) AS sclr4 FROM cms_users c0_"
1115         );
1116     }
1117
1118     public function testSubSelectAliasesFromOuterQueryWithSubquery()
1119     {
1120         $this->assertSqlGeneration(
1121             "SELECT uo, (SELECT ui.name FROM Doctrine\Tests\Models\CMS\CmsUser ui WHERE ui.id = uo.id AND ui.name IN (SELECT uii.name FROM Doctrine\Tests\Models\CMS\CmsUser uii)) AS bar FROM Doctrine\Tests\Models\CMS\CmsUser uo",
1122             "SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3, (SELECT c1_.name FROM cms_users c1_ WHERE c1_.id = c0_.id AND c1_.name IN (SELECT c2_.name FROM cms_users c2_)) AS sclr4 FROM cms_users c0_"
1123         );
1124     }
1125
1126     public function testSubSelectAliasesFromOuterQueryReuseInWhereClause()
1127     {
1128         $this->assertSqlGeneration(
1129             "SELECT uo, (SELECT ui.name FROM Doctrine\Tests\Models\CMS\CmsUser ui WHERE ui.id = uo.id) AS bar FROM Doctrine\Tests\Models\CMS\CmsUser uo WHERE bar = ?0",
1130             "SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3, (SELECT c1_.name FROM cms_users c1_ WHERE c1_.id = c0_.id) AS sclr4 FROM cms_users c0_ WHERE sclr4 = ?"
1131         );
1132     }
1133
1134     /**
1135      * @group DDC-1298
1136      */
1137     public function testSelectForeignKeyPKWithoutFields()
1138     {
1139         $this->assertSqlGeneration(
1140             "SELECT t, s, l FROM Doctrine\Tests\Models\DDC117\DDC117Link l INNER JOIN l.target t INNER JOIN l.source s",
1141             "SELECT d0_.article_id AS article_id0, d0_.title AS title1, d1_.article_id AS article_id2, d1_.title AS title3, d2_.source_id AS source_id4, d2_.target_id AS target_id5 FROM DDC117Link d2_ INNER JOIN DDC117Article d0_ ON d2_.target_id = d0_.article_id INNER JOIN DDC117Article d1_ ON d2_.source_id = d1_.article_id"
1142         );
1143     }
1144
1145     public function testGeneralCaseWithSingleWhenClause()
1146     {
1147         $this->assertSqlGeneration(
1148             "SELECT g.id, CASE WHEN ((g.id / 2) > 18) THEN 1 ELSE 0 END AS test FROM Doctrine\Tests\Models\CMS\CmsGroup g",
1149             "SELECT c0_.id AS id0, CASE WHEN (c0_.id / 2 > 18) THEN 1 ELSE 0 END AS sclr1 FROM cms_groups c0_"
1150         );
1151     }
1152
1153     public function testGeneralCaseWithMultipleWhenClause()
1154     {
1155         $this->assertSqlGeneration(
1156             "SELECT g.id, CASE WHEN (g.id / 2 < 10) THEN 2 WHEN ((g.id / 2) > 20) THEN 1 ELSE 0 END AS test FROM Doctrine\Tests\Models\CMS\CmsGroup g",
1157             "SELECT c0_.id AS id0, CASE WHEN (c0_.id / 2 < 10) THEN 2 WHEN (c0_.id / 2 > 20) THEN 1 ELSE 0 END AS sclr1 FROM cms_groups c0_"
1158         );
1159     }
1160
1161     public function testSimpleCaseWithSingleWhenClause()
1162     {
1163         $this->assertSqlGeneration(
1164             "SELECT g FROM Doctrine\Tests\Models\CMS\CmsGroup g WHERE g.id = CASE g.name WHEN 'admin' THEN 1 ELSE 2 END",
1165             "SELECT c0_.id AS id0, c0_.name AS name1 FROM cms_groups c0_ WHERE c0_.id = CASE c0_.name WHEN 'admin' THEN 1 ELSE 2 END"
1166         );
1167     }
1168
1169     public function testSimpleCaseWithMultipleWhenClause()
1170     {
1171         $this->assertSqlGeneration(
1172             "SELECT g FROM Doctrine\Tests\Models\CMS\CmsGroup g WHERE g.id = (CASE g.name WHEN 'admin' THEN 1 WHEN 'moderator' THEN 2 ELSE 3 END)",
1173             "SELECT c0_.id AS id0, c0_.name AS name1 FROM cms_groups c0_ WHERE c0_.id = CASE c0_.name WHEN 'admin' THEN 1 WHEN 'moderator' THEN 2 ELSE 3 END"
1174         );
1175     }
1176
1177     public function testGeneralCaseWithSingleWhenClauseInSubselect()
1178     {
1179         $this->assertSqlGeneration(
1180             "SELECT g FROM Doctrine\Tests\Models\CMS\CmsGroup g WHERE g.id IN (SELECT CASE WHEN ((g2.id / 2) > 18) THEN 2 ELSE 1 END FROM Doctrine\Tests\Models\CMS\CmsGroup g2)",
1181             "SELECT c0_.id AS id0, c0_.name AS name1 FROM cms_groups c0_ WHERE c0_.id IN (SELECT CASE WHEN (c1_.id / 2 > 18) THEN 2 ELSE 1 END AS sclr2 FROM cms_groups c1_)"
1182         );
1183     }
1184
1185     public function testGeneralCaseWithMultipleWhenClauseInSubselect()
1186     {
1187         $this->assertSqlGeneration(
1188             "SELECT g FROM Doctrine\Tests\Models\CMS\CmsGroup g WHERE g.id IN (SELECT CASE WHEN (g.id / 2 < 10) THEN 3 WHEN ((g.id / 2) > 20) THEN 2 ELSE 1 END FROM Doctrine\Tests\Models\CMS\CmsGroup g2)",
1189             "SELECT c0_.id AS id0, c0_.name AS name1 FROM cms_groups c0_ WHERE c0_.id IN (SELECT CASE WHEN (c0_.id / 2 < 10) THEN 3 WHEN (c0_.id / 2 > 20) THEN 2 ELSE 1 END AS sclr2 FROM cms_groups c1_)"
1190         );
1191     }
1192
1193     public function testSimpleCaseWithSingleWhenClauseInSubselect()
1194     {
1195         $this->assertSqlGeneration(
1196             "SELECT g FROM Doctrine\Tests\Models\CMS\CmsGroup g WHERE g.id IN (SELECT CASE g2.name WHEN 'admin' THEN 1 ELSE 2 END FROM Doctrine\Tests\Models\CMS\CmsGroup g2)",
1197             "SELECT c0_.id AS id0, c0_.name AS name1 FROM cms_groups c0_ WHERE c0_.id IN (SELECT CASE c1_.name WHEN 'admin' THEN 1 ELSE 2 END AS sclr2 FROM cms_groups c1_)"
1198         );
1199     }
1200
1201     public function testSimpleCaseWithMultipleWhenClauseInSubselect()
1202     {
1203         $this->assertSqlGeneration(
1204             "SELECT g FROM Doctrine\Tests\Models\CMS\CmsGroup g WHERE g.id IN (SELECT CASE g2.name WHEN 'admin' THEN 1 WHEN 'moderator' THEN 2 ELSE 3 END FROM Doctrine\Tests\Models\CMS\CmsGroup g2)",
1205             "SELECT c0_.id AS id0, c0_.name AS name1 FROM cms_groups c0_ WHERE c0_.id IN (SELECT CASE c1_.name WHEN 'admin' THEN 1 WHEN 'moderator' THEN 2 ELSE 3 END AS sclr2 FROM cms_groups c1_)"
1206         );
1207     }
1208
1209     /**
1210      * @group DDC-1696
1211      */
1212     public function testSimpleCaseWithStringPrimary()
1213     {
1214         $this->assertSqlGeneration(
1215             "SELECT g.id, CASE WHEN ((g.id / 2) > 18) THEN 'Foo' ELSE 'Bar' END AS test FROM Doctrine\Tests\Models\CMS\CmsGroup g",
1216             "SELECT c0_.id AS id0, CASE WHEN (c0_.id / 2 > 18) THEN 'Foo' ELSE 'Bar' END AS sclr1 FROM cms_groups c0_"
1217         );
1218     }
1219
1220     /**
1221      * @group DDC-1339
1222      */
1223     public function testIdentityFunctionInSelectClause()
1224     {
1225         $this->assertSqlGeneration(
1226             "SELECT IDENTITY(u.email) as email_id FROM Doctrine\Tests\Models\CMS\CmsUser u",
1227             "SELECT c0_.email_id AS sclr0 FROM cms_users c0_"
1228         );
1229     }
1230
1231     /**
1232      * @group DDC-1339
1233      */
1234     public function testIdentityFunctionDoesNotAcceptStateField()
1235     {
1236         $this->assertInvalidSqlGeneration(
1237             "SELECT IDENTITY(u.name) as name FROM Doctrine\Tests\Models\CMS\CmsUser u",
1238             "Doctrine\ORM\Query\QueryException"
1239         );
1240     }
1241
1242     /**
1243      * @group DDC-1389
1244      */
1245     public function testInheritanceTypeJoinInRootClassWithDisabledForcePartialLoad()
1246     {
1247         $this->assertSqlGeneration(
1248             'SELECT p FROM Doctrine\Tests\Models\Company\CompanyPerson p',
1249             'SELECT c0_.id AS id0, c0_.name AS name1, c1_.title AS title2, c2_.salary AS salary3, c2_.department AS department4, c2_.startDate AS startDate5, c0_.discr AS discr6, c0_.spouse_id AS spouse_id7, c1_.car_id AS car_id8 FROM company_persons c0_ LEFT JOIN company_managers c1_ ON c0_.id = c1_.id LEFT JOIN company_employees c2_ ON c0_.id = c2_.id',
1250             array(Query::HINT_FORCE_PARTIAL_LOAD => false)
1251         );
1252     }
1253
1254     /**
1255      * @group DDC-1389
1256      */
1257     public function testInheritanceTypeJoinInRootClassWithEnabledForcePartialLoad()
1258     {
1259         $this->assertSqlGeneration(
1260             'SELECT p FROM Doctrine\Tests\Models\Company\CompanyPerson p',
1261             'SELECT c0_.id AS id0, c0_.name AS name1, c0_.discr AS discr2 FROM company_persons c0_',
1262             array(Query::HINT_FORCE_PARTIAL_LOAD => true)
1263         );
1264     }
1265
1266     /**
1267      * @group DDC-1389
1268      */
1269     public function testInheritanceTypeJoinInChildClassWithDisabledForcePartialLoad()
1270     {
1271         $this->assertSqlGeneration(
1272             'SELECT e FROM Doctrine\Tests\Models\Company\CompanyEmployee e',
1273             'SELECT c0_.id AS id0, c0_.name AS name1, c1_.salary AS salary2, c1_.department AS department3, c1_.startDate AS startDate4, c2_.title AS title5, c0_.discr AS discr6, c0_.spouse_id AS spouse_id7, c2_.car_id AS car_id8 FROM company_employees c1_ INNER JOIN company_persons c0_ ON c1_.id = c0_.id LEFT JOIN company_managers c2_ ON c1_.id = c2_.id',
1274             array(Query::HINT_FORCE_PARTIAL_LOAD => false)
1275         );
1276     }
1277
1278     /**
1279      * @group DDC-1389
1280      */
1281     public function testInheritanceTypeJoinInChildClassWithEnabledForcePartialLoad()
1282     {
1283         $this->assertSqlGeneration(
1284             'SELECT e FROM Doctrine\Tests\Models\Company\CompanyEmployee e',
1285             'SELECT c0_.id AS id0, c0_.name AS name1, c1_.salary AS salary2, c1_.department AS department3, c1_.startDate AS startDate4, c0_.discr AS discr5 FROM company_employees c1_ INNER JOIN company_persons c0_ ON c1_.id = c0_.id',
1286             array(Query::HINT_FORCE_PARTIAL_LOAD => true)
1287         );
1288     }
1289
1290     /**
1291      * @group DDC-1389
1292      */
1293     public function testInheritanceTypeJoinInLeafClassWithDisabledForcePartialLoad()
1294     {
1295         $this->assertSqlGeneration(
1296             'SELECT m FROM Doctrine\Tests\Models\Company\CompanyManager m',
1297             'SELECT c0_.id AS id0, c0_.name AS name1, c1_.salary AS salary2, c1_.department AS department3, c1_.startDate AS startDate4, c2_.title AS title5, c0_.discr AS discr6, c0_.spouse_id AS spouse_id7, c2_.car_id AS car_id8 FROM company_managers c2_ INNER JOIN company_employees c1_ ON c2_.id = c1_.id INNER JOIN company_persons c0_ ON c2_.id = c0_.id',
1298             array(Query::HINT_FORCE_PARTIAL_LOAD => false)
1299         );
1300     }
1301
1302     /**
1303      * @group DDC-1389
1304      */
1305     public function testInheritanceTypeJoinInLeafClassWithEnabledForcePartialLoad()
1306     {
1307         $this->assertSqlGeneration(
1308             'SELECT m FROM Doctrine\Tests\Models\Company\CompanyManager m',
1309             'SELECT c0_.id AS id0, c0_.name AS name1, c1_.salary AS salary2, c1_.department AS department3, c1_.startDate AS startDate4, c2_.title AS title5, c0_.discr AS discr6 FROM company_managers c2_ INNER JOIN company_employees c1_ ON c2_.id = c1_.id INNER JOIN company_persons c0_ ON c2_.id = c0_.id',
1310             array(Query::HINT_FORCE_PARTIAL_LOAD => true)
1311         );
1312     }
1313
1314     /**
1315      * @group DDC-1389
1316      */
1317     public function testInheritanceTypeSingleTableInRootClassWithDisabledForcePartialLoad()
1318     {
1319         $this->assertSqlGeneration(
1320             'SELECT c FROM Doctrine\Tests\Models\Company\CompanyContract c',
1321             "SELECT c0_.id AS id0, c0_.completed AS completed1, c0_.fixPrice AS fixPrice2, c0_.hoursWorked AS hoursWorked3, c0_.pricePerHour AS pricePerHour4, c0_.maxPrice AS maxPrice5, c0_.discr AS discr6, c0_.salesPerson_id AS salesPerson_id7 FROM company_contracts c0_ WHERE c0_.discr IN ('fix', 'flexible', 'flexultra')",
1322             array(Query::HINT_FORCE_PARTIAL_LOAD => false)
1323         );
1324     }
1325
1326     /**
1327      * @group DDC-1389
1328      */
1329     public function testInheritanceTypeSingleTableInRootClassWithEnabledForcePartialLoad()
1330     {
1331         $this->assertSqlGeneration(
1332             'SELECT c FROM Doctrine\Tests\Models\Company\CompanyContract c',
1333             "SELECT c0_.id AS id0, c0_.completed AS completed1, c0_.fixPrice AS fixPrice2, c0_.hoursWorked AS hoursWorked3, c0_.pricePerHour AS pricePerHour4, c0_.maxPrice AS maxPrice5, c0_.discr AS discr6 FROM company_contracts c0_ WHERE c0_.discr IN ('fix', 'flexible', 'flexultra')",
1334             array(Query::HINT_FORCE_PARTIAL_LOAD => true)
1335         );
1336     }
1337
1338     /**
1339      * @group DDC-1389
1340      */
1341     public function testInheritanceTypeSingleTableInChildClassWithDisabledForcePartialLoad()
1342     {
1343         $this->assertSqlGeneration(
1344             'SELECT fc FROM Doctrine\Tests\Models\Company\CompanyFlexContract fc',
1345             "SELECT c0_.id AS id0, c0_.completed AS completed1, c0_.hoursWorked AS hoursWorked2, c0_.pricePerHour AS pricePerHour3, c0_.maxPrice AS maxPrice4, c0_.discr AS discr5, c0_.salesPerson_id AS salesPerson_id6 FROM company_contracts c0_ WHERE c0_.discr IN ('flexible', 'flexultra')",
1346             array(Query::HINT_FORCE_PARTIAL_LOAD => false)
1347         );
1348     }
1349
1350     /**
1351      * @group DDC-1389
1352      */
1353     public function testInheritanceTypeSingleTableInChildClassWithEnabledForcePartialLoad()
1354     {
1355         $this->assertSqlGeneration(
1356             'SELECT fc FROM Doctrine\Tests\Models\Company\CompanyFlexContract fc',
1357             "SELECT c0_.id AS id0, c0_.completed AS completed1, c0_.hoursWorked AS hoursWorked2, c0_.pricePerHour AS pricePerHour3, c0_.maxPrice AS maxPrice4, c0_.discr AS discr5 FROM company_contracts c0_ WHERE c0_.discr IN ('flexible', 'flexultra')",
1358             array(Query::HINT_FORCE_PARTIAL_LOAD => true)
1359         );
1360     }
1361
1362     /**
1363      * @group DDC-1389
1364      */
1365     public function testInheritanceTypeSingleTableInLeafClassWithDisabledForcePartialLoad()
1366     {
1367         $this->assertSqlGeneration(
1368             'SELECT fuc FROM Doctrine\Tests\Models\Company\CompanyFlexUltraContract fuc',
1369             "SELECT c0_.id AS id0, c0_.completed AS completed1, c0_.hoursWorked AS hoursWorked2, c0_.pricePerHour AS pricePerHour3, c0_.maxPrice AS maxPrice4, c0_.discr AS discr5, c0_.salesPerson_id AS salesPerson_id6 FROM company_contracts c0_ WHERE c0_.discr IN ('flexultra')",
1370             array(Query::HINT_FORCE_PARTIAL_LOAD => false)
1371         );
1372     }
1373
1374     /**
1375      * @group DDC-1389
1376      */
1377     public function testInheritanceTypeSingleTableInLeafClassWithEnabledForcePartialLoad()
1378     {
1379         $this->assertSqlGeneration(
1380             'SELECT fuc FROM Doctrine\Tests\Models\Company\CompanyFlexUltraContract fuc',
1381             "SELECT c0_.id AS id0, c0_.completed AS completed1, c0_.hoursWorked AS hoursWorked2, c0_.pricePerHour AS pricePerHour3, c0_.maxPrice AS maxPrice4, c0_.discr AS discr5 FROM company_contracts c0_ WHERE c0_.discr IN ('flexultra')",
1382             array(Query::HINT_FORCE_PARTIAL_LOAD => true)
1383         );
1384     }
1385
1386     /**
1387      * @group DDC-1161
1388      */
1389     public function testSelfReferenceWithOneToOneDoesNotDuplicateAlias()
1390     {
1391         $this->assertSqlGeneration(
1392             'SELECT p, pp FROM Doctrine\Tests\Models\Company\CompanyPerson p JOIN p.spouse pp',
1393             "SELECT c0_.id AS id0, c0_.name AS name1, c1_.title AS title2, c2_.salary AS salary3, c2_.department AS department4, c2_.startDate AS startDate5, c3_.id AS id6, c3_.name AS name7, c4_.title AS title8, c5_.salary AS salary9, c5_.department AS department10, c5_.startDate AS startDate11, c0_.discr AS discr12, c0_.spouse_id AS spouse_id13, c1_.car_id AS car_id14, c3_.discr AS discr15, c3_.spouse_id AS spouse_id16, c4_.car_id AS car_id17 FROM company_persons c0_ LEFT JOIN company_managers c1_ ON c0_.id = c1_.id LEFT JOIN company_employees c2_ ON c0_.id = c2_.id INNER JOIN company_persons c3_ ON c0_.spouse_id = c3_.id LEFT JOIN company_managers c4_ ON c3_.id = c4_.id LEFT JOIN company_employees c5_ ON c3_.id = c5_.id",
1394             array(Query::HINT_FORCE_PARTIAL_LOAD => false)
1395         );
1396     }
1397
1398     /**
1399      * @group DDC-1384
1400      */
1401     public function testAliasDoesNotExceedPlatformDefinedLength()
1402     {
1403         $this->assertSqlGeneration(
1404             'SELECT m FROM ' . __NAMESPACE__ .  '\\DDC1384Model m',
1405             "SELECT d0_.aVeryLongIdentifierThatShouldBeShortenedByTheSQLWalker_fooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo AS fooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo0 FROM DDC1384Model d0_"
1406         );
1407     }
1408
1409     /**
1410      * @group DDC-331
1411      * @group DDC-1384
1412      */
1413     public function testIssue331()
1414     {
1415         $this->assertSqlGeneration(
1416             'SELECT e.name FROM Doctrine\Tests\Models\Company\CompanyEmployee e',
1417             'SELECT c0_.name AS name0 FROM company_employees c1_ INNER JOIN company_persons c0_ ON c1_.id = c0_.id'
1418         );
1419     }
1420     /**
1421      * @group DDC-1435
1422      */
1423     public function testForeignKeyAsPrimaryKeySubselect()
1424     {
1425         $this->assertSqlGeneration(
1426             "SELECT s FROM Doctrine\Tests\Models\DDC117\DDC117Article s WHERE EXISTS (SELECT r FROM Doctrine\Tests\Models\DDC117\DDC117Reference r WHERE r.source = s)",
1427             "SELECT d0_.article_id AS article_id0, d0_.title AS title1 FROM DDC117Article d0_ WHERE EXISTS (SELECT d1_.source_id, d1_.target_id FROM DDC117Reference d1_ WHERE d1_.source_id = d0_.article_id)"
1428         );
1429     }
1430
1431     /**
1432      * @group DDC-1474
1433      */
1434     public function testSelectWithArithmeticExpressionBeforeField()
1435     {
1436         $this->assertSqlGeneration(
1437             'SELECT - e.value AS value, e.id FROM ' . __NAMESPACE__ . '\DDC1474Entity e',
1438             'SELECT -d0_.value AS sclr0, d0_.id AS id1 FROM DDC1474Entity d0_'
1439         );
1440
1441         $this->assertSqlGeneration(
1442             'SELECT e.id, + e.value AS value FROM ' . __NAMESPACE__ . '\DDC1474Entity e',
1443             'SELECT d0_.id AS id0, +d0_.value AS sclr1 FROM DDC1474Entity d0_'
1444         );
1445     }
1446
1447      /**
1448      * @group DDC-1430
1449      */
1450     public function testGroupByAllFieldsWhenObjectHasForeignKeys()
1451     {
1452         $this->assertSqlGeneration(
1453             'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u GROUP BY u',
1454             'SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 FROM cms_users c0_ GROUP BY c0_.id, c0_.status, c0_.username, c0_.name, c0_.email_id'
1455         );
1456
1457         $this->assertSqlGeneration(
1458             'SELECT e FROM Doctrine\Tests\Models\CMS\CmsEmployee e GROUP BY e',
1459             'SELECT c0_.id AS id0, c0_.name AS name1 FROM cms_employees c0_ GROUP BY c0_.id, c0_.name, c0_.spouse_id'
1460         );
1461     }
1462
1463     /**
1464      * @group DDC-1236
1465      */
1466     public function testGroupBySupportsResultVariable()
1467     {
1468         $this->assertSqlGeneration(
1469             'SELECT u, u.status AS st FROM Doctrine\Tests\Models\CMS\CmsUser u GROUP BY st',
1470             'SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3, c0_.status AS status4 FROM cms_users c0_ GROUP BY status4'
1471         );
1472     }
1473
1474     /**
1475      * @group DDC-1236
1476      */
1477     public function testGroupBySupportsIdentificationVariable()
1478     {
1479         $this->assertSqlGeneration(
1480             'SELECT u AS user FROM Doctrine\Tests\Models\CMS\CmsUser u GROUP BY user',
1481             'SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 FROM cms_users c0_ GROUP BY id0, status1, username2, name3'
1482         );
1483     }
1484
1485     /**
1486      * @group DDC-1213
1487      */
1488     public function testSupportsBitComparison()
1489     {
1490         $this->assertSqlGeneration(
1491             'SELECT BIT_OR(4,2), BIT_AND(4,2), u FROM Doctrine\Tests\Models\CMS\CmsUser u',
1492             'SELECT (4 | 2) AS sclr0, (4 & 2) AS sclr1, c0_.id AS id2, c0_.status AS status3, c0_.username AS username4, c0_.name AS name5 FROM cms_users c0_'
1493         );
1494         $this->assertSqlGeneration(
1495             'SELECT BIT_OR(u.id,2), BIT_AND(u.id,2) FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE BIT_OR(u.id,2) > 0',
1496             'SELECT (c0_.id | 2) AS sclr0, (c0_.id & 2) AS sclr1 FROM cms_users c0_ WHERE (c0_.id | 2) > 0'
1497         );
1498         $this->assertSqlGeneration(
1499             'SELECT BIT_OR(u.id,2), BIT_AND(u.id,2) FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE BIT_AND(u.id , 4) > 0',
1500             'SELECT (c0_.id | 2) AS sclr0, (c0_.id & 2) AS sclr1 FROM cms_users c0_ WHERE (c0_.id & 4) > 0'
1501         );
1502         $this->assertSqlGeneration(
1503             'SELECT BIT_OR(u.id,2), BIT_AND(u.id,2) FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE BIT_OR(u.id , 2) > 0 OR BIT_AND(u.id , 4) > 0',
1504             'SELECT (c0_.id | 2) AS sclr0, (c0_.id & 2) AS sclr1 FROM cms_users c0_ WHERE (c0_.id | 2) > 0 OR (c0_.id & 4) > 0'
1505         );
1506     }
1507
1508     /**
1509      * @group DDC-1539
1510      */
1511     public function testParenthesesOnTheLeftHandOfComparison()
1512     {
1513         $this->assertSqlGeneration(
1514             'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u where ( (u.id + u.id) * u.id ) > 100',
1515             'SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 FROM cms_users c0_ WHERE (c0_.id + c0_.id) * c0_.id > 100'
1516         );
1517         $this->assertSqlGeneration(
1518             'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u where (u.id + u.id) * u.id > 100',
1519             'SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 FROM cms_users c0_ WHERE (c0_.id + c0_.id) * c0_.id > 100'
1520         );
1521         $this->assertSqlGeneration(
1522             'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u where 100 < (u.id + u.id) * u.id ',
1523             'SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 FROM cms_users c0_ WHERE 100 < (c0_.id + c0_.id) * c0_.id'
1524         );
1525     }
1526
1527     /**
1528      * @group DDC-1557
1529      */
1530     public function testSupportsSubSqlFunction()
1531     {
1532         $this->assertSqlGeneration(
1533             'SELECT u1 FROM Doctrine\Tests\Models\CMS\CmsUser u1 WHERE u1.name IN ( SELECT TRIM(u2.name) FROM Doctrine\Tests\Models\CMS\CmsUser u2 )',
1534             'SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 FROM cms_users c0_ WHERE c0_.name IN (SELECT TRIM(c1_.name) AS sclr4 FROM cms_users c1_)'
1535         );
1536         $this->assertSqlGeneration(
1537             'SELECT u1 FROM Doctrine\Tests\Models\CMS\CmsUser u1 WHERE u1.name IN ( SELECT TRIM(u2.name) FROM Doctrine\Tests\Models\CMS\CmsUser u2  WHERE LOWER(u2.name) LIKE \'%fabio%\')',
1538             'SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 FROM cms_users c0_ WHERE c0_.name IN (SELECT TRIM(c1_.name) AS sclr4 FROM cms_users c1_ WHERE LOWER(c1_.name) LIKE \'%fabio%\')'
1539         );
1540         $this->assertSqlGeneration(
1541             'SELECT u1 FROM Doctrine\Tests\Models\CMS\CmsUser u1 WHERE u1.email IN ( SELECT TRIM(IDENTITY(u2.email)) FROM Doctrine\Tests\Models\CMS\CmsUser u2 )',
1542             'SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 FROM cms_users c0_ WHERE c0_.email_id IN (SELECT TRIM(c1_.email_id) AS sclr4 FROM cms_users c1_)'
1543         );
1544         $this->assertSqlGeneration(
1545             'SELECT u1 FROM Doctrine\Tests\Models\CMS\CmsUser u1 WHERE u1.email IN ( SELECT IDENTITY(u2.email) FROM Doctrine\Tests\Models\CMS\CmsUser u2 )',
1546             'SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 FROM cms_users c0_ WHERE c0_.email_id IN (SELECT c1_.email_id AS sclr4 FROM cms_users c1_)'
1547         );
1548         $this->assertSqlGeneration(
1549             'SELECT u1 FROM Doctrine\Tests\Models\CMS\CmsUser u1 WHERE COUNT(u1.id) = ( SELECT SUM(u2.id) FROM Doctrine\Tests\Models\CMS\CmsUser u2 )',
1550             'SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 FROM cms_users c0_ WHERE COUNT(c0_.id) = (SELECT SUM(c1_.id) AS dctrn__1 FROM cms_users c1_)'
1551         );
1552         $this->assertSqlGeneration(
1553             'SELECT u1 FROM Doctrine\Tests\Models\CMS\CmsUser u1 WHERE COUNT(u1.id) <= ( SELECT SUM(u2.id) + COUNT(u2.email) FROM Doctrine\Tests\Models\CMS\CmsUser u2 )',
1554             'SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 FROM cms_users c0_ WHERE COUNT(c0_.id) <= (SELECT SUM(c1_.id) + COUNT(c1_.email_id) AS sclr4 FROM cms_users c1_)'
1555         );
1556     }
1557
1558     public function testCustomTypeValueSql()
1559     {
1560         if (DBALType::hasType('negative_to_positive')) {
1561             DBALType::overrideType('negative_to_positive', 'Doctrine\Tests\DbalTypes\NegativeToPositiveType');
1562         } else {
1563             DBALType::addType('negative_to_positive', 'Doctrine\Tests\DbalTypes\NegativeToPositiveType');
1564         }
1565
1566         $this->assertSqlGeneration(
1567             'SELECT p.customInteger FROM Doctrine\Tests\Models\CustomType\CustomTypeParent p WHERE p.id = 1',
1568             'SELECT -(c0_.customInteger) AS customInteger0 FROM customtype_parents c0_ WHERE c0_.id = 1'
1569         );
1570     }
1571
1572     public function testCustomTypeValueSqlIgnoresIdentifierColumn()
1573     {
1574         if (DBALType::hasType('negative_to_positive')) {
1575             DBALType::overrideType('negative_to_positive', 'Doctrine\Tests\DbalTypes\NegativeToPositiveType');
1576         } else {
1577             DBALType::addType('negative_to_positive', 'Doctrine\Tests\DbalTypes\NegativeToPositiveType');
1578         }
1579
1580         $this->assertSqlGeneration(
1581             'SELECT p.id FROM Doctrine\Tests\Models\CustomType\CustomTypeParent p WHERE p.id = 1',
1582             'SELECT c0_.id AS id0 FROM customtype_parents c0_ WHERE c0_.id = 1'
1583         );
1584     }
1585
1586     public function testCustomTypeValueSqlForAllFields()
1587     {
1588         if (DBALType::hasType('negative_to_positive')) {
1589             DBALType::overrideType('negative_to_positive', 'Doctrine\Tests\DbalTypes\NegativeToPositiveType');
1590         } else {
1591             DBALType::addType('negative_to_positive', 'Doctrine\Tests\DbalTypes\NegativeToPositiveType');
1592         }
1593
1594         $this->assertSqlGeneration(
1595             'SELECT p FROM Doctrine\Tests\Models\CustomType\CustomTypeParent p',
1596             'SELECT c0_.id AS id0, -(c0_.customInteger) AS customInteger1 FROM customtype_parents c0_'
1597         );
1598     }
1599
1600     public function testCustomTypeValueSqlForPartialObject()
1601     {
1602         if (DBALType::hasType('negative_to_positive')) {
1603             DBALType::overrideType('negative_to_positive', 'Doctrine\Tests\DbalTypes\NegativeToPositiveType');
1604         } else {
1605             DBALType::addType('negative_to_positive', 'Doctrine\Tests\DbalTypes\NegativeToPositiveType');
1606         }
1607
1608         $this->assertSqlGeneration(
1609             'SELECT partial p.{id, customInteger} FROM Doctrine\Tests\Models\CustomType\CustomTypeParent p',
1610             'SELECT c0_.id AS id0, -(c0_.customInteger) AS customInteger1 FROM customtype_parents c0_'
1611         );
1612     }
1613
1614     /**
1615      * @group DDC-1529
1616      */
1617     public function testMultipleFromAndInheritanceCondition()
1618     {
1619         $this->assertSqlGeneration(
1620             'SELECT fix, flex FROM Doctrine\Tests\Models\Company\CompanyFixContract fix, Doctrine\Tests\Models\Company\CompanyFlexContract flex',
1621             "SELECT c0_.id AS id0, c0_.completed AS completed1, c0_.fixPrice AS fixPrice2, c1_.id AS id3, c1_.completed AS completed4, c1_.hoursWorked AS hoursWorked5, c1_.pricePerHour AS pricePerHour6, c1_.maxPrice AS maxPrice7, c0_.discr AS discr8, c1_.discr AS discr9 FROM company_contracts c0_, company_contracts c1_ WHERE (c0_.discr IN ('fix') AND c1_.discr IN ('flexible', 'flexultra'))"
1622         );
1623     }
1624
1625     /**
1626      * @group DDC-775
1627      */
1628     public function testOrderByClauseSupportsSimpleArithmeticExpression()
1629     {
1630         $this->assertSqlGeneration(
1631             'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u ORDER BY u.id + 1 ',
1632             'SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 FROM cms_users c0_ ORDER BY c0_.id + 1 ASC'
1633         );
1634         $this->assertSqlGeneration(
1635             'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u ORDER BY ( ( (u.id + 1) * (u.id - 1) ) / 2)',
1636             'SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 FROM cms_users c0_ ORDER BY (c0_.id + 1) * (c0_.id - 1) / 2 ASC'
1637         );
1638         $this->assertSqlGeneration(
1639             'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u ORDER BY ((u.id + 5000) * u.id + 3) ',
1640             'SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 FROM cms_users c0_ ORDER BY (c0_.id + 5000) * c0_.id + 3 ASC'
1641         );
1642     }
1643
1644     /**
1645      * @group DDC-1719
1646      */
1647     public function testStripNonAlphanumericCharactersFromAlias()
1648     {
1649         $this->assertSqlGeneration(
1650             'SELECT e FROM Doctrine\Tests\Models\Quote\SimpleEntity e',
1651             'SELECT d0_."simple-entity-id" AS simpleentityid0, d0_."simple-entity-value" AS simpleentityvalue1 FROM "ddc-1719-simple-entity" d0_'
1652         );
1653
1654         $this->assertSqlGeneration(
1655             'SELECT e.value FROM Doctrine\Tests\Models\Quote\SimpleEntity e ORDER BY e.value',
1656             'SELECT d0_."simple-entity-value" AS simpleentityvalue0 FROM "ddc-1719-simple-entity" d0_ ORDER BY d0_."simple-entity-value" ASC'
1657         );
1658
1659         $this->assertSqlGeneration(
1660             'SELECT TRIM(e.value) FROM Doctrine\Tests\Models\Quote\SimpleEntity e ORDER BY e.value',
1661             'SELECT TRIM(d0_."simple-entity-value") AS sclr0 FROM "ddc-1719-simple-entity" d0_ ORDER BY d0_."simple-entity-value" ASC'
1662         );
1663     }
1664
1665    /**
1666     * @group DDC-1845
1667     */
1668     public function testQuotedWalkJoinVariableDeclaration()
1669     {
1670         $this->assertSqlGeneration(
1671             'SELECT u, a FROM Doctrine\Tests\Models\Quote\User u JOIN u.address a',
1672             'SELECT q0_."user-id" AS userid0, q0_."user-name" AS username1, q1_."address-id" AS addressid2, q1_."address-zip" AS addresszip3 FROM "quote-user" q0_ INNER JOIN "quote-address" q1_ ON q0_."address-id" = q1_."address-id"'
1673         );
1674
1675         $this->assertSqlGeneration(
1676             'SELECT u, p FROM Doctrine\Tests\Models\Quote\User u JOIN u.phones p',
1677             'SELECT q0_."user-id" AS userid0, q0_."user-name" AS username1, q1_."phone-number" AS phonenumber2 FROM "quote-user" q0_ INNER JOIN "quote-phone" q1_ ON q0_."user-id" = q1_."user-id"'
1678         );
1679
1680         $this->assertSqlGeneration(
1681             'SELECT u, g FROM Doctrine\Tests\Models\Quote\User u JOIN u.groups g',
1682             'SELECT q0_."user-id" AS userid0, q0_."user-name" AS username1, q1_."group-id" AS groupid2, q1_."group-name" AS groupname3 FROM "quote-user" q0_ INNER JOIN "quote-users-groups" q2_ ON q0_."user-id" = q2_."user-id" INNER JOIN "quote-group" q1_ ON q1_."group-id" = q2_."group-id"'
1683         );
1684
1685         $this->assertSqlGeneration(
1686             'SELECT a, u FROM Doctrine\Tests\Models\Quote\Address a JOIN a.user u',
1687             'SELECT q0_."address-id" AS addressid0, q0_."address-zip" AS addresszip1, q1_."user-id" AS userid2, q1_."user-name" AS username3 FROM "quote-address" q0_ INNER JOIN "quote-user" q1_ ON q0_."user-id" = q1_."user-id"'
1688         );
1689
1690         $this->assertSqlGeneration(
1691             'SELECT g, u FROM Doctrine\Tests\Models\Quote\Group g JOIN g.users u',
1692             'SELECT q0_."group-id" AS groupid0, q0_."group-name" AS groupname1, q1_."user-id" AS userid2, q1_."user-name" AS username3 FROM "quote-group" q0_ INNER JOIN "quote-users-groups" q2_ ON q0_."group-id" = q2_."group-id" INNER JOIN "quote-user" q1_ ON q1_."user-id" = q2_."user-id"'
1693         );
1694
1695         $this->assertSqlGeneration(
1696             'SELECT g, p FROM Doctrine\Tests\Models\Quote\Group g JOIN g.parent p',
1697             'SELECT q0_."group-id" AS groupid0, q0_."group-name" AS groupname1, q1_."group-id" AS groupid2, q1_."group-name" AS groupname3 FROM "quote-group" q0_ INNER JOIN "quote-group" q1_ ON q0_."parent-id" = q1_."group-id"'
1698         );
1699     }
1700 }
1701
1702 class MyAbsFunction extends \Doctrine\ORM\Query\AST\Functions\FunctionNode
1703 {
1704     public $simpleArithmeticExpression;
1705
1706     /**
1707      * @override
1708      */
1709     public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker)
1710     {
1711         return 'ABS(' . $sqlWalker->walkSimpleArithmeticExpression($this->simpleArithmeticExpression) . ')';
1712     }
1713
1714     /**
1715      * @override
1716      */
1717     public function parse(\Doctrine\ORM\Query\Parser $parser)
1718     {
1719         $lexer = $parser->getLexer();
1720
1721         $parser->match(\Doctrine\ORM\Query\Lexer::T_IDENTIFIER);
1722         $parser->match(\Doctrine\ORM\Query\Lexer::T_OPEN_PARENTHESIS);
1723
1724         $this->simpleArithmeticExpression = $parser->SimpleArithmeticExpression();
1725
1726         $parser->match(\Doctrine\ORM\Query\Lexer::T_CLOSE_PARENTHESIS);
1727     }
1728 }
1729 /**
1730  * @Entity
1731  */
1732 class DDC1384Model
1733 {
1734     /**
1735      * @Id
1736      * @Column(type="integer")
1737      * @GeneratedValue
1738      */
1739     protected $aVeryLongIdentifierThatShouldBeShortenedByTheSQLWalker_fooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo;
1740 }
1741
1742
1743 /**
1744  * @Entity
1745  */
1746 class DDC1474Entity
1747 {
1748
1749     /**
1750      * @Id
1751      * @Column(type="integer")
1752      * @GeneratedValue()
1753      */
1754     protected $id;
1755
1756     /**
1757      * @column(type="float")
1758      */
1759     private $value;
1760
1761     /**
1762      * @param string $float
1763      */
1764     public function __construct($float)
1765     {
1766         $this->value = $float;
1767     }
1768
1769     /**
1770      * @return integer
1771      */
1772     public function getId()
1773     {
1774         return $this->id;
1775     }
1776
1777     /**
1778      * @return float
1779      */
1780     public function getValue()
1781     {
1782         return $this->value;
1783     }
1784
1785     /**
1786      * @param float $value
1787      */
1788     public function setValue($value)
1789     {
1790         $this->value = $value;
1791     }
1792
1793 }
1794