From 871def248436fe42def99a5242ee7caca312e753 Mon Sep 17 00:00:00 2001 From: uclaros Date: Sat, 8 Feb 2020 13:05:50 +0200 Subject: [PATCH] Backport #34368 to 3.10 --- src/core/providers/ogr/qgsogrprovider.cpp | 5 ++++- tests/src/python/test_provider_shapefile.py | 21 +++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/core/providers/ogr/qgsogrprovider.cpp b/src/core/providers/ogr/qgsogrprovider.cpp index 1de492b9b1e3..62b3d61bb770 100644 --- a/src/core/providers/ogr/qgsogrprovider.cpp +++ b/src/core/providers/ogr/qgsogrprovider.cpp @@ -4382,7 +4382,10 @@ OGRLayerH QgsOgrProviderUtils::setSubsetString( OGRLayerH layer, GDALDatasetH ds } else { - OGR_L_SetAttributeFilter( layer, encoding->fromUnicode( subsetString ).constData() ); + if ( OGR_L_SetAttributeFilter( layer, encoding->fromUnicode( subsetString ).constData() ) != OGRERR_NONE ) + { + return nullptr; + } subsetLayer = layer; } diff --git a/tests/src/python/test_provider_shapefile.py b/tests/src/python/test_provider_shapefile.py index d05c5223359d..77df8417a06a 100644 --- a/tests/src/python/test_provider_shapefile.py +++ b/tests/src/python/test_provider_shapefile.py @@ -769,6 +769,27 @@ def _lessdigits(s): self.assertEqual(_lessdigits(subSet_vl.extent().toString()), filtered_extent) self.assertNotEqual(_lessdigits(subSet_vl.extent().toString()), unfiltered_extent) + def testMalformedSubsetStrings(self): + """Test that invalid where clauses always return false""" + + testPath = TEST_DATA_DIR + '/' + 'lines.shp' + + vl = QgsVectorLayer(testPath, 'subset_test', 'ogr') + self.assertTrue(vl.isValid()) + self.assertTrue(vl.setSubsetString('')) + self.assertTrue(vl.setSubsetString('"Name" = \'Arterial\'')) + self.assertTrue(vl.setSubsetString('select * from lines where "Name" = \'Arterial\'')) + self.assertFalse(vl.setSubsetString('this is invalid sql')) + self.assertFalse(vl.setSubsetString('select * from lines where "NonExistentField" = \'someValue\'')) + self.assertFalse(vl.setSubsetString('select * from lines where "Name" = \'Arte...')) + self.assertFalse(vl.setSubsetString('select * from lines where "Name" in (\'Arterial\', \'Highway\' ')) + self.assertFalse(vl.setSubsetString('select * from NonExistentTable')) + self.assertFalse(vl.setSubsetString('select NonExistentField from lines')) + self.assertFalse(vl.setSubsetString('"NonExistentField" = \'someValue\'')) + self.assertFalse(vl.setSubsetString('"Name" = \'Arte...')) + self.assertFalse(vl.setSubsetString('"Name" in (\'Arterial\', \'Highway\' ')) + self.assertTrue(vl.setSubsetString('')) + def testMultipatch(self): """Check that we can deal with multipatch shapefiles, returned natively by OGR as GeometryCollection of TIN"""