Skip to content

Commit

Permalink
Merge pull request #34717 from elpaso/bugfix-gh34696-spatialite-nofie…
Browse files Browse the repository at this point in the history
…lds-3_12

[backport] Fix spatialite editing with nofields (or def values)
  • Loading branch information
rouault committed Mar 11, 2020
2 parents 8024089 + f70b425 commit 6000739
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 5 deletions.
17 changes: 12 additions & 5 deletions src/providers/spatialite/qgsspatialiteprovider.cpp
Expand Up @@ -4017,6 +4017,7 @@ bool QgsSpatiaLiteProvider::addFeatures( QgsFeatureList &flist, Flags flags )

if ( flist.isEmpty() )
return true;

QgsAttributes attributevec = flist[0].attributes();

ret = sqlite3_exec( mSqliteHandle, "BEGIN", nullptr, nullptr, &errMsg );
Expand All @@ -4027,15 +4028,19 @@ bool QgsSpatiaLiteProvider::addFeatures( QgsFeatureList &flist, Flags flags )
QString baseSql { QStringLiteral( "INSERT INTO %1(" ).arg( QgsSqliteUtils::quotedIdentifier( mTableName ) ) };
baseValues = QStringLiteral( ") VALUES (" );

QChar baseSeparator { ' ' };

if ( !mGeometryColumn.isEmpty() )
{
baseSql += QgsSqliteUtils::quotedIdentifier( mGeometryColumn ) + ',';
baseValues += geomParam() + ',';
baseSql += QgsSqliteUtils::quotedIdentifier( mGeometryColumn );
baseValues += geomParam();
baseSeparator = ',';
}

for ( QgsFeatureList::iterator feature = flist.begin(); feature != flist.end(); ++feature )
{

QChar separator { baseSeparator };
QString values { baseValues };
sql = baseSql;

Expand All @@ -4047,7 +4052,9 @@ bool QgsSpatiaLiteProvider::addFeatures( QgsFeatureList &flist, Flags flags )

for ( int i = 0; i < attributevec.count(); ++i )
{
if ( mDefaultValues.contains( i ) && mDefaultValues.value( i ) == attributevec.at( i ).toString() )
if ( mDefaultValues.contains( i ) && (
mDefaultValues.value( i ) == attributevec.at( i ).toString() ||
! attributevec.at( i ).isValid() ) )
{
defaultIndexes.push_back( i );
continue;
Expand All @@ -4062,9 +4069,9 @@ bool QgsSpatiaLiteProvider::addFeatures( QgsFeatureList &flist, Flags flags )
continue;
}

const QChar separator { i > 0 ? ',' : ' ' };
sql += separator + QgsSqliteUtils::quotedIdentifier( fieldname );
values += separator + '?';
separator = ',';
}

sql += values;
Expand Down Expand Up @@ -4107,7 +4114,7 @@ bool QgsSpatiaLiteProvider::addFeatures( QgsFeatureList &flist, Flags flags )
continue;
}

QVariant v = attributevec.at( i );
const QVariant v = attributevec.at( i );

// binding values for each attribute
if ( i >= mAttributeFields.count() )
Expand Down
21 changes: 21 additions & 0 deletions tests/src/python/test_provider_spatialite.py
Expand Up @@ -237,9 +237,15 @@ def setUpClass(cls):
INSERT INTO test_bigint (id, value, position) VALUES
(987654321012345, 1, ST_GeomFromtext('LINESTRINGM(10.416255 55.3786316 1577093516, 10.516255 55.4786316 157709)', 4326) ),
(987654321012346, 2, ST_GeomFromtext('LINESTRINGM(10.316255 55.3786316 1577093516, 11.216255 56.3786316 157709)', 4326) )"""
cur.execute(sql)

# no fields table
sql = "CREATE TABLE \"test_nofields\"(pkuid integer primary key autoincrement)"
cur.execute(sql)
sql = "SELECT AddGeometryColumn('test_nofields', 'geometry', 4326, 'POINT', 'XY')"
cur.execute(sql)

# Commit all test data
cur.execute("COMMIT")
con.close()

Expand Down Expand Up @@ -1274,6 +1280,21 @@ def testSpatialiteAspatialMultipleAdd(self):
self.assertEqual(vl.getFeature(1).attributes(), [1, 123, 'a note'])
self.assertEqual(vl.getFeature(2).attributes(), [2, 456, 'another note'])

def testAddFeatureNoFields(self):
"""Test regression #34696"""

vl = QgsVectorLayer("dbname=%s table='test_nofields' (geometry)" % self.dbname, "test_nofields", "spatialite")
self.assertTrue(vl.isValid())
self.assertTrue(vl.startEditing())
f = QgsFeature(vl.fields())
g = QgsGeometry.fromWkt('point(9 45)')
f.setGeometry(g)
self.assertTrue(vl.addFeatures([f]))
self.assertTrue(vl.commitChanges())
vl = QgsVectorLayer("dbname=%s table='test_nofields' (geometry)" % self.dbname, "test_nofields", "spatialite")
self.assertEqual(vl.featureCount(), 1)
self.assertEqual(vl.getFeature(1).geometry().asWkt().upper(), 'POINT (9 45)')


if __name__ == '__main__':
unittest.main()

0 comments on commit 6000739

Please sign in to comment.