0001-error_on_duplicate_columns_in_analyze_v6.patch
application/octet-stream
Filename: 0001-error_on_duplicate_columns_in_analyze_v6.patch
Type: application/octet-stream
Part: 1
Patch
Format: unified
Series: patch v6-0001
| File | + | − |
|---|---|---|
| src/backend/commands/analyze.c | 17 | 0 |
| src/test/regress/expected/vacuum.out | 17 | 0 |
| src/test/regress/sql/vacuum.sql | 10 | 0 |
diff --git a/src/backend/commands/analyze.c b/src/backend/commands/analyze.c
index 08fc18e..a46ef0e 100644
--- a/src/backend/commands/analyze.c
+++ b/src/backend/commands/analyze.c
@@ -375,6 +375,7 @@ do_analyze_rel(Relation onerel, int options, VacuumParams *params,
if (va_cols != NIL)
{
ListCell *le;
+ List *unique_columns;
vacattrstats = (VacAttrStats **) palloc(list_length(va_cols) *
sizeof(VacAttrStats *));
@@ -394,6 +395,22 @@ do_analyze_rel(Relation onerel, int options, VacuumParams *params,
tcnt++;
}
attr_cnt = tcnt;
+
+ /*
+ * Verify that there are no duplicate entries in the column list.
+ *
+ * We do this after checking that all columns exist so that
+ * nonexistent columns ERROR with higher priority than
+ * duplicates.
+ */
+ unique_columns = list_concat_unique(NIL, va_cols);
+ if (list_length(unique_columns) != list_length(va_cols))
+ ereport(ERROR,
+ (errcode(ERRCODE_DUPLICATE_COLUMN),
+ errmsg("column lists cannot have duplicate entries"),
+ errhint("the column list specified for relation \"%s.%s\" contains duplicates",
+ get_namespace_name(RelationGetNamespace(onerel)),
+ RelationGetRelationName(onerel))));
}
else
{
diff --git a/src/test/regress/expected/vacuum.out b/src/test/regress/expected/vacuum.out
index 6f68663..99a7007 100644
--- a/src/test/regress/expected/vacuum.out
+++ b/src/test/regress/expected/vacuum.out
@@ -91,3 +91,20 @@ VACUUM (ANALYZE) vacparted;
VACUUM (FULL) vacparted;
VACUUM (FREEZE) vacparted;
DROP TABLE vacparted;
+-- analyze with duplicate columns
+CREATE TABLE analyze_test (a int, b char, c int, d char, e int, f char);
+ANALYZE analyze_test (f, d, b);
+ANALYZE VERBOSE analyze_test (a, a, a, a);
+INFO: analyzing "public.analyze_test"
+ERROR: column lists cannot have duplicate entries
+HINT: the column list specified for relation "public.analyze_test" contains duplicates
+ANALYZE VERBOSE analyze_test (a, b, c, d, e, f, b);
+INFO: analyzing "public.analyze_test"
+ERROR: column lists cannot have duplicate entries
+HINT: the column list specified for relation "public.analyze_test" contains duplicates
+ANALYZE analyze_test;
+VACUUM FREEZE ANALYZE analyze_test (c, d, e, b, d);
+ERROR: column lists cannot have duplicate entries
+HINT: the column list specified for relation "public.analyze_test" contains duplicates
+VACUUM ANALYZE analyze_test;
+DROP TABLE analyze_test;
diff --git a/src/test/regress/sql/vacuum.sql b/src/test/regress/sql/vacuum.sql
index 7c5fb04..3d4e308 100644
--- a/src/test/regress/sql/vacuum.sql
+++ b/src/test/regress/sql/vacuum.sql
@@ -74,3 +74,13 @@ VACUUM (ANALYZE) vacparted;
VACUUM (FULL) vacparted;
VACUUM (FREEZE) vacparted;
DROP TABLE vacparted;
+
+-- analyze with duplicate columns
+CREATE TABLE analyze_test (a int, b char, c int, d char, e int, f char);
+ANALYZE analyze_test (f, d, b);
+ANALYZE VERBOSE analyze_test (a, a, a, a);
+ANALYZE VERBOSE analyze_test (a, b, c, d, e, f, b);
+ANALYZE analyze_test;
+VACUUM FREEZE ANALYZE analyze_test (c, d, e, b, d);
+VACUUM ANALYZE analyze_test;
+DROP TABLE analyze_test;