From fcfb95499ed7a582ce570a416cdd8ae5d95aa003 Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Tue, 4 Jun 2024 12:48:48 +0200 Subject: [PATCH 1/4] Implement the testValidLayerDiscoverRelations test The test did nothing References GH-56420 --- tests/src/python/test_provider_postgres.py | 10 ++++++++++ 1 file changed, 10 insertions(+) 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. From 128e5dab649ddbea334880b7b1e38e2a37996cf5 Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Tue, 4 Jun 2024 11:38:28 +0200 Subject: [PATCH 2/4] Fix compound key discovery Closes GH-56420 --- src/providers/postgres/qgspostgresprovider.cpp | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/providers/postgres/qgspostgresprovider.cpp b/src/providers/postgres/qgspostgresprovider.cpp index 857a6ed8e47d..e3df6423b05c 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 ); - const QList foundLayers = searchLayers( layers, mUri.connectionInfo( false ), refSchema, refTable ); - if ( ( position == QLatin1String( "1" ) ) || ( !refTableFound.contains( refTable ) ) ) + // try to find if we have layers for the referenced table + const auto foundLayers = searchLayers( layers, mUri.connectionInfo( false ), refSchema, 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 ); From c70936b850f25113422528b0ca00b5c0d1fc9fb3 Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Mon, 10 Jun 2024 11:42:28 +0200 Subject: [PATCH 3/4] Swap referenced columns in relation test References GH-56420 exposing the bug reported there --- tests/testdata/provider/testdata_pg.sql | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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) ); From 847ef3eeda4f855e3e2d421438824a207cad79d8 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Tue, 18 Jun 2024 16:20:35 +1000 Subject: [PATCH 4/4] Update src/providers/postgres/qgspostgresprovider.cpp --- src/providers/postgres/qgspostgresprovider.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/providers/postgres/qgspostgresprovider.cpp b/src/providers/postgres/qgspostgresprovider.cpp index e3df6423b05c..7ae6250bc988 100644 --- a/src/providers/postgres/qgspostgresprovider.cpp +++ b/src/providers/postgres/qgspostgresprovider.cpp @@ -5265,7 +5265,7 @@ QList QgsPostgresProvider::discoverRelations( const QgsVectorLayer } const QString refColumn = sqlResult.PQgetvalue( row, 4 ); // try to find if we have layers for the referenced table - const auto foundLayers = searchLayers( layers, mUri.connectionInfo( false ), refSchema, refTable ); + const QList foundLayers = searchLayers( layers, mUri.connectionInfo( false ), refSchema, refTable ); if ( !refTableFound.contains( refTable ) ) { for ( const QgsVectorLayer *foundLayer : foundLayers )