Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit6286526

Browse files
committed
Fix compute_scalar_stats() for case that all values exceed WIDTH_THRESHOLD.
The standard typanalyze functions skip over values whose detoasted sizeexceeds WIDTH_THRESHOLD (1024 bytes), so as to limit memory bloat duringANALYZE. However, we (I think I, actually :-() failed to consider thepossibility that *every* non-null value in a column is too wide. Whilecompute_minimal_stats() seems to behave reasonably anyway in such a case,compute_scalar_stats() just fell through and generated no pg_statisticentry at all. That's unnecessarily pessimistic: we can still producevalid stanullfrac and stawidth values in such cases, since we do includetoo-wide values in the average-width calculation. Furthermore, since thegeneral assumption in this code is that too-wide values are probably alldistinct from each other, it seems reasonable to set stadistinct to -1("all distinct").Per complaint from Kadri Raudsepp. This has been like this since roughlyneolithic times, so back-patch to all supported branches.
1 parentfd2ace8 commit6286526

File tree

1 file changed

+15
-1
lines changed

1 file changed

+15
-1
lines changed

‎src/backend/commands/analyze.c

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2732,7 +2732,21 @@ compute_scalar_stats(VacAttrStatsP stats,
27322732
slot_idx++;
27332733
}
27342734
}
2735-
elseif (nonnull_cnt==0&&null_cnt>0)
2735+
elseif (nonnull_cnt>0)
2736+
{
2737+
/* We found some non-null values, but they were all too wide */
2738+
Assert(nonnull_cnt==toowide_cnt);
2739+
stats->stats_valid= true;
2740+
/* Do the simple null-frac and width stats */
2741+
stats->stanullfrac= (double)null_cnt / (double)samplerows;
2742+
if (is_varwidth)
2743+
stats->stawidth=total_width / (double)nonnull_cnt;
2744+
else
2745+
stats->stawidth=stats->attrtype->typlen;
2746+
/* Assume all too-wide values are distinct, so it's a unique column */
2747+
stats->stadistinct=-1.0;
2748+
}
2749+
elseif (null_cnt>0)
27362750
{
27372751
/* We found only nulls; assume the column is entirely null */
27382752
stats->stats_valid= true;

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp