DROP TABLE IF EXISTS columns_with_multiple_streams;

SET mutations_sync = 2;

CREATE TABLE columns_with_multiple_streams (
  field0 Nullable(Int64) CODEC(Delta(2), LZ4),
  field1 Nullable(Int64) CODEC(Delta, LZ4),
  field2 Array(Array(Int64)) CODEC(Delta, LZ4),
  field3 Tuple(UInt32, Array(UInt64)) CODEC(T64, Default)
)
ENGINE = MergeTree
ORDER BY tuple()
SETTINGS min_rows_for_wide_part = 0, min_bytes_for_wide_part = 0;

INSERT INTO columns_with_multiple_streams VALUES(1, 1, [[1]], tuple(1, [1]));

SELECT * FROM columns_with_multiple_streams;

DETACH TABLE columns_with_multiple_streams;
ATTACH TABLE columns_with_multiple_streams;

SELECT * FROM columns_with_multiple_streams;

ALTER TABLE columns_with_multiple_streams MODIFY COLUMN field1 Nullable(UInt8);

INSERT INTO columns_with_multiple_streams VALUES(2, 2, [[2]], tuple(2, [2]));

SHOW CREATE TABLE columns_with_multiple_streams;

SELECT * FROM columns_with_multiple_streams ORDER BY field0;

ALTER TABLE columns_with_multiple_streams MODIFY COLUMN field3 CODEC(Delta, Default);

SHOW CREATE TABLE columns_with_multiple_streams;

INSERT INTO columns_with_multiple_streams VALUES(3, 3, [[3]], tuple(3, [3]));

OPTIMIZE TABLE columns_with_multiple_streams FINAL;

SELECT * FROM columns_with_multiple_streams ORDER BY field0;

DROP TABLE IF EXISTS columns_with_multiple_streams;

DROP TABLE IF EXISTS columns_with_multiple_streams_compact;

CREATE TABLE columns_with_multiple_streams_compact (
  field0 Nullable(Int64) CODEC(Delta(2), LZ4),
  field1 Nullable(Int64) CODEC(Delta, LZ4),
  field2 Array(Array(Int64)) CODEC(Delta, LZ4),
  field3 Tuple(UInt32, Array(UInt64)) CODEC(Delta, Default)
)
ENGINE = MergeTree
ORDER BY tuple()
SETTINGS min_rows_for_wide_part = 100000, min_bytes_for_wide_part = 100000;

INSERT INTO columns_with_multiple_streams_compact VALUES(1, 1, [[1]], tuple(1, [1]));

SELECT * FROM columns_with_multiple_streams_compact;

DETACH TABLE columns_with_multiple_streams_compact;
ATTACH TABLE columns_with_multiple_streams_compact;

SELECT * FROM columns_with_multiple_streams_compact;

ALTER TABLE columns_with_multiple_streams_compact MODIFY COLUMN field1 Nullable(UInt8);

INSERT INTO columns_with_multiple_streams_compact VALUES(2, 2, [[2]], tuple(2, [2]));

SHOW CREATE TABLE columns_with_multiple_streams_compact;

SELECT * FROM columns_with_multiple_streams_compact ORDER BY field0;

ALTER TABLE columns_with_multiple_streams_compact MODIFY COLUMN field3 CODEC(Delta, Default);

SELECT * FROM columns_with_multiple_streams_compact ORDER BY field0;

SHOW CREATE TABLE columns_with_multiple_streams_compact;

INSERT INTO columns_with_multiple_streams_compact VALUES(3, 3, [[3]], tuple(3, [3]));

SELECT * FROM columns_with_multiple_streams_compact ORDER BY field0;

DROP TABLE IF EXISTS columns_with_multiple_streams_compact;

DROP TABLE IF EXISTS columns_with_multiple_streams_bad_case;

-- validation still works, non-sense codecs checked
CREATE TABLE columns_with_multiple_streams_bad_case (
  field0 Nullable(String) CODEC(Delta, LZ4)
)
ENGINE = MergeTree
ORDER BY tuple(); --{serverError BAD_ARGUMENTS}

CREATE TABLE columns_with_multiple_streams_bad_case (
  field0 Tuple(Array(UInt64), String) CODEC(T64, LZ4)
)
ENGINE = MergeTree
ORDER BY tuple(); --{serverError ILLEGAL_SYNTAX_FOR_CODEC_TYPE}

SET allow_suspicious_codecs = 1;

CREATE TABLE columns_with_multiple_streams_bad_case (
  field0 Nullable(UInt64) CODEC(Delta)
)
ENGINE = MergeTree
ORDER BY tuple();

INSERT INTO columns_with_multiple_streams_bad_case VALUES(1), (2);

INSERT INTO columns_with_multiple_streams_bad_case VALUES(3);

OPTIMIZE TABLE columns_with_multiple_streams_bad_case FINAL;

SELECT * FROM columns_with_multiple_streams_bad_case ORDER BY field0;

DROP TABLE IF EXISTS columns_with_multiple_streams_bad_case;
