Skip to content

Commit fc338ad

Browse files
Vallishpdataroaring
authored andcommitted
[Enhancement](function) support last_query_id function (#40739)
support display previous query id. mysql> select LAST_QUERY_ID(); No connection. Trying to reconnect... Connection id: 0 Current database: *** NONE *** +-----------------+ | last_query_id() | +-----------------+ | Not Available | +-----------------+ 1 row in set (0.08 sec) mysql> select LAST_QUERY_ID(); +-----------------------------------+ | last_query_id() | +-----------------------------------+ | e133f2641e0a411c-b73f1f6c67bedcf9 | +-----------------------------------+ 1 row in set (0.01 sec)
1 parent 0ff5909 commit fc338ad

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
@@ -261,6 +261,7 @@
261261
import org.apache.doris.nereids.trees.expressions.functions.scalar.L1Distance;
262262
import org.apache.doris.nereids.trees.expressions.functions.scalar.L2Distance;
263263
import org.apache.doris.nereids.trees.expressions.functions.scalar.LastDay;
264+
import org.apache.doris.nereids.trees.expressions.functions.scalar.LastQueryId;
264265
import org.apache.doris.nereids.trees.expressions.functions.scalar.Least;
265266
import org.apache.doris.nereids.trees.expressions.functions.scalar.Left;
266267
import org.apache.doris.nereids.trees.expressions.functions.scalar.Length;
@@ -928,7 +929,8 @@ public class BuiltinScalarFunctions implements FunctionHelper {
928929
scalar(YearsDiff.class, "years_diff"),
929930
scalar(YearsSub.class, "years_sub"),
930931
scalar(MultiMatch.class, "multi_match"),
931-
scalar(SessionUser.class, "session_user"));
932+
scalar(SessionUser.class, "session_user"),
933+
scalar(LastQueryId.class, "last_query_id"));
932934

933935
public static final BuiltinScalarFunctions INSTANCE = new BuiltinScalarFunctions();
934936

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.SessionUser;
6769
import org.apache.doris.nereids.trees.expressions.functions.scalar.User;
@@ -84,6 +86,7 @@
8486
import org.apache.doris.nereids.util.ExpressionUtils;
8587
import org.apache.doris.qe.ConnectContext;
8688
import org.apache.doris.qe.GlobalVariable;
89+
import org.apache.doris.thrift.TUniqueId;
8790

8891
import com.google.common.base.Preconditions;
8992
import com.google.common.base.Strings;
@@ -166,7 +169,8 @@ public List<ExpressionPatternMatcher<? extends Expression>> buildRules() {
166169
matches(Array.class, this::visitArray),
167170
matches(Date.class, this::visitDate),
168171
matches(Version.class, this::visitVersion),
169-
matches(SessionUser.class, this::visitSessionUser)
172+
matches(SessionUser.class, this::visitSessionUser),
173+
matches(LastQueryId.class, this::visitLastQueryId)
170174
);
171175
}
172176

@@ -334,6 +338,16 @@ public Expression visitSessionUser(SessionUser user, ExpressionRewriteContext co
334338
return new VarcharLiteral(res);
335339
}
336340

341+
@Override
342+
public Expression visitLastQueryId(LastQueryId queryId, ExpressionRewriteContext context) {
343+
String res = "Not Available";
344+
TUniqueId id = context.cascadesContext.getConnectContext().getLastQueryId();
345+
if (id != null) {
346+
res = DebugUtil.printId(id);
347+
}
348+
return new VarcharLiteral(res);
349+
}
350+
337351
@Override
338352
public Expression visitConnectionId(ConnectionId connectionId, ExpressionRewriteContext context) {
339353
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
@@ -264,6 +264,7 @@
264264
import org.apache.doris.nereids.trees.expressions.functions.scalar.L1Distance;
265265
import org.apache.doris.nereids.trees.expressions.functions.scalar.L2Distance;
266266
import org.apache.doris.nereids.trees.expressions.functions.scalar.LastDay;
267+
import org.apache.doris.nereids.trees.expressions.functions.scalar.LastQueryId;
267268
import org.apache.doris.nereids.trees.expressions.functions.scalar.Least;
268269
import org.apache.doris.nereids.trees.expressions.functions.scalar.Left;
269270
import org.apache.doris.nereids.trees.expressions.functions.scalar.Length;
@@ -2212,4 +2213,8 @@ default R visitStructElement(StructElement structElement, C context) {
22122213
default R visitMultiMatch(MultiMatch multiMatch, C context) {
22132214
return visitScalarFunction(multiMatch, context);
22142215
}
2216+
2217+
default R visitLastQueryId(LastQueryId queryId, C context) {
2218+
return visitScalarFunction(queryId, context);
2219+
}
22152220
}

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
@@ -122,6 +122,7 @@ public enum ConnectType {
122122
protected volatile TUniqueId queryId = null;
123123
protected volatile AtomicInteger instanceIdGenerator = new AtomicInteger();
124124
protected volatile String traceId;
125+
protected volatile TUniqueId lastQueryId = null;
125126
// id for this connection
126127
protected volatile int connectionId;
127128
// Timestamp when the connection is make
@@ -866,6 +867,9 @@ public void setKilled() {
866867
}
867868

868869
public void setQueryId(TUniqueId queryId) {
870+
if (this.queryId != null) {
871+
this.lastQueryId = this.queryId.deepCopy();
872+
}
869873
this.queryId = queryId;
870874
if (connectScheduler != null && !Strings.isNullOrEmpty(traceId)) {
871875
connectScheduler.putTraceId2QueryId(traceId, queryId);
@@ -884,6 +888,10 @@ public TUniqueId queryId() {
884888
return queryId;
885889
}
886890

891+
public TUniqueId getLastQueryId() {
892+
return lastQueryId;
893+
}
894+
887895
public TUniqueId nextInstanceId() {
888896
return new TUniqueId(queryId.hi, queryId.lo + instanceIdGenerator.incrementAndGet());
889897
}

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

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

4749
// INFORMATION_SCHEMA
4850
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)