Github user JamesRTaylor commented on a diff in the pull request:

    https://github.com/apache/incubator-phoenix/pull/8#discussion_r9882918
  
    --- Diff: 
phoenix-core/src/main/java/org/apache/phoenix/expression/ArrayConstructorExpression.java
 ---
    @@ -62,27 +67,62 @@ public void reset() {
             position = 0;
             Arrays.fill(elements, null);
         }
    -    
    +
         @Override
         public boolean evaluate(Tuple tuple, ImmutableBytesWritable ptr) {
    -        for (int i = position >= 0 ? position : 0; i < elements.length; 
i++) {
    -            Expression child = children.get(i);
    -            if (!child.evaluate(tuple, ptr)) {
    -                if (tuple != null && !tuple.isImmutable()) {
    -                    if (position >= 0) position = i;
    -                    return false;
    +        try {
    +            int offset = 0;
    +            // track the elementlength for variable array
    +            int elementLength = 0;
    +            for (int i = position >= 0 ? position : 0; i < 
elements.length; i++) {
    +                Expression child = children.get(i);
    +                if (!child.evaluate(tuple, ptr)) {
    +                    if (tuple != null && !tuple.isImmutable()) {
    +                        if (position >= 0) position = i;
    +                        return false;
    +                    }
    +                } else {
    +                    // track the offset position here from the size of the 
byteStream
    +                    if (!baseType.isFixedWidth() || 
baseType.isCoercibleTo(PDataType.VARCHAR)) {
    +                        Bytes.putInt(offsetArr, offset, 
(byteStream.size()));
    +                        offset += Bytes.SIZEOF_INT;
    +                        elementLength += ptr.getLength();
    +                    }
    +                    if (!child.isStateless()) {
    +                        oStream.write(ptr.get(), ptr.getOffset(), 
ptr.getLength());
    +                    } else {
    +                        oStream.write(ptr.get());
    +                    }
                     }
    -            } else {
    -                elements[i] = baseType.toObject(ptr, child.getDataType(), 
child.getSortOrder());
    +            }
    +            if (position >= 0) position = elements.length;
    +            if (!baseType.isFixedWidth() || 
baseType.isCoercibleTo(PDataType.VARCHAR)) {
    +                oStream.writeByte(0);
    +                int offsetPosition = (byteStream.size());
    +                oStream.write(offsetArr);
    +                oStream.writeInt(offsetPosition);
    +            }
    +            // No of elements - writing it as negative as we treat the 
array not to fit in Short size
    +            oStream.writeInt(-(children.size()));
    +            // Version of the array
    +            oStream.write(PArrayDataType.ARRAY_SERIALIZATION_VERSION);
    +            // For variable length arrays setting this way would mean that 
we discard the additional 0 bytes in the
    +            // array
    +            // that gets created because we don't know the exact size. For 
fixed length array elementLength = 0
    +            ptr.set(byteStream.getBuffer(), 0, estimatedSize + 
elementLength);
    --- End diff --
    
    I don't understand this. The byteStream already tracks what you've written. 
That's what byteStream.getSize() returns. Why would you want to have some 
different, potentially wrong mechanism for tracking the size?


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. To do so, please top-post your response.
If your project does not have this feature enabled and wishes so, or if the
feature is enabled but not working, please contact infrastructure at
[email protected] or file a JIRA ticket with INFRA.
---

Reply via email to