diff --git a/src/providers/postgres/qgspostgresprovider.cpp b/src/providers/postgres/qgspostgresprovider.cpp index 857a6ed8e47d..7ae6250bc988 100644 --- a/src/providers/postgres/qgspostgresprovider.cpp +++ b/src/providers/postgres/qgspostgresprovider.cpp @@ -5230,8 +5230,7 @@ QList QgsPostgresProvider::discoverRelations( const QgsVectorLayer " a.attname as column_name, " " fk.constraint_schema, " " referenced_table as table_name, " - " af.attname as column_name, " - " fk.confkey as ordinal_position " + " af.attname as column_name " "FROM foreign_keys fk " "JOIN pg_attribute af ON af.attnum = fk.confkey " "AND af.attrelid = fk.confrelid " @@ -5265,13 +5264,11 @@ QList QgsPostgresProvider::discoverRelations( const QgsVectorLayer refSchema = refSchema.mid( 1, refSchema.length() - 2 ); } const QString refColumn = sqlResult.PQgetvalue( row, 4 ); - const QString position = sqlResult.PQgetvalue( row, 5 ); + // try to find if we have layers for the referenced table const QList foundLayers = searchLayers( layers, mUri.connectionInfo( false ), refSchema, refTable ); - if ( ( position == QLatin1String( "1" ) ) || ( !refTableFound.contains( refTable ) ) ) + if ( !refTableFound.contains( refTable ) ) { - // first reference field => try to find if we have layers for the referenced table - const auto constFoundLayers = foundLayers; - for ( const QgsVectorLayer *foundLayer : constFoundLayers ) + for ( const QgsVectorLayer *foundLayer : foundLayers ) { QgsRelation relation; relation.setName( name ); diff --git a/tests/src/python/test_provider_postgres.py b/tests/src/python/test_provider_postgres.py index 05cbabf6c1dc..cd936c5691ee 100644 --- a/tests/src/python/test_provider_postgres.py +++ b/tests/src/python/test_provider_postgres.py @@ -2510,6 +2510,16 @@ def testValidLayerDiscoverRelations(self): vl ] + for lyr in vls: + self.assertTrue(lyr.isValid()) + QgsProject.instance().addMapLayer(lyr) + relations = vl.dataProvider().discoverRelations(vl, vls) + self.assertEqual(len(relations), 2) + for i, r in enumerate(relations): + self.assertEqual(r.referencedLayer(), vls[i]) + self.assertEqual(len(relations[0].fieldPairs()), 1) + self.assertEqual(len(relations[1].fieldPairs()), 1) + def testValidLayerDiscoverRelationsComposite(self): """ Test implicit relations that can be discovered between tables, based on declared composite foreign keys. diff --git a/tests/testdata/provider/testdata_pg.sql b/tests/testdata/provider/testdata_pg.sql index 06bf9ee4fc82..5b2a8802f8fb 100644 --- a/tests/testdata/provider/testdata_pg.sql +++ b/tests/testdata/provider/testdata_pg.sql @@ -787,5 +787,7 @@ CREATE TABLE qgis_test.referencing_layer_composite( fk_ref_4 integer, CONSTRAINT fk_ref_3_4 FOREIGN KEY (fk_ref_3, fk_ref_4) - REFERENCES qgis_test.referenced_layer_composite(pk_ref_3, pk_ref_4) + -- NOTE: referenced cols are given in reverse order to guard + -- against issue GH-56420 + REFERENCES qgis_test.referenced_layer_composite(pk_ref_4, pk_ref_3) );