Skip to content

Commit

Permalink
[ogr] Update skipConstraintCheck logic to handle QgsUnsetAttributeValue
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed Oct 17, 2022
1 parent 6a04311 commit 6eb05d3
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 8 deletions.
4 changes: 3 additions & 1 deletion src/core/providers/ogr/qgsogrprovider.cpp
Expand Up @@ -1240,7 +1240,9 @@ bool QgsOgrProvider::skipConstraintCheck( int fieldIndex, QgsFieldConstraints::C
else
{
// stricter check
return mDefaultValues.contains( fieldIndex ) && mDefaultValues.value( fieldIndex ) == value.toString() && !QgsVariantUtils::isNull( value );
return mDefaultValues.contains( fieldIndex ) && !QgsVariantUtils::isNull( value ) && (
mDefaultValues.value( fieldIndex ) == value.toString()
|| value.userType() == QMetaType::type( "QgsUnsetAttributeValue" ) );
}
}

Expand Down
34 changes: 27 additions & 7 deletions tests/src/python/test_provider_ogr.py
Expand Up @@ -53,7 +53,8 @@
QgsProviderConnectionException,
QgsProviderMetadata,
QgsRelation,
QgsUnsetAttributeValue
QgsUnsetAttributeValue,
QgsFieldConstraints
)

from qgis.gui import (
Expand Down Expand Up @@ -468,20 +469,39 @@ def testAddFeatureWithUnsetValue(self):
"""
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.ExecuteSQL(
"CREATE TABLE test(fid INTEGER PRIMARY KEY, name TEXT DEFAULT 'default_value', auto_number INTEGER DEFAULT 55)")

ds = None

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

self.assertFalse(
layer.dataProvider().skipConstraintCheck(0, QgsFieldConstraints.ConstraintUnique, 5))
self.assertTrue(layer.dataProvider().skipConstraintCheck(0, QgsFieldConstraints.ConstraintUnique, 'Autogenerate'))
self.assertTrue(
layer.dataProvider().skipConstraintCheck(0, QgsFieldConstraints.ConstraintUnique, QgsUnsetAttributeValue()))
self.assertTrue(
layer.dataProvider().skipConstraintCheck(0, QgsFieldConstraints.ConstraintUnique, QgsUnsetAttributeValue('Autogenerate')))
self.assertFalse(layer.dataProvider().skipConstraintCheck(1, QgsFieldConstraints.ConstraintUnique, 'my name'))
self.assertFalse(
layer.dataProvider().skipConstraintCheck(1, QgsFieldConstraints.ConstraintUnique, NULL))
self.assertTrue(
layer.dataProvider().skipConstraintCheck(1, QgsFieldConstraints.ConstraintUnique, QgsUnsetAttributeValue()))
self.assertFalse(
layer.dataProvider().skipConstraintCheck(2, QgsFieldConstraints.ConstraintUnique, 11))
self.assertTrue(
layer.dataProvider().skipConstraintCheck(2, QgsFieldConstraints.ConstraintUnique, QgsUnsetAttributeValue()))

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

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

Expand All @@ -490,10 +510,10 @@ def testAddFeatureWithUnsetValue(self):

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

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

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

0 comments on commit 6eb05d3

Please sign in to comment.