Selaa lähdekoodia

ZF-7221 - Fix Zend_Db_Select::_renderOrder not being able to order by positional integers which is supported in ANSI SQL and by all vendors that have Zend_Db adapters

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@18295 44c647ce-9c0f-0410-b52a-842ac1e357ba
beberlei 16 vuotta sitten
vanhempi
commit
c139e97cbf
2 muutettua tiedostoa jossa 63 lisäystä ja 1 poistoa
  1. 7 1
      library/Zend/Db/Select.php
  2. 56 0
      tests/Zend/Db/Select/TestCommon.php

+ 7 - 1
library/Zend/Db/Select.php

@@ -1167,7 +1167,13 @@ class Zend_Db_Select
             $order = array();
             foreach ($this->_parts[self::ORDER] as $term) {
                 if (is_array($term)) {
-                    $order[] = $this->_adapter->quoteIdentifier($term[0], true) . ' ' . $term[1];
+                    if(is_numeric($term[0]) && strval(intval($term[0])) == $term[0]) {
+                        $order[] = (int)trim($term[0]) . ' ' . $term[1];
+                    } else {
+                        $order[] = $this->_adapter->quoteIdentifier($term[0], true) . ' ' . $term[1];
+                    }
+                } else if (is_numeric($term) && strval(intval($term)) == $term) {
+                    $order[] = (int)trim($term);
                 } else {
                     $order[] = $this->_adapter->quoteIdentifier($term, true);
                 }

+ 56 - 0
tests/Zend/Db/Select/TestCommon.php

@@ -1229,6 +1229,62 @@ abstract class Zend_Db_Select_TestCommon extends Zend_Db_TestSetup
         $this->assertEquals(1, $result[0]['product_id']);
     }
 
+    public function testSelectOrderByPosition()
+    {
+        $select = $this->_db->select()
+            ->from('zfproducts')
+            ->order('2');
+
+        $stmt = $this->_db->query($select);
+        $result = $stmt->fetchAll();
+
+        $this->assertEquals(2, $result[0]['product_id']);
+        $this->assertEquals(3, $result[1]['product_id']);
+        $this->assertEquals(1, $result[2]['product_id']);
+    }
+
+    public function testSelectOrderByPositionAsc()
+    {
+        $select = $this->_db->select()
+            ->from('zfproducts')
+            ->order('2 ASC');
+
+        $stmt = $this->_db->query($select);
+        $result = $stmt->fetchAll();
+
+        $this->assertEquals(2, $result[0]['product_id']);
+        $this->assertEquals(3, $result[1]['product_id']);
+        $this->assertEquals(1, $result[2]['product_id']);
+    }
+
+    public function testSelectOrderByPositionDesc()
+    {
+        $select = $this->_db->select()
+            ->from('zfproducts')
+            ->order('2 DESC');
+
+        $stmt = $this->_db->query($select);
+        $result = $stmt->fetchAll();
+
+        $this->assertEquals(1, $result[0]['product_id']);
+        $this->assertEquals(3, $result[1]['product_id']);
+        $this->assertEquals(2, $result[2]['product_id']);
+    }
+
+    public function testSelectOrderByMultiplePositions()
+    {
+        $select = $this->_db->select()
+            ->from('zfproducts')
+            ->order(array('2 DESC', '1 DESC'));
+
+        $stmt = $this->_db->query($select);
+        $result = $stmt->fetchAll();
+
+        $this->assertEquals(1, $result[0]['product_id']);
+        $this->assertEquals(3, $result[1]['product_id']);
+        $this->assertEquals(2, $result[2]['product_id']);
+    }
+
     protected function _selectOrderByDesc()
     {
         $select = $this->_db->select()