diff --git a/src/providers/oracle/qgsoracleprovider.cpp b/src/providers/oracle/qgsoracleprovider.cpp index b31b74a9a292..dd4ef0151e29 100644 --- a/src/providers/oracle/qgsoracleprovider.cpp +++ b/src/providers/oracle/qgsoracleprovider.cpp @@ -554,6 +554,7 @@ bool QgsOracleProvider::loadFields() { mAttributeFields.clear(); mDefaultValues.clear(); + mAlwaysGenerated.clear(); QgsOracleConn *conn = connectionRO(); QSqlQuery qry( *conn ); @@ -1212,6 +1213,12 @@ QVariant QgsOracleProvider::defaultValue( int fieldId ) const QString QgsOracleProvider::defaultValueClause( int fieldId ) const { QString defVal = mDefaultValues.value( fieldId, QString() ).toString(); + bool isGenerated = mAlwaysGenerated.value( fieldId, false ); + + if ( isGenerated ) + { + return defVal; + } if ( !providerProperty( EvaluateDefaultValues, false ).toBool() && !defVal.isEmpty() ) { @@ -1667,6 +1674,7 @@ bool QgsOracleProvider::deleteAttributes( const QgsAttributeIds &ids ) //delete the attribute from mAttributeFields mAttributeFields.remove( id ); mDefaultValues.removeAt( id ); + mAlwaysGenerated.removeAt( id ); } if ( !conn->commit( db ) ) diff --git a/tests/src/python/providertestbase.py b/tests/src/python/providertestbase.py index 23d5ed0aeca1..f9292b2831e3 100644 --- a/tests/src/python/providertestbase.py +++ b/tests/src/python/providertestbase.py @@ -30,6 +30,8 @@ QgsTestUtils, QgsFeatureSource, QgsFieldConstraints, + QgsDataProvider, + QgsVectorLayerUtils, NULL ) from qgis.PyQt.QtCore import QDate, QTime, QDateTime, QVariant @@ -1206,3 +1208,22 @@ def testGeneratedColumns(self): feature = vl.getFeature(10) self.assertTrue(feature.isValid()) self.assertEqual(feature.attribute(1), "test:10") + + self.assertFalse(QgsVectorLayerUtils.fieldIsEditable(vl, 1, feature)) + self.assertFalse(QgsVectorLayerUtils.fieldIsEditable(vl, 0, feature)) + + # Test insertion with default value evaluation on provider side to be sure + # it doesn't fail generated columns + vl.dataProvider().setProviderProperty(QgsDataProvider.EvaluateDefaultValues, True) + + vl.startEditing() + feature = QgsVectorLayerUtils.createFeature(vl, QgsGeometry(), {0: 8}) + vl.addFeature(feature) + self.assertTrue(feature.id() < 0) + # to be fixed + # self.assertEqual(QgsVectorLayerUtils.fieldIsEditable(vl, 1, feature), editable) + vl.commitChanges() + + feature = vl.getFeature(8) + self.assertTrue(feature.isValid()) + self.assertEqual(feature.attribute(1), "test:8")