Skip to content

Commit 6c41b50

Browse files
924060929dataroaring
authored andcommitted
[fix](nereids) fix insert stmt throw MultiCastDataSink cannot be cast to DataStreamSink (#38526)
fix `insert ... with ... select ...`, which not use some cte, and throw an exception: ``` errCode = 2, detailMessage = class org.apache.doris.planner.MultiCastDataSink cannot be cast to class org.apache.doris.planner.DataStreamSink (org.apache.doris.planner.MultiCastDataSink and org.apache.doris.planner.DataStreamSink are in unnamed module of loader 'app') ```
1 parent 8abf99e commit 6c41b50

File tree

2 files changed

+52
-1
lines changed

2 files changed

+52
-1
lines changed

fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/insert/OlapInsertExecutor.java

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import org.apache.doris.planner.DataSink;
4141
import org.apache.doris.planner.DataStreamSink;
4242
import org.apache.doris.planner.ExchangeNode;
43+
import org.apache.doris.planner.MultiCastDataSink;
4344
import org.apache.doris.planner.OlapTableSink;
4445
import org.apache.doris.planner.PlanFragment;
4546
import org.apache.doris.qe.ConnectContext;
@@ -139,7 +140,28 @@ public void finalizeSink(PlanFragment fragment, DataSink sink, PhysicalSink phys
139140
// set schema and partition info for tablet id shuffle exchange
140141
if (fragment.getPlanRoot() instanceof ExchangeNode
141142
&& fragment.getDataPartition().getType() == TPartitionType.TABLET_SINK_SHUFFLE_PARTITIONED) {
142-
DataStreamSink dataStreamSink = (DataStreamSink) (fragment.getChild(0).getSink());
143+
DataSink childFragmentSink = fragment.getChild(0).getSink();
144+
DataStreamSink dataStreamSink = null;
145+
if (childFragmentSink instanceof MultiCastDataSink) {
146+
MultiCastDataSink multiCastDataSink = (MultiCastDataSink) childFragmentSink;
147+
int outputExchangeId = (fragment.getPlanRoot()).getId().asInt();
148+
// which DataStreamSink link to the output exchangeNode?
149+
for (DataStreamSink currentDataStreamSink : multiCastDataSink.getDataStreamSinks()) {
150+
int sinkExchangeId = currentDataStreamSink.getExchNodeId().asInt();
151+
if (outputExchangeId == sinkExchangeId) {
152+
dataStreamSink = currentDataStreamSink;
153+
break;
154+
}
155+
}
156+
if (dataStreamSink == null) {
157+
throw new IllegalStateException("Can not find DataStreamSink in the MultiCastDataSink");
158+
}
159+
} else if (childFragmentSink instanceof DataStreamSink) {
160+
dataStreamSink = (DataStreamSink) childFragmentSink;
161+
} else {
162+
throw new IllegalStateException("Unsupported DataSink: " + childFragmentSink);
163+
}
164+
143165
Analyzer analyzer = new Analyzer(Env.getCurrentEnv(), ConnectContext.get());
144166
dataStreamSink.setTabletSinkSchemaParam(olapTableSink.createSchema(
145167
database.getId(), olapTableSink.getDstTable(), analyzer));

regression-test/suites/insert_p0/insert.groovy

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,4 +83,33 @@ suite("insert") {
8383
sql "sync"
8484
qt_insert """ select * from mutable_datatype order by c_bigint, c_double, c_string, c_date, c_timestamp, c_boolean, c_short_decimal"""
8585

86+
87+
multi_sql """
88+
drop table if exists table_select_test1;
89+
CREATE TABLE table_select_test1 (
90+
`id` int
91+
)
92+
distributed by hash(id)
93+
properties('replication_num'='1');
94+
95+
insert into table_select_test1 values(2);
96+
97+
drop table if exists table_test_insert1;
98+
create table table_test_insert1 (id int)
99+
partition by range(id)
100+
(
101+
partition p1 values[('1'), ('50')),
102+
partition p2 values[('50'), ('100'))
103+
)
104+
distributed by hash(id) buckets 100
105+
properties('replication_num'='1')
106+
107+
insert into table_test_insert1 values(1), (50);
108+
109+
insert into table_test_insert1
110+
with
111+
a as (select * from table_select_test1),
112+
b as (select * from a)
113+
select id from a;
114+
"""
86115
}

0 commit comments

Comments
 (0)