Github user JamesRTaylor commented on a diff in the pull request:
https://github.com/apache/phoenix/pull/303#discussion_r192309043
--- 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 think we should avoid needing any kind of locking (including a
checkAndPut). The scaling issues we ran into were caused by contention on a
lock for the parent. The same thing could happen again with a checkAndPut
(which is just locking the row during the check). I'd err on the side of
scalability and have a view be invalidated if its parent is deleted. I think
that's a more scalable solution.
---