Addshore has uploaded a new change for review. https://gerrit.wikimedia.org/r/89691
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, 180 insertions(+), 43 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/WikibaseDatabase refs/changes/91/89691/1 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 f3b4c5a..3b1dce6 100644 --- a/tests/phpunit/SQLite/SQLiteFieldSqlBuilderTest.php +++ b/tests/phpunit/SQLite/SQLiteFieldSqlBuilderTest.php @@ -27,6 +27,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 ); @@ -43,7 +48,7 @@ 'fieldName', FieldDefinition::TYPE_BOOLEAN ), - 'fieldName TINYINT NULL' + '-fieldName- TINYINT NULL' ); $argLists[] = array( @@ -56,7 +61,7 @@ FieldDefinition::AUTOINCREMENT ), - 'autoInc INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT' + '-autoInc- INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT' ); $argLists[] = array( @@ -66,7 +71,7 @@ FieldDefinition::NOT_NULL, '1' ), - 'fieldName TINYINT DEFAULT |1| NOT NULL' + '-fieldName- TINYINT DEFAULT |1| NOT NULL' ); $argLists[] = array( @@ -76,7 +81,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 16826e5..575997b 100644 --- a/tests/phpunit/SQLite/SQLiteIndexSqlBuilderTest.php +++ b/tests/phpunit/SQLite/SQLiteIndexSqlBuilderTest.php @@ -22,12 +22,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 ); } @@ -41,7 +48,7 @@ array( 'intField' => 0, 'textField' => 0 ), IndexDefinition::TYPE_INDEX ), - 'CREATE INDEX indexName ON tableName (intField,textField);' + 'CREATE INDEX -indexName- ON tableName (-intField-,-textField-);' ); @@ -51,7 +58,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; @@ -59,6 +66,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() @@ -71,7 +85,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 c61a0ee..e002b78 100644 --- a/tests/phpunit/SQLite/SQLiteSchemaSqlBuilderTest.php +++ b/tests/phpunit/SQLite/SQLiteSchemaSqlBuilderTest.php @@ -23,7 +23,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() ) @@ -69,9 +76,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 ); } @@ -79,7 +86,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(){ @@ -91,7 +98,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 4bfbb83..112af18 100644 --- a/tests/phpunit/SQLite/SQLiteTableDefinitionReaderTest.php +++ b/tests/phpunit/SQLite/SQLiteTableDefinitionReaderTest.php @@ -9,6 +9,11 @@ use Wikibase\Database\SQLite\SQLiteTableDefinitionReader; /** + * @group Wikibase + * @group WikibaseDatabase + * @group Database + * @group DefinitionReader + * * @since 0.1 * @licence GNU GPL v2+ * @author Adam Shorland @@ -30,13 +35,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(){ @@ -60,14 +72,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 a6fee0e..d6b0e85 100644 --- a/tests/phpunit/SQLite/SQLiteTableSqlBuilderTest.php +++ b/tests/phpunit/SQLite/SQLiteTableSqlBuilderTest.php @@ -31,6 +31,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() ) @@ -64,7 +69,7 @@ new FieldDefinition( 'fieldName', FieldDefinition::TYPE_INTEGER ) ) ), - 'CREATE TABLE tableName (fieldName INTEGER NULL);' + 'CREATE TABLE tableName (-fieldName- INTEGER NULL);' ); $argLists[] = array( @@ -89,7 +94,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( @@ -121,8 +126,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: newchange Gerrit-Change-Id: Ia5a373469e7079553c63b505825ec9ddbb1be554 Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/extensions/WikibaseDatabase Gerrit-Branch: master Gerrit-Owner: Addshore <addshorew...@gmail.com> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits