Skip to content

Commit 608fa6c

Browse files
authored
delay monthly interval check to analyzer phase
1 parent 6a461f0 commit 608fa6c

File tree

8 files changed

+151
-11
lines changed

8 files changed

+151
-11
lines changed

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/StatementAnalyzer.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@
176176
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.TableFunctionInvocation;
177177
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.TableFunctionTableArgument;
178178
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.TableSubquery;
179+
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.TimeDurationLiteral;
179180
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Trim;
180181
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Union;
181182
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Update;
@@ -5260,6 +5261,12 @@ private ArgumentAnalysis analyzeTableArgument(
52605261

52615262
private ArgumentAnalysis analyzeScalarArgument(
52625263
Expression expression, ScalarParameterSpecification argumentSpecification) {
5264+
if (expression instanceof TimeDurationLiteral) {
5265+
if (((TimeDurationLiteral) expression).getValue().monthDuration != 0) {
5266+
throw new SemanticException("Setting monthly intervals is not supported.");
5267+
}
5268+
}
5269+
52635270
// currently, only constant arguments are supported
52645271
Object constantValue =
52655272
evaluateConstantExpression(

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/IrTypeAnalyzer.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@
6161
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.SimpleCaseExpression;
6262
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.StringLiteral;
6363
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.SymbolReference;
64+
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.TimeDurationLiteral;
6465
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.WhenClause;
6566
import org.apache.iotdb.db.queryengine.plan.relational.type.TypeCoercionUtils;
6667

@@ -89,6 +90,7 @@
8990
import static com.google.common.collect.ImmutableList.toImmutableList;
9091
import static java.util.Objects.requireNonNull;
9192
import static org.apache.iotdb.db.queryengine.plan.relational.type.TypeSignatureTranslator.toTypeSignature;
93+
import static org.apache.iotdb.db.utils.TimestampPrecisionUtils.currPrecision;
9294
import static org.apache.tsfile.read.common.type.BooleanType.BOOLEAN;
9395
import static org.apache.tsfile.read.common.type.DoubleType.DOUBLE;
9496
import static org.apache.tsfile.read.common.type.FloatType.FLOAT;
@@ -402,6 +404,17 @@ protected Type visitNullLiteral(NullLiteral node, Context context) {
402404
return setExpressionType(node, UNKNOWN);
403405
}
404406

407+
@Override
408+
protected Type visitTimeDurationLiteral(TimeDurationLiteral node, Context context) {
409+
long value = node.getValue().getTotalDuration(currPrecision);
410+
411+
if (value >= Integer.MIN_VALUE && value <= Integer.MAX_VALUE) {
412+
return setExpressionType(node, INT32);
413+
}
414+
// keep the original type
415+
return setExpressionType(node, INT64);
416+
}
417+
405418
@Override
406419
protected Type visitFunctionCall(FunctionCall node, Context context) {
407420
// Function should already be resolved in IR

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/LiteralInterpreter.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.LongLiteral;
3333
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.NullLiteral;
3434
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.StringLiteral;
35+
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.TimeDurationLiteral;
3536

3637
import org.apache.tsfile.common.conf.TSFileConfig;
3738
import org.apache.tsfile.read.common.type.DateType;
@@ -40,6 +41,7 @@
4041
import org.apache.tsfile.utils.Binary;
4142

4243
import static java.util.Objects.requireNonNull;
44+
import static org.apache.iotdb.db.utils.TimestampPrecisionUtils.currPrecision;
4345

4446
public class LiteralInterpreter {
4547

@@ -116,5 +118,10 @@ protected Object visitGenericLiteral(GenericLiteral node, Void context) {
116118
protected Object visitNullLiteral(NullLiteral node, Void context) {
117119
return null;
118120
}
121+
122+
@Override
123+
protected Long visitTimeDurationLiteral(TimeDurationLiteral node, Void context) {
124+
return node.getValue().getTotalDuration(currPrecision);
125+
}
119126
}
120127
}

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/AstVisitor.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,10 @@ protected R visitDecimalLiteral(DecimalLiteral node, C context) {
7777
return visitLiteral(node, context);
7878
}
7979

80+
protected R visitTimeDurationLiteral(TimeDurationLiteral node, C context) {
81+
return visitLiteral(node, context);
82+
}
83+
8084
protected R visitStatement(Statement node, C context) {
8185
return visitNode(node, context);
8286
}

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/TableExpressionType.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,8 @@ public enum TableExpressionType {
5252
CURRENT_USER((short) 30),
5353
ROW((short) 31),
5454
EXTRACT((short) 32),
55-
FLOAT_LITERAL((short) 33);
55+
FLOAT_LITERAL((short) 33),
56+
TIME_DURATION_LITERAL((short) 34);
5657

5758
TableExpressionType(short type) {
5859
this.type = type;
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one
3+
* or more contributor license agreements. See the NOTICE file
4+
* distributed with this work for additional information
5+
* regarding copyright ownership. The ASF licenses this file
6+
* to you under the Apache License, Version 2.0 (the
7+
* "License"); you may not use this file except in compliance
8+
* with the License. You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
20+
package org.apache.iotdb.db.queryengine.plan.relational.sql.ast;
21+
22+
import org.apache.tsfile.utils.RamUsageEstimator;
23+
import org.apache.tsfile.utils.TimeDuration;
24+
25+
import java.io.DataOutputStream;
26+
import java.io.IOException;
27+
import java.nio.ByteBuffer;
28+
import java.util.Objects;
29+
30+
import static java.util.Objects.requireNonNull;
31+
32+
public class TimeDurationLiteral extends Literal {
33+
34+
private static final long INSTANCE_SIZE =
35+
RamUsageEstimator.shallowSizeOfInstance(TimeDurationLiteral.class);
36+
37+
private final TimeDuration value;
38+
39+
public TimeDurationLiteral(TimeDuration value) {
40+
super(null);
41+
this.value = requireNonNull(value, "value is null");
42+
}
43+
44+
public TimeDurationLiteral(NodeLocation location, TimeDuration value) {
45+
super(requireNonNull(location, "location is null"));
46+
this.value = requireNonNull(value, "value is null");
47+
}
48+
49+
public TimeDuration getValue() {
50+
return value;
51+
}
52+
53+
@Override
54+
public <R, C> R accept(AstVisitor<R, C> visitor, C context) {
55+
return visitor.visitTimeDurationLiteral(this, context);
56+
}
57+
58+
@Override
59+
public Object getTsValue() {
60+
return value;
61+
}
62+
63+
@Override
64+
public int hashCode() {
65+
return Objects.hash(value);
66+
}
67+
68+
@Override
69+
public boolean equals(Object obj) {
70+
if (this == obj) {
71+
return true;
72+
}
73+
if ((obj == null) || (getClass() != obj.getClass())) {
74+
return false;
75+
}
76+
TimeDurationLiteral that = (TimeDurationLiteral) obj;
77+
return Objects.equals(value, that.value);
78+
}
79+
80+
@Override
81+
public boolean shallowEquals(Node other) {
82+
if (!sameClass(this, other)) {
83+
return false;
84+
}
85+
return Objects.equals(value, ((TimeDurationLiteral) other).value);
86+
}
87+
88+
@Override
89+
public TableExpressionType getExpressionType() {
90+
return TableExpressionType.TIME_DURATION_LITERAL;
91+
}
92+
93+
@Override
94+
public void serialize(DataOutputStream stream) throws IOException {
95+
value.serialize(stream);
96+
}
97+
98+
public TimeDurationLiteral(ByteBuffer byteBuffer) {
99+
super(null);
100+
this.value = TimeDuration.deserialize(byteBuffer);
101+
}
102+
103+
@Override
104+
public long ramBytesUsed() {
105+
return INSTANCE_SIZE
106+
+ AstMemoryEstimationHelper.getEstimatedSizeOfNodeLocation(getLocationInternal())
107+
+ RamUsageEstimator.sizeOfObject(value);
108+
}
109+
}

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,7 @@
229229
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.TableFunctionInvocation;
230230
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.TableFunctionTableArgument;
231231
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.TableSubquery;
232+
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.TimeDurationLiteral;
232233
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Trim;
233234
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.TypeParameter;
234235
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Union;
@@ -338,7 +339,6 @@
338339
import static org.apache.iotdb.db.queryengine.plan.relational.sql.ast.SkipTo.skipToNextRow;
339340
import static org.apache.iotdb.db.queryengine.plan.relational.sql.util.QueryUtil.selectList;
340341
import static org.apache.iotdb.db.queryengine.plan.relational.sql.util.QueryUtil.table;
341-
import static org.apache.iotdb.db.utils.TimestampPrecisionUtils.currPrecision;
342342
import static org.apache.iotdb.db.utils.constant.SqlConstant.APPROX_COUNT_DISTINCT;
343343
import static org.apache.iotdb.db.utils.constant.SqlConstant.APPROX_MOST_FREQUENT;
344344
import static org.apache.iotdb.db.utils.constant.SqlConstant.APPROX_PERCENTILE;
@@ -3057,15 +3057,8 @@ public Node visitScalarArgument(RelationalSqlParser.ScalarArgumentContext ctx) {
30573057
if (ctx.expression() != null) {
30583058
return visit(ctx.expression());
30593059
} else {
3060-
TimeDuration timeDuration = DateTimeUtils.constructTimeDuration(ctx.timeDuration().getText());
3061-
3062-
if (timeDuration.monthDuration != 0) {
3063-
throw new SemanticException("Setting monthly intervals is not supported.");
3064-
}
3065-
3066-
return new LongLiteral(
3067-
getLocation(ctx.timeDuration()),
3068-
String.valueOf(timeDuration.getTotalDuration(currPrecision)));
3060+
return new TimeDurationLiteral(
3061+
DateTimeUtils.constructTimeDuration(ctx.timeDuration().getText()));
30693062
}
30703063
}
30713064

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/util/ExpressionFormatter.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@
7575
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.StringLiteral;
7676
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.SubqueryExpression;
7777
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.SymbolReference;
78+
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.TimeDurationLiteral;
7879
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Trim;
7980
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.TypeParameter;
8081
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.WhenClause;
@@ -263,6 +264,11 @@ protected String visitNullLiteral(NullLiteral node, Void context) {
263264
return literalFormatter.map(formatter -> formatter.apply(node)).orElse("null");
264265
}
265266

267+
@Override
268+
public String visitTimeDurationLiteral(TimeDurationLiteral node, Void context) {
269+
return node.getValue().toString();
270+
}
271+
266272
@Override
267273
protected String visitSubqueryExpression(SubqueryExpression node, Void context) {
268274
return "(" + formatSql(node.getQuery()) + ")";

0 commit comments

Comments
 (0)