This is an automated email from the ASF dual-hosted git repository. reshke pushed a commit to branch at_set_am2 in repository https://gitbox.apache.org/repos/asf/cloudberry.git
commit ab39366f26759c897dbffe49a70a28b1906089d7 Author: reshke <reshkekir...@gmail.com> AuthorDate: Tue Jan 14 21:02:20 2025 +0000 Fix cherry-pick issues --- src/backend/access/common/reloptions_gp.c | 4 +++- src/backend/commands/tablecmds.c | 40 +++++++++++++++---------------- src/include/commands/tablecmds.h | 4 ---- 3 files changed, 23 insertions(+), 25 deletions(-) diff --git a/src/backend/access/common/reloptions_gp.c b/src/backend/access/common/reloptions_gp.c index 146962d4f6..b6022e1ccc 100644 --- a/src/backend/access/common/reloptions_gp.c +++ b/src/backend/access/common/reloptions_gp.c @@ -727,7 +727,9 @@ reloption_is_default(const char *optstr, int optlen) else res = false; - pfree(defaultopt); + if (defaultopt) + pfree(defaultopt); + return res; } diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 5e322e57a7..24daadc3ef 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -512,7 +512,7 @@ static void ATExecSetTableSpaceNoStorage(Relation rel, Oid newTableSpace); static void ATExecSetRelOptions(Relation rel, List *defList, AlterTableType operation, bool *aoopt_changed, - bool am_change_heap_ao, + Oid newAccessMethod, LOCKMODE lockmode); static void ATExecEnableDisableTrigger(Relation rel, const char *trigname, char fires_when, bool skip_system, LOCKMODE lockmode); @@ -6165,11 +6165,8 @@ ATExecCmd(List **wqueue, AlteredTableInfo *tab, if (cmd->def) { bool aoopt_changed = false; - bool am_change_heap_ao = OidIsValid(tab->newAccessMethod) && - ((IsAccessMethodAO(tab->newAccessMethod) && !RelationIsAppendOptimized(rel)) || - (!IsAccessMethodAO(tab->newAccessMethod) && RelationIsAppendOptimized(rel))); - ATExecSetRelOptions(rel, (List *) cmd->def, cmd->subtype, &aoopt_changed, am_change_heap_ao, lockmode); + ATExecSetRelOptions(rel, (List *) cmd->def, cmd->subtype, &aoopt_changed, tab->newAccessMethod, lockmode); /* * When user sets the same access method as the existing one, the @@ -6198,7 +6195,7 @@ ATExecCmd(List **wqueue, AlteredTableInfo *tab, { bool aoopt_changed = false; - ATExecSetRelOptions(rel, (List *) cmd->def, cmd->subtype, &aoopt_changed, false, lockmode); + ATExecSetRelOptions(rel, (List *) cmd->def, cmd->subtype, &aoopt_changed, InvalidOid, lockmode); /* Will rewrite table if there's a change to the AO reloptions. */ if (aoopt_changed) @@ -16066,7 +16063,7 @@ ATPrepSetTableSpace(AlteredTableInfo *tab, Relation rel, const char *tablespacen */ static void ATExecSetRelOptions(Relation rel, List *defList, AlterTableType operation, - bool *aoopt_changed, bool am_change_heap_ao, LOCKMODE lockmode) + bool *aoopt_changed, Oid newAccessMethod, LOCKMODE lockmode) { Oid relid; Relation pgclass; @@ -16078,11 +16075,14 @@ ATExecSetRelOptions(Relation rel, List *defList, AlterTableType operation, Datum repl_val[Natts_pg_class]; bool repl_null[Natts_pg_class]; bool repl_repl[Natts_pg_class]; + const TableAmRoutine * newAM; static char *validnsps[] = HEAP_RELOPT_NAMESPACES; if (defList == NIL && operation != AT_ReplaceRelOptions) return; /* nothing to do */ + newAM = OidIsValid(newAccessMethod) ? GetTableAmRoutineByAmId(newAccessMethod) : NULL; + pgclass = table_open(RelationRelationId, RowExclusiveLock); /* Fetch heap tuple */ @@ -16091,7 +16091,8 @@ ATExecSetRelOptions(Relation rel, List *defList, AlterTableType operation, if (!HeapTupleIsValid(tuple)) elog(ERROR, "cache lookup failed for relation %u", relid); - if (operation == AT_ReplaceRelOptions || am_change_heap_ao) + if (operation == AT_ReplaceRelOptions || + (newAccessMethod != InvalidOid && IsAccessMethodAO(rel->rd_rel->relam) != IsAccessMethodAO(newAccessMethod))) { /* * If we're supposed to replace the reloptions list, or if we're @@ -16151,22 +16152,21 @@ ATExecSetRelOptions(Relation rel, List *defList, AlterTableType operation, * Validate the reloptions as for AO/CO table if (1) we'll change AM to * AO/CO, or (2) we are not changing AM but the relation is just AO/CO. */ - if ((RelationIsAppendOptimized(rel) && !am_change_heap_ao) || - (!RelationIsAppendOptimized(rel) && am_change_heap_ao)) + if (newAM != NULL) { - StdRdOptions *stdRdOptions = (StdRdOptions *) table_reloptions(rel->rd_tableam->amoptions, newOptions, rel->rd_rel->relkind, true); - validateAppendOnlyRelOptions(stdRdOptions->blocksize, - gp_safefswritesize, - stdRdOptions->compresslevel, - stdRdOptions->compresstype, - stdRdOptions->checksum, - AMHandlerIsAoCols(rel->rd_amhandler)); + (void) table_reloptions(newAM->amoptions, newOptions, rel->rd_rel->relkind, true); + /* If reloptions will be changed, indicate so. */ - if (aoopt_changed != NULL) - *aoopt_changed = !relOptionsEquals(datum, newOptions); - } else + *aoopt_changed = true; + } + else + { (void) table_reloptions(rel->rd_tableam->amoptions, newOptions, rel->rd_rel->relkind, true); + if (RelationIsAppendOptimized(rel) && aoopt_changed != NULL) + *aoopt_changed = !relOptionsEquals(datum, newOptions); + } + break; case RELKIND_PARTITIONED_TABLE: (void) partitioned_table_reloptions(newOptions, true); diff --git a/src/include/commands/tablecmds.h b/src/include/commands/tablecmds.h index 9ebe2b810d..6cc179e96e 100644 --- a/src/include/commands/tablecmds.h +++ b/src/include/commands/tablecmds.h @@ -32,10 +32,6 @@ struct AlterTableUtilityContext; /* avoid including tcop/utility.h here */ -/* Convenient macro for checking AO AMs */ -#define IsAccessMethodAO(am_oid) \ - (am_oid == AO_ROW_TABLE_AM_OID || am_oid == AO_COLUMN_TABLE_AM_OID) - extern const char *synthetic_sql; extern void DefineExternalRelation(CreateExternalStmt *stmt); --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@cloudberry.apache.org For additional commands, e-mail: commits-h...@cloudberry.apache.org