Skip to content

Commit 05d38b3

Browse files
authored
[processing] preserve field length and precision for temporary outputs (#5654)
* add test case to cover length and precision through uri
1 parent bb6fda6 commit 05d38b3

File tree

2 files changed

+20
-1
lines changed

2 files changed

+20
-1
lines changed

src/core/providers/memory/qgsmemoryproviderutils.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,16 @@ QgsVectorLayer *QgsMemoryProviderUtils::createMemoryLayer( const QString &name,
6363
}
6464
for ( const auto &field : fields )
6565
{
66-
parts << QStringLiteral( "field=%1:%2" ).arg( field.name(), memoryLayerFieldType( field.type() ) );
66+
QString lengthPrecision;
67+
if ( field.length() > 0 && field.precision() > 0 )
68+
{
69+
lengthPrecision = QStringLiteral( "(%1,%2)" ).arg( field.length() ).arg( field.precision() );
70+
}
71+
else if ( field.length() > 0 )
72+
{
73+
lengthPrecision = QStringLiteral( "(%1)" ).arg( field.length() );
74+
}
75+
parts << QStringLiteral( "field=%1:%2%3" ).arg( field.name(), memoryLayerFieldType( field.type() ), lengthPrecision );
6776
}
6877

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

tests/src/python/test_provider_memory.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,16 @@ def testFromUri(self):
263263
myProvider = myMemoryLayer.dataProvider()
264264
assert myProvider is not None
265265

266+
def testLengthPrecisionFromUri(self):
267+
"""Test we can assign length and precision from a uri"""
268+
myMemoryLayer = QgsVectorLayer(
269+
('Point?crs=epsg:4326&field=size:double(12,9)&index=yes'),
270+
'test',
271+
'memory')
272+
273+
self.assertEqual(myMemoryLayer.fields().field('size').length(), 12)
274+
self.assertEqual(myMemoryLayer.fields().field('size').precision(), 9)
275+
266276
def testSaveFields(self):
267277
# Create a new memory layer with no fields
268278
myMemoryLayer = QgsVectorLayer(

0 commit comments

Comments
 (0)