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
Message: Re: [Proposal] Allow users to specify multiple tables in VACUUM commands

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;