Skip to content

Commit

Permalink
Merge pull request #60540 from nyalldawson/null_test
Browse files Browse the repository at this point in the history
[oracle] Fix adding features with null attributes
  • Loading branch information
troopa81 authored Feb 12, 2025
2 parents c1f2f2e + c9cc3bd commit b52abcf
Show file tree
Hide file tree
Showing 3 changed files with 85 additions and 1 deletion.
8 changes: 7 additions & 1 deletion src/providers/oracle/qgsoracleprovider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1394,10 +1394,16 @@ bool QgsOracleProvider::addFeatures( QgsFeatureList &flist, QgsFeatureSink::Flag
QVariant value = attributevec.value( fieldId[i], QVariant() );

QgsField fld = field( fieldId[i] );
if ( ( value.isNull() && mPrimaryKeyAttrs.contains( i ) && !defaultValues.at( i ).isEmpty() ) || ( value.toString() == defaultValues[i] ) )
if ( ( QgsVariantUtils::isNull( value ) && mPrimaryKeyAttrs.contains( i ) && !defaultValues.at( i ).isEmpty() ) || ( value.toString() == defaultValues[i] ) )
{
value = evaluateDefaultExpression( defaultValues[i], fld.type() );
}
else if ( QgsVariantUtils::isNull( value ) )
{
// don't use typed null variants, always use invalid variants. Otherwise the connection
// may incorrectly try to coerce a null value to the variant type
value = QVariant();
}
features->setAttribute( fieldId[i], value );

QgsDebugMsgLevel( QStringLiteral( "addBindValue: %1" ).arg( value.toString() ), 4 );
Expand Down
38 changes: 38 additions & 0 deletions tests/src/python/providertestbase.py
Original file line number Diff line number Diff line change
Expand Up @@ -1139,6 +1139,44 @@ def testAddFeatureExtraAttributes(self):
],
)

def testAddFeatureAllNull(self):
if not getattr(self, "getEditableLayer", None):
return

l = self.getEditableLayer()
self.assertTrue(l.isValid())

f1 = QgsFeature()
f1.setAttributes([NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL])
f1.setGeometry(QgsGeometry.fromWkt("Point (-72.345 71.987)"))

if (
l.dataProvider().capabilities()
& QgsVectorDataProvider.Capability.AddFeatures
):
# expect success
result, added = l.dataProvider().addFeatures([f1])
self.assertTrue(
result,
"Provider reported AddFeatures capability, but returned False to addFeatures",
)

# check result
f_new = next(
l.dataProvider().getFeatures(
QgsFeatureRequest().setFilterFid(added[0].id())
)
)
self.assertEqual(
f_new.attributes()[1:], [NULL, NULL, NULL, NULL, NULL, NULL, NULL]
)
else:
# expect fail
self.assertFalse(
l.dataProvider().addFeatures([f1]),
"Provider reported no AddFeatures capability, but returned true to addFeatures",
)

def testAddFeatureWrongGeomType(self):
if not getattr(self, "getEditableLayer", None):
return
Expand Down
40 changes: 40 additions & 0 deletions tests/src/python/test_provider_postgres.py
Original file line number Diff line number Diff line change
Expand Up @@ -4960,6 +4960,46 @@ def testAddFeatureMissingAttributes(self):
f2.setAttributes([7, 330, "qgis", "qgis", NULL])
self.testGetFeatures(l.dataProvider(), [f1, f2])

def testAddFeatureAllNull(self):
# overridden from base test because of extra attributes in layer
if not getattr(self, "getEditableLayer", None):
return

l = self.getEditableLayer()
self.assertTrue(l.isValid())

f1 = QgsFeature()
f1.setAttributes([8, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL])
f1.setGeometry(QgsGeometry.fromWkt("Point (-72.345 71.987)"))

if (
l.dataProvider().capabilities()
& QgsVectorDataProvider.Capability.AddFeatures
):
# expect success
result, added = l.dataProvider().addFeatures([f1])
self.assertTrue(
result,
"Provider reported AddFeatures capability, but returned False to addFeatures",
)

# check result
f_new = next(
l.dataProvider().getFeatures(
QgsFeatureRequest().setFilterFid(added[0].id())
)
)
self.assertEqual(
f_new.attributes(),
[8, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL],
)
else:
# expect fail
self.assertFalse(
l.dataProvider().addFeatures([f1]),
"Provider reported no AddFeatures capability, but returned true to addFeatures",
)

def testAddFeature(self):
if not getattr(self, "getEditableLayer", None):
return
Expand Down

0 comments on commit b52abcf

Please sign in to comment.