StaticTest.php 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823
  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. * @group ZF-3792
  248. */
  249. public function testSelectJoinUsing()
  250. {
  251. $select = $this->_selectJoinUsing();
  252. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  253. $this->assertEquals('SELECT "zfproducts".*, "zfbugs_products".* FROM "zfproducts" INNER JOIN "zfbugs_products" USING ("product_id") WHERE ("zfbugs_products"."product_id" < 3)', $sql);
  254. }
  255. /**
  256. * Test adding a JOIN INNER USING to a Zend_Db_Select object.
  257. * @group ZF-3792
  258. */
  259. public function testSelectJoinInnerUsing()
  260. {
  261. $select = $this->_selectJoinInnerUsing();
  262. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  263. $this->assertEquals('SELECT "zfproducts".*, "zfbugs_products".* FROM "zfproducts" INNER JOIN "zfbugs_products" USING ("product_id") WHERE ("zfbugs_products"."product_id" < 3)', $sql);
  264. }
  265. public function testSelectJoinWithNocolumns()
  266. {
  267. $select = $this->_selectJoinWithNocolumns();
  268. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  269. $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);
  270. }
  271. /**
  272. * Test adding a WHERE clause to a Zend_Db_Select object.
  273. */
  274. public function testSelectWhere()
  275. {
  276. $select = $this->_selectWhere();
  277. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  278. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts" WHERE ("product_id" = 2)', $sql);
  279. }
  280. /**
  281. * Test adding an array in the WHERE clause to a Zend_Db_Select object.
  282. */
  283. public function testSelectWhereArray()
  284. {
  285. $select = $this->_selectWhereArray();
  286. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  287. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts" WHERE ("product_id" IN (1, 2, 3))', $sql);
  288. }
  289. /**
  290. * test adding more WHERE conditions,
  291. * which should be combined with AND by default.
  292. */
  293. public function testSelectWhereAnd()
  294. {
  295. $select = $this->_selectWhereAnd();
  296. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  297. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts" WHERE ("product_id" = 2) AND ("product_id" = 1)', $sql);
  298. }
  299. /**
  300. * Test support for where() with a parameter,
  301. * e.g. where('id = ?', 1).
  302. */
  303. public function testSelectWhereWithParameter()
  304. {
  305. $select = $this->_selectWhereWithParameter();
  306. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  307. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts" WHERE ("product_id" = 2)', $sql);
  308. }
  309. /**
  310. * Test support for where() with a parameter,
  311. * e.g. where('id = ?', 1).
  312. */
  313. public function testSelectWhereWithType()
  314. {
  315. $select = $this->_selectWhereWithType();
  316. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  317. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts" WHERE ("product_id" = 2)', $sql);
  318. }
  319. /**
  320. * Test support for where() with a float parameter,
  321. * e.g. where('id = ?', 1).
  322. */
  323. public function testSelectWhereWithTypeFloat()
  324. {
  325. $select = $this->_selectWhereWithTypeFloat();
  326. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  327. $this->assertEquals('SELECT "zfprice".* FROM "zfprice" WHERE ("price_total" = 200.450000)', $sql);
  328. }
  329. /**
  330. * * Test adding an OR WHERE clause to a Zend_Db_Select object.
  331. */
  332. public function testSelectWhereOr()
  333. {
  334. $select = $this->_selectWhereOr();
  335. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  336. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts" WHERE ("product_id" = 1) OR ("product_id" = 2)', $sql);
  337. }
  338. /**
  339. * Test support for where() with a parameter,
  340. * e.g. orWhere('id = ?', 2).
  341. */
  342. public function testSelectWhereOrWithParameter()
  343. {
  344. $select = $this->_selectWhereOrWithParameter();
  345. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  346. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts" WHERE ("product_id" = 1) OR ("product_id" = 2)', $sql);
  347. }
  348. /**
  349. * Test adding a GROUP BY clause to a Zend_Db_Select object.
  350. */
  351. public function testSelectGroupBy()
  352. {
  353. $select = $this->_selectGroupBy();
  354. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  355. $this->assertEquals('SELECT "zfbugs_products"."bug_id", COUNT(*) AS "thecount" FROM "zfbugs_products" GROUP BY "bug_id" ORDER BY "bug_id" ASC', $sql);
  356. }
  357. /**
  358. * Test support for qualified table in group(),
  359. * e.g. group('schema.table').
  360. */
  361. public function testSelectGroupByQualified()
  362. {
  363. $select = $this->_selectGroupByQualified();
  364. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  365. $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);
  366. }
  367. /**
  368. * Test support for Zend_Db_Expr in group(),
  369. * e.g. group(new Zend_Db_Expr('id+1'))
  370. */
  371. public function testSelectGroupByExpr()
  372. {
  373. $select = $this->_selectGroupByExpr();
  374. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  375. $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);
  376. }
  377. /**
  378. * Test support for automatic conversion of a SQL
  379. * function to a Zend_Db_Expr in group(),
  380. * e.g. group('LOWER(title)') should give the same
  381. * result as group(new Zend_Db_Expr('LOWER(title)')).
  382. */
  383. public function testSelectGroupByAutoExpr()
  384. {
  385. $select = $this->_selectGroupByAutoExpr();
  386. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  387. $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);
  388. }
  389. /**
  390. * Test adding a HAVING clause to a Zend_Db_Select object.
  391. */
  392. public function testSelectHaving()
  393. {
  394. $select = $this->_selectHaving();
  395. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  396. $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);
  397. }
  398. public function testSelectHavingAnd()
  399. {
  400. $select = $this->_selectHavingAnd();
  401. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  402. $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);
  403. }
  404. /**
  405. * Test support for parameter in having(),
  406. * e.g. having('count(*) > ?', 1).
  407. */
  408. public function testSelectHavingWithParameter()
  409. {
  410. $select = $this->_selectHavingWithParameter();
  411. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  412. $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);
  413. }
  414. /**
  415. * Test adding a HAVING clause to a Zend_Db_Select object.
  416. */
  417. public function testSelectHavingOr()
  418. {
  419. $select = $this->_selectHavingOr();
  420. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  421. $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);
  422. }
  423. /**
  424. * Test support for parameter in orHaving(),
  425. * e.g. orHaving('count(*) > ?', 1).
  426. */
  427. public function testSelectHavingOrWithParameter()
  428. {
  429. $select = $this->_selectHavingOrWithParameter();
  430. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  431. $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);
  432. }
  433. /**
  434. * Test if the quotation type could be passed
  435. *
  436. * @group ZF-10000
  437. */
  438. public function testSelectHavingQuoteBySpecificType()
  439. {
  440. $select = $this->_select()
  441. ->columns(array('count' => 'COUNT(*)'))
  442. ->group('bug_id');
  443. $select->having('COUNT(*) > ?', '1', Zend_Db::INT_TYPE);
  444. $this->assertEquals('SELECT "zfproducts".*, COUNT(*) AS "count" FROM "zfproducts" GROUP BY "bug_id" HAVING (COUNT(*) > 1)', $select->__toString());
  445. }
  446. /**
  447. * Test if the quotation is done for int
  448. *
  449. * @group ZF-10000
  450. */
  451. public function testSelectHavingQuoteAsIntAutomatically()
  452. {
  453. $select = $this->_select()
  454. ->columns(array('count' => 'COUNT(*)'))
  455. ->group('bug_id');
  456. $select->having('COUNT(*) > ?', 1);
  457. $this->assertEquals('SELECT "zfproducts".*, COUNT(*) AS "count" FROM "zfproducts" GROUP BY "bug_id" HAVING (COUNT(*) > 1)', $select->__toString());
  458. }
  459. /**
  460. * Test if the quotation is done for string
  461. *
  462. * @group ZF-10000
  463. */
  464. public function testSelectHavingQuoteAsStringAutomatically()
  465. {
  466. $select = $this->_select()
  467. ->columns(array('count' => 'COUNT(*)'))
  468. ->group('bug_id');
  469. $select->having('COUNT(*) > ?', '1');
  470. $this->assertEquals('SELECT "zfproducts".*, COUNT(*) AS "count" FROM "zfproducts" GROUP BY "bug_id" HAVING (COUNT(*) > \'1\')', $select->__toString());
  471. }
  472. /**
  473. * Test if the quotation type could be passed
  474. *
  475. * @group ZF-10000
  476. */
  477. public function testSelectOrHavingQuoteBySpecificType()
  478. {
  479. $select = $this->_select()
  480. ->columns(array('count' => 'COUNT(*)'))
  481. ->group('bug_id');
  482. $select->having('COUNT(*) > ?', '1', Zend_Db::INT_TYPE);
  483. $select->orHaving('COUNT(*) = ?', '2', Zend_Db::INT_TYPE);
  484. $this->assertEquals('SELECT "zfproducts".*, COUNT(*) AS "count" FROM "zfproducts" GROUP BY "bug_id" HAVING (COUNT(*) > 1) OR (COUNT(*) = 2)', $select->__toString());
  485. }
  486. /**
  487. * Test if the quotation is done for int
  488. *
  489. * @group ZF-10000
  490. */
  491. public function testSelectOrHavingQuoteAsIntAutomatically()
  492. {
  493. $select = $this->_select()
  494. ->columns(array('count' => 'COUNT(*)'))
  495. ->group('bug_id');
  496. $select->having('COUNT(*) > ?', 1);
  497. $select->orHaving('COUNT(*) = ?', 2);
  498. $this->assertEquals('SELECT "zfproducts".*, COUNT(*) AS "count" FROM "zfproducts" GROUP BY "bug_id" HAVING (COUNT(*) > 1) OR (COUNT(*) = 2)', $select->__toString());
  499. }
  500. /**
  501. * Test if the quotation is done for string
  502. *
  503. * @group ZF-10000
  504. */
  505. public function testSelectOrHavingQuoteAsStringAutomatically()
  506. {
  507. $select = $this->_select()
  508. ->columns(array('count' => 'COUNT(*)'))
  509. ->group('bug_id');
  510. $select->having('COUNT(*) > ?', '1');
  511. $select->orHaving('COUNT(*) = ?', '2');
  512. $this->assertEquals('SELECT "zfproducts".*, COUNT(*) AS "count" FROM "zfproducts" GROUP BY "bug_id" HAVING (COUNT(*) > \'1\') OR (COUNT(*) = \'2\')', $select->__toString());
  513. }
  514. /**
  515. * @group ZF-10589
  516. */
  517. public function testHavingZero()
  518. {
  519. $select = $this->_select()
  520. ->columns(array('count' => 'COUNT(*)'))
  521. ->group('bug_id');
  522. $select->having('COUNT(*) > ?', 0);
  523. $this->assertEquals('SELECT "zfproducts".*, COUNT(*) AS "count" FROM "zfproducts" GROUP BY "bug_id" HAVING (COUNT(*) > 0)', $select->__toString());
  524. }
  525. /**
  526. * Test adding an ORDER BY clause to a Zend_Db_Select object.
  527. */
  528. public function testSelectOrderBy()
  529. {
  530. $select = $this->_selectOrderBy();
  531. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  532. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts" ORDER BY "product_id" ASC', $sql);
  533. }
  534. public function testSelectOrderByArray()
  535. {
  536. $select = $this->_selectOrderByArray();
  537. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  538. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts" ORDER BY "product_name" ASC, "product_id" ASC', $sql);
  539. }
  540. public function testSelectOrderByAsc()
  541. {
  542. $select = $this->_selectOrderByAsc();
  543. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  544. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts" ORDER BY "product_id" ASC', $sql);
  545. }
  546. public function testSelectOrderByDesc()
  547. {
  548. $select = $this->_selectOrderByDesc();
  549. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  550. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts" ORDER BY "product_id" DESC', $sql);
  551. }
  552. /**
  553. * Test support for qualified table in order(),
  554. * e.g. order('schema.table').
  555. */
  556. public function testSelectOrderByQualified()
  557. {
  558. $select = $this->_selectOrderByQualified();
  559. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  560. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts" ORDER BY "zfproducts"."product_id" ASC', $sql);
  561. }
  562. /**
  563. * Test support for Zend_Db_Expr in order(),
  564. * e.g. order(new Zend_Db_Expr('id+1')).
  565. */
  566. public function testSelectOrderByExpr()
  567. {
  568. $select = $this->_selectOrderByExpr();
  569. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  570. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts" ORDER BY 1', $sql);
  571. }
  572. /**
  573. * Test automatic conversion of SQL functions to
  574. * Zend_Db_Expr, e.g. order('LOWER(title)')
  575. * should give the same result as
  576. * order(new Zend_Db_Expr('LOWER(title)')).
  577. */
  578. public function testSelectOrderByAutoExpr()
  579. {
  580. $select = $this->_selectOrderByAutoExpr();
  581. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  582. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts" ORDER BY ABS("zfproducts"."product_id") ASC', $sql);
  583. }
  584. /**
  585. * Test ORDER BY clause that contains multiple lines.
  586. * See ZF-1822, which says that the regexp matching
  587. * ASC|DESC fails when string is multi-line.
  588. */
  589. public function testSelectOrderByMultiLine()
  590. {
  591. $select = $this->_selectOrderByMultiLine();
  592. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  593. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts" ORDER BY "product_id" DESC', $sql);
  594. }
  595. /**
  596. * Test adding a LIMIT clause to a Zend_Db_Select object.
  597. */
  598. public function testSelectLimit()
  599. {
  600. $select = $this->_selectLimit();
  601. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  602. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts" ORDER BY "product_id" ASC LIMIT 1 OFFSET 0', $sql);
  603. }
  604. /**
  605. * Not applicable in static test
  606. * @group ZF-5263
  607. */
  608. public function testSelectLimitFetchCol()
  609. {}
  610. public function testSelectLimitNone()
  611. {
  612. $select = $this->_selectLimitNone();
  613. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  614. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts" ORDER BY "product_id" ASC', $sql);
  615. }
  616. public function testSelectLimitOffset()
  617. {
  618. $select = $this->_selectLimitOffset();
  619. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  620. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts" ORDER BY "product_id" ASC LIMIT 1 OFFSET 1', $sql);
  621. }
  622. /**
  623. * Test the limitPage() method of a Zend_Db_Select object.
  624. */
  625. public function testSelectLimitPageOne()
  626. {
  627. $select = $this->_selectLimitPageOne();
  628. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  629. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts" ORDER BY "product_id" ASC LIMIT 1 OFFSET 0', $sql);
  630. }
  631. public function testSelectLimitPageTwo()
  632. {
  633. $select = $this->_selectLimitPageTwo();
  634. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  635. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts" ORDER BY "product_id" ASC LIMIT 1 OFFSET 1', $sql);
  636. }
  637. public function testSelectUnionString()
  638. {
  639. $select = $this->_selectUnionString();
  640. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  641. $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);
  642. }
  643. public function testSelectOrderByPosition()
  644. {
  645. $select = $this->_selectOrderByPosition();
  646. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  647. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts" ORDER BY 2 ASC', $sql);
  648. }
  649. public function testSelectOrderByPositionAsc()
  650. {
  651. $select = $this->_selectOrderByPositionAsc();
  652. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  653. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts" ORDER BY 2 ASC', $sql);
  654. }
  655. public function testSelectOrderByPositionDesc()
  656. {
  657. $select = $this->_selectOrderByPositionDesc();
  658. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  659. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts" ORDER BY 2 DESC', $sql);
  660. }
  661. public function testSelectOrderByMultiplePositions()
  662. {
  663. $select = $this->_selectOrderByMultiplePositions();
  664. $sql = preg_replace('/\\s+/', ' ', $select->__toString());
  665. $this->assertEquals('SELECT "zfproducts".* FROM "zfproducts" ORDER BY 2 DESC, 1 DESC', $sql);
  666. }
  667. /**
  668. * @group ZF-7491
  669. */
  670. public function testPhp53Assembly()
  671. {
  672. if (version_compare(PHP_VERSION, 5.3) == -1 ) {
  673. $this->markTestSkipped('This test needs at least PHP 5.3');
  674. }
  675. $select = $this->_db->select();
  676. $select->from('table1', '*');
  677. $select->joinLeft(array('table2'), 'table1.id=table2.id');
  678. $target = 'SELECT "table1".*, "table2".* FROM "table1"'
  679. . "\n" . ' LEFT JOIN "table2" ON table1.id=table2.id';
  680. $this->assertEquals($target, $select->assemble());
  681. }
  682. /**
  683. * @group ZF-7223
  684. */
  685. public function testMaxIntegerValueWithLimit()
  686. {
  687. $select = $this->_db->select();
  688. $select->from('table1')->limit(0, 5);
  689. $target = 'SELECT "table1".* FROM "table1" LIMIT ' . PHP_INT_MAX . ' OFFSET 5';
  690. $this->assertEquals($target, $select->assemble());
  691. }
  692. public function getDriver()
  693. {
  694. return 'Static';
  695. }
  696. }