diff --git a/src/core/providers/ogr/qgsogrprovider.cpp b/src/core/providers/ogr/qgsogrprovider.cpp index 7434ab936d42..9cbd354ff1b2 100644 --- a/src/core/providers/ogr/qgsogrprovider.cpp +++ b/src/core/providers/ogr/qgsogrprovider.cpp @@ -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" ) ); } } diff --git a/tests/src/python/test_provider_ogr.py b/tests/src/python/test_provider_ogr.py index 4b4d453ae141..0d0518f31479 100644 --- a/tests/src/python/test_provider_ogr.py +++ b/tests/src/python/test_provider_ogr.py @@ -53,7 +53,8 @@ QgsProviderConnectionException, QgsProviderMetadata, QgsRelation, - QgsUnsetAttributeValue + QgsUnsetAttributeValue, + QgsFieldConstraints ) from qgis.gui import ( @@ -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() @@ -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())