From 36003393bd00e45c195b286f2189ec9533fbc53d Mon Sep 17 00:00:00 2001 From: James Ahlborn Date: Sat, 16 Apr 2011 18:13:20 +0000 Subject: [PATCH] Access expects a row to be at least big enough to hold all fixed values, even if they are null. (fixes #3181334) git-svn-id: https://svn.code.sf.net/p/jackcess/code/jackcess/trunk@553 f203690c-595d-4dc9-a70b-905162fa7fd2 --- src/changes/changes.xml | 4 ++ .../healthmarketscience/jackcess/Table.java | 63 ++++++++++--------- 2 files changed, 39 insertions(+), 28 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index a362c23..5d97102 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -18,6 +18,10 @@ Add support for Access 2010, including new "General" sort order (support for long text index entries still needs work). + + Access expects a row to be at least big enough to hold all fixed + values, even if they are null. + diff --git a/src/java/com/healthmarketscience/jackcess/Table.java b/src/java/com/healthmarketscience/jackcess/Table.java index 77b82d1..8808728 100644 --- a/src/java/com/healthmarketscience/jackcess/Table.java +++ b/src/java/com/healthmarketscience/jackcess/Table.java @@ -1605,45 +1605,52 @@ public class Table int fixedDataEnd = fixedDataStart; for (Column col : _columns) { - if(!col.isVariableLength()) { + if(col.isVariableLength()) { + continue; + } - Object rowValue = rowArray[col.getColumnIndex()]; + Object rowValue = rowArray[col.getColumnIndex()]; - if (col.getType() == DataType.BOOLEAN) { + if (col.getType() == DataType.BOOLEAN) { - if(Column.toBooleanValue(rowValue)) { - //Booleans are stored in the null mask - nullMask.markNotNull(col); - } + if(Column.toBooleanValue(rowValue)) { + //Booleans are stored in the null mask + nullMask.markNotNull(col); + } + rowValue = null; - } else { - - if(col.isAutoNumber() && !isUpdate) { + } else if(col.isAutoNumber() && !isUpdate) { - // ignore given row value, use next autonumber - rowValue = col.getAutoNumberGenerator().getNext(); + // ignore given row value, use next autonumber + rowValue = col.getAutoNumberGenerator().getNext(); - // we need to stick this back in the row so that the indexes get - // updated correctly (and caller can get the generated value) - rowArray[col.getColumnIndex()] = rowValue; - } + // we need to stick this back in the row so that the indexes get + // updated correctly (and caller can get the generated value) + rowArray[col.getColumnIndex()] = rowValue; + } - if(rowValue != null) { + if(rowValue != null) { - // we have a value - nullMask.markNotNull(col); + // we have a value to write + nullMask.markNotNull(col); - //remainingRowLength is ignored when writing fixed length data - buffer.position(fixedDataStart + col.getFixedDataOffset()); - buffer.put(col.write(rowValue, 0)); + // remainingRowLength is ignored when writing fixed length data + buffer.position(fixedDataStart + col.getFixedDataOffset()); + buffer.put(col.write(rowValue, 0)); - // keep track of the end of fixed data - if(buffer.position() > fixedDataEnd) { - fixedDataEnd = buffer.position(); - } - } - } } + + // always insert space for the entire fixed data column length + // (including null values), access expects the row to always be at least + // big enough to hold all fixed values + buffer.position(fixedDataStart + col.getFixedDataOffset() + + col.getLength()); + + // keep track of the end of fixed data + if(buffer.position() > fixedDataEnd) { + fixedDataEnd = buffer.position(); + } + } // reposition at end of fixed data -- 2.39.5