Code review for 6190d828cd2
authorAmit Langote <amitlan@postgresql.org>
Mon, 25 Mar 2024 10:43:29 +0000 (19:43 +0900)
committerAmit Langote <amitlan@postgresql.org>
Mon, 25 Mar 2024 10:45:27 +0000 (19:45 +0900)
* Fix the comment of init_dummy_sjinfo() to remove references to
  non-existing parameters 'rel1' and 'rel2'.

* Adjust consider_new_or_clause() to call init_dummy_sjinfo() to make
  up a SpecialJoinInfo for inner joins like other code sites that
  were adjusted in 6190d828cd2 to do so.

Author: Richard Guo <guofenglinux@gmail.com>
Reported-by: Richard Guo <guofenglinux@gmail.com>
Discussion: https://postgr.es/m/CAExHW5tHqEf3ASVqvFFcghYGPfpy7o3xnvhHwBGbJFMRH8KjNw@mail.gmail.com

src/backend/optimizer/path/joinrels.c
src/backend/optimizer/util/orclauses.c

index 17ef825a345e2a330dc45afb089d6fd8fd4b5a2f..f3a9412d18a7a8838ff24e26a8bfe68fac2fd77d 100644 (file)
@@ -656,8 +656,9 @@ join_is_legal(PlannerInfo *root, RelOptInfo *rel1, RelOptInfo *rel2,
 
 /*
  * init_dummy_sjinfo
- *    Populate the given SpecialJoinInfo for a plain inner join between rel1
- *    and rel2
+ *    Populate the given SpecialJoinInfo for a plain inner join between the
+ *    left and right relations specified by left_relids and right_relids
+ *    respectively.
  *
  * Normally, an inner join does not have a SpecialJoinInfo node associated with
  * it. But some functions involved in join planning require one containing at
index d911c6547d921942e345bf6dce1573b719f2294e..5e2bf26ec43dcf89cc0fc90bd86fefba8121f88d 100644 (file)
@@ -19,6 +19,7 @@
 #include "nodes/nodeFuncs.h"
 #include "optimizer/optimizer.h"
 #include "optimizer/orclauses.h"
+#include "optimizer/paths.h"
 #include "optimizer/restrictinfo.h"
 
 
@@ -325,24 +326,10 @@ consider_new_or_clause(PlannerInfo *root, RelOptInfo *rel,
                 * Make up a SpecialJoinInfo for JOIN_INNER semantics.  (Compare
                 * approx_tuple_count() in costsize.c.)
                 */
-               sjinfo.type = T_SpecialJoinInfo;
-               sjinfo.min_lefthand = bms_difference(join_or_rinfo->clause_relids,
-                                                                                        rel->relids);
-               sjinfo.min_righthand = rel->relids;
-               sjinfo.syn_lefthand = sjinfo.min_lefthand;
-               sjinfo.syn_righthand = sjinfo.min_righthand;
-               sjinfo.jointype = JOIN_INNER;
-               sjinfo.ojrelid = 0;
-               sjinfo.commute_above_l = NULL;
-               sjinfo.commute_above_r = NULL;
-               sjinfo.commute_below_l = NULL;
-               sjinfo.commute_below_r = NULL;
-               /* we don't bother trying to make the remaining fields valid */
-               sjinfo.lhs_strict = false;
-               sjinfo.semi_can_btree = false;
-               sjinfo.semi_can_hash = false;
-               sjinfo.semi_operators = NIL;
-               sjinfo.semi_rhs_exprs = NIL;
+               init_dummy_sjinfo(&sjinfo,
+                                                 bms_difference(join_or_rinfo->clause_relids,
+                                                                                rel->relids),
+                                                 rel->relids);
 
                /* Compute inner-join size */
                orig_selec = clause_selectivity(root, (Node *) join_or_rinfo,