Details
-
Improvement
-
Status: Closed
-
Major
-
Resolution: Fixed
-
None
-
None
-
None
Description
If a view is diverged, we should not abort the adding of a column to the base table. Instead, we should add it if it's a PK (as otherwise the view will become unusable) and not add it otherwise. If that's problematic, then perhaps we can just block it if a PK column is being added.
The code is in MetaDataEndPointImpl here:
private MetaDataMutationResult addRowsToChildViews(List<Mutation> tableMetadata, List<Mutation> mutationsForAddingColumnsToViews, byte[] schemaName, byte[] tableName, List<ImmutableBytesPtr> invalidateList, long clientTimeStamp, TableViewFinderResult childViewsResult, Region region, List<RowLock> locks) throws IOException, SQLException { for (Result viewResult : childViewsResult.getResults()) { byte[][] rowViewKeyMetaData = new byte[3][]; getVarChars(viewResult.getRow(), 3, rowViewKeyMetaData); byte[] viewTenantId = rowViewKeyMetaData[PhoenixDatabaseMetaData.TENANT_ID_INDEX]; byte[] viewSchemaName = rowViewKeyMetaData[PhoenixDatabaseMetaData.SCHEMA_NAME_INDEX]; byte[] viewName = rowViewKeyMetaData[PhoenixDatabaseMetaData.TABLE_NAME_INDEX]; byte[] viewKey = SchemaUtil.getTableKey(viewTenantId, viewSchemaName, viewName); // lock the rows corresponding to views so that no other thread can modify the view meta-data RowLock viewRowLock = acquireLock(region, viewKey, locks); PTable view = doGetTable(viewKey, clientTimeStamp, viewRowLock); if (view.getBaseColumnCount() == QueryConstants.DIVERGED_VIEW_BASE_COLUMN_COUNT) { // if a view has divorced itself from the base table, we don't allow schema changes // to be propagated to it. return new MetaDataMutationResult(MutationCode.UNALLOWED_TABLE_MUTATION, EnvironmentEdgeManager.currentTimeMillis(), null); }