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 <[email protected]>
Gerrit-Reviewer: Jeroen De Dauw <[email protected]>
Gerrit-Reviewer: jenkins-bot
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits