Skip to content

Commit b072f9e

Browse files
Fix throw exception when compare with null
1 parent 77a21a7 commit b072f9e

File tree

9 files changed

+99
-4
lines changed

9 files changed

+99
-4
lines changed

integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/IoTDBFilterTableIT.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,4 +237,28 @@ public void testFilterWithUDTF() {
237237
fail(throwable.getMessage());
238238
}
239239
}
240+
241+
@Test
242+
public void testCompareWithNull() {
243+
tableResultSetEqualTest(
244+
"select s1 from sg1 where s1 != null", new String[] {"s1"}, new String[] {}, DATABASE_NAME);
245+
tableResultSetEqualTest(
246+
"select s1 from sg1 where s1 <> null", new String[] {"s1"}, new String[] {}, DATABASE_NAME);
247+
tableResultSetEqualTest(
248+
"select s1 from sg1 where s1 = null", new String[] {"s1"}, new String[] {}, DATABASE_NAME);
249+
}
250+
251+
@Test
252+
public void testCalculateWithNull() {
253+
tableResultSetEqualTest(
254+
"select s1 + null from sg1",
255+
new String[] {"_col0"},
256+
new String[] {"null,", "null,"},
257+
DATABASE_NAME);
258+
tableResultSetEqualTest(
259+
"select s1 - null from sg1",
260+
new String[] {"_col0"},
261+
new String[] {"null,", "null,"},
262+
DATABASE_NAME);
263+
}
240264
}

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/function/arithmetic/AdditionResolver.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import static org.apache.tsfile.read.common.type.IntType.INT32;
2929
import static org.apache.tsfile.read.common.type.LongType.INT64;
3030
import static org.apache.tsfile.read.common.type.TimestampType.TIMESTAMP;
31+
import static org.apache.tsfile.read.common.type.UnknownType.UNKNOWN;
3132

