]> granicus.if.org Git - postgresql/commitdiff
Fix ALTER TABLE...SET STATS error message for included columns
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Tue, 17 Jul 2018 00:00:24 +0000 (20:00 -0400)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Tue, 17 Jul 2018 00:00:24 +0000 (20:00 -0400)
The existing error message was complaining that the column is not an
expression, which is not correct.  Introduce a suitable wording
variation and a test.

Co-authored-by: Yugo Nagata <nagata@sraoss.co.jp>
Discussion: https://postgr.es/m/20180628182803.e4632d5a.nagata@sraoss.co.jp
Reviewed-by: Álvaro Herrera <alvherre@alvh.no-ip.org>
src/backend/commands/tablecmds.c
src/test/regress/expected/index_including.out
src/test/regress/sql/index_including.sql

index 22e81e712d8867e793f08044dfc8499fb81ccd81..4d3fc3098c92a6b595a2e39d264a8de78bf92f64 100644 (file)
@@ -6504,14 +6504,21 @@ ATExecSetStatistics(Relation rel, const char *colName, int16 colNum, Node *newVa
                                 errmsg("cannot alter system column \"%s\"",
                                                colName)));
 
-       if ((rel->rd_rel->relkind == RELKIND_INDEX ||
-                rel->rd_rel->relkind == RELKIND_PARTITIONED_INDEX) &&
-               rel->rd_index->indkey.values[attnum - 1] != 0)
-               ereport(ERROR,
-                               (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
-                                errmsg("cannot alter statistics on non-expression column \"%s\" of index \"%s\"",
-                                               NameStr(attrtuple->attname), RelationGetRelationName(rel)),
-                                errhint("Alter statistics on table column instead.")));
+       if (rel->rd_rel->relkind == RELKIND_INDEX ||
+               rel->rd_rel->relkind == RELKIND_PARTITIONED_INDEX)
+       {
+               if (attnum > rel->rd_index->indnkeyatts)
+                       ereport(ERROR,
+                                       (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+                                        errmsg("cannot alter statistics on included column \"%s\" of index \"%s\"",
+                                                       NameStr(attrtuple->attname), RelationGetRelationName(rel))));
+               else if (rel->rd_index->indkey.values[attnum - 1] != 0)
+                       ereport(ERROR,
+                                       (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+                                        errmsg("cannot alter statistics on non-expression column \"%s\" of index \"%s\"",
+                                                       NameStr(attrtuple->attname), RelationGetRelationName(rel)),
+                                        errhint("Alter statistics on table column instead.")));
+       }
 
        attrtuple->attstattarget = newtarget;
 
index b7d1812ec5cd85d548aad927da617d6e362777a0..ee976994a4406dbded1ae029d4f610e79680a423 100644 (file)
@@ -243,6 +243,20 @@ SELECT indexdef FROM pg_indexes WHERE tablename = 'tbl' ORDER BY indexname;
 ----------
 (0 rows)
 
+DROP TABLE tbl;
+/*
+ * 3.3 Test ALTER TABLE SET STATISTICS
+ */
+CREATE TABLE tbl (c1 int, c2 int);
+CREATE INDEX tbl_idx ON tbl (c1, (c1+0)) INCLUDE (c2);
+ALTER INDEX tbl_idx ALTER COLUMN 1 SET STATISTICS 1000;
+ERROR:  cannot alter statistics on non-expression column "c1" of index "tbl_idx"
+HINT:  Alter statistics on table column instead.
+ALTER INDEX tbl_idx ALTER COLUMN 2 SET STATISTICS 1000;
+ALTER INDEX tbl_idx ALTER COLUMN 3 SET STATISTICS 1000;
+ERROR:  cannot alter statistics on included column "c2" of index "tbl_idx"
+ALTER INDEX tbl_idx ALTER COLUMN 4 SET STATISTICS 1000;
+ERROR:  column number 4 of relation "tbl_idx" does not exist
 DROP TABLE tbl;
 /*
  * 4. CREATE INDEX CONCURRENTLY
index b71bcaf93602ed2bb3df1293a164f06541d6b6e1..b59adeb845eda5666c801b4097472ffb3794c770 100644 (file)
@@ -137,6 +137,16 @@ ALTER TABLE tbl DROP COLUMN c1;
 SELECT indexdef FROM pg_indexes WHERE tablename = 'tbl' ORDER BY indexname;
 DROP TABLE tbl;
 
+/*
+ * 3.3 Test ALTER TABLE SET STATISTICS
+ */
+CREATE TABLE tbl (c1 int, c2 int);
+CREATE INDEX tbl_idx ON tbl (c1, (c1+0)) INCLUDE (c2);
+ALTER INDEX tbl_idx ALTER COLUMN 1 SET STATISTICS 1000;
+ALTER INDEX tbl_idx ALTER COLUMN 2 SET STATISTICS 1000;
+ALTER INDEX tbl_idx ALTER COLUMN 3 SET STATISTICS 1000;
+ALTER INDEX tbl_idx ALTER COLUMN 4 SET STATISTICS 1000;
+DROP TABLE tbl;
 
 /*
  * 4. CREATE INDEX CONCURRENTLY