You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pinot.apache.org by ya...@apache.org on 2025/01/09 08:04:41 UTC
(pinot) branch master updated: Allow adding and subtracting timestamp types in the multi-stage engine (#14782)
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 <ya...@gmail.com>
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: commits-unsubscribe@pinot.apache.org
For additional commands, e-mail: commits-help@pinot.apache.org