This is an automated email from the ASF dual-hosted git repository.

panxiaolei pushed a commit to branch fix_0908
in repository https://gitbox.apache.org/repos/asf/doris.git

commit 932db15b86e77175ae641d435e47e693b6ea8b95
Author: BiteTheDDDDt <pxl...@qq.com>
AuthorDate: Fri Sep 8 14:47:53 2023 +0800

    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: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to