jenkins-bot has submitted this change and it was merged.

Change subject: Add escaping of identifiers in SQLite
......................................................................


Add escaping of identifiers in SQLite

Change-Id: Ia5a373469e7079553c63b505825ec9ddbb1be554
---
M src/MediaWiki/MWTableDefinitionReaderBuilder.php
M src/SQLite/SQLiteFieldSqlBuilder.php
M src/SQLite/SQLiteIndexSqlBuilder.php
M src/SQLite/SQLiteSchemaSqlBuilder.php
M src/SQLite/SQLiteTableDefinitionReader.php
M src/SQLite/SQLiteTableSqlBuilder.php
A src/SQLite/SQLiteUnEscaper.php
A src/UnEscaper.php
M tests/phpunit/SQLite/SQLiteFieldSqlBuilderTest.php
M tests/phpunit/SQLite/SQLiteIndexSqlBuilderTest.php
M tests/phpunit/SQLite/SQLiteSchemaSqlBuilderTest.php
M tests/phpunit/SQLite/SQLiteTableDefinitionReaderTest.php
M tests/phpunit/SQLite/SQLiteTableSqlBuilderTest.php
A tests/phpunit/SQLite/SQLiteUnEscaperTest.php
14 files changed, 175 insertions(+), 43 deletions(-)

Approvals:
  Jeroen De Dauw: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/src/MediaWiki/MWTableDefinitionReaderBuilder.php 
b/src/MediaWiki/MWTableDefinitionReaderBuilder.php
index ae67a03..99a5a6b 100644
--- a/src/MediaWiki/MWTableDefinitionReaderBuilder.php
+++ b/src/MediaWiki/MWTableDefinitionReaderBuilder.php
@@ -9,6 +9,7 @@
 use Wikibase\Database\QueryInterface\QueryInterface;
 use Wikibase\Database\Schema\TableDefinitionReader;
 use Wikibase\Database\SQLite\SQLiteTableDefinitionReader;
