Uploaded image for project: 'Phoenix'
  1. Phoenix
  2. PHOENIX-2110

Primary key changes should be pushed to diverged views


    • Type: Improvement
    • Status: Closed
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: None
    • Fix Version/s: 4.5.0
    • Labels:


      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);


        1. PHOENIX-2110.patch
          163 kB
          Samarth Jain
        2. PHOENIX-2110_addendum.patch
          11 kB
          Samarth Jain



            • Assignee:
              samarthjain Samarth Jain
              jamestaylor James Taylor
            • Votes:
              0 Vote for this issue
              4 Start watching this issue


              • Created: