This is an automated email from the ASF dual-hosted git repository.

jackie pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/pinot.git


The following commit(s) were added to refs/heads/master by this push:
     new 1229add21e [Multi-stage] Fix literal handling (#13344)
1229add21e is described below

commit 1229add21efc44498ce802f3ee82892e4a1f6d7c
Author: Xiaotian (Jackie) Jiang <[email protected]>
AuthorDate: Sat Jun 8 10:25:40 2024 -0700

    [Multi-stage] Fix literal handling (#13344)
---
 .../common/request/context/ExpressionContext.java  |  20 +-
 .../request/context/RequestContextUtils.java       |   2 +-
 .../pinot/common/utils/request/RequestUtils.java   | 230 ++++++++++++---------
 pinot-common/src/main/proto/expressions.proto      |  18 +-
 .../query/executor/ServerQueryExecutorV1Impl.java  |   2 +-
 .../ArrayLiteralTransformFunctionTest.java         |  11 +-
 .../plan/maker/QueryOverrideWithHintsTest.java     |  36 ++--
 .../BrokerRequestToQueryContextConverterTest.java  |  18 +-
 .../query/parser/CalciteRexExpressionParser.java   |  22 +-
 .../planner/logical/RelToPlanNodeConverter.java    |   4 +
 .../pinot/query/planner/logical/RexExpression.java |   3 +
 .../query/planner/logical/RexExpressionUtils.java  | 152 +++++++-------
 .../serde/ProtoExpressionToRexExpression.java      |  91 ++++----
 .../serde/RexExpressionToProtoExpression.java      |  62 +++---
 .../query/runtime/operator/AggregateOperator.java  |  13 +-
 .../runtime/operator/MailboxSendOperator.java      |   6 +-
 .../query/runtime/operator/FilterOperatorTest.java |  12 +-
 .../runtime/operator/TransformOperatorTest.java    |  12 +-
 .../DistinctCountULLValueAggregatorTest.java       |   4 +-
 ...MutableSegmentImplIngestionAggregationTest.java |   2 +-
 20 files changed, 376 insertions(+), 344 deletions(-)

diff --git 
a/pinot-common/src/main/java/org/apache/pinot/common/request/context/ExpressionContext.java
 
b/pinot-common/src/main/java/org/apache/pinot/common/request/context/ExpressionContext.java
index 924c08f32a..927ab4eb69 100644
--- 
a/pinot-common/src/main/java/org/apache/pinot/common/request/context/ExpressionContext.java
+++ 
b/pinot-common/src/main/java/org/apache/pinot/common/request/context/ExpressionContext.java
@@ -20,8 +20,9 @@ package org.apache.pinot.common.request.context;
 
 import java.util.Objects;
 import java.util.Set;
+import javax.annotation.Nullable;
 import org.apache.pinot.common.request.Literal;
-import org.apache.pinot.spi.data.FieldSpec;
+import org.apache.pinot.spi.data.FieldSpec.DataType;
 
 
 /**
@@ -42,12 +43,16 @@ public class ExpressionContext {
   // Only set when the _type is LITERAL
   private final LiteralContext _literal;
 
-  public static ExpressionContext forLiteralContext(Literal literal) {
-    return new ExpressionContext(Type.LITERAL, null, null, new 
LiteralContext(literal));
+  public static ExpressionContext forLiteral(LiteralContext literal) {
+    return new ExpressionContext(Type.LITERAL, null, null, literal);
   }
 
-  public static ExpressionContext forLiteralContext(FieldSpec.DataType type, 
Object val) {
-    return new ExpressionContext(Type.LITERAL, null, null, new 
LiteralContext(type, val));
+  public static ExpressionContext forLiteral(Literal literal) {
+    return forLiteral(new LiteralContext(literal));
+  }
+
+  public static ExpressionContext forLiteral(DataType type, @Nullable Object 
value) {
+    return forLiteral(new LiteralContext(type, value));
   }
 
   public static ExpressionContext forIdentifier(String identifier) {
@@ -70,7 +75,7 @@ public class ExpressionContext {
   }
 
   // Please check the _type of this context is Literal before calling get, 
otherwise it may return null.
-  public LiteralContext getLiteral(){
+  public LiteralContext getLiteral() {
     return _literal;
   }
 
@@ -104,7 +109,8 @@ public class ExpressionContext {
       return false;
     }
     ExpressionContext that = (ExpressionContext) o;
-    return _type == that._type && Objects.equals(_identifier, 
that._identifier) && Objects.equals(_function, that._function) && 
Objects.equals(_literal, that._literal);
+    return _type == that._type && Objects.equals(_identifier, 
that._identifier) && Objects.equals(_function,
+        that._function) && Objects.equals(_literal, that._literal);
   }
 
   @Override
diff --git 
a/pinot-common/src/main/java/org/apache/pinot/common/request/context/RequestContextUtils.java
 
b/pinot-common/src/main/java/org/apache/pinot/common/request/context/RequestContextUtils.java
index 63f36d3466..a9aae26f77 100644
--- 
a/pinot-common/src/main/java/org/apache/pinot/common/request/context/RequestContextUtils.java
+++ 
b/pinot-common/src/main/java/org/apache/pinot/common/request/context/RequestContextUtils.java
@@ -69,7 +69,7 @@ public class RequestContextUtils {
   public static ExpressionContext getExpression(Expression thriftExpression) {
     switch (thriftExpression.getType()) {
       case LITERAL:
-        return 
ExpressionContext.forLiteralContext(thriftExpression.getLiteral());
+        return ExpressionContext.forLiteral(thriftExpression.getLiteral());
       case IDENTIFIER:
         return 
ExpressionContext.forIdentifier(thriftExpression.getIdentifier().getName());
       case FUNCTION:
diff --git 
a/pinot-common/src/main/java/org/apache/pinot/common/utils/request/RequestUtils.java
 
b/pinot-common/src/main/java/org/apache/pinot/common/utils/request/RequestUtils.java
index 5b5013550e..44a0931957 100644
--- 
a/pinot-common/src/main/java/org/apache/pinot/common/utils/request/RequestUtils.java
+++ 
b/pinot-common/src/main/java/org/apache/pinot/common/utils/request/RequestUtils.java
@@ -25,7 +25,11 @@ import com.google.common.base.Preconditions;
 import com.google.common.base.Splitter;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
+import it.unimi.dsi.fastutil.doubles.DoubleArrayList;
+import it.unimi.dsi.fastutil.ints.IntArrayList;
+import it.unimi.dsi.fastutil.longs.LongArrayList;
 import java.math.BigDecimal;
+import java.sql.Timestamp;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
@@ -33,7 +37,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
-import java.util.stream.IntStream;
 import javax.annotation.Nullable;
 import org.apache.calcite.sql.SqlLiteral;
 import org.apache.calcite.sql.SqlNumericLiteral;
@@ -102,8 +105,116 @@ public class RequestUtils {
     return expression;
   }
 
-  public static Expression getLiteralExpression(SqlLiteral node) {
-    Expression expression = new Expression(ExpressionType.LITERAL);
+  public static Literal getNullLiteral() {
+    return Literal.nullValue(true);
+  }
+
+  public static Literal getLiteral(boolean value) {
+    return Literal.boolValue(value);
+  }
+
+  public static Literal getLiteral(int value) {
+    return Literal.intValue(value);
+  }
+
+  public static Literal getLiteral(long value) {
+    return Literal.longValue(value);
+  }
+
+  public static Literal getLiteral(float value) {
+    return Literal.floatValue(Float.floatToRawIntBits(value));
+  }
+
+  public static Literal getLiteral(double value) {
+    return Literal.doubleValue(value);
+  }
+
+  public static Literal getLiteral(BigDecimal value) {
+    return Literal.bigDecimalValue(BigDecimalUtils.serialize(value));
+  }
+
+  public static Literal getLiteral(String value) {
+    return Literal.stringValue(value);
+  }
+
+  public static Literal getLiteral(byte[] value) {
+    return Literal.binaryValue(value);
+  }
+
+  public static Literal getLiteral(int[] value) {
+    return Literal.intArrayValue(IntArrayList.wrap(value));
+  }
+
+  public static Literal getLiteral(long[] value) {
+    return Literal.longArrayValue(LongArrayList.wrap(value));
+  }
+
+  public static Literal getLiteral(float[] value) {
+    IntArrayList intBitsList = new IntArrayList(value.length);
+    for (float floatValue : value) {
+      intBitsList.add(Float.floatToRawIntBits(floatValue));
+    }
+    return Literal.floatArrayValue(intBitsList);
+  }
+
+  public static Literal getLiteral(double[] value) {
+    return Literal.doubleArrayValue(DoubleArrayList.wrap(value));
+  }
+
+  public static Literal getLiteral(String[] value) {
+    return Literal.stringArrayValue(Arrays.asList(value));
+  }
+
+  public static Literal getLiteral(@Nullable Object object) {
+    if (object == null) {
+      return getNullLiteral();
+    }
+    if (object instanceof Boolean) {
+      return RequestUtils.getLiteral((boolean) object);
+    }
+    if (object instanceof Integer) {
+      return RequestUtils.getLiteral((int) object);
+    }
+    if (object instanceof Long) {
+      return RequestUtils.getLiteral((long) object);
+    }
+    if (object instanceof Float) {
+      return RequestUtils.getLiteral((float) object);
+    }
+    if (object instanceof Double) {
+      return RequestUtils.getLiteral((double) object);
+    }
+    if (object instanceof BigDecimal) {
+      return RequestUtils.getLiteral((BigDecimal) object);
+    }
+    if (object instanceof Timestamp) {
+      return RequestUtils.getLiteral(((Timestamp) object).getTime());
+    }
+    if (object instanceof String) {
+      return RequestUtils.getLiteral((String) object);
+    }
+    if (object instanceof byte[]) {
+      return RequestUtils.getLiteral((byte[]) object);
+    }
+    if (object instanceof int[]) {
+      return RequestUtils.getLiteral((int[]) object);
+    }
+    if (object instanceof long[]) {
+      return RequestUtils.getLiteral((long[]) object);
+    }
+    if (object instanceof float[]) {
+      return RequestUtils.getLiteral((float[]) object);
+    }
+    if (object instanceof double[]) {
+      return RequestUtils.getLiteral((double[]) object);
+    }
+    if (object instanceof String[]) {
+      return RequestUtils.getLiteral((String[]) object);
+    }
+    return RequestUtils.getLiteral(object.toString());
+  }
+
+  public static Literal getLiteral(SqlLiteral node) {
     Literal literal = new Literal();
     if (node instanceof SqlNumericLiteral) {
       BigDecimal bigDecimalValue = node.bigDecimalValue();
@@ -133,146 +244,77 @@ public class RequestUtils {
           break;
       }
     }
-    expression.setLiteral(literal);
-    return expression;
+    return literal;
   }
 
-  public static Expression createNewLiteralExpression() {
+  public static Expression getLiteralExpression(Literal literal) {
     Expression expression = new Expression(ExpressionType.LITERAL);
-    Literal literal = new Literal();
     expression.setLiteral(literal);
     return expression;
   }
 
+  public static Expression getNullLiteralExpression() {
+    return getLiteralExpression(getNullLiteral());
+  }
+
   public static Expression getLiteralExpression(boolean value) {
-    Expression expression = createNewLiteralExpression();
-    expression.getLiteral().setBoolValue(value);
-    return expression;
+    return getLiteralExpression(getLiteral(value));
   }
 
   public static Expression getLiteralExpression(int value) {
-    Expression expression = createNewLiteralExpression();
-    expression.getLiteral().setIntValue(value);
-    return expression;
+    return getLiteralExpression(getLiteral(value));
   }
 
   public static Expression getLiteralExpression(long value) {
-    Expression expression = createNewLiteralExpression();
-    expression.getLiteral().setLongValue(value);
-    return expression;
+    return getLiteralExpression(getLiteral(value));
   }
 
   public static Expression getLiteralExpression(float value) {
-    Expression expression = createNewLiteralExpression();
-    expression.getLiteral().setFloatValue(Float.floatToRawIntBits(value));
-    return expression;
+    return getLiteralExpression(getLiteral(value));
   }
 
   public static Expression getLiteralExpression(double value) {
-    Expression expression = createNewLiteralExpression();
-    expression.getLiteral().setDoubleValue(value);
-    return expression;
+    return getLiteralExpression(getLiteral(value));
   }
 
   public static Expression getLiteralExpression(BigDecimal value) {
-    Expression expression = createNewLiteralExpression();
-    
expression.getLiteral().setBigDecimalValue(BigDecimalUtils.serialize(value));
-    return expression;
+    return getLiteralExpression(getLiteral(value));
   }
 
   public static Expression getLiteralExpression(String value) {
-    Expression expression = createNewLiteralExpression();
-    expression.getLiteral().setStringValue(value);
-    return expression;
+    return getLiteralExpression(getLiteral(value));
   }
 
   public static Expression getLiteralExpression(byte[] value) {
-    Expression expression = createNewLiteralExpression();
-    expression.getLiteral().setBinaryValue(value);
-    return expression;
+    return getLiteralExpression(getLiteral(value));
   }
 
   public static Expression getLiteralExpression(int[] value) {
-    Expression expression = createNewLiteralExpression();
-    
expression.getLiteral().setIntArrayValue(Arrays.stream(value).boxed().collect(Collectors.toList()));
-    return expression;
+    return getLiteralExpression(getLiteral(value));
   }
 
   public static Expression getLiteralExpression(long[] value) {
-    Expression expression = createNewLiteralExpression();
-    
expression.getLiteral().setLongArrayValue(Arrays.stream(value).boxed().collect(Collectors.toList()));
-    return expression;
+    return getLiteralExpression(getLiteral(value));
   }
 
   public static Expression getLiteralExpression(float[] value) {
-    Expression expression = createNewLiteralExpression();
-    expression.getLiteral().setFloatArrayValue(
-        IntStream.range(0, value.length).mapToObj(i -> 
Float.floatToRawIntBits(value[i])).collect(Collectors.toList()));
-    return expression;
+    return getLiteralExpression(getLiteral(value));
   }
 
   public static Expression getLiteralExpression(double[] value) {
-    Expression expression = createNewLiteralExpression();
-    
expression.getLiteral().setDoubleArrayValue(Arrays.stream(value).boxed().collect(Collectors.toList()));
-    return expression;
+    return getLiteralExpression(getLiteral(value));
   }
 
   public static Expression getLiteralExpression(String[] value) {
-    Expression expression = createNewLiteralExpression();
-    expression.getLiteral().setStringArrayValue(Arrays.asList(value));
-    return expression;
+    return getLiteralExpression(getLiteral(value));
   }
 
-  public static Expression getNullLiteralExpression() {
-    Expression expression = createNewLiteralExpression();
-    expression.getLiteral().setNullValue(true);
-    return expression;
+  public static Expression getLiteralExpression(SqlLiteral node) {
+    return getLiteralExpression(getLiteral(node));
   }
 
   public static Expression getLiteralExpression(@Nullable Object object) {
-    if (object == null) {
-      return getNullLiteralExpression();
-    }
-    if (object instanceof Boolean) {
-      return RequestUtils.getLiteralExpression((boolean) object);
-    }
-    if (object instanceof Integer) {
-      return RequestUtils.getLiteralExpression((int) object);
-    }
-    if (object instanceof Long) {
-      return RequestUtils.getLiteralExpression((long) object);
-    }
-    if (object instanceof Float) {
-      return RequestUtils.getLiteralExpression((float) object);
-    }
-    if (object instanceof Double) {
-      return RequestUtils.getLiteralExpression((double) object);
-    }
-    if (object instanceof BigDecimal) {
-      return RequestUtils.getLiteralExpression((BigDecimal) object);
-    }
-    if (object instanceof String) {
-      return RequestUtils.getLiteralExpression((String) object);
-    }
-    if (object instanceof byte[]) {
-      return RequestUtils.getLiteralExpression((byte[]) object);
-    }
-    if (object instanceof int[]) {
-      return RequestUtils.getLiteralExpression((int[]) object);
-    }
-    if (object instanceof long[]) {
-      return RequestUtils.getLiteralExpression((long[]) object);
-    }
-    if (object instanceof float[]) {
-      return RequestUtils.getLiteralExpression((float[]) object);
-    }
-    if (object instanceof double[]) {
-      return RequestUtils.getLiteralExpression((double[]) object);
-    }
-    if (object instanceof String[]) {
-      return RequestUtils.getLiteralExpression((String[]) object);
-    }
-    return RequestUtils.getLiteralExpression(object.toString());
+    return getLiteralExpression(getLiteral(object));
   }
 
   /**
diff --git a/pinot-common/src/main/proto/expressions.proto 
b/pinot-common/src/main/proto/expressions.proto
index c6f64b5774..ebc164a2ad 100644
--- a/pinot-common/src/main/proto/expressions.proto
+++ b/pinot-common/src/main/proto/expressions.proto
@@ -50,16 +50,14 @@ message InputRef {
 
 message Literal {
   ColumnDataType dataType = 1;
-  bool isValueNull = 2;
-  oneof literalField {
-    bool boolField = 101;
-    int32 intField = 102;
-    int64 longField = 103;
-    float floatField = 104;
-    double doubleField = 105;
-    string stringField = 106;
-    bytes bytesField = 107;
-    bytes serializedField = 108;
+  oneof value {
+    bool null = 2;
+    int32 int = 3;
+    int64 long = 4;
+    float float = 5;
+    double double = 6;
+    string string = 7;
+    bytes bytes = 8;
   }
 }
 
diff --git 
a/pinot-core/src/main/java/org/apache/pinot/core/query/executor/ServerQueryExecutorV1Impl.java
 
b/pinot-core/src/main/java/org/apache/pinot/core/query/executor/ServerQueryExecutorV1Impl.java
index 7f6dec9cc7..19f9421a84 100644
--- 
a/pinot-core/src/main/java/org/apache/pinot/core/query/executor/ServerQueryExecutorV1Impl.java
+++ 
b/pinot-core/src/main/java/org/apache/pinot/core/query/executor/ServerQueryExecutorV1Impl.java
@@ -603,7 +603,7 @@ public class ServerQueryExecutorV1Impl implements 
QueryExecutor {
       // Rewrite the expression
       function.setFunctionName(TransformFunctionType.IN_ID_SET.name());
       arguments.set(1,
-          ExpressionContext.forLiteralContext(FieldSpec.DataType.STRING, 
((IdSet) result).toBase64String()));
+          ExpressionContext.forLiteral(FieldSpec.DataType.STRING, ((IdSet) 
result).toBase64String()));
     } else {
       for (ExpressionContext argument : arguments) {
         handleSubquery(argument, tableDataManager, indexSegments, 
timerContext, executorService, endTimeMs);
diff --git 
a/pinot-core/src/test/java/org/apache/pinot/core/operator/transform/function/ArrayLiteralTransformFunctionTest.java
 
b/pinot-core/src/test/java/org/apache/pinot/core/operator/transform/function/ArrayLiteralTransformFunctionTest.java
index 2bb3428c93..2bbdab74e0 100644
--- 
a/pinot-core/src/test/java/org/apache/pinot/core/operator/transform/function/ArrayLiteralTransformFunctionTest.java
+++ 
b/pinot-core/src/test/java/org/apache/pinot/core/operator/transform/function/ArrayLiteralTransformFunctionTest.java
@@ -57,7 +57,7 @@ public class ArrayLiteralTransformFunctionTest {
   public void testIntArrayLiteralTransformFunction() {
     List<ExpressionContext> arrayExpressions = new ArrayList<>();
     for (int i = 0; i < 10; i++) {
-      arrayExpressions.add(ExpressionContext.forLiteralContext(DataType.INT, 
i));
+      arrayExpressions.add(ExpressionContext.forLiteral(DataType.INT, i));
     }
 
     ArrayLiteralTransformFunction intArray = new 
ArrayLiteralTransformFunction(arrayExpressions);
@@ -71,7 +71,7 @@ public class ArrayLiteralTransformFunctionTest {
   public void testLongArrayLiteralTransformFunction() {
     List<ExpressionContext> arrayExpressions = new ArrayList<>();
     for (int i = 0; i < 10; i++) {
-      arrayExpressions.add(ExpressionContext.forLiteralContext(DataType.LONG, 
(long) i));
+      arrayExpressions.add(ExpressionContext.forLiteral(DataType.LONG, (long) 
i));
     }
 
     ArrayLiteralTransformFunction longArray = new 
ArrayLiteralTransformFunction(arrayExpressions);
@@ -85,7 +85,7 @@ public class ArrayLiteralTransformFunctionTest {
   public void testFloatArrayLiteralTransformFunction() {
     List<ExpressionContext> arrayExpressions = new ArrayList<>();
     for (int i = 0; i < 10; i++) {
-      arrayExpressions.add(ExpressionContext.forLiteralContext(DataType.FLOAT, 
(float) i));
+      arrayExpressions.add(ExpressionContext.forLiteral(DataType.FLOAT, 
(float) i));
     }
 
     ArrayLiteralTransformFunction floatArray = new 
ArrayLiteralTransformFunction(arrayExpressions);
@@ -99,7 +99,7 @@ public class ArrayLiteralTransformFunctionTest {
   public void testDoubleArrayLiteralTransformFunction() {
     List<ExpressionContext> arrayExpressions = new ArrayList<>();
     for (int i = 0; i < 10; i++) {
-      
arrayExpressions.add(ExpressionContext.forLiteralContext(DataType.DOUBLE, 
(double) i));
+      arrayExpressions.add(ExpressionContext.forLiteral(DataType.DOUBLE, 
(double) i));
     }
 
     ArrayLiteralTransformFunction doubleArray = new 
ArrayLiteralTransformFunction(arrayExpressions);
@@ -113,8 +113,7 @@ public class ArrayLiteralTransformFunctionTest {
   public void testStringArrayLiteralTransformFunction() {
     List<ExpressionContext> arrayExpressions = new ArrayList<>();
     for (int i = 0; i < 10; i++) {
-      arrayExpressions.add(
-          ExpressionContext.forLiteralContext(new 
Literal(Literal._Fields.STRING_VALUE, String.valueOf(i))));
+      arrayExpressions.add(ExpressionContext.forLiteral(new 
Literal(Literal._Fields.STRING_VALUE, String.valueOf(i))));
     }
 
     ArrayLiteralTransformFunction stringArray = new 
ArrayLiteralTransformFunction(arrayExpressions);
diff --git 
a/pinot-core/src/test/java/org/apache/pinot/core/plan/maker/QueryOverrideWithHintsTest.java
 
b/pinot-core/src/test/java/org/apache/pinot/core/plan/maker/QueryOverrideWithHintsTest.java
index 7b9cb63f0f..c6750af635 100644
--- 
a/pinot-core/src/test/java/org/apache/pinot/core/plan/maker/QueryOverrideWithHintsTest.java
+++ 
b/pinot-core/src/test/java/org/apache/pinot/core/plan/maker/QueryOverrideWithHintsTest.java
@@ -126,32 +126,32 @@ public class QueryOverrideWithHintsTest {
     expressionContext2 = ExpressionContext.forIdentifier("");
     assertNotEquals(expressionContext1, expressionContext2);
     assertNotEquals(expressionContext1.hashCode(), 
expressionContext2.hashCode());
-    expressionContext1 = 
ExpressionContext.forLiteralContext(FieldSpec.DataType.STRING, "abc");
-    expressionContext2 = 
ExpressionContext.forLiteralContext(FieldSpec.DataType.STRING, "abc");
+    expressionContext1 = 
ExpressionContext.forLiteral(FieldSpec.DataType.STRING, "abc");
+    expressionContext2 = 
ExpressionContext.forLiteral(FieldSpec.DataType.STRING, "abc");
     assertEquals(expressionContext1, expressionContext2);
     assertEquals(expressionContext1.hashCode(), expressionContext2.hashCode());
-    expressionContext2 = 
ExpressionContext.forLiteralContext(FieldSpec.DataType.STRING, "abcd");
+    expressionContext2 = 
ExpressionContext.forLiteral(FieldSpec.DataType.STRING, "abcd");
     assertNotEquals(expressionContext1, expressionContext2);
     assertNotEquals(expressionContext1.hashCode(), 
expressionContext2.hashCode());
-    expressionContext2 = 
ExpressionContext.forLiteralContext(FieldSpec.DataType.STRING, "");
+    expressionContext2 = 
ExpressionContext.forLiteral(FieldSpec.DataType.STRING, "");
     assertNotEquals(expressionContext1, expressionContext2);
     assertNotEquals(expressionContext1.hashCode(), 
expressionContext2.hashCode());
 
     expressionContext1 = ExpressionContext.forFunction(new 
FunctionContext(FunctionContext.Type.TRANSFORM, "func1",
         ImmutableList.of(ExpressionContext.forIdentifier("abc"),
-            ExpressionContext.forLiteralContext(FieldSpec.DataType.STRING, 
"abc"))));
+            ExpressionContext.forLiteral(FieldSpec.DataType.STRING, "abc"))));
     expressionContext2 = ExpressionContext.forFunction(new 
FunctionContext(FunctionContext.Type.TRANSFORM, "func1",
         ImmutableList.of(ExpressionContext.forIdentifier("abc"),
-            ExpressionContext.forLiteralContext(FieldSpec.DataType.STRING, 
"abc"))));
+            ExpressionContext.forLiteral(FieldSpec.DataType.STRING, "abc"))));
     assertEquals(expressionContext1, expressionContext2);
     assertEquals(expressionContext1.hashCode(), expressionContext2.hashCode());
 
     expressionContext1 = ExpressionContext.forFunction(new 
FunctionContext(FunctionContext.Type.TRANSFORM, "datetrunc",
-        
ImmutableList.of(ExpressionContext.forLiteralContext(FieldSpec.DataType.STRING, 
"DAY"),
-            ExpressionContext.forLiteralContext(FieldSpec.DataType.STRING, 
"event_time_ts"))));
+        
ImmutableList.of(ExpressionContext.forLiteral(FieldSpec.DataType.STRING, "DAY"),
+            ExpressionContext.forLiteral(FieldSpec.DataType.STRING, 
"event_time_ts"))));
     expressionContext2 = ExpressionContext.forFunction(new 
FunctionContext(FunctionContext.Type.TRANSFORM, "datetrunc",
-        
ImmutableList.of(ExpressionContext.forLiteralContext(FieldSpec.DataType.STRING, 
"DAY"),
-            ExpressionContext.forLiteralContext(FieldSpec.DataType.STRING, 
"event_time_ts"))));
+        
ImmutableList.of(ExpressionContext.forLiteral(FieldSpec.DataType.STRING, "DAY"),
+            ExpressionContext.forLiteral(FieldSpec.DataType.STRING, 
"event_time_ts"))));
     assertEquals(expressionContext1, expressionContext2);
     assertEquals(expressionContext1.hashCode(), expressionContext2.hashCode());
   }
@@ -160,13 +160,13 @@ public class QueryOverrideWithHintsTest {
   public void testOverrideFilterWithExpressionOverrideHints() {
     ExpressionContext dateTruncFunctionExpr = ExpressionContext.forFunction(
         new FunctionContext(FunctionContext.Type.TRANSFORM, "dateTrunc", new 
ArrayList<>(new ArrayList<>(
-            
ImmutableList.of(ExpressionContext.forLiteralContext(FieldSpec.DataType.STRING, 
"MONTH"),
+            
ImmutableList.of(ExpressionContext.forLiteral(FieldSpec.DataType.STRING, 
"MONTH"),
                 ExpressionContext.forIdentifier("ts"))))));
     ExpressionContext timestampIndexColumn = 
ExpressionContext.forIdentifier("$ts$MONTH");
     ExpressionContext equalsExpression = ExpressionContext.forFunction(
         new FunctionContext(FunctionContext.Type.TRANSFORM, "EQUALS", new 
ArrayList<>(
             ImmutableList.of(dateTruncFunctionExpr,
-                ExpressionContext.forLiteralContext(FieldSpec.DataType.INT, 
1000)))));
+                ExpressionContext.forLiteral(FieldSpec.DataType.INT, 1000)))));
     FilterContext filter = RequestContextUtils.getFilter(equalsExpression);
     Map<ExpressionContext, ExpressionContext> hints = 
ImmutableMap.of(dateTruncFunctionExpr, timestampIndexColumn);
     InstancePlanMakerImplV2.overrideWithExpressionHints(filter, _indexSegment, 
hints);
@@ -186,33 +186,33 @@ public class QueryOverrideWithHintsTest {
   public void testOverrideWithExpressionOverrideHints() {
     ExpressionContext dateTruncFunctionExpr = ExpressionContext.forFunction(
         new FunctionContext(FunctionContext.Type.TRANSFORM, "dateTrunc", new 
ArrayList<>(
-            
ImmutableList.of(ExpressionContext.forLiteralContext(FieldSpec.DataType.STRING, 
"MONTH"),
+            
ImmutableList.of(ExpressionContext.forLiteral(FieldSpec.DataType.STRING, 
"MONTH"),
                 ExpressionContext.forIdentifier("ts")))));
     ExpressionContext timestampIndexColumn = 
ExpressionContext.forIdentifier("$ts$MONTH");
     ExpressionContext equalsExpression = ExpressionContext.forFunction(
         new FunctionContext(FunctionContext.Type.TRANSFORM, "EQUALS", new 
ArrayList<>(
             ImmutableList.of(dateTruncFunctionExpr,
-                ExpressionContext.forLiteralContext(FieldSpec.DataType.INT, 
1000)))));
+                ExpressionContext.forLiteral(FieldSpec.DataType.INT, 1000)))));
     Map<ExpressionContext, ExpressionContext> hints = 
ImmutableMap.of(dateTruncFunctionExpr, timestampIndexColumn);
     ExpressionContext newEqualsExpression =
         InstancePlanMakerImplV2.overrideWithExpressionHints(equalsExpression, 
_indexSegment, hints);
     assertEquals(newEqualsExpression.getFunction().getFunctionName(), 
"equals");
     assertEquals(newEqualsExpression.getFunction().getArguments().get(0), 
timestampIndexColumn);
     assertEquals(newEqualsExpression.getFunction().getArguments().get(1),
-        ExpressionContext.forLiteralContext(FieldSpec.DataType.INT, 1000));
+        ExpressionContext.forLiteral(FieldSpec.DataType.INT, 1000));
   }
 
   @Test
   public void testNotOverrideWithExpressionOverrideHints() {
     ExpressionContext dateTruncFunctionExpr = ExpressionContext.forFunction(
         new FunctionContext(FunctionContext.Type.TRANSFORM, "dateTrunc", new 
ArrayList<>(
-            
ImmutableList.of(ExpressionContext.forLiteralContext(FieldSpec.DataType.STRING, 
"DAY"),
+            
ImmutableList.of(ExpressionContext.forLiteral(FieldSpec.DataType.STRING, "DAY"),
                 ExpressionContext.forIdentifier("ts")))));
     ExpressionContext timestampIndexColumn = 
ExpressionContext.forIdentifier("$ts$DAY");
     ExpressionContext equalsExpression = ExpressionContext.forFunction(
         new FunctionContext(FunctionContext.Type.TRANSFORM, "EQUALS", new 
ArrayList<>(
             ImmutableList.of(dateTruncFunctionExpr,
-                ExpressionContext.forLiteralContext(FieldSpec.DataType.INT, 
1000)))));
+                ExpressionContext.forLiteral(FieldSpec.DataType.INT, 1000)))));
     Map<ExpressionContext, ExpressionContext> hints = 
ImmutableMap.of(dateTruncFunctionExpr, timestampIndexColumn);
     ExpressionContext newEqualsExpression =
         InstancePlanMakerImplV2.overrideWithExpressionHints(equalsExpression, 
_indexSegment, hints);
@@ -220,7 +220,7 @@ public class QueryOverrideWithHintsTest {
     // No override as the physical column is not in the index segment.
     assertEquals(newEqualsExpression.getFunction().getArguments().get(0), 
dateTruncFunctionExpr);
     assertEquals(newEqualsExpression.getFunction().getArguments().get(1),
-        ExpressionContext.forLiteralContext(FieldSpec.DataType.INT, 1000));
+        ExpressionContext.forLiteral(FieldSpec.DataType.INT, 1000));
   }
 
   @Test
diff --git 
a/pinot-core/src/test/java/org/apache/pinot/core/query/request/context/utils/BrokerRequestToQueryContextConverterTest.java
 
b/pinot-core/src/test/java/org/apache/pinot/core/query/request/context/utils/BrokerRequestToQueryContextConverterTest.java
index f86c829171..7c74e022af 100644
--- 
a/pinot-core/src/test/java/org/apache/pinot/core/query/request/context/utils/BrokerRequestToQueryContextConverterTest.java
+++ 
b/pinot-core/src/test/java/org/apache/pinot/core/query/request/context/utils/BrokerRequestToQueryContextConverterTest.java
@@ -184,11 +184,11 @@ public class BrokerRequestToQueryContextConverterTest {
               Arrays.asList(ExpressionContext.forIdentifier("foo"), 
ExpressionContext.forFunction(
                   new FunctionContext(FunctionContext.Type.TRANSFORM, "add",
                       Arrays.asList(ExpressionContext.forIdentifier("bar"),
-                          
ExpressionContext.forLiteralContext(FieldSpec.DataType.INT, 
Integer.valueOf(123)))))))));
+                          ExpressionContext.forLiteral(FieldSpec.DataType.INT, 
Integer.valueOf(123)))))))));
       assertEquals(selectExpressions.get(0).toString(), 
"add(foo,add(bar,'123'))");
       assertEquals(selectExpressions.get(1), ExpressionContext.forFunction(
           new FunctionContext(FunctionContext.Type.TRANSFORM, "sub",
-              
Arrays.asList(ExpressionContext.forLiteralContext(FieldSpec.DataType.STRING, 
"456"),
+              
Arrays.asList(ExpressionContext.forLiteral(FieldSpec.DataType.STRING, "456"),
                   ExpressionContext.forIdentifier("foobar")))));
       assertEquals(selectExpressions.get(1).toString(), "sub('456',foobar)");
       assertFalse(queryContext.isDistinct());
@@ -200,7 +200,7 @@ public class BrokerRequestToQueryContextConverterTest {
       assertEquals(orderByExpressions.size(), 1);
       assertEquals(orderByExpressions.get(0), new 
OrderByExpressionContext(ExpressionContext.forFunction(
           new FunctionContext(FunctionContext.Type.TRANSFORM, "sub",
-              
Arrays.asList(ExpressionContext.forLiteralContext(FieldSpec.DataType.INT, 
Integer.valueOf(456)),
+              
Arrays.asList(ExpressionContext.forLiteral(FieldSpec.DataType.INT, 
Integer.valueOf(456)),
                   ExpressionContext.forIdentifier("foobar")))), true));
       assertEquals(orderByExpressions.get(0).toString(), "sub('456',foobar) 
ASC");
       assertNull(queryContext.getHavingFilter());
@@ -219,7 +219,7 @@ public class BrokerRequestToQueryContextConverterTest {
       assertEquals(queryContext.getTableName(), "testTable");
       List<ExpressionContext> selectExpressions = 
queryContext.getSelectExpressions();
       assertEquals(selectExpressions.size(), 1);
-      assertEquals(selectExpressions.get(0), 
ExpressionContext.forLiteralContext(FieldSpec.DataType.BOOLEAN, true));
+      assertEquals(selectExpressions.get(0), 
ExpressionContext.forLiteral(FieldSpec.DataType.BOOLEAN, true));
       assertEquals(selectExpressions.get(0).toString(), "'true'");
     }
 
@@ -507,12 +507,10 @@ public class BrokerRequestToQueryContextConverterTest {
       assertEquals(function.getFunctionName(), "distinctcountthetasketch");
       List<ExpressionContext> arguments = function.getArguments();
       assertEquals(arguments.get(0), ExpressionContext.forIdentifier("foo"));
-      assertEquals(arguments.get(1),
-          ExpressionContext.forLiteralContext(FieldSpec.DataType.STRING, 
"nominalEntries=1000"));
-      assertEquals(arguments.get(2), 
ExpressionContext.forLiteralContext(FieldSpec.DataType.STRING, "bar='a'"));
-      assertEquals(arguments.get(3), 
ExpressionContext.forLiteralContext(FieldSpec.DataType.STRING, "bar='b'"));
-      assertEquals(arguments.get(4),
-          ExpressionContext.forLiteralContext(FieldSpec.DataType.STRING, 
"SET_INTERSECT($1, $2)"));
+      assertEquals(arguments.get(1), 
ExpressionContext.forLiteral(FieldSpec.DataType.STRING, "nominalEntries=1000"));
+      assertEquals(arguments.get(2), 
ExpressionContext.forLiteral(FieldSpec.DataType.STRING, "bar='a'"));
+      assertEquals(arguments.get(3), 
ExpressionContext.forLiteral(FieldSpec.DataType.STRING, "bar='b'"));
+      assertEquals(arguments.get(4), 
ExpressionContext.forLiteral(FieldSpec.DataType.STRING, "SET_INTERSECT($1, 
$2)"));
       assertEquals(queryContext.getColumns(), new 
HashSet<>(Arrays.asList("foo", "bar")));
       assertFalse(QueryContextUtils.isSelectionQuery(queryContext));
       assertTrue(QueryContextUtils.isAggregationQuery(queryContext));
diff --git 
a/pinot-query-planner/src/main/java/org/apache/pinot/query/parser/CalciteRexExpressionParser.java
 
b/pinot-query-planner/src/main/java/org/apache/pinot/query/parser/CalciteRexExpressionParser.java
index c5d4076740..67992d4dfc 100644
--- 
a/pinot-query-planner/src/main/java/org/apache/pinot/query/parser/CalciteRexExpressionParser.java
+++ 
b/pinot-query-planner/src/main/java/org/apache/pinot/query/parser/CalciteRexExpressionParser.java
@@ -24,11 +24,11 @@ import org.apache.calcite.rel.RelFieldCollation;
 import org.apache.calcite.rel.RelFieldCollation.Direction;
 import org.apache.calcite.rel.RelFieldCollation.NullDirection;
 import org.apache.pinot.common.request.Expression;
+import org.apache.pinot.common.request.Literal;
 import org.apache.pinot.common.request.PinotQuery;
 import org.apache.pinot.common.utils.request.RequestUtils;
 import org.apache.pinot.query.planner.logical.RexExpression;
 import org.apache.pinot.query.planner.plannode.SortNode;
-import org.apache.pinot.spi.utils.ByteArray;
 import org.apache.pinot.sql.parsers.ParserUtils;
 
 
@@ -123,29 +123,25 @@ public class CalciteRexExpressionParser {
     if (rexNode instanceof RexExpression.InputRef) {
       return inputRefToIdentifier((RexExpression.InputRef) rexNode, 
pinotQuery);
     } else if (rexNode instanceof RexExpression.Literal) {
-      return compileLiteralExpression(((RexExpression.Literal) 
rexNode).getValue());
+      return 
RequestUtils.getLiteralExpression(toLiteral((RexExpression.Literal) rexNode));
     } else {
       assert rexNode instanceof RexExpression.FunctionCall;
       return compileFunctionExpression((RexExpression.FunctionCall) rexNode, 
pinotQuery);
     }
   }
 
-  /**
-   * Copy and modify from {@link RequestUtils#getLiteralExpression(Object)}.
-   * TODO: Revisit whether we should use internal value type (e.g. 0/1 for 
BOOLEAN, ByteArray for BYTES) here.
-   */
-  private static Expression compileLiteralExpression(Object object) {
-    if (object instanceof ByteArray) {
-      return RequestUtils.getLiteralExpression(((ByteArray) 
object).getBytes());
-    }
-    return RequestUtils.getLiteralExpression(object);
-  }
-
   private static Expression inputRefToIdentifier(RexExpression.InputRef 
inputRef, PinotQuery pinotQuery) {
     List<Expression> selectList = pinotQuery.getSelectList();
     return selectList.get(inputRef.getIndex());
   }
 
+  public static Literal toLiteral(RexExpression.Literal literal) {
+    Object value = literal.getValue();
+    // NOTE: Value is stored in internal format in RexExpression.Literal.
+    return value != null ? 
RequestUtils.getLiteral(literal.getDataType().toExternal(value))
+        : RequestUtils.getNullLiteral();
+  }
+
   private static Expression 
compileFunctionExpression(RexExpression.FunctionCall rexCall, PinotQuery 
pinotQuery) {
     String functionName = rexCall.getFunctionName();
     if (functionName.equals(AND)) {
diff --git 
a/pinot-query-planner/src/main/java/org/apache/pinot/query/planner/logical/RelToPlanNodeConverter.java
 
b/pinot-query-planner/src/main/java/org/apache/pinot/query/planner/logical/RelToPlanNodeConverter.java
index d81f04d5a4..5bd2ed3705 100644
--- 
a/pinot-query-planner/src/main/java/org/apache/pinot/query/planner/logical/RelToPlanNodeConverter.java
+++ 
b/pinot-query-planner/src/main/java/org/apache/pinot/query/planner/logical/RelToPlanNodeConverter.java
@@ -288,8 +288,12 @@ public final class RelToPlanNodeConverter {
 
   public static ColumnDataType convertToColumnDataType(RelDataType 
relDataType) {
     SqlTypeName sqlTypeName = relDataType.getSqlTypeName();
+    if (sqlTypeName == SqlTypeName.NULL) {
+      return ColumnDataType.UNKNOWN;
+    }
     boolean isArray = (sqlTypeName == SqlTypeName.ARRAY);
     if (isArray) {
+      assert relDataType.getComponentType() != null;
       sqlTypeName = relDataType.getComponentType().getSqlTypeName();
     }
     switch (sqlTypeName) {
diff --git 
a/pinot-query-planner/src/main/java/org/apache/pinot/query/planner/logical/RexExpression.java
 
b/pinot-query-planner/src/main/java/org/apache/pinot/query/planner/logical/RexExpression.java
index f8ca683db4..b81177877f 100644
--- 
a/pinot-query-planner/src/main/java/org/apache/pinot/query/planner/logical/RexExpression.java
+++ 
b/pinot-query-planner/src/main/java/org/apache/pinot/query/planner/logical/RexExpression.java
@@ -60,6 +60,9 @@ public interface RexExpression {
   }
 
   class Literal implements RexExpression {
+    public static final Literal TRUE = new Literal(ColumnDataType.BOOLEAN, 1);
+    public static final Literal FALSE = new Literal(ColumnDataType.BOOLEAN, 0);
+
     private final ColumnDataType _dataType;
     private final Object _value;
 
diff --git 
a/pinot-query-planner/src/main/java/org/apache/pinot/query/planner/logical/RexExpressionUtils.java
 
b/pinot-query-planner/src/main/java/org/apache/pinot/query/planner/logical/RexExpressionUtils.java
index eb51600478..0c6c4ee4b2 100644
--- 
a/pinot-query-planner/src/main/java/org/apache/pinot/query/planner/logical/RexExpressionUtils.java
+++ 
b/pinot-query-planner/src/main/java/org/apache/pinot/query/planner/logical/RexExpressionUtils.java
@@ -20,12 +20,10 @@ package org.apache.pinot.query.planner.logical;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.BoundType;
-import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Range;
 import java.math.BigDecimal;
 import java.util.ArrayList;
-import java.util.GregorianCalendar;
-import java.util.Iterator;
+import java.util.Calendar;
 import java.util.List;
 import java.util.Set;
 import org.apache.calcite.avatica.util.ByteString;
@@ -37,6 +35,7 @@ import org.apache.calcite.rex.RexLiteral;
 import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.sql.SqlKind;
 import org.apache.calcite.sql.SqlOperator;
+import org.apache.calcite.sql.type.SqlTypeName;
 import org.apache.calcite.util.NlsString;
 import org.apache.calcite.util.Sarg;
 import org.apache.pinot.common.utils.DataSchema.ColumnDataType;
@@ -45,6 +44,7 @@ import org.apache.pinot.spi.utils.ByteArray;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class RexExpressionUtils {
   private RexExpressionUtils() {
   }
@@ -74,35 +74,53 @@ public class RexExpressionUtils {
   }
 
   public static RexExpression.Literal fromRexLiteral(RexLiteral rexLiteral) {
+    // TODO: Handle SYMBOL in the planning phase.
+    if (rexLiteral.getTypeName() == SqlTypeName.SYMBOL) {
+      Comparable value = rexLiteral.getValue();
+      assert value instanceof Enum;
+      return new RexExpression.Literal(ColumnDataType.STRING, 
value.toString());
+    }
     ColumnDataType dataType = 
RelToPlanNodeConverter.convertToColumnDataType(rexLiteral.getType());
-    return new RexExpression.Literal(dataType, convertValue(dataType, 
rexLiteral.getValue()));
+    if (rexLiteral.isNull()) {
+      return new RexExpression.Literal(dataType, null);
+    } else {
+      return fromRexLiteralValue(dataType, rexLiteral.getValue());
+    }
   }
 
-  @Nullable
-  private static Object convertValue(ColumnDataType dataType, @Nullable 
Comparable<?> value) {
-    if (value == null) {
-      return null;
-    }
+  private static RexExpression.Literal fromRexLiteralValue(ColumnDataType 
dataType, Comparable value) {
+    // Convert the value to the internal representation of the data type.
     switch (dataType) {
       case INT:
-        return ((BigDecimal) value).intValue();
+        value = ((BigDecimal) value).intValue();
+        break;
       case LONG:
-        return ((BigDecimal) value).longValue();
+        value = ((BigDecimal) value).longValue();
+        break;
       case FLOAT:
-        return ((BigDecimal) value).floatValue();
+        value = ((BigDecimal) value).floatValue();
+        break;
       case DOUBLE:
-        return ((BigDecimal) value).doubleValue();
+        value = ((BigDecimal) value).doubleValue();
+        break;
+      case BIG_DECIMAL:
+        break;
       case BOOLEAN:
-        return ((Boolean) value) ? 1 : 0;
+        value = Boolean.TRUE.equals(value) ? BooleanUtils.INTERNAL_TRUE : 
BooleanUtils.INTERNAL_FALSE;
+        break;
       case TIMESTAMP:
-        return ((GregorianCalendar) value).getTimeInMillis();
+        value = ((Calendar) value).getTimeInMillis();
+        break;
       case STRING:
-        return ((NlsString) value).getValue();
+        value = ((NlsString) value).getValue();
+        break;
       case BYTES:
-        return new ByteArray(((ByteString) value).getBytes());
+        value = new ByteArray(((ByteString) value).getBytes());
+        break;
       default:
-        return value;
+        throw new IllegalStateException("Unsupported ColumnDataType: " + 
dataType);
     }
+    return new RexExpression.Literal(dataType, value);
   }
 
   public static RexExpression fromRexCall(RexCall rexCall) {
@@ -156,6 +174,7 @@ public class RexExpressionUtils {
     RexLiteral rexLiteral = (RexLiteral) rexCall.operands.get(1);
     ColumnDataType dataType = 
RelToPlanNodeConverter.convertToColumnDataType(rexLiteral.getType());
     Sarg sarg = rexLiteral.getValueAs(Sarg.class);
+    assert sarg != null;
     if (sarg.isPoints()) {
       return new RexExpression.FunctionCall(dataType, SqlKind.IN.name(),
           toFunctionOperands(rexInputRef, sarg.rangeSet.asRanges(), dataType));
@@ -163,78 +182,65 @@ public class RexExpressionUtils {
       return new RexExpression.FunctionCall(dataType, SqlKind.NOT_IN.name(),
           toFunctionOperands(rexInputRef, 
sarg.rangeSet.complement().asRanges(), dataType));
     } else {
-      Set<Range<?>> ranges = sarg.rangeSet.asRanges();
+      Set<Range> ranges = sarg.rangeSet.asRanges();
       return convertRangesToOr(dataType, rexInputRef, ranges);
     }
   }
 
-  private static RexExpression convertRangesToOr(ColumnDataType dataType, 
RexInputRef rexInputRef,
-      Set<Range<?>> ranges) {
-    RexExpression result;
-    Iterator<Range<?>> it = ranges.iterator();
-    if (!it.hasNext()) { // no disjunctions means false
-      return new RexExpression.Literal(ColumnDataType.BOOLEAN, 0);
+  private static RexExpression convertRangesToOr(ColumnDataType dataType, 
RexInputRef rexInputRef, Set<Range> ranges) {
+    int numRanges = ranges.size();
+    if (numRanges == 0) {
+      return RexExpression.Literal.FALSE;
     }
     RexExpression.InputRef rexInput = fromRexInputRef(rexInputRef);
-    result = convertRange(rexInput, dataType, it.next());
-    if (result instanceof RexExpression.Literal) {
-      Object value = ((RexExpression.Literal) result).getValue();
-      if (BooleanUtils.isTrueInternalValue(value)) { // one of the 
disjunctions is true => return true
-        return result;
+    List<RexExpression> operands = new ArrayList<>(numRanges);
+    for (Range range : ranges) {
+      RexExpression operand = convertRange(rexInput, dataType, range);
+      if (operand == RexExpression.Literal.TRUE) {
+        return operand;
       }
-    }
-    while (it.hasNext()) {
-      Range<?> range = it.next();
-      RexExpression newExp = convertRange(rexInput, dataType, range);
-      if (newExp instanceof RexExpression.Literal) {
-        Object value = ((RexExpression.Literal) newExp).getValue();
-        if (BooleanUtils.isTrueInternalValue(value)) { // one of the 
disjunctions is true => return true
-          return newExp;
-        } else {
-          continue; // one of the disjunctions is false => ignore it
-        }
+      if (operand != RexExpression.Literal.FALSE) {
+        operands.add(operand);
       }
-      ImmutableList<RexExpression> operands = ImmutableList.of(result, newExp);
-      result = new RexExpression.FunctionCall(ColumnDataType.BOOLEAN, 
SqlKind.OR.name(), operands);
     }
-    return result;
+    int numOperands = operands.size();
+    if (numOperands == 0) {
+      return RexExpression.Literal.FALSE;
+    } else if (numOperands == 1) {
+      return operands.get(0);
+    } else {
+      return new RexExpression.FunctionCall(ColumnDataType.BOOLEAN, 
SqlKind.OR.name(), operands);
+    }
   }
 
-  private static RexExpression convertRange(RexExpression.InputRef rexInput, 
ColumnDataType dataType, Range<?> range) {
+  private static RexExpression convertRange(RexExpression.InputRef rexInput, 
ColumnDataType dataType, Range range) {
     if (range.isEmpty()) {
-      return new RexExpression.Literal(ColumnDataType.BOOLEAN, 0);
+      return RexExpression.Literal.FALSE;
     }
     if (!range.hasLowerBound()) {
-      if (!range.hasUpperBound()) {
-        return new RexExpression.Literal(ColumnDataType.BOOLEAN, 1);
-      }
-      return convertUpperBound(rexInput, dataType, range.upperBoundType(), 
range.upperEndpoint());
-    } else if (!range.hasUpperBound()) {
-      return convertLowerBound(rexInput, dataType, range.lowerBoundType(), 
range.lowerEndpoint());
-    } else {
-      RexExpression lowerConstraint =
-          convertLowerBound(rexInput, dataType, range.lowerBoundType(), 
range.lowerEndpoint());
-      RexExpression upperConstraint =
-          convertUpperBound(rexInput, dataType, range.upperBoundType(), 
range.upperEndpoint());
-      ImmutableList<RexExpression> operands = 
ImmutableList.of(lowerConstraint, upperConstraint);
-      return new RexExpression.FunctionCall(ColumnDataType.BOOLEAN, 
SqlKind.AND.name(), operands);
+      return !range.hasUpperBound() ? RexExpression.Literal.TRUE : 
convertUpperBound(rexInput, dataType, range);
+    }
+    if (!range.hasUpperBound()) {
+      return convertLowerBound(rexInput, dataType, range);
     }
+    return new RexExpression.FunctionCall(ColumnDataType.BOOLEAN, 
SqlKind.AND.name(),
+        List.of(convertLowerBound(rexInput, dataType, range), 
convertUpperBound(rexInput, dataType, range)));
   }
 
   private static RexExpression convertLowerBound(RexExpression.InputRef 
inputRef, ColumnDataType dataType,
-      BoundType boundType, Comparable<?> endpoint) {
-    SqlKind sqlKind = boundType == BoundType.OPEN ? SqlKind.GREATER_THAN : 
SqlKind.GREATER_THAN_OR_EQUAL;
-    RexExpression.Literal literal = new RexExpression.Literal(dataType, 
convertValue(dataType, endpoint));
-    ImmutableList<RexExpression> operands = ImmutableList.of(inputRef, 
literal);
-    return new RexExpression.FunctionCall(ColumnDataType.BOOLEAN, 
sqlKind.name(), operands);
+      Range range) {
+    assert range.hasLowerBound();
+    SqlKind sqlKind = range.lowerBoundType() == BoundType.OPEN ? 
SqlKind.GREATER_THAN : SqlKind.GREATER_THAN_OR_EQUAL;
+    return new RexExpression.FunctionCall(ColumnDataType.BOOLEAN, 
sqlKind.name(),
+        List.of(inputRef, fromRexLiteralValue(dataType, 
range.lowerEndpoint())));
   }
 
   private static RexExpression convertUpperBound(RexExpression.InputRef 
inputRef, ColumnDataType dataType,
-      BoundType boundType, Comparable<?> endpoint) {
-    SqlKind sqlKind = boundType == BoundType.OPEN ? SqlKind.LESS_THAN : 
SqlKind.LESS_THAN_OR_EQUAL;
-    RexExpression.Literal literal = new RexExpression.Literal(dataType, 
convertValue(dataType, endpoint));
-    ImmutableList<RexExpression> operands = ImmutableList.of(inputRef, 
literal);
-    return new RexExpression.FunctionCall(ColumnDataType.BOOLEAN, 
sqlKind.name(), operands);
+      Range range) {
+    assert range.hasUpperBound();
+    SqlKind sqlKind = range.upperBoundType() == BoundType.OPEN ? 
SqlKind.LESS_THAN : SqlKind.LESS_THAN_OR_EQUAL;
+    return new RexExpression.FunctionCall(ColumnDataType.BOOLEAN, 
sqlKind.name(),
+        List.of(inputRef, fromRexLiteralValue(dataType, 
range.upperEndpoint())));
   }
 
   /**
@@ -242,12 +248,12 @@ public class RexExpressionUtils {
    */
   private static List<RexExpression> toFunctionOperands(RexInputRef 
rexInputRef, Set<Range> ranges,
       ColumnDataType dataType) {
-    List<RexExpression> result = new ArrayList<>(ranges.size() + 1);
-    result.add(fromRexInputRef(rexInputRef));
+    List<RexExpression> operands = new ArrayList<>(1 + ranges.size());
+    operands.add(fromRexInputRef(rexInputRef));
     for (Range range : ranges) {
-      result.add(new RexExpression.Literal(dataType, convertValue(dataType, 
range.lowerEndpoint())));
+      operands.add(fromRexLiteralValue(dataType, range.lowerEndpoint()));
     }
-    return result;
+    return operands;
   }
 
   public static RexExpression.FunctionCall fromAggregateCall(AggregateCall 
aggregateCall) {
diff --git 
a/pinot-query-planner/src/main/java/org/apache/pinot/query/planner/serde/ProtoExpressionToRexExpression.java
 
b/pinot-query-planner/src/main/java/org/apache/pinot/query/planner/serde/ProtoExpressionToRexExpression.java
index 86d5a78f02..206f9dcd2a 100644
--- 
a/pinot-query-planner/src/main/java/org/apache/pinot/query/planner/serde/ProtoExpressionToRexExpression.java
+++ 
b/pinot-query-planner/src/main/java/org/apache/pinot/query/planner/serde/ProtoExpressionToRexExpression.java
@@ -20,9 +20,8 @@ package org.apache.pinot.query.planner.serde;
 
 import java.util.ArrayList;
 import java.util.List;
-import org.apache.commons.lang3.SerializationUtils;
 import org.apache.pinot.common.proto.Expressions;
-import org.apache.pinot.common.utils.DataSchema;
+import org.apache.pinot.common.utils.DataSchema.ColumnDataType;
 import org.apache.pinot.query.planner.logical.RexExpression;
 import org.apache.pinot.spi.utils.ByteArray;
 
@@ -62,84 +61,70 @@ public class ProtoExpressionToRexExpression {
   }
 
   public static RexExpression.Literal convertLiteral(Expressions.Literal 
literal) {
-    DataSchema.ColumnDataType dataType = 
convertColumnDataType(literal.getDataType());
-    if (literal.getIsValueNull()) {
+    ColumnDataType dataType = convertColumnDataType(literal.getDataType());
+    if (literal.hasNull()) {
       return new RexExpression.Literal(dataType, null);
     }
-    Object obj;
-    switch (literal.getLiteralFieldCase()) {
-      case BOOLFIELD:
-        obj = literal.getBoolField();
-        break;
-      case INTFIELD:
-        obj = literal.getIntField();
-        break;
-      case LONGFIELD:
-        obj = literal.getLongField();
-        break;
-      case FLOATFIELD:
-        obj = literal.getFloatField();
-        break;
-      case DOUBLEFIELD:
-        obj = literal.getDoubleField();
-        break;
-      case STRINGFIELD:
-        obj = literal.getStringField();
-        break;
-      case BYTESFIELD:
-        obj = new ByteArray(literal.getBytesField().toByteArray());
-        break;
-      case SERIALIZEDFIELD:
-        obj = 
SerializationUtils.deserialize(literal.getSerializedField().toByteArray());
-        break;
+    switch (dataType.getStoredType()) {
+      case INT:
+        return new RexExpression.Literal(dataType, literal.getInt());
+      case LONG:
+        return new RexExpression.Literal(dataType, literal.getLong());
+      case FLOAT:
+        return new RexExpression.Literal(dataType, literal.getFloat());
+      case DOUBLE:
+        return new RexExpression.Literal(dataType, literal.getDouble());
+      case STRING:
+        return new RexExpression.Literal(dataType, literal.getString());
+      case BYTES:
+        return new RexExpression.Literal(dataType, new 
ByteArray(literal.getBytes().toByteArray()));
       default:
-        throw new IllegalStateException("Unsupported proto Literal type: " + 
literal.getLiteralFieldCase());
+        throw new IllegalStateException("Unsupported ColumnDataType: " + 
dataType);
     }
-    return new RexExpression.Literal(dataType, obj);
   }
 
-  public static DataSchema.ColumnDataType 
convertColumnDataType(Expressions.ColumnDataType dataType) {
+  public static ColumnDataType 
convertColumnDataType(Expressions.ColumnDataType dataType) {
     switch (dataType) {
       case INT:
-        return DataSchema.ColumnDataType.INT;
+        return ColumnDataType.INT;
       case LONG:
-        return DataSchema.ColumnDataType.LONG;
+        return ColumnDataType.LONG;
       case FLOAT:
-        return DataSchema.ColumnDataType.FLOAT;
+        return ColumnDataType.FLOAT;
       case DOUBLE:
-        return DataSchema.ColumnDataType.DOUBLE;
+        return ColumnDataType.DOUBLE;
       case BIG_DECIMAL:
-        return DataSchema.ColumnDataType.BIG_DECIMAL;
+        return ColumnDataType.BIG_DECIMAL;
       case BOOLEAN:
-        return DataSchema.ColumnDataType.BOOLEAN;
+        return ColumnDataType.BOOLEAN;
       case TIMESTAMP:
-        return DataSchema.ColumnDataType.TIMESTAMP;
+        return ColumnDataType.TIMESTAMP;
       case STRING:
-        return DataSchema.ColumnDataType.STRING;
+        return ColumnDataType.STRING;
       case JSON:
-        return DataSchema.ColumnDataType.JSON;
+        return ColumnDataType.JSON;
       case BYTES:
-        return DataSchema.ColumnDataType.BYTES;
+        return ColumnDataType.BYTES;
       case INT_ARRAY:
-        return DataSchema.ColumnDataType.INT_ARRAY;
+        return ColumnDataType.INT_ARRAY;
       case LONG_ARRAY:
-        return DataSchema.ColumnDataType.LONG_ARRAY;
+        return ColumnDataType.LONG_ARRAY;
       case FLOAT_ARRAY:
-        return DataSchema.ColumnDataType.FLOAT_ARRAY;
+        return ColumnDataType.FLOAT_ARRAY;
       case DOUBLE_ARRAY:
-        return DataSchema.ColumnDataType.DOUBLE_ARRAY;
+        return ColumnDataType.DOUBLE_ARRAY;
       case BOOLEAN_ARRAY:
-        return DataSchema.ColumnDataType.BOOLEAN_ARRAY;
+        return ColumnDataType.BOOLEAN_ARRAY;
       case TIMESTAMP_ARRAY:
-        return DataSchema.ColumnDataType.TIMESTAMP_ARRAY;
+        return ColumnDataType.TIMESTAMP_ARRAY;
       case STRING_ARRAY:
-        return DataSchema.ColumnDataType.STRING_ARRAY;
+        return ColumnDataType.STRING_ARRAY;
       case BYTES_ARRAY:
-        return DataSchema.ColumnDataType.BYTES_ARRAY;
+        return ColumnDataType.BYTES_ARRAY;
       case OBJECT:
-        return DataSchema.ColumnDataType.OBJECT;
+        return ColumnDataType.OBJECT;
       case UNKNOWN:
-        return DataSchema.ColumnDataType.UNKNOWN;
+        return ColumnDataType.UNKNOWN;
       default:
         throw new IllegalStateException("Unsupported proto ColumnDataType: " + 
dataType);
     }
diff --git 
a/pinot-query-planner/src/main/java/org/apache/pinot/query/planner/serde/RexExpressionToProtoExpression.java
 
b/pinot-query-planner/src/main/java/org/apache/pinot/query/planner/serde/RexExpressionToProtoExpression.java
index aac7991824..0ff66c0c38 100644
--- 
a/pinot-query-planner/src/main/java/org/apache/pinot/query/planner/serde/RexExpressionToProtoExpression.java
+++ 
b/pinot-query-planner/src/main/java/org/apache/pinot/query/planner/serde/RexExpressionToProtoExpression.java
@@ -19,13 +19,13 @@
 package org.apache.pinot.query.planner.serde;
 
 import com.google.protobuf.ByteString;
-import java.io.Serializable;
+import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.List;
-import org.apache.commons.lang3.SerializationUtils;
 import org.apache.pinot.common.proto.Expressions;
-import org.apache.pinot.common.utils.DataSchema;
+import org.apache.pinot.common.utils.DataSchema.ColumnDataType;
 import org.apache.pinot.query.planner.logical.RexExpression;
+import org.apache.pinot.spi.utils.BigDecimalUtils;
 import org.apache.pinot.spi.utils.ByteArray;
 
 
@@ -66,36 +66,42 @@ public class RexExpressionToProtoExpression {
 
   public static Expressions.Literal convertLiteral(RexExpression.Literal 
literal) {
     Expressions.Literal.Builder literalBuilder = 
Expressions.Literal.newBuilder();
-    literalBuilder.setDataType(convertColumnDataType(literal.getDataType()));
-    Object literalValue = literal.getValue();
-    if (literalValue != null) {
-      if (literalValue instanceof Boolean) {
-        literalBuilder.setBoolField((Boolean) literalValue);
-      } else if (literalValue instanceof Integer) {
-        literalBuilder.setIntField((Integer) literalValue);
-      } else if (literalValue instanceof Long) {
-        literalBuilder.setLongField((Long) literalValue);
-      } else if (literalValue instanceof Float) {
-        literalBuilder.setFloatField((Float) literalValue);
-      } else if (literalValue instanceof Double) {
-        literalBuilder.setDoubleField((Double) literalValue);
-      } else if (literalValue instanceof String) {
-        literalBuilder.setStringField((String) literalValue);
-      } else if (literalValue instanceof ByteArray) {
-        literalBuilder.setBytesField(ByteString.copyFrom(((ByteArray) 
literalValue).getBytes()));
-      } else {
-        Serializable value = literal.getDataType().convert(literal.getValue());
-        byte[] data = SerializationUtils.serialize(value);
-        literalBuilder.setSerializedField(ByteString.copyFrom(data));
-      }
-      literalBuilder.setIsValueNull(false);
+    ColumnDataType dataType = literal.getDataType();
+    literalBuilder.setDataType(convertColumnDataType(dataType));
+    Object value = literal.getValue();
+    if (value == null) {
+      literalBuilder.setNull(true);
     } else {
-      literalBuilder.setIsValueNull(true);
+      switch (dataType.getStoredType()) {
+        case INT:
+          literalBuilder.setInt((Integer) value);
+          break;
+        case LONG:
+          literalBuilder.setLong((Long) value);
+          break;
+        case FLOAT:
+          literalBuilder.setFloat((Float) value);
+          break;
+        case DOUBLE:
+          literalBuilder.setDouble((Double) value);
+          break;
+        case BIG_DECIMAL:
+          
literalBuilder.setBytes(ByteString.copyFrom(BigDecimalUtils.serialize((BigDecimal)
 value)));
+          break;
+        case STRING:
+          literalBuilder.setString((String) value);
+          break;
+        case BYTES:
+          literalBuilder.setBytes(ByteString.copyFrom(((ByteArray) 
value).getBytes()));
+          break;
+        default:
+          throw new IllegalStateException("Unsupported ColumnDataType: " + 
dataType);
+      }
     }
     return literalBuilder.build();
   }
 
-  public static Expressions.ColumnDataType 
convertColumnDataType(DataSchema.ColumnDataType dataType) {
+  public static Expressions.ColumnDataType 
convertColumnDataType(ColumnDataType dataType) {
     switch (dataType) {
       case INT:
         return Expressions.ColumnDataType.INT;
diff --git 
a/pinot-query-runtime/src/main/java/org/apache/pinot/query/runtime/operator/AggregateOperator.java
 
b/pinot-query-runtime/src/main/java/org/apache/pinot/query/runtime/operator/AggregateOperator.java
index 7ecece802e..ce6d30d451 100644
--- 
a/pinot-query-runtime/src/main/java/org/apache/pinot/query/runtime/operator/AggregateOperator.java
+++ 
b/pinot-query-runtime/src/main/java/org/apache/pinot/query/runtime/operator/AggregateOperator.java
@@ -39,12 +39,11 @@ import 
org.apache.pinot.core.query.aggregation.function.AggregationFunction;
 import 
org.apache.pinot.core.query.aggregation.function.AggregationFunctionFactory;
 import 
org.apache.pinot.core.query.aggregation.function.CountAggregationFunction;
 import org.apache.pinot.core.util.DataBlockExtractUtils;
+import org.apache.pinot.query.parser.CalciteRexExpressionParser;
 import org.apache.pinot.query.planner.logical.RexExpression;
 import org.apache.pinot.query.planner.plannode.AggregateNode;
 import org.apache.pinot.query.runtime.blocks.TransferableBlock;
 import org.apache.pinot.query.runtime.plan.OpChainExecutionContext;
-import org.apache.pinot.spi.data.FieldSpec.DataType;
-import org.apache.pinot.spi.utils.BooleanUtils;
 import org.roaringbitmap.RoaringBitmap;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -218,14 +217,8 @@ public class AggregateOperator extends MultiStageOperator {
         
arguments.add(ExpressionContext.forIdentifier(fromColIdToIdentifier(inputRef.getIndex())));
       } else {
         assert operand instanceof RexExpression.Literal;
-        RexExpression.Literal literal = (RexExpression.Literal) operand;
-        DataType dataType = literal.getDataType().toDataType();
-        Object value = literal.getValue();
-        // TODO: Fix BOOLEAN literal to directly store true/false
-        if (dataType == DataType.BOOLEAN) {
-          value = BooleanUtils.fromNonNullInternalValue(value);
-        }
-        arguments.add(ExpressionContext.forLiteralContext(dataType, value));
+        arguments.add(
+            
ExpressionContext.forLiteral(CalciteRexExpressionParser.toLiteral((RexExpression.Literal)
 operand)));
       }
     }
     return AggregationFunctionFactory.getAggregationFunction(
diff --git 
a/pinot-query-runtime/src/main/java/org/apache/pinot/query/runtime/operator/MailboxSendOperator.java
 
b/pinot-query-runtime/src/main/java/org/apache/pinot/query/runtime/operator/MailboxSendOperator.java
index 8d4dfca153..7ebbaa2e91 100644
--- 
a/pinot-query-runtime/src/main/java/org/apache/pinot/query/runtime/operator/MailboxSendOperator.java
+++ 
b/pinot-query-runtime/src/main/java/org/apache/pinot/query/runtime/operator/MailboxSendOperator.java
@@ -195,9 +195,9 @@ public class MailboxSendOperator extends MultiStageOperator 
{
       LOGGER.info("Query stats not found in the EOS block.");
     } else {
       for (MultiStageQueryStats.StageStats.Closed closed : 
queryStats.getClosedStats()) {
-        closed.forEach((type, stats) -> {
-          type.updateServerMetrics(stats, serverMetrics);
-        });
+        if (closed != null) {
+          closed.forEach((type, stats) -> type.updateServerMetrics(stats, 
serverMetrics));
+        }
       }
       queryStats.getCurrentStats().forEach((type, stats) -> {
         type.updateServerMetrics(stats, serverMetrics);
diff --git 
a/pinot-query-runtime/src/test/java/org/apache/pinot/query/runtime/operator/FilterOperatorTest.java
 
b/pinot-query-runtime/src/test/java/org/apache/pinot/query/runtime/operator/FilterOperatorTest.java
index fc13277304..462cd2ddbf 100644
--- 
a/pinot-query-runtime/src/test/java/org/apache/pinot/query/runtime/operator/FilterOperatorTest.java
+++ 
b/pinot-query-runtime/src/test/java/org/apache/pinot/query/runtime/operator/FilterOperatorTest.java
@@ -59,11 +59,10 @@ public class FilterOperatorTest {
   @Test
   public void shouldPropagateUpstreamErrorBlock() {
     
when(_input.nextBlock()).thenReturn(TransferableBlockUtils.getErrorTransferableBlock(new
 Exception("filterError")));
-    RexExpression booleanLiteral = new 
RexExpression.Literal(ColumnDataType.BOOLEAN, 1);
     DataSchema inputSchema = new DataSchema(new String[]{"boolCol"}, new 
ColumnDataType[]{
         ColumnDataType.BOOLEAN
     });
-    FilterOperator operator = getOperator(inputSchema, booleanLiteral);
+    FilterOperator operator = getOperator(inputSchema, 
RexExpression.Literal.TRUE);
     TransferableBlock block = operator.getNextBlock();
     assertTrue(block.isErrorBlock());
     
assertTrue(block.getExceptions().get(QueryException.UNKNOWN_ERROR_CODE).contains("filterError"));
@@ -71,25 +70,23 @@ public class FilterOperatorTest {
 
   @Test
   public void shouldPropagateUpstreamEOS() {
-    RexExpression booleanLiteral = new 
RexExpression.Literal(ColumnDataType.BOOLEAN, 1);
     DataSchema inputSchema = new DataSchema(new String[]{"intCol"}, new 
ColumnDataType[]{
         ColumnDataType.INT
     });
     
when(_input.nextBlock()).thenReturn(TransferableBlockTestUtils.getEndOfStreamTransferableBlock(0));
-    FilterOperator operator = getOperator(inputSchema, booleanLiteral);
+    FilterOperator operator = getOperator(inputSchema, 
RexExpression.Literal.TRUE);
     TransferableBlock block = operator.getNextBlock();
     assertTrue(block.isEndOfStreamBlock());
   }
 
   @Test
   public void shouldHandleTrueBooleanLiteralFilter() {
-    RexExpression booleanLiteral = new 
RexExpression.Literal(ColumnDataType.BOOLEAN, 1);
     DataSchema inputSchema = new DataSchema(new String[]{"intCol"}, new 
ColumnDataType[]{
         ColumnDataType.INT
     });
     when(_input.nextBlock()).thenReturn(OperatorTestUtil.block(inputSchema, 
new Object[]{0}, new Object[]{1}))
         
.thenReturn(TransferableBlockTestUtils.getEndOfStreamTransferableBlock(0));
-    FilterOperator operator = getOperator(inputSchema, booleanLiteral);
+    FilterOperator operator = getOperator(inputSchema, 
RexExpression.Literal.TRUE);
     List<Object[]> resultRows = operator.getNextBlock().getContainer();
     assertEquals(resultRows.size(), 2);
     assertEquals(resultRows.get(0), new Object[]{0});
@@ -98,12 +95,11 @@ public class FilterOperatorTest {
 
   @Test
   public void shouldHandleFalseBooleanLiteralFilter() {
-    RexExpression booleanLiteral = new 
RexExpression.Literal(ColumnDataType.BOOLEAN, 0);
     DataSchema inputSchema = new DataSchema(new String[]{"intCol"}, new 
ColumnDataType[]{
         ColumnDataType.INT
     });
     when(_input.nextBlock()).thenReturn(OperatorTestUtil.block(inputSchema, 
new Object[]{1}, new Object[]{2}));
-    FilterOperator operator = getOperator(inputSchema, booleanLiteral);
+    FilterOperator operator = getOperator(inputSchema, 
RexExpression.Literal.FALSE);
     List<Object[]> resultRows = operator.getNextBlock().getContainer();
     assertTrue(resultRows.isEmpty());
   }
diff --git 
a/pinot-query-runtime/src/test/java/org/apache/pinot/query/runtime/operator/TransformOperatorTest.java
 
b/pinot-query-runtime/src/test/java/org/apache/pinot/query/runtime/operator/TransformOperatorTest.java
index 91c1d9f928..29c08d6a88 100644
--- 
a/pinot-query-runtime/src/test/java/org/apache/pinot/query/runtime/operator/TransformOperatorTest.java
+++ 
b/pinot-query-runtime/src/test/java/org/apache/pinot/query/runtime/operator/TransformOperatorTest.java
@@ -81,8 +81,8 @@ public class TransformOperatorTest {
         OperatorTestUtil.block(inputSchema, new Object[]{1, "a"}, new 
Object[]{2, "b"}));
     DataSchema resultSchema = new DataSchema(new String[]{"boolCol", "strCol"},
         new ColumnDataType[]{ColumnDataType.BOOLEAN, ColumnDataType.STRING});
-    List<RexExpression> projects = List.of(new 
RexExpression.Literal(ColumnDataType.BOOLEAN, 1),
-        new RexExpression.Literal(ColumnDataType.STRING, "str"));
+    List<RexExpression> projects =
+        List.of(RexExpression.Literal.TRUE, new 
RexExpression.Literal(ColumnDataType.STRING, "str"));
     TransformOperator operator = getOperator(inputSchema, resultSchema, 
projects);
     List<Object[]> resultRows = operator.nextBlock().getContainer();
     assertEquals(resultRows.size(), 2);
@@ -138,8 +138,8 @@ public class TransformOperatorTest {
         TransferableBlockUtils.getErrorTransferableBlock(new 
Exception("transformError")));
     DataSchema resultSchema = new DataSchema(new String[]{"inCol", "strCol"},
         new ColumnDataType[]{ColumnDataType.INT, ColumnDataType.STRING});
-    List<RexExpression> projects = List.of(new 
RexExpression.Literal(ColumnDataType.BOOLEAN, 1),
-        new RexExpression.Literal(ColumnDataType.STRING, "str"));
+    List<RexExpression> projects =
+        List.of(RexExpression.Literal.TRUE, new 
RexExpression.Literal(ColumnDataType.STRING, "str"));
     TransformOperator operator = getOperator(inputSchema, resultSchema, 
projects);
     TransferableBlock block = operator.nextBlock();
     assertTrue(block.isErrorBlock());
@@ -158,8 +158,8 @@ public class TransformOperatorTest {
         }));
     DataSchema resultSchema = new DataSchema(new String[]{"boolCol", "strCol"},
         new ColumnDataType[]{ColumnDataType.BOOLEAN, ColumnDataType.STRING});
-    List<RexExpression> projects = List.of(new 
RexExpression.Literal(ColumnDataType.BOOLEAN, 1),
-        new RexExpression.Literal(ColumnDataType.STRING, "str"));
+    List<RexExpression> projects =
+        List.of(RexExpression.Literal.TRUE, new 
RexExpression.Literal(ColumnDataType.STRING, "str"));
     TransformOperator operator = getOperator(inputSchema, resultSchema, 
projects);
     // First block has 1 row.
     List<Object[]> resultRows1 = operator.nextBlock().getContainer();
diff --git 
a/pinot-segment-local/src/test/java/org/apache/pinot/segment/local/aggregator/DistinctCountULLValueAggregatorTest.java
 
b/pinot-segment-local/src/test/java/org/apache/pinot/segment/local/aggregator/DistinctCountULLValueAggregatorTest.java
index 5833b576f9..f7b5fc14dc 100644
--- 
a/pinot-segment-local/src/test/java/org/apache/pinot/segment/local/aggregator/DistinctCountULLValueAggregatorTest.java
+++ 
b/pinot-segment-local/src/test/java/org/apache/pinot/segment/local/aggregator/DistinctCountULLValueAggregatorTest.java
@@ -48,7 +48,7 @@ public class DistinctCountULLValueAggregatorTest {
             .ifPresent(input::add)
     );
     DistinctCountULLValueAggregator agg = new 
DistinctCountULLValueAggregator(Collections.singletonList(
-        ExpressionContext.forLiteralContext(Literal.intValue(12))
+        ExpressionContext.forLiteral(Literal.intValue(12))
     ));
     byte[] bytes = agg.serializeAggregatedValue(input);
     UltraLogLog aggregated = agg.getInitialAggregatedValue(bytes);
@@ -67,7 +67,7 @@ public class DistinctCountULLValueAggregatorTest {
             .ifPresent(input::add)
     );
     DistinctCountULLValueAggregator agg = new 
DistinctCountULLValueAggregator(Collections.singletonList(
-        ExpressionContext.forLiteralContext(Literal.intValue(12))
+        ExpressionContext.forLiteral(Literal.intValue(12))
     ));
     byte[] bytes = agg.serializeAggregatedValue(input);
     UltraLogLog aggregated = agg.getInitialAggregatedValue(bytes);
diff --git 
a/pinot-segment-local/src/test/java/org/apache/pinot/segment/local/indexsegment/mutable/MutableSegmentImplIngestionAggregationTest.java
 
b/pinot-segment-local/src/test/java/org/apache/pinot/segment/local/indexsegment/mutable/MutableSegmentImplIngestionAggregationTest.java
index 711634ea17..9f5cec50a8 100644
--- 
a/pinot-segment-local/src/test/java/org/apache/pinot/segment/local/indexsegment/mutable/MutableSegmentImplIngestionAggregationTest.java
+++ 
b/pinot-segment-local/src/test/java/org/apache/pinot/segment/local/indexsegment/mutable/MutableSegmentImplIngestionAggregationTest.java
@@ -182,7 +182,7 @@ public class MutableSegmentImplIngestionAggregationTest {
     }
 
     List<ExpressionContext> arguments = 
Arrays.asList(ExpressionContext.forIdentifier("metric"),
-        ExpressionContext.forLiteralContext(Literal.stringValue("12")));
+        ExpressionContext.forLiteral(Literal.stringValue("12")));
     DistinctCountHLLValueAggregator valueAggregator = new 
DistinctCountHLLValueAggregator(arguments);
 
     Set<Integer> integers = new HashSet<>();


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to