Skip to content

Commit bfe35c2

Browse files
committedFeb 11, 2018
[postgres] use pg_type rather than information_schema.domain_constraints to retrieve domain
otherwise there is no warranty to retrieve the correct constraint as its name is not unique
1 parent 781b587 commit bfe35c2

File tree

3 files changed

+17
-2
lines changed

3 files changed

+17
-2
lines changed
 

‎src/providers/postgres/qgspostgresprovider.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1735,7 +1735,15 @@ bool QgsPostgresProvider::parseDomainCheckConstraint( QStringList &enumValues, c
17351735
if ( domainResult.PQresultStatus() == PGRES_TUPLES_OK && domainResult.PQntuples() > 0 && !domainResult.PQgetvalue( 0, 0 ).isNull() )
17361736
{
17371737
//a domain type
1738-
QString domainCheckDefinitionSql = QStringLiteral( "SELECT consrc FROM pg_constraint WHERE conname=(SELECT constraint_name FROM information_schema.domain_constraints WHERE domain_name=%1 AND domain_schema=%2)" )
1738+
QString domainCheckDefinitionSql = QStringLiteral( ""
1739+
"SELECT consrc FROM pg_constraint "
1740+
" WHERE contypid =("
1741+
" SELECT oid FROM pg_type "
1742+
" WHERE typname = %1 "
1743+
" AND typnamespace =("
1744+
" SELECT oid FROM pg_namespace WHERE nspname = %2"
1745+
" )"
1746+
" )" )
17391747
.arg( quotedValue( domainResult.PQgetvalue( 0, 0 ) ) )
17401748
.arg( quotedValue( domainResult.PQgetvalue( 0, 1 ) ) );
17411749
QgsPostgresResult domainCheckRes( connectionRO()->PQexec( domainCheckDefinitionSql ) );

‎tests/src/python/test_qgspostgresdomain.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ def setUpClass(cls):
4242
def test_postgres_domain(self):
4343
self.assertEqual(self.vl.dataProvider().enumValues(1), ['red', 'green', 'blue'])
4444
self.assertEqual(self.vl.dataProvider().enumValues(2), ['yellow', 'cyan', 'magenta'])
45+
self.assertEqual(self.vl.dataProvider().enumValues(3), ['Alchemilla', 'Alstroemeria', 'Alyssum'])
4546

4647

4748
if __name__ == '__main__':

‎tests/testdata/provider/testdata_pg_domain.sql

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,15 @@ CREATE DOMAIN qgis_test.colordomain
1111
COLLATE pg_catalog."default"
1212
CONSTRAINT domainconstraint CHECK (VALUE = ANY (ARRAY['yellow'::text, 'cyan'::text, 'magenta'::text]));
1313

14+
CREATE DOMAIN qgis_test.flowerdomain
15+
AS text
16+
COLLATE pg_catalog."default"
17+
CONSTRAINT domainconstraint CHECK (VALUE = ANY (ARRAY['Alchemilla'::text, 'Alstroemeria'::text, 'Alyssum'::text]));
18+
1419
CREATE TABLE qgis_test.colors
1520
(
1621
id SERIAL NOT NULL,
1722
color_public colordomain,
18-
color_qgis qgis_test.colordomain
23+
color_qgis qgis_test.colordomain,
24+
flower qgis_test.flowerdomain
1925
)

0 commit comments

Comments
 (0)
Please sign in to comment.