--- ogr2ogr.cpp.bak Tue Jan 19 12:33:50 2010 +++ ogr2ogr.cpp Thu Feb 04 14:08:58 2010 @@ -1170,7 +1170,7 @@ if (papszSelFields && !bAppend ) { - int nDstFieldCount = poDstFDefn->GetFieldCount(); + int nDstFieldCount = (poDstFDefn ? poDstFDefn->GetFieldCount() : 0); for( iField=0; papszSelFields[iField] != NULL; iField++) { int iSrcField = poSrcFDefn->GetFieldIndex(papszSelFields[iField]); @@ -1188,7 +1188,9 @@ } /* The field may have been already created at layer creation */ - int iDstField = poDstFDefn->GetFieldIndex(oFieldDefn.GetNameRef()); + int iDstField = -1; + if (poDstFDefn) + iDstField = poDstFDefn->GetFieldIndex(oFieldDefn.GetNameRef()); if (iDstField >= 0) { panMap[iSrcField] = iDstField; @@ -1196,6 +1198,9 @@ else if (poDstLayer->CreateField( &oFieldDefn ) == OGRERR_NONE) { /* Sanity check : if it fails, the driver is buggy */ + if (!poDstFDefn) + poDstFDefn = poDstLayer->GetLayerDefn(); // now that we've created a field, GetLayerDefn() won't return NULL + if (poDstFDefn->GetFieldCount() != nDstFieldCount + 1) { CPLError(CE_Warning, CPLE_AppDefined, @@ -1223,7 +1228,7 @@ } else if( !bAppend ) { - int nDstFieldCount = poDstFDefn->GetFieldCount(); + int nDstFieldCount = (poDstFDefn ? poDstFDefn->GetFieldCount() : 0); for( iField = 0; iField < nSrcFieldCount; iField++ ) { OGRFieldDefn* poSrcFieldDefn = poSrcFDefn->GetFieldDefn(iField); @@ -1238,13 +1243,18 @@ } /* The field may have been already created at layer creation */ - int iDstField = poDstFDefn->GetFieldIndex(oFieldDefn.GetNameRef()); + int iDstField = -1; + if (poDstFDefn) + iDstField = poDstFDefn->GetFieldIndex(oFieldDefn.GetNameRef()); if (iDstField >= 0) { panMap[iField] = iDstField; } else if (poDstLayer->CreateField( &oFieldDefn ) == OGRERR_NONE) { + if (!poDstFDefn) + poDstFDefn = poDstLayer->GetLayerDefn(); // now that we've created a field, GetLayerDefn() won't return NULL + /* Sanity check : if it fails, the driver is buggy */ if (poDstFDefn->GetFieldCount() != nDstFieldCount + 1) {