• David Rowley's avatar
    Prevent overly large and NaN row estimates in relations · a90c950f
    David Rowley authored
    Given a query with enough joins, it was possible that the query planner,
    after multiplying the row estimates with the join selectivity that the
    estimated number of rows would exceed the limits of the double data type
    and become infinite.
    
    To give an indication on how extreme a case is required to hit this, the
    particular example case reported required 379 joins to a table without any
    statistics, which resulted in the 1.0/DEFAULT_NUM_DISTINCT being used for
    the join selectivity.  This eventually caused the row estimates to go
    infinite and resulted in an assert failure in initial_cost_mergejoin()
    where the infinite row estimated was multiplied by an outerstartsel of 0.0
    resulting in NaN.  The failing assert verified that NaN <= Inf, which is
    false.
    
    To get around this we use clamp_row_est() to cap row estimates at a
    maximum of 1e100.  This value is thought to be low enough that costs
    derived from it would remain within the bounds of what the double type can
    represent.
    
    Aside from fixing the failing Assert, this also has the added benefit of
    making it so add_path() will still receive proper numerical values as
    costs which will allow it to make more sane choices when determining the
    cheaper path in extreme cases such as the one described above.
    
    Additionally, we also get rid of the isnan() checks in the join costing
    functions. The actual case which originally triggered those checks to be
    added in the first place never made it to the mailing lists.  It seems
    likely that the new code being added to clamp_row_est() will result in
    those becoming checks redundant, so just remove them.
    
    The fairly harmless assert failure problem does also exist in the
    backbranches, however, a more minimalistic fix will be applied there.
    
    Reported-by: Onder Kalaci
    Reviewed-by: Tom Lane
    Discussion: https://postgr.es/m/DM6PR21MB1211FF360183BCA901B27F04D80B0@DM6PR21MB1211.namprd21.prod.outlook.com
    a90c950f
costsize.c 189 KB