diff --git a/src/providers/spatialite/qgsspatialiteprovider.cpp b/src/providers/spatialite/qgsspatialiteprovider.cpp index 8f7f3e939217..ded757218bc6 100644 --- a/src/providers/spatialite/qgsspatialiteprovider.cpp +++ b/src/providers/spatialite/qgsspatialiteprovider.cpp @@ -4009,7 +4009,6 @@ bool QgsSpatiaLiteProvider::addFeatures( QgsFeatureList &flist, Flags flags ) char *errMsg = nullptr; bool toCommit = false; QString baseValues; - QString separator; int ia, ret; // SQL for single row QString sql; @@ -4025,13 +4024,11 @@ bool QgsSpatiaLiteProvider::addFeatures( QgsFeatureList &flist, Flags flags ) QString baseSql { QStringLiteral( "INSERT INTO %1(" ).arg( QgsSqliteUtils::quotedIdentifier( mTableName ) ) }; baseValues = QStringLiteral( ") VALUES (" ); - separator.clear(); if ( !mGeometryColumn.isEmpty() ) { - baseSql += separator + QgsSqliteUtils::quotedIdentifier( mGeometryColumn ); - baseValues += separator + geomParam(); - separator = ','; + baseSql += QgsSqliteUtils::quotedIdentifier( mGeometryColumn ) + ','; + baseValues += geomParam() + ','; } for ( QgsFeatureList::iterator feature = flist.begin(); feature != flist.end(); ++feature ) @@ -4063,9 +4060,9 @@ bool QgsSpatiaLiteProvider::addFeatures( QgsFeatureList &flist, Flags flags ) continue; } + const QChar separator { i > 0 ? ',' : ' ' }; sql += separator + QgsSqliteUtils::quotedIdentifier( fieldname ); values += separator + '?'; - separator = ','; } sql += values; diff --git a/tests/src/python/test_provider_spatialite.py b/tests/src/python/test_provider_spatialite.py index 7d00b4c683a6..21f236062b02 100644 --- a/tests/src/python/test_provider_spatialite.py +++ b/tests/src/python/test_provider_spatialite.py @@ -1225,6 +1225,45 @@ def testSpatialiteDefaultValues(self): self.assertEqual(feature.attribute(4), 123) self.assertEqual(feature.attribute(5), 'My default') + def testSpatialiteAspatialMultipleAdd(self): + """Add multiple features in aspatial table. See GH #34379""" + + # Create the test table + + dbname = os.path.join(tempfile.gettempdir(), "test_aspatial_multiple_edits.sqlite") + if os.path.exists(dbname): + os.remove(dbname) + con = spatialite_connect(dbname, isolation_level=None) + cur = con.cursor() + cur.execute("BEGIN") + sql = "SELECT InitSpatialMetadata()" + cur.execute(sql) + + # simple table with primary key + sql = """ + CREATE TABLE "test_aspatial_multiple_edits"(pkuid integer primary key autoincrement,"id" integer,"note" text) + """ + cur.execute(sql) + cur.execute("COMMIT") + con.close() + + vl = QgsVectorLayer("dbname='%s' table='test_aspatial_multiple_edits'" % dbname, 'test_aspatial_multiple_edits', 'spatialite') + self.assertTrue(vl.isValid()) + + self.assertTrue(vl.startEditing()) + f1 = QgsFeature(vl.fields()) + f1.setAttribute('note', 'a note') + f1.setAttribute('id', 123) + f2 = QgsFeature(vl.fields()) + f2.setAttribute('note', 'another note') + f2.setAttribute('id', 456) + self.assertTrue(vl.addFeatures([f1, f2])) + self.assertTrue(vl.commitChanges()) + + # Verify + self.assertEqual(vl.getFeature(1).attributes(), [1, 123, 'a note']) + self.assertEqual(vl.getFeature(2).attributes(), [2, 456, 'another note']) + if __name__ == '__main__': unittest.main()