blob: e29a392a9b73ad59b5c94f85dab8f1c02a2d6e47 [file]
====
---- QUERY
CREATE TABLE optimize_nopart (i int)
STORED BY ICEBERG
TBLPROPERTIES('format-version'='3');
INSERT INTO optimize_nopart VALUES (1);
INSERT INTO optimize_nopart VALUES (2);
INSERT INTO optimize_nopart VALUES (3);
-- _file_row_id and _file_last_updated_sequence_number are missing from the initial data files.
SELECT _file_row_id, ICEBERG__FIRST__ROW__ID, _file_last_updated_sequence_number, ICEBERG__DATA__SEQUENCE__NUMBER, *
FROM optimize_nopart;
---- RESULTS
NULL,0,NULL,1,1
NULL,1,NULL,2,2
NULL,2,NULL,3,3
---- TYPES
BIGINT,BIGINT,BIGINT,BIGINT,INT
====
---- QUERY
# OPTIMIZE should populate _file_row_id and _file_last_updated_sequence_number for all rows.
OPTIMIZE TABLE optimize_nopart;
SELECT _file_row_id, _file_last_updated_sequence_number, * FROM optimize_nopart;
---- RESULTS
0,1,1
1,2,2
2,3,3
---- TYPES
BIGINT,BIGINT,INT
====
---- QUERY
# Further compaction shouldn't change the row lineage fields.
OPTIMIZE TABLE optimize_nopart;
SELECT _file_row_id, _file_last_updated_sequence_number, * FROM optimize_nopart;
---- RESULTS
0,1,1
1,2,2
2,3,3
---- TYPES
BIGINT,BIGINT,INT
====
---- QUERY
CREATE TABLE optimize_nopart_multi_rows (i int)
STORED BY ICEBERG
TBLPROPERTIES('format-version'='3');
INSERT INTO optimize_nopart_multi_rows VALUES (1),(2);
INSERT INTO optimize_nopart_multi_rows VALUES (3),(4);
INSERT INTO optimize_nopart_multi_rows VALUES (5),(6);
SELECT _file_row_id, ICEBERG__FIRST__ROW__ID, _file_last_updated_sequence_number, ICEBERG__DATA__SEQUENCE__NUMBER, *
FROM optimize_nopart_multi_rows;
---- RESULTS
NULL,0,NULL,1,1
NULL,0,NULL,1,2
NULL,2,NULL,2,3
NULL,2,NULL,2,4
NULL,4,NULL,3,5
NULL,4,NULL,3,6
---- TYPES
BIGINT,BIGINT,BIGINT,BIGINT,INT
====
---- QUERY
# OPTIMIZE should populate _file_row_id with ICEBERG__FIRST__ROW__ID + FILE__POSITION.
OPTIMIZE TABLE optimize_nopart_multi_rows;
SELECT _file_row_id, _file_last_updated_sequence_number, *
FROM optimize_nopart_multi_rows;
---- RESULTS
0,1,1
1,1,2
2,2,3
3,2,4
4,3,5
5,3,6
---- TYPES
BIGINT,BIGINT,INT
====
---- QUERY
CREATE TABLE optimize_part (i int, s string)
PARTITIONED BY SPEC (TRUNCATE(1,s))
STORED BY ICEBERG
TBLPROPERTIES('format-version'='3');
INSERT INTO optimize_part VALUES (1,'aa'),(2,'ab');
INSERT INTO optimize_part VALUES (3,'ac'),(4,'ad');
INSERT INTO optimize_part VALUES (5,'ba'),(6,'bb');
SELECT _file_row_id, ICEBERG__FIRST__ROW__ID, _row_id, '|',
_file_last_updated_sequence_number, ICEBERG__DATA__SEQUENCE__NUMBER, _last_updated_sequence_number, '|',
*
FROM optimize_part;
---- RESULTS
NULL,0,0,'|',NULL,1,1,'|',1,'aa'
NULL,0,1,'|',NULL,1,1,'|',2,'ab'
NULL,2,2,'|',NULL,2,2,'|',3,'ac'
NULL,2,3,'|',NULL,2,2,'|',4,'ad'
NULL,4,4,'|',NULL,3,3,'|',5,'ba'
NULL,4,5,'|',NULL,3,3,'|',6,'bb'
---- TYPES
BIGINT,BIGINT,BIGINT,STRING,BIGINT,BIGINT,BIGINT,STRING,INT,STRING
====
---- QUERY
# With FILE_SIZE_THRESHOLD_MB specified, OPTIMIZE only compact partitions with at least
# two data files.
OPTIMIZE TABLE optimize_part (FILE_SIZE_THRESHOLD_MB=10);
SELECT _file_row_id, _row_id, '|',
_file_last_updated_sequence_number, _last_updated_sequence_number, '|',
*
FROM optimize_part;
---- RESULTS
0,0,'|',1,1,'|',1,'aa'
1,1,'|',1,1,'|',2,'ab'
2,2,'|',2,2,'|',3,'ac'
3,3,'|',2,2,'|',4,'ad'
NULL,4,'|',NULL,3,'|',5,'ba'
NULL,5,'|',NULL,3,'|',6,'bb'
---- TYPES
BIGINT,BIGINT,STRING,BIGINT,BIGINT,STRING,INT,STRING
====
---- QUERY
# Let's do a full compaction on the partially compacted table.
OPTIMIZE TABLE optimize_part;
SELECT _file_row_id, _file_last_updated_sequence_number, *
FROM optimize_part;
---- RESULTS
0,1,1,'aa'
1,1,2,'ab'
2,2,3,'ac'
3,2,4,'ad'
4,3,5,'ba'
5,3,6,'bb'
---- TYPES
BIGINT,BIGINT,INT,STRING
====
---- QUERY
# Test compacting an upgraded table.
CREATE TABLE optimize_upgraded (i int)
-- Partitioning is needed for stable first-row-id assignment by Iceberg.
PARTITIONED BY SPEC (i)
STORED BY ICEBERG
TBLPROPERTIES('format-version'='2');
INSERT INTO optimize_upgraded VALUES (1);
INSERT INTO optimize_upgraded VALUES (2);
INSERT INTO optimize_upgraded VALUES (3);
ALTER TABLE optimize_upgraded SET TBLPROPERTIES('format-version'='3');
SELECT _file_row_id, ICEBERG__FIRST__ROW__ID,
_file_last_updated_sequence_number, ICEBERG__DATA__SEQUENCE__NUMBER,
*
FROM optimize_upgraded;
---- RESULTS
NULL,NULL,NULL,1,1
NULL,NULL,NULL,2,2
NULL,NULL,NULL,3,3
---- TYPES
BIGINT,BIGINT,BIGINT,BIGINT,INT
====
---- QUERY
# First OPTIMIZE cannot persist _file_row_id in the data files because both the
# original _file_row_id and first-row-id are missing. First-row-id assignment happens
# during the commit phase of the OPTIMIZE command.
# However, OPTIMIZE should persist _file_last_updated_sequence_number with the original
# data sequence number.
OPTIMIZE TABLE optimize_upgraded;
SELECT _file_row_id, ICEBERG__FIRST__ROW__ID,
_file_last_updated_sequence_number, ICEBERG__DATA__SEQUENCE__NUMBER,
*
FROM optimize_upgraded;
---- RESULTS
NULL,0,1,4,1
NULL,1,2,4,2
NULL,2,3,4,3
---- TYPES
BIGINT,BIGINT,BIGINT,BIGINT,INT
====
---- QUERY
# Second OPTIMIZE persists the implicitly assigned row-ids by the first OPTIMIZE.
# The data files' first-row-id and data-sequence-number are updated independently.
OPTIMIZE TABLE optimize_upgraded;
SELECT _file_row_id, ICEBERG__FIRST__ROW__ID,
_file_last_updated_sequence_number, ICEBERG__DATA__SEQUENCE__NUMBER,
*
FROM optimize_upgraded;
---- RESULTS
0,3,1,5,1
1,4,2,5,2
2,5,3,5,3
---- TYPES
BIGINT,BIGINT,BIGINT,BIGINT,INT
====
---- QUERY
# Let's do a third compaction just for fun.
# _file_row_id and _file_last_updated_sequence_number should remain intact.
OPTIMIZE TABLE optimize_upgraded;
SELECT _file_row_id, ICEBERG__FIRST__ROW__ID,
_file_last_updated_sequence_number, ICEBERG__DATA__SEQUENCE__NUMBER,
*
FROM optimize_upgraded;
---- RESULTS
0,6,1,6,1
1,7,2,6,2
2,8,3,6,3
---- TYPES
BIGINT,BIGINT,BIGINT,BIGINT,INT
====
---- QUERY
SELECT _file_row_id, ICEBERG__FIRST__ROW__ID, _row_id, '|',
_file_last_updated_sequence_number, ICEBERG__DATA__SEQUENCE__NUMBER, _last_updated_sequence_number, '|',
*
FROM optimize_upgraded;
---- RESULTS
0,6,0,'|',1,6,1,'|',1
1,7,1,'|',2,6,2,'|',2
2,8,2,'|',3,6,3,'|',3
---- TYPES
BIGINT,BIGINT,BIGINT,STRING,BIGINT,BIGINT,BIGINT,STRING,INT
====