This is an automated email from the ASF dual-hosted git repository.
morrysnow pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new 256e16ed180 [Fix](nereids) add backquote and qualifier to udf, column,
column alias and table alias when create view (#37237)
256e16ed180 is described below
commit 256e16ed18076db93c1ec308e4fa769d05c3d8f3
Author: feiniaofeiafei <[email protected]>
AuthorDate: Tue Jul 16 12:17:07 2024 +0800
[Fix](nereids) add backquote and qualifier to udf, column, column alias and
table alias when create view (#37237)
In the create view statement, the database actually saves a SQL string.
In the previous implementation of nereids create view, the database name
qualifier was not added to the UDF function used in SQL. This will cause
errors when switching the database to use view. This pr adds database
restrictions to udf. For example:
```sql
select udf_function(a)
```
will be converted to
```sql
select `db`.`udf_function`(a)
```
At the same time, this PR also adds backquote to column and alias.
---------
Co-authored-by: feiniaofeiafei <[email protected]>
---
.../apache/doris/nereids/analyzer/MappingSlot.java | 8 +
.../doris/nereids/analyzer/UnboundFunction.java | 29 ++-
.../doris/nereids/analyzer/UnboundRelation.java | 6 +
.../apache/doris/nereids/analyzer/UnboundSlot.java | 16 +-
.../apache/doris/nereids/analyzer/UnboundStar.java | 4 +
.../doris/nereids/parser/LogicalPlanBuilder.java | 48 ++---
.../parser/LogicalPlanBuilderForCreateView.java | 209 +++++++++++++++++++++
.../parser/LogicalPlanBuilderForSyncMv.java | 4 -
.../apache/doris/nereids/parser/NereidsParser.java | 12 +-
.../nereids/rules/analysis/BindExpression.java | 6 +-
.../nereids/rules/analysis/ExpressionAnalyzer.java | 38 +++-
.../doris/nereids/trees/expressions/Alias.java | 2 +-
.../trees/expressions/ArrayItemReference.java | 6 +
.../trees/expressions/DefaultValueSlot.java | 9 +-
.../trees/expressions/MarkJoinSlotReference.java | 6 +
.../doris/nereids/trees/expressions/Slot.java | 16 +-
.../nereids/trees/expressions/SlotReference.java | 30 ++-
.../trees/expressions/VirtualSlotReference.java | 6 +
.../trees/plans/commands/info/AlterViewInfo.java | 10 +-
.../trees/plans/commands/info/BaseViewInfo.java | 149 ++++++++++++++-
.../trees/plans/commands/info/CreateViewInfo.java | 10 +-
.../data/ddl_p0/test_alter_view_nereids.out | 2 +-
regression-test/data/ddl_p0/test_create_view.out | 2 +-
.../data/ddl_p0/test_create_view_nereids.out | 149 ++++++++++++++-
.../show_p0/test_show_create_table_and_views.out | 2 +-
.../test_show_create_table_and_views_nereids.out | 2 +-
.../suites/ddl_p0/test_create_view.groovy | 1 +
.../suites/ddl_p0/test_create_view_nereids.groovy | 113 +++++++++++
.../suites/javaudf_p0/test_javaudf_date.groovy | 22 +--
.../test_show_create_table_and_views.groovy | 1 +
30 files changed, 795 insertions(+), 123 deletions(-)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/MappingSlot.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/MappingSlot.java
index d4f1e18111f..c7a020fd2ab 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/MappingSlot.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/MappingSlot.java
@@ -17,6 +17,7 @@
package org.apache.doris.nereids.analyzer;
+import org.apache.doris.common.Pair;
import org.apache.doris.nereids.exceptions.UnboundException;
import org.apache.doris.nereids.trees.expressions.ExprId;
import org.apache.doris.nereids.trees.expressions.Expression;
@@ -25,6 +26,7 @@ import
org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
import org.apache.doris.nereids.types.DataType;
import java.util.List;
+import java.util.Optional;
/**
* MappingSlot.
@@ -36,6 +38,7 @@ public class MappingSlot extends Slot {
private final Expression mappingExpression;
public MappingSlot(Slot slot, Expression mappingExpression) {
+ super(Optional.empty());
this.slot = slot;
this.mappingExpression = mappingExpression;
}
@@ -117,4 +120,9 @@ public class MappingSlot extends Slot {
public Slot withQualifier(List<String> qualifier) {
return this;
}
+
+ @Override
+ public Slot withIndexInSql(Pair<Integer, Integer> index) {
+ return this;
+ }
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundFunction.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundFunction.java
index 41dac0da5a5..a53917f08cd 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundFunction.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundFunction.java
@@ -17,6 +17,7 @@
package org.apache.doris.nereids.analyzer;
+import org.apache.doris.common.Pair;
import org.apache.doris.nereids.exceptions.UnboundException;
import org.apache.doris.nereids.trees.expressions.Expression;
import org.apache.doris.nereids.trees.expressions.functions.Function;
@@ -37,7 +38,8 @@ import java.util.stream.Collectors;
public class UnboundFunction extends Function implements Unbound,
PropagateNullable {
private final String dbName;
private final boolean isDistinct;
-
+ // for create view stmt, the start and end position of the function string
in original sql
+ private final Optional<Pair<Integer, Integer>> indexInSqlString;
// the start and end position of the function string in original sql
private final Optional<FunctionIndexInSql> functionIndexInSql;
@@ -67,27 +69,29 @@ public class UnboundFunction extends Function implements
Unbound, PropagateNulla
}
public UnboundFunction(String name, List<Expression> arguments) {
- this(null, name, false, arguments, Optional.empty());
+ this(null, name, false, arguments, Optional.empty(), Optional.empty());
}
public UnboundFunction(String dbName, String name, List<Expression>
arguments) {
- this(dbName, name, false, arguments, Optional.empty());
+ this(dbName, name, false, arguments, Optional.empty(),
Optional.empty());
}
public UnboundFunction(String name, boolean isDistinct, List<Expression>
arguments) {
- this(null, name, isDistinct, arguments, Optional.empty());
+ this(null, name, isDistinct, arguments, Optional.empty(),
Optional.empty());
}
public UnboundFunction(String dbName, String name, boolean isDistinct,
List<Expression> arguments) {
- this(dbName, name, isDistinct, arguments, Optional.empty());
+ this(dbName, name, isDistinct, arguments, Optional.empty(),
Optional.empty());
}
public UnboundFunction(String dbName, String name, boolean isDistinct,
- List<Expression> arguments, Optional<FunctionIndexInSql>
functionIndexInSql) {
+ List<Expression> arguments, Optional<FunctionIndexInSql>
functionIndexInSql,
+ Optional<Pair<Integer, Integer>> indexInSqlString) {
super(name, arguments);
this.dbName = dbName;
this.isDistinct = isDistinct;
this.functionIndexInSql = functionIndexInSql;
+ this.indexInSqlString = indexInSqlString;
}
@Override
@@ -131,7 +135,7 @@ public class UnboundFunction extends Function implements
Unbound, PropagateNulla
@Override
public UnboundFunction withChildren(List<Expression> children) {
- return new UnboundFunction(dbName, getName(), isDistinct, children);
+ return new UnboundFunction(dbName, getName(), isDistinct, children,
functionIndexInSql, indexInSqlString);
}
public Optional<FunctionIndexInSql> getFunctionIndexInSql() {
@@ -139,7 +143,7 @@ public class UnboundFunction extends Function implements
Unbound, PropagateNulla
}
public UnboundFunction withIndexInSqlString(Optional<FunctionIndexInSql>
functionIndexInSql) {
- return new UnboundFunction(dbName, getName(), isDistinct, children,
functionIndexInSql);
+ return new UnboundFunction(dbName, getName(), isDistinct, children,
functionIndexInSql, indexInSqlString);
}
@Override
@@ -161,4 +165,13 @@ public class UnboundFunction extends Function implements
Unbound, PropagateNulla
public int hashCode() {
return Objects.hash(getName(), isDistinct);
}
+
+ public UnboundFunction withIndexInSql(Pair<Integer, Integer> index) {
+ return new UnboundFunction(dbName, getName(), isDistinct, children,
functionIndexInSql,
+ Optional.ofNullable(index));
+ }
+
+ public Optional<Pair<Integer, Integer>> getIndexInSqlString() {
+ return indexInSqlString;
+ }
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundRelation.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundRelation.java
index 8180fd8518e..b8d821e1548 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundRelation.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundRelation.java
@@ -152,6 +152,12 @@ public class UnboundRelation extends LogicalRelation
implements Unbound, BlockFu
isTempPart, tabletIds, hints, tableSample, indexName, null,
indexInSqlString, tableSnapshot);
}
+ public UnboundRelation withIndexInSql(Pair<Integer, Integer> index) {
+ return new UnboundRelation(relationId, nameParts, groupExpression,
Optional.of(getLogicalProperties()),
+ partNames, isTempPart, tabletIds, hints, tableSample,
indexName, null,
+ Optional.of(index), tableSnapshot);
+ }
+
@Override
public UnboundRelation withRelationId(RelationId relationId) {
throw new UnboundException("should not call UnboundRelation's
withRelationId method");
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundSlot.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundSlot.java
index 8fa85966dc0..f8581256980 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundSlot.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundSlot.java
@@ -17,6 +17,7 @@
package org.apache.doris.nereids.analyzer;
+import org.apache.doris.common.Pair;
import org.apache.doris.nereids.trees.expressions.Slot;
import org.apache.doris.nereids.trees.expressions.functions.PropagateNullable;
import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
@@ -27,6 +28,7 @@ import com.google.common.collect.Lists;
import java.util.List;
import java.util.Objects;
+import java.util.Optional;
/**
* Slot has not been bound.
@@ -36,13 +38,23 @@ public class UnboundSlot extends Slot implements Unbound,
PropagateNullable {
private final List<String> nameParts;
public UnboundSlot(String... nameParts) {
- this(ImmutableList.copyOf(nameParts));
+ this(ImmutableList.copyOf(nameParts), Optional.empty());
}
public UnboundSlot(List<String> nameParts) {
+ this(ImmutableList.copyOf(nameParts), Optional.empty());
+ }
+
+ public UnboundSlot(List<String> nameParts, Optional<Pair<Integer,
Integer>> indexInSqlString) {
+ super(indexInSqlString);
this.nameParts =
ImmutableList.copyOf(Objects.requireNonNull(nameParts, "nameParts can not be
null"));
}
+ @Override
+ public Slot withIndexInSql(Pair<Integer, Integer> index) {
+ return new UnboundSlot(nameParts, Optional.ofNullable(index));
+ }
+
public List<String> getNameParts() {
return nameParts;
}
@@ -74,7 +86,7 @@ public class UnboundSlot extends Slot implements Unbound,
PropagateNullable {
}
public static UnboundSlot quoted(String name) {
- return new UnboundSlot(Lists.newArrayList(name));
+ return new UnboundSlot(Lists.newArrayList(name), Optional.empty());
}
@Override
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundStar.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundStar.java
index cf73f877d60..2875036eb07 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundStar.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundStar.java
@@ -94,4 +94,8 @@ public class UnboundStar extends NamedExpression implements
LeafExpression, Unbo
public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
return visitor.visitUnboundStar(this, context);
}
+
+ public UnboundStar withIndexInSql(Pair<Integer, Integer> index) {
+ return new UnboundStar(qualifier, Optional.ofNullable(index));
+ }
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
index e1caba182ae..5c404e936bd 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
@@ -502,8 +502,6 @@ import java.util.stream.Collectors;
*/
@SuppressWarnings({"OptionalUsedAsFieldOrParameterType",
"OptionalGetWithoutIsPresent"})
public class LogicalPlanBuilder extends DorisParserBaseVisitor<Object> {
- private final boolean forCreateView;
-
// Sort the parameters with token position to keep the order with original
placeholders
// in prepared statement.Otherwise, the order maybe broken
private final Map<Token, Placeholder> tokenPosToParameters =
Maps.newTreeMap((pos1, pos2) -> {
@@ -514,14 +512,6 @@ public class LogicalPlanBuilder extends
DorisParserBaseVisitor<Object> {
return pos1.getCharPositionInLine() - pos2.getCharPositionInLine();
});
- public LogicalPlanBuilder() {
- forCreateView = false;
- }
-
- public LogicalPlanBuilder(boolean forCreateView) {
- this.forCreateView = forCreateView;
- }
-
@SuppressWarnings("unchecked")
protected <T> T typedVisit(ParseTree ctx) {
return (T) ctx.accept(this);
@@ -866,9 +856,8 @@ public class LogicalPlanBuilder extends
DorisParserBaseVisitor<Object> {
@Override
public LogicalPlan visitAlterView(AlterViewContext ctx) {
List<String> nameParts = visitMultipartIdentifier(ctx.name);
- LogicalPlan logicalPlan = visitQuery(ctx.query());
String querySql = getOriginSql(ctx.query());
- AlterViewInfo info = new AlterViewInfo(new TableNameInfo(nameParts),
logicalPlan, querySql,
+ AlterViewInfo info = new AlterViewInfo(new TableNameInfo(nameParts),
querySql,
ctx.cols == null ? Lists.newArrayList() :
visitSimpleColumnDefs(ctx.cols));
return new AlterViewCommand(info);
}
@@ -1368,7 +1357,7 @@ public class LogicalPlanBuilder extends
DorisParserBaseVisitor<Object> {
/**
* Create an aliased table reference. This is typically used in FROM
clauses.
*/
- private LogicalPlan withTableAlias(LogicalPlan plan, TableAliasContext
ctx) {
+ protected LogicalPlan withTableAlias(LogicalPlan plan, TableAliasContext
ctx) {
if (ctx.strictIdentifier() == null) {
return plan;
}
@@ -1430,14 +1419,8 @@ public class LogicalPlanBuilder extends
DorisParserBaseVisitor<Object> {
}
}
- MultipartIdentifierContext identifier = ctx.multipartIdentifier();
TableSample tableSample = ctx.sample() == null ? null : (TableSample)
visit(ctx.sample());
- UnboundRelation relation = forCreateView ? new
UnboundRelation(StatementScopeIdGenerator.newRelationId(),
- tableId, partitionNames, isTempPart, tabletIdLists,
relationHints,
- Optional.ofNullable(tableSample), indexName, scanParams,
- Optional.of(Pair.of(identifier.start.getStartIndex(),
identifier.stop.getStopIndex())),
- Optional.ofNullable(tableSnapshot)) :
- new UnboundRelation(StatementScopeIdGenerator.newRelationId(),
+ UnboundRelation relation = new
UnboundRelation(StatementScopeIdGenerator.newRelationId(),
tableId, partitionNames, isTempPart, tabletIdLists,
relationHints,
Optional.ofNullable(tableSample), indexName,
scanParams, Optional.ofNullable(tableSnapshot));
LogicalPlan checkedRelation =
LogicalPlanBuilderAssistant.withCheckPolicy(relation);
@@ -1497,9 +1480,7 @@ public class LogicalPlanBuilder extends
DorisParserBaseVisitor<Object> {
} else {
target = ImmutableList.of();
}
- return forCreateView
- ? new UnboundStar(target,
Optional.of(Pair.of(ctx.start.getStartIndex(), ctx.stop.getStopIndex())))
- : new UnboundStar(target);
+ return new UnboundStar(target);
});
}
@@ -2293,7 +2274,8 @@ public class LogicalPlanBuilder extends
DorisParserBaseVisitor<Object> {
UnboundSlot unboundAttribute = (UnboundSlot) e;
List<String> nameParts =
Lists.newArrayList(unboundAttribute.getNameParts());
nameParts.add(ctx.fieldName.getText());
- return new UnboundSlot(nameParts);
+ UnboundSlot slot = new UnboundSlot(nameParts,
Optional.empty());
+ return slot;
} else {
// todo: base is an expression, may be not a table name.
throw new ParseException("Unsupported dereference expression:
" + ctx.getText(), ctx);
@@ -2505,7 +2487,7 @@ public class LogicalPlanBuilder extends
DorisParserBaseVisitor<Object> {
@Override
public EqualTo visitUpdateAssignment(UpdateAssignmentContext ctx) {
- return new EqualTo(new
UnboundSlot(visitMultipartIdentifier(ctx.multipartIdentifier())),
+ return new EqualTo(new
UnboundSlot(visitMultipartIdentifier(ctx.multipartIdentifier()),
Optional.empty()),
getExpression(ctx.expression()));
}
@@ -2552,10 +2534,9 @@ public class LogicalPlanBuilder extends
DorisParserBaseVisitor<Object> {
List<String> nameParts = visitMultipartIdentifier(ctx.name);
String comment = ctx.STRING_LITERAL() == null ? "" :
LogicalPlanBuilderAssistant.escapeBackSlash(
ctx.STRING_LITERAL().getText().substring(1,
ctx.STRING_LITERAL().getText().length() - 1));
- LogicalPlan logicalPlan = visitQuery(ctx.query());
String querySql = getOriginSql(ctx.query());
CreateViewInfo info = new CreateViewInfo(ctx.EXISTS() != null, new
TableNameInfo(nameParts),
- comment, logicalPlan, querySql,
+ comment, querySql,
ctx.cols == null ? Lists.newArrayList() :
visitSimpleColumnDefs(ctx.cols));
return new CreateViewCommand(info);
}
@@ -2995,7 +2976,7 @@ public class LogicalPlanBuilder extends
DorisParserBaseVisitor<Object> {
*
* <p>Note that query hints are ignored (both by the parser and the
builder).
*/
- private LogicalPlan withSelectQuerySpecification(
+ protected LogicalPlan withSelectQuerySpecification(
ParserRuleContext ctx,
LogicalPlan inputRelation,
SelectClauseContext selectClause,
@@ -3017,10 +2998,7 @@ public class LogicalPlanBuilder extends
DorisParserBaseVisitor<Object> {
if
(!expressions.stream().allMatch(UnboundSlot.class::isInstance)) {
throw new ParseException("only column name is
supported in except clause", selectColumnCtx);
}
- UnboundStar star = forCreateView ? new
UnboundStar(ImmutableList.of(),
-
Optional.of(Pair.of(selectColumnCtx.start.getStartIndex(),
- selectColumnCtx.stop.getStopIndex())))
- : new UnboundStar(ImmutableList.of());
+ UnboundStar star = new UnboundStar(ImmutableList.of());
project = new LogicalProject<>(ImmutableList.of(star),
expressions, isDistinct, aggregate);
} else {
List<NamedExpression> projects =
getNamedExpressions(selectColumnCtx.namedExpressionSeq());
@@ -3205,7 +3183,7 @@ public class LogicalPlanBuilder extends
DorisParserBaseVisitor<Object> {
.collect(ImmutableList.toImmutableList());
}
- private LogicalPlan withProjection(LogicalPlan input,
SelectColumnClauseContext selectCtx,
+ protected LogicalPlan withProjection(LogicalPlan input,
SelectColumnClauseContext selectCtx,
Optional<AggClauseContext> aggCtx, boolean isDistinct) {
return ParserUtils.withOrigin(selectCtx, () -> {
if (aggCtx.isPresent()) {
@@ -3221,9 +3199,7 @@ public class LogicalPlanBuilder extends
DorisParserBaseVisitor<Object> {
if
(!expressions.stream().allMatch(UnboundSlot.class::isInstance)) {
throw new ParseException("only column name is
supported in except clause", selectCtx);
}
- UnboundStar star = forCreateView ? new
UnboundStar(ImmutableList.of(),
-
Optional.of(Pair.of(selectCtx.start.getStartIndex(),
selectCtx.stop.getStopIndex()))) :
- new UnboundStar(ImmutableList.of());
+ UnboundStar star = new UnboundStar(ImmutableList.of());
return new LogicalProject<>(ImmutableList.of(star),
expressions, isDistinct, input);
} else {
List<NamedExpression> projects =
getNamedExpressions(selectCtx.namedExpressionSeq());
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilderForCreateView.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilderForCreateView.java
new file mode 100644
index 00000000000..3989a8f8988
--- /dev/null
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilderForCreateView.java
@@ -0,0 +1,209 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.doris.nereids.parser;
+
+import org.apache.doris.common.Pair;
+import org.apache.doris.nereids.DorisParser;
+import org.apache.doris.nereids.DorisParser.AggClauseContext;
+import org.apache.doris.nereids.DorisParser.AliasQueryContext;
+import org.apache.doris.nereids.DorisParser.ColumnReferenceContext;
+import org.apache.doris.nereids.DorisParser.DereferenceContext;
+import org.apache.doris.nereids.DorisParser.GroupingElementContext;
+import org.apache.doris.nereids.DorisParser.HavingClauseContext;
+import org.apache.doris.nereids.DorisParser.IdentifierContext;
+import org.apache.doris.nereids.DorisParser.LateralViewContext;
+import org.apache.doris.nereids.DorisParser.MultipartIdentifierContext;
+import org.apache.doris.nereids.DorisParser.NamedExpressionContext;
+import org.apache.doris.nereids.DorisParser.SelectClauseContext;
+import org.apache.doris.nereids.DorisParser.SelectColumnClauseContext;
+import org.apache.doris.nereids.DorisParser.StarContext;
+import org.apache.doris.nereids.DorisParser.TableAliasContext;
+import org.apache.doris.nereids.DorisParser.TableNameContext;
+import org.apache.doris.nereids.DorisParser.WhereClauseContext;
+import org.apache.doris.nereids.analyzer.UnboundFunction;
+import org.apache.doris.nereids.analyzer.UnboundRelation;
+import org.apache.doris.nereids.analyzer.UnboundSlot;
+import org.apache.doris.nereids.analyzer.UnboundStar;
+import org.apache.doris.nereids.trees.expressions.Expression;
+import org.apache.doris.nereids.trees.expressions.NamedExpression;
+import org.apache.doris.nereids.trees.plans.Plan;
+import org.apache.doris.nereids.trees.plans.logical.LogicalHaving;
+import org.apache.doris.nereids.trees.plans.logical.LogicalPlan;
+import org.apache.doris.nereids.trees.plans.logical.LogicalProject;
+import org.apache.doris.nereids.trees.plans.logical.LogicalSubQueryAlias;
+import org.apache.doris.nereids.util.Utils;
+import org.apache.doris.qe.ConnectContext;
+
+import com.google.common.collect.ImmutableList;
+import org.antlr.v4.runtime.ParserRuleContext;
+
+import java.util.Optional;
+
+/**LogicalPlanBuilderForCreateView*/
+public class LogicalPlanBuilderForCreateView extends LogicalPlanBuilder {
+ @Override
+ protected LogicalPlan withGenerate(LogicalPlan plan, LateralViewContext
ctx) {
+ ConnectContext.get().getStatementContext().addIndexInSqlToString(
+ Pair.of(ctx.tableName.start.getStartIndex(),
+ ctx.tableName.stop.getStopIndex()),
+
Utils.qualifiedNameWithBackquote(ImmutableList.of(ctx.tableName.getText())));
+ for (IdentifierContext colCtx : ctx.columnNames) {
+ ConnectContext.get().getStatementContext().addIndexInSqlToString(
+ Pair.of(colCtx.start.getStartIndex(),
+ colCtx.stop.getStopIndex()),
+
Utils.qualifiedNameWithBackquote(ImmutableList.of(colCtx.getText())));
+ }
+ return super.withGenerate(plan, ctx);
+ }
+
+ @Override
+ public LogicalSubQueryAlias<Plan> visitAliasQuery(AliasQueryContext ctx) {
+ ConnectContext.get().getStatementContext().addIndexInSqlToString(
+ Pair.of(ctx.identifier().start.getStartIndex(),
+ ctx.identifier().stop.getStopIndex()),
+
Utils.qualifiedNameWithBackquote(ImmutableList.of(ctx.identifier().getText())));
+ if (ctx.columnAliases() != null) {
+ for (IdentifierContext colCtx : ctx.columnAliases().identifier()) {
+
ConnectContext.get().getStatementContext().addIndexInSqlToString(
+ Pair.of(colCtx.start.getStartIndex(),
+ colCtx.stop.getStopIndex()),
+
Utils.qualifiedNameWithBackquote(ImmutableList.of(colCtx.getText())));
+ }
+ }
+ return super.visitAliasQuery(ctx);
+ }
+
+ @Override
+ protected LogicalPlan withSelectQuerySpecification(
+ ParserRuleContext ctx,
+ LogicalPlan inputRelation,
+ SelectClauseContext selectClause,
+ Optional<WhereClauseContext> whereClause,
+ Optional<AggClauseContext> aggClause,
+ Optional<HavingClauseContext> havingClause) {
+ LogicalPlan plan = super.withSelectQuerySpecification(ctx,
inputRelation, selectClause, whereClause,
+ aggClause, havingClause);
+ SelectColumnClauseContext selectColumnCtx =
selectClause.selectColumnClause();
+ if ((!aggClause.isPresent() || isRepeat(aggClause.get())) &&
havingClause.isPresent()
+ && selectColumnCtx.EXCEPT() != null
+ && plan instanceof LogicalHaving && plan.child(0) instanceof
LogicalProject) {
+ LogicalHaving<LogicalProject<Plan>> having = (LogicalHaving) plan;
+ LogicalProject<Plan> project = having.child();
+ UnboundStar star = (UnboundStar) project.getProjects().get(0);
+ star =
star.withIndexInSql(Pair.of(selectColumnCtx.start.getStartIndex(),
+ selectColumnCtx.stop.getStopIndex()));
+ project = project.withProjects(ImmutableList.of(star));
+ return (LogicalPlan) plan.withChildren(project);
+ } else {
+ return plan;
+ }
+ }
+
+ @Override
+ protected LogicalPlan withProjection(LogicalPlan input,
SelectColumnClauseContext selectCtx,
+ Optional<AggClauseContext> aggCtx, boolean isDistinct) {
+ LogicalPlan plan = super.withProjection(input, selectCtx, aggCtx,
isDistinct);
+ if (!aggCtx.isPresent() && selectCtx.EXCEPT() != null && plan
instanceof LogicalProject) {
+ LogicalProject<Plan> project = (LogicalProject) plan;
+ UnboundStar star = (UnboundStar) project.getProjects().get(0);
+ star =
star.withIndexInSql(Pair.of(selectCtx.start.getStartIndex(),
selectCtx.stop.getStopIndex()));
+ return project.withProjects(ImmutableList.of(star));
+ } else {
+ return plan;
+ }
+ }
+
+ @Override
+ protected LogicalPlan withTableAlias(LogicalPlan plan, TableAliasContext
ctx) {
+ if (ctx.strictIdentifier() == null) {
+ return plan;
+ }
+ String alias = ctx.strictIdentifier().getText();
+ ConnectContext.get().getStatementContext().addIndexInSqlToString(
+ Pair.of(ctx.strictIdentifier().start.getStartIndex(),
+ ctx.strictIdentifier().stop.getStopIndex()),
+ Utils.qualifiedNameWithBackquote(ImmutableList.of(alias)));
+ return super.withTableAlias(plan, ctx);
+ }
+
+ @Override
+ public LogicalPlan visitTableName(TableNameContext ctx) {
+ LogicalPlan plan = super.visitTableName(ctx);
+ MultipartIdentifierContext identifier = ctx.multipartIdentifier();
+ return (LogicalPlan) plan.rewriteDownShortCircuit(node -> {
+ if (node instanceof UnboundRelation) {
+ UnboundRelation relation = (UnboundRelation) node;
+ return
relation.withIndexInSql(Pair.of(identifier.start.getStartIndex(),
+ identifier.stop.getStopIndex()));
+ }
+ return node;
+ });
+ }
+
+ @Override
+ public Expression visitStar(StarContext ctx) {
+ Expression expr = super.visitStar(ctx);
+ UnboundStar star = (UnboundStar) expr;
+ return star.withIndexInSql(Pair.of(ctx.start.getStartIndex(),
ctx.stop.getStopIndex()));
+ }
+
+ @Override
+ public NamedExpression visitNamedExpression(NamedExpressionContext ctx) {
+ if (ctx.identifierOrText() != null) {
+ String alias = visitIdentifierOrText(ctx.identifierOrText());
+ ConnectContext.get().getStatementContext().addIndexInSqlToString(
+ Pair.of(ctx.identifierOrText().start.getStartIndex(),
+ ctx.identifierOrText().stop.getStopIndex()),
+ Utils.qualifiedNameWithBackquote(ImmutableList.of(alias)));
+ }
+ return super.visitNamedExpression(ctx);
+ }
+
+ @Override
+ public Expression
visitFunctionCallExpression(DorisParser.FunctionCallExpressionContext ctx) {
+ Expression expr = super.visitFunctionCallExpression(ctx);
+ if (expr instanceof UnboundFunction) {
+ UnboundFunction function = (UnboundFunction) expr;
+ function = function.withIndexInSql(Pair.of(
+ ctx.functionIdentifier().start.getStartIndex(),
+ ctx.functionIdentifier().stop.getStopIndex()));
+ return function;
+ } else {
+ return expr;
+ }
+ }
+
+ @Override
+ public Expression visitDereference(DereferenceContext ctx) {
+ UnboundSlot slot = (UnboundSlot) super.visitDereference(ctx);
+ return slot.withIndexInSql(Pair.of(ctx.start.getStartIndex(),
ctx.stop.getStopIndex()));
+ }
+
+ @Override
+ public Expression visitColumnReference(ColumnReferenceContext ctx) {
+ Expression expr = super.visitColumnReference(ctx);
+ UnboundSlot slot = (UnboundSlot) expr;
+ return slot.withIndexInSql(Pair.of(ctx.start.getStartIndex(),
ctx.stop.getStopIndex()));
+ }
+
+ private boolean isRepeat(AggClauseContext ctx) {
+ GroupingElementContext groupingElementContext = ctx.groupingElement();
+ return groupingElementContext.GROUPING() != null ||
groupingElementContext.CUBE() != null
+ || groupingElementContext.ROLLUP() != null;
+ }
+}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilderForSyncMv.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilderForSyncMv.java
index d198f9094e2..4cdf33f9ff7 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilderForSyncMv.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilderForSyncMv.java
@@ -49,10 +49,6 @@ import java.util.TreeMap;
public class LogicalPlanBuilderForSyncMv extends LogicalPlanBuilder {
private Optional<String> querySql;
- public LogicalPlanBuilderForSyncMv() {
- super(false);
- }
-
@Override
public Expression
visitFunctionCallExpression(DorisParser.FunctionCallExpressionContext ctx) {
Expression expression = super.visitFunctionCallExpression(ctx);
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/NereidsParser.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/NereidsParser.java
index 2d72eba8717..0cfea1e8eb7 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/NereidsParser.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/NereidsParser.java
@@ -278,15 +278,9 @@ public class NereidsParser {
}
public LogicalPlan parseForCreateView(String sql) {
- return parseForCreateViewInternal(sql, null,
DorisParser::singleStatement);
- }
-
- private <T> T parseForCreateViewInternal(String sql, @Nullable
LogicalPlanBuilder logicalPlanBuilder,
- Function<DorisParser, ParserRuleContext> parseFunction) {
- ParserRuleContext tree = toAst(sql, parseFunction);
- LogicalPlanBuilder realLogicalPlanBuilder = logicalPlanBuilder == null
- ? new LogicalPlanBuilder(true) : logicalPlanBuilder;
- return (T) realLogicalPlanBuilder.visit(tree);
+ ParserRuleContext tree = toAst(sql, DorisParser::singleStatement);
+ LogicalPlanBuilder realLogicalPlanBuilder = new
LogicalPlanBuilderForCreateView();
+ return (LogicalPlan) realLogicalPlanBuilder.visit(tree);
}
public Optional<String> parseForSyncMv(String sql) {
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindExpression.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindExpression.java
index c1080adf3b7..8a74d71917c 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindExpression.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindExpression.java
@@ -591,9 +591,9 @@ public class BindExpression implements AnalysisRuleFactory {
// for create view stmt expand star
List<Slot> slotsForLambda = slots;
UnboundStar unboundStar = (UnboundStar) expression;
- unboundStar.getIndexInSqlString().ifPresent(pair ->
- statementContext.addIndexInSqlToString(pair,
toSqlWithBackquote(slotsForLambda))
- );
+ unboundStar.getIndexInSqlString().ifPresent(pair -> {
+ statementContext.addIndexInSqlToString(pair,
toSqlWithBackquote(slotsForLambda));
+ });
}
}
return project.withProjects(boundProjections.build());
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/ExpressionAnalyzer.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/ExpressionAnalyzer.java
index b9f34b91bf0..fc9e1385b59 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/ExpressionAnalyzer.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/ExpressionAnalyzer.java
@@ -73,6 +73,7 @@ import
org.apache.doris.nereids.trees.expressions.functions.scalar.Nvl;
import
org.apache.doris.nereids.trees.expressions.functions.udf.AliasUdfBuilder;
import org.apache.doris.nereids.trees.expressions.functions.udf.JavaUdaf;
import org.apache.doris.nereids.trees.expressions.functions.udf.JavaUdf;
+import org.apache.doris.nereids.trees.expressions.functions.udf.UdfBuilder;
import org.apache.doris.nereids.trees.expressions.literal.BigIntLiteral;
import org.apache.doris.nereids.trees.expressions.literal.IntegerLikeLiteral;
import org.apache.doris.nereids.trees.expressions.literal.Literal;
@@ -378,7 +379,8 @@ public class ExpressionAnalyzer extends
SubExprAnalyzer<ExpressionRewriteContext
.build()
: (List) unboundFunction.getArguments();
- if (StringUtils.isEmpty(unboundFunction.getDbName())) {
+ String dbName = unboundFunction.getDbName();
+ if (StringUtils.isEmpty(dbName)) {
// we will change arithmetic function like add(), subtract(),
bitnot()
// to the corresponding objects rather than BoundFunction.
ArithmeticFunctionBinder functionBinder = new
ArithmeticFunctionBinder();
@@ -390,7 +392,16 @@ public class ExpressionAnalyzer extends
SubExprAnalyzer<ExpressionRewriteContext
String functionName = unboundFunction.getName();
FunctionBuilder builder = functionRegistry.findFunctionBuilder(
- unboundFunction.getDbName(), functionName, arguments);
+ dbName, functionName, arguments);
+ // for create view stmt
+ if (builder instanceof UdfBuilder) {
+ unboundFunction.getIndexInSqlString().ifPresent(index -> {
+
ConnectContext.get().getStatementContext().addIndexInSqlToString(index,
+ Utils.qualifiedNameWithBackquote(ImmutableList.of(null
== dbName
+ ? ConnectContext.get().getDatabase() : dbName,
functionName)));
+ });
+ }
+
Pair<? extends Expression, ? extends BoundFunction> buildResult =
builder.build(functionName, arguments);
Optional<SqlCacheContext> sqlCacheContext = Optional.empty();
if (wantToParseSqlFromSqlCache) {
@@ -716,27 +727,40 @@ public class ExpressionAnalyzer extends
SubExprAnalyzer<ExpressionRewriteContext
return !extractSlots.isEmpty() ? extractSlots : candidates;
}
+ private List<Slot> addSqlIndexInfo(List<Slot> slots,
Optional<Pair<Integer, Integer>> indexInSql) {
+ if (!indexInSql.isPresent()) {
+ return slots;
+ }
+ List<Slot> newSlots = new ArrayList<>();
+ for (Slot slot : slots) {
+ newSlots.add(slot.withIndexInSql(indexInSql.get()));
+ }
+ return newSlots;
+ }
+
/** bindSlotByScope */
public List<Slot> bindSlotByScope(UnboundSlot unboundSlot, Scope scope) {
List<String> nameParts = unboundSlot.getNameParts();
+ Optional<Pair<Integer, Integer>> idxInSql =
unboundSlot.getIndexInSqlString();
int namePartSize = nameParts.size();
switch (namePartSize) {
// column
case 1: {
- return bindSingleSlotByName(nameParts.get(0), scope);
+ return addSqlIndexInfo(bindSingleSlotByName(nameParts.get(0),
scope), idxInSql);
}
// table.column
case 2: {
- return bindSingleSlotByTable(nameParts.get(0),
nameParts.get(1), scope);
+ return addSqlIndexInfo(bindSingleSlotByTable(nameParts.get(0),
nameParts.get(1), scope), idxInSql);
}
// db.table.column
case 3: {
- return bindSingleSlotByDb(nameParts.get(0), nameParts.get(1),
nameParts.get(2), scope);
+ return addSqlIndexInfo(bindSingleSlotByDb(nameParts.get(0),
nameParts.get(1), nameParts.get(2), scope),
+ idxInSql);
}
// catalog.db.table.column
case 4: {
- return bindSingleSlotByCatalog(
- nameParts.get(0), nameParts.get(1), nameParts.get(2),
nameParts.get(3), scope);
+ return addSqlIndexInfo(bindSingleSlotByCatalog(
+ nameParts.get(0), nameParts.get(1), nameParts.get(2),
nameParts.get(3), scope), idxInSql);
}
default: {
throw new AnalysisException("Not supported name: " +
StringUtils.join(nameParts, "."));
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Alias.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Alias.java
index af9347a169b..6b31fc60f27 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Alias.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Alias.java
@@ -95,7 +95,7 @@ public class Alias extends NamedExpression implements
UnaryExpression {
internalName,
slotReference != null
? slotReference.getSubPath()
- : ImmutableList.of()
+ : ImmutableList.of(), Optional.empty()
);
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/ArrayItemReference.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/ArrayItemReference.java
index 26870bb92be..c54ad358561 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/ArrayItemReference.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/ArrayItemReference.java
@@ -17,6 +17,7 @@
package org.apache.doris.nereids.trees.expressions;
+import org.apache.doris.common.Pair;
import
org.apache.doris.nereids.trees.expressions.typecoercion.ExpectsInputTypes;
import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
import org.apache.doris.nereids.types.ArrayType;
@@ -166,6 +167,11 @@ public class ArrayItemReference extends NamedExpression
implements ExpectsInputT
return new ArrayItemSlot(exprId, name.get(), dataType, nullable);
}
+ @Override
+ public Slot withIndexInSql(Pair<Integer, Integer> index) {
+ return this;
+ }
+
@Override
public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
return visitor.visitArrayItemSlot(this, context);
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/DefaultValueSlot.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/DefaultValueSlot.java
index 6c65692dd5f..a66428dc982 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/DefaultValueSlot.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/DefaultValueSlot.java
@@ -17,18 +17,21 @@
package org.apache.doris.nereids.trees.expressions;
+import org.apache.doris.common.Pair;
import org.apache.doris.nereids.exceptions.UnboundException;
import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
import org.apache.doris.nereids.types.DataType;
import org.apache.doris.nereids.types.NullType;
+import java.util.Optional;
+
/**
* only use for insert into t values(DEFAULT, ...)
*/
public class DefaultValueSlot extends Slot {
public DefaultValueSlot() {
- super();
+ super(Optional.empty());
}
@Override
@@ -60,4 +63,8 @@ public class DefaultValueSlot extends Slot {
public String toString() {
return "DEFAULT_VALUE";
}
+
+ public Slot withIndexInSql(Pair<Integer, Integer> index) {
+ return this;
+ }
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/MarkJoinSlotReference.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/MarkJoinSlotReference.java
index bfbd24647e7..e840a32b7c6 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/MarkJoinSlotReference.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/MarkJoinSlotReference.java
@@ -17,6 +17,7 @@
package org.apache.doris.nereids.trees.expressions;
+import org.apache.doris.common.Pair;
import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
import org.apache.doris.nereids.types.BooleanType;
@@ -78,4 +79,9 @@ public class MarkJoinSlotReference extends SlotReference {
public SlotReference withName(String name) {
return new MarkJoinSlotReference(exprId, name, existsHasAgg);
}
+
+ @Override
+ public Slot withIndexInSql(Pair<Integer, Integer> index) {
+ return this;
+ }
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Slot.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Slot.java
index 678753d46d7..40cf360ab46 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Slot.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Slot.java
@@ -17,20 +17,26 @@
package org.apache.doris.nereids.trees.expressions;
+import org.apache.doris.common.Pair;
import org.apache.doris.nereids.trees.expressions.shape.LeafExpression;
import org.apache.doris.nereids.types.DataType;
import com.google.common.collect.ImmutableList;
import java.util.List;
+import java.util.Optional;
/**
* Abstract class for all slot in expression.
*/
public abstract class Slot extends NamedExpression implements LeafExpression {
+ // for create view, the start and end position of the sql substring
+ // (e.g. "col1", "t1.col1", "db1.t1.col1", "ctl1.db1.t1.col1")
+ protected final Optional<Pair<Integer, Integer>> indexInSqlString;
- protected Slot() {
+ protected Slot(Optional<Pair<Integer, Integer>> indexInSqlString) {
super(ImmutableList.of());
+ this.indexInSqlString = indexInSqlString;
}
@Override
@@ -61,4 +67,12 @@ public abstract class Slot extends NamedExpression
implements LeafExpression {
public String getInternalName() {
throw new RuntimeException("Do not implement");
}
+
+ public Slot withIndexInSql(Pair<Integer, Integer> index) {
+ throw new RuntimeException("Do not implement");
+ }
+
+ public Optional<Pair<Integer, Integer>> getIndexInSqlString() {
+ return indexInSqlString;
+ }
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/SlotReference.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/SlotReference.java
index 992d1ea6623..145d8dd29f7 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/SlotReference.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/SlotReference.java
@@ -19,6 +19,7 @@ package org.apache.doris.nereids.trees.expressions;
import org.apache.doris.catalog.Column;
import org.apache.doris.catalog.TableIf;
+import org.apache.doris.common.Pair;
import org.apache.doris.nereids.exceptions.UnboundException;
import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
import org.apache.doris.nereids.types.DataType;
@@ -89,7 +90,7 @@ public class SlotReference extends Slot {
List<String> qualifier, @Nullable TableIf table, @Nullable Column
column,
Optional<String> internalName, List<String> subColLabels) {
this(exprId, () -> name, dataType, nullable, qualifier, table, column,
- buildInternalName(() -> name, subColLabels, internalName),
subColLabels);
+ buildInternalName(() -> name, subColLabels, internalName),
subColLabels, Optional.empty());
}
/**
@@ -106,7 +107,9 @@ public class SlotReference extends Slot {
*/
public SlotReference(ExprId exprId, Supplier<String> name, DataType
dataType, boolean nullable,
List<String> qualifier, @Nullable TableIf table, @Nullable Column
column,
- Supplier<Optional<String>> internalName, List<String> subPath) {
+ Supplier<Optional<String>> internalName, List<String> subPath,
+ Optional<Pair<Integer, Integer>> indexInSql) {
+ super(indexInSql);
this.exprId = exprId;
this.name = name;
this.dataType = dataType;
@@ -132,7 +135,7 @@ public class SlotReference extends Slot {
DataType dataType = DataType.fromCatalogType(column.getType());
return new SlotReference(StatementScopeIdGenerator.newExprId(),
column::getName, dataType,
column.isAllowNull(), qualifier, table, column,
- () -> Optional.of(column.getName()), ImmutableList.of());
+ () -> Optional.of(column.getName()), ImmutableList.of(),
Optional.empty());
}
public static SlotReference fromColumn(TableIf table, Column column,
String name, List<String> qualifier) {
@@ -251,7 +254,7 @@ public class SlotReference extends Slot {
return this;
}
return new SlotReference(exprId, name, dataType, nullable,
- qualifier, table, column, internalName, subPath);
+ qualifier, table, column, internalName, subPath,
indexInSqlString);
}
@Override
@@ -260,12 +263,13 @@ public class SlotReference extends Slot {
return this;
}
return new SlotReference(exprId, name, dataType, nullable,
- qualifier, table, column, internalName, subPath);
+ qualifier, table, column, internalName, subPath,
indexInSqlString);
}
@Override
public SlotReference withQualifier(List<String> qualifier) {
- return new SlotReference(exprId, name, dataType, nullable, qualifier,
table, column, internalName, subPath);
+ return new SlotReference(exprId, name, dataType, nullable, qualifier,
table, column, internalName, subPath,
+ indexInSqlString);
}
@Override
@@ -274,17 +278,25 @@ public class SlotReference extends Slot {
return this;
}
return new SlotReference(
- exprId, () -> name, dataType, nullable, qualifier, table,
column, internalName, subPath);
+ exprId, () -> name, dataType, nullable, qualifier, table,
column, internalName, subPath,
+ indexInSqlString);
}
@Override
public SlotReference withExprId(ExprId exprId) {
- return new SlotReference(exprId, name, dataType, nullable, qualifier,
table, column, internalName, subPath);
+ return new SlotReference(exprId, name, dataType, nullable, qualifier,
table, column, internalName, subPath,
+ indexInSqlString);
}
public SlotReference withSubPath(List<String> subPath) {
return new SlotReference(exprId, name, dataType, !subPath.isEmpty() ||
nullable,
- qualifier, table, column, internalName, subPath);
+ qualifier, table, column, internalName, subPath,
indexInSqlString);
+ }
+
+ @Override
+ public Slot withIndexInSql(Pair<Integer, Integer> index) {
+ return new SlotReference(exprId, name, dataType, nullable, qualifier,
table, column, internalName, subPath,
+ Optional.ofNullable(index));
}
public boolean isVisible() {
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/VirtualSlotReference.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/VirtualSlotReference.java
index 77e9ae39c41..43f48537581 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/VirtualSlotReference.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/VirtualSlotReference.java
@@ -17,6 +17,7 @@
package org.apache.doris.nereids.trees.expressions;
+import org.apache.doris.common.Pair;
import
org.apache.doris.nereids.trees.expressions.functions.scalar.GroupingScalarFunction;
import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
import org.apache.doris.nereids.trees.plans.algebra.Repeat.GroupingSetShapes;
@@ -154,4 +155,9 @@ public class VirtualSlotReference extends SlotReference
implements SlotNotFromCh
return new VirtualSlotReference(exprId, name.get(), dataType,
nullable, qualifier,
originExpression, computeLongValueMethod);
}
+
+ @Override
+ public Slot withIndexInSql(Pair<Integer, Integer> index) {
+ return this;
+ }
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AlterViewInfo.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AlterViewInfo.java
index 30b0b4618a5..60ae767fedc 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AlterViewInfo.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AlterViewInfo.java
@@ -33,12 +33,9 @@ import org.apache.doris.common.util.Util;
import org.apache.doris.mysql.privilege.PrivPredicate;
import org.apache.doris.nereids.NereidsPlanner;
import org.apache.doris.nereids.analyzer.UnboundResultSink;
-import org.apache.doris.nereids.exceptions.AnalysisException;
import org.apache.doris.nereids.properties.PhysicalProperties;
import org.apache.doris.nereids.trees.expressions.Slot;
import
org.apache.doris.nereids.trees.plans.commands.ExplainCommand.ExplainLevel;
-import org.apache.doris.nereids.trees.plans.logical.LogicalFileSink;
-import org.apache.doris.nereids.trees.plans.logical.LogicalPlan;
import org.apache.doris.nereids.util.PlanUtils;
import org.apache.doris.qe.ConnectContext;
@@ -51,12 +48,9 @@ import java.util.Set;
/** AlterViewInfo */
public class AlterViewInfo extends BaseViewInfo {
/** constructor*/
- public AlterViewInfo(TableNameInfo viewName, LogicalPlan logicalQuery,
+ public AlterViewInfo(TableNameInfo viewName,
String querySql, List<SimpleColumnDefinition>
simpleColumnDefinitions) {
- super(viewName, logicalQuery, querySql, simpleColumnDefinitions);
- if (logicalQuery instanceof LogicalFileSink) {
- throw new AnalysisException("Not support OUTFILE clause in ALTER
VIEW statement");
- }
+ super(viewName, querySql, simpleColumnDefinitions);
}
/** init */
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/BaseViewInfo.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/BaseViewInfo.java
index 79ba6a5f695..79a4521309a 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/BaseViewInfo.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/BaseViewInfo.java
@@ -18,6 +18,7 @@
package org.apache.doris.nereids.trees.plans.commands.info;
import org.apache.doris.catalog.Column;
+import org.apache.doris.common.AnalysisException;
import org.apache.doris.common.ErrorCode;
import org.apache.doris.common.ErrorReport;
import org.apache.doris.common.Pair;
@@ -31,15 +32,33 @@ import org.apache.doris.nereids.analyzer.UnboundResultSink;
import org.apache.doris.nereids.jobs.executor.AbstractBatchJobExecutor;
import org.apache.doris.nereids.jobs.rewrite.RewriteJob;
import org.apache.doris.nereids.parser.NereidsParser;
+import org.apache.doris.nereids.properties.OrderKey;
import org.apache.doris.nereids.properties.PhysicalProperties;
import org.apache.doris.nereids.rules.analysis.AnalyzeCTE;
import org.apache.doris.nereids.rules.analysis.BindExpression;
import org.apache.doris.nereids.rules.analysis.BindRelation;
import org.apache.doris.nereids.rules.analysis.CheckPolicy;
import org.apache.doris.nereids.rules.analysis.EliminateLogicalSelectHint;
+import org.apache.doris.nereids.trees.expressions.Expression;
+import org.apache.doris.nereids.trees.expressions.NamedExpression;
import org.apache.doris.nereids.trees.expressions.Slot;
+import
org.apache.doris.nereids.trees.expressions.visitor.DefaultExpressionVisitor;
import org.apache.doris.nereids.trees.plans.Plan;
+import org.apache.doris.nereids.trees.plans.logical.LogicalAggregate;
+import org.apache.doris.nereids.trees.plans.logical.LogicalFileSink;
+import org.apache.doris.nereids.trees.plans.logical.LogicalFilter;
+import org.apache.doris.nereids.trees.plans.logical.LogicalGenerate;
+import org.apache.doris.nereids.trees.plans.logical.LogicalHaving;
+import org.apache.doris.nereids.trees.plans.logical.LogicalJoin;
import org.apache.doris.nereids.trees.plans.logical.LogicalPlan;
+import org.apache.doris.nereids.trees.plans.logical.LogicalProject;
+import org.apache.doris.nereids.trees.plans.logical.LogicalRepeat;
+import org.apache.doris.nereids.trees.plans.logical.LogicalSort;
+import org.apache.doris.nereids.trees.plans.logical.LogicalTopN;
+import org.apache.doris.nereids.trees.plans.logical.LogicalView;
+import org.apache.doris.nereids.trees.plans.logical.LogicalWindow;
+import org.apache.doris.nereids.trees.plans.visitor.DefaultPlanVisitor;
+import org.apache.doris.nereids.util.Utils;
import org.apache.doris.qe.ConnectContext;
import com.google.common.collect.Lists;
@@ -50,27 +69,31 @@ import org.apache.commons.lang3.StringUtils;
import java.util.List;
import java.util.Map;
+import java.util.TreeMap;
/** BaseViewInfo */
public class BaseViewInfo {
protected final TableNameInfo viewName;
- protected final LogicalPlan logicalQuery;
+ protected LogicalPlan logicalQuery;
protected final String querySql;
protected final List<SimpleColumnDefinition> simpleColumnDefinitions;
protected final List<Column> finalCols = Lists.newArrayList();
protected Plan analyzedPlan;
- public BaseViewInfo(TableNameInfo viewName, LogicalPlan logicalQuery,
+ public BaseViewInfo(TableNameInfo viewName,
String querySql, List<SimpleColumnDefinition>
simpleColumnDefinitions) {
this.viewName = viewName;
- this.logicalQuery = logicalQuery;
this.querySql = querySql;
this.simpleColumnDefinitions = simpleColumnDefinitions;
}
- protected void analyzeAndFillRewriteSqlMap(String sql, ConnectContext ctx)
{
+ protected void analyzeAndFillRewriteSqlMap(String sql, ConnectContext ctx)
throws AnalysisException {
StatementContext stmtCtx = ctx.getStatementContext();
LogicalPlan parsedViewPlan = new
NereidsParser().parseForCreateView(sql);
+ logicalQuery = parsedViewPlan;
+ if (logicalQuery instanceof LogicalFileSink) {
+ throw new AnalysisException("Not support OUTFILE clause in CREATE
VIEW statement");
+ }
if (parsedViewPlan instanceof UnboundResultSink) {
parsedViewPlan = (LogicalPlan) ((UnboundResultSink<?>)
parsedViewPlan).child();
}
@@ -79,9 +102,12 @@ public class BaseViewInfo {
AnalyzerForCreateView analyzerForStar = new
AnalyzerForCreateView(viewContextForStar);
analyzerForStar.analyze();
analyzedPlan = viewContextForStar.getRewritePlan();
+ // Traverse all slots in the plan, and add the slot's location
information
+ // and the fully qualified replacement string to the
indexInSqlToString of the StatementContext.
+ analyzedPlan.accept(PlanSlotFinder.INSTANCE,
ctx.getStatementContext());
}
- protected String rewriteSql(Map<Pair<Integer, Integer>, String>
indexStringSqlMap) {
+ protected String rewriteSql(TreeMap<Pair<Integer, Integer>, String>
indexStringSqlMap) {
StringBuilder builder = new StringBuilder();
int beg = 0;
for (Map.Entry<Pair<Integer, Integer>, String> entry :
indexStringSqlMap.entrySet()) {
@@ -218,4 +244,117 @@ public class BaseViewInfo {
);
}
}
+
+ private static class PlanSlotFinder extends DefaultPlanVisitor<Void,
StatementContext> {
+ private static PlanSlotFinder INSTANCE = new PlanSlotFinder();
+
+ @Override
+ public Void visitLogicalView(LogicalView<? extends Plan> alias,
StatementContext context) {
+ return null;
+ }
+
+ @Override
+ public Void visitLogicalAggregate(LogicalAggregate<? extends Plan>
aggregate, StatementContext context) {
+ for (Expression expr : aggregate.getGroupByExpressions()) {
+ expr.accept(SlotDealer.INSTANCE, context);
+ }
+ for (NamedExpression expr : aggregate.getOutputExpressions()) {
+ expr.accept(SlotDealer.INSTANCE, context);
+ }
+ return aggregate.child().accept(this, context);
+ }
+
+ @Override
+ public Void visitLogicalFilter(LogicalFilter<? extends Plan> filter,
StatementContext context) {
+ for (Expression expr : filter.getConjuncts()) {
+ expr.accept(SlotDealer.INSTANCE, context);
+ }
+ return filter.child().accept(this, context);
+ }
+
+ public Void visitLogicalGenerate(LogicalGenerate<? extends Plan>
generate, StatementContext context) {
+ for (Expression expr : generate.getGenerators()) {
+ expr.accept(SlotDealer.INSTANCE, context);
+ }
+ return generate.child().accept(this, context);
+ }
+
+ @Override
+ public Void visitLogicalHaving(LogicalHaving<? extends Plan> having,
StatementContext context) {
+ for (Expression expr : having.getConjuncts()) {
+ expr.accept(SlotDealer.INSTANCE, context);
+ }
+ return having.child().accept(this, context);
+ }
+
+ @Override
+ public Void visitLogicalJoin(LogicalJoin<? extends Plan, ? extends
Plan> join, StatementContext context) {
+ for (Expression expr : join.getOtherJoinConjuncts()) {
+ expr.accept(SlotDealer.INSTANCE, context);
+ }
+ for (Expression expr : join.getHashJoinConjuncts()) {
+ expr.accept(SlotDealer.INSTANCE, context);
+ }
+ join.child(0).accept(this, context);
+ return join.child(1).accept(this, context);
+ }
+
+ @Override
+ public Void visitLogicalProject(LogicalProject<? extends Plan>
project, StatementContext context) {
+ for (Expression expr : project.getProjects()) {
+ expr.accept(SlotDealer.INSTANCE, context);
+ }
+ return project.child().accept(this, context);
+ }
+
+ @Override
+ public Void visitLogicalRepeat(LogicalRepeat<? extends Plan> repeat,
StatementContext context) {
+ for (Expression expr : repeat.getOutputExpressions()) {
+ expr.accept(SlotDealer.INSTANCE, context);
+ }
+ for (List<Expression> exprs : repeat.getGroupingSets()) {
+ for (Expression expr : exprs) {
+ expr.accept(SlotDealer.INSTANCE, context);
+ }
+ }
+ return repeat.child().accept(this, context);
+ }
+
+ @Override
+ public Void visitLogicalSort(LogicalSort<? extends Plan> sort,
StatementContext context) {
+ for (OrderKey key : sort.getOrderKeys()) {
+ key.getExpr().accept(SlotDealer.INSTANCE, context);
+ }
+ return sort.child().accept(this, context);
+ }
+
+ @Override
+ public Void visitLogicalTopN(LogicalTopN<? extends Plan> topN,
StatementContext context) {
+ for (OrderKey key : topN.getOrderKeys()) {
+ key.getExpr().accept(SlotDealer.INSTANCE, context);
+ }
+ return topN.child().accept(this, context);
+ }
+
+ @Override
+ public Void visitLogicalWindow(LogicalWindow<? extends Plan> window,
StatementContext context) {
+ for (Expression expr : window.getWindowExpressions()) {
+ expr.accept(SlotDealer.INSTANCE, context);
+ }
+ return window.child().accept(this, context);
+ }
+ }
+
+ private static class SlotDealer extends DefaultExpressionVisitor<Void,
StatementContext> {
+ private static final SlotDealer INSTANCE = new SlotDealer();
+
+ @Override
+ public Void visitSlot(Slot slot, StatementContext ctx) {
+ slot.getIndexInSqlString().ifPresent(index ->
+ ctx.addIndexInSqlToString(index,
+
Utils.qualifiedNameWithBackquote(slot.getQualifier(), slot.getName()))
+ );
+ return null;
+ }
+ }
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/CreateViewInfo.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/CreateViewInfo.java
index 3d7997eea58..bf3eabcc4c1 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/CreateViewInfo.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/CreateViewInfo.java
@@ -30,12 +30,9 @@ import org.apache.doris.common.util.Util;
import org.apache.doris.mysql.privilege.PrivPredicate;
import org.apache.doris.nereids.NereidsPlanner;
import org.apache.doris.nereids.analyzer.UnboundResultSink;
-import org.apache.doris.nereids.exceptions.AnalysisException;
import org.apache.doris.nereids.properties.PhysicalProperties;
import org.apache.doris.nereids.trees.expressions.Slot;
import
org.apache.doris.nereids.trees.plans.commands.ExplainCommand.ExplainLevel;
-import org.apache.doris.nereids.trees.plans.logical.LogicalFileSink;
-import org.apache.doris.nereids.trees.plans.logical.LogicalPlan;
import org.apache.doris.nereids.util.PlanUtils;
import org.apache.doris.qe.ConnectContext;
@@ -53,14 +50,11 @@ public class CreateViewInfo extends BaseViewInfo {
private final String comment;
/** constructor*/
- public CreateViewInfo(boolean ifNotExists, TableNameInfo viewName, String
comment, LogicalPlan logicalQuery,
+ public CreateViewInfo(boolean ifNotExists, TableNameInfo viewName, String
comment,
String querySql, List<SimpleColumnDefinition>
simpleColumnDefinitions) {
- super(viewName, logicalQuery, querySql, simpleColumnDefinitions);
+ super(viewName, querySql, simpleColumnDefinitions);
this.ifNotExists = ifNotExists;
this.comment = comment;
- if (logicalQuery instanceof LogicalFileSink) {
- throw new AnalysisException("Not support OUTFILE clause in CREATE
VIEW statement");
- }
}
/** init */
diff --git a/regression-test/data/ddl_p0/test_alter_view_nereids.out
b/regression-test/data/ddl_p0/test_alter_view_nereids.out
index ef50a9c8801..a31a13f107a 100644
--- a/regression-test/data/ddl_p0/test_alter_view_nereids.out
+++ b/regression-test/data/ddl_p0/test_alter_view_nereids.out
@@ -10,7 +10,7 @@
2 70
-- !sql --
-test_alter_view_view_nereids CREATE VIEW `test_alter_view_view_nereids`
COMMENT 'test_view' AS SELECT c1 AS `k1`, sum(c3) AS `k2` FROM
`internal`.`regression_test_ddl_p0`.`test_alter_view_table_nereids` GROUP BY
c1; utf8mb4 utf8mb4_0900_bin
+test_alter_view_view_nereids CREATE VIEW `test_alter_view_view_nereids`
COMMENT 'test_view' AS SELECT
`internal`.`regression_test_ddl_p0`.`test_alter_view_table_nereids`.`c1` AS
`k1`,
sum(`internal`.`regression_test_ddl_p0`.`test_alter_view_table_nereids`.`c3`)
AS `k2` FROM
`internal`.`regression_test_ddl_p0`.`test_alter_view_table_nereids` GROUP BY
`internal`.`regression_test_ddl_p0`.`test_alter_view_table_nereids`.`c1`;
utf8mb4 utf8mb4_0900_bin
-- !sql --
test_alter_view_view_nereids CREATE VIEW `test_alter_view_view_nereids`
COMMENT 'test_view' AS (select
`internal`.`regression_test_ddl_p0`.`test_alter_view_table_nereids`.`c1`,
`internal`.`regression_test_ddl_p0`.`test_alter_view_table_nereids`.`c2`,
`internal`.`regression_test_ddl_p0`.`test_alter_view_table_nereids`.`c3` from
`internal`.`regression_test_ddl_p0`.`test_alter_view_table_nereids`);
utf8mb4 utf8mb4_0900_bin
diff --git a/regression-test/data/ddl_p0/test_create_view.out
b/regression-test/data/ddl_p0/test_create_view.out
index 7f2a6e44d4a..4ba274b5347 100644
--- a/regression-test/data/ddl_p0/test_create_view.out
+++ b/regression-test/data/ddl_p0/test_create_view.out
@@ -25,5 +25,5 @@
3 [-1, 20, 0] [0, 1, 0]
-- !test_view_6 --
-v1 CREATE VIEW `v1` AS SELECT\n error_code, \n 1, \n
'string', \n now(), \n dayofyear(op_time), \n cast (source AS
BIGINT), \n min(`timestamp`) OVER (\n ORDER BY \n op_time
DESC ROWS BETWEEN UNBOUNDED PRECEDING\n AND 1 FOLLOWING\n ), \n
1 > 2,\n 2 + 3,\n 1 IN (1, 2, 3, 4), \n remark LIKE '%like',
\n CASE WHEN remark = 's' THEN 1 ELSE 2 END,\n TRUE | FALSE \n
FROM \n `internal`.`regressi [...]
+v1 CREATE VIEW `v1` AS SELECT `error_code` AS `error_code`, 1 AS
`__literal_1`, 'string' AS `__literal_2`, now() AS `__now_3`,
dayofyear(`op_time`) AS `__dayofyear_4`, CAST(`source` AS BIGINT) AS
`__cast_expr_5`, min(`timestamp`) OVER (ORDER BY `op_time` DESC NULLS LAST ROWS
BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING) AS `__min_6`, (1 > 2) AS
`__binary_predicate_7`, (2 + 3) AS `__arithmetic_expr_8`, 1 IN (1, 2, 3, 4) AS
`__in_predicate_9`, `remark` LIKE '%like' AS `__like_predicate_10`, [...]
diff --git a/regression-test/data/ddl_p0/test_create_view_nereids.out
b/regression-test/data/ddl_p0/test_create_view_nereids.out
index efdc1553ca1..b6db86eaf62 100644
--- a/regression-test/data/ddl_p0/test_create_view_nereids.out
+++ b/regression-test/data/ddl_p0/test_create_view_nereids.out
@@ -25,7 +25,7 @@
3 [-1, 20, 0] [0, 1, 0]
-- !test_view_6 --
-v1 CREATE VIEW `v1` AS SELECT\n error_code, \n 1, \n
'string', \n now(), \n dayofyear(op_time), \n cast (source AS
BIGINT), \n min(`timestamp`) OVER (\n ORDER BY \n op_time
DESC ROWS BETWEEN UNBOUNDED PRECEDING\n AND 1 FOLLOWING\n ), \n
1 > 2,\n 2 + 3,\n 1 IN (1, 2, 3, 4), \n remark LIKE '%like',
\n CASE WHEN remark = 's' THEN 1 ELSE 2 END,\n TRUE | FALSE \n
FROM \n `internal`.`regressi [...]
+v1 CREATE VIEW `v1` AS SELECT\n
`internal`.`regression_test_ddl_p0`.`view_column_name_test_nereids`.`error_code`,
\n 1, \n 'string', \n now(), \n
dayofyear(`internal`.`regression_test_ddl_p0`.`view_column_name_test_nereids`.`op_time`),
\n cast
(`internal`.`regression_test_ddl_p0`.`view_column_name_test_nereids`.`source`
AS BIGINT), \n
min(`internal`.`regression_test_ddl_p0`.`view_column_name_test_nereids`.`timestamp`)
OVER (\n ORDER BY \n [...]
-- !test_with_as --
1 1 2
@@ -47,7 +47,7 @@ v1 CREATE VIEW `v1` AS SELECT\n error_code, \n
1, \n 'string', \n
6 7 1
-- !test_with_as_sql --
-test_view_with_as CREATE VIEW `test_view_with_as` AS (\n with
t1 as (select `internal`.`regression_test_ddl_p0`.`mal_test_view`.`pk`,
`internal`.`regression_test_ddl_p0`.`mal_test_view`.`a`,
`internal`.`regression_test_ddl_p0`.`mal_test_view`.`b` from
`internal`.`regression_test_ddl_p0`.`mal_test_view`), t2 as (select
`internal`.`regression_test_ddl_p0`.`mal_test_view`.`pk`,
`internal`.`regression_test_ddl_p0`.`mal_test_view`.`a`,
`internal`.`regression_test_ddl_p0`.`mal_test [...]
+test_view_with_as CREATE VIEW `test_view_with_as` AS (\n with
`t1` as (select `internal`.`regression_test_ddl_p0`.`mal_test_view`.`pk`,
`internal`.`regression_test_ddl_p0`.`mal_test_view`.`a`,
`internal`.`regression_test_ddl_p0`.`mal_test_view`.`b` from
`internal`.`regression_test_ddl_p0`.`mal_test_view`), `t2` as (select
`internal`.`regression_test_ddl_p0`.`mal_test_view`.`pk`,
`internal`.`regression_test_ddl_p0`.`mal_test_view`.`a`,
`internal`.`regression_test_ddl_p0`.`mal_ [...]
-- !test_union --
1 1 2
@@ -114,7 +114,7 @@ test_view_count_star CREATE VIEW
`test_view_count_star` AS (select count(*) AS `
8 10 1
-- !test_expression_sql --
-test_view_expression CREATE VIEW `test_view_expression` AS (select a+1 AS
`c1`, abs(a)+2+1 AS `c2`, cast(b as varchar(10)) AS `c3` from
`internal`.`regression_test_ddl_p0`.`mal_test_view`); utf8mb4
utf8mb4_0900_bin
+test_view_expression CREATE VIEW `test_view_expression` AS (select
`internal`.`regression_test_ddl_p0`.`mal_test_view`.`a`+1 AS `c1`,
abs(`internal`.`regression_test_ddl_p0`.`mal_test_view`.`a`)+2+1 AS `c2`,
cast(`internal`.`regression_test_ddl_p0`.`mal_test_view`.`b` as varchar(10)) AS
`c3` from `internal`.`regression_test_ddl_p0`.`mal_test_view`); utf8mb4
utf8mb4_0900_bin
-- !test_alias --
\N \N 6
@@ -136,7 +136,7 @@ test_view_expression CREATE VIEW
`test_view_expression` AS (select a+1 AS `c1`,
8 10 1
-- !test_alias_sql --
-test_view_alias CREATE VIEW `test_view_alias` AS (\n select c8
AS `c1`, c2 AS `c2`, c1 AS `c3` from (select a+1 c8,abs(a)+2+1 as c2, cast(b as
varchar(10)) as c1 from `internal`.`regression_test_ddl_p0`.`mal_test_view`)
t); utf8mb4 utf8mb4_0900_bin
+test_view_alias CREATE VIEW `test_view_alias` AS (\n select
`t`.`c8` AS `c1`, `t`.`c2` AS `c2`, `t`.`c1` AS `c3` from (select
`internal`.`regression_test_ddl_p0`.`mal_test_view`.`a`+1
`c8`,abs(`internal`.`regression_test_ddl_p0`.`mal_test_view`.`a`)+2+1 as `c2`,
cast(`internal`.`regression_test_ddl_p0`.`mal_test_view`.`b` as varchar(10)) as
`c1` from `internal`.`regression_test_ddl_p0`.`mal_test_view`) `t`);
utf8mb4 utf8mb4_0900_bin
-- !test_star_except --
\N 6
@@ -202,7 +202,7 @@ test_view_from_view CREATE VIEW `test_view_from_view` AS
select `internal`.`regr
7 1
-- !test_backquote_in_view_define_sql --
-test_backquote_in_view_define CREATE VIEW `test_backquote_in_view_define` AS
select a AS `ab``c`, b AS `c2` from
`internal`.`regression_test_ddl_p0`.`mal_test_view`; utf8mb4 utf8mb4_0900_bin
+test_backquote_in_view_define CREATE VIEW `test_backquote_in_view_define` AS
select `internal`.`regression_test_ddl_p0`.`mal_test_view`.`a` AS `ab``c`,
`internal`.`regression_test_ddl_p0`.`mal_test_view`.`b` AS `c2` from
`internal`.`regression_test_ddl_p0`.`mal_test_view`; utf8mb4
utf8mb4_0900_bin
-- !test_backquote_in_table_alias --
\N 6
@@ -224,5 +224,142 @@ test_backquote_in_view_define CREATE VIEW
`test_backquote_in_view_define` AS sel
7 1
-- !test_backquote_in_table_alias_sql --
-test_backquote_in_table_alias CREATE VIEW `test_backquote_in_table_alias` AS
select `ab``c`.`a` AS `c1`, `ab``c`.`b` AS `c2` from (select a,b from
`internal`.`regression_test_ddl_p0`.`mal_test_view`) `ab``c`; utf8mb4
utf8mb4_0900_bin
+test_backquote_in_table_alias CREATE VIEW `test_backquote_in_table_alias` AS
select `ab``c`.`a` AS `c1`, `ab``c`.`b` AS `c2` from (select
`internal`.`regression_test_ddl_p0`.`mal_test_view`.`a`,`internal`.`regression_test_ddl_p0`.`mal_test_view`.`b`
from `internal`.`regression_test_ddl_p0`.`mal_test_view`) `ab``c`; utf8mb4
utf8mb4_0900_bin
+
+-- !test_generate --
+1 10 A 30
+1 10 A 60
+2 20 B 30
+2 20 B 60
+3 30 C 30
+3 30 C 60
+4 40 D 30
+4 40 D 60
+
+-- !test_generate_sql --
+test_view_generate CREATE VIEW `test_view_generate` AS select
`internal`.`regression_test_ddl_p0`.`create_view_table1`.`id`,
`internal`.`regression_test_ddl_p0`.`create_view_table1`.`value1`,
`internal`.`regression_test_ddl_p0`.`create_view_table1`.`value2`, `t1`.`age`
from `internal`.`regression_test_ddl_p0`.`create_view_table1` lateral view
EXPLODE(ARRAY(30,60)) `t1` as `age`; utf8mb4 utf8mb4_0900_bin
+
+-- !test_generate_with_column --
+1 10 A 0
+2 20 B 0
+2 20 B 1
+3 30 C 0
+3 30 C 1
+3 30 C 2
+4 40 D 0
+4 40 D 1
+4 40 D 2
+4 40 D 3
+
+-- !test_generate_with_column_sql --
+test_view_generate_with_column CREATE VIEW `test_view_generate_with_column` AS
select `internal`.`regression_test_ddl_p0`.`create_view_table1`.`id`,
`internal`.`regression_test_ddl_p0`.`create_view_table1`.`value1`,
`internal`.`regression_test_ddl_p0`.`create_view_table1`.`value2`, `t1`.`age`
from `internal`.`regression_test_ddl_p0`.`create_view_table1` lateral view
EXPLODE_numbers(`internal`.`regression_test_ddl_p0`.`create_view_table1`.`id`)
`t1` as `age`; utf8mb4 utf8mb4_0900_bin
+
+-- !test_col_alias --
+1 10
+2 20
+3 30
+4 40
+
+-- !test_col_alias_sql --
+test_view_col_alias CREATE VIEW `test_view_col_alias` AS select
`internal`.`regression_test_ddl_p0`.`create_view_table1`.`id` as `c1`,
`internal`.`regression_test_ddl_p0`.`create_view_table1`.`value1` as `c2` from
`internal`.`regression_test_ddl_p0`.`create_view_table1`; utf8mb4
utf8mb4_0900_bin
+
+-- !test_col_alias_with_specific_name --
+1 10
+2 20
+3 30
+4 40
+
+-- !test_col_alias_with_specific_name_sql --
+test_view_col_alias_specific_name CREATE VIEW
`test_view_col_alias_specific_name` AS select
`internal`.`regression_test_ddl_p0`.`create_view_table1`.`id` AS `col1`,
`internal`.`regression_test_ddl_p0`.`create_view_table1`.`value1` AS `col2`
from `internal`.`regression_test_ddl_p0`.`create_view_table1`; utf8mb4
utf8mb4_0900_bin
+
+-- !test_table_alias --
+1 10
+2 20
+3 30
+4 40
+
+-- !test_table_alias_sql --
+test_view_table_alias CREATE VIEW `test_view_table_alias` AS select `t`.`c1`,
`t`.`c2` from (\n select
`internal`.`regression_test_ddl_p0`.`create_view_table1`.`id` as `c1`,
`internal`.`regression_test_ddl_p0`.`create_view_table1`.`value1` as `c2` from
`internal`.`regression_test_ddl_p0`.`create_view_table1` limit 10) as `t`;
utf8mb4 utf8mb4_0900_bin
+
+-- !test_join_table_alias --
+1 10
+2 20
+3 30
+4 40
+
+-- !test_join_table_alias_sql --
+test_view_join_table_alias CREATE VIEW `test_view_join_table_alias` AS
select `t`.`c1`, `t`.`c2` from (\n select `t1`.`id` as `c1`,
`t1`.`value1` as `c2` from
`internal`.`regression_test_ddl_p0`.`create_view_table1` `t1` inner join
`internal`.`regression_test_ddl_p0`.`create_view_table2` `t2` on
`t1`.`id`=`t2`.`id` limit 10) as `t`; utf8mb4 utf8mb4_0900_bin
+
+-- !test_alias_udf --
+1****1 1
+2****2 2
+3****3 3
+4****4 4
+
+-- !test_alias_udf_sql --
+test_view_alias_udf CREATE VIEW `test_view_alias_udf` AS (select
`regression_test_ddl_p0`.`alias_function_create_view_test`(`internal`.`regression_test_ddl_p0`.`create_view_table1`.`id`)
as `c1`,abs(`internal`.`regression_test_ddl_p0`.`create_view_table1`.`id`)
from `internal`.`regression_test_ddl_p0`.`create_view_table1`); utf8mb4
utf8mb4_0900_bin
+
+-- !test_alias_with_db_udf --
+1****1 1
+2****2 2
+3****3 3
+4****4 4
+
+-- !test_alias_with_db_udf_sql --
+test_view_alias_udf_with_db CREATE VIEW `test_view_alias_udf_with_db` AS
(select
`regression_test_ddl_p0`.`alias_function_create_view_test`(`internal`.`regression_test_ddl_p0`.`create_view_table1`.`id`)
as `c1`,abs(`internal`.`regression_test_ddl_p0`.`create_view_table1`.`id`)
from `internal`.`regression_test_ddl_p0`.`create_view_table1`); utf8mb4
utf8mb4_0900_bin
+
+-- !test_udf_sql --
+test_view_udf CREATE VIEW `test_view_udf` AS (select
`regression_test_ddl_p0`.`alias_function_create_view_test`(`internal`.`regression_test_ddl_p0`.`create_view_table1`.`id`)
as `c1`,
`regression_test_ddl_p0`.`java_udf_create_view_test`('2011-01-01','2011-01-02'),\n
`regression_test_ddl_p0`.`java_udf_create_view_test`('2011-01-01','2011-01-03')
from `internal`.`regression_test_ddl_p0`.`create_view_table1`); utf8mb4
utf8mb4_0900_bin
+
+-- !test_udf --
+1****1 false false
+2****2 false false
+3****3 false false
+4****4 false false
+
+-- !test_with_as_with_columns --
+1 1 2
+1 1 4
+1 3 6
+2 1 3
+2 1 4
+2 1 7
+2 3 5
+2 3 9
+2 4 2
+3 2 8
+3 5 \N
+3 5 6
+3 5 6
+3 5 8
+4 5 6
+6 \N 6
+6 7 1
+
+-- !test_with_as_with_columns_sql --
+test_view_with_as_with_columns CREATE VIEW `test_view_with_as_with_columns` AS
(\n with `t1`(`c1`,`c2`,`c3`) as (select
`internal`.`regression_test_ddl_p0`.`mal_test_view`.`pk`,
`internal`.`regression_test_ddl_p0`.`mal_test_view`.`a`,
`internal`.`regression_test_ddl_p0`.`mal_test_view`.`b` from
`internal`.`regression_test_ddl_p0`.`mal_test_view`), `t2` as (select
`internal`.`regression_test_ddl_p0`.`mal_test_view`.`pk`,
`internal`.`regression_test_ddl_p0`.`mal_test_view`.`a`, [...]
+
+-- !test_having --
+2 2
+3 3
+4 2
+4 4
+5 5
+6 3
+7 7
+8 4
+9 3
+10 5
+14 7
+15 5
+
+-- !test_having_sql --
+test_having CREATE VIEW `test_having` AS select
sum(`internal`.`regression_test_ddl_p0`.`mal_test_view`.`a`) over(partition by
`internal`.`regression_test_ddl_p0`.`mal_test_view`.`a` order by
`internal`.`regression_test_ddl_p0`.`mal_test_view`.`pk`) as `c1` ,
`internal`.`regression_test_ddl_p0`.`mal_test_view`.`a` from
`internal`.`regression_test_ddl_p0`.`mal_test_view` group by grouping
sets((`internal`.`regression_test_ddl_p0`.`mal_test_view`.`a`),(`internal`.`regression_test_ddl_p0`.`
[...]
+
+-- !complicated_view1 --
+1 100 1
+2 200 1
+
+-- !complicated_view1_sql --
+test_view_complicated CREATE VIEW `test_view_complicated` AS SELECT `t`.`id`,
`t`.`value3`, `t`.`row_num` FROM (\n SELECT `t1`.`id`, `tt`.`value3`,
ROW_NUMBER() OVER (PARTITION BY `t1`.`id` ORDER BY `tt`.`value3` DESC) as
`row_num`\n FROM (SELECT
`internal`.`regression_test_ddl_p0`.`create_view_table1`.`id` FROM
`internal`.`regression_test_ddl_p0`.`create_view_table1` GROUP BY
`internal`.`regression_test_ddl_p0`.`create_view_table1`.`id`) `t1`\n FULL
OUTER JOIN (SELECT `inte [...]
diff --git a/regression-test/data/show_p0/test_show_create_table_and_views.out
b/regression-test/data/show_p0/test_show_create_table_and_views.out
index ab3afbb16ec..5b7e6de278d 100644
--- a/regression-test/data/show_p0/test_show_create_table_and_views.out
+++ b/regression-test/data/show_p0/test_show_create_table_and_views.out
@@ -24,7 +24,7 @@ show_create_table_and_views_table CREATE TABLE
`show_create_table_and_views_tabl
3 1
-- !show --
-show_create_table_and_views_view CREATE VIEW
`show_create_table_and_views_view` AS SELECT user_id AS `user_id`, cost AS
`cost` FROM
`internal`.`show_create_table_and_views_db`.`show_create_table_and_views_table`\n
WHERE good_id = 2; utf8mb4 utf8mb4_0900_bin
+show_create_table_and_views_view CREATE VIEW
`show_create_table_and_views_view` AS SELECT `user_id` AS `user_id`, `cost` AS
`cost` FROM
`show_create_table_and_views_db`.`show_create_table_and_views_table` WHERE
(`good_id` = 2); utf8mb4 utf8mb4_0900_bin
-- !select --
1 47
diff --git
a/regression-test/data/show_p0/test_show_create_table_and_views_nereids.out
b/regression-test/data/show_p0/test_show_create_table_and_views_nereids.out
index 6067993ef0a..9cd4d121c5b 100644
--- a/regression-test/data/show_p0/test_show_create_table_and_views_nereids.out
+++ b/regression-test/data/show_p0/test_show_create_table_and_views_nereids.out
@@ -24,7 +24,7 @@ show_create_table_and_views_nereids_table CREATE TABLE
`show_create_table_and_vi
3 1
-- !show --
-show_create_table_and_views_nereids_view CREATE VIEW
`show_create_table_and_views_nereids_view` AS SELECT user_id AS `user_id`, cost
AS `cost` FROM
`internal`.`show_create_table_and_views_nereids_db`.`show_create_table_and_views_nereids_table`\n
WHERE good_id = 2; utf8mb4 utf8mb4_0900_bin
+show_create_table_and_views_nereids_view CREATE VIEW
`show_create_table_and_views_nereids_view` AS SELECT
`internal`.`show_create_table_and_views_nereids_db`.`show_create_table_and_views_nereids_table`.`user_id`
AS `user_id`,
`internal`.`show_create_table_and_views_nereids_db`.`show_create_table_and_views_nereids_table`.`cost`
AS `cost` FROM
`internal`.`show_create_table_and_views_nereids_db`.`show_create_table_and_views_nereids_table`\n
WHERE `internal`.`show_create_table_and_vie [...]
-- !select --
1 47
diff --git a/regression-test/suites/ddl_p0/test_create_view.groovy
b/regression-test/suites/ddl_p0/test_create_view.groovy
index b4bd9848545..0cc42f8fcc1 100644
--- a/regression-test/suites/ddl_p0/test_create_view.groovy
+++ b/regression-test/suites/ddl_p0/test_create_view.groovy
@@ -16,6 +16,7 @@
// under the License.
suite("test_create_view") {
+ sql "SET enable_nereids_planner=false"
sql """DROP TABLE IF EXISTS count_distinct"""
sql """
CREATE TABLE IF NOT EXISTS count_distinct
diff --git a/regression-test/suites/ddl_p0/test_create_view_nereids.groovy
b/regression-test/suites/ddl_p0/test_create_view_nereids.groovy
index 48885a47fd1..ad3c84f25ec 100644
--- a/regression-test/suites/ddl_p0/test_create_view_nereids.groovy
+++ b/regression-test/suites/ddl_p0/test_create_view_nereids.groovy
@@ -277,4 +277,117 @@ suite("test_create_view_nereids") {
sql "create view test_backquote_in_table_alias(c1, c2) as select * from
(select a,b from mal_test_view) `ab``c`;"
qt_test_backquote_in_table_alias "select * from
test_backquote_in_table_alias order by c1, c2;"
qt_test_backquote_in_table_alias_sql "show create view
test_backquote_in_table_alias;"
+
+ sql "drop table if exists create_view_table1"
+ sql """CREATE TABLE create_view_table1 (
+ id INT,
+ value1 INT,
+ value2 VARCHAR(50)
+ ) distributed by hash(id) buckets 10 properties("replication_num"="1");"""
+ sql """INSERT INTO create_view_table1 (id, value1, value2) VALUES
+ (1, 10, 'A'),
+ (2, 20, 'B'),
+ (3, 30, 'C'),
+ (4, 40, 'D');"""
+ sql "drop table if exists create_view_table2"
+ sql """CREATE TABLE create_view_table2 (
+ id INT,
+ table1_id INT,
+ value3 INT,
+ value4 VARCHAR(50)
+ ) distributed by hash(id) buckets 10 properties("replication_num"="1");"""
+ sql """INSERT INTO create_view_table2 (id, table1_id, value3, value4)
VALUES
+ (1, 1, 100, 'X'),
+ (2, 2, 200, 'Y'),
+ (3, 2, 300, 'Z'),
+ (4, 3, 400, 'W');"""
+
+ sql "drop view if exists test_view_generate"
+ sql """create view test_view_generate as select * from create_view_table1
lateral view EXPLODE(ARRAY(30,60)) t1 as age"""
+ qt_test_generate "select * from test_view_generate order by 1,2,3,4;"
+ qt_test_generate_sql "show create view test_view_generate;"
+
+ sql "drop view if exists test_view_generate_with_column"
+ sql """create view test_view_generate_with_column as select * from
create_view_table1 lateral view EXPLODE_numbers(id) t1 as age"""
+ qt_test_generate_with_column "select * from test_view_generate_with_column
order by 1,2,3,4"
+ qt_test_generate_with_column_sql "show create view
test_view_generate_with_column;"
+
+ sql "drop view if exists test_view_col_alias"
+ sql """create view test_view_col_alias as select id as `c1`, value1 as c2
from create_view_table1;"""
+ qt_test_col_alias "select * from test_view_col_alias order by 1,2"
+ qt_test_col_alias_sql "show create view test_view_col_alias;"
+
+ sql "drop view if exists test_view_col_alias_specific_name"
+ sql """create view test_view_col_alias_specific_name(col1,col2) as select
id as `c1`, value1 as c2 from create_view_table1;"""
+ qt_test_col_alias_with_specific_name "select * from
test_view_col_alias_specific_name order by 1,2"
+ qt_test_col_alias_with_specific_name_sql "show create view
test_view_col_alias_specific_name;"
+
+ sql "drop view if exists test_view_table_alias"
+ sql """create view test_view_table_alias as select * from (
+ select id as `c1`, value1 as c2 from create_view_table1 limit 10)
as t ;"""
+ qt_test_table_alias "select * from test_view_table_alias order by 1,2"
+ qt_test_table_alias_sql "show create view test_view_table_alias;"
+
+ sql "drop view if exists test_view_join_table_alias"
+ sql """create view test_view_join_table_alias as select * from (
+ select t1.id as `c1`, value1 as c2 from create_view_table1 t1
inner join create_view_table2 t2 on t1.id=t2.id limit 10) as t ;"""
+ qt_test_join_table_alias "select * from test_view_join_table_alias order
by 1,2"
+ qt_test_join_table_alias_sql "show create view test_view_join_table_alias;"
+
+ sql "drop function if exists alias_function_create_view_test(INT)"
+ sql "CREATE ALIAS FUNCTION alias_function_create_view_test(INT) WITH
PARAMETER(id) AS CONCAT(LEFT(id, 3), '****', RIGHT(id, 4));"
+ sql "drop view if exists test_view_alias_udf;"
+ sql "CREATE VIEW if not exists test_view_alias_udf AS (select
alias_function_create_view_test(id) as c1,abs(id) from create_view_table1);"
+ qt_test_alias_udf "select * from test_view_alias_udf order by 1,2"
+ qt_test_alias_udf_sql "show create view test_view_alias_udf;"
+
+ String db = context.config.getDbNameByFile(context.file)
+ log.info("db:${db}")
+ sql "drop view if exists test_view_alias_udf_with_db;"
+ sql "CREATE VIEW if not exists test_view_alias_udf_with_db AS (select
${db}.alias_function_create_view_test(id) as c1,abs(id) from
create_view_table1);"
+ qt_test_alias_with_db_udf "select * from test_view_alias_udf_with_db order
by 1,2"
+ qt_test_alias_with_db_udf_sql "show create view
test_view_alias_udf_with_db;"
+
+ def jarPath =
"""${context.config.suitePath}/javaudf_p0/jars/java-udf-case-jar-with-dependencies.jar"""
+ scp_udf_file_to_all_be(jarPath)
+ log.info("jarPath:${jarPath}")
+
+ sql "drop function if exists java_udf_create_view_test(date, date)"
+ sql """ CREATE FUNCTION java_udf_create_view_test(date, date) RETURNS
boolean PROPERTIES (
+ "file"="file://${jarPath}",
+ "symbol"="org.apache.doris.udf.DateTest1",
+ "type"="JAVA_UDF"
+ ); """
+
+ sql "drop view if exists test_view_udf;"
+ sql """CREATE VIEW if not exists test_view_udf AS (select
${db}.alias_function_create_view_test(id) as c1,
java_udf_create_view_test('2011-01-01','2011-01-02'),
+ ${db}.java_udf_create_view_test('2011-01-01','2011-01-03') from
create_view_table1);"""
+ qt_test_udf_sql "show create view test_view_udf;"
+ qt_test_udf "select * from test_view_udf order by 1,2,3"
+
+ sql "DROP VIEW if exists test_view_with_as_with_columns"
+ sql """CREATE VIEW if not exists test_view_with_as_with_columns AS (
+ with t1(c1,c2,c3) as (select * from mal_test_view), t2 as (select
* from mal_test_view),
+ t3 as (select * from mal_test_view) SELECT * FROM t1);"""
+ qt_test_with_as_with_columns "select * from test_view_with_as_with_columns
order by c1,c2,c3"
+ qt_test_with_as_with_columns_sql "show create view
test_view_with_as_with_columns"
+
+ sql "drop view if exists test_having"
+ sql """create view test_having as
+ select sum(a) over(partition by a order by pk) as c1 , a from
mal_test_view group by grouping sets((a),(b),(pk,a)) having a>1"""
+ qt_test_having "select * from test_having order by 1,2"
+ qt_test_having_sql "show create view test_having"
+
+ sql "drop view if exists test_view_complicated;"
+ sql """create view test_view_complicated as
+ SELECT * FROM (
+ SELECT t1.id, tt.value3, ROW_NUMBER() OVER (PARTITION BY t1.id ORDER
BY tt.value3 DESC) as row_num
+ FROM (SELECT id FROM create_view_table1 GROUP BY id) t1
+ FULL OUTER JOIN (SELECT value3, id, MAX(value4) FROM create_view_table2
GROUP BY value3, id) tt
+ ON tt.id = t1.id
+ ORDER BY t1.id
+ ) t
+ WHERE value3 < 280 AND (id < 3 or id >8);"""
+ qt_complicated_view1 "select * from test_view_complicated order by 1,2,3"
+ qt_complicated_view1_sql "show create view test_view_complicated;"
}
diff --git a/regression-test/suites/javaudf_p0/test_javaudf_date.groovy
b/regression-test/suites/javaudf_p0/test_javaudf_date.groovy
index 91f7c771968..76d287e9c6d 100644
--- a/regression-test/suites/javaudf_p0/test_javaudf_date.groovy
+++ b/regression-test/suites/javaudf_p0/test_javaudf_date.groovy
@@ -80,7 +80,7 @@ suite("test_javaudf_date") {
qt_select """ SELECT java_udf_date_test2('2011-01-01', '2011-01-01')
result FROM ${tableName} ORDER BY result; """
qt_select """ SELECT java_udf_date_test2(null, '2011-01-01') result
FROM ${tableName} ORDER BY result; """
-
+
sql """ CREATE FUNCTION java_udf_date_test3(date, date) RETURNS
boolean PROPERTIES (
"file"="file://${jarPath}",
@@ -92,7 +92,7 @@ suite("test_javaudf_date") {
qt_select """ SELECT java_udf_date_test3('2011-01-01', '2011-01-01')
result FROM ${tableName} ORDER BY result; """
qt_select """ SELECT java_udf_date_test3(null, '2011-01-01') result
FROM ${tableName} ORDER BY result; """
-
+
sql """ CREATE FUNCTION java_udf_datetime_test1(datetime, datetime)
RETURNS boolean PROPERTIES (
"file"="file://${jarPath}",
@@ -104,7 +104,7 @@ suite("test_javaudf_date") {
qt_select """ SELECT java_udf_datetime_test1('2011-01-01',
'2011-01-01') result FROM ${tableName} ORDER BY result; """
qt_select """ SELECT java_udf_datetime_test1(null, '2011-01-01')
result FROM ${tableName} ORDER BY result; """
-
+
sql """ CREATE FUNCTION java_udf_datetime_test2(datetime, datetime)
RETURNS boolean PROPERTIES (
"file"="file://${jarPath}",
@@ -116,7 +116,7 @@ suite("test_javaudf_date") {
qt_select """ SELECT java_udf_datetime_test2('2011-01-01',
'2011-01-01') result FROM ${tableName} ORDER BY result; """
qt_select """ SELECT java_udf_datetime_test2(null, '2011-01-01')
result FROM ${tableName} ORDER BY result; """
-
+
sql """ CREATE FUNCTION java_udf_datetime_test3(datetime, datetime)
RETURNS boolean PROPERTIES (
"file"="file://${jarPath}",
@@ -128,7 +128,7 @@ suite("test_javaudf_date") {
qt_select """ SELECT java_udf_datetime_test3('2011-01-01',
'2011-01-01') result FROM ${tableName} ORDER BY result; """
qt_select """ SELECT java_udf_datetime_test3(null, '2011-01-01')
result FROM ${tableName} ORDER BY result; """
-
+
sql """ CREATE FUNCTION java_udf_datev2_test1(datev2, datev2) RETURNS
boolean PROPERTIES (
@@ -139,7 +139,7 @@ suite("test_javaudf_date") {
qt_select """ SELECT java_udf_datev2_test1(datev2_col, '2011-01-01')
result FROM ${tableName} ORDER BY result; """
-
+
sql """ CREATE FUNCTION java_udf_datev2_test2(datev2, datev2) RETURNS
boolean PROPERTIES (
"file"="file://${jarPath}",
@@ -149,7 +149,7 @@ suite("test_javaudf_date") {
qt_select """ SELECT java_udf_datev2_test2(datev2_col, '2011-01-01')
result FROM ${tableName} ORDER BY result; """
-
+
sql """ CREATE FUNCTION java_udf_datev2_test3(datev2, datev2) RETURNS
boolean PROPERTIES (
"file"="file://${jarPath}",
@@ -159,7 +159,7 @@ suite("test_javaudf_date") {
qt_select """ SELECT java_udf_datev2_test3(datev2_col, '2011-01-01')
result FROM ${tableName} ORDER BY result; """
-
+
sql """ CREATE FUNCTION java_udf_datetimev2_test1(datetimev2,
datetimev2) RETURNS boolean PROPERTIES (
"file"="file://${jarPath}",
@@ -169,7 +169,7 @@ suite("test_javaudf_date") {
qt_select """ SELECT java_udf_datetimev2_test1(datetimev2_col,
'2011-01-01') result FROM ${tableName} ORDER BY result; """
-
+
sql """ CREATE FUNCTION java_udf_datetimev2_test2(datetimev2,
datetimev2) RETURNS boolean PROPERTIES (
"file"="file://${jarPath}",
@@ -179,7 +179,7 @@ suite("test_javaudf_date") {
qt_select """ SELECT java_udf_datetimev2_test2(datetimev2_col,
'2011-01-01') result FROM ${tableName} ORDER BY result; """
-
+
sql """ CREATE FUNCTION java_udf_datetimev2_test3(datetimev2,
datetimev2) RETURNS boolean PROPERTIES (
"file"="file://${jarPath}",
@@ -189,7 +189,7 @@ suite("test_javaudf_date") {
qt_select """ SELECT java_udf_datetimev2_test3(datetimev2_col,
'2011-01-01') result FROM ${tableName} ORDER BY result; """
-
+
} finally {
try_sql("DROP FUNCTION IF EXISTS java_udf_date_test3(date, date);")
try_sql("DROP FUNCTION IF EXISTS java_udf_datetime_test1(datetime,
datetime);")
diff --git
a/regression-test/suites/show_p0/test_show_create_table_and_views.groovy
b/regression-test/suites/show_p0/test_show_create_table_and_views.groovy
index 638a576ad7a..2425d14836f 100644
--- a/regression-test/suites/show_p0/test_show_create_table_and_views.groovy
+++ b/regression-test/suites/show_p0/test_show_create_table_and_views.groovy
@@ -16,6 +16,7 @@
// under the License.
suite("test_show_create_table_and_views", "show") {
+ sql "SET enable_nereids_planner=false;"
def ret = sql "SHOW FRONTEND CONFIG like '%enable_feature_binlog%';"
logger.info("${ret}")
if (ret.size() != 0 && ret[0].size() > 1 && ret[0][1] == 'false') {
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]