Skip to content

Commit 6c39212

Browse files
committedJan 18, 2018
Fix virtual layers fail if table field names have special characters
Fixes #16943
1 parent a1618c7 commit 6c39212

File tree

2 files changed

+25
-1
lines changed

2 files changed

+25
-1
lines changed
 

‎src/providers/virtual/qgsvirtuallayersqlitemodule.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ struct VTable
218218
typeName = QStringLiteral( "text" );
219219
break;
220220
}
221-
sqlFields << field.name() + " " + typeName;
221+
sqlFields << QStringLiteral( "\"%1\" %2" ).arg( field.name(), typeName );
222222
}
223223

224224
QgsVectorDataProvider *provider = mLayer ? mLayer->dataProvider() : mProvider;

‎tests/src/python/test_provider_virtual.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import os
1717

1818
from qgis.core import (QgsVectorLayer,
19+
QgsField,
1920
QgsFeature,
2021
QgsFeatureRequest,
2122
QgsGeometry,
@@ -847,6 +848,29 @@ def test_joined_layers_conversion(self):
847848

848849
QgsProject.instance().removeMapLayers([v1.id(), v2.id(), v3.id()])
849850

851+
def testFieldsWithSpecialCharacters(self):
852+
ml = QgsVectorLayer("Point?srid=EPSG:4326&field=123:int", "mem_with_nontext_fieldnames", "memory")
853+
self.assertEqual(ml.isValid(), True)
854+
QgsProject.instance().addMapLayer(ml)
855+
856+
ml.startEditing()
857+
self.assertTrue(ml.addAttribute(QgsField('abc:123', QVariant.String)))
858+
f1 = QgsFeature(ml.fields())
859+
f1.setGeometry(QgsGeometry.fromWkt('POINT(0 0)'))
860+
f2 = QgsFeature(ml.fields())
861+
f2.setGeometry(QgsGeometry.fromWkt('POINT(1 1)'))
862+
ml.addFeatures([f1, f2])
863+
ml.commitChanges()
864+
865+
vl = QgsVectorLayer("?query=select * from mem_with_nontext_fieldnames", "vl", "virtual")
866+
self.assertEqual(vl.isValid(), True)
867+
self.assertEqual(vl.fields().at(0).name(), '123')
868+
self.assertEqual(vl.fields().at(1).name(), 'abc:123')
869+
870+
self.assertEqual(vl.featureCount(), 2)
871+
872+
QgsProject.instance().removeMapLayer(ml)
873+
850874

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

0 commit comments

Comments
 (0)
Please sign in to comment.