diff --git a/src/providers/mssql/qgsmssqlprovider.cpp b/src/providers/mssql/qgsmssqlprovider.cpp index 2a9d331df10..76d7b98a1b1 100644 --- a/src/providers/mssql/qgsmssqlprovider.cpp +++ b/src/providers/mssql/qgsmssqlprovider.cpp @@ -478,44 +478,52 @@ QString QgsMssqlProvider::quotedIdentifier( const QString &value ) QString QgsMssqlProvider::defaultValueClause( int fieldId ) const { - QString defVal = mDefaultValues.value( fieldId, QString() ); + const QString defVal = mDefaultValues.value( fieldId, QString() ); + + if ( defVal.isEmpty() ) + return QString(); // NOTE: If EvaluateDefaultValues is activated it is impossible to get the defaultValueClause. // This also apply to QgsPostgresProvider::defaultValueClause. - if ( !providerProperty( EvaluateDefaultValues, false ).toBool() && !defVal.isEmpty() ) - { + if ( !providerProperty( EvaluateDefaultValues, false ).toBool() ) return defVal; - } return QString(); } QVariant QgsMssqlProvider::defaultValue( int fieldId ) const { - QString defVal = mDefaultValues.value( fieldId, QString() ); + const QString defVal = mDefaultValues.value( fieldId, QString() ); - if ( providerProperty( EvaluateDefaultValues, false ).toBool() && !defVal.isEmpty() ) + if ( defVal.isEmpty() ) + return QVariant(); + + if ( !providerProperty( EvaluateDefaultValues, false ).toBool() ) + return QVariant(); + + QString sql = QStringLiteral( "select %1" ) + .arg( defVal ); + + QSqlQuery query = createQuery(); + query.setForwardOnly( true ); + + if ( !query.exec( sql ) ) { - QString sql = QStringLiteral( "select %1" ) - .arg( defVal ); - - QSqlQuery query = createQuery(); - query.setForwardOnly( true ); - - if ( !query.exec( sql ) ) - { - QgsDebugMsg( query.lastError().text() ); - pushError( tr( "Could not execute query" ) ); - return QVariant(); - } - - if ( !query.next() ) - return QVariant(); - - return query.value( 0 ); + const QString errorMessage( tr( "Could not execute query: %1" ).arg( query.lastError().text() ) ); + QgsDebugMsg( errorMessage ); + pushError( errorMessage ); + return QVariant(); } - return QVariant(); + if ( !query.next() ) + { + const QString errorMessage( tr( "Could not fetch next query value: %1" ).arg( query.lastError().text() ) ); + QgsDebugMsg( errorMessage ); + pushError( errorMessage ); + return QVariant(); + } + + return query.value( 0 ); } QString QgsMssqlProvider::storageType() const diff --git a/tests/src/python/test_provider_mssql.py b/tests/src/python/test_provider_mssql.py index b0853fbc48d..996921dd5fe 100644 --- a/tests/src/python/test_provider_mssql.py +++ b/tests/src/python/test_provider_mssql.py @@ -26,7 +26,8 @@ from qgis.core import (QgsSettings, QgsProviderRegistry, NULL, QgsVectorLayerExporter, - QgsCoordinateReferenceSystem) + QgsCoordinateReferenceSystem, + QgsDataProvider) from qgis.PyQt.QtCore import QDate, QTime, QDateTime, QVariant from utilities import unitTestDataPath @@ -514,6 +515,19 @@ class TestPyQgsMssqlProvider(unittest.TestCase, ProviderTestCase): self.assertTrue(vl.isValid()) self.assertEqual(vl.dataProvider().extent().toString(1), 'Empty') + def testEvaluateDefaultValueClause(self): + + vl = QgsVectorLayer( + '%s table="qgis_test"."someData" sql=' % + (self.dbconn), "testdatetimes", "mssql") + + # Activate EvaluateDefaultValues + vl.dataProvider().setProviderProperty(QgsDataProvider.EvaluateDefaultValues, True) + + name_index = vl.fields().lookupField('name') + defaultValue = vl.dataProvider().defaultValue(name_index) + self.assertEqual(defaultValue, 'qgis') + if __name__ == '__main__': unittest.main()