Skip to content

Commit d7f60c5

Browse files
authored
[Cherry-pick](branch 2.1)[Enhancement] support last_query_id function (#41025)
## Proposed changes Issue Number: close #xxx backport #40739
1 parent 6539c8f commit d7f60c5

File tree

6 files changed

+92
-2
lines changed

6 files changed

+92
-2
lines changed

fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinScalarFunctions.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,7 @@
253253
import org.apache.doris.nereids.trees.expressions.functions.scalar.L1Distance;
254254
import org.apache.doris.nereids.trees.expressions.functions.scalar.L2Distance;
255255
import org.apache.doris.nereids.trees.expressions.functions.scalar.LastDay;
256+
import org.apache.doris.nereids.trees.expressions.functions.scalar.LastQueryId;
256257
import org.apache.doris.nereids.trees.expressions.functions.scalar.Least;
257258
import org.apache.doris.nereids.trees.expressions.functions.scalar.Left;
258259
import org.apache.doris.nereids.trees.expressions.functions.scalar.Length;
@@ -906,7 +907,8 @@ public class BuiltinScalarFunctions implements FunctionHelper {
906907
scalar(YearsAdd.class, "years_add"),
907908
scalar(YearsDiff.class, "years_diff"),
908909
scalar(YearsSub.class, "years_sub"),
909-
scalar(MultiMatch.class, "multi_match"));
910+
scalar(MultiMatch.class, "multi_match"),
911+
scalar(LastQueryId.class, "last_query_id"));
910912

911913
public static final BuiltinScalarFunctions INSTANCE = new BuiltinScalarFunctions();
912914

fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/FoldConstantRuleOnFE.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import org.apache.doris.catalog.EncryptKey;
2121
import org.apache.doris.catalog.Env;
2222
import org.apache.doris.cluster.ClusterNamespace;
23+
import org.apache.doris.common.util.DebugUtil;
2324
import org.apache.doris.nereids.exceptions.AnalysisException;
2425
import org.apache.doris.nereids.rules.expression.AbstractExpressionRewriteRule;
2526
import org.apache.doris.nereids.rules.expression.ExpressionListenerMatcher;
@@ -62,6 +63,7 @@
6263
import org.apache.doris.nereids.trees.expressions.functions.scalar.Date;
6364
import org.apache.doris.nereids.trees.expressions.functions.scalar.EncryptKeyRef;
6465
import org.apache.doris.nereids.trees.expressions.functions.scalar.If;
66+
import org.apache.doris.nereids.trees.expressions.functions.scalar.LastQueryId;
6567
import org.apache.doris.nereids.trees.expressions.functions.scalar.Password;
6668
import org.apache.doris.nereids.trees.expressions.functions.scalar.User;
6769
import org.apache.doris.nereids.trees.expressions.functions.scalar.Version;
@@ -83,6 +85,7 @@
8385
import org.apache.doris.nereids.util.ExpressionUtils;
8486
import org.apache.doris.qe.ConnectContext;
8587
import org.apache.doris.qe.GlobalVariable;
88+
import org.apache.doris.thrift.TUniqueId;
8689

8790
import com.google.common.base.Preconditions;
8891
import com.google.common.base.Strings;
@@ -164,7 +167,8 @@ public List<ExpressionPatternMatcher<? extends Expression>> buildRules() {
164167
matches(Password.class, this::visitPassword),
165168
matches(Array.class, this::visitArray),
166169
matches(Date.class, this::visitDate),
167-
matches(Version.class, this::visitVersion)
170+
matches(Version.class, this::visitVersion),
171+
matches(LastQueryId.class, this::visitLastQueryId)
168172
);
169173
}
170174

@@ -326,6 +330,16 @@ public Expression visitUser(User user, ExpressionRewriteContext context) {
326330
return new VarcharLiteral(res);
327331
}
328332

