From c8d61a31e254c99a53085dbafad13ddf34393269 Mon Sep 17 00:00:00 2001 From: Hadi Moshayedi Date: Sun, 7 Feb 2021 11:52:00 -0800 Subject: [PATCH] Columnar: chunk_group metadata table --- src/backend/columnar/cstore_metadata_tables.c | 57 +++++++++++++++++++ src/backend/columnar/cstore_writer.c | 11 +++- .../columnar/sql/columnar--9.5-1--10.0-1.sql | 13 ++++- .../downgrades/columnar--10.0-1--9.5-1.sql | 1 + src/include/columnar/columnar.h | 2 + src/test/regress/expected/am_create.out | 15 +++++ src/test/regress/expected/am_insert.out | 18 ++++++ src/test/regress/expected/am_recursive.out | 36 ++++++++++++ src/test/regress/expected/am_truncate.out | 30 ++++++++++ src/test/regress/expected/am_vacuum.out | 30 ++++++++++ src/test/regress/expected/multi_extension.out | 3 +- .../regress/expected/multi_extension_0.out | 3 +- .../expected/upgrade_list_citus_objects.out | 3 +- .../expected/upgrade_list_citus_objects_0.out | 3 +- src/test/regress/input/am_load.source | 2 + src/test/regress/output/am_load.source | 6 ++ src/test/regress/sql/am_create.sql | 17 ++++++ src/test/regress/sql/am_insert.sql | 6 ++ src/test/regress/sql/am_recursive.sql | 12 ++++ src/test/regress/sql/am_truncate.sql | 10 ++++ src/test/regress/sql/am_vacuum.sql | 10 ++++ 21 files changed, 282 insertions(+), 6 deletions(-) diff --git a/src/backend/columnar/cstore_metadata_tables.c b/src/backend/columnar/cstore_metadata_tables.c index 285d37c79..b51e1dde4 100644 --- a/src/backend/columnar/cstore_metadata_tables.c +++ b/src/backend/columnar/cstore_metadata_tables.c @@ -86,6 +86,7 @@ static Oid ColumnarStripeIndexRelationId(void); static Oid ColumnarOptionsRelationId(void); static Oid ColumnarOptionsIndexRegclass(void); static Oid ColumnarChunkRelationId(void); +static Oid ColumnarChunkGroupRelationId(void); static Oid ColumnarChunkIndexRelationId(void); static Oid ColumnarNamespaceId(void); static ModifyState * StartModifyRelation(Relation rel); @@ -139,6 +140,13 @@ typedef FormData_columnar_options *Form_columnar_options; #define Anum_columnar_stripe_chunk_row_count 7 #define Anum_columnar_stripe_row_count 8 +/* constants for columnar.chunk_group */ +#define Natts_columnar_chunkgroup 4 +#define Anum_columnar_chunkgroup_storageid 1 +#define Anum_columnar_chunkgroup_stripe 2 +#define Anum_columnar_chunkgroup_chunk 3 +#define Anum_columnar_chunkgroup_row_count 4 + /* constants for columnar.chunk */ #define Natts_columnar_chunk 14 #define Anum_columnar_chunk_storageid 1 @@ -462,6 +470,44 @@ SaveStripeSkipList(RelFileNode relfilenode, uint64 stripe, StripeSkipList *chunk } +/* + * SaveChunkGroups saves the metadata for given chunk groups in columnar.chunk_group. + */ +void +SaveChunkGroups(RelFileNode relfilenode, uint64 stripe, + List *chunkGroupRowCounts) +{ + ColumnarMetapage *metapage = ReadMetapage(relfilenode, false); + Oid columnarChunkGroupOid = ColumnarChunkGroupRelationId(); + Relation columnarChunkGroup = table_open(columnarChunkGroupOid, RowExclusiveLock); + ModifyState *modifyState = StartModifyRelation(columnarChunkGroup); + + ListCell *lc = NULL; + int chunkId = 0; + + foreach(lc, chunkGroupRowCounts) + { + int64 rowCount = lfirst_int(lc); + Datum values[Natts_columnar_chunkgroup] = { + UInt64GetDatum(metapage->storageId), + Int64GetDatum(stripe), + Int32GetDatum(chunkId), + Int64GetDatum(rowCount) + }; + + bool nulls[Natts_columnar_chunkgroup] = { false }; + + InsertTupleAndEnforceConstraints(modifyState, values, nulls); + chunkId++; + } + + FinishModifyRelation(modifyState); + table_close(columnarChunkGroup, NoLock); + + CommandCounterIncrement(); +} + + /* * ReadStripeSkipList fetches chunk metadata for a given stripe. */ @@ -1113,6 +1159,17 @@ ColumnarChunkRelationId(void) } +/* + * ColumnarChunkGroupRelationId returns relation id of columnar.chunk_group. + * TODO: should we cache this similar to citus? + */ +static Oid +ColumnarChunkGroupRelationId(void) +{ + return get_relname_relid("chunk_group", ColumnarNamespaceId()); +} + + /* * ColumnarChunkIndexRelationId returns relation id of columnar.chunk_pkey. * TODO: should we cache this similar to citus? diff --git a/src/backend/columnar/cstore_writer.c b/src/backend/columnar/cstore_writer.c index 2649d2003..6a75502c2 100644 --- a/src/backend/columnar/cstore_writer.c +++ b/src/backend/columnar/cstore_writer.c @@ -45,6 +45,8 @@ struct TableWriteState ColumnarOptions options; ChunkData *chunkData; + List *chunkGroupRowCounts; + /* * compressionBuffer buffer is used as temporary storage during * data value compression operation. It is kept here to minimize @@ -548,11 +550,15 @@ FlushStripe(TableWriteState *writeState) } } - /* create skip list and footer buffers */ + SaveChunkGroups(writeState->relfilenode, + stripeMetadata.id, + writeState->chunkGroupRowCounts); SaveStripeSkipList(writeState->relfilenode, stripeMetadata.id, stripeSkipList, tupleDescriptor); + writeState->chunkGroupRowCounts = NIL; + relation_close(relation, NoLock); } @@ -640,6 +646,9 @@ SerializeChunkData(TableWriteState *writeState, uint32 chunkIndex, uint32 rowCou const uint32 columnCount = stripeBuffers->columnCount; StringInfo compressionBuffer = writeState->compressionBuffer; + writeState->chunkGroupRowCounts = + lappend_int(writeState->chunkGroupRowCounts, rowCount); + /* serialize exist values, data values are already serialized */ for (columnIndex = 0; columnIndex < columnCount; columnIndex++) { diff --git a/src/backend/columnar/sql/columnar--9.5-1--10.0-1.sql b/src/backend/columnar/sql/columnar--9.5-1--10.0-1.sql index 52801104b..065c29eba 100644 --- a/src/backend/columnar/sql/columnar--9.5-1--10.0-1.sql +++ b/src/backend/columnar/sql/columnar--9.5-1--10.0-1.sql @@ -29,6 +29,17 @@ CREATE TABLE stripe ( COMMENT ON TABLE stripe IS 'Columnar per stripe metadata'; +CREATE TABLE chunk_group ( + storageid bigint NOT NULL, + stripeid bigint NOT NULL, + chunkid int NOT NULL, + row_count bigint NOT NULL, + PRIMARY KEY (storageid, stripeid, chunkid), + FOREIGN KEY (storageid, stripeid) REFERENCES stripe(storageid, stripeid) ON DELETE CASCADE +); + +COMMENT ON TABLE chunk_group IS 'Columnar chunk group metadata'; + CREATE TABLE chunk ( storageid bigint NOT NULL, stripeid bigint NOT NULL, @@ -45,7 +56,7 @@ CREATE TABLE chunk ( value_compression_level int NOT NULL, value_decompressed_length bigint NOT NULL, PRIMARY KEY (storageid, stripeid, attnum, chunkid), - FOREIGN KEY (storageid, stripeid) REFERENCES stripe(storageid, stripeid) ON DELETE CASCADE + FOREIGN KEY (storageid, stripeid, chunkid) REFERENCES chunk_group(storageid, stripeid, chunkid) ON DELETE CASCADE ) WITH (user_catalog_table = true); COMMENT ON TABLE chunk IS 'Columnar per chunk metadata'; diff --git a/src/backend/columnar/sql/downgrades/columnar--10.0-1--9.5-1.sql b/src/backend/columnar/sql/downgrades/columnar--10.0-1--9.5-1.sql index c5d757085..d82b09a74 100644 --- a/src/backend/columnar/sql/downgrades/columnar--10.0-1--9.5-1.sql +++ b/src/backend/columnar/sql/downgrades/columnar--10.0-1--9.5-1.sql @@ -30,6 +30,7 @@ END IF; END$proc$; DROP TABLE chunk; +DROP TABLE chunk_group; DROP TABLE stripe; DROP TABLE options; DROP SEQUENCE storageid_seq; diff --git a/src/include/columnar/columnar.h b/src/include/columnar/columnar.h index a990d41e1..c5af0f5f1 100644 --- a/src/include/columnar/columnar.h +++ b/src/include/columnar/columnar.h @@ -287,6 +287,8 @@ extern StripeMetadata ReserveStripe(Relation rel, uint64 size, extern void SaveStripeSkipList(RelFileNode relfilenode, uint64 stripe, StripeSkipList *stripeSkipList, TupleDesc tupleDescriptor); +extern void SaveChunkGroups(RelFileNode relfilenode, uint64 stripe, + List *chunkGroupRowCounts); extern StripeSkipList * ReadStripeSkipList(RelFileNode relfilenode, uint64 stripe, TupleDesc tupleDescriptor, uint32 chunkCount); diff --git a/src/test/regress/expected/am_create.out b/src/test/regress/expected/am_create.out index 5fcd6a1a9..c56b6fd4b 100644 --- a/src/test/regress/expected/am_create.out +++ b/src/test/regress/expected/am_create.out @@ -42,3 +42,18 @@ EXCEPTION WHEN invalid_parameter_value THEN return false; END; $$ LANGUAGE plpgsql; +-- are chunk groups and chunks consistent? +CREATE view chunk_group_consistency AS +WITH a as ( + SELECT storageid, stripeid, chunkid, min(value_count) as row_count + FROM columnar.chunk + GROUP BY 1,2,3 +), b as ( + SELECT storageid, stripeid, chunkid, max(value_count) as row_count + FROM columnar.chunk + GROUP BY 1,2,3 +), c as ( + (TABLE a EXCEPT TABLE b) UNION (TABLE b EXCEPT TABLE a) UNION + (TABLE a EXCEPT TABLE columnar.chunk_group) UNION (TABLE columnar.chunk_group EXCEPT TABLE a) +) +SELECT count(*) = 0 AS consistent FROM c; diff --git a/src/test/regress/expected/am_insert.out b/src/test/regress/expected/am_insert.out index 731ecacf7..e0c756029 100644 --- a/src/test/regress/expected/am_insert.out +++ b/src/test/regress/expected/am_insert.out @@ -45,6 +45,12 @@ select count(*) from test_insert_command; 3 (1 row) +SELECT * FROM chunk_group_consistency; + consistent +--------------------------------------------------------------------- + t +(1 row) + drop table test_insert_command_data; drop table test_insert_command; -- test long attribute value insertion @@ -61,6 +67,12 @@ CREATE TABLE test_cstore_long_text(int_val int, text_val text) USING columnar; -- store long text in cstore table INSERT INTO test_cstore_long_text SELECT * FROM test_long_text; +SELECT * FROM chunk_group_consistency; + consistent +--------------------------------------------------------------------- + t +(1 row) + -- drop source table to remove original text from toast DROP TABLE test_long_text; -- check if text data is still available in cstore table @@ -129,5 +141,11 @@ FROM test_toast_columnar; 5004 | 5004 | 5004 | 5004 (1 row) +SELECT * FROM chunk_group_consistency; + consistent +--------------------------------------------------------------------- + t +(1 row) + DROP TABLE test_toast_row; DROP TABLE test_toast_columnar; diff --git a/src/test/regress/expected/am_recursive.out b/src/test/regress/expected/am_recursive.out index df1fca496..bbf8173ed 100644 --- a/src/test/regress/expected/am_recursive.out +++ b/src/test/regress/expected/am_recursive.out @@ -72,6 +72,12 @@ SELECT * FROM t2; 5 | 6 (5 rows) +SELECT * FROM chunk_group_consistency; + consistent +--------------------------------------------------------------------- + t +(1 row) + TRUNCATE t1; TRUNCATE t2; -- @@ -101,6 +107,12 @@ SELECT * FROM t2; 3 | 0 (3 rows) +SELECT * FROM chunk_group_consistency; + consistent +--------------------------------------------------------------------- + t +(1 row) + TRUNCATE t1; TRUNCATE t2; -- @@ -125,6 +137,12 @@ SELECT * FROM t1 ORDER BY a, b; 5 | 10 (10 rows) +SELECT * FROM chunk_group_consistency; + consistent +--------------------------------------------------------------------- + t +(1 row) + TRUNCATE t1; TRUNCATE t2; -- @@ -165,6 +183,12 @@ SELECT * FROM t2 ORDER BY a, b; 5 | 5 (5 rows) +SELECT * FROM chunk_group_consistency; + consistent +--------------------------------------------------------------------- + t +(1 row) + TRUNCATE t1, t2, t3, t4; -- -- INSERT into the same relation that was INSERTed into in the UDF @@ -204,6 +228,12 @@ SELECT * FROM t3 ORDER BY a, b; --------------------------------------------------------------------- (0 rows) +SELECT * FROM chunk_group_consistency; + consistent +--------------------------------------------------------------------- + t +(1 row) + DROP FUNCTION g(int), g2(int); TRUNCATE t1, t2, t3, t4; -- @@ -248,5 +278,11 @@ SELECT * FROM t1 ORDER BY a, b; 23 | 46 (10 rows) +SELECT * FROM chunk_group_consistency; + consistent +--------------------------------------------------------------------- + t +(1 row) + DROP FUNCTION f(int); DROP TABLE t1, t2, t3, t4; diff --git a/src/test/regress/expected/am_truncate.out b/src/test/regress/expected/am_truncate.out index 7536e037b..ac621f43d 100644 --- a/src/test/regress/expected/am_truncate.out +++ b/src/test/regress/expected/am_truncate.out @@ -37,7 +37,19 @@ SELECT * FROM columnar_truncate_test; 10 | 10 (10 rows) +SELECT * FROM chunk_group_consistency; + consistent +--------------------------------------------------------------------- + t +(1 row) + TRUNCATE TABLE columnar_truncate_test; +SELECT * FROM chunk_group_consistency; + consistent +--------------------------------------------------------------------- + t +(1 row) + SELECT * FROM columnar_truncate_test; a | b --------------------------------------------------------------------- @@ -118,12 +130,24 @@ SELECT * from columnar_truncate_test_regular; 20 | 20 (11 rows) +SELECT * FROM chunk_group_consistency; + consistent +--------------------------------------------------------------------- + t +(1 row) + -- make sure multi truncate works -- notice that the same table might be repeated TRUNCATE TABLE columnar_truncate_test, columnar_truncate_test_regular, columnar_truncate_test_second, columnar_truncate_test; +SELECT * FROM chunk_group_consistency; + consistent +--------------------------------------------------------------------- + t +(1 row) + SELECT * from columnar_truncate_test; a | b --------------------------------------------------------------------- @@ -267,6 +291,12 @@ SELECT count(*) FROM truncate_schema.truncate_tbl; (1 row) \c - :current_user +SELECT * FROM chunk_group_consistency; + consistent +--------------------------------------------------------------------- + t +(1 row) + -- cleanup DROP SCHEMA truncate_schema CASCADE; NOTICE: drop cascades to table truncate_schema.truncate_tbl diff --git a/src/test/regress/expected/am_vacuum.out b/src/test/regress/expected/am_vacuum.out index 6afb4916b..3fc98c580 100644 --- a/src/test/regress/expected/am_vacuum.out +++ b/src/test/regress/expected/am_vacuum.out @@ -27,6 +27,12 @@ SELECT count(*) FROM t_stripes; -- vacuum full should merge stripes together VACUUM FULL t; +SELECT * FROM chunk_group_consistency; + consistent +--------------------------------------------------------------------- + t +(1 row) + SELECT sum(a), sum(b) FROM t; sum | sum --------------------------------------------------------------------- @@ -60,6 +66,12 @@ SELECT count(*) FROM t_stripes; (1 row) VACUUM FULL t; +SELECT * FROM chunk_group_consistency; + consistent +--------------------------------------------------------------------- + t +(1 row) + SELECT sum(a), sum(b) FROM t; sum | sum --------------------------------------------------------------------- @@ -203,6 +215,12 @@ compression rate: 1.25x total row count: 5530, stripe count: 5, average rows per stripe: 1106 chunk count: 7, containing data for dropped columns: 0, none compressed: 5, pglz compressed: 2 +SELECT * FROM chunk_group_consistency; + consistent +--------------------------------------------------------------------- + t +(1 row) + SELECT count(*) FROM t; count --------------------------------------------------------------------- @@ -239,6 +257,12 @@ compression rate: 1.96x total row count: 7030, stripe count: 4, average rows per stripe: 1757 chunk count: 8, containing data for dropped columns: 0, none compressed: 2, pglz compressed: 6 +SELECT * FROM chunk_group_consistency; + consistent +--------------------------------------------------------------------- + t +(1 row) + DROP TABLE t; DROP VIEW t_stripes; -- Make sure we cleaned the metadata for t too @@ -262,4 +286,10 @@ compression rate: 33.71x total row count: 1000000, stripe count: 1, average rows per stripe: 1000000 chunk count: 30, containing data for dropped columns: 0, pglz compressed: 30 +SELECT * FROM chunk_group_consistency; + consistent +--------------------------------------------------------------------- + t +(1 row) + DROP TABLE t; diff --git a/src/test/regress/expected/multi_extension.out b/src/test/regress/expected/multi_extension.out index 1b7da2e80..c80df9222 100644 --- a/src/test/regress/expected/multi_extension.out +++ b/src/test/regress/expected/multi_extension.out @@ -507,12 +507,13 @@ SELECT * FROM print_extension_changes(); | schema columnar | sequence columnar.storageid_seq | table columnar.chunk + | table columnar.chunk_group | table columnar.options | table columnar.stripe | view citus_shards | view citus_tables | view time_partitions -(66 rows) +(67 rows) DROP TABLE prev_objects, extension_diff; -- show running version diff --git a/src/test/regress/expected/multi_extension_0.out b/src/test/regress/expected/multi_extension_0.out index ca6256ecc..84f3eb93b 100644 --- a/src/test/regress/expected/multi_extension_0.out +++ b/src/test/regress/expected/multi_extension_0.out @@ -503,12 +503,13 @@ SELECT * FROM print_extension_changes(); | schema columnar | sequence columnar.storageid_seq | table columnar.chunk + | table columnar.chunk_group | table columnar.options | table columnar.stripe | view citus_shards | view citus_tables | view time_partitions -(62 rows) +(63 rows) DROP TABLE prev_objects, extension_diff; -- show running version diff --git a/src/test/regress/expected/upgrade_list_citus_objects.out b/src/test/regress/expected/upgrade_list_citus_objects.out index c0b13e8b9..01dc7e386 100644 --- a/src/test/regress/expected/upgrade_list_citus_objects.out +++ b/src/test/regress/expected/upgrade_list_citus_objects.out @@ -214,6 +214,7 @@ ORDER BY 1; sequence pg_dist_shardid_seq table citus.pg_dist_object table columnar.chunk + table columnar.chunk_group table columnar.options table columnar.stripe table pg_dist_authinfo @@ -241,5 +242,5 @@ ORDER BY 1; view citus_worker_stat_activity view pg_dist_shard_placement view time_partitions -(225 rows) +(226 rows) diff --git a/src/test/regress/expected/upgrade_list_citus_objects_0.out b/src/test/regress/expected/upgrade_list_citus_objects_0.out index 05ed29c4d..efec52af8 100644 --- a/src/test/regress/expected/upgrade_list_citus_objects_0.out +++ b/src/test/regress/expected/upgrade_list_citus_objects_0.out @@ -210,6 +210,7 @@ ORDER BY 1; sequence pg_dist_shardid_seq table citus.pg_dist_object table columnar.chunk + table columnar.chunk_group table columnar.options table columnar.stripe table pg_dist_authinfo @@ -237,5 +238,5 @@ ORDER BY 1; view citus_worker_stat_activity view pg_dist_shard_placement view time_partitions -(221 rows) +(222 rows) diff --git a/src/test/regress/input/am_load.source b/src/test/regress/input/am_load.source index 8795f2d61..41653f3c4 100644 --- a/src/test/regress/input/am_load.source +++ b/src/test/regress/input/am_load.source @@ -43,4 +43,6 @@ speed of light,2.997e8 SELECT * FROM famous_constants ORDER BY id, name; +SELECT * FROM chunk_group_consistency; + DROP TABLE famous_constants; diff --git a/src/test/regress/output/am_load.source b/src/test/regress/output/am_load.source index c24f74f67..f671b45a8 100644 --- a/src/test/regress/output/am_load.source +++ b/src/test/regress/output/am_load.source @@ -39,4 +39,10 @@ SELECT * FROM famous_constants ORDER BY id, name; | speed of light | 2.997e+08 (8 rows) +SELECT * FROM chunk_group_consistency; + consistent +--------------------------------------------------------------------- + t +(1 row) + DROP TABLE famous_constants; diff --git a/src/test/regress/sql/am_create.sql b/src/test/regress/sql/am_create.sql index fbe71a8f4..bff829d2c 100644 --- a/src/test/regress/sql/am_create.sql +++ b/src/test/regress/sql/am_create.sql @@ -44,3 +44,20 @@ EXCEPTION WHEN invalid_parameter_value THEN return false; END; $$ LANGUAGE plpgsql; + + +-- are chunk groups and chunks consistent? +CREATE view chunk_group_consistency AS +WITH a as ( + SELECT storageid, stripeid, chunkid, min(value_count) as row_count + FROM columnar.chunk + GROUP BY 1,2,3 +), b as ( + SELECT storageid, stripeid, chunkid, max(value_count) as row_count + FROM columnar.chunk + GROUP BY 1,2,3 +), c as ( + (TABLE a EXCEPT TABLE b) UNION (TABLE b EXCEPT TABLE a) UNION + (TABLE a EXCEPT TABLE columnar.chunk_group) UNION (TABLE columnar.chunk_group EXCEPT TABLE a) +) +SELECT count(*) = 0 AS consistent FROM c; diff --git a/src/test/regress/sql/am_insert.sql b/src/test/regress/sql/am_insert.sql index 8dce707da..1ebdd9c48 100644 --- a/src/test/regress/sql/am_insert.sql +++ b/src/test/regress/sql/am_insert.sql @@ -22,6 +22,8 @@ select count(*) from test_insert_command_data; insert into test_insert_command select * from test_insert_command_data; select count(*) from test_insert_command; +SELECT * FROM chunk_group_consistency; + drop table test_insert_command_data; drop table test_insert_command; @@ -43,6 +45,8 @@ USING columnar; -- store long text in cstore table INSERT INTO test_cstore_long_text SELECT * FROM test_long_text; +SELECT * FROM chunk_group_consistency; + -- drop source table to remove original text from toast DROP TABLE test_long_text; @@ -95,5 +99,7 @@ SELECT pg_column_size(external), pg_column_size(extended) FROM test_toast_columnar; +SELECT * FROM chunk_group_consistency; + DROP TABLE test_toast_row; DROP TABLE test_toast_columnar; diff --git a/src/test/regress/sql/am_recursive.sql b/src/test/regress/sql/am_recursive.sql index d7e48f1d5..8dee035ec 100644 --- a/src/test/regress/sql/am_recursive.sql +++ b/src/test/regress/sql/am_recursive.sql @@ -39,6 +39,8 @@ INSERT INTO t2 SELECT t.a, t.a+1 FROM t; SELECT * FROM t1; SELECT * FROM t2; +SELECT * FROM chunk_group_consistency; + TRUNCATE t1; TRUNCATE t2; @@ -55,6 +57,8 @@ INSERT INTO t2 SELECT i, (select count(*) from t1) FROM generate_series(1, 3) i; SELECT * FROM t1; SELECT * FROM t2; +SELECT * FROM chunk_group_consistency; + TRUNCATE t1; TRUNCATE t2; @@ -68,6 +72,8 @@ INSERT INTO t1 SELECT t.a, t.a+1 FROM t; SELECT * FROM t1 ORDER BY a, b; +SELECT * FROM chunk_group_consistency; + TRUNCATE t1; TRUNCATE t2; @@ -99,6 +105,8 @@ INSERT INTO t4 SELECT i, g2(i) FROM generate_series(1, 5) i; SELECT * FROM t2 ORDER BY a, b; +SELECT * FROM chunk_group_consistency; + TRUNCATE t1, t2, t3, t4; -- @@ -113,6 +121,8 @@ SELECT * FROM t3 ORDER BY a, b; ((table t1) except (table t3)) union ((table t3) except (table t1)); ((table t2) except (table t4)) union ((table t4) except (table t2)); +SELECT * FROM chunk_group_consistency; + DROP FUNCTION g(int), g2(int); TRUNCATE t1, t2, t3, t4; @@ -138,6 +148,8 @@ SELECT f(0), f(20); SELECT * FROM t1 ORDER BY a, b; +SELECT * FROM chunk_group_consistency; + DROP FUNCTION f(int); DROP TABLE t1, t2, t3, t4; diff --git a/src/test/regress/sql/am_truncate.sql b/src/test/regress/sql/am_truncate.sql index e284b858f..a2e9a9b37 100644 --- a/src/test/regress/sql/am_truncate.sql +++ b/src/test/regress/sql/am_truncate.sql @@ -25,8 +25,12 @@ set columnar.compression to default; -- query rows SELECT * FROM columnar_truncate_test; +SELECT * FROM chunk_group_consistency; + TRUNCATE TABLE columnar_truncate_test; +SELECT * FROM chunk_group_consistency; + SELECT * FROM columnar_truncate_test; SELECT COUNT(*) from columnar_truncate_test; @@ -47,6 +51,8 @@ SELECT * from columnar_truncate_test_second; SELECT * from columnar_truncate_test_regular; +SELECT * FROM chunk_group_consistency; + -- make sure multi truncate works -- notice that the same table might be repeated TRUNCATE TABLE columnar_truncate_test, @@ -54,6 +60,8 @@ TRUNCATE TABLE columnar_truncate_test, columnar_truncate_test_second, columnar_truncate_test; +SELECT * FROM chunk_group_consistency; + SELECT * from columnar_truncate_test; SELECT * from columnar_truncate_test_second; SELECT * from columnar_truncate_test_regular; @@ -136,6 +144,8 @@ TRUNCATE TABLE truncate_schema.truncate_tbl; SELECT count(*) FROM truncate_schema.truncate_tbl; \c - :current_user +SELECT * FROM chunk_group_consistency; + -- cleanup DROP SCHEMA truncate_schema CASCADE; DROP USER truncate_user; diff --git a/src/test/regress/sql/am_vacuum.sql b/src/test/regress/sql/am_vacuum.sql index 0ff4ac726..7e9bc9ffa 100644 --- a/src/test/regress/sql/am_vacuum.sql +++ b/src/test/regress/sql/am_vacuum.sql @@ -20,6 +20,8 @@ SELECT count(*) FROM t_stripes; -- vacuum full should merge stripes together VACUUM FULL t; +SELECT * FROM chunk_group_consistency; + SELECT sum(a), sum(b) FROM t; SELECT count(*) FROM t_stripes; @@ -32,6 +34,8 @@ SELECT count(*) FROM t_stripes; VACUUM FULL t; +SELECT * FROM chunk_group_consistency; + SELECT sum(a), sum(b) FROM t; SELECT count(*) FROM t_stripes; @@ -92,6 +96,8 @@ COMMIT; VACUUM VERBOSE t; +SELECT * FROM chunk_group_consistency; + SELECT count(*) FROM t; -- check that we report chunks with data for dropped columns @@ -108,6 +114,8 @@ SELECT alter_columnar_table_set('t', compression => 'pglz'); VACUUM FULL t; VACUUM VERBOSE t; +SELECT * FROM chunk_group_consistency; + DROP TABLE t; DROP VIEW t_stripes; @@ -123,4 +131,6 @@ INSERT INTO t SELECT 1, 'a', 'xyz' FROM generate_series(1, 1000000) i; VACUUM VERBOSE t; +SELECT * FROM chunk_group_consistency; + DROP TABLE t;