diff --git a/.unreleased/bugfix_6044 b/.unreleased/bugfix_6044 new file mode 100644 index 00000000000..f9270ad46fb --- /dev/null +++ b/.unreleased/bugfix_6044 @@ -0,0 +1 @@ +Fixes: #6044 Server crash when using duplicate segmentby column diff --git a/tsl/src/compression/create.c b/tsl/src/compression/create.c index 0e7da55ffea..117cb4ea97c 100644 --- a/tsl/src/compression/create.c +++ b/tsl/src/compression/create.c @@ -245,6 +245,14 @@ compresscolinfo_init(CompressColInfo *cc, Oid srctbl_relid, List *segmentby_cols errhint("The timescaledb.compress_segmentby option must reference a valid " "column."))); } + + /* Check if a column is duplicated in segment by column list. */ + if (segorder_colindex[col_attno - 1] != 0) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("duplicate column name \"%s\"", NameStr(col->colname)), + errhint("The timescaledb.compress_segmentby option must reference distinct " + "column."))); segorder_colindex[col_attno - 1] = i++; } /* the column indexes are numbered as seg_attnolen + diff --git a/tsl/test/expected/compression_errors.out b/tsl/test/expected/compression_errors.out index a3bf686d4d6..11d5b2d9659 100644 --- a/tsl/test/expected/compression_errors.out +++ b/tsl/test/expected/compression_errors.out @@ -195,6 +195,9 @@ HINT: The option timescaledb.compress_segmentby must be a set of columns separa ALTER TABLE foo set (timescaledb.compress, timescaledb.compress_orderby = 'a, p'); ERROR: invalid ordering column type point DETAIL: Could not identify a less-than operator for the type. +ALTER TABLE foo set (timescaledb.compress, timescaledb.compress_segmentby = 'b, b'); +ERROR: duplicate column name "b" +HINT: The timescaledb.compress_segmentby option must reference distinct column. --should succeed ALTER TABLE foo set (timescaledb.compress, timescaledb.compress_orderby = 'a, b'); --ddl on ht with compression diff --git a/tsl/test/sql/compression_errors.sql b/tsl/test/sql/compression_errors.sql index bd75af50c8b..1b4ca57875c 100644 --- a/tsl/test/sql/compression_errors.sql +++ b/tsl/test/sql/compression_errors.sql @@ -99,6 +99,7 @@ ALTER TABLE foo set (timescaledb.compress, timescaledb.compress_segmentby = 'ran ALTER TABLE foo set (timescaledb.compress, timescaledb.compress_segmentby = 'c LIMIT 1'); ALTER TABLE foo set (timescaledb.compress, timescaledb.compress_segmentby = 'c + b'); ALTER TABLE foo set (timescaledb.compress, timescaledb.compress_orderby = 'a, p'); +ALTER TABLE foo set (timescaledb.compress, timescaledb.compress_segmentby = 'b, b'); --should succeed ALTER TABLE foo set (timescaledb.compress, timescaledb.compress_orderby = 'a, b');