phoenix-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From twdsilva <...@git.apache.org>
Subject [GitHub] phoenix pull request #303: PHOENIX-3534 Support multi region SYSTEM.CATALOG ...
Date Wed, 30 May 2018 23:03:34 GMT
Github user twdsilva commented on a diff in the pull request:

    https://github.com/apache/phoenix/pull/303#discussion_r191948821
  
    --- Diff: phoenix-core/src/it/java/org/apache/phoenix/end2end/ViewIT.java ---
    @@ -388,51 +435,65 @@ public void testViewAndTableInDifferentSchemas(boolean isNamespaceMapped)
throws
             } catch (TableNotFoundException ignore) {
             }
             ddl = "DROP TABLE " + fullTableName1;
    -        validateCannotDropTableWithChildViewsWithoutCascade(conn, fullTableName1);
             ddl = "DROP VIEW " + fullViewName2;
             conn.createStatement().execute(ddl);
             ddl = "DROP TABLE " + fullTableName1;
             conn.createStatement().execute(ddl);
         }
     
    -    
    +
         @Test
    -    public void testDisallowDropOfColumnOnParentTable() throws Exception {
    +    public void testDropOfColumnOnParentTableInvalidatesView() throws Exception {
             Connection conn = DriverManager.getConnection(getUrl());
    +        String fullTableName = generateUniqueTableName();
    +        String viewName = generateUniqueViewName();
    +        splitSystemCatalog(Lists.newArrayList(fullTableName, viewName));
    +
             String ddl = "CREATE TABLE " + fullTableName + " (k1 INTEGER NOT NULL, k2 INTEGER
NOT NULL, v1 DECIMAL, CONSTRAINT pk PRIMARY KEY (k1, k2))" + tableDDLOptions;
             conn.createStatement().execute(ddl);
    -        String viewName = "V_" + generateUniqueName();
             ddl = "CREATE VIEW " + viewName + "(v2 VARCHAR, v3 VARCHAR) AS SELECT * FROM
" + fullTableName + " WHERE v1 = 1.0";
             conn.createStatement().execute(ddl);
             
    -        try {
    -            conn.createStatement().execute("ALTER TABLE " + fullTableName + " DROP COLUMN
v1");
    -            fail();
    -        } catch (SQLException e) {
    -            assertEquals(SQLExceptionCode.CANNOT_MUTATE_TABLE.getErrorCode(), e.getErrorCode());
    +        conn.createStatement().execute("ALTER TABLE " + fullTableName + " DROP COLUMN
v1");
    +        // TODO see if its possibel to prevent the dropping of a column thats required
by a child view (for its view where clause)
    +        // the view should be invalid
    --- End diff --
    
    I was thinking of handling the race condition by writing a cell using checkAndPut with
the column name being mutated (added or dropped) to the header row of the base table. When
a view is create the columns used in the view where clause will also do a checkAndPut on this
cell in the base table. If this is happening concurrently only of the clients will succeed
(either the drop column, or the view creation). 
    
    If a DROP TABLE cascade is issued then the base table (with child views) is dropped. When
any child views are resolved and we see the base table does not exists we throw a TableNotFoundException.
If the DROP VIEW is issued without CASCADE and there are child views the statement fails with
a not allowed to mutate exception. If a drop table without cascade and a create view happens
concurrently we could create the view even though the base table would have been dropped,
but the next time the view is resolved you would get a TableNotFoundException.   


---

Mime
View raw message