GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — [Enhancement] support where/order/limit in show stmt (#68834) · APIJSON/starrocks@62dafc7

File tree

Expand file treeCollapse file tree
Open diff view settings
Filter options
  • fe
    • fe-core/src
      • main/java/com/starrocks
        • qe
          • ShowExecutor.java
          • ShowResultSet.java
        • sql
          • analyzer
            • ShowStmtAnalyzer.java
          • ast
            • ShowAnalyzeJobStmt.java
            • ShowAnalyzeStatusStmt.java
            • ShowBasicStatsMetaStmt.java
            • ShowHistogramStatsMetaStmt.java
            • ShowMultiColumnStatsMetaStmt.java
          • parser
            • AstBuilder.java
      • test/java/com/starrocks/sql/plan
        • ShowStmtPredicateTest.java
    • fe-grammar/src/main/antlr/com/starrocks/grammar
      • StarRocks.g4
    • fe-parser/src/main/java/com/starrocks/sql/ast
      • ShowProcedureStmt.java
      • ShowStmt.java
Expand file treeCollapse file tree
Open diff view settings
Collapse file

‎fe/fe-core/src/main/java/com/starrocks/qe/ShowExecutor.java‎

Copy file name to clipboardExpand all lines: fe/fe-core/src/main/java/com/starrocks/qe/ShowExecutor.java
+81-3Lines changed: 81 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,6 @@
234234
import com.starrocks.sql.ast.expression.ExprToSql;
235235
import com.starrocks.sql.ast.expression.LikePredicate;
236236
import com.starrocks.sql.ast.expression.LimitElement;
237-
import com.starrocks.sql.ast.expression.Predicate;
238237
import com.starrocks.sql.ast.expression.SlotRef;
239238
import com.starrocks.sql.ast.expression.StringLiteral;
240239
import com.starrocks.sql.ast.group.ShowCreateGroupProviderStmt;
@@ -248,7 +247,12 @@
248247
import com.starrocks.sql.ast.warehouse.ShowNodesStmt;
249248
import com.starrocks.sql.ast.warehouse.ShowWarehousesStmt;
250249
import com.starrocks.sql.common.MetaUtils;
250+
import com.starrocks.sql.common.UnsupportedException;
251+
import com.starrocks.sql.optimizer.operator.scalar.ConstantOperator;
252+
import com.starrocks.sql.optimizer.operator.scalar.ScalarOperator;
253+
import com.starrocks.sql.optimizer.rewrite.ScalarOperatorRewriter;
251254
import com.starrocks.sql.optimizer.rule.transformation.materialization.MvUtils;
255+
import com.starrocks.sql.optimizer.transformer.SqlToScalarOperatorTranslator;
252256
import com.starrocks.sql.spm.SPMStmtExecutor;
253257
import com.starrocks.statistic.AnalyzeJob;
254258
import com.starrocks.statistic.AnalyzeStatus;
@@ -299,6 +303,7 @@
299303
import java.util.concurrent.TimeUnit;
300304
import java.util.concurrent.atomic.AtomicBoolean;
301305
import java.util.stream.Collectors;
306+
import java.util.stream.Stream;
302307

303308
// Execute one show statement.
304309
public class ShowExecutor {
@@ -312,7 +317,80 @@ public ShowExecutor(ShowExecutorVisitor showExecutorVisitor) {
312317
}
313318

314319
public static ShowResultSet execute(ShowStmt statement, ConnectContext context) {
315-
return GlobalStateMgr.getCurrentState().getShowExecutor().showExecutorVisitor.visit(statement, context);
320+
ShowResultSet result = GlobalStateMgr.getCurrentState().getShowExecutor().showExecutorVisitor.visit(statement, context);
321+
List<List<String>> datas = doPredicate(statement, result);
322+
datas = doOrderByLimit(statement, datas);
323+
result.setResultRows(datas);
324+
return result;
325+
}
326+
327+
private static List<List<String>> doOrderByLimit(ShowStmt statement, List<List<String>> datas) {
328+
if (!statement.isSelfOrderBy() && CollectionUtils.isNotEmpty(statement.getOrderByPairs())) {
329+
OrderByPair[] orderByPairArr = statement.getOrderByPairs().toArray(new OrderByPair[0]);
330+
datas.sort((row1, row2) -> {
331+
for (OrderByPair pair : orderByPairArr) {
332+
int index = pair.getIndex();
333+
if (index >= row1.size() || index >= row2.size()) {
334+
continue;
335+
}
336+
String val1 = row1.get(index);
337+
String val2 = row2.get(index);
338+
339+
int cmp;
340+
try {
341+
double d1 = Double.parseDouble(val1);
342+
double d2 = Double.parseDouble(val2);
343+
cmp = Double.compare(d1, d2);
344+
} catch (NumberFormatException e) {
345+
cmp = val1.compareTo(val2);
346+
}
347+
if (cmp != 0) {
348+
return pair.isDesc() ? -cmp : cmp;
349+
}
350+
}
351+
return 0;
352+
});
353+
}
354+
if (!statement.isSelfLimit() && statement.getLimitElement() != null) {
355+
LimitElement le = statement.getLimitElement();
356+
Stream<List<String>> stream = datas.stream();
357+
if (le.hasOffset()) {
358+
stream = stream.skip(le.getOffset());
359+
}
360+
if (le.hasLimit()) {
361+
stream = stream.limit(le.getLimit());
362+
}
363+
datas = stream.collect(Collectors.toList());
364+
}
365+
return datas;
366+
}
367+
368+
private static List<List<String>> doPredicate(ShowStmt statement, ShowResultSet result) {
369+
if (statement.isSelfPredicate() || statement.getPredicate() == null) {
370+
return result.getResultRows();
371+
}
372+
// build columns
373+
List<List<String>> datas = Lists.newArrayList();
374+
Map<String, ScalarOperator> valuesMappings = Maps.newHashMap();
375+
for (List<String> rows : result.getResultRows()) {
376+
valuesMappings.clear();
377+
for (int index = 0; index < result.getMetaData().getColumns().size(); index++) {
378+
Column c = result.getMetaData().getColumn(index);
379+
valuesMappings.put(c.getName().toLowerCase(), ConstantOperator.createVarchar(rows.get(index)));
380+
}
381+
ScalarOperator p = SqlToScalarOperatorTranslator.translateWithSlotRef(statement.getPredicate(),
382+
slotRef -> valuesMappings.get(slotRef.getColumnName().toLowerCase()));
383+
ScalarOperatorRewriter re = new ScalarOperatorRewriter();
384+
ScalarOperator r = re.rewrite(p, ScalarOperatorRewriter.DEFAULT_REWRITE_RULES);
385+
386+
if (!r.isConstantRef()) {
387+
throw UnsupportedException.unsupportedException(
388+
"doesn't support predicate: " + ExprToSql.toMySql(statement.getPredicate()));
389+
} else if (r.isConstantTrue()) {
390+
datas.add(rows);
391+
}
392+
}
393+
return datas;
316394
}
317395

318396
public static class ShowExecutorVisitor implements AstVisitorExtendInterface<ShowResultSet, ConnectContext> {
@@ -3090,7 +3168,7 @@ public ShowResultSet visitShowNodesStatement(ShowNodesStmt statement, ConnectCon
30903168
private List<List<String>> doPredicate(ShowStmt showStmt,
30913169
ShowResultSetMetaData showResultSetMetaData,
30923170
List<List<String>> rows) {
3093-
Predicate predicate = showStmt.getPredicate();
3171+
Expr predicate = showStmt.getPredicate();
30943172
if (predicate == null) {
30953173
return rows;
30963174
}
Collapse file

‎fe/fe-core/src/main/java/com/starrocks/qe/ShowResultSet.java‎

Copy file name to clipboardExpand all lines: fe/fe-core/src/main/java/com/starrocks/qe/ShowResultSet.java
+4Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,10 @@ public boolean next() {
9191
return true;
9292
}
9393

94+
public void setResultRows(List<List<String>> resultRows) {
95+
this.resultRows = resultRows;
96+
}
97+
9498
public List<List<String>> getResultRows() {
9599
return resultRows;
96100
}
Collapse file

‎fe/fe-core/src/main/java/com/starrocks/sql/analyzer/ShowStmtAnalyzer.java‎

Copy file name to clipboardExpand all lines: fe/fe-core/src/main/java/com/starrocks/sql/analyzer/ShowStmtAnalyzer.java
+43-3Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,6 @@
8383
import com.starrocks.sql.ast.expression.ExprCastFunction;
8484
import com.starrocks.sql.ast.expression.ExprToSql;
8585
import com.starrocks.sql.ast.expression.LikePredicate;
86-
import com.starrocks.sql.ast.expression.Predicate;
8786
import com.starrocks.sql.ast.expression.SlotRef;
8887
import com.starrocks.sql.ast.expression.StringLiteral;
8988
import com.starrocks.sql.ast.spm.ShowBaselinePlanStmt;
@@ -112,6 +111,7 @@ static class ShowStmtAnalyzerVisitor implements AstVisitorExtendInterface<Void,
112111
private static final Logger LOGGER = LoggerFactory.getLogger(ShowStmtAnalyzerVisitor.class);
113112

114113
public void analyze(ShowStmt statement, ConnectContext session) {
114+
analyzeShowPredicateClause(statement, session);
115115
analyzeShowPredicate(statement);
116116
visit(statement, session);
117117
}
@@ -546,8 +546,8 @@ public Void visitShowProcStmt(ShowProcStmt node, ConnectContext context) {
546546
}
547547

548548
private void analyzeShowPredicate(ShowStmt showStmt) {
549-
Predicate predicate = showStmt.getPredicate();
550-
if (predicate == null) {
549+
Expr predicate = showStmt.getPredicate();
550+
if (!showStmt.isSelfPredicate() || predicate == null) {
551551
return;
552552
}
553553

@@ -575,6 +575,46 @@ private void analyzeShowPredicate(ShowStmt showStmt) {
575575
}
576576
}
577577

578+
private void analyzeShowPredicateClause(ShowStmt showStmt, ConnectContext context) {
579+
Expr predicate = showStmt.getPredicate();
580+
if (showStmt.isSelfPredicate() || predicate == null) {
581+
return;
582+
}
583+
584+
// check where columns
585+
ShowResultMetaFactory factory = new ShowResultMetaFactory();
586+
ShowResultSetMetaData meta = factory.getMetadata(showStmt);
587+
ExpressionAnalyzer.analyzeExpressionResolveSlot(showStmt.getPredicate(), context, slotRef -> {
588+
int index = meta.getColumnIdx(slotRef.getColumnName().toLowerCase());
589+
slotRef.setType(meta.getColumn(index).getType());
590+
});
591+
592+
// check order by columns
593+
List<OrderByElement> orderByElements = showStmt.getOrderByElements();
594+
if (!showStmt.isSelfOrderBy() && orderByElements != null) {
595+
List<OrderByPair> orderByPairs = new ArrayList<>();
596+
for (OrderByElement orderByElement : orderByElements) {
597+
if (!(orderByElement.getExpr() instanceof SlotRef)) {
598+
ErrorReport.reportSemanticException(ErrorCode.ERR_COMMON_ERROR, "Show stmt only support order by column");
599+
}
600+
SlotRef slotRef = (SlotRef) orderByElement.getExpr();
601+
int index = meta.getColumnIdx(slotRef.getColumnName().toLowerCase());
602+
orderByPairs.add(new OrderByPair(index, orderByElement.getIsAsc()));
603+
}
604+
showStmt.setOrderByPairs(orderByPairs);
605+
}
606+
// check limit
607+
if (!showStmt.isSelfLimit() && showStmt.getLimitElement() != null) {
608+
if (!showStmt.getLimitElement().getLimitExpr().isConstant()) {
609+
throw new SemanticException("Limit expr must be constant");
610+
}
611+
if (!showStmt.getLimitElement().getOffsetExpr().isConstant()) {
612+
throw new SemanticException("Offset expr must be constant");
613+
}
614+
}
615+
}
616+
617+
578618
@Override
579619
public Void visitShowPartitionsStatement(ShowPartitionsStmt statement, ConnectContext context) {
580620
TableRef tableRef = AnalyzerUtils.normalizedTableRef(statement.getTableRef(), context);
Collapse file

‎fe/fe-core/src/main/java/com/starrocks/sql/ast/ShowAnalyzeJobStmt.java‎

Copy file name to clipboardExpand all lines: fe/fe-core/src/main/java/com/starrocks/sql/ast/ShowAnalyzeJobStmt.java
+2-2Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@
2222
import com.starrocks.qe.ConnectContext;
2323
import com.starrocks.server.GlobalStateMgr;
2424
import com.starrocks.sql.analyzer.Authorizer;
25+
import com.starrocks.sql.ast.expression.Expr;
2526
import com.starrocks.sql.ast.expression.LimitElement;
26-
import com.starrocks.sql.ast.expression.Predicate;
2727
import com.starrocks.sql.parser.NodePosition;
2828
import com.starrocks.statistic.AnalyzeJob;
2929

@@ -33,7 +33,7 @@
3333

3434
public class ShowAnalyzeJobStmt extends ShowStmt {
3535

36-
public ShowAnalyzeJobStmt(Predicate predicate, List<OrderByElement> orderByElements,
36+
public ShowAnalyzeJobStmt(Expr predicate, List<OrderByElement> orderByElements,
3737
LimitElement limitElement, NodePosition pos) {
3838
super(pos);
3939
this.predicate = predicate;
Collapse file

‎fe/fe-core/src/main/java/com/starrocks/sql/ast/ShowAnalyzeStatusStmt.java‎

Copy file name to clipboardExpand all lines: fe/fe-core/src/main/java/com/starrocks/sql/ast/ShowAnalyzeStatusStmt.java
+2-2Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@
2222
import com.starrocks.server.GlobalStateMgr;
2323
import com.starrocks.sql.analyzer.Authorizer;
2424
import com.starrocks.sql.analyzer.SemanticException;
25+
import com.starrocks.sql.ast.expression.Expr;
2526
import com.starrocks.sql.ast.expression.LimitElement;
26-
import com.starrocks.sql.ast.expression.Predicate;
2727
import com.starrocks.sql.parser.NodePosition;
2828
import com.starrocks.statistic.AnalyzeStatus;
2929
import com.starrocks.statistic.StatisticUtils;
@@ -37,7 +37,7 @@
3737
public class ShowAnalyzeStatusStmt extends ShowStmt {
3838
private static final Logger LOG = LogManager.getLogger(ShowAnalyzeStatusStmt.class);
3939

40-
public ShowAnalyzeStatusStmt(Predicate predicate, List<OrderByElement> orderByElements,
40+
public ShowAnalyzeStatusStmt(Expr predicate, List<OrderByElement> orderByElements,
4141
LimitElement limitElement, NodePosition pos) {
4242
super(pos);
4343
this.predicate = predicate;
Collapse file

‎fe/fe-core/src/main/java/com/starrocks/sql/ast/ShowBasicStatsMetaStmt.java‎

Copy file name to clipboardExpand all lines: fe/fe-core/src/main/java/com/starrocks/sql/ast/ShowBasicStatsMetaStmt.java
+2-2Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,15 @@
1414

1515
package com.starrocks.sql.ast;
1616

17+
import com.starrocks.sql.ast.expression.Expr;
1718
import com.starrocks.sql.ast.expression.LimitElement;
18-
import com.starrocks.sql.ast.expression.Predicate;
1919
import com.starrocks.sql.parser.NodePosition;
2020

2121
import java.util.List;
2222

2323
public class ShowBasicStatsMetaStmt extends ShowStmt {
2424

25-
public ShowBasicStatsMetaStmt(Predicate predicate, List<OrderByElement> orderByElements,
25+
public ShowBasicStatsMetaStmt(Expr predicate, List<OrderByElement> orderByElements,
2626
LimitElement limitElement, NodePosition pos) {
2727
super(pos);
2828
this.predicate = predicate;
Collapse file

‎fe/fe-core/src/main/java/com/starrocks/sql/ast/ShowHistogramStatsMetaStmt.java‎

Copy file name to clipboardExpand all lines: fe/fe-core/src/main/java/com/starrocks/sql/ast/ShowHistogramStatsMetaStmt.java
+2-2Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,15 @@
1414

1515
package com.starrocks.sql.ast;
1616

17+
import com.starrocks.sql.ast.expression.Expr;
1718
import com.starrocks.sql.ast.expression.LimitElement;
18-
import com.starrocks.sql.ast.expression.Predicate;
1919
import com.starrocks.sql.parser.NodePosition;
2020

2121
import java.util.List;
2222

2323
public class ShowHistogramStatsMetaStmt extends ShowStmt {
2424

25-
public ShowHistogramStatsMetaStmt(Predicate predicate, List<OrderByElement> orderByElements,
25+
public ShowHistogramStatsMetaStmt(Expr predicate, List<OrderByElement> orderByElements,
2626
LimitElement limitElement, NodePosition pos) {
2727
super(pos);
2828
this.predicate = predicate;
Collapse file

‎fe/fe-core/src/main/java/com/starrocks/sql/ast/ShowMultiColumnStatsMetaStmt.java‎

Copy file name to clipboardExpand all lines: fe/fe-core/src/main/java/com/starrocks/sql/ast/ShowMultiColumnStatsMetaStmt.java
+3-3Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,15 @@
1414

1515
package com.starrocks.sql.ast;
1616

17+
import com.starrocks.sql.ast.expression.Expr;
1718
import com.starrocks.sql.ast.expression.LimitElement;
18-
import com.starrocks.sql.ast.expression.Predicate;
1919
import com.starrocks.sql.parser.NodePosition;
2020

2121
import java.util.List;
2222

2323
public class ShowMultiColumnStatsMetaStmt extends ShowStmt {
24-
public ShowMultiColumnStatsMetaStmt(Predicate predicate, List<OrderByElement> orderByElements,
25-
LimitElement limitElement, NodePosition pos) {
24+
public ShowMultiColumnStatsMetaStmt(Expr predicate, List<OrderByElement> orderByElements,
25+
LimitElement limitElement, NodePosition pos) {
2626
super(pos);
2727
this.predicate = predicate;
2828
this.limitElement = limitElement;

0 commit comments

Comments
0 (0)
You are visitor 01402520 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.