[ 
https://issues.apache.org/jira/browse/PHOENIX-1504?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14590475#comment-14590475
 ] 

James Taylor commented on PHOENIX-1504:
---------------------------------------

Great work, [~samarthjain]. Excellent tests. Couple of minor nits to fix on 
commit:
- ViewIT.java looks like it has not substantive changes, so please revert.
- Any chance that BASE_COLUMN_COUNT will be null (i.e. pre-commit of the 
upgrade script) here in MetaDataEndPointImpl? Maybe a check for null with a 
default value would be prudent here?
{code}
+        Cell baseColumnCountKv = tableKeyValues[BASE_COLUMN_COUNT_INDEX];
+        Integer baseColumnCount = 
PInteger.INSTANCE.getCodec().decodeInt(baseColumnCountKv.getValueArray(),
+            baseColumnCountKv.getValueOffset(), SortOrder.getDefault());
{code}
- Not sure if I'm seeing double here post Warriror's championship party, but 
seems that this is repeated?
{code}
+        scan.addColumn(TABLE_FAMILY_BYTES, TABLE_SEQ_NUM_BYTES);
+
+        scan.addColumn(TABLE_FAMILY_BYTES, TABLE_SEQ_NUM_BYTES);
{code}
- Rather than pass a boolean isAdd into mutateColumn(), how about removing the 
findChildViews logic and having it be different in the updateMutation 
implementation provided by dropColumn and addColumn? In dropColumn, you'd just 
return a MutationCode.UNALLOWED_TABLE_MUTATION if there are child views. In 
addColumn, you'd return that if the metadata spans multiple regions or if a 
view has child views.
{code}
+                    TableViewFinderResult childViewsResult =
+                            findChildViews(region, tenantId, table,
+                                (type == PTableType.VIEW ? PARENT_TABLE_BYTES
+                                        : PHYSICAL_TABLE_BYTES));
+                    if (childViewsResult.hasViews()) {
+                        /*
+                         * Table mutations are not allowed if:
+                         * 1) Metadata for child views is split over more than 
one region.
+                         * 2) Dropping columns for tables or views that have 
child views
+                         * 3) Adding columns for views that have child views.
+                         * 
+                         */
+                        if (!childViewsResult.allViewsInSingleRegion() || 
!isAdd || (type == PTableType.VIEW && isAdd)) {
+                            return new MetaDataMutationResult(
+                                    MutationCode.UNALLOWED_TABLE_MUTATION,
+                                    
EnvironmentEdgeManager.currentTimeMillis(), null);
+                        } else {
+                            addRowsToChildViews(tableMetadata, schemaName, 
tableName,
+                                viewMutations, invalidateList, 
clientTimeStamp, childViewsResult,
+                                region, locks);
+                        }
                     }
{code}
- Any reason not to pass only List<Mutation>tableMetadata to 
addRowsToChildViews and just add the new metadata rows in-place (iterating only 
up to the the original size)?
- Minor nit: how about just calling upgradeTo4_5_0(metaConnection) in the try 
and getting rid of the if statement?
{code}
+                                
+                                if (currentServerSideTableTimeStamp < 
MetaDataProtocol.MIN_SYSTEM_TABLE_TIMESTAMP_4_5_0) {
+                                    columnsToAdd = 
PhoenixDatabaseMetaData.BASE_COLUMN_COUNT + " "
+                                            + 
PInteger.INSTANCE.getSqlTypeName();
+                                    boolean skipUpgrade = false;
+                                    try {
+                                        addColumn(metaConnection, 
PhoenixDatabaseMetaData.SYSTEM_CATALOG,
+                                                
MetaDataProtocol.MIN_SYSTEM_TABLE_TIMESTAMP, columnsToAdd, false);
+                                    } catch (ColumnAlreadyExistsException 
ignored) {
+                                        /* 
+                                         * Upgrade to 4.5 is a slightly 
special case. We use the fact that the column
+                                         * BASE_COLUMN_COUNT is already part 
of the meta-data schema as the signal that
+                                         * the server side upgrade has 
finished or is in progress.
+                                         */
+                                        skipUpgrade = true;
+                                    }
+                                    if (!skipUpgrade) {
+                                        upgradeTo4_5_0(metaConnection);
+                                    }
+                                }
{code}
- In QueryConstants, it's best to add new columns at the end, otherwise the 
column ordinal positions of preceding SYSTEM.CATALOG columns will get increment 
(just in case folks are counting on the ordinal position).
- Use your constant here:
{code}
@@ -253,18 +254,18 @@ public class PTableImpl implements PTable {
         return new PTableImpl(tenantId, schemaName, tableName, type, state, 
timeStamp, sequenceNumber, pkName, bucketNum, columns, dataSchemaName,
                 dataTableName, indexes, isImmutableRows, physicalNames, 
defaultFamilyName,
                 viewExpression, disableWAL, multiTenant, storeNulls, viewType, 
viewIndexId,
-                indexType, PTableStats.EMPTY_STATS);
+                indexType, PTableStats.EMPTY_STATS, -1);
{code}
- Remove TODO here:
{code}
+                multiTenant, storeNulls, viewType, viewIndexId, indexType, 
baseColumnCount); // TODO
{code}
- Not a huge deal, but can the array actually be null here?
{code}
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/util/ByteUtil.java 
b/phoenix-core/src/main/java/org/apache/phoenix/util/ByteUtil.java
index 1e3516d..1f4a285 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/util/ByteUtil.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/util/ByteUtil.java
@@ -253,13 +253,17 @@ public class ByteUtil {
     public static byte[] concat(byte[] first, byte[]... rest) {
         int totalLength = first.length;
         for (byte[] array : rest) {
-            totalLength += array.length;
+            if (array != null) {
+                totalLength += array.length;
+            }
{code}

> Support adding column to a table that has views
> -----------------------------------------------
>
>                 Key: PHOENIX-1504
>                 URL: https://issues.apache.org/jira/browse/PHOENIX-1504
>             Project: Phoenix
>          Issue Type: Sub-task
>            Reporter: James Taylor
>            Assignee: Samarth Jain
>             Fix For: 5.0.0, 4.5.0
>
>         Attachments: PHOENIX-1504-wip.patch, PHOENIX-1504.patch
>
>
> We currently disallow any schema modifications to a table that has views. We 
> should relax that constraint and push the schema change as necessary out to 
> all views.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to