PageRenderTime 65ms CodeModel.GetById 26ms RepoModel.GetById 1ms app.codeStats 0ms

/vendor/chamilo/chash/vendor/doctrine/orm/tests/Doctrine/Tests/ORM/Query/SelectSqlGenerationTest.php

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