+use Wikibase\Database\SQLite\SQLiteUnEscaper;
 
 /**
  * Builder for TableDefinitionReader objects.
@@ -58,7 +59,7 @@
        }
 
        protected function newSQLiteTableDefinitionReader( QueryInterface 
$queryInterface ) {
-               return new SQLiteTableDefinitionReader( $queryInterface );
+               return new SQLiteTableDefinitionReader( $queryInterface, new 
SQLiteUnEscaper() );
        }
 
 }
diff --git a/src/SQLite/SQLiteFieldSqlBuilder.php 
b/src/SQLite/SQLiteFieldSqlBuilder.php
index 88b5eef..a19d27c 100644
--- a/src/SQLite/SQLiteFieldSqlBuilder.php
+++ b/src/SQLite/SQLiteFieldSqlBuilder.php
@@ -24,8 +24,7 @@
        }
 
        public function getFieldSQL( FieldDefinition $field ){
-               //todo escape name once identifier escaping is implemented
-               $sql = $field->getName() . ' ';
+               $sql =  $this->escaper->getEscapedIdentifier( $field->getName() 
) . ' ';
 
                $sql .= $this->getFieldType( $field->getType() );
 
diff --git a/src/SQLite/SQLiteIndexSqlBuilder.php 
b/src/SQLite/SQLiteIndexSqlBuilder.php
index 7b8c0b5..cf0539d 100644
--- a/src/SQLite/SQLiteIndexSqlBuilder.php
+++ b/src/SQLite/SQLiteIndexSqlBuilder.php
@@ -3,6 +3,7 @@
 namespace Wikibase\Database\SQLite;
 
 use RuntimeException;
+use Wikibase\Database\Escaper;
 use Wikibase\Database\Schema\Definitions\IndexDefinition;
 use Wikibase\Database\Schema\Definitions\TableDefinition;
 use Wikibase\Database\Schema\IndexSqlBuilder;
@@ -15,25 +16,27 @@
  */
 class SQLiteIndexSqlBuilder extends IndexSqlBuilder {
 
+       protected $escaper;
        protected $tableNameFormatter;
 
        /**
+        * @param Escaper $escaper
         * @param TableNameFormatter $tableNameFormatter
         */
-       public function __construct( TableNameFormatter $tableNameFormatter ) {
+       public function __construct( Escaper $escaper, TableNameFormatter 
$tableNameFormatter ) {
+               $this->escaper = $escaper;
                $this->tableNameFormatter = $tableNameFormatter;
        }
 
        public function getIndexSQL( IndexDefinition $index, $tableName ){
                $sql = 'CREATE ';
                $sql .= $this->getIndexType( $index->getType() ) . ' ';
-               //todo escape name once identifier escaping is implemented
-               $sql .= $index->getName() . ' ';
+               $sql .= $this->escaper->getEscapedIdentifier( $index->getName() 
) . ' ';
                $sql .= 'ON ' . $this->tableNameFormatter->formatTableName( 
$tableName );
 
                $columnNames = array();
                foreach( $index->getColumns() as $columnName => $intSize ){
-                       $columnNames[] = $columnName;
+                       $columnNames[] = $this->escaper->getEscapedIdentifier( 
$columnName );
                }
 
                $sql .= ' ('.implode( ',', $columnNames ).');';
diff --git a/src/SQLite/SQLiteSchemaSqlBuilder.php 
b/src/SQLite/SQLiteSchemaSqlBuilder.php
index 2c9d14c..71378cc 100644
--- a/src/SQLite/SQLiteSchemaSqlBuilder.php
+++ b/src/SQLite/SQLiteSchemaSqlBuilder.php
@@ -20,16 +20,18 @@
  */
 class SQLiteSchemaSqlBuilder implements SchemaModificationSqlBuilder {
 
+       protected $escaper;
        protected $fieldSqlBuilder;
        protected $tableNameFormatter;
        protected $tableDefinitionReader;
        protected $tableSqlBuilder;
 
-       public function __construct( Escaper $fieldValueEscaper, 
TableNameFormatter $tableNameFormatter, TableDefinitionReader $definitionReader 
) {
-               $this->fieldSqlBuilder = new SQLiteFieldSqlBuilder( 
$fieldValueEscaper );
+       public function __construct( Escaper $escaper, TableNameFormatter 
$tableNameFormatter, TableDefinitionReader $definitionReader ) {
+               $this->escaper = $escaper;
+               $this->fieldSqlBuilder = new SQLiteFieldSqlBuilder( $escaper );
                $this->tableNameFormatter = $tableNameFormatter;
                $this->tableDefinitionReader = $definitionReader;
-               $this->tableSqlBuilder = new SQLiteTableSqlBuilder( 
$fieldValueEscaper, $tableNameFormatter );
+               $this->tableSqlBuilder = new SQLiteTableSqlBuilder( $escaper, 
$tableNameFormatter );
        }
 
        /**
@@ -62,8 +64,7 @@
        private function getFieldsSql( $fields ){
                $fieldNames = array();
                foreach( $fields as $field ){
-                       //todo escape name once identifier escaping is 
implemented
-                       $fieldNames[] = $field->getName();
+                       $fieldNames[] = $this->escaper->getEscapedIdentifier( 
$field->getName() );
                }
                return implode( ', ', $fieldNames );
        }
@@ -97,7 +98,7 @@
         * @return string
         */
        public function getAddIndexSql( $tableName, IndexDefinition $index ){
-               $indexSqlBuilder = new SQLiteIndexSqlBuilder( 
$this->tableNameFormatter );
+               $indexSqlBuilder = new SQLiteIndexSqlBuilder( $this->escaper, 
$this->tableNameFormatter );
                return $indexSqlBuilder->getIndexSQL( $index, $tableName );
        }
 
diff --git a/src/SQLite/SQLiteTableDefinitionReader.php 
b/src/SQLite/SQLiteTableDefinitionReader.php
index a37801c..1cc75fd 100644
--- a/src/SQLite/SQLiteTableDefinitionReader.php
+++ b/src/SQLite/SQLiteTableDefinitionReader.php
@@ -20,12 +20,15 @@
 class SQLiteTableDefinitionReader implements TableDefinitionReader {
 
        protected $queryInterface;
+       protected $unEscaper;
 
        /**
         * @param QueryInterface $queryInterface
+        * @param SQLiteUnEscaper $unEscaper
         */
-       public function __construct( QueryInterface $queryInterface ) {
+       public function __construct( QueryInterface $queryInterface, 
SQLiteUnEscaper $unEscaper ) {
                $this->queryInterface = $queryInterface;
+               $this->unEscaper = $unEscaper;
        }
 
        /**
@@ -88,6 +91,7 @@
        }
 
        private function getField( $fieldParts ) {
+               $name = $this->unEscaper->getUnEscapedIdentifier( 
$fieldParts[1] );
                $type = $this->getFieldType( $fieldParts[2] );
                $default = $this->getFieldDefault( $fieldParts[4] );
                $null = $this->getFieldCanNull( $fieldParts[6] );
@@ -99,7 +103,7 @@
                        $autoInc = FieldDefinition::NO_AUTOINCREMENT;
                }
 
-               return new FieldDefinition( $fieldParts[1], $type, $null, 
$default, $attr, $autoInc );
+               return new FieldDefinition( $name, $type, $null, $default, 
$attr, $autoInc );
        }
 
        private function getFieldType( $type ) {
@@ -169,10 +173,11 @@
                $columns = array();
                foreach( $parsedColumns as $columnName ){
                        //default unrestricted index size limit
-                       $columns[ $columnName ] = 0;
+                       $columns[ $this->unEscaper->getUnEscapedIdentifier( 
$columnName ) ] = 0;
                }
+               $name = $this->unEscaper->getUnEscapedIdentifier( 
$createParts[2] );
                $type = $this->getIndexType( $createParts[1] );
-               return new IndexDefinition( $createParts[2], $columns , $type );
+               return new IndexDefinition( $name, $columns , $type );
        }
 
        /**
@@ -217,11 +222,12 @@
                                $columns = array();
                                foreach( $parsedColumns as $columnName ){
                                        //default unrestricted index size limit
-                                       $columns[ trim( $columnName ) ] = 0;
+                                       $columns[ trim( 
$this->unEscaper->getUnEscapedIdentifier( $columnName ) ) ] = 0;
                                }
                                $keys[] = new IndexDefinition( 'PRIMARY', 
$columns , IndexDefinition::TYPE_PRIMARY );
                        } else if( preg_match( '/(\(|,| )+([^ ]+)[a-z0-9 
_]+PRIMARY KEY AUTOINCREMENT/i', $result->sql, $createParts ) ){
-                               $keys[] = new IndexDefinition( 'PRIMARY', 
array( $createParts[2] => 0 ) , IndexDefinition::TYPE_PRIMARY );
+                               $fieldName = 
$this->unEscaper->getUnEscapedIdentifier( $createParts[2] );
+                               $keys[] = new IndexDefinition( 'PRIMARY', 
array( $fieldName => 0 ) , IndexDefinition::TYPE_PRIMARY );
                        }
                }
 
diff --git a/src/SQLite/SQLiteTableSqlBuilder.php 
b/src/SQLite/SQLiteTableSqlBuilder.php
index a382b96..03d2b87 100644
--- a/src/SQLite/SQLiteTableSqlBuilder.php
+++ b/src/SQLite/SQLiteTableSqlBuilder.php
@@ -34,7 +34,7 @@
                $this->tableNameFormatter = $tableNameFormatter;
                //TODO inject sqlbuilders
                $this->fieldSqlBuilder = new SQLiteFieldSqlBuilder( 
$this->escaper );
-               $this->indexSqlBuilder = new SQLiteIndexSqlBuilder( 
$tableNameFormatter );
+               $this->indexSqlBuilder = new SQLiteIndexSqlBuilder( 
$this->escaper, $tableNameFormatter );
        }
 
        /**
diff --git a/src/SQLite/SQLiteUnEscaper.php b/src/SQLite/SQLiteUnEscaper.php
new file mode 100644
index 0000000..0edaa41
--- /dev/null
+++ b/src/SQLite/SQLiteUnEscaper.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace Wikibase\Database\SQLite;
+
+/**
+ * UnEscaper to remove the Escaping from SQLLite escaped SQL strings
+ * @since 0.1
+ * @licence GNU GPL v2+
+ * @author Adam Shorland
+ */
+class SQLiteUnEscaper {
+
+       /**
+        * @param string $identifier
+        * @return string
+        */
+       public function getUnEscapedIdentifier( $identifier ){
+               return str_replace( '""', '"', substr( $identifier, 1, -1 ) );
+       }
+
+}
\ No newline at end of file
diff --git a/src/UnEscaper.php b/src/UnEscaper.php
new file mode 100644
index 0000000..da4cd63
--- /dev/null
+++ b/src/UnEscaper.php
@@ -0,0 +1,23 @@
+<?php
+
+namespace Wikibase\Database;
+
+/**
+ * Base class acting as interface for classes that un-escape values so they
+ * can be taken from SQL string and put back in objects
+ *
+ * @since 0.1
+ *
+ * @licence GNU GPL v2+
+ * @author Adam Shorland
+ */
+interface UnEscaper {
+
+       /**
+        * @param mixed $identifier
+        *
+        * @return string The unescaped identifier
+        */
+       public function getUnEscapedIdentifier( $identifier );
+
+}
diff --git a/tests/phpunit/SQLite/SQLiteFieldSqlBuilderTest.php 
b/tests/phpunit/SQLite/SQLiteFieldSqlBuilderTest.php
index 3d30d1c..aecc717 100644
--- a/tests/phpunit/SQLite/SQLiteFieldSqlBuilderTest.php
+++ b/tests/phpunit/SQLite/SQLiteFieldSqlBuilderTest.php
@@ -28,6 +28,11 @@
                        ->will( $this->returnCallback( function( $value ) {
                                return '|' . $value . '|';
                        } ) );
+               $mockEscaper->expects( $this->any() )
+                       ->method( 'getEscapedIdentifier' )
+                       ->will( $this->returnCallback( function( $value ) {
+                               return '-' . $value . '-';
+                       } ) );
 
                $sqlBuilder = new SQLiteFieldSqlBuilder( $mockEscaper );
 
@@ -44,7 +49,7 @@
                                'fieldName',
                                FieldDefinition::TYPE_BOOLEAN
                        ),
-                       'fieldName TINYINT NULL'
+                       '-fieldName- TINYINT NULL'
                );
 
                $argLists[] = array(
@@ -57,7 +62,7 @@
                                FieldDefinition::AUTOINCREMENT
 
                        ),
-                       'autoInc INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT'
+                       '-autoInc- INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT'
                );
 
                $argLists[] = array(
@@ -67,7 +72,7 @@
                                FieldDefinition::NOT_NULL,
                                '1'
                        ),
-                       'fieldName TINYINT DEFAULT |1| NOT NULL'
+                       '-fieldName- TINYINT DEFAULT |1| NOT NULL'
                );
 
                $argLists[] = array(
@@ -77,7 +82,7 @@
                                FieldDefinition::NOT_NULL,
                                'foo'
                        ),
-                       'fieldName BLOB DEFAULT |foo| NOT NULL'
+                       '-fieldName- BLOB DEFAULT |foo| NOT NULL'
                );
 
                return $argLists;
diff --git a/tests/phpunit/SQLite/SQLiteIndexSqlBuilderTest.php 
b/tests/phpunit/SQLite/SQLiteIndexSqlBuilderTest.php
index 8fd356f..17cf899 100644
--- a/tests/phpunit/SQLite/SQLiteIndexSqlBuilderTest.php
+++ b/tests/phpunit/SQLite/SQLiteIndexSqlBuilderTest.php
@@ -23,12 +23,19 @@
         * @dataProvider fieldAndSqlProvider
         */
        public function testGetCreateTableSql( IndexDefinition $index, 
$expectedSQL ) {
+               $mockEscaper = $this->getMock( 'Wikibase\Database\Escaper' );
+               $mockEscaper->expects( $this->any() )
+                       ->method( 'getEscapedIdentifier' )
+                       ->will( $this->returnCallback( function( $value ) {
+                               return '-' . $value . '-';
+                       } ) );
+
                $mockTableNameFormatter = $this->getMock( 
'Wikibase\Database\TableNameFormatter' );
                $mockTableNameFormatter->expects( $this->any() )
                        ->method( 'formatTableName' )
                        ->will( $this->returnArgument(0) );
 
-               $sqlBuilder = new SQLiteIndexSqlBuilder( 
$mockTableNameFormatter );
+               $sqlBuilder = new SQLiteIndexSqlBuilder( $mockEscaper, 
$mockTableNameFormatter );
                $sql = $sqlBuilder->getIndexSQL( $index, 'tableName' );
                $this->assertEquals( $expectedSQL, $sql );
        }
@@ -42,7 +49,7 @@
                                array( 'intField' => 0, 'textField' => 0 ),
                                IndexDefinition::TYPE_INDEX
                        ),
-                       'CREATE INDEX indexName ON tableName 
(intField,textField);'
+                       'CREATE INDEX -indexName- ON tableName 
(-intField-,-textField-);'
                );
 
 
