PHOENIX-2123 Diverged view prevents schema propagation to the entire view 
hierarchy


Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo
Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/ec93ec79
Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/ec93ec79
Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/ec93ec79

Branch: refs/heads/calcite
Commit: ec93ec79c24cc847ed4a2777794da3cc0b0e3da3
Parents: 553d3cc
Author: Samarth <[email protected]>
Authored: Wed Jul 15 13:34:39 2015 -0700
Committer: Samarth <[email protected]>
Committed: Wed Jul 15 13:34:39 2015 -0700

----------------------------------------------------------------------
 .../apache/phoenix/end2end/AlterTableIT.java    | 34 +++++++++++---------
 .../coprocessor/MetaDataEndpointImpl.java       |  7 ++--
 .../org/apache/phoenix/util/UpgradeUtil.java    |  6 ++--
 3 files changed, 24 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/phoenix/blob/ec93ec79/phoenix-core/src/it/java/org/apache/phoenix/end2end/AlterTableIT.java
----------------------------------------------------------------------
diff --git 
a/phoenix-core/src/it/java/org/apache/phoenix/end2end/AlterTableIT.java 
b/phoenix-core/src/it/java/org/apache/phoenix/end2end/AlterTableIT.java
index 607f52a..1758dd4 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/AlterTableIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/AlterTableIT.java
@@ -2575,36 +2575,38 @@ public class AlterTableIT extends 
BaseOwnClusterHBaseManagedTimeIT {
     }
     
     @Test
-    public void testDivorcedViewsStayDivorced() throws Exception {
-        String baseTable = "testDivorcedViewsStayDivorced";
-        String viewName = baseTable + "_view";
+    public void testDivergedViewsStayDiverged() throws Exception {
+        String baseTable = "testDivergedViewsStayDiverged";
+        String view1 = baseTable + "_view1";
+        String view2 = baseTable + "_view2";
         try (Connection conn = DriverManager.getConnection(getUrl())) {
             String tableDDL = "CREATE TABLE " + baseTable + " (PK1 VARCHAR NOT 
NULL PRIMARY KEY, V1 VARCHAR, V2 VARCHAR)";
             conn.createStatement().execute(tableDDL);
             
-            String viewDDL = "CREATE VIEW " + viewName + " AS SELECT * FROM " 
+ baseTable;
+            String viewDDL = "CREATE VIEW " + view1 + " AS SELECT * FROM " + 
baseTable;
+            conn.createStatement().execute(viewDDL);
+            
+            viewDDL = "CREATE VIEW " + view2 + " AS SELECT * FROM " + 
baseTable;
             conn.createStatement().execute(viewDDL);
             
-            // Drop the column inherited from base table to divorce the view
-            String dropColumn = "ALTER VIEW " + viewName + " DROP COLUMN V2";
+            // Drop the column inherited from base table to make it diverged
+            String dropColumn = "ALTER VIEW " + view1 + " DROP COLUMN V2";
             conn.createStatement().execute(dropColumn);
             
             String alterBaseTable = "ALTER TABLE " + baseTable + " ADD V3 
VARCHAR";
-            try {
-               conn.createStatement().execute(alterBaseTable);
-                   fail();
-               }
-               catch (SQLException e) {
-                       assertEquals("Unexpected exception", 
CANNOT_MUTATE_TABLE.getErrorCode(), e.getErrorCode());
-               }
-            
-            // Column V3 shouldn't have propagated to the divorced view.
-            String sql = "SELECT V3 FROM " + viewName;
+            conn.createStatement().execute(alterBaseTable);
+               
+            // Column V3 shouldn't have propagated to the diverged view.
+            String sql = "SELECT V3 FROM " + view1;
             try {
                 conn.createStatement().execute(sql);
             } catch (SQLException e) {
                 assertEquals(SQLExceptionCode.COLUMN_NOT_FOUND.getErrorCode(), 
e.getErrorCode());
             }
+            
+            // However, column V3 should have propagated to the non-diverged 
view.
+            sql = "SELECT V3 FROM " + view2;
+            conn.createStatement().execute(sql);
         } 
     }
     

http://git-wip-us.apache.org/repos/asf/phoenix/blob/ec93ec79/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/MetaDataEndpointImpl.java
----------------------------------------------------------------------
diff --git 
a/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/MetaDataEndpointImpl.java
 
b/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/MetaDataEndpointImpl.java
index 5396a69..05e7acb 100644
--- 
a/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/MetaDataEndpointImpl.java
+++ 
b/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/MetaDataEndpointImpl.java
@@ -1693,11 +1693,10 @@ public class MetaDataEndpointImpl extends 
MetaDataProtocol implements Coprocesso
             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
+                // if a view has diverged from the base table, we don't allow 
schema changes
                 // to be propagated to it.
-                // FIXME: we should allow the update, but just not propagate 
it to this view
-                // The one exception is PK changes which need to be propagated 
to diverged views as well
-               return new 
MetaDataMutationResult(MutationCode.UNALLOWED_TABLE_MUTATION, 
EnvironmentEdgeManager.currentTimeMillis(), null);
+                // FIXME: We should allow PK changes to be propagated to a 
diverged view See PHOENIX-2110
+                continue;
             }
             int numColsAddedToBaseTable = 0;
             int numColsAddedToView = 0;

http://git-wip-us.apache.org/repos/asf/phoenix/blob/ec93ec79/phoenix-core/src/main/java/org/apache/phoenix/util/UpgradeUtil.java
----------------------------------------------------------------------
diff --git 
a/phoenix-core/src/main/java/org/apache/phoenix/util/UpgradeUtil.java 
b/phoenix-core/src/main/java/org/apache/phoenix/util/UpgradeUtil.java
index e1e2515..b4fcef8 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/util/UpgradeUtil.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/util/UpgradeUtil.java
@@ -637,9 +637,9 @@ public class UpgradeUtil {
                              * two till one of the following happens: 
                              * 
                              * 1) We run into a view column which is different 
from column in the base physical table.
-                             * This means that the view has divorced itself 
from the base physical table. In such a case
+                             * This means that the view has diverged from the 
base physical table. In such a case
                              * we will set a special value for the base column 
count. That special value will also be used
-                             * on the server side to filter out the divorced 
view so that meta-data changes on the base 
+                             * on the server side to filter out the diverged 
view so that meta-data changes on the base 
                              * physical table are not propagated to it.
                              * 
                              * 2) Every physical table column is present in 
the view. In that case we set the base column count
@@ -667,7 +667,7 @@ public class UpgradeUtil {
                                     clearCache = true;
                                 }
                             } else {
-                                // special value to denote that the view has 
divorced itself from the base physical table.
+                                // special value to denote that the view has 
diverged from the base physical table.
                                 
upsertBaseColumnCountInHeaderRow(metaConnection, viewTenantId, viewSchema, 
viewName, DIVERGED_VIEW_BASE_COLUMN_COUNT);
                                 baseColumnCountUpserted = true;
                                 clearCache = true;

Reply via email to