StaticTest.php 38 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063
  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-2015 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-2015 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->assertTrue($stmt instanceof Zend_Db_Statement_Static);
  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->assertTrue($stmt instanceof Zend_Db_Statement_Static);
  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. public function testSqlInjectionWithOrder()
  695. {
  696. $select = $this->_db->select();
  697. $select->from(array('p' => 'products'))->order('MD5(1);select');
  698. $this->assertEquals('SELECT "p".* FROM "products" AS "p" ORDER BY "MD5(1);select" ASC', $select->assemble());
  699. $select = $this->_db->select();
  700. $select->from(array('p' => 'products'))->order('name;select;MD5(1)');
  701. $this->assertEquals('SELECT "p".* FROM "products" AS "p" ORDER BY "name;select;MD5(1)" ASC', $select->assemble());
  702. $select = $this->_db->select();
  703. $select->from(array('p' => 'products'))->order('MD5(1);drop table products; -- )');
  704. $this->assertEquals('SELECT "p".* FROM "products" AS "p" ORDER BY "MD5(1);drop table products; -- )" ASC', $select->assemble());
  705. $select = $this->_db->select();
  706. $select->from('p')->order("MD5(\";(\");DELETE FROM p2; SELECT 1 #)");
  707. $this->assertEquals('SELECT "p".* FROM "p" ORDER BY "MD5("";("");DELETE FROM p2; SELECT 1 #)" ASC', $select->assemble());
  708. }
  709. public function testSqlInjectionWithGroup()
  710. {
  711. $select = $this->_db->select();
  712. $select->from(array('p' => 'products'))->group('ABS("weight")');
  713. $this->assertEquals('SELECT "p".* FROM "products" AS "p" GROUP BY ABS("weight")', $select->assemble());
  714. $select = $this->_db->select();
  715. $select->from(array('p' => 'products'))->group('MD5(1); drop table products; -- )');
  716. $this->assertEquals('SELECT "p".* FROM "products" AS "p" GROUP BY "MD5(1); drop table products; -- )"', $select->assemble());
  717. $select = $this->_db->select();
  718. $select->from('p')->group("MD5(\";(\");DELETE FROM p2; SELECT 1 #)");
  719. $this->assertEquals('SELECT "p".* FROM "p" GROUP BY "MD5("";("");DELETE FROM p2; SELECT 1 #)"', $select->assemble());
  720. }
  721. public function testSqlInjectionInColumn()
  722. {
  723. $select = $this->_db->select();
  724. $select->from(array('p' => 'products'), array('MD5(1); drop table products; -- )'));
  725. $this->assertEquals('SELECT "p"."MD5(1); drop table products; -- )" FROM "products" AS "p"', $select->assemble());
  726. }
  727. public function testIfInColumn()
  728. {
  729. $select = $this->_db->select();
  730. $select->from('table1', '*');
  731. $select->join(array('table2'),
  732. 'table1.id = table2.id',
  733. array('bar' => 'IF(table2.id IS NOT NULL, 1, 0)'));
  734. $this->assertEquals("SELECT \"table1\".*, IF(table2.id IS NOT NULL, 1, 0) AS \"bar\" FROM \"table1\"\n INNER JOIN \"table2\" ON table1.id = table2.id", $select->assemble());
  735. }
  736. public function testNestedIfInColumn()
  737. {
  738. $select = $this->_db->select();
  739. $select->from('table1', '*');
  740. $select->join(array('table2'),
  741. 'table1.id = table2.id',
  742. array('bar' => 'IF(table2.id IS NOT NULL, IF(table2.id2 IS NOT NULL, 1, 2), 0)'));
  743. $this->assertEquals("SELECT \"table1\".*, IF(table2.id IS NOT NULL, IF(table2.id2 IS NOT NULL, 1, 2), 0) AS \"bar\" FROM \"table1\"\n INNER JOIN \"table2\" ON table1.id = table2.id", $select->assemble());
  744. }
  745. public function testDeepNestedIfInColumn()
  746. {
  747. $select = $this->_db->select();
  748. $select->from('table1', '*');
  749. $select->join(array('table2'),
  750. 'table1.id = table2.id',
  751. array('bar' => 'IF(table2.id IS NOT NULL, IF(table2.id2 IS NOT NULL, SUM(1), 2), 0)'));
  752. $this->assertEquals("SELECT \"table1\".*, IF(table2.id IS NOT NULL, IF(table2.id2 IS NOT NULL, SUM(1), 2), 0) AS \"bar\" FROM \"table1\"\n INNER JOIN \"table2\" ON table1.id = table2.id", $select->assemble());
  753. }
  754. public function testNestedUnbalancedParenthesesInColumn()
  755. {
  756. $select = $this->_db->select();
  757. $select->from('table1', '*');
  758. $select->join(array('table2'),
  759. 'table1.id = table2.id',
  760. array('bar' => 'IF(SUM()'));
  761. $this->assertEquals("SELECT \"table1\".*, \"table2\".\"IF(SUM()\" AS \"bar\" FROM \"table1\"\n INNER JOIN \"table2\" ON table1.id = table2.id", $select->assemble());
  762. }
  763. public function testNestedIfInGroup()
  764. {
  765. $select = $this->_db->select();
  766. $select->from(array ('p' => 'product'))
  767. ->group('IF(p.id IS NOT NULL, IF(p.id2 IS NOT NULL, SUM(1), 2), 0)');
  768. $expected = 'SELECT "p".* FROM "product" AS "p" GROUP BY IF(p.id IS NOT NULL, IF(p.id2 IS NOT NULL, SUM(1), 2), 0)';
  769. $this->assertEquals($expected, $select->assemble());
  770. }
  771. public function testUnbalancedParenthesesInGroup()
  772. {
  773. $select = $this->_db->select();
  774. $select->from(array ('p' => 'product'))
  775. ->group('IF(SUM() ASC');
  776. $expected = 'SELECT "p".* FROM "product" AS "p" GROUP BY "IF(SUM() ASC"';
  777. $this->assertEquals($expected, $select->assemble());
  778. }
  779. /**
  780. * @group ZF-378
  781. */
  782. public function testOrderOfSingleFieldWithDirection()
  783. {
  784. $select = $this->_db->select();
  785. $select->from(array ('p' => 'product'))
  786. ->order('productId DESC');
  787. $expected = 'SELECT "p".* FROM "product" AS "p" ORDER BY "productId" DESC';
  788. $this->assertEquals($expected, $select->assemble(),
  789. 'Order direction of field failed');
  790. }
  791. /**
  792. * @group ZF-378
  793. */
  794. public function testOrderOfMultiFieldWithDirection()
  795. {
  796. $select = $this->_db->select();
  797. $select->from(array ('p' => 'product'))
  798. ->order(array ('productId DESC', 'userId ASC'));
  799. $expected = 'SELECT "p".* FROM "product" AS "p" ORDER BY "productId" DESC, "userId" ASC';
  800. $this->assertEquals($expected, $select->assemble(),
  801. 'Order direction of field failed');
  802. }
  803. /**
  804. * @group ZF-378
  805. */
  806. public function testOrderOfMultiFieldButOnlyOneWithDirection()
  807. {
  808. $select = $this->_db->select();
  809. $select->from(array ('p' => 'product'))
  810. ->order(array ('productId', 'userId DESC'));
  811. $expected = 'SELECT "p".* FROM "product" AS "p" ORDER BY "productId" ASC, "userId" DESC';
  812. $this->assertEquals($expected, $select->assemble(),
  813. 'Order direction of field failed');
  814. }
  815. /**
  816. * @group ZF-378
  817. * @group ZF-381
  818. */
  819. public function testOrderOfConditionalFieldWithDirection()
  820. {
  821. $select = $this->_db->select();
  822. $select->from(array ('p' => 'product'))
  823. ->order('IF("productId" > 5,1,0) ASC');
  824. $expected = 'SELECT "p".* FROM "product" AS "p" ORDER BY IF("productId" > 5,1,0) ASC';
  825. $this->assertEquals($expected, $select->assemble(),
  826. 'Order direction of field failed');
  827. }
  828. public function testOrderOfDeepConditionalField()
  829. {
  830. $select = $this->_db->select();
  831. $select->from(array ('p' => 'product'))
  832. ->order('IF(p.id IS NOT NULL, IF(p.id2 IS NOT NULL, SUM(1), 2), 0)');
  833. $expected = 'SELECT "p".* FROM "product" AS "p" ORDER BY IF(p.id IS NOT NULL, IF(p.id2 IS NOT NULL, SUM(1), 2), 0) ASC';
  834. $this->assertEquals($expected, $select->assemble());
  835. }
  836. public function testOrderOfDeepUnbalancedConditionalField()
  837. {
  838. $select = $this->_db->select();
  839. $select->from(array ('p' => 'product'))
  840. ->order('IF(SUM()');
  841. $expected = 'SELECT "p".* FROM "product" AS "p" ORDER BY "IF(SUM()" ASC';
  842. $this->assertEquals($expected, $select->assemble());
  843. }
  844. public function testOrderOfDeepConditionalFieldWithDirection()
  845. {
  846. $select = $this->_db->select();
  847. $select->from(array ('p' => 'product'))
  848. ->order('IF(p.id IS NOT NULL, IF(p.id2 IS NOT NULL, SUM(1), 2), 0) ASC');
  849. $expected = 'SELECT "p".* FROM "product" AS "p" ORDER BY IF(p.id IS NOT NULL, IF(p.id2 IS NOT NULL, SUM(1), 2), 0) ASC';
  850. $this->assertEquals($expected, $select->assemble());
  851. }
  852. public function testOrderOfDeepUnbalancedConditionalFieldWithDirection()
  853. {
  854. $select = $this->_db->select();
  855. $select->from(array ('p' => 'product'))
  856. ->order('IF(SUM() ASC');
  857. $expected = 'SELECT "p".* FROM "product" AS "p" ORDER BY "IF(SUM()" ASC';
  858. $this->assertEquals($expected, $select->assemble());
  859. }
  860. /**
  861. * Test a problem with assembling subqueries with joins in SELECT block. That problem is caused by "new line" char which brakes regexp detection of "AS"-case
  862. */
  863. public function testAssembleQueryWithSubqueryInSelectBlock() {
  864. $subSelect = $this->_db->select();
  865. $subSelect->from(array('st1' => 'subTable1'), 'col1')
  866. ->join(array('st2' => 'subTable2'), 'st1.fk_id=st2.fk_id', 'col2');
  867. $columns[] = '('.$subSelect->assemble() . ') as subInSelect';
  868. $select = $this->_db->select();
  869. $select->from(array('t' => 'table1'), $columns);
  870. $expected = 'SELECT (SELECT "st1"."col1", "st2"."col2" FROM "subTable1" AS "st1" INNER JOIN "subTable2" AS "st2" ON st1.fk_id=st2.fk_id) AS "subInSelect" FROM "table1" AS "t"';
  871. $this->assertEquals($expected, $select->assemble(),
  872. 'Assembling query with subquery with join failed');
  873. }
  874. public function testAssembleQueryWithRawSubqueryInSelectBlock() {
  875. $columns[] = '(SELECT *
  876. FROM tb2) as subInSelect2';
  877. $select = $this->_db->select();
  878. $select->from(array('t' => 'table1'), $columns);
  879. $expected = 'SELECT (SELECT * FROM tb2) AS "subInSelect2" FROM "table1" AS "t"';
  880. $this->assertEquals($expected, $select->assemble(),
  881. 'Assembling query with raw subquery with "new line" char failed');
  882. }
  883. public function testAssembleQueryWithExpressionInSelectBlock() {
  884. $columns[] = ' DISTINCT (*) as expr';
  885. $select = $this->_db->select();
  886. $select->from(array('t' => 'table1'), $columns);
  887. $expected = 'SELECT DISTINCT (*) AS "expr" FROM "table1" AS "t"';
  888. $this->assertEquals($expected, $select->assemble(),
  889. 'Assembling query with raw subquery with "new line" char failed');
  890. }
  891. }