Skip to content

Commit 1b26316

Browse files
committed
[memory] Fix provider cannot handle fields with complex characters in name
Fixes #18885 (cherry-picked from 9809f93)
1 parent c5c22d3 commit 1b26316

File tree

3 files changed

+14
-2
lines changed

3 files changed

+14
-2
lines changed

src/core/providers/memory/qgsmemoryprovider.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ QgsMemoryProvider::QgsMemoryProvider( const QString &uri )
108108
QStringList fields = url.allQueryItemValues( QStringLiteral( "field" ) );
109109
for ( int i = 0; i < fields.size(); i++ )
110110
{
111-
QString name = fields.at( i );
111+
QString name = QUrl::fromPercentEncoding( fields.at( i ).toUtf8() );
112112
QVariant::Type type = QVariant::String;
113113
QVariant::Type subType = QVariant::Invalid;
114114
QString typeName( QStringLiteral( "string" ) );

src/core/providers/memory/qgsmemoryproviderutils.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ QgsVectorLayer *QgsMemoryProviderUtils::createMemoryLayer( const QString &name,
7272
{
7373
lengthPrecision = QStringLiteral( "(%1)" ).arg( field.length() );
7474
}
75-
parts << QStringLiteral( "field=%1:%2%3" ).arg( field.name(), memoryLayerFieldType( field.type() ), lengthPrecision );
75+
parts << QStringLiteral( "field=%1:%2%3" ).arg( QString( QUrl::toPercentEncoding( field.name() ) ), memoryLayerFieldType( field.type() ), lengthPrecision );
7676
}
7777

7878
QString uri = geomType + '?' + parts.join( '&' );

tests/src/python/test_provider_memory.py

+12
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,16 @@ def testLengthPrecisionFromUri(self):
275275
self.assertEqual(myMemoryLayer.fields().field('size').length(), 12)
276276
self.assertEqual(myMemoryLayer.fields().field('size').precision(), 9)
277277

278+
def testFromUriWithEncodedField(self):
279+
"""Test we can construct the mem provider from a uri when a field name is encoded"""
280+
layer = QgsVectorLayer(
281+
('Point?crs=epsg:4326&field=name:string(20)&'
282+
'field=test%2Ffield:integer'),
283+
'test',
284+
'memory')
285+
self.assertTrue(layer.isValid())
286+
self.assertEqual([f.name() for f in layer.fields()], ['name', 'test/field'])
287+
278288
def testSaveFields(self):
279289
# Create a new memory layer with no fields
280290
myMemoryLayer = QgsVectorLayer(
@@ -398,6 +408,8 @@ def testCreateMemoryLayer(self):
398408
fields.append(QgsField("date", QVariant.Date))
399409
fields.append(QgsField("datetime", QVariant.DateTime))
400410
fields.append(QgsField("time", QVariant.Time))
411+
fields.append(QgsField("#complex_name", QVariant.String))
412+
fields.append(QgsField("complex/name", QVariant.String))
401413
layer = QgsMemoryProviderUtils.createMemoryLayer('my name', fields)
402414
self.assertTrue(layer.isValid())
403415
self.assertFalse(layer.fields().isEmpty())

0 commit comments

Comments
 (0)