/tests/Zend/Db/Select/StaticTest.php

https://github.com/devilsansclue/ZendFramework · PHP · 823 lines · 448 code · 129 blank · 246 comment · 2 complexity · c5129f78468409d22a63ebcea9a96693 MD5 · raw file

  1. <?php
  2. /**
  3. * Zend Framework
  4. *
  5. * LICENSE
  6. *
  7. * This source file is subject to the new BSD license that is bundled
  8. * with this package in the file LICENSE.txt.
  9. * It is also available through the world-wide-web at this URL:
  10. * http://framework.zend.com/license/new-bsd
  11. * If you did not receive a copy of the license and are unable to
  12. * obtain it through the world-wide-web, please send an email
  13. * to license@zend.com so we can send you a copy immediately.
  14. *
  15. * @category Zend
  16. * @package Zend_Db
  17. * @subpackage UnitTests
  18. * @copyright Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com)
  19. * @license http://framework.zend.com/license/new-bsd New BSD License
  20. * @version $Id$
  21. */
  22. /**
  23. * @see Zend_Db_Select_TestCommon
  24. */
  25. require_once 'Zend/Db/Select/TestCommon.php';
  26. /**
  27. * @category Zend
  28. * @package Zend_Db
  29. * @subpackage UnitTests
  30. * @copyright Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com)
  31. * @license http://framework.zend.com/license/new-bsd New BSD License
  32. * @group Zend_Db
  33. * @group Zend_Db_Select
  34. */
  35. class Zend_Db_Select_StaticTest extends Zend_Db_Select_TestCommon
  36. {
  37. /**
  38. * Test basic use of the Zend_Db_Select class.
  39. *
  40. * @return void
  41. */
  42. public function testSelect()
  43. {
  44. $select = $this->_select();
  45. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  46. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts"', $sql);
  47. }
  48. /**
  49. * Test basic use of the Zend_Db_Select class.
  50. *
  51. * @return void
  52. */
  53. public function testSelectQuery()
  54. {
  55. $select = $this->_select();
  56. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  57. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts"', $sql);
  58. $stmt = $select->query();
  59. Zend_Loader::loadClass('Zend_Db_Statement_Static');
  60. $this->assertType('Zend_Db_Statement_Static', $stmt);
  61. }
  62. /**
  63. * ZF-2017: Test bind use of the Zend_Db_Select class.
  64. */
  65. public function testSelectQueryWithBinds()
  66. {
  67. $select = $this->_select()->where('product_id = :product_id')
  68. ->bind(array(':product_id' => 1));
  69. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  70. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts" WHERE (product_id = :product_id)', $sql);
  71. $stmt = $select->query();
  72. Zend_Loader::loadClass('Zend_Db_Statement_Static');
  73. $this->assertType('Zend_Db_Statement_Static', $stmt);
  74. }
  75. /**
  76. * Test Zend_Db_Select specifying columns
  77. *
  78. * @return void
  79. */
  80. public function testSelectColumnsScalar()
  81. {
  82. $select = $this->_selectColumnsScalar();
  83. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  84. $this->assertEquals('SELECT "zfproducts"."product_name" FROM "zfproducts"', $sql);
  85. }
  86. /**
  87. * Test Zend_Db_Select specifying columns
  88. *
  89. * @return void
  90. */
  91. public function testSelectColumnsArray()
  92. {
  93. $select = $this->_selectColumnsArray();
  94. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  95. $this->assertEquals('SELECT "zfproducts"."product_id", "zfproducts"."product_name" FROM "zfproducts"', $sql);
  96. }
  97. /**
  98. * Test support for column aliases.
  99. * e.g. from('table', array('alias' => 'col1')).
  100. *
  101. * @return void
  102. */
  103. public function testSelectColumnsAliases()
  104. {
  105. $select = $this->_selectColumnsAliases();
  106. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  107. $this->assertEquals('SELECT "zfproducts"."product_name" AS "alias" FROM "zfproducts"', $sql);
  108. }
  109. /**
  110. * Test syntax to support qualified column names,
  111. * e.g. from('table', array('table.col1', 'table.col2')).
  112. *
  113. * @return void
  114. */
  115. public function testSelectColumnsQualified()
  116. {
  117. $select = $this->_selectColumnsQualified();
  118. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  119. $this->assertEquals('SELECT "zfproducts"."product_name" FROM "zfproducts"', $sql);
  120. }
  121. /**
  122. * Test support for columns defined by Zend_Db_Expr.
  123. *
  124. * @return void
  125. */
  126. public function testSelectColumnsExpr()
  127. {
  128. $select = $this->_selectColumnsExpr();
  129. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  130. $this->assertEquals('SELECT "zfproducts"."product_name" FROM "zfproducts"', $sql);
  131. }
  132. /**
  133. * Test support for automatic conversion of SQL functions to
  134. * Zend_Db_Expr, e.g. from('table', array('COUNT(*)'))
  135. * should generate the same result as
  136. * from('table', array(new Zend_Db_Expr('COUNT(*)')))
  137. */
  138. public function testSelectColumnsAutoExpr()
  139. {
  140. $select = $this->_selectColumnsAutoExpr();
  141. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  142. $this->assertEquals('SELECT COUNT(*) AS "count" FROM "zfproducts"', $sql);
  143. }
  144. /**
  145. * Test adding the DISTINCT query modifier to a Zend_Db_Select object.
  146. */
  147. public function testSelectDistinctModifier()
  148. {
  149. $select = $this->_selectDistinctModifier();
  150. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  151. $this->assertEquals('SELECT DISTINCT 327 FROM "zfproducts"', $sql);
  152. }
  153. /**
  154. * Test support for schema-qualified table names in from()
  155. * e.g. from('schema.table').
  156. */
  157. public function testSelectFromQualified()
  158. {
  159. $select = $this->_selectFromQualified();
  160. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  161. $this->assertEquals('SELECT "zfproducts".* FROM "dummy"."zfproducts"', $sql);
  162. }
  163. public function testSelectColumnsReset()
  164. {
  165. $select = $this->_selectColumnsReset()
  166. ->reset(Zend_Db_Select::COLUMNS)
  167. ->columns('product_name');
  168. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  169. $this->assertEquals('SELECT "p"."product_name" FROM "zfproducts" AS "p"', $sql);
  170. }
  171. public function testSelectFromForUpdate()
  172. {
  173. $select = $this->_db->select()
  174. ->from("zfproducts")
  175. ->forUpdate();
  176. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  177. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts" FOR UPDATE', $sql);
  178. }
  179. /**
  180. * Test adding a JOIN to a Zend_Db_Select object.
  181. */
  182. public function testSelectJoin()
  183. {
  184. $select = $this->_selectJoin();
  185. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  186. $this->assertEquals('SELECT "zfproducts".*, "zfbugs_products".* FROM "zfproducts" INNER JOIN "zfbugs_products" ON "zfproducts"."product_id" = "zfbugs_products"."product_id"', $sql);
  187. }
  188. /**
  189. * Test adding an INNER JOIN to a Zend_Db_Select object.
  190. * This should be exactly the same as the plain JOIN clause.
  191. */
  192. public function testSelectJoinWithCorrelationName()
  193. {
  194. $select = $this->_selectJoinWithCorrelationName();
  195. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  196. $this->assertEquals('SELECT "xyz1".*, "xyz2".* FROM "zfproducts" AS "xyz1" INNER JOIN "zfbugs_products" AS "xyz2" ON "xyz1"."product_id" = "xyz2"."product_id" WHERE ("xyz1"."product_id" = 1)', $sql);
  197. }
  198. /**
  199. * Test adding an INNER JOIN to a Zend_Db_Select object.
  200. * This should be exactly the same as the plain JOIN clause.
  201. */
  202. public function testSelectJoinInner()
  203. {
  204. $select = $this->_selectJoinInner();
  205. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  206. $this->assertEquals('SELECT "zfproducts".*, "zfbugs_products".* FROM "zfproducts" INNER JOIN "zfbugs_products" ON "zfproducts"."product_id" = "zfbugs_products"."product_id"', $sql);
  207. }
  208. /**
  209. * Test adding an outer join to a Zend_Db_Select object.
  210. */
  211. public function testSelectJoinLeft()
  212. {
  213. $select = $this->_selectJoinLeft();
  214. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  215. $this->assertEquals('SELECT "zfbugs".*, "zfbugs_products".* FROM "zfbugs" LEFT JOIN "zfbugs_products" ON "zfbugs"."bug_id" = "zfbugs_products"."bug_id"', $sql);
  216. }
  217. /**
  218. * Test adding an outer join to a Zend_Db_Select object.
  219. */
  220. public function testSelectJoinRight()
  221. {
  222. $select = $this->_selectJoinRight();
  223. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  224. $this->assertEquals('SELECT "zfbugs_products".*, "zfbugs".* FROM "zfbugs_products" RIGHT JOIN "zfbugs" ON "zfbugs_products"."bug_id" = "zfbugs"."bug_id"', $sql);
  225. }
  226. /**
  227. * Test adding a cross join to a Zend_Db_Select object.
  228. */
  229. public function testSelectJoinCross()
  230. {
  231. $select = $this->_selectJoinCross();
  232. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  233. $this->assertEquals('SELECT "zfproducts".*, "zfbugs_products".* FROM "zfproducts" CROSS JOIN "zfbugs_products"', $sql);
  234. }
  235. /**
  236. * Test support for schema-qualified table names in join(),
  237. * e.g. join('schema.table', 'condition')
  238. */
  239. public function testSelectJoinQualified()
  240. {
  241. $select = $this->_selectJoinQualified();
  242. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  243. $this->assertEquals('SELECT "zfproducts".*, "zfbugs_products".* FROM "zfproducts" INNER JOIN "dummy"."zfbugs_products" ON "zfproducts"."product_id" = "zfbugs_products"."product_id"', $sql);
  244. }
  245. /**
  246. * Test adding a JOIN USING to a Zend_Db_Select object.
  247. */
  248. public function testSelectJoinUsing()
  249. {
  250. $select = $this->_selectJoinUsing();
  251. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  252. $this->assertEquals('SELECT "zfproducts".*, "zfbugs_products".* FROM "zfproducts" INNER JOIN "zfbugs_products" ON "zfbugs_products"."product_id" = "zfproducts"."product_id" WHERE ("zfbugs_products"."product_id" < 3)', $sql);
  253. }
  254. /**
  255. * Test adding a JOIN INNER USING to a Zend_Db_Select object.
  256. */
  257. public function testSelectJoinInnerUsing()
  258. {
  259. $select = $this->_selectJoinInnerUsing();
  260. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  261. $this->assertEquals('SELECT "zfproducts".*, "zfbugs_products".* FROM "zfproducts" INNER JOIN "zfbugs_products" ON "zfbugs_products"."product_id" = "zfproducts"."product_id" WHERE ("zfbugs_products"."product_id" < 3)', $sql);
  262. }
  263. public function testSelectJoinWithNocolumns()
  264. {
  265. $select = $this->_selectJoinWithNocolumns();
  266. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  267. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts" INNER JOIN "zfbugs" ON "zfbugs"."bug_id" = 1 INNER JOIN "zfbugs_products" ON "zfproducts"."product_id" = "zfbugs_products"."product_id" AND "zfbugs_products"."bug_id" = "zfbugs"."bug_id"', $sql);
  268. }
  269. /**
  270. * Test adding a WHERE clause to a Zend_Db_Select object.
  271. */
  272. public function testSelectWhere()
  273. {
  274. $select = $this->_selectWhere();
  275. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  276. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts" WHERE ("product_id" = 2)', $sql);
  277. }
  278. /**
  279. * Test adding an array in the WHERE clause to a Zend_Db_Select object.
  280. */
  281. public function testSelectWhereArray()
  282. {
  283. $select = $this->_selectWhereArray();
  284. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  285. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts" WHERE ("product_id" IN (1, 2, 3))', $sql);
  286. }
  287. /**
  288. * test adding more WHERE conditions,
  289. * which should be combined with AND by default.
  290. */
  291. public function testSelectWhereAnd()
  292. {
  293. $select = $this->_selectWhereAnd();
  294. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  295. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts" WHERE ("product_id" = 2) AND ("product_id" = 1)', $sql);
  296. }
  297. /**
  298. * Test support for where() with a parameter,
  299. * e.g. where('id = ?', 1).
  300. */
  301. public function testSelectWhereWithParameter()
  302. {
  303. $select = $this->_selectWhereWithParameter();
  304. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  305. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts" WHERE ("product_id" = 2)', $sql);
  306. }
  307. /**
  308. * Test support for where() with a parameter,
  309. * e.g. where('id = ?', 1).
  310. */
  311. public function testSelectWhereWithType()
  312. {
  313. $select = $this->_selectWhereWithType();
  314. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  315. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts" WHERE ("product_id" = 2)', $sql);
  316. }
  317. /**
  318. * Test support for where() with a float parameter,
  319. * e.g. where('id = ?', 1).
  320. */
  321. public function testSelectWhereWithTypeFloat()
  322. {
  323. $select = $this->_selectWhereWithTypeFloat();
  324. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  325. $this->assertEquals('SELECT "zfprice".* FROM "zfprice" WHERE ("price_total" = 200.450000)', $sql);
  326. }
  327. /**
  328. * * Test adding an OR WHERE clause to a Zend_Db_Select object.
  329. */
  330. public function testSelectWhereOr()
  331. {
  332. $select = $this->_selectWhereOr();
  333. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  334. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts" WHERE ("product_id" = 1) OR ("product_id" = 2)', $sql);
  335. }
  336. /**
  337. * Test support for where() with a parameter,
  338. * e.g. orWhere('id = ?', 2).
  339. */
  340. public function testSelectWhereOrWithParameter()
  341. {
  342. $select = $this->_selectWhereOrWithParameter();
  343. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  344. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts" WHERE ("product_id" = 1) OR ("product_id" = 2)', $sql);
  345. }
  346. /**
  347. * Test adding a GROUP BY clause to a Zend_Db_Select object.
  348. */
  349. public function testSelectGroupBy()
  350. {
  351. $select = $this->_selectGroupBy();
  352. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  353. $this->assertEquals('SELECT "zfbugs_products"."bug_id", COUNT(*) AS "thecount" FROM "zfbugs_products" GROUP BY "bug_id" ORDER BY "bug_id" ASC', $sql);
  354. }
  355. /**
  356. * Test support for qualified table in group(),
  357. * e.g. group('schema.table').
  358. */
  359. public function testSelectGroupByQualified()
  360. {
  361. $select = $this->_selectGroupByQualified();
  362. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  363. $this->assertEquals('SELECT "zfbugs_products"."bug_id", COUNT(*) AS "thecount" FROM "zfbugs_products" GROUP BY "zfbugs_products"."bug_id" ORDER BY "bug_id" ASC', $sql);
  364. }
  365. /**
  366. * Test support for Zend_Db_Expr in group(),
  367. * e.g. group(new Zend_Db_Expr('id+1'))
  368. */
  369. public function testSelectGroupByExpr()
  370. {
  371. $select = $this->_selectGroupByExpr();
  372. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  373. $this->assertEquals('SELECT "bug_id"+1 AS "bug_id", COUNT(*) AS "thecount" FROM "zfbugs_products" GROUP BY "bug_id"+1 ORDER BY "bug_id"+1', $sql);
  374. }
  375. /**
  376. * Test support for automatic conversion of a SQL
  377. * function to a Zend_Db_Expr in group(),
  378. * e.g. group('LOWER(title)') should give the same
  379. * result as group(new Zend_Db_Expr('LOWER(title)')).
  380. */
  381. public function testSelectGroupByAutoExpr()
  382. {
  383. $select = $this->_selectGroupByAutoExpr();
  384. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  385. $this->assertEquals('SELECT ABS("zfbugs_products"."bug_id") AS "bug_id", COUNT(*) AS "thecount" FROM "zfbugs_products" GROUP BY ABS("zfbugs_products"."bug_id") ORDER BY ABS("zfbugs_products"."bug_id") ASC', $sql);
  386. }
  387. /**
  388. * Test adding a HAVING clause to a Zend_Db_Select object.
  389. */
  390. public function testSelectHaving()
  391. {
  392. $select = $this->_selectHaving();
  393. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  394. $this->assertEquals('SELECT "zfbugs_products"."bug_id", COUNT(*) AS "thecount" FROM "zfbugs_products" GROUP BY "bug_id" HAVING (COUNT(*) > 1) ORDER BY "bug_id" ASC', $sql);
  395. }
  396. public function testSelectHavingAnd()
  397. {
  398. $select = $this->_selectHavingAnd();
  399. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  400. $this->assertEquals('SELECT "zfbugs_products"."bug_id", COUNT(*) AS "thecount" FROM "zfbugs_products" GROUP BY "bug_id" HAVING (COUNT(*) > 1) AND (COUNT(*) = 1) ORDER BY "bug_id" ASC', $sql);
  401. }
  402. /**
  403. * Test support for parameter in having(),
  404. * e.g. having('count(*) > ?', 1).
  405. */
  406. public function testSelectHavingWithParameter()
  407. {
  408. $select = $this->_selectHavingWithParameter();
  409. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  410. $this->assertEquals('SELECT "zfbugs_products"."bug_id", COUNT(*) AS "thecount" FROM "zfbugs_products" GROUP BY "bug_id" HAVING (COUNT(*) > 1) ORDER BY "bug_id" ASC', $sql);
  411. }
  412. /**
  413. * Test adding a HAVING clause to a Zend_Db_Select object.
  414. */
  415. public function testSelectHavingOr()
  416. {
  417. $select = $this->_selectHavingOr();
  418. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  419. $this->assertEquals('SELECT "zfbugs_products"."bug_id", COUNT(*) AS "thecount" FROM "zfbugs_products" GROUP BY "bug_id" HAVING (COUNT(*) > 1) OR (COUNT(*) = 1) ORDER BY "bug_id" ASC', $sql);
  420. }
  421. /**
  422. * Test support for parameter in orHaving(),
  423. * e.g. orHaving('count(*) > ?', 1).
  424. */
  425. public function testSelectHavingOrWithParameter()
  426. {
  427. $select = $this->_selectHavingOrWithParameter();
  428. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  429. $this->assertEquals('SELECT "zfbugs_products"."bug_id", COUNT(*) AS "thecount" FROM "zfbugs_products" GROUP BY "bug_id" HAVING (COUNT(*) > 1) OR (COUNT(*) = 1) ORDER BY "bug_id" ASC', $sql);
  430. }
  431. /**
  432. * Test if the quotation type could be passed
  433. *
  434. * @group ZF-10000
  435. */
  436. public function testSelectHavingQuoteBySpecificType()
  437. {
  438. $select = $this->_select()
  439. ->columns(array('count' => 'COUNT(*)'))
  440. ->group('bug_id');
  441. $select->having('COUNT(*) > ?', '1', Zend_Db::INT_TYPE);
  442. $this->assertEquals('SELECT "zfproducts".*, COUNT(*) AS "count" FROM "zfproducts" GROUP BY "bug_id" HAVING (COUNT(*) > 1)', $select->__toString());
  443. }
  444. /**
  445. * Test if the quotation is done for int
  446. *
  447. * @group ZF-10000
  448. */
  449. public function testSelectHavingQuoteAsIntAutomatically()
  450. {
  451. $select = $this->_select()
  452. ->columns(array('count' => 'COUNT(*)'))
  453. ->group('bug_id');
  454. $select->having('COUNT(*) > ?', 1);
  455. $this->assertEquals('SELECT "zfproducts".*, COUNT(*) AS "count" FROM "zfproducts" GROUP BY "bug_id" HAVING (COUNT(*) > 1)', $select->__toString());
  456. }
  457. /**
  458. * Test if the quotation is done for string
  459. *
  460. * @group ZF-10000
  461. */
  462. public function testSelectHavingQuoteAsStringAutomatically()
  463. {
  464. $select = $this->_select()
  465. ->columns(array('count' => 'COUNT(*)'))
  466. ->group('bug_id');
  467. $select->having('COUNT(*) > ?', '1');
  468. $this->assertEquals('SELECT "zfproducts".*, COUNT(*) AS "count" FROM "zfproducts" GROUP BY "bug_id" HAVING (COUNT(*) > \'1\')', $select->__toString());
  469. }
  470. /**
  471. * Test if the quotation type could be passed
  472. *
  473. * @group ZF-10000
  474. */
  475. public function testSelectOrHavingQuoteBySpecificType()
  476. {
  477. $select = $this->_select()
  478. ->columns(array('count' => 'COUNT(*)'))
  479. ->group('bug_id');
  480. $select->having('COUNT(*) > ?', '1', Zend_Db::INT_TYPE);
  481. $select->orHaving('COUNT(*) = ?', '2', Zend_Db::INT_TYPE);
  482. $this->assertEquals('SELECT "zfproducts".*, COUNT(*) AS "count" FROM "zfproducts" GROUP BY "bug_id" HAVING (COUNT(*) > 1) OR (COUNT(*) = 2)', $select->__toString());
  483. }
  484. /**
  485. * Test if the quotation is done for int
  486. *
  487. * @group ZF-10000
  488. */
  489. public function testSelectOrHavingQuoteAsIntAutomatically()
  490. {
  491. $select = $this->_select()
  492. ->columns(array('count' => 'COUNT(*)'))
  493. ->group('bug_id');
  494. $select->having('COUNT(*) > ?', 1);
  495. $select->orHaving('COUNT(*) = ?', 2);
  496. $this->assertEquals('SELECT "zfproducts".*, COUNT(*) AS "count" FROM "zfproducts" GROUP BY "bug_id" HAVING (COUNT(*) > 1) OR (COUNT(*) = 2)', $select->__toString());
  497. }
  498. /**
  499. * Test if the quotation is done for string
  500. *
  501. * @group ZF-10000
  502. */
  503. public function testSelectOrHavingQuoteAsStringAutomatically()
  504. {
  505. $select = $this->_select()
  506. ->columns(array('count' => 'COUNT(*)'))
  507. ->group('bug_id');
  508. $select->having('COUNT(*) > ?', '1');
  509. $select->orHaving('COUNT(*) = ?', '2');
  510. $this->assertEquals('SELECT "zfproducts".*, COUNT(*) AS "count" FROM "zfproducts" GROUP BY "bug_id" HAVING (COUNT(*) > \'1\') OR (COUNT(*) = \'2\')', $select->__toString());
  511. }
  512. /**
  513. * @group ZF-10589
  514. */
  515. public function testHavingZero()
  516. {
  517. $select = $this->_select()
  518. ->columns(array('count' => 'COUNT(*)'))
  519. ->group('bug_id');
  520. $select->having('COUNT(*) > ?', 0);
  521. $this->assertEquals('SELECT "zfproducts".*, COUNT(*) AS "count" FROM "zfproducts" GROUP BY "bug_id" HAVING (COUNT(*) > 0)', $select->__toString());
  522. }
  523. /**
  524. * Test adding an ORDER BY clause to a Zend_Db_Select object.
  525. */
  526. public function testSelectOrderBy()
  527. {
  528. $select = $this->_selectOrderBy();
  529. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  530. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts" ORDER BY "product_id" ASC', $sql);
  531. }
  532. public function testSelectOrderByArray()
  533. {
  534. $select = $this->_selectOrderByArray();
  535. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  536. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts" ORDER BY "product_name" ASC, "product_id" ASC', $sql);
  537. }
  538. public function testSelectOrderByAsc()
  539. {
  540. $select = $this->_selectOrderByAsc();
  541. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  542. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts" ORDER BY "product_id" ASC', $sql);
  543. }
  544. public function testSelectOrderByDesc()
  545. {
  546. $select = $this->_selectOrderByDesc();
  547. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  548. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts" ORDER BY "product_id" DESC', $sql);
  549. }
  550. /**
  551. * Test support for qualified table in order(),
  552. * e.g. order('schema.table').
  553. */
  554. public function testSelectOrderByQualified()
  555. {
  556. $select = $this->_selectOrderByQualified();
  557. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  558. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts" ORDER BY "zfproducts"."product_id" ASC', $sql);
  559. }
  560. /**
  561. * Test support for Zend_Db_Expr in order(),
  562. * e.g. order(new Zend_Db_Expr('id+1')).
  563. */
  564. public function testSelectOrderByExpr()
  565. {
  566. $select = $this->_selectOrderByExpr();
  567. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  568. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts" ORDER BY 1', $sql);
  569. }
  570. /**
  571. * Test automatic conversion of SQL functions to
  572. * Zend_Db_Expr, e.g. order('LOWER(title)')
  573. * should give the same result as
  574. * order(new Zend_Db_Expr('LOWER(title)')).
  575. */
  576. public function testSelectOrderByAutoExpr()
  577. {
  578. $select = $this->_selectOrderByAutoExpr();
  579. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  580. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts" ORDER BY ABS("zfproducts"."product_id") ASC', $sql);
  581. }
  582. /**
  583. * Test ORDER BY clause that contains multiple lines.
  584. * See ZF-1822, which says that the regexp matching
  585. * ASC|DESC fails when string is multi-line.
  586. */
  587. public function testSelectOrderByMultiLine()
  588. {
  589. $select = $this->_selectOrderByMultiLine();
  590. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  591. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts" ORDER BY "product_id" DESC', $sql);
  592. }
  593. /**
  594. * Test adding a LIMIT clause to a Zend_Db_Select object.
  595. */
  596. public function testSelectLimit()
  597. {
  598. $select = $this->_selectLimit();
  599. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  600. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts" ORDER BY "product_id" ASC LIMIT 1 OFFSET 0', $sql);
  601. }
  602. /**
  603. * Not applicable in static test
  604. * @group ZF-5263
  605. */
  606. public function testSelectLimitFetchCol()
  607. {}
  608. public function testSelectLimitNone()
  609. {
  610. $select = $this->_selectLimitNone();
  611. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  612. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts" ORDER BY "product_id" ASC', $sql);
  613. }
  614. public function testSelectLimitOffset()
  615. {
  616. $select = $this->_selectLimitOffset();
  617. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  618. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts" ORDER BY "product_id" ASC LIMIT 1 OFFSET 1', $sql);
  619. }
  620. /**
  621. * Test the limitPage() method of a Zend_Db_Select object.
  622. */
  623. public function testSelectLimitPageOne()
  624. {
  625. $select = $this->_selectLimitPageOne();
  626. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  627. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts" ORDER BY "product_id" ASC LIMIT 1 OFFSET 0', $sql);
  628. }
  629. public function testSelectLimitPageTwo()
  630. {
  631. $select = $this->_selectLimitPageTwo();
  632. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  633. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts" ORDER BY "product_id" ASC LIMIT 1 OFFSET 1', $sql);
  634. }
  635. public function testSelectUnionString()
  636. {
  637. $select = $this->_selectUnionString();
  638. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  639. $this->assertEquals('SELECT "bug_id" AS "id", "bug_status" AS "name" FROM "zfbugs" UNION SELECT "product_id" AS "id", "product_name" AS "name" FROM "zfproducts" ORDER BY "id" ASC', $sql);
  640. }
  641. public function testSelectOrderByPosition()
  642. {
  643. $select = $this->_selectOrderByPosition();
  644. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  645. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts" ORDER BY 2 ASC', $sql);
  646. }
  647. public function testSelectOrderByPositionAsc()
  648. {
  649. $select = $this->_selectOrderByPositionAsc();
  650. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  651. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts" ORDER BY 2 ASC', $sql);
  652. }
  653. public function testSelectOrderByPositionDesc()
  654. {
  655. $select = $this->_selectOrderByPositionDesc();
  656. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  657. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts" ORDER BY 2 DESC', $sql);
  658. }
  659. public function testSelectOrderByMultiplePositions()
  660. {
  661. $select = $this->_selectOrderByMultiplePositions();
  662. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  663. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts" ORDER BY 2 DESC, 1 DESC', $sql);
  664. }
  665. /**
  666. * @group ZF-7491
  667. */
  668. public function testPhp53Assembly()
  669. {
  670. if (version_compare(PHP_VERSION, 5.3) == -1 ) {
  671. $this->markTestSkipped('This test needs at least PHP 5.3');
  672. }
  673. $select = $this->_db->select();
  674. $select->from('table1', '*');
  675. $select->joinLeft(array('table2'), 'table1.id=table2.id');
  676. $target = 'SELECT "table1".*, "table2".* FROM "table1"'
  677. . "\n" . ' LEFT JOIN "table2" ON table1.id=table2.id';
  678. $this->assertEquals($target, $select->assemble());
  679. }
  680. /**
  681. * @group ZF-7223
  682. */
  683. public function testMaxIntegerValueWithLimit()
  684. {
  685. $select = $this->_db->select();
  686. $select->from('table1')->limit(0, 5);
  687. $target = 'SELECT "table1".* FROM "table1" LIMIT ' . PHP_INT_MAX . ' OFFSET 5';
  688. $this->assertEquals($target, $select->assemble());
  689. }
  690. public function getDriver()
  691. {
  692. return 'Static';
  693. }
  694. }