[BUGFIX] SqlParser: trim all kinds of whitespaces
authorStefan Neufeind <typo3.neufeind@speedpartner.de>
Thu, 29 Nov 2012 22:55:57 +0000 (23:55 +0100)
committerChristian Kuhn <lolli@schwarzbu.ch>
Sat, 1 Dec 2012 11:48:10 +0000 (12:48 +0100)
SqlParser only trimmed semicolon and newlines
from end of string. Make it strip all characters
usually stripped by trim().

Add a unit test to avoid regressions.

Change-Id: I2ddc1fca2ac0db1b6ca0989c93c37ab39e0675d8
Fixes: #43470
Releases: 4.5, 4.6, 4.7, 6.0, 6.1
Reviewed-on: http://review.typo3.org/16875
Tested-by: Stefan Neufeind
Reviewed-by: Philipp Gampe
Tested-by: Philipp Gampe
Reviewed-by: Christian Kuhn
Tested-by: Christian Kuhn
typo3/sysext/core/Classes/Database/SqlParser.php
typo3/sysext/core/Tests/Unit/Database/SqlParserTest.php

index 1318f73..ad680a4 100644 (file)
@@ -1468,8 +1468,7 @@ class SqlParser {
         * @return string Output string
         */
        protected function trimSQL($str) {
-               return trim(rtrim($str, ';
-       ')) . ' ';
+               return rtrim(rtrim(trim($str), ';')) . ' ';
        }
 
        /*************************
index a2db999..ed6389a 100644 (file)
@@ -31,12 +31,12 @@ namespace TYPO3\CMS\Core\Tests\Unit\Database;
 class SqlParserTest extends \TYPO3\CMS\Core\Tests\UnitTestCase {
 
        /**
-        * @var \TYPO3\CMS\Core\Database\SqlParser
+        * @var \TYPO3\CMS\Core\Database\SqlParser|\TYPO3\CMS\Core\Tests\AccessibleObjectInterface
         */
        private $fixture;
 
        public function setUp() {
-               $this->fixture = new \TYPO3\CMS\Core\Database\SqlParser();
+               $this->fixture = $this->getAccessibleMock('\\TYPO3\\CMS\\Core\\Database\\SqlParser', array('dummy'));
        }
 
        public function tearDown() {
@@ -47,7 +47,6 @@ class SqlParserTest extends \TYPO3\CMS\Core\Tests\UnitTestCase {
         * Regression test
         *
         * @test
-        * @todo Define visibility
         */
        public function compileWhereClauseDoesNotDropClauses() {
                $clauses = array(
@@ -122,6 +121,37 @@ class SqlParserTest extends \TYPO3\CMS\Core\Tests\UnitTestCase {
                $this->assertContains('IFNULL', $output);
        }
 
+       /**
+        * Data provider for trimSqlReallyTrimsAllWhitespace
+        *
+        * @see trimSqlReallyTrimsAllWhitespace
+        */
+       public function trimSqlReallyTrimsAllWhitespaceDataProvider() {
+               return array(
+                       'Nothing to trim' => array('SELECT * FROM test WHERE 1=1;', 'SELECT * FROM test WHERE 1=1 '),
+                       'Space after ;' => array('SELECT * FROM test WHERE 1=1; ', 'SELECT * FROM test WHERE 1=1 '),
+                       'Space before ;' => array('SELECT * FROM test WHERE 1=1 ;', 'SELECT * FROM test WHERE 1=1 '),
+                       'Space before and after ;' => array('SELECT * FROM test WHERE 1=1 ; ', 'SELECT * FROM test WHERE 1=1 '),
+                       'Linefeed after ;' => array('SELECT * FROM test WHERE 1=1' . LF . ';', 'SELECT * FROM test WHERE 1=1 '),
+                       'Linefeed before ;' => array('SELECT * FROM test WHERE 1=1;' . LF, 'SELECT * FROM test WHERE 1=1 '),
+                       'Linefeed before and after ;' => array('SELECT * FROM test WHERE 1=1' . LF . ';' . LF, 'SELECT * FROM test WHERE 1=1 '),
+                       'Tab after ;' => array('SELECT * FROM test WHERE 1=1' . TAB . ';', 'SELECT * FROM test WHERE 1=1 '),
+                       'Tab before ;' => array('SELECT * FROM test WHERE 1=1;' . TAB, 'SELECT * FROM test WHERE 1=1 '),
+                       'Tab before and after ;' => array('SELECT * FROM test WHERE 1=1' . TAB . ';' . TAB, 'SELECT * FROM test WHERE 1=1 '),
+               );
+       }
+
+       /**
+        * @test
+        * @dataProvider trimSqlReallyTrimsAllWhitespaceDataProvider
+        * @param string $sql The SQL to trim
+        * @param string $expected The expected trimmed SQL with single space at the end
+        */
+       public function trimSqlReallyTrimsAllWhitespace($sql, $expected) {
+               $result = $this->fixture->_call('trimSQL', $sql);
+               $this->assertSame($expected, $result);
+       }
+
 }
 
 ?>
\ No newline at end of file