333+
@Override
334+
public Expression visitLastQueryId(LastQueryId queryId, ExpressionRewriteContext context) {
335+
String res = "Not Available";
336+
TUniqueId id = context.cascadesContext.getConnectContext().getLastQueryId();
337+
if (id != null) {
338+
res = DebugUtil.printId(id);
339+
}
340+
return new VarcharLiteral(res);
341+
}
342+
329343
@Override
330344
public Expression visitConnectionId(ConnectionId connectionId, ExpressionRewriteContext context) {
331345
return new BigIntLiteral(context.cascadesContext.getConnectContext().getConnectionId());
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
// Licensed to the Apache Software Foundation (ASF) under one
2+
// or more contributor license agreements. See the NOTICE file
3+
// distributed with this work for additional information
4+
// regarding copyright ownership. The ASF licenses this file
5+
// to you under the Apache License, Version 2.0 (the
6+
// "License"); you may not use this file except in compliance
7+
// with the License. You may obtain a copy of the License at
8+
//
9+
// http://www.apache.org/licenses/LICENSE-2.0
10+
//
11+
// Unless required by applicable law or agreed to in writing,
12+
// software distributed under the License is distributed on an
13+
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14+
// KIND, either express or implied. See the License for the
15+
// specific language governing permissions and limitations
16+
// under the License.
17+
18+
package org.apache.doris.nereids.trees.expressions.functions.scalar;
19+
20+
import org.apache.doris.catalog.FunctionSignature;
21+
import org.apache.doris.nereids.trees.expressions.functions.AlwaysNotNullable;
22+
import org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
23+
import org.apache.doris.nereids.trees.expressions.shape.LeafExpression;
24+
import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
25+
import org.apache.doris.nereids.types.VarcharType;
26+
27+
import com.google.common.collect.ImmutableList;
28+
29+
import java.util.List;
30+
31+
/**
32+
* ScalarFunction 'last_query_id'.
33+
*/
34+
public class LastQueryId extends ScalarFunction
35+
implements LeafExpression, ExplicitlyCastableSignature, AlwaysNotNullable {
36+
37+
public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
38+
FunctionSignature.ret(VarcharType.SYSTEM_DEFAULT).args()
39+
);
40+
41+
public LastQueryId() {
42+
super("last_query_id", ImmutableList.of());
43+
}
44+
45+
@Override
46+
public List<FunctionSignature> getSignatures() {
47+
return SIGNATURES;
48+
}
49+
50+
@Override
51+
public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
52+
return visitor.visitLastQueryId(this, context);
53+
}
54+
55+
@Override
56+
public boolean isDeterministic() {
57+
return false;
58+
}
59+
}

fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ScalarFunctionVisitor.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,7 @@
256256
import org.apache.doris.nereids.trees.expressions.functions.scalar.L1Distance;
257257
import org.apache.doris.nereids.trees.expressions.functions.scalar.L2Distance;
258258
import org.apache.doris.nereids.trees.expressions.functions.scalar.LastDay;
259+
import org.apache.doris.nereids.trees.expressions.functions.scalar.LastQueryId;
259260
import org.apache.doris.nereids.trees.expressions.functions.scalar.Least;
260261
import org.apache.doris.nereids.trees.expressions.functions.scalar.Left;
261262
import org.apache.doris.nereids.trees.expressions.functions.scalar.Length;
@@ -2157,4 +2158,8 @@ default R visitStructElement(StructElement structElement, C context) {
21572158
default R visitMultiMatch(MultiMatch multiMatch, C context) {
21582159
return visitScalarFunction(multiMatch, context);
21592160
}
2161+
2162+
default R visitLastQueryId(LastQueryId queryId, C context) {
2163+
return visitScalarFunction(queryId, context);
2164+
}
21602165
}

fe/fe-core/src/main/java/org/apache/doris/qe/ConnectContext.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ public enum ConnectType {
112112

113113
protected volatile TUniqueId queryId = null;
114114
protected volatile String traceId;
115+
protected volatile TUniqueId lastQueryId = null;
115116
// id for this connection
116117
protected volatile int connectionId;
117118
// Timestamp when the connection is make
@@ -864,6 +865,9 @@ public void setKilled() {
864865
}
865866

866867
public void setQueryId(TUniqueId queryId) {
868+
if (this.queryId != null) {
869+
this.lastQueryId = this.queryId.deepCopy();
870+
}
867871
this.queryId = queryId;
868872
if (connectScheduler != null && !Strings.isNullOrEmpty(traceId)) {
869873
connectScheduler.putTraceId2QueryId(traceId, queryId);
@@ -882,6 +886,10 @@ public TUniqueId queryId() {
882886
return queryId;
883887
}
884888

889+
public TUniqueId getLastQueryId() {
890+
return lastQueryId;
891+
}
892+
885893
public String getSqlHash() {
886894
return sqlHash;
887895
}

regression-test/suites/query_p0/system/test_query_sys.groovy

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ suite("test_query_sys", "query,p0") {
4242
sql "select pi();"
4343
sql "select e();"
4444
sql "select sleep(2);"
45+
sql "select last_query_id();"
46+
sql "select LAST_QUERY_ID();"
4547

4648
// INFORMATION_SCHEMA
4749
sql "SELECT table_name FROM INFORMATION_SCHEMA.TABLES where table_schema=\"test_query_db\" and TABLE_TYPE = \"BASE TABLE\" order by table_name"

0 commit comments

Comments
 (0)