You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by mo...@apache.org on 2023/04/06 07:32:34 UTC
[doris] 09/09: [fix](planner) trying register constnat slotRef to table cause NPE (#18356)
This is an automated email from the ASF dual-hosted git repository.
morningman pushed a commit to branch branch-1.2-lts
in repository https://gitbox.apache.org/repos/asf/doris.git
commit f058a4641ba9459e0e539059e03b00997957aa6b
Author: AKIRA <33...@users.noreply.github.com>
AuthorDate: Thu Apr 6 12:50:12 2023 +0900
[fix](planner) trying register constnat slotRef to table cause NPE (#18356)
could reproduced by:
CREATE TABLE t (
name varchar(128)
) ENGINE=OLAP
UNIQUE KEY(name)
DISTRIBUTED BY HASH(name) BUCKETS 1;
insert into t values('abc');
SELECT cd
FROM
(SELECT cast(now() as string) cd FROM t) t1
JOIN
(select cast(now() as string) td from t GROUP BY now()) t2
ON t1.cd = t2.td;
ERROR 1105 (HY000): errCode = 2, detailMessage = Unexpected exception: null
---
.../java/org/apache/doris/analysis/Analyzer.java | 10 ++--
.../org/apache/doris/planner/QueryPlanTest.java | 1 -
.../data/query_p0/join/join_on_view.out | 3 +
.../suites/query_p0/aggregate/agg_on_view.groovy | 12 +++-
.../suites/query_p0/join/join_on_view.groovy | 66 ++++++++++++++++++++++
5 files changed, 84 insertions(+), 8 deletions(-)
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java
index 3a0b762806..c44df2d2bb 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java
@@ -1173,7 +1173,7 @@ public class Analyzer {
registerConstantConjunct(id, conjunct);
}
}
- markConstantConjunct(conjunct, fromHavingClause);
+ markConstantConjunct(conjunct, fromHavingClause, false);
}
}
@@ -1189,7 +1189,7 @@ public class Analyzer {
}
public void registerMigrateFailedConjuncts(InlineViewRef ref, Expr e) throws AnalysisException {
- markConstantConjunct(e, false);
+ markConstantConjunct(e, false, false);
Set<Expr> exprSet = globalState.migrateFailedConjuncts.computeIfAbsent(ref, (k) -> new HashSet<>());
exprSet.add(e);
}
@@ -1802,7 +1802,7 @@ public class Analyzer {
if (rhsRef.getJoinOp().isInnerJoin()) {
globalState.ijClauseByConjunct.put(conjunct.getId(), rhsRef);
}
- markConstantConjunct(conjunct, false);
+ markConstantConjunct(conjunct, false, true);
}
}
@@ -1814,9 +1814,9 @@ public class Analyzer {
* No-op if the conjunct is not constant or is outer joined.
* Throws an AnalysisException if there is an error evaluating `conjunct`
*/
- private void markConstantConjunct(Expr conjunct, boolean fromHavingClause)
+ private void markConstantConjunct(Expr conjunct, boolean fromHavingClause, boolean join)
throws AnalysisException {
- if (!conjunct.isConstant() || isOjConjunct(conjunct)) {
+ if (!conjunct.isConstant() || isOjConjunct(conjunct) || join) {
return;
}
if ((!fromHavingClause && !hasEmptySpjResultSet)
diff --git a/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java b/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java
index 42179fbd5e..8306c6ff14 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java
@@ -1538,7 +1538,6 @@ public class QueryPlanTest extends TestWithFeService {
sqls.add("explain select k3, dense_rank() OVER () AS rank FROM baseall where 1 =2;");
sqls.add("explain select rank from (select k3, dense_rank() OVER () AS rank FROM baseall) a where 1 =2;");
sqls.add("explain select * from baseall join bigtable as b where 1 = 2");
- sqls.add("explain select * from baseall join bigtable as b on null = 2");
for (String sql : sqls) {
String explainString = getSQLPlanOrErrorMsg(sql);
diff --git a/regression-test/data/query_p0/join/join_on_view.out b/regression-test/data/query_p0/join/join_on_view.out
new file mode 100644
index 0000000000..9c9c4c6c8a
--- /dev/null
+++ b/regression-test/data/query_p0/join/join_on_view.out
@@ -0,0 +1,3 @@
+-- This file is automatically generated. You should know what you did if you want to edit this
+-- !sql --
+
diff --git a/regression-test/suites/query_p0/aggregate/agg_on_view.groovy b/regression-test/suites/query_p0/aggregate/agg_on_view.groovy
index 9f700283e1..ad08521638 100644
--- a/regression-test/suites/query_p0/aggregate/agg_on_view.groovy
+++ b/regression-test/suites/query_p0/aggregate/agg_on_view.groovy
@@ -16,8 +16,12 @@
// under the License.
suite("agg_on_view") {
+
+ sql """
+ drop table if exists agg_on_view_test;
+ """
sql """
- create table test (
+ create table agg_on_view_test (
id int,
user_id int,
name varchar(20)
@@ -34,7 +38,11 @@ suite("agg_on_view") {
from (
select *,
"abc" as tag
- from test limit 10)t
+ from agg_on_view_test limit 10)t
group by user_id,tag
"""
+
+ sql """
+ drop table agg_on_view_test;
+ """
}
\ No newline at end of file
diff --git a/regression-test/suites/query_p0/join/join_on_view.groovy b/regression-test/suites/query_p0/join/join_on_view.groovy
new file mode 100644
index 0000000000..0ac951b9b6
--- /dev/null
+++ b/regression-test/suites/query_p0/join/join_on_view.groovy
@@ -0,0 +1,66 @@
+// 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.
+
+suite("join_on_view") {
+ sql """
+ drop table if exists jov_t1;
+ """
+ sql """
+ drop table if exists jov_t2;
+ """
+ sql """
+ CREATE TABLE jov_t1 (
+ id int(11) NOT NULL COMMENT ''
+ ) ENGINE=OLAP
+ UNIQUE KEY(id)
+ COMMENT "OLAP"
+ DISTRIBUTED BY HASH(id) BUCKETS 1
+ PROPERTIES (
+ "replication_allocation" = "tag.location.default: 1"
+ );
+ """
+ sql """
+ CREATE TABLE jov_t2 (
+ name varchar(128) COMMENT ''
+ ) ENGINE=OLAP
+ UNIQUE KEY(name)
+ COMMENT "OLAP"
+ DISTRIBUTED BY HASH(name) BUCKETS 1
+ PROPERTIES (
+ "replication_allocation" = "tag.location.default: 1"
+ );
+ """
+
+ qt_sql """
+ SELECT cd
+ FROM
+ (SELECT CURDATE() cd
+ FROM jov_t1) tbl1
+ JOIN
+ (select cast(now() as string) td
+ from jov_t2 b
+ GROUP BY now()) tbl2
+ ON tbl1.cd = tbl2.td;
+ """
+
+ sql """
+ drop table jov_t1;
+ """
+ sql """
+ drop table jov_t2;
+ """
+}
\ No newline at end of file
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org