StaticTest.php 38 KB

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