* the reference array for determining their length.
*/
nitems = ARR_DIMS(mcv_arr)[0];
+
+ /*
+ * Reject a MCV list larger than what statext_mcv_deserialize() is able to
+ * accept.
+ */
+ if (nitems > STATS_MCVLIST_MAX_ITEMS)
+ {
+ ereport(WARNING,
+ errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("could not parse array \"%s\": number of items (%d) exceeds maximum (%d)",
+ extarginfo[MOST_COMMON_VALS_ARG].argname,
+ nitems, STATS_MCVLIST_MAX_ITEMS));
+ goto mcv_error;
+ }
+
if (!check_mcvlist_array(freqs_arr, MOST_COMMON_FREQS_ARG, 1, nitems) ||
!check_mcvlist_array(base_freqs_arr, MOST_COMMON_BASE_FREQS_ARG, 1, nitems))
{
f
(1 row)
+-- warn: more MCV items than can be handled.
+SELECT pg_catalog.pg_restore_extended_stats(
+ 'schemaname', 'stats_import',
+ 'relname', 'test',
+ 'statistics_schemaname', 'stats_import',
+ 'statistics_name', 'test_stat_mcv',
+ 'inherited', false,
+ 'most_common_vals', (SELECT array_agg(ARRAY[g::text, g::text])
+ FROM generate_series(1, 10001) g),
+ 'most_common_freqs', (SELECT array_agg((1.0 / 10001)::double precision)
+ FROM generate_series(1, 10001) g),
+ 'most_common_base_freqs', (SELECT array_agg((1.0 / 10001)::double precision)
+ FROM generate_series(1, 10001) g));
+WARNING: could not parse array "most_common_vals": number of items (10001) exceeds maximum (10000)
+ pg_restore_extended_stats
+---------------------------
+ f
+(1 row)
+
-- ok: mcv
SELECT pg_catalog.pg_restore_extended_stats(
'schemaname', 'stats_import',
'most_common_freqs', '{0.25,0.25,0.25,0.25}'::double precision[],
'most_common_base_freqs', '{0.00390625,0.015625,0.00390625,0.015625}'::double precision[]);
+-- warn: more MCV items than can be handled.
+SELECT pg_catalog.pg_restore_extended_stats(
+ 'schemaname', 'stats_import',
+ 'relname', 'test',
+ 'statistics_schemaname', 'stats_import',
+ 'statistics_name', 'test_stat_mcv',
+ 'inherited', false,
+ 'most_common_vals', (SELECT array_agg(ARRAY[g::text, g::text])
+ FROM generate_series(1, 10001) g),
+ 'most_common_freqs', (SELECT array_agg((1.0 / 10001)::double precision)
+ FROM generate_series(1, 10001) g),
+ 'most_common_base_freqs', (SELECT array_agg((1.0 / 10001)::double precision)
+ FROM generate_series(1, 10001) g));
+
-- ok: mcv
SELECT pg_catalog.pg_restore_extended_stats(
'schemaname', 'stats_import',