[fix](planner)only allow null safe equal when both children are nullable (#29470)

This commit is contained in:
starocean999
2024-01-09 19:53:52 +08:00
committed by yiguolei
parent 94ebf9d7f6
commit 2c44951543
3 changed files with 225 additions and 1 deletions

View File

@ -277,7 +277,17 @@ public class HashJoinNode extends JoinNodeBase {
ExprSubstitutionMap combinedChildSmap = getCombinedChildWithoutTupleIsNullSmap();
List<Expr> newEqJoinConjuncts = Expr.substituteList(eqJoinConjuncts, combinedChildSmap, analyzer, false);
eqJoinConjuncts =
newEqJoinConjuncts.stream().map(entity -> (BinaryPredicate) entity).collect(Collectors.toList());
newEqJoinConjuncts.stream().map(entity -> {
BinaryPredicate predicate = (BinaryPredicate) entity;
if (predicate.getOp().equals(BinaryPredicate.Operator.EQ_FOR_NULL)) {
Preconditions.checkArgument(predicate.getChildren().size() == 2);
if (!predicate.getChild(0).isNullable() || !predicate.getChild(1).isNullable()) {
predicate.setOp(BinaryPredicate.Operator.EQ);
}
}
return predicate;
}
).collect(Collectors.toList());
otherJoinConjuncts = Expr.substituteList(otherJoinConjuncts, combinedChildSmap, analyzer, false);
computeOutputTuple(analyzer);

View File

@ -5,3 +5,6 @@
-- !select2 --
2
-- !select_xx --
1

View File

@ -88,4 +88,215 @@ suite("test_outer_join_with_null_value") {
sql """
drop table if exists outer_table_b;
"""
sql """drop TABLE IF EXISTS `ISE_xxx_t`;"""
sql """CREATE TABLE IF NOT EXISTS `ISE_xxx_t` (
`DATE_CD_PC` datev2 NULL COMMENT "",
`AREA_ID` bigint(20) NULL COMMENT "",
`CHANNEL_NAME` varchar(50) NULL COMMENT "",
`DATE_CD` datetimev2 NULL COMMENT ""
) ENGINE=OLAP
DUPLICATE KEY(`DATE_CD_PC`,`AREA_ID`,`CHANNEL_NAME`)
DISTRIBUTED BY HASH(`DATE_CD_PC`, `AREA_ID`, `CHANNEL_NAME`) BUCKETS 16
PROPERTIES(
"replication_num" = "1"
);"""
sql """insert into ISE_xxx_t(DATE_CD_PC, AREA_ID, CHANNEL_NAME, DATE_CD) values
("2023-12-27", 1, "xx", "2023-12-27"), ("2023-12-27", 1, "xx", "2023-12-27"),
("2023-12-27", 1, "xx", "2023-12-27"), ("2023-12-27", 1, "xx", "2023-12-27"),
("2023-12-27", 1, "xx", "2023-12-27");"""
sql """drop TABLE IF EXISTS `ISE_xxx_t2`;"""
sql """CREATE TABLE IF NOT EXISTS `ISE_xxx_t2` (
`DATE_CD` datev2 NULL COMMENT "",
`AREA_ID` int(11) NULL COMMENT ""
) ENGINE=OLAP
DUPLICATE KEY(`DATE_CD`,`AREA_ID`)
DISTRIBUTED BY HASH(`DATE_CD`, `AREA_ID`) BUCKETS 6
PROPERTIES(
"replication_num" = "1"
);"""
sql """insert into ISE_xxx_t2(AREA_ID, DATE_CD) values
(1, "2023-12-27"), (1, "2023-12-27"),
(1, "2023-12-27"), (1, "2023-12-27");"""
sql """drop TABLE IF EXISTS `ISE_xxx_t3`;"""
sql """CREATE TABLE IF NOT EXISTS `ISE_xxx_t3` (
`AREA_ID` int(11) NULL COMMENT ""
) ENGINE=OLAP
DUPLICATE KEY(`AREA_ID`)
DISTRIBUTED BY HASH(`AREA_ID`) BUCKETS 6
PROPERTIES(
"compression" = "LZ4",
"in_memory" = "false",
"replication_num" = "1"
);"""
sql """insert into ISE_xxx_t3(AREA_ID) values
(1), (1),(1),
(1), (1),(1),
(1), (1),(1);"""
sql """drop TABLE IF EXISTS `ISE_xxx_t4`;"""
sql """CREATE TABLE IF NOT EXISTS `ISE_xxx_t4` (
`AREA_ID` decimalv3(18, 0) NOT NULL ,
`COMM_LVL3_ID` decimalv3(18, 0) NULL ,
`AREA_NAME` varchar(400) NULL ,
`AREA_LEVEL` bigint(20) NULL ,
`LATN_ID` bigint(20) NULL
) ENGINE=OLAP
DUPLICATE KEY(`AREA_ID`)
DISTRIBUTED BY HASH(`AREA_ID`) BUCKETS 4
PROPERTIES(
"replication_num" = "1"
);"""
sql """insert into ISE_xxx_t4(AREA_ID, AREA_NAME, comm_lvl3_id, AREA_LEVEL, LATN_ID) values
(1, "xx", 2, 3, 15 ),
(1, "xx", 3, 3, 15 ),
(1, "xx", 4, 3, 15 ),
(1, "xx", 1, 3, 15 ),
(1, "xx", 32518, 3, 15);"""
sql """drop TABLE if EXISTS `ISE_xxx_t5`;"""
sql """CREATE TABLE `ISE_xxx_t5` (
`date_cd` datev2 NULL COMMENT "",
`order_id` varchar(20) NULL COMMENT "",
`area_id` decimalv3(18, 0) NULL COMMENT "",
)
DUPLICATE KEY(`date_cd`,`order_id`,`area_id`)
DISTRIBUTED BY HASH(`date_cd`, `order_id`, `area_id`) BUCKETS 6
PROPERTIES(
"replication_num" = "1"
);"""
sql """insert into ISE_xxx_t5(AREA_ID, date_cd) values
(1, "2023-12-27" ),(1, "2023-12-27" ),(1, "2023-12-27" ),
(1, "2023-12-27" ),(1, "2023-12-27" ),(1, "2023-12-27" );"""
sql """drop TABLE IF EXISTS `ISE_xxx_t6`;"""
sql """CREATE TABLE `ISE_xxx_t6` (
`DATE_CD` datev2 NULL COMMENT "",
`AREA_ID` decimalv3(16, 0) NULL COMMENT "",
`CHANNEL_TYPE` varchar(64) NULL COMMENT ""
) ENGINE=OLAP
DUPLICATE KEY(`DATE_CD`,`AREA_ID`)
DISTRIBUTED BY HASH(`DATE_CD`, `AREA_ID`) BUCKETS 6
PROPERTIES(
"replication_num" = "1"
);"""
sql """insert into ISE_xxx_t6(DATE_CD, AREA_ID, CHANNEL_TYPE) values
("2023-12-27", 1, "xx"),
("2023-12-27", 1, "xx"),
("2023-12-27", 1, "xx"),
("2023-12-27", 1, "xx"),
("2023-12-27", 1, "xx");"""
sql """drop VIEW if EXISTS `ISE_xxx_t7`;"""
sql """CREATE VIEW `ISE_xxx_t7` (
`AREA_ID_LV3`,
`AREA_ID`,
`AREA_NAME`,
`LATN_ID`,
`AREA_LEVEL`
) AS
SELECT
`P`.`COMM_LVL3_ID` AS `AREA_ID_LV3`,
`P`.`AREA_ID` AS `AREA_ID`,
`P`.`AREA_NAME` AS `AREA_NAME`,
`P`.`LATN_ID` AS `LATN_ID`,
`P`.`AREA_LEVEL` AS `AREA_LEVEL`
FROM
`ISE_xxx_t4` AS `P`
WHERE
`P`.`comm_lvl3_id` IN (2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 32518)
UNION
ALL
SELECT
NULL AS `AREA_ID_LV3`,
1 AS `AREA_ID`,
'xxx' AS `AREA_NAME`,
NULL AS `LATN_ID`,
1 AS `AREA_LEVEL`
FROM
`ISE_xxx_t4` AS `P`
WHERE
`P`.`AREA_ID` = 2;"""
sql """set enable_nereids_planner=false;"""
qt_select_xx """SELECT
COUNT(1) AS `m0`
FROM
(
SELECT
`t2`.`AREA_ID` AS `d0`
FROM
(
SELECT
`t1`.`CHANNEL_NAME` AS `CHANNEL_NAME`,
`t1`.`DATE_CD` AS `DATE_CD`,
`t1`.`DATE_CD_PC` AS `DATE_CD_PC`,
`t1`.`AREA_ID` AS `AREA_ID`
FROM
`ISE_xxx_t` AS `t1`
WHERE
(
(`t1`.`CHANNEL_NAME` IN ('xx'))
AND (
(`t1`.`DATE_CD_PC` >= DATE('2023-12-27'))
AND (`t1`.`DATE_CD_PC` < DATE('2023-12-28'))
)
)
) AS `t1`
LEFT JOIN `ISE_xxx_t7` AS `t2` ON (`t1`.`AREA_ID` <=> `t2`.`AREA_ID`)
LEFT JOIN `ISE_xxx_t3` AS `t3` ON (`t1`.`AREA_ID` <=> `t3`.`AREA_ID`)
LEFT JOIN (
SELECT
`t4`.`DATE_CD` AS `DATE_CD`,
`t4`.`AREA_ID` AS `AREA_ID`
FROM
`ISE_xxx_t2` AS `t4`
WHERE
(
(`t4`.`DATE_CD` >= DATE('2023-12-27'))
AND (`t4`.`DATE_CD` < DATE('2023-12-28'))
)
) AS `t4` ON (
(`t1`.`AREA_ID` <=> `t4`.`AREA_ID`)
AND (`t1`.`DATE_CD_PC` <=> `t4`.`DATE_CD`)
)
LEFT JOIN `ISE_xxx_t5` AS `t5` ON (
(`t1`.`AREA_ID` <=> `t5`.`area_id`)
AND (
`t1`.`DATE_CD` <=> (`t5`.`date_cd` + INTERVAL 0 SECOND)
)
)
LEFT JOIN (
SELECT
`t6`.`CHANNEL_TYPE` AS `CHANNEL_TYPE`,
`t6`.`AREA_ID` AS `AREA_ID`,
`t6`.`DATE_CD` AS `DATE_CD`
FROM
`ISE_xxx_t6` AS `t6`
WHERE
(
(
(`t6`.`DATE_CD` >= DATE('2023-12-27'))
AND (`t6`.`DATE_CD` < DATE('2023-12-28'))
)
AND (`t6`.`CHANNEL_TYPE` IN ('xx'))
)
) AS `t6` ON (
(`t1`.`DATE_CD_PC` <=> `t6`.`DATE_CD`)
AND (`t1`.`AREA_ID` <=> `t6`.`AREA_ID`)
AND (`t1`.`CHANNEL_NAME` <=> `t6`.`CHANNEL_TYPE`)
)
WHERE
(
(`t2`.`AREA_LEVEL` IN (3))
AND (`t2`.`LATN_ID` IN (15))
)
GROUP BY
`t2`.`AREA_ID`
) AS `T_COUNT_`;"""
}