Skip to content

Commit 3113fc6

Browse files
committed
[OGR provider] Support full SELECT subset string
This will be useful for DBManager SQL request layer.
1 parent 85fbc4a commit 3113fc6

File tree

2 files changed

+30
-2
lines changed

2 files changed

+30
-2
lines changed

src/providers/ogr/qgsogrprovider.cpp

+8-2
Original file line numberDiff line numberDiff line change
@@ -3251,8 +3251,14 @@ OGRLayerH QgsOgrProviderUtils::setSubsetString( OGRLayerH layer, OGRDataSourceH
32513251
layerName = encoding->fromUnicode( modifiedLayerName );
32523252
}
32533253
}
3254-
QByteArray sql = "SELECT * FROM " + quotedIdentifier( layerName, ogrDriverName );
3255-
sql += " WHERE " + encoding->fromUnicode( subsetString );
3254+
QByteArray sql;
3255+
if ( subsetString.startsWith( "SELECT ", Qt::CaseInsensitive ) )
3256+
sql = encoding->fromUnicode( subsetString );
3257+
else
3258+
{
3259+
sql = "SELECT * FROM " + quotedIdentifier( layerName, ogrDriverName );
3260+
sql += " WHERE " + encoding->fromUnicode( subsetString );
3261+
}
32563262

32573263
QgsDebugMsg( QString( "SQL: %1" ).arg( encoding->toUnicode( sql ) ) );
32583264
return OGR_DS_ExecuteSQL( ds, sql.constData(), nullptr, nullptr );

tests/src/python/test_provider_ogr_gpkg.py

+22
Original file line numberDiff line numberDiff line change
@@ -200,5 +200,27 @@ def testGeopackageExtentUpdate(self):
200200
self.assertTrue(QgsGeometry.compare(provider_extent.asPolygon()[0], reference.asPolygon()[0], 0.00001),
201201
provider_extent.asPolygon()[0])
202202

203+
def testSelectSubsetString(self):
204+
205+
tmpfile = os.path.join(self.basetestpath, 'testSelectSubsetString.gpkg')
206+
ds = ogr.GetDriverByName('GPKG').CreateDataSource(tmpfile)
207+
lyr = ds.CreateLayer('test', geom_type=ogr.wkbMultiPolygon)
208+
lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString))
209+
f = ogr.Feature(lyr.GetLayerDefn())
210+
f['foo'] = 'bar'
211+
lyr.CreateFeature(f)
212+
f = None
213+
f = ogr.Feature(lyr.GetLayerDefn())
214+
f['foo'] = 'baz'
215+
lyr.CreateFeature(f)
216+
f = None
217+
ds = None
218+
219+
vl = QgsVectorLayer('{}|layerid=0'.format(tmpfile), 'test', 'ogr')
220+
vl.setSubsetString("SELECT fid, foo FROM test WHERE foo = 'baz'")
221+
got = [feat for feat in vl.getFeatures()]
222+
self.assertEqual(len(got), 1)
223+
224+
203225
if __name__ == '__main__':
204226
unittest.main()

0 commit comments

Comments
 (0)