- if (rows_hint->base.state == HINT_STATE_NOTUSED)
- joinrel->rows = adjust_rows(joinrel->rows, rows_hint);
+ if (!rows_hint->joinrelids ||
+ rows_hint->base.state == HINT_STATE_ERROR)
+ continue;
+
+ if (bms_equal(joinrelids, rows_hint->joinrelids))
+ {
+ /*
+ * This joinrel is just the target of this rows_hint, so tweak
+ * rows estimation according to the hint.
+ */
+ justforme = rows_hint;
+ }
+ else if (!(bms_is_subset(rows_hint->joinrelids, rel1->relids) ||
+ bms_is_subset(rows_hint->joinrelids, rel2->relids)) &&
+ bms_is_subset(rows_hint->joinrelids, joinrelids) &&
+ rows_hint->value_type == RVT_MULTI)
+ {
+ /*
+ * If the rows_hint's target relids is not a subset of both of
+ * component rels and is a subset of this joinrel, ths hint's
+ * targets spread over both component rels. This menas that
+ * this hint has been never applied so far and this joinrel is
+ * the first (and only) chance to fire in current join tree.
+ * Only the multiplication hint has the cumulative nature so we
+ * apply only RVT_MULTI in this way.
+ */
+ domultiply = rows_hint;
+ }