Skip to content

Commit 0f4cba5

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 726bac5 commit 0f4cba5

File tree

2 files changed

+40
-4
lines changed

2 files changed

+40
-4
lines changed

src/providers/postgres/qgspostgresprovider.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3421,16 +3421,16 @@ bool QgsPostgresProvider::convertField( QgsField &field, const QMap<QString, QVa
34213421
}
34223422

34233423
case QVariant::Double:
3424-
if ( fieldPrec > 0 )
3424+
if ( fieldSize > 18 )
34253425
{
34263426
fieldType = "numeric";
3427+
fieldSize = -1;
34273428
}
34283429
else
34293430
{
34303431
fieldType = "float8";
3431-
fieldSize = -1;
3432-
fieldPrec = -1;
34333432
}
3433+
fieldPrec = -1;
34343434
break;
34353435

34363436
default:

tests/src/python/test_provider_postgres.py

Lines changed: 37 additions & 1 deletion
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,
@@ -50,11 +54,20 @@ def setUpClass(cls):
5054
assert cls.poly_vl.isValid()
5155
cls.poly_provider = cls.poly_vl.dataProvider()
5256
QgsEditorWidgetRegistry.instance().initEditors()
57+
cls.con = psycopg2.connect(cls.dbconn)
5358

5459
@classmethod
5560
def tearDownClass(cls):
5661
"""Run after all tests"""
5762

63+
def execSQLCommand(self, sql):
64+
self.assertTrue(self.con)
65+
cur = self.con.cursor()
66+
self.assertTrue(cur)
67+
cur.execute(sql)
68+
cur.close()
69+
self.con.commit()
70+
5871
def enableCompiler(self):
5972
QSettings().setValue('/qgis/compileExpressions', True)
6073

@@ -424,6 +437,30 @@ def testDoubleArray(self):
424437
self.assertTrue(isinstance(f.attributes()[value_idx], list))
425438
self.assertEqual(f.attributes()[value_idx], [1.1, 2, -5.12345])
426439

440+
# See http://hub.qgis.org/issues/15188
441+
def testNumericPrecision(self):
442+
uri = 'point?field=f1:int'
443+
uri += '&field=f2:double(6,4)'
444+
uri += '&field=f3:string(20)'
445+
lyr = QgsVectorLayer(uri, "x", "memory")
446+
self.assertTrue(lyr.isValid())
447+
f = QgsFeature(lyr.fields())
448+
f['f1'] = 1
449+
f['f2'] = 123.456
450+
f['f3'] = '12345678.90123456789'
451+
lyr.dataProvider().addFeatures([f])
452+
uri = '%s table="qgis_test"."b18155" (g) key=\'f1\'' % (self.dbconn)
453+
self.execSQLCommand('DROP TABLE IF EXISTS qgis_test.b18155')
454+
err = QgsVectorLayerImport.importLayer(lyr, uri, "postgres", lyr.crs())
455+
self.assertEqual(err[0], QgsVectorLayerImport.NoError,
456+
'unexpected import error {0}'.format(err))
457+
lyr = QgsVectorLayer(uri, "y", "postgres")
458+
self.assertTrue(lyr.isValid())
459+
f = next(lyr.getFeatures())
460+
self.assertEqual(f['f1'], 1)
461+
self.assertEqual(f['f2'], 123.456)
462+
self.assertEqual(f['f3'], '12345678.90123456789')
463+
427464

428465
class TestPyQgsPostgresProviderCompoundKey(unittest.TestCase, ProviderTestCase):
429466

@@ -454,6 +491,5 @@ def uncompiledFilters(self):
454491
def partiallyCompiledFilters(self):
455492
return set([])
456493

457-
458494
if __name__ == '__main__':
459495
unittest.main()

0 commit comments

Comments
 (0)