From 6c989830d27b6f4b3a387deb13a71bdf2ac54d49 Mon Sep 17 00:00:00 2001 From: Onur Tirtir Date: Mon, 20 Sep 2021 17:26:41 +0300 Subject: [PATCH] Add CheckCitusVersion() calls to columnarAM (#5308) Considering all code-paths that we might interact with a columnar table, add `CheckCitusVersion` calls to tableAM callbacks: - initializing table scan (`columnar_beginscan` & `columnar_index_fetch_begin`) - setting a new filenode for a relation (storage initializiation or a table rewrite) - truncating the storage - inserting tuple (single and multi) Also add `CheckCitusVersion` call to: - drop hook (`ColumnarTableDropHook`) - `alter_columnar_table_set` & `alter_columnar_table_reset` UDFs (cherry picked from commit f8b1ff72148c48b4bef17f9e6a632a45dd10ce90) Conflicts: src/backend/columnar/cstore_tableam.c src/test/regress/expected/multi_extension.out src/test/regress/sql/multi_extension.sql Note: Not applying multi_extension.sql/out changes to 10.0 since previous Citus version (9.5) already doesn't have columnarAM. --- src/backend/columnar/cstore_tableam.c | 35 +++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/backend/columnar/cstore_tableam.c b/src/backend/columnar/cstore_tableam.c index 7f3d197fa..a2b2d11fa 100644 --- a/src/backend/columnar/cstore_tableam.c +++ b/src/backend/columnar/cstore_tableam.c @@ -160,6 +160,8 @@ columnar_beginscan(Relation relation, Snapshot snapshot, ParallelTableScanDesc parallel_scan, uint32 flags) { + CheckCitusVersion(ERROR); + int natts = relation->rd_att->natts; Bitmapset *attr_needed = NULL; @@ -419,6 +421,8 @@ static bool columnar_tuple_satisfies_snapshot(Relation rel, TupleTableSlot *slot, Snapshot snapshot) { + CheckCitusVersion(ERROR); + return true; } @@ -436,6 +440,8 @@ static void columnar_tuple_insert(Relation relation, TupleTableSlot *slot, CommandId cid, int options, BulkInsertState bistate) { + CheckCitusVersion(ERROR); + /* * columnar_init_write_state allocates the write state in a longer * lasting context, so no need to worry about it. @@ -481,6 +487,8 @@ static void columnar_multi_insert(Relation relation, TupleTableSlot **slots, int ntuples, CommandId cid, int options, BulkInsertState bistate) { + CheckCitusVersion(ERROR); + TableWriteState *writeState = columnar_init_write_state(relation, RelationGetDescr(relation), GetCurrentSubTransactionId()); @@ -552,6 +560,8 @@ columnar_relation_set_new_filenode(Relation rel, TransactionId *freezeXid, MultiXactId *minmulti) { + CheckCitusVersion(ERROR); + if (persistence != RELPERSISTENCE_PERMANENT) { ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), @@ -581,6 +591,8 @@ columnar_relation_set_new_filenode(Relation rel, static void columnar_relation_nontransactional_truncate(Relation rel) { + CheckCitusVersion(ERROR); + RelFileNode relfilenode = rel->rd_node; NonTransactionDropWriteState(relfilenode.relNode); @@ -625,6 +637,8 @@ columnar_relation_copy_for_cluster(Relation OldHeap, Relation NewHeap, double *tups_vacuumed, double *tups_recently_dead) { + CheckCitusVersion(ERROR); + TupleDesc sourceDesc = RelationGetDescr(OldHeap); TupleDesc targetDesc = RelationGetDescr(NewHeap); @@ -677,6 +691,15 @@ static void columnar_vacuum_rel(Relation rel, VacuumParams *params, BufferAccessStrategy bstrategy) { + if (!CheckCitusVersion(WARNING)) + { + /* + * Skip if the extension catalogs are not up-to-date, but avoid + * erroring during auto-vacuum. + */ + return; + } + int elevel = (params->options & VACOPT_VERBOSE) ? INFO : DEBUG2; /* this should have been resolved by vacuum.c until now */ @@ -1006,6 +1029,8 @@ columnar_index_validate_scan(Relation heapRelation, static uint64 columnar_relation_size(Relation rel, ForkNumber forkNumber) { + CheckCitusVersion(ERROR); + uint64 nblocks = 0; /* Open it at the smgr level if not already done */ @@ -1031,6 +1056,8 @@ columnar_relation_size(Relation rel, ForkNumber forkNumber) static bool columnar_relation_needs_toast_table(Relation rel) { + CheckCitusVersion(ERROR); + return false; } @@ -1040,6 +1067,8 @@ columnar_estimate_rel_size(Relation rel, int32 *attr_widths, BlockNumber *pages, double *tuples, double *allvisfrac) { + CheckCitusVersion(ERROR); + RelationOpenSmgr(rel); *pages = smgrnblocks(rel->rd_smgr, MAIN_FORKNUM); *tuples = ColumnarTableRowCount(rel); @@ -1218,6 +1247,8 @@ ColumnarTableDropHook(Oid relid) if (IsColumnarTableAmTable(relid)) { + CheckCitusVersion(ERROR); + /* * Drop metadata. No need to drop storage here since for * tableam tables storage is managed by postgres. @@ -1653,6 +1684,8 @@ PG_FUNCTION_INFO_V1(alter_columnar_table_set); Datum alter_columnar_table_set(PG_FUNCTION_ARGS) { + CheckCitusVersion(ERROR); + Oid relationId = PG_GETARG_OID(0); Relation rel = table_open(relationId, AccessExclusiveLock); /* ALTER TABLE LOCK */ @@ -1762,6 +1795,8 @@ PG_FUNCTION_INFO_V1(alter_columnar_table_reset); Datum alter_columnar_table_reset(PG_FUNCTION_ARGS) { + CheckCitusVersion(ERROR); + Oid relationId = PG_GETARG_OID(0); Relation rel = table_open(relationId, AccessExclusiveLock); /* ALTER TABLE LOCK */