Skip to content

Commit

Permalink
Merge pull request #5694 from elpaso/bugfix-17518-pg-import--without-…
Browse files Browse the repository at this point in the history
…schema

[bugfix][postgres] Browser panel D&D a layer onto a postgresql connection tree …
  • Loading branch information
elpaso committed Nov 23, 2017
2 parents 060b3e3 + 9f56878 commit 9d8a39f
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 0 deletions.
15 changes: 15 additions & 0 deletions src/providers/postgres/qgspostgresprovider.cpp
Expand Up @@ -3696,6 +3696,7 @@ QgsVectorLayerExporter::ExportError QgsPostgresProvider::createEmptyLayer( const
{ {
// populate members from the uri structure // populate members from the uri structure
QgsDataSourceUri dsUri( uri ); QgsDataSourceUri dsUri( uri );

QString schemaName = dsUri.schema(); QString schemaName = dsUri.schema();
QString tableName = dsUri.table(); QString tableName = dsUri.table();


Expand Down Expand Up @@ -3791,6 +3792,20 @@ QgsVectorLayerExporter::ExportError QgsPostgresProvider::createEmptyLayer( const
{ {
conn->PQexecNR( QStringLiteral( "BEGIN" ) ); conn->PQexecNR( QStringLiteral( "BEGIN" ) );


// We want a valid schema name ...
if ( schemaName.isEmpty() )
{
QString sql = QString( "SELECT current_schema" );
QgsPostgresResult result( conn->PQexec( sql ) );
if ( result.PQresultStatus() != PGRES_TUPLES_OK )
throw PGException( result );
schemaName = result.PQgetvalue( 0, 0 );
if ( schemaName.isEmpty() )
{
schemaName = QStringLiteral( "public" );
}
}

QString sql = QString( "SELECT 1" QString sql = QString( "SELECT 1"
" FROM pg_class AS cls JOIN pg_namespace AS nsp" " FROM pg_class AS cls JOIN pg_namespace AS nsp"
" ON nsp.oid=cls.relnamespace " " ON nsp.oid=cls.relnamespace "
Expand Down
37 changes: 37 additions & 0 deletions tests/src/python/test_provider_postgres.py
@@ -1,10 +1,14 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
"""QGIS Unit tests for the postgres provider. """QGIS Unit tests for the postgres provider.
Note: to prepare the DB, you need to run the sql files specified in
tests/testdata/provider/testdata_pg.sh
.. note:: This program is free software; you can redistribute it and/or modify .. note:: This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or the Free Software Foundation; either version 2 of the License, or
(at your option) any later version. (at your option) any later version.
""" """
from builtins import next from builtins import next
__author__ = 'Matthias Kuhn' __author__ = 'Matthias Kuhn'
Expand Down Expand Up @@ -765,6 +769,39 @@ def testKey(lyr, key, kfnames):
testKey(lyr, '"f1","F2","f3"', ['f1', 'F2', 'f3']) testKey(lyr, '"f1","F2","f3"', ['f1', 'F2', 'f3'])
testKey(lyr, None, ['id']) testKey(lyr, None, ['id'])


# See https://issues.qgis.org/issues/17518
def testImportWithoutSchema(self):

def _test(table, schema=None):
self.execSQLCommand('DROP TABLE IF EXISTS %s CASCADE' % table)
uri = 'point?field=f1:int'
uri += '&field=F2:double(6,4)'
uri += '&field=f3:string(20)'
lyr = QgsVectorLayer(uri, "x", "memory")
self.assertTrue(lyr.isValid())

table = ("%s" % table) if schema is None else ("\"%s\".\"%s\"" % (schema, table))
dest_uri = "%s sslmode=disable table=%s (geom) sql" % (self.dbconn, table)
err = QgsVectorLayerExporter.exportLayer(lyr, dest_uri, "postgres", lyr.crs())
olyr = QgsVectorLayer(dest_uri, "y", "postgres")
self.assertTrue(olyr.isValid(), "Failed URI: %s" % dest_uri)

# Test bug 17518
_test('b17518')

# Test fully qualified table (with schema)
_test("b17518", "qgis_test")

# Test empty schema
_test("b17518", "")

# Test public schema
_test("b17518", "public")

# Test fully qualified table (with wrong schema)
with self.assertRaises(AssertionError):
_test("b17518", "qgis_test_wrong")

def testStyle(self): def testStyle(self):
self.execSQLCommand('DROP TABLE IF EXISTS layer_styles CASCADE') self.execSQLCommand('DROP TABLE IF EXISTS layer_styles CASCADE')


Expand Down

0 comments on commit 9d8a39f

Please sign in to comment.