3233
public class AdditionResolver {
3334

@@ -40,29 +41,42 @@ public class AdditionResolver {
4041
addCondition(INT32, DOUBLE, DOUBLE);
4142
addCondition(INT32, DATE, DATE);
4243
addCondition(INT32, TIMESTAMP, TIMESTAMP);
44+
addCondition(INT32, UNKNOWN, INT32);
4345

4446
addCondition(INT64, INT32, INT64);
4547
addCondition(INT64, INT64, INT64);
4648
addCondition(INT64, FLOAT, FLOAT);
4749
addCondition(INT64, DOUBLE, DOUBLE);
4850
addCondition(INT64, DATE, DATE);
4951
addCondition(INT64, TIMESTAMP, TIMESTAMP);
52+
addCondition(INT64, UNKNOWN, INT64);
5053

5154
addCondition(FLOAT, INT32, FLOAT);
5255
addCondition(FLOAT, INT64, FLOAT);
5356
addCondition(FLOAT, FLOAT, FLOAT);
5457
addCondition(FLOAT, DOUBLE, DOUBLE);
58+
addCondition(FLOAT, UNKNOWN, FLOAT);
5559

5660
addCondition(DOUBLE, INT32, DOUBLE);
5761
addCondition(DOUBLE, INT64, DOUBLE);
5862
addCondition(DOUBLE, FLOAT, DOUBLE);
5963
addCondition(DOUBLE, DOUBLE, DOUBLE);
64+
addCondition(DOUBLE, UNKNOWN, DOUBLE);
6065

6166
addCondition(DATE, INT32, DATE);
6267
addCondition(DATE, INT64, DATE);
68+
addCondition(DATE, UNKNOWN, DATE);
6369

6470
addCondition(TIMESTAMP, INT32, TIMESTAMP);
6571
addCondition(TIMESTAMP, INT64, TIMESTAMP);
72+
addCondition(TIMESTAMP, UNKNOWN, TIMESTAMP);
73+
74+
addCondition(UNKNOWN, INT32, INT32);
75+
addCondition(UNKNOWN, INT64, INT64);
76+
addCondition(UNKNOWN, FLOAT, FLOAT);
77+
addCondition(UNKNOWN, DOUBLE, DOUBLE);
78+
addCondition(UNKNOWN, DATE, DATE);
79+
addCondition(UNKNOWN, TIMESTAMP, TIMESTAMP);
6680
}
6781

6882
private static void addCondition(Type condition1, Type condition2, Type result) {

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/function/arithmetic/DivisionResolver.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import static org.apache.tsfile.read.common.type.FloatType.FLOAT;
2727
import static org.apache.tsfile.read.common.type.IntType.INT32;
2828
import static org.apache.tsfile.read.common.type.LongType.INT64;
29+
import static org.apache.tsfile.read.common.type.UnknownType.UNKNOWN;
2930

3031
public class DivisionResolver {
3132

@@ -36,21 +37,30 @@ public class DivisionResolver {
3637
addCondition(INT32, INT64, INT64);
3738
addCondition(INT32, FLOAT, FLOAT);
3839
addCondition(INT32, DOUBLE, DOUBLE);
40+
addCondition(INT32, UNKNOWN, INT32);
3941

4042
addCondition(INT64, INT32, INT64);
4143
addCondition(INT64, INT64, INT64);
4244
addCondition(INT64, FLOAT, FLOAT);
4345
addCondition(INT64, DOUBLE, DOUBLE);
46+
addCondition(INT64, UNKNOWN, INT64);
4447

4548
addCondition(FLOAT, INT32, FLOAT);
4649
addCondition(FLOAT, INT64, FLOAT);
4750
addCondition(FLOAT, FLOAT, FLOAT);
4851
addCondition(FLOAT, DOUBLE, DOUBLE);
52+
addCondition(FLOAT, UNKNOWN, FLOAT);
4953

5054
addCondition(DOUBLE, INT32, DOUBLE);
5155
addCondition(DOUBLE, INT64, DOUBLE);
5256
addCondition(DOUBLE, FLOAT, DOUBLE);
5357
addCondition(DOUBLE, DOUBLE, DOUBLE);
58+
addCondition(DOUBLE, UNKNOWN, DOUBLE);
59+
60+
addCondition(UNKNOWN, INT32, INT32);
61+
addCondition(UNKNOWN, INT64, INT64);
62+
addCondition(UNKNOWN, FLOAT, FLOAT);
63+
addCondition(UNKNOWN, DOUBLE, DOUBLE);
5464
}
5565

5666
private static void addCondition(Type condition1, Type condition2, Type result) {

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/function/arithmetic/ModulusResolver.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import static org.apache.tsfile.read.common.type.FloatType.FLOAT;
2727
import static org.apache.tsfile.read.common.type.IntType.INT32;
2828
import static org.apache.tsfile.read.common.type.LongType.INT64;
29+
import static org.apache.tsfile.read.common.type.UnknownType.UNKNOWN;
2930

3031
public class ModulusResolver {
3132

@@ -36,21 +37,30 @@ public class ModulusResolver {
3637
addCondition(INT32, INT64, INT64);
3738
addCondition(INT32, FLOAT, FLOAT);
3839
addCondition(INT32, DOUBLE, DOUBLE);
40+
addCondition(INT32, UNKNOWN, INT32);
3941

4042
addCondition(INT64, INT32, INT64);
4143
addCondition(INT64, INT64, INT64);
4244
addCondition(INT64, FLOAT, FLOAT);
4345
addCondition(INT64, DOUBLE, DOUBLE);
46+
addCondition(INT64, UNKNOWN, INT64);
4447

4548
addCondition(FLOAT, INT32, FLOAT);
4649
addCondition(FLOAT, INT64, FLOAT);
4750
addCondition(FLOAT, FLOAT, FLOAT);
4851
addCondition(FLOAT, DOUBLE, DOUBLE);
52+
addCondition(FLOAT, UNKNOWN, FLOAT);
4953

5054
addCondition(DOUBLE, INT32, DOUBLE);
5155
addCondition(DOUBLE, INT64, DOUBLE);
5256
addCondition(DOUBLE, FLOAT, DOUBLE);
5357
addCondition(DOUBLE, DOUBLE, DOUBLE);
58+
addCondition(DOUBLE, UNKNOWN, DOUBLE);
59+
60+
addCondition(UNKNOWN, INT32, INT32);
61+
addCondition(UNKNOWN, INT64, INT64);
62+
addCondition(UNKNOWN, FLOAT, FLOAT);
63+
addCondition(UNKNOWN, DOUBLE, DOUBLE);
5464
}
5565

5666
private static void addCondition(Type condition1, Type condition2, Type result) {

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/function/arithmetic/MultiplicationResolver.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import static org.apache.tsfile.read.common.type.FloatType.FLOAT;
2727
import static org.apache.tsfile.read.common.type.IntType.INT32;
2828
import static org.apache.tsfile.read.common.type.LongType.INT64;
29+
import static org.apache.tsfile.read.common.type.UnknownType.UNKNOWN;
2930

3031
public class MultiplicationResolver {
3132

@@ -36,21 +37,30 @@ public class MultiplicationResolver {
3637
addCondition(INT32, INT64, INT64);
3738
addCondition(INT32, FLOAT, FLOAT);
3839
addCondition(INT32, DOUBLE, DOUBLE);
40+
addCondition(INT32, UNKNOWN, INT32);
3941

4042
addCondition(INT64, INT32, INT64);
4143
addCondition(INT64, INT64, INT64);
4244
addCondition(INT64, FLOAT, FLOAT);
4345
addCondition(INT64, DOUBLE, DOUBLE);
46+
addCondition(INT64, UNKNOWN, INT64);
4447

4548
addCondition(FLOAT, INT32, FLOAT);
4649
addCondition(FLOAT, INT64, FLOAT);
4750
addCondition(FLOAT, FLOAT, FLOAT);
4851
addCondition(FLOAT, DOUBLE, DOUBLE);
52+
addCondition(FLOAT, UNKNOWN, FLOAT);
4953

5054
addCondition(DOUBLE, INT32, DOUBLE);
5155
addCondition(DOUBLE, INT64, DOUBLE);
5256
addCondition(DOUBLE, FLOAT, DOUBLE);
5357
addCondition(DOUBLE, DOUBLE, DOUBLE);
58+
addCondition(DOUBLE, UNKNOWN, DOUBLE);
59+
60+
addCondition(UNKNOWN, INT32, INT32);
61+
addCondition(UNKNOWN, INT64, INT64);
62+
addCondition(UNKNOWN, FLOAT, FLOAT);
63+
addCondition(UNKNOWN, DOUBLE, DOUBLE);
5464
}
5565

5666
private static void addCondition(Type condition1, Type condition2, Type result) {

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/function/arithmetic/SubtractionResolver.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import static org.apache.tsfile.read.common.type.IntType.INT32;
2929
import static org.apache.tsfile.read.common.type.LongType.INT64;
3030
import static org.apache.tsfile.read.common.type.TimestampType.TIMESTAMP;
31+
import static org.apache.tsfile.read.common.type.UnknownType.UNKNOWN;
3132

3233
public class SubtractionResolver {
3334

@@ -38,27 +39,36 @@ public class SubtractionResolver {
3839
addCondition(INT32, INT64, INT64);
3940
addCondition(INT32, FLOAT, FLOAT);
4041
addCondition(INT32, DOUBLE, DOUBLE);
42+
addCondition(INT32, UNKNOWN, INT32);
4143

4244
addCondition(INT64, INT32, INT64);
4345
addCondition(INT64, INT64, INT64);
4446
addCondition(INT64, FLOAT, FLOAT);
4547
addCondition(INT64, DOUBLE, DOUBLE);
48+
addCondition(INT64, UNKNOWN, INT64);
4649

4750
addCondition(FLOAT, INT32, FLOAT);
4851
addCondition(FLOAT, INT64, FLOAT);
4952
addCondition(FLOAT, FLOAT, FLOAT);
5053
addCondition(FLOAT, DOUBLE, DOUBLE);
54+
addCondition(FLOAT, UNKNOWN, FLOAT);
5155

5256
addCondition(DOUBLE, INT32, DOUBLE);
5357
addCondition(DOUBLE, INT64, DOUBLE);
5458
addCondition(DOUBLE, FLOAT, DOUBLE);
5559
addCondition(DOUBLE, DOUBLE, DOUBLE);
60+
addCondition(DOUBLE, UNKNOWN, DOUBLE);
5661

5762
addCondition(DATE, INT32, DATE);
5863
addCondition(DATE, INT64, DATE);
5964

6065
addCondition(TIMESTAMP, INT32, TIMESTAMP);
6166
addCondition(TIMESTAMP, INT64, TIMESTAMP);
67+
68+
addCondition(UNKNOWN, INT32, INT32);
69+
addCondition(UNKNOWN, INT64, INT64);
70+
addCondition(UNKNOWN, FLOAT, FLOAT);
71+
addCondition(UNKNOWN, DOUBLE, DOUBLE);
6272
}
6373

6474
private static void addCondition(Type condition1, Type condition2, Type result) {

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/TableMetadataImpl.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,9 @@
6161

6262
import static org.apache.iotdb.commons.conf.IoTDBConstant.PATH_ROOT;
6363
import static org.apache.iotdb.commons.conf.IoTDBConstant.PATH_SEPARATOR;
64+
import static org.apache.iotdb.db.queryengine.plan.relational.function.OperatorType.EQUAL;
65+
import static org.apache.iotdb.db.queryengine.plan.relational.function.OperatorType.LESS_THAN;
66+
import static org.apache.iotdb.db.queryengine.plan.relational.function.OperatorType.LESS_THAN_OR_EQUAL;
6467
import static org.apache.tsfile.read.common.type.BinaryType.TEXT;
6568
import static org.apache.tsfile.read.common.type.BooleanType.BOOLEAN;
6669
import static org.apache.tsfile.read.common.type.DateType.DATE;
@@ -70,6 +73,7 @@
7073
import static org.apache.tsfile.read.common.type.LongType.INT64;
7174
import static org.apache.tsfile.read.common.type.StringType.STRING;
7275
import static org.apache.tsfile.read.common.type.TimestampType.TIMESTAMP;
76+
import static org.apache.tsfile.read.common.type.UnknownType.UNKNOWN;
7377

7478
public class TableMetadataImpl implements Metadata {
7579

@@ -786,6 +790,10 @@ public static boolean isTimestampType(Type type) {
786790
return TIMESTAMP.equals(type);
787791
}
788792

793+
public static boolean isUnknownType(Type type) {
794+
return UNKNOWN.equals(type);
795+
}
796+
789797
public static boolean isIntegerNumber(Type type) {
790798
return INT32.equals(type) || INT64.equals(type);
791799
}
@@ -801,7 +809,10 @@ public static boolean isTwoTypeComparable(List<? extends Type> argumentTypes) {
801809
}
802810

803811
// Boolean type and Binary Type can not be compared with other types
804-
return (isNumericType(left) && isNumericType(right)) || (isCharType(left) && isCharType(right));
812+
return (isNumericType(left) && isNumericType(right))
813+
|| (isCharType(left) && isCharType(right))
814+
|| (isUnknownType(left) && (isNumericType(right) || isCharType(right)))
815+
|| ((isNumericType(left) || isCharType(left)) && isUnknownType(right));
805816
}
806817

807818
public static boolean isArithmeticType(Type type) {
@@ -819,6 +830,10 @@ public static boolean isTwoTypeCalculable(List<? extends Type> argumentTypes) {
819830
}
820831
Type left = argumentTypes.get(0);
821832
Type right = argumentTypes.get(1);
833+
if ((isUnknownType(left) && isArithmeticType(right))
834+
|| (isUnknownType(right) && isArithmeticType(left))) {
835+
return true;
836+
}
822837
return isArithmeticType(left) && isArithmeticType(right);
823838
}
824839
}

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/leaf/NullColumnTransformer.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,12 @@
2121

2222
import org.apache.tsfile.read.common.block.column.NullColumn;
2323

24+
import static org.apache.tsfile.read.common.type.UnknownType.UNKNOWN;
25+
2426
public class NullColumnTransformer extends LeafColumnTransformer {
2527

2628
public NullColumnTransformer() {
27-
super(null);
29+
super(UNKNOWN);
2830
}
2931

3032
@Override

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/unary/scalar/AbstractCastFunctionColumnTransformer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,8 @@ protected AbstractCastFunctionColumnTransformer(
4848

4949
@Override
5050
protected void doTransform(Column column, ColumnBuilder columnBuilder) {
51-
TypeEnum sourceType = childColumnTransformer.getType().getTypeEnum();
5251
Type childType = childColumnTransformer.getType();
52+
TypeEnum sourceType = childType.getTypeEnum();
5353
for (int i = 0, n = column.getPositionCount(); i < n; i++) {
5454
if (!column.isNull(i)) {
5555
transform(column, columnBuilder, sourceType, childType, i);
@@ -61,8 +61,8 @@ protected void doTransform(Column column, ColumnBuilder columnBuilder) {
6161

6262
@Override
6363
protected void doTransform(Column column, ColumnBuilder columnBuilder, boolean[] selection) {
64-
TypeEnum sourceType = childColumnTransformer.getType().getTypeEnum();
6564
Type childType = childColumnTransformer.getType();
65+
TypeEnum sourceType = childType.getTypeEnum();
6666
for (int i = 0, n = column.getPositionCount(); i < n; i++) {
6767
if (selection[i] && !column.isNull(i)) {
6868
transform(column, columnBuilder, sourceType, childType, i);

0 commit comments

Comments
 (0)