Skip to content

Commit 2cbcf74

Browse files
authored
Merge pull request #6304 from 3nids/pg_domain
[postgres] fix domain not in public schema
2 parents c3a4b11 + bfe35c2 commit 2cbcf74

File tree

6 files changed

+92
-4
lines changed

6 files changed

+92
-4
lines changed

src/providers/postgres/qgspostgresprovider.cpp

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1675,6 +1675,9 @@ void QgsPostgresProvider::enumValues( int index, QStringList &enumList ) const
16751675
QString fieldName = mAttributeFields.at( index ).name();
16761676
QString typeName = mAttributeFields.at( index ).typeName();
16771677

1678+
// Remove schema extension from typeName
1679+
typeName.remove( QRegularExpression( "^([^.]+\\.)+" ) );
1680+
16781681
//is type an enum?
16791682
QString typeSql = QStringLiteral( "SELECT typtype FROM pg_type WHERE typname=%1" ).arg( quotedValue( typeName ) );
16801683
QgsPostgresResult typeRes( connectionRO()->PQexec( typeSql ) );
@@ -1727,12 +1730,22 @@ bool QgsPostgresProvider::parseDomainCheckConstraint( QStringList &enumValues, c
17271730
enumValues.clear();
17281731

17291732
//is it a domain type with a check constraint?
1730-
QString domainSql = QStringLiteral( "SELECT domain_name FROM information_schema.columns WHERE table_name=%1 AND column_name=%2" ).arg( quotedValue( mTableName ), quotedValue( attributeName ) );
1733+
QString domainSql = QStringLiteral( "SELECT domain_name, domain_schema FROM information_schema.columns WHERE table_name=%1 AND column_name=%2" ).arg( quotedValue( mTableName ), quotedValue( attributeName ) );
17311734
QgsPostgresResult domainResult( connectionRO()->PQexec( domainSql ) );
1732-
if ( domainResult.PQresultStatus() == PGRES_TUPLES_OK && domainResult.PQntuples() > 0 )
1735+
if ( domainResult.PQresultStatus() == PGRES_TUPLES_OK && domainResult.PQntuples() > 0 && !domainResult.PQgetvalue( 0, 0 ).isNull() )
17331736
{
17341737
//a domain type
1735-
QString domainCheckDefinitionSql = QStringLiteral( "SELECT consrc FROM pg_constraint WHERE conname=(SELECT constraint_name FROM information_schema.domain_constraints WHERE domain_name=%1)" ).arg( quotedValue( domainResult.PQgetvalue( 0, 0 ) ) );
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+
" )" )
1747+
.arg( quotedValue( domainResult.PQgetvalue( 0, 0 ) ) )
1748+
.arg( quotedValue( domainResult.PQgetvalue( 0, 1 ) ) );
17361749
QgsPostgresResult domainCheckRes( connectionRO()->PQexec( domainCheckDefinitionSql ) );
17371750
if ( domainCheckRes.PQresultStatus() == PGRES_TUPLES_OK && domainCheckRes.PQntuples() > 0 )
17381751
{

tests/src/providers/testqgspostgresprovider.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@ class TestQgsPostgresProvider: public QObject
6464
qDebug() << "actual: " << decoded;
6565
QCOMPARE( decoded.toList(), expected );
6666
}
67-
6867
};
6968

7069
QGSTEST_MAIN( TestQgsPostgresProvider )

tests/src/python/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ ADD_PYTHON_TEST(PyQgsPanelWidgetStack test_qgspanelwidgetstack.py)
127127
ADD_PYTHON_TEST(PyQgsPoint test_qgspoint.py)
128128
ADD_PYTHON_TEST(PyQgsPointClusterRenderer test_qgspointclusterrenderer.py)
129129
ADD_PYTHON_TEST(PyQgsPointDisplacementRenderer test_qgspointdisplacementrenderer.py)
130+
ADD_PYTHON_TEST(PyQgsPostgresDomain test_qgspostgresdomain.py)
130131
ADD_PYTHON_TEST(PyQgsProjectionSelectionWidgets test_qgsprojectionselectionwidgets.py)
131132
ADD_PYTHON_TEST(PyQgsRange test_qgsrange.py)
132133
ADD_PYTHON_TEST(PyQgsRangeWidgets test_qgsrangewidgets.py)
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
# -*- coding: utf-8 -*-
2+
"""QGIS Unit tests for Postgres domains.
3+
4+
.. note:: This program is free software; you can redistribute it and/or modify
5+
it under the terms of the GNU General Public License as published by
6+
the Free Software Foundation; either version 2 of the License, or
7+
(at your option) any later version.
8+
"""
9+
__author__ = 'Denis Rouzaud'
10+
__date__ = '10/02/2018'
11+
__copyright__ = 'Copyright 2018, The QGIS Project'
12+
# This will get replaced with a git SHA1 when you do a git archive
13+
__revision__ = '$Format:%H$'
14+
15+
import qgis # NOQA
16+
17+
import os
18+
19+
from qgis.core import QgsVectorLayer, QgsProject
20+
21+
from qgis.testing import start_app, unittest
22+
23+
start_app()
24+
25+
26+
class TestQgsPostgresDomain(unittest.TestCase):
27+
28+
@classmethod
29+
def setUpClass(cls):
30+
"""
31+
Setup the involved layer
32+
:return:
33+
"""
34+
cls.dbconn = 'service=\'qgis_test\''
35+
if 'QGIS_PGTEST_DB' in os.environ:
36+
cls.dbconn = os.environ['QGIS_PGTEST_DB']
37+
# Create test layer
38+
cls.vl = QgsVectorLayer(cls.dbconn + ' sslmode=disable key=\'pk\' table="qgis_test"."colors" sql=', 'colors', 'postgres')
39+
40+
QgsProject.instance().addMapLayer(cls.vl)
41+
42+
def test_postgres_domain(self):
43+
self.assertEqual(self.vl.dataProvider().enumValues(1), ['red', 'green', 'blue'])
44+
self.assertEqual(self.vl.dataProvider().enumValues(2), ['yellow', 'cyan', 'magenta'])
45+
self.assertEqual(self.vl.dataProvider().enumValues(3), ['Alchemilla', 'Alstroemeria', 'Alyssum'])
46+
47+
48+
if __name__ == '__main__':
49+
unittest.main()

tests/testdata/provider/testdata_pg.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ SCRIPTS="
1111
tests/testdata/provider/testdata_pg_hstore.sql
1212
tests/testdata/provider/testdata_pg_array.sql
1313
tests/testdata/provider/testdata_pg_raster.sql
14+
tests/testdata/provider/testdata_pg_domain.sql
1415
"
1516

1617
dropdb qgis_test 2> /dev/null || true
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
2+
3+
4+
CREATE DOMAIN public.colordomain
5+
AS text
6+
COLLATE pg_catalog."default"
7+
CONSTRAINT domainconstraint CHECK (VALUE = ANY (ARRAY['red'::text, 'green'::text, 'blue'::text]));
8+
9+
CREATE DOMAIN qgis_test.colordomain
10+
AS text
11+
COLLATE pg_catalog."default"
12+
CONSTRAINT domainconstraint CHECK (VALUE = ANY (ARRAY['yellow'::text, 'cyan'::text, 'magenta'::text]));
13+
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+
19+
CREATE TABLE qgis_test.colors
20+
(
21+
id SERIAL NOT NULL,
22+
color_public colordomain,
23+
color_qgis qgis_test.colordomain,
24+
flower qgis_test.flowerdomain
25+
)

0 commit comments

Comments
 (0)