This is an automated email from the ASF dual-hosted git repository.
panxiaolei pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-2.0 by this push:
new b97dad4121 [Bug](insert) fix slotRef toSql output include label on
insert select (#24091)
b97dad4121 is described below
commit b97dad412139e75386e455ab35009b6c5d1b7c81
Author: Pxl <[email protected]>
AuthorDate: Fri Sep 8 14:55:17 2023 +0800
[Bug](insert) fix slotRef toSql output include label on insert select
(#24091)
fix slotRef toSql output include label on insert select
---
.../doris/nereids/rules/analysis/BindSink.java | 83 +++++++++++++---------
1 file changed, 48 insertions(+), 35 deletions(-)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindSink.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindSink.java
index 5472893892..8c4c0e3ee9 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindSink.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindSink.java
@@ -45,6 +45,7 @@ import
org.apache.doris.nereids.trees.plans.logical.LogicalProject;
import org.apache.doris.nereids.types.DataType;
import org.apache.doris.nereids.util.RelationUtil;
import org.apache.doris.nereids.util.TypeCoercionUtils;
+import org.apache.doris.qe.ConnectContext;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
@@ -100,45 +101,57 @@ public class BindSink implements AnalysisRuleFactory {
Map<String, NamedExpression> columnToOutput =
Maps.newLinkedHashMap();
NereidsParser expressionParser = new
NereidsParser();
+ // this is a trick way to avoid legacy planner's
slotRef toSql output include label.
+ // see more in
org.apache.doris.analysis.SlotRef.toSqlImpl
+ if (ConnectContext.get() != null) {
+
ConnectContext.get().getState().setIsQuery(true);
+ }
// generate slots not mentioned in sql, mv slots
and shaded slots.
- for (Column column :
boundSink.getTargetTable().getFullSchema()) {
- if (column.isMaterializedViewColumn()) {
- List<SlotRef> refs =
column.getRefColumns();
- // now we have to replace the column to
slots.
- Preconditions.checkArgument(refs != null,
- "mv column's ref column cannot be
null");
- Expression parsedExpression =
expressionParser.parseExpression(
- column.getDefineExpr().toSql());
- Expression boundExpression =
SlotReplacer.INSTANCE
- .replace(parsedExpression,
columnToOutput);
-
- NamedExpression slot = boundExpression
instanceof NamedExpression
- ? ((NamedExpression)
boundExpression)
- : new Alias(boundExpression);
-
- columnToOutput.put(column.getName(), slot);
- } else if
(columnToChildOutput.containsKey(column)) {
- columnToOutput.put(column.getName(),
columnToChildOutput.get(column));
- } else {
- if (table.hasSequenceCol()
- &&
column.getName().equals(Column.SEQUENCE_COL)
- && table.getSequenceMapCol() !=
null) {
- Column seqCol =
table.getFullSchema().stream()
- .filter(col ->
col.getName().equals(table.getSequenceMapCol()))
- .findFirst().get();
- columnToOutput.put(column.getName(),
columnToOutput.get(seqCol.getName()));
- } else if (column.getDefaultValue() ==
null) {
- columnToOutput.put(column.getName(),
new Alias(
- new
NullLiteral(DataType.fromCatalogType(column.getType())),
- column.getName()
- ));
+ try {
+ for (Column column :
boundSink.getTargetTable().getFullSchema()) {
+ if (column.isMaterializedViewColumn()) {
+ List<SlotRef> refs =
column.getRefColumns();
+ // now we have to replace the column
to slots.
+ Preconditions.checkArgument(refs !=
null,
+ "mv column's ref column cannot
be null");
+ Expression parsedExpression =
expressionParser.parseExpression(
+
column.getDefineExpr().toSql());
+ Expression boundExpression =
SlotReplacer.INSTANCE
+ .replace(parsedExpression,
columnToOutput);
+
+ NamedExpression slot = boundExpression
instanceof NamedExpression
+ ? ((NamedExpression)
boundExpression)
+ : new Alias(boundExpression);
+
+ columnToOutput.put(column.getName(),
slot);
+ } else if
(columnToChildOutput.containsKey(column)) {
+ columnToOutput.put(column.getName(),
columnToChildOutput.get(column));
} else {
- columnToOutput.put(column.getName(),
- new
Alias(Literal.of(column.getDefaultValue())
-
.checkedCastTo(DataType.fromCatalogType(column.getType())),
- column.getName()));
+ if (table.hasSequenceCol()
+ &&
column.getName().equals(Column.SEQUENCE_COL)
+ && table.getSequenceMapCol()
!= null) {
+ Column seqCol =
table.getFullSchema().stream()
+ .filter(col ->
col.getName().equals(table.getSequenceMapCol()))
+ .findFirst().get();
+
columnToOutput.put(column.getName(), columnToOutput.get(seqCol.getName()));
+ } else if (column.getDefaultValue() ==
null) {
+
columnToOutput.put(column.getName(), new Alias(
+ new
NullLiteral(DataType.fromCatalogType(column.getType())),
+ column.getName()));
+ } else {
+
columnToOutput.put(column.getName(),
+ new
Alias(Literal.of(column.getDefaultValue())
+
.checkedCastTo(DataType.fromCatalogType(column.getType())),
+ column.getName()));
+ }
}
}
+ } finally {
+ if (ConnectContext.get() != null) {
+ // this is a trick way to avoid legacy
planner's slotRef toSql output include label
+ // set back to original value.
+
ConnectContext.get().getState().setIsQuery(false);
+ }
}
List<NamedExpression> fullOutputExprs =
ImmutableList.copyOf(columnToOutput.values());
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]