Skip to content

Commit d95fc60

Browse files
committedJan 19, 2018
Fix virtual layers fail if table field names have special characters
Fixes #16943 Cherry-picked from 6c39212
1 parent 4b1d98b commit d95fc60

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
@@ -215,7 +215,7 @@ struct VTable
215215
typeName = "text";
216216
break;
217217
}
218-
sqlFields << field.name() + " " + typeName;
218+
sqlFields << QString( "\"%1\" %2" ).arg( field.name(), typeName );
219219
}
220220

221221
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,
@@ -841,6 +842,29 @@ def test_joined_layers_conversion(self):
841842

842843
QgsMapLayerRegistry.instance().removeMapLayers([v1, v2, v3])
843844

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

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

0 commit comments

Comments
 (0)
Please sign in to comment.