Skip to content

Commit d0b3430

Browse files
committed
Fix bogus precision/scale in PostgreSQL for double values
This reverts commit 92f71b6, which broke import of legit shapefiles by assuming wrong semantic for the non-constraining QgsField length/precision attributes. Closes #15188 Includes test
1 parent f17eb48 commit d0b3430

File tree

2 files changed

+41
-3
lines changed

2 files changed

+41
-3
lines changed

src/providers/postgres/qgspostgresprovider.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -3440,16 +3440,16 @@ bool QgsPostgresProvider::convertField( QgsField &field, const QMap<QString, QVa
34403440
break;
34413441

34423442
case QVariant::Double:
3443-
if ( fieldPrec > 0 )
3443+
if ( fieldSize > 18 )
34443444
{
34453445
fieldType = "numeric";
3446+
fieldSize = -1;
34463447
}
34473448
else
34483449
{
34493450
fieldType = "float8";
3450-
fieldSize = -1;
3451-
fieldPrec = -1;
34523451
}
3452+
fieldPrec = -1;
34533453
break;
34543454

34553455
default:

tests/src/python/test_provider_postgres.py

+38
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,15 @@
1414
__revision__ = '$Format:%H$'
1515

1616
import qgis # NOQA
17+
import psycopg2
1718

1819
import os
1920

2021
from qgis.core import (
22+
QgsGeometry,
23+
QgsPoint,
2124
QgsVectorLayer,
25+
QgsVectorLayerImport,
2226
QgsFeatureRequest,
2327
QgsFeature,
2428
QgsTransactionGroup,
@@ -48,11 +52,20 @@ def setUpClass(cls):
4852
cls.poly_vl = QgsVectorLayer(cls.dbconn + ' sslmode=disable key=\'pk\' srid=4326 type=POLYGON table="qgis_test"."some_poly_data" (geom) sql=', 'test', 'postgres')
4953
assert cls.poly_vl.isValid()
5054
cls.poly_provider = cls.poly_vl.dataProvider()
55+
cls.con = psycopg2.connect(cls.dbconn)
5156

5257
@classmethod
5358
def tearDownClass(cls):
5459
"""Run after all tests"""
5560

61+
def execSQLCommand(self, sql):
62+
self.assertTrue(self.con)
63+
cur = self.con.cursor()
64+
self.assertTrue(cur)
65+
cur.execute(sql)
66+
cur.close()
67+
self.con.commit()
68+
5669
def enableCompiler(self):
5770
QSettings().setValue(u'/qgis/compileExpressions', True)
5871

@@ -312,5 +325,30 @@ def testRenameAttributes(self):
312325
self.assertEqual(fet.fields()[1].name(), 'newname2')
313326
self.assertEqual(fet.fields()[2].name(), 'another')
314327

328+
# See http://hub.qgis.org/issues/18155
329+
def testNumericPrecision(self):
330+
uri = 'point?field=f1:int'
331+
uri += '&field=f2:double(6,4)'
332+
uri += '&field=f3:string(20)'
333+
lyr = QgsVectorLayer(uri, "x", "memory")
334+
self.assertTrue(lyr.isValid())
335+
f = QgsFeature(lyr.fields())
336+
f['f1'] = 1
337+
f['f2'] = 123.456
338+
f['f3'] = '12345678.90123456789'
339+
lyr.dataProvider().addFeatures([f])
340+
uri = '%s table="qgis_test"."b18155" (g) key=\'f1\'' % (self.dbconn)
341+
self.execSQLCommand('DROP TABLE IF EXISTS qgis_test.b18155')
342+
err = QgsVectorLayerImport.importLayer(lyr, uri, "postgres", lyr.crs())
343+
self.assertEqual(err[0], QgsVectorLayerImport.NoError,
344+
'unexpected import error {0}'.format(err))
345+
lyr = QgsVectorLayer(uri, "y", "postgres")
346+
self.assertTrue(lyr.isValid())
347+
f = next(lyr.getFeatures())
348+
self.assertEqual(f['f1'], 1)
349+
self.assertEqual(f['f2'], 123.456)
350+
self.assertEqual(f['f3'], '12345678.90123456789')
351+
352+
315353
if __name__ == '__main__':
316354
unittest.main()

0 commit comments

Comments
 (0)