@@ -52,7 +59,7 @@
                                array( 'intField' => 0, 'textField' => 0 ),
                                IndexDefinition::TYPE_UNIQUE
                        ),
-                       'CREATE UNIQUE INDEX indexName ON tableName 
(intField,textField);'
+                       'CREATE UNIQUE INDEX -indexName- ON tableName 
(-intField-,-textField-);'
                );
 
                return $argLists;
@@ -60,6 +67,13 @@
 
        public function testUnsupportedType() {
                $this->setExpectedException( 'RuntimeException', 'does not 
support db indexes of type' );
+
+               $mockEscaper = $this->getMock( 'Wikibase\Database\Escaper' );
+               $mockEscaper->expects( $this->any() )
+                       ->method( 'getEscapedIdentifier' )
+                       ->will( $this->returnCallback( function( $value ) {
+                               return '-' . $value . '-';
+                       } ) );
 
                $tableNameFormatter = $this->getMockBuilder( 
'Wikibase\Database\MediaWiki\MediaWikiTableNameFormatter' )
                        ->disableOriginalConstructor()
@@ -72,7 +86,7 @@
                        ->method( 'getType' )
                        ->will( $this->returnValue( 'foobar' ) );
 
-               $sqlBuilder = new SQLiteIndexSqlBuilder( $tableNameFormatter );
+               $sqlBuilder = new SQLiteIndexSqlBuilder( $mockEscaper, 
$tableNameFormatter );
                $sqlBuilder->getIndexSQL( $indexDefinition, 'tableName' );
        }
 
diff --git a/tests/phpunit/SQLite/SQLiteSchemaSqlBuilderTest.php 
b/tests/phpunit/SQLite/SQLiteSchemaSqlBuilderTest.php
index da0921e..e49badc 100644
--- a/tests/phpunit/SQLite/SQLiteSchemaSqlBuilderTest.php
+++ b/tests/phpunit/SQLite/SQLiteSchemaSqlBuilderTest.php
@@ -24,7 +24,14 @@
                $mockEscaper = $this->getMock( 'Wikibase\Database\Escaper' );
                $mockEscaper->expects( $this->any() )
                        ->method( 'getEscapedValue' )
-                       ->will( $this->returnArgument(0) );
+                       ->will( $this->returnCallback( function( $value ) {
+                               return '|' . $value . '|';
+                       } ) );
+               $mockEscaper->expects( $this->any() )
+                       ->method( 'getEscapedIdentifier' )
+                       ->will( $this->returnCallback( function( $value ) {
+                               return '-' . $value . '-';
+                       } ) );
 
                $mockTableNameFormatter = $this->getMock( 
'Wikibase\Database\TableNameFormatter' );
                $mockTableNameFormatter->expects( $this->atLeastOnce() )
@@ -70,9 +77,9 @@
                $sql = $instance->getRemoveFieldSql( 'tableName', 'textField' );
                $this->assertEquals(
                        'ALTER TABLE tableName RENAME TO tableName_tmp;' . 
PHP_EOL
-                       . 'CREATE TABLE tableName (primaryField INTEGER NOT 
NULL, intField INTEGER DEFAULT 42 NOT NULL);' . PHP_EOL
-                       . 'CREATE INDEX INDEX ON tableName 
(intField,primaryField);' . PHP_EOL
-                       . 'INSERT INTO tableName(primaryField, intField) SELECT 
primaryField, intField FROM tableName_tmp;' . PHP_EOL
+                       . 'CREATE TABLE tableName (-primaryField- INTEGER NOT 
NULL, -intField- INTEGER DEFAULT 42 NOT NULL);' . PHP_EOL
+                       . 'CREATE INDEX -INDEX- ON tableName 
(-intField-,-primaryField-);' . PHP_EOL
+                       . 'INSERT INTO tableName(-primaryField-, -intField-) 
SELECT -primaryField-, -intField- FROM tableName_tmp;' . PHP_EOL
                        . 'DROP TABLE tableName_tmp;' ,
                        $sql );
        }
