Skip to content

Commit

Permalink
[memory] Fix provider cannot handle fields with complex characters in…
Browse files Browse the repository at this point in the history
… name

Fixes #18885

(cherry-picked from 9809f93)
  • Loading branch information
nyalldawson committed May 3, 2018
1 parent c5c22d3 commit 1b26316
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 2 deletions.
2 changes: 1 addition & 1 deletion src/core/providers/memory/qgsmemoryprovider.cpp
Expand Up @@ -108,7 +108,7 @@ QgsMemoryProvider::QgsMemoryProvider( const QString &uri )
QStringList fields = url.allQueryItemValues( QStringLiteral( "field" ) );
for ( int i = 0; i < fields.size(); i++ )
{
QString name = fields.at( i );
QString name = QUrl::fromPercentEncoding( fields.at( i ).toUtf8() );
QVariant::Type type = QVariant::String;
QVariant::Type subType = QVariant::Invalid;
QString typeName( QStringLiteral( "string" ) );
Expand Down
2 changes: 1 addition & 1 deletion src/core/providers/memory/qgsmemoryproviderutils.cpp
Expand Up @@ -72,7 +72,7 @@ QgsVectorLayer *QgsMemoryProviderUtils::createMemoryLayer( const QString &name,
{
lengthPrecision = QStringLiteral( "(%1)" ).arg( field.length() );
}
parts << QStringLiteral( "field=%1:%2%3" ).arg( field.name(), memoryLayerFieldType( field.type() ), lengthPrecision );
parts << QStringLiteral( "field=%1:%2%3" ).arg( QString( QUrl::toPercentEncoding( field.name() ) ), memoryLayerFieldType( field.type() ), lengthPrecision );
}

QString uri = geomType + '?' + parts.join( '&' );
Expand Down
12 changes: 12 additions & 0 deletions tests/src/python/test_provider_memory.py
Expand Up @@ -275,6 +275,16 @@ def testLengthPrecisionFromUri(self):
self.assertEqual(myMemoryLayer.fields().field('size').length(), 12)
self.assertEqual(myMemoryLayer.fields().field('size').precision(), 9)

def testFromUriWithEncodedField(self):
"""Test we can construct the mem provider from a uri when a field name is encoded"""
layer = QgsVectorLayer(
('Point?crs=epsg:4326&field=name:string(20)&'
'field=test%2Ffield:integer'),
'test',
'memory')
self.assertTrue(layer.isValid())
self.assertEqual([f.name() for f in layer.fields()], ['name', 'test/field'])

def testSaveFields(self):
# Create a new memory layer with no fields
myMemoryLayer = QgsVectorLayer(
Expand Down Expand Up @@ -398,6 +408,8 @@ def testCreateMemoryLayer(self):
fields.append(QgsField("date", QVariant.Date))
fields.append(QgsField("datetime", QVariant.DateTime))
fields.append(QgsField("time", QVariant.Time))
fields.append(QgsField("#complex_name", QVariant.String))
fields.append(QgsField("complex/name", QVariant.String))
layer = QgsMemoryProviderUtils.createMemoryLayer('my name', fields)
self.assertTrue(layer.isValid())
self.assertFalse(layer.fields().isEmpty())
Expand Down

0 comments on commit 1b26316

Please sign in to comment.