Fix orca judgement of whether relation is empty is not accurate. When retrieve RelStats, orca use reltuples is whether -1 to decide relation is empty. However, reltuples 0 also means relation is empty. Authored-by: Zhang Wenchao <zhangwenchao@apache.org>
diff --git a/contrib/pax_storage/src/test/regress/expected/DML_over_joins_optimizer.out b/contrib/pax_storage/src/test/regress/expected/DML_over_joins_optimizer.out index aa87cea..abdad77 100644 --- a/contrib/pax_storage/src/test/regress/expected/DML_over_joins_optimizer.out +++ b/contrib/pax_storage/src/test/regress/expected/DML_over_joins_optimizer.out
@@ -1613,22 +1613,21 @@ QUERY PLAN ------------------------------------------------------------------------------ Delete on tab1 - -> Result - -> Redistribute Motion 3:3 (slice1; segments: 3) - Hash Key: tab1.b - -> Hash Join - Hash Cond: (tab2.a = tab1.a) - -> Seq Scan on tab2 - -> Hash - -> Redistribute Motion 3:3 (slice2; segments: 3) - Hash Key: tab1.a - -> Hash Join - Hash Cond: (tab3.b = tab1.b) - -> Seq Scan on tab3 - -> Hash - -> Seq Scan on tab1 + -> Hash Join + Hash Cond: (tab3.b = tab1.b) + -> Seq Scan on tab3 + -> Hash + -> Redistribute Motion 3:3 (slice1; segments: 3) + Hash Key: tab1.b + -> Hash Join + Hash Cond: (tab2.a = tab1.a) + -> Seq Scan on tab2 + -> Hash + -> Redistribute Motion 3:3 (slice2; segments: 3) + Hash Key: tab1.a + -> Seq Scan on tab1 Optimizer: GPORCA -(16 rows) +(15 rows) -- ---------------------------------------------------------------------- -- Test: teardown.sql
diff --git a/contrib/pax_storage/src/test/regress/expected/bfv_joins_optimizer.out b/contrib/pax_storage/src/test/regress/expected/bfv_joins_optimizer.out index cc84f99..e91d5ab 100644 --- a/contrib/pax_storage/src/test/regress/expected/bfv_joins_optimizer.out +++ b/contrib/pax_storage/src/test/regress/expected/bfv_joins_optimizer.out
@@ -2982,28 +2982,27 @@ QUERY PLAN --------------------------------------------------------------------------------------------- Gather Motion 3:1 (slice1; segments: 3) - -> Hash Join - Hash Cond: (member."group_id" = member_group."group_id") - -> Seq Scan on member - -> Hash - -> Broadcast Motion 3:3 (slice2; segments: 3) - -> Hash Left Join - Hash Cond: (member_subgroup.subgroup_name = (region.county_name)::text) - Join Filter: (member_group."group_id" = ANY ('{12,13,14,15}'::integer[])) - -> Redistribute Motion 3:3 (slice3; segments: 3) - Hash Key: member_subgroup.subgroup_name - -> Hash Join - Hash Cond: (member_subgroup."group_id" = member_group."group_id") - -> Redistribute Motion 3:3 (slice4; segments: 3) - Hash Key: member_subgroup."group_id" + -> Hash Left Join + Hash Cond: (member_subgroup.subgroup_name = (region.county_name)::text) + Join Filter: (member_group."group_id" = ANY ('{12,13,14,15}'::integer[])) + -> Redistribute Motion 3:3 (slice2; segments: 3) + Hash Key: member_subgroup.subgroup_name + -> Hash Join + Hash Cond: (member."group_id" = member_group."group_id") + -> Redistribute Motion 3:3 (slice3; segments: 3) + Hash Key: member."group_id" + -> Hash Join + Hash Cond: (member."group_id" = member_subgroup."group_id") + -> Seq Scan on member + -> Hash + -> Broadcast Motion 3:3 (slice4; segments: 3) -> Seq Scan on member_subgroup - -> Hash - -> Seq Scan on member_group - -> Hash - -> Redistribute Motion 3:3 (slice5; segments: 3) - Hash Key: region.county_name - -> Seq Scan on region - Optimizer: Pivotal Optimizer (GPORCA) + -> Hash + -> Seq Scan on member_group + -> Hash + -> Redistribute Motion 3:3 (slice5; segments: 3) + Hash Key: region.county_name + -> Seq Scan on region (23 rows) -- Test colocated equijoins on coerced distribution keys
diff --git a/src/backend/gpopt/translate/CTranslatorRelcacheToDXL.cpp b/src/backend/gpopt/translate/CTranslatorRelcacheToDXL.cpp index d8e1da2..6a5d679 100644 --- a/src/backend/gpopt/translate/CTranslatorRelcacheToDXL.cpp +++ b/src/backend/gpopt/translate/CTranslatorRelcacheToDXL.cpp
@@ -1836,7 +1836,7 @@ * count of the partition table is -1. */ BOOL relation_empty = false; - if (num_rows == -1.0) + if (num_rows == -1.0 || num_rows == 0.0) { relation_empty = true; }
diff --git a/src/test/regress/expected/DML_over_joins_optimizer.out b/src/test/regress/expected/DML_over_joins_optimizer.out index c0d7286..77a90f8 100644 --- a/src/test/regress/expected/DML_over_joins_optimizer.out +++ b/src/test/regress/expected/DML_over_joins_optimizer.out
@@ -1774,22 +1774,21 @@ QUERY PLAN ------------------------------------------------------------------------------ Delete on tab1 - -> Result - -> Redistribute Motion 3:3 (slice1; segments: 3) - Hash Key: tab1.b - -> Hash Join - Hash Cond: (tab2.a = tab1.a) - -> Seq Scan on tab2 - -> Hash - -> Redistribute Motion 3:3 (slice2; segments: 3) - Hash Key: tab1.a - -> Hash Join - Hash Cond: (tab3.b = tab1.b) - -> Seq Scan on tab3 - -> Hash - -> Seq Scan on tab1 + -> Hash Join + Hash Cond: (tab3.b = tab1.b) + -> Seq Scan on tab3 + -> Hash + -> Redistribute Motion 3:3 (slice1; segments: 3) + Hash Key: tab1.b + -> Hash Join + Hash Cond: (tab2.a = tab1.a) + -> Seq Scan on tab2 + -> Hash + -> Redistribute Motion 3:3 (slice2; segments: 3) + Hash Key: tab1.a + -> Seq Scan on tab1 Optimizer: GPORCA -(16 rows) +(15 rows) -- ---------------------------------------------------------------------- -- Test delete on partition table from join on another partition table
diff --git a/src/test/regress/expected/bfv_joins_optimizer.out b/src/test/regress/expected/bfv_joins_optimizer.out index cccfe3d..6ae5ea6 100644 --- a/src/test/regress/expected/bfv_joins_optimizer.out +++ b/src/test/regress/expected/bfv_joins_optimizer.out
@@ -3294,27 +3294,27 @@ QUERY PLAN --------------------------------------------------------------------------------------------- Gather Motion 3:1 (slice1; segments: 3) - -> Hash Join - Hash Cond: (member."group_id" = member_group."group_id") - -> Seq Scan on member - -> Hash - -> Broadcast Motion 3:3 (slice2; segments: 3) - -> Hash Left Join - Hash Cond: (member_subgroup.subgroup_name = (region.county_name)::text) - Join Filter: (member_group."group_id" = ANY ('{12,13,14,15}'::integer[])) - -> Redistribute Motion 3:3 (slice3; segments: 3) - Hash Key: member_subgroup.subgroup_name - -> Hash Join - Hash Cond: (member_subgroup."group_id" = member_group."group_id") - -> Redistribute Motion 3:3 (slice4; segments: 3) - Hash Key: member_subgroup."group_id" + -> Hash Left Join + Hash Cond: (member_subgroup.subgroup_name = (region.county_name)::text) + Join Filter: (member_group."group_id" = ANY ('{12,13,14,15}'::integer[])) + -> Redistribute Motion 3:3 (slice2; segments: 3) + Hash Key: member_subgroup.subgroup_name + -> Hash Join + Hash Cond: (member."group_id" = member_group."group_id") + -> Redistribute Motion 3:3 (slice3; segments: 3) + Hash Key: member."group_id" + -> Hash Join + Hash Cond: (member."group_id" = member_subgroup."group_id") + -> Seq Scan on member + -> Hash + -> Broadcast Motion 3:3 (slice4; segments: 3) -> Seq Scan on member_subgroup - -> Hash - -> Seq Scan on member_group - -> Hash - -> Redistribute Motion 3:3 (slice5; segments: 3) - Hash Key: region.county_name - -> Seq Scan on region + -> Hash + -> Seq Scan on member_group + -> Hash + -> Redistribute Motion 3:3 (slice5; segments: 3) + Hash Key: region.county_name + -> Seq Scan on region Optimizer: Pivotal Optimizer (GPORCA) (23 rows)