Repository: phoenix Updated Branches: refs/heads/master d821ea30c -> 12c8f1b1f
PHOENIX-4971 Drop index will execute successfully using Incorrect name of parent tables Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/12c8f1b1 Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/12c8f1b1 Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/12c8f1b1 Branch: refs/heads/master Commit: 12c8f1b1f67e56cd4f3f2a0dde9035a5b72b9de9 Parents: d821ea3 Author: Jaanai <cloud.pos...@gmail.com> Authored: Fri Nov 23 21:16:20 2018 +0800 Committer: Thomas D'Silva <tdsi...@apache.org> Committed: Mon Nov 26 10:22:05 2018 -0800 ---------------------------------------------------------------------- .../java/org/apache/phoenix/end2end/ViewIT.java | 51 +++++++++----------- .../phoenix/end2end/index/DropMetadataIT.java | 23 ++++++++- .../phoenix/end2end/index/IndexMetadataIT.java | 5 +- .../coprocessor/MetaDataEndpointImpl.java | 2 +- .../phoenix/exception/SQLExceptionCode.java | 2 + .../apache/phoenix/schema/MetaDataClient.java | 16 ++++++ 6 files changed, 68 insertions(+), 31 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/12c8f1b1/phoenix-core/src/it/java/org/apache/phoenix/end2end/ViewIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ViewIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ViewIT.java index 572846e..bcf7eca 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ViewIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ViewIT.java @@ -927,55 +927,52 @@ public class ViewIT extends SplitSystemCatalogIT { TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(TableName.valueOf(NS, TBL)); builder.addColumnFamily(ColumnFamilyDescriptorBuilder.of(CF)); admin.createTable(builder.build()); - } - String view1 = NS + "." + TBL; - conn.createStatement().execute( - "CREATE VIEW " + view1 + " (PK VARCHAR PRIMARY KEY, " + CF + ".COL VARCHAR)"); + String view1 = NS + "." + TBL; + conn.createStatement().execute( + "CREATE VIEW " + view1 + " (PK VARCHAR PRIMARY KEY, " + CF + ".COL VARCHAR)"); - assertTrue(QueryUtil - .getExplainPlan( - conn.createStatement().executeQuery("explain select * from " + view1)) + assertTrue(QueryUtil.getExplainPlan( + conn.createStatement().executeQuery("explain select * from " + view1)) .contains(NS + ":" + TBL)); - + conn.createStatement().execute("DROP VIEW " + view1); + } // test for a view whose name contains a dot (e.g. "AAA.BBB") in default schema (for backward compatibility) { TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(TableName.valueOf(NS + "." + TBL)); builder.addColumnFamily(ColumnFamilyDescriptorBuilder.of(CF)); admin.createTable(builder.build()); - } - String view2 = "\"" + NS + "." + TBL + "\""; - conn.createStatement().execute( - "CREATE VIEW " + view2 + " (PK VARCHAR PRIMARY KEY, " + CF + ".COL VARCHAR)"); + String view2 = "\"" + NS + "." + TBL + "\""; + conn.createStatement().execute( + "CREATE VIEW " + view2 + " (PK VARCHAR PRIMARY KEY, " + CF + ".COL VARCHAR)"); - assertTrue(QueryUtil - .getExplainPlan( - conn.createStatement().executeQuery("explain select * from " + view2)) - .contains(NS + "." + TBL)); + assertTrue(QueryUtil + .getExplainPlan( + conn.createStatement().executeQuery("explain select * from " + view2)) + .contains(NS + "." + TBL)); + + conn.createStatement().execute("DROP VIEW " + view2); + } // test for a view whose name contains a dot (e.g. "AAA.BBB") in non-default schema { TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(TableName.valueOf(NS, NS + "." + TBL)); builder.addColumnFamily(ColumnFamilyDescriptorBuilder.of(CF)); admin.createTable(builder.build()); - } - String view3 = NS + ".\"" + NS + "." + TBL + "\""; - conn.createStatement().execute( - "CREATE VIEW " + view3 + " (PK VARCHAR PRIMARY KEY, " + CF + ".COL VARCHAR)"); + String view3 = NS + ".\"" + NS + "." + TBL + "\""; + conn.createStatement().execute( + "CREATE VIEW " + view3 + " (PK VARCHAR PRIMARY KEY, " + CF + ".COL VARCHAR)"); - assertTrue(QueryUtil - .getExplainPlan( + assertTrue(QueryUtil.getExplainPlan( conn.createStatement().executeQuery("explain select * from " + view3)) - .contains(NS + ":" + NS + "." + TBL)); - - conn.createStatement().execute("DROP VIEW " + view1); - conn.createStatement().execute("DROP VIEW " + view2); - conn.createStatement().execute("DROP VIEW " + view3); + .contains(NS + ":" + NS + "." + TBL)); + conn.createStatement().execute("DROP VIEW " + view3); + } conn.createStatement().execute("DROP SCHEMA " + NS); } } http://git-wip-us.apache.org/repos/asf/phoenix/blob/12c8f1b1/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/DropMetadataIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/DropMetadataIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/DropMetadataIT.java index 71a9f00..d945e43 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/DropMetadataIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/DropMetadataIT.java @@ -18,9 +18,12 @@ package org.apache.phoenix.end2end.index; import static org.apache.phoenix.util.TestUtil.HBASE_NATIVE_SCHEMA_NAME; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; import java.sql.Connection; import java.sql.DriverManager; +import java.sql.SQLException; import java.util.Properties; import org.apache.hadoop.hbase.KeepDeletedCells; @@ -32,6 +35,7 @@ import org.apache.hadoop.hbase.client.TableDescriptorBuilder; import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding; import org.apache.hadoop.hbase.util.Bytes; import org.apache.phoenix.end2end.ParallelStatsDisabledIT; +import org.apache.phoenix.exception.SQLExceptionCode; import org.apache.phoenix.jdbc.PhoenixConnection; import org.apache.phoenix.query.QueryServices; import org.apache.phoenix.util.PropertiesUtil; @@ -59,7 +63,24 @@ public class DropMetadataIT extends ParallelStatsDisabledIT { String url = QueryUtil.getConnectionUrl(props, config, PRINCIPAL); return DriverManager.getConnection(url, props); } - + + @Test + public void testDropIndexTableHasSameNameWithDataTable() { + String tableName = generateUniqueName(); + String indexName = "IDX_" + tableName; + try (Connection conn = DriverManager.getConnection(getUrl())) { + String createTable = "CREATE TABLE " + tableName + " (id varchar not null primary key, col integer)"; + conn.createStatement().execute(createTable); + String createIndex = "CREATE INDEX " + indexName + " on " + tableName + "(col)"; + conn.createStatement().execute(createIndex); + String dropIndex = "DROP INDEX " + indexName + " on " + indexName; + conn.createStatement().execute(dropIndex); + fail("should not execute successfully"); + } catch (SQLException e) { + assertTrue(SQLExceptionCode.PARENT_TABLE_NOT_FOUND.getErrorCode() == e.getErrorCode()); + } + } + @Test public void testDropViewKeepsHTable() throws Exception { Connection conn = getConnection(); http://git-wip-us.apache.org/repos/asf/phoenix/blob/12c8f1b1/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/IndexMetadataIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/IndexMetadataIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/IndexMetadataIT.java index f797b70..bb7e6ad 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/IndexMetadataIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/IndexMetadataIT.java @@ -284,9 +284,10 @@ public class IndexMetadataIT extends ParallelStatsDisabledIT { try { conn.createStatement().execute("DROP INDEX " + indexName + "1 ON " + diffTableNameInSameSchema); fail("Should have realized index " + indexName + "1 is not on the table"); - } catch (TableNotFoundException ignore) { - + } catch (SQLException e) { + assertTrue(e.getErrorCode() == SQLExceptionCode.PARENT_TABLE_NOT_FOUND.getErrorCode()); } + ddl = "DROP TABLE " + INDEX_DATA_SCHEMA + QueryConstants.NAME_SEPARATOR + indexDataTable; conn.createStatement().execute(ddl); http://git-wip-us.apache.org/repos/asf/phoenix/blob/12c8f1b1/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 e925c45..148caad 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 @@ -2453,7 +2453,7 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements RegionCopr .create(Bytes.toString(viewSchemaName), Bytes.toString(viewName)); try { client.dropTable( - new DropTableStatement(viewTableName, PTableType.VIEW, false, true, true)); + new DropTableStatement(viewTableName, PTableType.VIEW, true, true, true)); } catch (TableNotFoundException e) { logger.info("Ignoring view "+viewTableName+" as it has already been dropped"); http://git-wip-us.apache.org/repos/asf/phoenix/blob/12c8f1b1/phoenix-core/src/main/java/org/apache/phoenix/exception/SQLExceptionCode.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/exception/SQLExceptionCode.java b/phoenix-core/src/main/java/org/apache/phoenix/exception/SQLExceptionCode.java index 3e4763d..d29c90f 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/exception/SQLExceptionCode.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/exception/SQLExceptionCode.java @@ -185,6 +185,8 @@ public enum SQLExceptionCode { INVALID_REPLAY_AT(533, "42910", "Value of REPLAY_AT cannot be less than zero."), UNEQUAL_SCN_AND_BUILD_INDEX_AT(534, "42911", "If both specified, values of CURRENT_SCN and BUILD_INDEX_AT must be equal."), ONLY_INDEX_UPDATABLE_AT_SCN(535, "42912", "Only an index may be updated when the BUILD_INDEX_AT property is specified"), + PARENT_TABLE_NOT_FOUND(536, "42913", "Can't drop the index because the parent table in the DROP statement is incorrect."), + /** * HBase and Phoenix specific implementation defined sub-classes. * Column family related exceptions. http://git-wip-us.apache.org/repos/asf/phoenix/blob/12c8f1b1/phoenix-core/src/main/java/org/apache/phoenix/schema/MetaDataClient.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/schema/MetaDataClient.java b/phoenix-core/src/main/java/org/apache/phoenix/schema/MetaDataClient.java index e08dbde..63860e0 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/schema/MetaDataClient.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/schema/MetaDataClient.java @@ -22,6 +22,7 @@ import static com.google.common.collect.Sets.newLinkedHashSetWithExpectedSize; import static org.apache.phoenix.coprocessor.BaseScannerRegionObserver.ANALYZE_TABLE; import static org.apache.phoenix.coprocessor.BaseScannerRegionObserver.RUN_UPDATE_STATS_ASYNC_ATTRIB; import static org.apache.phoenix.exception.SQLExceptionCode.INSUFFICIENT_MULTI_TENANT_COLUMNS; +import static org.apache.phoenix.exception.SQLExceptionCode.PARENT_TABLE_NOT_FOUND; import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.APPEND_ONLY_SCHEMA; import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.ARG_POSITION; import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.ARRAY_SIZE; @@ -3122,8 +3123,23 @@ public class MetaDataClient { connection.setAutoCommit(wasAutoCommit); } } + MutationState dropTable(String schemaName, String tableName, String parentTableName, PTableType tableType, boolean ifExists, boolean cascade, boolean skipAddingParentColumns) throws SQLException { + // Checking the parent table whether exists + String fullTableName = SchemaUtil.getTableName(schemaName, tableName); + try { + PTable ptable = connection.getTable(new PTableKey(connection.getTenantId(), fullTableName)); + if (parentTableName != null &&!parentTableName.equals(ptable.getParentTableName().getString())) { + throw new SQLExceptionInfo.Builder(PARENT_TABLE_NOT_FOUND) + .setSchemaName(schemaName).setTableName(tableName).build().buildException(); + } + } catch (TableNotFoundException e) { + if (!ifExists) { + throw e; + } + } + connection.rollback(); boolean wasAutoCommit = connection.getAutoCommit(); PName tenantId = connection.getTenantId();