Skip to content

Commit

Permalink
[mssql] Fix inserting features when pk attribute name contains specia…
Browse files Browse the repository at this point in the history
…l chars

Fixes #42290
  • Loading branch information
nyalldawson authored and github-actions[bot] committed Jan 19, 2022
1 parent e32083e commit caa73e0
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 2 deletions.
4 changes: 2 additions & 2 deletions src/providers/mssql/qgsmssqlprovider.cpp
Expand Up @@ -1126,7 +1126,7 @@ bool QgsMssqlProvider::addFeatures( QgsFeatureList &flist, Flags flags )
type = QStringLiteral( "%1(%2,%3)" ).arg( type ).arg( fld.length() ).arg( fld.precision() );
}

statement += delim + QStringLiteral( "%1 %2" ).arg( fld.name(), type );
statement += delim + QStringLiteral( "[%1] %2" ).arg( fld.name(), type );
delim = ",";
}

Expand Down Expand Up @@ -1211,7 +1211,7 @@ bool QgsMssqlProvider::addFeatures( QgsFeatureList &flist, Flags flags )
for ( const auto idx : mPrimaryKeyAttrs )
{
const QgsField &fld = mAttributeFields.at( idx );
statement += delim + "inserted." + fld.name();
statement += delim + QStringLiteral( "inserted.[%1]" ).arg( fld.name() );
delim = QStringLiteral( "," );
}

Expand Down
27 changes: 27 additions & 0 deletions tests/src/python/test_provider_mssql.py
Expand Up @@ -821,6 +821,33 @@ def testExtentFromGeometryTable(self):
self.assertEqual(extent.toString(1),
QgsRectangle(0.0, 0.5, 5.5, 6.0).toString(1))

def test_insert_pk_escaping(self):
"""
Test that inserting features works with complex pk name
see https://github.com/qgis/QGIS/issues/42290
"""
md = QgsProviderRegistry.instance().providerMetadata('mssql')
conn = md.createConnection(self.dbconn, {})

conn.execSql('DROP TABLE IF EXISTS qgis_test.test_complex_pk_name')
conn.execSql('CREATE TABLE qgis_test.test_complex_pk_name ([test-field] int)')

uri = '{} table="qgis_test"."test_complex_pk_name" sql='.format(self.dbconn)
vl = QgsVectorLayer(uri, '', 'mssql')
self.assertTrue(vl.isValid())

self.assertEqual(vl.primaryKeyAttributes(), [0])

vl.startEditing()
f = QgsFeature(vl.fields())
f.setAttributes([1])
self.assertTrue(vl.addFeature(f))
self.assertTrue(vl.commitChanges())

vl = QgsVectorLayer(uri, '', 'mssql')
features = list(vl.getFeatures())
self.assertEqual([f['test-field'] for f in features], [1])


if __name__ == '__main__':
unittest.main()

0 comments on commit caa73e0

Please sign in to comment.