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

Commit36785a2

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 parenta25c2b7 commit36785a2

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
@@ -2731,7 +2731,21 @@ compute_scalar_stats(VacAttrStatsP stats,
27312731
slot_idx++;
27322732
}
27332733
}
2734-
elseif (nonnull_cnt==0&&null_cnt>0)
2734+
elseif (nonnull_cnt>0)
2735+
{
2736+
/* We found some non-null values, but they were all too wide */
2737+
Assert(nonnull_cnt==toowide_cnt);
2738+
stats->stats_valid= true;
2739+
/* Do the simple null-frac and width stats */
2740+
stats->stanullfrac= (double)null_cnt / (double)samplerows;
2741+
if (is_varwidth)
2742+
stats->stawidth=total_width / (double)nonnull_cnt;
2743+
else
2744+
stats->stawidth=stats->attrtype->typlen;
2745+
/* Assume all too-wide values are distinct, so it's a unique column */
2746+
stats->stadistinct=-1.0;
2747+
}
2748+
elseif (null_cnt>0)
27352749
{
27362750
/* We found only nulls; assume the column is entirely null */
27372751
stats->stats_valid= true;

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp