Skip to content

Commit

Permalink
[ogr] When writing features, skip unset attribute values
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed Oct 17, 2022
1 parent b3e557f commit 6a04311
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 2 deletions.
4 changes: 3 additions & 1 deletion src/core/providers/ogr/qgsogrprovider.cpp
Expand Up @@ -1425,7 +1425,9 @@ bool QgsOgrProvider::addFeaturePrivate( QgsFeature &f, Flags flags, QgsFeatureId

QVariant attrVal = attributes.at( qgisAttributeId );
// The field value is equal to the default (that might be a provider-side expression)
if ( mDefaultValues.contains( qgisAttributeId ) && attrVal.toString() == mDefaultValues.value( qgisAttributeId ) )
if ( attributes.isUnsetValue( qgisAttributeId )
|| ( mDefaultValues.contains( qgisAttributeId ) && attrVal.toString() == mDefaultValues.value( qgisAttributeId ) )
)
{
OGR_F_UnsetField( feature.get(), ogrAttributeId );
}
Expand Down
36 changes: 35 additions & 1 deletion tests/src/python/test_provider_ogr.py
Expand Up @@ -52,7 +52,8 @@
QgsAbstractDatabaseProviderConnection,
QgsProviderConnectionException,
QgsProviderMetadata,
QgsRelation
QgsRelation,
QgsUnsetAttributeValue
)

from qgis.gui import (
Expand Down Expand Up @@ -461,6 +462,39 @@ def testEditGeoJsonAddFieldAndThenAddFeatures(self):
vl = QgsVectorLayer(datasource, 'test', 'ogr')
self.assertEqual(len(vl.fields()), 2)

def testAddFeatureWithUnsetValue(self):
"""
Test adding features with unset values
"""
with tempfile.TemporaryDirectory() as temp_dir:
tmpfile = os.path.join(temp_dir, 'test_unset_value.gpkg')
ds = ogr.GetDriverByName('GPKG').CreateDataSource(tmpfile)
lyr = ds.CreateLayer('test', geom_type=ogr.wkbMultiPolygon)
lyr.CreateField(ogr.FieldDefn('name', ogr.OFTString))
ds = None

layer = QgsVectorLayer(tmpfile, 'test')
self.assertTrue(layer.isValid())

feature = QgsFeature(layer.fields())
feature.setAttributes([1, 'test1'])
self.assertTrue(layer.dataProvider().addFeature(feature))
f1 = feature.id()

feature.setAttributes([QgsUnsetAttributeValue('Autonumber'), 'test2'])
self.assertTrue(layer.dataProvider().addFeature(feature))
f2 = feature.id()

del layer
layer = QgsVectorLayer(tmpfile, 'test')

# read back in features and test
f1_read = layer.getFeature(f1)
self.assertEqual(f1_read.attributes(), [1, 'test1'])

f2_read = layer.getFeature(f2)
self.assertEqual(f2_read.attributes(), [f2, 'test2'])

def testDataItems(self):
dataitem = QgsDirectoryItem(None, 'name', unitTestDataPath())
children = dataitem.createChildren()
Expand Down

0 comments on commit 6a04311

Please sign in to comment.