summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlvaro Herrera <alvherre@alvh.no-ip.org>2018-07-16 20:00:24 -0400
committerAlvaro Herrera <alvherre@alvh.no-ip.org>2018-07-16 20:00:39 -0400
commitcb9db2ab0674381b92559e011738f19e2bd0f6f2 (patch)
tree0e60eb9aa096b7b03a908aa022f1e4c4b38b2c2d
parente353389d24da48c708f72379f87e9b518baac521 (diff)
Fix ALTER TABLE...SET STATS error message for included columns
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>
-rw-r--r--src/backend/commands/tablecmds.c23
-rw-r--r--src/test/regress/expected/index_including.out14
-rw-r--r--src/test/regress/sql/index_including.sql10
3 files changed, 39 insertions, 8 deletions
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 22e81e712d8..4d3fc3098c9 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -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;
diff --git a/src/test/regress/expected/index_including.out b/src/test/regress/expected/index_including.out
index b7d1812ec5c..ee976994a44 100644
--- a/src/test/regress/expected/index_including.out
+++ b/src/test/regress/expected/index_including.out
@@ -245,6 +245,20 @@ 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;
+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
*/
CREATE TABLE tbl (c1 int,c2 int, c3 int, c4 box, UNIQUE(c1, c2) INCLUDE(c3,c4));
diff --git a/src/test/regress/sql/index_including.sql b/src/test/regress/sql/index_including.sql
index b71bcaf9360..b59adeb845e 100644
--- a/src/test/regress/sql/index_including.sql
+++ b/src/test/regress/sql/index_including.sql
@@ -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