diff --git a/src/providers/postgres/qgspostgresprovider.cpp b/src/providers/postgres/qgspostgresprovider.cpp index c95615769b6a..a62b5f716d09 100644 --- a/src/providers/postgres/qgspostgresprovider.cpp +++ b/src/providers/postgres/qgspostgresprovider.cpp @@ -1149,7 +1149,11 @@ bool QgsPostgresProvider::loadFields() if ( fields.contains( fieldName ) ) { QgsMessageLog::logMessage( tr( "Duplicate field %1 found\n" ).arg( fieldName ), tr( "PostGIS" ) ); - return false; + // In case of read-only query layers we can safely ignore the issue + if ( ! mIsQuery ) + { + return false; + } } fields << fieldName; diff --git a/tests/src/python/test_provider_postgres.py b/tests/src/python/test_provider_postgres.py index 7a7592a318c3..6ff053f3ad04 100644 --- a/tests/src/python/test_provider_postgres.py +++ b/tests/src/python/test_provider_postgres.py @@ -2387,6 +2387,19 @@ def testAddFeature(self): self.assertFalse(l.dataProvider().addFeatures([f1, f2]), 'Provider reported no AddFeatures capability, but returned true to addFeatures') + def testDuplicatedFieldNamesInQueryLayers(self): + """Test regresssion GH #36205""" + + vl = QgsVectorLayer(self.dbconn + ' sslmode=disable key=\'__rid__\' table="(SELECT row_number() OVER () AS __rid__, * FROM (SELECT * from qgis_test.some_poly_data a, qgis_test.some_poly_data b where ST_Intersects(a.geom,b.geom)) as foo)" sql=', 'test_36205', 'postgres') + self.assertTrue(vl.isValid()) + self.assertEqual(vl.featureCount(), 3) + + # This fails because the "geom" field and "pk" fields are ambiguous + # There is no easy fix: all duplicated fields should be explicitly aliased + # and the query internally rewritten + # feature = next(vl.getFeatures()) + # self.assertTrue(vl.isValid()) + if __name__ == '__main__': unittest.main()