Github user JamesRTaylor commented on a diff in the pull request:
https://github.com/apache/incubator-phoenix/pull/8#discussion_r9883574
--- 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);
--- End diff --
Is this the extra, null byte so that comparisons work out? Thinking about
this more, this isn't going to guarantee our sort order works out, because the
other array may have null bytes itself to represent null array elements. We'd
need to only compare the data that represent the actual array data and not the
header data.
So let's not write this byte. I've already disallowed comparison of arrays
with the <, <=, >, >= so we're fine for now. We'd need to special case our
comparator to get this right. We can do this later - it's not a 3.0 requirement.
---
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.
---