@@ -80,7 +87,7 @@
        public function testGetAddFieldSql(){
                $instance = $this->newInstance( );
                $sql = $instance->getAddFieldSql( 'tableName', new 
FieldDefinition( 'intField',FieldDefinition::TYPE_INTEGER) );
-               $this->assertEquals( "ALTER TABLE tableName ADD COLUMN intField 
INTEGER NULL", $sql );
+               $this->assertEquals( "ALTER TABLE tableName ADD COLUMN 
-intField- INTEGER NULL", $sql );
        }
 
        public function testGetRemoveIndexSql(){
@@ -92,7 +99,7 @@
        public function testGetAddIndexSql(){
                $instance = $this->newInstance( );
                $sql = $instance->getAddIndexSql( 'tableName', new 
IndexDefinition( 'name', array( 'a' => 0, 'b' => 0 ), 
IndexDefinition::TYPE_INDEX ) );
-               $this->assertEquals( "CREATE INDEX name ON tableName (a,b);", 
$sql );
+               $this->assertEquals( "CREATE INDEX -name- ON tableName 
(-a-,-b-);", $sql );
        }
 
 }
\ No newline at end of file
diff --git a/tests/phpunit/SQLite/SQLiteTableDefinitionReaderTest.php 
b/tests/phpunit/SQLite/SQLiteTableDefinitionReaderTest.php
index ce42385..c31a794 100644
--- a/tests/phpunit/SQLite/SQLiteTableDefinitionReaderTest.php
+++ b/tests/phpunit/SQLite/SQLiteTableDefinitionReaderTest.php
@@ -37,13 +37,20 @@
                        ->method( 'tableExists' )
                        ->will( $this->returnValue( $tableExists ) );
 
+               $mockUnEscaper = $this->getMock( 
'Wikibase\Database\SQLite\SQLiteUnEscaper' );
+               $mockUnEscaper->expects( $this->any() )
+                       ->method( 'getUnEscapedIdentifier' )
+                       ->will( $this->returnCallback( function( $value ) {
+                               return substr( $value, 1, -1 );
+                       } ) );
+
                foreach( $results as $key => $result ){
                        $mockQueryInterface->expects( $this->at( $key + 1 ) )
                                ->method( 'select' )
                                ->will( $this->returnValue( new ResultIterator( 
$result ) ) );
                }
 
-               return new SQLiteTableDefinitionReader( $mockQueryInterface );
+               return new SQLiteTableDefinitionReader( $mockQueryInterface, 
$mockUnEscaper );
        }
 
        public function testReadNonExistentTable(){
@@ -67,14 +74,14 @@
                $argLists[] = array(
                        array(
                                //create sql
-                               array( (object)array( 'sql' => 'CREATE TABLE 
dbNametableName (primaryField INT NOT NULL, textField BLOB NULL, intField INT 
DEFAULT 42 NOT NULL, PRIMARY KEY (textField, primaryField))' ) ),
+                               array( (object)array( 'sql' => 'CREATE TABLE 
dbNametableName ("primaryField" INT NOT NULL, "textField" BLOB NULL, "intField" 
INT DEFAULT 42 NOT NULL, PRIMARY KEY ("textField", "primaryField"))' ) ),
                                //indexes sql
                                array(
-                                       (object)array( 'sql' => 'CREATE UNIQUE 
INDEX uniqueName ON dbNametableName (textField)' ),
-                                       (object)array( 'sql' => 'CREATE INDEX 
indexName ON dbNametableName (intField,textField)' )
+                                       (object)array( 'sql' => 'CREATE UNIQUE 
INDEX "uniqueName" ON dbNametableName ("textField")' ),
+                                       (object)array( 'sql' => 'CREATE INDEX 
"indexName" ON dbNametableName ("intField","textField")' )
                                ),
                                //primarykey sql
-                               array( (object)array( 'sql' => 'PRIMARY KEY 
(textField,primaryField)' ) ),
+                               array( (object)array( 'sql' => 'PRIMARY KEY 
("textField","primaryField")' ) ),
                        ),
                        new TableDefinition(
                                'dbNametableName',
diff --git a/tests/phpunit/SQLite/SQLiteTableSqlBuilderTest.php 
b/tests/phpunit/SQLite/SQLiteTableSqlBuilderTest.php
index 6bc6ac5..61c0f96 100644
--- a/tests/phpunit/SQLite/SQLiteTableSqlBuilderTest.php
+++ b/tests/phpunit/SQLite/SQLiteTableSqlBuilderTest.php
@@ -32,6 +32,11 @@
                $mockEscaper->expects( $this->any() )
                        ->method( 'getEscapedValue' )
                        ->will( $this->returnArgument(0) );
+               $mockEscaper->expects( $this->any() )
+                       ->method( 'getEscapedIdentifier' )
+                       ->will( $this->returnCallback( function( $value ) {
+                               return '-' . $value . '-';
+                       } ) );
 
                $mockTableNameFormatter = $this->getMock( 
'Wikibase\Database\TableNameFormatter' );
                $mockTableNameFormatter->expects( $this->any() )
@@ -65,7 +70,7 @@
                                        new FieldDefinition( 'fieldName', 
FieldDefinition::TYPE_INTEGER )
                                )
                        ),
-                       'CREATE TABLE tableName (fieldName INTEGER NULL);'
+                       'CREATE TABLE tableName (-fieldName- INTEGER NULL);'
                );
 
                $argLists[] = array(
@@ -90,7 +95,7 @@
                                        ),
                                )
                        ),
-                       'CREATE TABLE tableName (primaryField INTEGER NOT NULL, 
textField BLOB NULL, intField INTEGER DEFAULT 42 NOT NULL);'
+                       'CREATE TABLE tableName (-primaryField- INTEGER NOT 
NULL, -textField- BLOB NULL, -intField- INTEGER DEFAULT 42 NOT NULL);'
                );
 
                $argLists[] = array(
@@ -122,8 +127,8 @@
                                        ),
                                )
                        ),
-                       'CREATE TABLE tableName (primaryField INTEGER NOT NULL, 
textField BLOB NULL, intField INTEGER DEFAULT 42 NOT NULL);' . PHP_EOL
-                       . 'CREATE INDEX indexName ON tableName 
(intField,textField);'
+                       'CREATE TABLE tableName (-primaryField- INTEGER NOT 
NULL, -textField- BLOB NULL, -intField- INTEGER DEFAULT 42 NOT NULL);' . PHP_EOL
+                       . 'CREATE INDEX -indexName- ON tableName 
(-intField-,-textField-);'
                );
 
                return $argLists;
diff --git a/tests/phpunit/SQLite/SQLiteUnEscaperTest.php 
b/tests/phpunit/SQLite/SQLiteUnEscaperTest.php
new file mode 100644
index 0000000..874f019
--- /dev/null
+++ b/tests/phpunit/SQLite/SQLiteUnEscaperTest.php
@@ -0,0 +1,40 @@
+<?php
+
+
+namespace Wikibase\Database\Tests\SQLite;
+
+use Wikibase\Database\SQLite\SQLiteUnEscaper;
+
+/**
+ * @covers Wikibase\Database\SQLite\SQLiteUnEscaper
+ *
+ * @group Wikibase
+ * @group WikibaseDatabase
+ * @group Database
+ * @group UnEscaper
+ *
+ * @licence GNU GPL v2+
+ * @author Adam Shorland
+ */
+class SQLiteUnEscaperTest extends \PHPUnit_Framework_TestCase {
+
+       /**
+        * @dataProvider stringProvider
+        */
+       public function testCanUnEscape( $before, $after ){
+               $unescaper = new SQLiteUnEscaper();
+               $newStr = $unescaper->getUnEscapedIdentifier( $before );
+               $this->assertEquals( $after, $newStr );
+       }
+
+       public function stringProvider(){
+               $cases = array();
+
+               $cases[] = array( '"string"', 'string' );
+               $cases[] = array( '"foo""bar"', 'foo"bar' );
+               $cases[] = array( '"/foo ""bar"" baz/"', '/foo "bar" baz/' );
+
+               return $cases;
+       }
+
+}
\ No newline at end of file

-- 
To view, visit https://gerrit.wikimedia.org/r/89691
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: Ia5a373469e7079553c63b505825ec9ddbb1be554
Gerrit-PatchSet: 2
Gerrit-Project: mediawiki/extensions/WikibaseDatabase
Gerrit-Branch: master
Gerrit-Owner: Addshore <addshorew...@gmail.com>
Gerrit-Reviewer: Jeroen De Dauw <jeroended...@gmail.com>
Gerrit-Reviewer: jenkins-bot

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to