This is an automated email from the ASF dual-hosted git repository.
yashmayya 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 09cce36ac3 Allow adding and subtracting timestamp types in the
multi-stage engine (#14782)
09cce36ac3 is described below
commit 09cce36ac32c82184645a1b10ea8c3da5c3bc4cf
Author: Yash Mayya <[email protected]>
AuthorDate: Thu Jan 9 15:04:36 2025 +0700
Allow adding and subtracting timestamp types in the multi-stage engine
(#14782)
---
.../pinot/calcite/sql/fun/PinotOperatorTable.java | 35 +++++++++++++++++++---
.../pinot/query/QueryEnvironmentTestBase.java | 6 +++-
2 files changed, 36 insertions(+), 5 deletions(-)
diff --git
a/pinot-query-planner/src/main/java/org/apache/pinot/calcite/sql/fun/PinotOperatorTable.java
b/pinot-query-planner/src/main/java/org/apache/pinot/calcite/sql/fun/PinotOperatorTable.java
index c48cbe19a0..fc861d5d2e 100644
---
a/pinot-query-planner/src/main/java/org/apache/pinot/calcite/sql/fun/PinotOperatorTable.java
+++
b/pinot-query-planner/src/main/java/org/apache/pinot/calcite/sql/fun/PinotOperatorTable.java
@@ -25,6 +25,7 @@ import java.util.List;
import java.util.Map;
import java.util.function.Supplier;
import javax.annotation.Nullable;
+import org.apache.calcite.sql.SqlBinaryOperator;
import org.apache.calcite.sql.SqlFunction;
import org.apache.calcite.sql.SqlFunctionCategory;
import org.apache.calcite.sql.SqlIdentifier;
@@ -33,7 +34,9 @@ import org.apache.calcite.sql.SqlOperator;
import org.apache.calcite.sql.SqlOperatorTable;
import org.apache.calcite.sql.SqlSyntax;
import org.apache.calcite.sql.fun.SqlLeadLagAggFunction;
+import org.apache.calcite.sql.fun.SqlMonotonicBinaryOperator;
import org.apache.calcite.sql.fun.SqlStdOperatorTable;
+import org.apache.calcite.sql.type.InferTypes;
import org.apache.calcite.sql.type.OperandTypes;
import org.apache.calcite.sql.type.ReturnTypes;
import org.apache.calcite.sql.type.SqlTypeFamily;
@@ -69,6 +72,30 @@ public class PinotOperatorTable implements SqlOperatorTable {
return INSTANCE.get();
}
+ // The standard Calcite + and - operators don't support operations on
TIMESTAMP types. However, Pinot supports these
+ // operations, so we need to define our own operators. Note that Postgres
supports - on TIMESTAMP types, but not +.
+ // Calcite only supports such operations if the second operand is an
interval (similar to Postgres for the +
+ // operator).
+ public static final SqlBinaryOperator PINOT_PLUS =
+ new SqlMonotonicBinaryOperator(
+ "+",
+ SqlKind.PLUS,
+ 40,
+ true,
+ ReturnTypes.NULLABLE_SUM,
+ InferTypes.FIRST_KNOWN,
+
OperandTypes.PLUS_OPERATOR.or(OperandTypes.family(SqlTypeFamily.TIMESTAMP,
SqlTypeFamily.TIMESTAMP)));
+
+ public static final SqlBinaryOperator PINOT_MINUS =
+ new SqlMonotonicBinaryOperator(
+ "-",
+ SqlKind.MINUS,
+ 40,
+ true,
+ ReturnTypes.NULLABLE_SUM,
+ InferTypes.FIRST_KNOWN,
+
OperandTypes.MINUS_OPERATOR.or(OperandTypes.family(SqlTypeFamily.TIMESTAMP,
SqlTypeFamily.TIMESTAMP)));
+
/**
* This list includes the supported standard {@link SqlOperator}s defined in
{@link SqlStdOperatorTable}.
* NOTE: The operator order follows the same order as defined in {@link
SqlStdOperatorTable} for easier search.
@@ -105,12 +132,12 @@ public class PinotOperatorTable implements
SqlOperatorTable {
SqlStdOperatorTable.SEARCH,
SqlStdOperatorTable.LESS_THAN,
SqlStdOperatorTable.LESS_THAN_OR_EQUAL,
- SqlStdOperatorTable.MINUS,
SqlStdOperatorTable.MULTIPLY,
SqlStdOperatorTable.NOT_EQUALS,
SqlStdOperatorTable.OR,
- SqlStdOperatorTable.PLUS,
SqlStdOperatorTable.INTERVAL,
+ PINOT_MINUS,
+ PINOT_PLUS,
// POSTFIX OPERATORS
SqlStdOperatorTable.DESC,
@@ -231,8 +258,8 @@ public class PinotOperatorTable implements SqlOperatorTable
{
Pair.of(SqlStdOperatorTable.GREATER_THAN_OR_EQUAL,
List.of("GREATER_THAN_OR_EQUAL")),
Pair.of(SqlStdOperatorTable.LESS_THAN, List.of("LESS_THAN")),
Pair.of(SqlStdOperatorTable.LESS_THAN_OR_EQUAL,
List.of("LESS_THAN_OR_EQUAL")),
- Pair.of(SqlStdOperatorTable.MINUS, List.of("SUB", "MINUS")),
- Pair.of(SqlStdOperatorTable.PLUS, List.of("ADD", "PLUS")),
+ Pair.of(PINOT_MINUS, List.of("SUB", "MINUS")),
+ Pair.of(PINOT_PLUS, List.of("ADD", "PLUS")),
Pair.of(SqlStdOperatorTable.MULTIPLY, List.of("MULT", "TIMES"))
);
diff --git
a/pinot-query-planner/src/test/java/org/apache/pinot/query/QueryEnvironmentTestBase.java
b/pinot-query-planner/src/test/java/org/apache/pinot/query/QueryEnvironmentTestBase.java
index 830ec42a88..8a2ec92672 100644
---
a/pinot-query-planner/src/test/java/org/apache/pinot/query/QueryEnvironmentTestBase.java
+++
b/pinot-query-planner/src/test/java/org/apache/pinot/query/QueryEnvironmentTestBase.java
@@ -253,7 +253,11 @@ public class QueryEnvironmentTestBase {
new Object[]{"SELECT ts_timestamp FROM a WHERE ts_timestamp BETWEEN
TIMESTAMP '2016-01-01 00:00:00' AND "
+ "TIMESTAMP '2016-01-01 10:00:00'"},
new Object[]{"SELECT ts_timestamp FROM a WHERE ts_timestamp >=
CAST(1454284798000 AS TIMESTAMP)"},
- new Object[]{"SELECT TIMESTAMPADD(day, 10, NOW()) FROM a"}
+ new Object[]{"SELECT TIMESTAMPADD(day, 10, NOW()) FROM a"},
+ new Object[]{"SELECT ts_timestamp - CAST(123456789 AS TIMESTAMP) FROM
a"},
+ new Object[]{"SELECT SUB(ts_timestamp, CAST(123456789 AS TIMESTAMP))
FROM a"},
+ new Object[]{"SELECT ts_timestamp + CAST(123456789 AS TIMESTAMP) FROM
a"},
+ new Object[]{"SELECT ADD(ts_timestamp, CAST(123456789 AS TIMESTAMP))
FROM a"}
};
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]