Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[Oracle] Fix generated columns when evaluate default value is on
  • Loading branch information
troopa81 committed Nov 23, 2020
1 parent 5bd0058 commit fe3b809
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 0 deletions.
8 changes: 8 additions & 0 deletions src/providers/oracle/qgsoracleprovider.cpp
Expand Up @@ -554,6 +554,7 @@ bool QgsOracleProvider::loadFields()
{
mAttributeFields.clear();
mDefaultValues.clear();
mAlwaysGenerated.clear();

QgsOracleConn *conn = connectionRO();
QSqlQuery qry( *conn );
Expand Down Expand Up @@ -1213,6 +1214,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() )
{
Expand Down Expand Up @@ -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 ) )
Expand Down
17 changes: 17 additions & 0 deletions tests/src/python/providertestbase.py
Expand Up @@ -30,6 +30,7 @@
QgsTestUtils,
QgsFeatureSource,
QgsFieldConstraints,
QgsDataProvider,
QgsVectorLayerUtils,
NULL
)
Expand Down Expand Up @@ -1214,3 +1215,19 @@ def testGeneratedColumns(self):
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")

0 comments on commit fe3b809

Please sign in to comment.