Skip to content

Commit 12e4aa2

Browse files
committed
ARROW-6472: [Java] ValueVector#accept may has potential cast exception
1 parent 35b6d07 commit 12e4aa2

File tree

2 files changed

+44
-6
lines changed

2 files changed

+44
-6
lines changed

java/vector/src/main/java/org/apache/arrow/vector/compare/ApproxEqualsVisitor.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,14 @@ public void setDoubleDiffFunction(DiffFunctionDouble doubleDiffFunction) {
6969
@Override
7070
public Boolean visit(BaseFixedWidthVector left, Range range) {
7171
if (left instanceof Float4Vector) {
72+
if (!validate(left)) {
73+
return false;
74+
}
7275
return float4ApproxEquals(range);
7376
} else if (left instanceof Float8Vector) {
77+
if (!validate(left)) {
78+
return false;
79+
}
7480
return float8ApproxEquals(range);
7581
} else {
7682
return super.visit(left, range);

java/vector/src/main/java/org/apache/arrow/vector/compare/RangeEqualsVisitor.java

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,11 @@ public RangeEqualsVisitor(ValueVector left, ValueVector right, boolean isTypeChe
5858
Preconditions.checkArgument(right != null,
5959
"right vector cannot be null");
6060

61-
// types cannot change for a visitor instance. so, the check is done only once.
61+
// type usually checks only once unless the left vector is changed.
62+
checkType();
63+
}
64+
65+
private void checkType() {
6266
if (!isTypeCheckNeeded) {
6367
typeCompareResult = true;
6468
} else if (left == right) {
@@ -68,6 +72,17 @@ public RangeEqualsVisitor(ValueVector left, ValueVector right, boolean isTypeChe
6872
}
6973
}
7074

75+
/**
76+
* Validate the passed left vector, if it is changed, reset and check type.
77+
*/
78+
protected boolean validate(ValueVector left) {
79+
if (left != this.left) {
80+
this.left = left;
81+
checkType();
82+
}
83+
return typeCompareResult;
84+
}
85+
7186
/**
7287
* Constructs a new instance.
7388
*
@@ -79,7 +94,7 @@ public RangeEqualsVisitor(ValueVector left, ValueVector right) {
7994
}
8095

8196
/**
82-
* Check range equals without passing IN param in VectorVisitor.
97+
* Check range equals.
8398
*/
8499
public boolean rangeEquals(Range range) {
85100
if (!typeCompareResult) {
@@ -107,42 +122,59 @@ public ValueVector getRight() {
107122
return right;
108123
}
109124

110-
public boolean isTypeCheckNeeded() {
111-
return isTypeCheckNeeded;
112-
}
113-
114125
@Override
115126
public Boolean visit(BaseFixedWidthVector left, Range range) {
127+
if (!validate(left)) {
128+
return false;
129+
}
116130
return compareBaseFixedWidthVectors(range);
117131
}
118132

119133
@Override
120134
public Boolean visit(BaseVariableWidthVector left, Range range) {
135+
if (!validate(left)) {
136+
return false;
137+
}
121138
return compareBaseVariableWidthVectors(range);
122139
}
123140

124141
@Override
125142
public Boolean visit(ListVector left, Range range) {
143+
if (!validate(left)) {
144+
return false;
145+
}
126146
return compareListVectors(range);
127147
}
128148

129149
@Override
130150
public Boolean visit(FixedSizeListVector left, Range range) {
151+
if (!validate(left)) {
152+
return false;
153+
}
131154
return compareFixedSizeListVectors(range);
132155
}
133156

134157
@Override
135158
public Boolean visit(NonNullableStructVector left, Range range) {
159+
if (!validate(left)) {
160+
return false;
161+
}
136162
return compareStructVectors(range);
137163
}
138164

139165
@Override
140166
public Boolean visit(UnionVector left, Range range) {
167+
if (!validate(left)) {
168+
return false;
169+
}
141170
return compareUnionVectors(range);
142171
}
143172

144173
@Override
145174
public Boolean visit(ZeroVector left, Range range) {
175+
if (!validate(left)) {
176+
return false;
177+
}
146178
return true;
147179
}
148180

0 commit comments

Comments
 (0)