diff --git a/src/core/providers/ogr/qgsogrproviderutils.cpp b/src/core/providers/ogr/qgsogrproviderutils.cpp index 3e9db6a9177..ed353fb69a6 100644 --- a/src/core/providers/ogr/qgsogrproviderutils.cpp +++ b/src/core/providers/ogr/qgsogrproviderutils.cpp @@ -1314,6 +1314,11 @@ QByteArray QgsOgrProviderUtils::quotedIdentifier( QByteArray field, const QStrin field.replace( '`', "``" ); return field.prepend( '`' ).append( '`' ); } + else if ( driverName == QLatin1String( "GPKG" ) || driverName == QLatin1String( "SQLite" ) ) + { + field.replace( '"', "\"\"" ); + return field.prepend( '\"' ).append( '\"' ); + } else { field.replace( '\\', "\\\\" ); diff --git a/tests/src/python/test_provider_ogr_gpkg.py b/tests/src/python/test_provider_ogr_gpkg.py index 390119b6486..5510fc3ed22 100644 --- a/tests/src/python/test_provider_ogr_gpkg.py +++ b/tests/src/python/test_provider_ogr_gpkg.py @@ -3124,6 +3124,27 @@ class TestPyQgsOGRProviderGpkg(QgisTestCase): # for some reason that I cannto reproduce locally, featureCount returns 2 # self.assertEqual(vl.featureCount(), 1) + def testOrderByEscapedIdentifier(self): + """Test issue GH #58508""" + + tmpfile = os.path.join(self.basetestpath, 'points_escaped_identifier.gpkg') + testdata_path = unitTestDataPath('provider') + shutil.copy(os.path.join(testdata_path, 'points_escaped_identifier.gpkg'), tmpfile) + vl = QgsVectorLayer(f'{tmpfile}|layername=table\\"\\table', 'test', 'ogr') + self.assertTrue(vl.isValid()) + self.assertEqual(vl.featureCount(), 3) + + request = QgsFeatureRequest() + orderBy = QgsFeatureRequest.OrderBy([QgsFeatureRequest.OrderByClause('NAME', False)]) + request.setOrderBy(orderBy) + features = vl.getFeatures(request) + + featureCount = 0 + for feature in features: + featureCount = featureCount + 1 + + self.assertEqual(featureCount, 3) + if __name__ == '__main__': unittest.main() diff --git a/tests/testdata/provider/points_escaped_identifier.gpkg b/tests/testdata/provider/points_escaped_identifier.gpkg new file mode 100644 index 00000000000..a2f8acf1396 Binary files /dev/null and b/tests/testdata/provider/points_escaped_identifier.gpkg differ