mirror of
https://github.com/postgres/postgres.git
synced 2025-09-03 15:22:11 +03:00
Identify simple column references in extended statistics
Until now, when defining extended statistics, everything except a plain column reference was treated as complex expression. So for example "a" was a column reference, but "(a)" would be an expression. In most cases this does not matter much, but there were a couple strange consequences. For example CREATE STATISTICS s ON a FROM t; would fail, because extended stats require at least two columns. But CREATE STATISTICS s ON (a) FROM t; would succeed, because that requirement does not apply to expressions. Moreover, that statistics object is useless - the optimizer will always use the regular statistics collected for attribute "a". So do a bit more work to identify those expressions referencing a single column, and translate them to a simple column reference. Backpatch to 14, where support for extended statistics on expressions was introduced. Reported-by: Justin Pryzby Backpatch-through: 14 Discussion: https://postgr.es/m/20210816013255.GS10479%40telsasoft.com
This commit is contained in:
@@ -55,6 +55,8 @@ ERROR: duplicate expression in statistics definition
|
||||
CREATE STATISTICS tst (unrecognized) ON x, y FROM ext_stats_test;
|
||||
ERROR: unrecognized statistics kind "unrecognized"
|
||||
-- incorrect expressions
|
||||
CREATE STATISTICS tst ON (y) FROM ext_stats_test; -- single column reference
|
||||
ERROR: extended statistics require at least 2 columns
|
||||
CREATE STATISTICS tst ON y + z FROM ext_stats_test; -- missing parentheses
|
||||
ERROR: syntax error at or near "+"
|
||||
LINE 1: CREATE STATISTICS tst ON y + z FROM ext_stats_test;
|
||||
|
@@ -41,6 +41,7 @@ CREATE STATISTICS tst ON (x || 'x'), (x || 'x'), (y + 1), (x || 'x'), (x || 'x')
|
||||
CREATE STATISTICS tst ON (x || 'x'), (x || 'x'), y FROM ext_stats_test;
|
||||
CREATE STATISTICS tst (unrecognized) ON x, y FROM ext_stats_test;
|
||||
-- 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
|
||||
CREATE STATISTICS tst ON (x, y) FROM ext_stats_test; -- tuple expression
|
||||
DROP TABLE ext_stats_test;
|
||||
|
Reference in New Issue
Block a user