]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
CREATE STATISTICS: improve misleading error message
authorÁlvaro Herrera <alvherre@kurilemu.de>
Fri, 29 Aug 2025 12:43:47 +0000 (14:43 +0200)
committerÁlvaro Herrera <alvherre@kurilemu.de>
Fri, 29 Aug 2025 12:43:47 +0000 (14:43 +0200)
I think the error message for a different condition was inadvertently
copied.

This problem seems to have been introduced by commit a4d75c86bf15.

Author: Álvaro Herrera <alvherre@kurilemu.de>
Reported-by: jian he <jian.universality@gmail.com>
Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us>
Backpatch-through: 14
Discussion: https://postgr.es/m/CACJufxEZ48toGH0Em_6vdsT57Y3L8pLF=DZCQ_gCii6=C3MeXw@mail.gmail.com

src/backend/tcop/utility.c
src/test/regress/expected/stats_ext.out
src/test/regress/sql/stats_ext.sql

index 6fb4d64e7e2b5de8e121902cd06a13b7fea42e65..0cf1a8d80896dedd46fd4df04ef7a8660088010f 100644 (file)
@@ -1863,7 +1863,8 @@ ProcessUtilitySlow(ParseState *pstate,
                                        if (!IsA(rel, RangeVar))
                                                ereport(ERROR,
                                                                (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
-                                                                errmsg("only a single relation is allowed in CREATE STATISTICS")));
+                                                                errmsg("cannot create statistics on the specified relation"),
+                                                                errdetail("CREATE STATISTICS only supports tables, foreign tables and materialized views.")));
 
                                        /*
                                         * CREATE STATISTICS will influence future execution plans
index 2471c14385f861a59429538f1c1ad9475192b6b5..f3cc305381bfb3f55f5caf035b03c6a895c746b3 100644 (file)
@@ -54,6 +54,29 @@ CREATE STATISTICS tst ON (x || 'x'), (x || 'x'), y FROM ext_stats_test;
 ERROR:  duplicate expression in statistics definition
 CREATE STATISTICS tst (unrecognized) ON x, y FROM ext_stats_test;
 ERROR:  unrecognized statistics kind "unrecognized"
+-- unsupported targets
+CREATE STATISTICS tst ON a FROM (VALUES (x)) AS foo;
+ERROR:  cannot create statistics on the specified relation
+DETAIL:  CREATE STATISTICS only supports tables, foreign tables and materialized views.
+CREATE STATISTICS tst ON a FROM foo NATURAL JOIN bar;
+ERROR:  cannot create statistics on the specified relation
+DETAIL:  CREATE STATISTICS only supports tables, foreign tables and materialized views.
+CREATE STATISTICS tst ON a FROM (SELECT * FROM ext_stats_test) AS foo;
+ERROR:  cannot create statistics on the specified relation
+DETAIL:  CREATE STATISTICS only supports tables, foreign tables and materialized views.
+CREATE STATISTICS tst ON a FROM ext_stats_test s TABLESAMPLE system (x);
+ERROR:  cannot create statistics on the specified relation
+DETAIL:  CREATE STATISTICS only supports tables, foreign tables and materialized views.
+CREATE STATISTICS tst ON a FROM XMLTABLE('foo' PASSING 'bar' COLUMNS a text);
+ERROR:  cannot create statistics on the specified relation
+DETAIL:  CREATE STATISTICS only supports tables, foreign tables and materialized views.
+CREATE FUNCTION tftest(int) returns table(a int, b int) as $$
+SELECT $1, $1+i FROM generate_series(1,5) g(i);
+$$ LANGUAGE sql IMMUTABLE STRICT;
+CREATE STATISTICS alt_stat2 ON a FROM tftest(1);
+ERROR:  cannot create statistics on the specified relation
+DETAIL:  CREATE STATISTICS only supports tables, foreign tables and materialized views.
+DROP FUNCTION tftest;
 -- incorrect expressions
 CREATE STATISTICS tst ON (y) FROM ext_stats_test; -- single column reference
 ERROR:  extended statistics require at least 2 columns
index 9b2b54813d9b67f42d9589c9574af536a58ddf15..6b33d88910cfaf8e90314c14061067d3c2b6f408 100644 (file)
@@ -40,6 +40,17 @@ CREATE STATISTICS tst ON x, x, y, x, x, (x || 'x'), (y + 1), (x || 'x'), (x || '
 CREATE STATISTICS tst ON (x || 'x'), (x || 'x'), (y + 1), (x || 'x'), (x || 'x'), (y + 1), (x || 'x'), (x || 'x'), (y + 1) FROM ext_stats_test;
 CREATE STATISTICS tst ON (x || 'x'), (x || 'x'), y FROM ext_stats_test;
 CREATE STATISTICS tst (unrecognized) ON x, y FROM ext_stats_test;
+-- unsupported targets
+CREATE STATISTICS tst ON a FROM (VALUES (x)) AS foo;
+CREATE STATISTICS tst ON a FROM foo NATURAL JOIN bar;
+CREATE STATISTICS tst ON a FROM (SELECT * FROM ext_stats_test) AS foo;
+CREATE STATISTICS tst ON a FROM ext_stats_test s TABLESAMPLE system (x);
+CREATE STATISTICS tst ON a FROM XMLTABLE('foo' PASSING 'bar' COLUMNS a text);
+CREATE FUNCTION tftest(int) returns table(a int, b int) as $$
+SELECT $1, $1+i FROM generate_series(1,5) g(i);
+$$ LANGUAGE sql IMMUTABLE STRICT;
+CREATE STATISTICS alt_stat2 ON a FROM tftest(1);
+DROP FUNCTION tftest;
 -- incorrect expressions
 CREATE STATISTICS tst ON (y) FROM ext_stats_test; -- single column reference
 CREATE STATISTICS tst ON y + z FROM ext_stats_test; -- missing parentheses