PHOENIX-1311 HBase namespaces surfaced in phoenix
Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/de9a2c7b Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/de9a2c7b Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/de9a2c7b Branch: refs/heads/master Commit: de9a2c7b0249cd5a1a75374aa5244d5ee076f3c1 Parents: 0490484 Author: Ankit Singhal <ankitsingha...@gmail.com> Authored: Thu Apr 14 15:11:03 2016 +0530 Committer: Ankit Singhal <ankitsingha...@gmail.com> Committed: Thu Apr 14 15:11:03 2016 +0530 ---------------------------------------------------------------------- .../apache/phoenix/end2end/CreateSchemaIT.java | 83 + .../apache/phoenix/end2end/CreateTableIT.java | 70 +- .../apache/phoenix/end2end/DropSchemaIT.java | 110 + .../end2end/NamespaceSchemaMappingIT.java | 115 + .../phoenix/end2end/PhoenixRuntimeIT.java | 2 +- .../end2end/QueryDatabaseMetaDataIT.java | 12 +- .../org/apache/phoenix/end2end/UpgradeIT.java | 87 + .../org/apache/phoenix/end2end/UseSchemaIT.java | 133 + .../java/org/apache/phoenix/end2end/ViewIT.java | 31 +- .../phoenix/end2end/index/LocalIndexIT.java | 450 +- .../end2end/index/MutableIndexFailureIT.java | 48 +- .../phoenix/end2end/index/ViewIndexIT.java | 57 +- .../org/apache/phoenix/tx/TxCheckpointIT.java | 5 +- phoenix-core/src/main/antlr3/PhoenixSQL.g | 22 + .../ipc/controller/MetadataRpcController.java | 12 +- .../apache/phoenix/compile/ColumnResolver.java | 10 + .../phoenix/compile/CreateSchemaCompiler.java | 65 + .../apache/phoenix/compile/FromCompiler.java | 166 +- .../apache/phoenix/compile/JoinCompiler.java | 11 +- .../apache/phoenix/compile/PostDDLCompiler.java | 24 +- .../compile/TupleProjectionCompiler.java | 24 +- .../apache/phoenix/compile/UnionCompiler.java | 11 +- .../coprocessor/MetaDataEndpointImpl.java | 360 +- .../phoenix/coprocessor/MetaDataProtocol.java | 28 +- .../coprocessor/generated/MetaDataProtos.java | 4211 +++++++++++++++--- .../coprocessor/generated/PSchemaProtos.java | 666 +++ .../coprocessor/generated/PTableProtos.java | 104 +- .../phoenix/exception/SQLExceptionCode.java | 21 +- .../hbase/index/master/IndexMasterObserver.java | 8 +- .../write/ParallelWriterIndexCommitter.java | 2 +- .../TrackingParallelWriterIndexCommitter.java | 2 +- .../index/PhoenixIndexFailurePolicy.java | 8 +- .../phoenix/iterate/ChunkedResultIterator.java | 6 +- .../phoenix/iterate/ParallelIterators.java | 2 +- .../apache/phoenix/iterate/SerialIterators.java | 2 +- .../apache/phoenix/jdbc/PhoenixConnection.java | 51 +- .../phoenix/jdbc/PhoenixDatabaseMetaData.java | 8 +- .../apache/phoenix/jdbc/PhoenixStatement.java | 88 +- .../phoenix/mapreduce/AbstractBulkLoadTool.java | 15 +- .../phoenix/mapreduce/CsvBulkImportUtil.java | 7 + .../mapreduce/MultiHfileOutputFormat.java | 4 +- .../phoenix/mapreduce/index/IndexTool.java | 15 +- .../phoenix/parse/CreateSchemaStatement.java | 25 + .../phoenix/parse/DropSchemaStatement.java | 38 + .../java/org/apache/phoenix/parse/PSchema.java | 86 + .../apache/phoenix/parse/ParseNodeFactory.java | 12 + .../phoenix/parse/UseSchemaStatement.java | 19 + .../apache/phoenix/protobuf/ProtobufUtil.java | 16 +- .../phoenix/query/ConnectionQueryServices.java | 16 +- .../query/ConnectionQueryServicesImpl.java | 378 +- .../query/ConnectionlessQueryServicesImpl.java | 43 +- .../query/DelegateConnectionQueryServices.java | 43 +- .../apache/phoenix/query/MetaDataMutated.java | 5 +- .../apache/phoenix/query/QueryConstants.java | 7 + .../org/apache/phoenix/query/QueryServices.java | 4 + .../phoenix/query/QueryServicesOptions.java | 11 +- .../apache/phoenix/schema/DelegateTable.java | 5 + .../apache/phoenix/schema/MetaDataClient.java | 204 +- .../NewerSchemaAlreadyExistsException.java | 26 + .../org/apache/phoenix/schema/PMetaData.java | 2 + .../apache/phoenix/schema/PMetaDataImpl.java | 51 +- .../java/org/apache/phoenix/schema/PTable.java | 6 + .../org/apache/phoenix/schema/PTableImpl.java | 58 +- .../org/apache/phoenix/schema/PTableKey.java | 2 + .../schema/SchemaAlreadyExistsException.java | 53 + .../phoenix/schema/SchemaNotFoundException.java | 52 + .../stats/StatisticsCollectorFactory.java | 5 + .../phoenix/schema/stats/StatisticsWriter.java | 6 +- .../java/org/apache/phoenix/util/IndexUtil.java | 2 +- .../java/org/apache/phoenix/util/JDBCUtil.java | 5 + .../org/apache/phoenix/util/MetaDataUtil.java | 106 +- .../org/apache/phoenix/util/PhoenixRuntime.java | 79 +- .../org/apache/phoenix/util/SchemaUtil.java | 141 +- .../org/apache/phoenix/util/UpgradeUtil.java | 177 + .../phoenix/execute/CorrelatePlanTest.java | 2 +- .../execute/LiteralResultIteratorPlanTest.java | 2 +- .../java/org/apache/phoenix/query/BaseTest.java | 23 +- .../query/ParallelIteratorsSplitTest.java | 11 + .../org/apache/phoenix/util/JDBCUtilTest.java | 8 + phoenix-protocol/src/main/MetaDataService.proto | 39 +- phoenix-protocol/src/main/PSchema.proto | 30 + phoenix-protocol/src/main/PTable.proto | 1 + 82 files changed, 7666 insertions(+), 1289 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/de9a2c7b/phoenix-core/src/it/java/org/apache/phoenix/end2end/CreateSchemaIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/CreateSchemaIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/CreateSchemaIT.java new file mode 100644 index 0000000..4cf9eb4 --- /dev/null +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/CreateSchemaIT.java @@ -0,0 +1,83 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.phoenix.end2end; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +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.client.HBaseAdmin; +import org.apache.phoenix.exception.SQLExceptionCode; +import org.apache.phoenix.jdbc.PhoenixConnection; +import org.apache.phoenix.query.QueryServices; +import org.apache.phoenix.schema.NewerSchemaAlreadyExistsException; +import org.apache.phoenix.schema.SchemaAlreadyExistsException; +import org.apache.phoenix.util.PhoenixRuntime; +import org.apache.phoenix.util.SchemaUtil; +import org.junit.Test; + +public class CreateSchemaIT extends BaseClientManagedTimeIT { + + @Test + public void testCreateSchema() throws Exception { + long ts = nextTimestamp(); + Properties props = new Properties(); + props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts)); + props.setProperty(QueryServices.IS_NAMESPACE_MAPPING_ENABLED, Boolean.toString(true)); + String ddl = "CREATE SCHEMA TEST_SCHEMA"; + try (Connection conn = DriverManager.getConnection(getUrl(), props); + HBaseAdmin admin = conn.unwrap(PhoenixConnection.class).getQueryServices().getAdmin();) { + conn.createStatement().execute(ddl); + assertNotNull(admin.getNamespaceDescriptor("TEST_SCHEMA")); + } + props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 10)); + try (Connection conn = DriverManager.getConnection(getUrl(), props);) { + conn.createStatement().execute(ddl); + fail(); + } catch (SchemaAlreadyExistsException e) { + // expected + } + props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts - 20)); + try (Connection conn = DriverManager.getConnection(getUrl(), props)) { + conn.createStatement().execute(ddl); + fail(); + } catch (NewerSchemaAlreadyExistsException e) { + // expected + } + props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 100)); + Connection conn = DriverManager.getConnection(getUrl(), props); + try { + conn.createStatement().execute("CREATE SCHEMA " + SchemaUtil.SCHEMA_FOR_DEFAULT_NAMESPACE); + fail(); + } catch (SQLException e) { + assertEquals(SQLExceptionCode.SCHEMA_NOT_ALLOWED.getErrorCode(), e.getErrorCode()); + } + try { + conn.createStatement().execute("CREATE SCHEMA " + SchemaUtil.HBASE_NAMESPACE); + fail(); + } catch (SQLException e) { + assertEquals(SQLExceptionCode.SCHEMA_NOT_ALLOWED.getErrorCode(), e.getErrorCode()); + } + conn.close(); + } +} http://git-wip-us.apache.org/repos/asf/phoenix/blob/de9a2c7b/phoenix-core/src/it/java/org/apache/phoenix/end2end/CreateTableIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/CreateTableIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/CreateTableIT.java index b0370e8..af25373 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/CreateTableIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/CreateTableIT.java @@ -19,6 +19,8 @@ package org.apache.phoenix.end2end; import static org.apache.hadoop.hbase.HColumnDescriptor.DEFAULT_REPLICATION_SCOPE; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @@ -35,9 +37,12 @@ import org.apache.hadoop.hbase.util.Bytes; import org.apache.phoenix.exception.SQLExceptionCode; import org.apache.phoenix.jdbc.PhoenixStatement; import org.apache.phoenix.query.KeyRange; +import org.apache.phoenix.query.QueryServices; import org.apache.phoenix.schema.NewerTableAlreadyExistsException; +import org.apache.phoenix.schema.SchemaNotFoundException; import org.apache.phoenix.schema.TableAlreadyExistsException; import org.apache.phoenix.util.PhoenixRuntime; +import org.apache.phoenix.util.SchemaUtil; import org.junit.Test; @@ -65,10 +70,12 @@ public class CreateTableIT extends BaseClientManagedTimeIT { @Test public void testCreateTable() throws Exception { long ts = nextTimestamp(); + String schemaName = "TEST"; + String tableName = schemaName + ".M_INTERFACE_JOB"; Properties props = new Properties(); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts)); - Connection conn = DriverManager.getConnection(getUrl(), props); - String ddl = "CREATE TABLE m_interface_job( data.addtime VARCHAR ,\n" + + + String ddl = "CREATE TABLE " + tableName + "( data.addtime VARCHAR ,\n" + " data.dir VARCHAR ,\n" + " data.end_time VARCHAR ,\n" + " data.file VARCHAR ,\n" + @@ -93,18 +100,41 @@ public class CreateTableIT extends BaseClientManagedTimeIT { " data.type VARCHAR ,\n" + " id INTEGER not null primary key desc\n" + " ) "; - conn.createStatement().execute(ddl); + try (Connection conn = DriverManager.getConnection(getUrl(), props);) { + conn.createStatement().execute(ddl); + } + HBaseAdmin admin = driver.getConnectionQueryServices(getUrl(), props).getAdmin(); + assertNotNull(admin.getTableDescriptor(Bytes.toBytes(tableName))); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 10)); - conn = DriverManager.getConnection(getUrl(), props); - try { + try (Connection conn = DriverManager.getConnection(getUrl(), props);) { conn.createStatement().execute(ddl); fail(); } catch (TableAlreadyExistsException e) { // expected } props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 20)); - conn = DriverManager.getConnection(getUrl(), props); - conn.createStatement().execute("DROP TABLE m_interface_job"); + try (Connection conn = DriverManager.getConnection(getUrl(), props);) { + conn.createStatement().execute("DROP TABLE " + tableName); + } + + props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 30)); + props.setProperty(QueryServices.IS_NAMESPACE_MAPPING_ENABLED, Boolean.TRUE.toString()); + try (Connection conn = DriverManager.getConnection(getUrl(), props);) { + conn.createStatement().execute("CREATE SCHEMA " + schemaName); + } + props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 40)); + try (Connection conn = DriverManager.getConnection(getUrl(), props);) { + conn.createStatement().execute(ddl); + assertNotEquals(null, + admin.getTableDescriptor(SchemaUtil.getPhysicalTableName(tableName.getBytes(), true).getName())); + } finally { + admin.close(); + } + props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 50)); + props.setProperty(QueryServices.DROP_METADATA_ATTRIB, Boolean.TRUE.toString()); + try (Connection conn = DriverManager.getConnection(getUrl(), props);) { + conn.createStatement().execute("DROP TABLE " + tableName); + } } @Test @@ -435,4 +465,30 @@ public class CreateTableIT extends BaseClientManagedTimeIT { } connAt20.close(); } + + @Test + public void testCreateTableWithoutSchema() throws Exception { + String createSchemaDDL = "CREATE SCHEMA T_SCHEMA"; + String createTableDDL = "CREATE TABLE T_SCHEMA.TEST(pk INTEGER PRIMARY KEY)"; + String dropTableDDL = "DROP TABLE T_SCHEMA.TEST"; + Properties props = new Properties(); + props.setProperty(QueryServices.IS_NAMESPACE_MAPPING_ENABLED, Boolean.toString(true)); + try (Connection conn = DriverManager.getConnection(getUrl(), props)) { + try { + conn.createStatement().execute(createTableDDL); + fail(); + } catch (SchemaNotFoundException snfe) { + //expected + } + conn.createStatement().execute(createSchemaDDL); + conn.createStatement().execute(createTableDDL); + conn.createStatement().execute(dropTableDDL); + } + props.setProperty(QueryServices.IS_NAMESPACE_MAPPING_ENABLED, Boolean.toString(false)); + try (Connection conn = DriverManager.getConnection(getUrl(), props);) { + conn.createStatement().execute(createTableDDL); + } catch (SchemaNotFoundException e) { + fail(); + } + } } http://git-wip-us.apache.org/repos/asf/phoenix/blob/de9a2c7b/phoenix-core/src/it/java/org/apache/phoenix/end2end/DropSchemaIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/DropSchemaIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/DropSchemaIT.java new file mode 100644 index 0000000..665c0a8 --- /dev/null +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/DropSchemaIT.java @@ -0,0 +1,110 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.phoenix.end2end; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +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.NamespaceDescriptor; +import org.apache.hadoop.hbase.NamespaceNotFoundException; +import org.apache.hadoop.hbase.TableName; +import org.apache.hadoop.hbase.client.HBaseAdmin; +import org.apache.phoenix.exception.SQLExceptionCode; +import org.apache.phoenix.query.QueryServices; +import org.apache.phoenix.schema.SchemaNotFoundException; +import org.apache.phoenix.util.PhoenixRuntime; +import org.apache.phoenix.util.TestUtil; +import org.junit.Test; + +public class DropSchemaIT extends BaseClientManagedTimeIT { + + @Test + public void testDropSchema() throws Exception { + long ts = nextTimestamp(); + String schema = "TEST_SCHEMA"; + String tableName = "TEST"; + Properties props = new Properties(); + String ddl = "DROP SCHEMA " + schema; + props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts)); + props.setProperty(QueryServices.IS_NAMESPACE_MAPPING_ENABLED, Boolean.toString(true)); + try (Connection conn = DriverManager.getConnection(getUrl(), props);) { + conn.createStatement().execute("CREATE SCHEMA " + schema); + } + props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 10)); + try (Connection conn = DriverManager.getConnection(getUrl(), props);) { + conn.createStatement().execute("CREATE TABLE " + schema + "." + tableName + "(id INTEGER PRIMARY KEY)"); + } + props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 15)); + HBaseAdmin admin = driver.getConnectionQueryServices(getUrl(), TestUtil.TEST_PROPERTIES).getAdmin(); + try (Connection conn = DriverManager.getConnection(getUrl(), props);) { + + try { + conn.createStatement().execute(ddl); + fail(); + } catch (SQLException e) { + e.printStackTrace(); + assertEquals(e.getErrorCode(), SQLExceptionCode.CANNOT_MUTATE_SCHEMA.getErrorCode()); + } + assertNotNull(admin.getNamespaceDescriptor(schema)); + } + props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts - 20)); + try (Connection conn = DriverManager.getConnection(getUrl(), props);) { + conn.createStatement().execute(ddl); + fail(); + } catch (SchemaNotFoundException e) { + // expected + } + assertNotNull(admin.getNamespaceDescriptor(schema)); + + props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 40)); + try (Connection conn = DriverManager.getConnection(getUrl(), props);) { + conn.createStatement().execute("DROP TABLE " + schema + "." + tableName); + //Dropping table manually because Drop_meta_attrib is not working + admin.disableTable(TableName.valueOf(schema, tableName)); + admin.deleteTable(TableName.valueOf(schema, tableName)); + } + props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 50)); + try (Connection conn = DriverManager.getConnection(getUrl(), props);) { + conn.createStatement().execute(ddl); + try { + admin.getNamespaceDescriptor(schema); + fail(); + } catch (NamespaceNotFoundException ne) { + // expected + } + } + props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 60)); + try (Connection conn = DriverManager.getConnection(getUrl(), props);) { + conn.createStatement().execute("DROP SCHEMA IF EXISTS " + schema); + } + props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 70)); + try (Connection conn = DriverManager.getConnection(getUrl(), props);) { + admin.createNamespace(NamespaceDescriptor.create(schema).build()); + conn.createStatement().execute("DROP SCHEMA IF EXISTS " + schema); + assertNotNull(admin.getNamespaceDescriptor(schema)); + } + admin.close(); + } + +} http://git-wip-us.apache.org/repos/asf/phoenix/blob/de9a2c7b/phoenix-core/src/it/java/org/apache/phoenix/end2end/NamespaceSchemaMappingIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/NamespaceSchemaMappingIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/NamespaceSchemaMappingIT.java new file mode 100644 index 0000000..1db74aa --- /dev/null +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/NamespaceSchemaMappingIT.java @@ -0,0 +1,115 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.phoenix.end2end; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.util.Properties; + +import org.apache.hadoop.hbase.HColumnDescriptor; +import org.apache.hadoop.hbase.HTableDescriptor; +import org.apache.hadoop.hbase.NamespaceDescriptor; +import org.apache.hadoop.hbase.TableName; +import org.apache.hadoop.hbase.client.HBaseAdmin; +import org.apache.hadoop.hbase.client.HTable; +import org.apache.hadoop.hbase.client.Put; +import org.apache.phoenix.jdbc.PhoenixConnection; +import org.apache.phoenix.jdbc.PhoenixDatabaseMetaData; +import org.apache.phoenix.query.QueryConstants; +import org.apache.phoenix.query.QueryServices; +import org.apache.phoenix.schema.types.PBoolean; +import org.apache.phoenix.schema.types.PVarchar; +import org.apache.phoenix.util.SchemaUtil; +import org.apache.phoenix.util.TestUtil; +import org.junit.Test; +/* + * since 4.8 + */ +public class NamespaceSchemaMappingIT extends BaseHBaseManagedTimeIT { + /** + * Tests that when: There is a table created with older version of phoenix and a table created with newer version + * having {@code QueryServices#IS_NAMESPACE_MAPPING_ENABLED} true, then there is only a flag + * {@code PhoenixDatabaseMetaData#IS_NAMESPACE_MAPPED} differentiates that whether schema of the table is mapped to + * namespace or not + */ + @Test + @SuppressWarnings("deprecation") + public void testBackWardCompatibility() throws Exception { + + String namespace = "TEST_SCHEMA"; + String schemaName = namespace; + String tableName = "TEST"; + + String phoenixFullTableName = schemaName + "." + tableName; + String hbaseFullTableName = schemaName + ":" + tableName; + HBaseAdmin admin = driver.getConnectionQueryServices(getUrl(), TestUtil.TEST_PROPERTIES).getAdmin(); + admin.createNamespace(NamespaceDescriptor.create(namespace).build()); + admin.createTable(new HTableDescriptor(TableName.valueOf(namespace, tableName)) + .addFamily(new HColumnDescriptor(QueryConstants.DEFAULT_COLUMN_FAMILY_BYTES))); + admin.createTable(new HTableDescriptor(TableName.valueOf(phoenixFullTableName)) + .addFamily(new HColumnDescriptor(QueryConstants.DEFAULT_COLUMN_FAMILY_BYTES))); + + Put put = new Put(PVarchar.INSTANCE.toBytes(phoenixFullTableName)); + put.addColumn(QueryConstants.DEFAULT_COLUMN_FAMILY_BYTES, QueryConstants.EMPTY_COLUMN_BYTES, + QueryConstants.EMPTY_COLUMN_VALUE_BYTES); + HTable phoenixSchematable = new HTable(admin.getConfiguration(), phoenixFullTableName); + phoenixSchematable.put(put); + phoenixSchematable.close(); + put = new Put(PVarchar.INSTANCE.toBytes(hbaseFullTableName)); + put.addColumn(QueryConstants.DEFAULT_COLUMN_FAMILY_BYTES, QueryConstants.EMPTY_COLUMN_BYTES, + QueryConstants.EMPTY_COLUMN_VALUE_BYTES); + phoenixSchematable.close(); + HTable namespaceMappedtable = new HTable(admin.getConfiguration(), hbaseFullTableName); + namespaceMappedtable.put(put); + namespaceMappedtable.close(); + Properties props = new Properties(); + props.setProperty(QueryServices.DROP_METADATA_ATTRIB, Boolean.TRUE.toString()); + Connection conn = DriverManager.getConnection(getUrl(), props); + String ddl = "create table " + phoenixFullTableName + "(tableName varchar primary key)"; + conn.createStatement().execute(ddl); + String query = "select tableName from " + phoenixFullTableName; + + ResultSet rs = conn.createStatement().executeQuery(query); + assertTrue(rs.next()); + assertEquals(phoenixFullTableName, rs.getString(1)); + + HTable metatable = new HTable(admin.getConfiguration(), + SchemaUtil.getPhysicalName(PhoenixDatabaseMetaData.SYSTEM_CATALOG_NAME_BYTES, + (conn.unwrap(PhoenixConnection.class).getQueryServices().getProps()))); + Put p = new Put(SchemaUtil.getTableKey(null, schemaName, tableName)); + p.addColumn(QueryConstants.DEFAULT_COLUMN_FAMILY_BYTES, PhoenixDatabaseMetaData.IS_NAMESPACE_MAPPED_BYTES, + PBoolean.INSTANCE.toBytes(true)); + metatable.put(p); + metatable.close(); + + PhoenixConnection phxConn = (conn.unwrap(PhoenixConnection.class)); + phxConn.getQueryServices().clearCache(); + rs = conn.createStatement().executeQuery(query); + assertTrue(rs.next()); + assertEquals(hbaseFullTableName, rs.getString(1)); + admin.disableTable(phoenixFullTableName); + admin.deleteTable(phoenixFullTableName); + conn.createStatement().execute("DROP TABLE " + phoenixFullTableName); + admin.close(); + conn.close(); + } +} http://git-wip-us.apache.org/repos/asf/phoenix/blob/de9a2c7b/phoenix-core/src/it/java/org/apache/phoenix/end2end/PhoenixRuntimeIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/PhoenixRuntimeIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/PhoenixRuntimeIT.java index 3cab7fa..3ba43e9 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/PhoenixRuntimeIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/PhoenixRuntimeIT.java @@ -143,5 +143,5 @@ public class PhoenixRuntimeIT extends BaseHBaseManagedTimeIT { assertTenantIds(e7, htable7, new FirstKeyOnlyFilter(), new String[] {"t1", "t2"} ); } - + } http://git-wip-us.apache.org/repos/asf/phoenix/blob/de9a2c7b/phoenix-core/src/it/java/org/apache/phoenix/end2end/QueryDatabaseMetaDataIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/QueryDatabaseMetaDataIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/QueryDatabaseMetaDataIT.java index ba83e6a..f62bf0f 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/QueryDatabaseMetaDataIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/QueryDatabaseMetaDataIT.java @@ -174,12 +174,10 @@ public class QueryDatabaseMetaDataIT extends BaseClientManagedTimeIT { @Test public void testSchemaMetadataScan() throws SQLException { - long ts = nextTimestamp(); - ensureTableCreated(getUrl(), CUSTOM_ENTITY_DATA_FULL_NAME, null, ts); - ensureTableCreated(getUrl(), PTSDB_NAME, null, ts); Properties props = new Properties(); - props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 5)); + props.setProperty(QueryServices.IS_NAMESPACE_MAPPING_ENABLED, Boolean.toString(true)); Connection conn = DriverManager.getConnection(getUrl(), props); + conn.createStatement().execute("CREATE SCHEMA " + CUSTOM_ENTITY_DATA_SCHEMA_NAME); DatabaseMetaData dbmd = conn.getMetaData(); ResultSet rs; rs = dbmd.getSchemas(null, CUSTOM_ENTITY_DATA_SCHEMA_NAME); @@ -190,14 +188,8 @@ public class QueryDatabaseMetaDataIT extends BaseClientManagedTimeIT { rs = dbmd.getSchemas(null, null); assertTrue(rs.next()); - assertEquals(rs.getString("TABLE_SCHEM"),null); - assertEquals(rs.getString("TABLE_CATALOG"),null); - assertTrue(rs.next()); assertEquals(rs.getString("TABLE_SCHEM"),CUSTOM_ENTITY_DATA_SCHEMA_NAME); assertEquals(rs.getString("TABLE_CATALOG"),null); - assertTrue(rs.next()); - assertEquals(rs.getString("TABLE_SCHEM"),PhoenixDatabaseMetaData.SYSTEM_CATALOG_SCHEMA); - assertEquals(rs.getString("TABLE_CATALOG"),null); assertFalse(rs.next()); } http://git-wip-us.apache.org/repos/asf/phoenix/blob/de9a2c7b/phoenix-core/src/it/java/org/apache/phoenix/end2end/UpgradeIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/UpgradeIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/UpgradeIT.java index 094816c..1c86039 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/UpgradeIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/UpgradeIT.java @@ -26,20 +26,26 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Properties; +import java.util.Set; import org.apache.hadoop.hbase.HConstants; +import org.apache.hadoop.hbase.client.HBaseAdmin; import org.apache.hadoop.hbase.client.HTableInterface; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.client.RowMutations; import org.apache.hadoop.hbase.util.Bytes; import org.apache.phoenix.jdbc.PhoenixConnection; import org.apache.phoenix.jdbc.PhoenixDatabaseMetaData; +import org.apache.phoenix.query.QueryConstants; +import org.apache.phoenix.query.QueryServices; +import org.apache.phoenix.util.MetaDataUtil; import org.apache.phoenix.util.PhoenixRuntime; import org.apache.phoenix.util.SchemaUtil; import org.apache.phoenix.util.UpgradeUtil; @@ -111,6 +117,86 @@ public class UpgradeIT extends BaseHBaseManagedTimeIT { testViewUpgrade(true, TENANT_ID, "SAMESCHEMA", "TABLEWITHVIEW5", "SAMESCHEMA", "VIEW5", ColumnDiff.LESS); } + + @Test + public void testMapTableToNamespaceDuringUpgrade() + throws SQLException, IOException, IllegalArgumentException, InterruptedException { + String[] strings = new String[] { "a", "b", "c", "d" }; + + try (Connection conn = DriverManager.getConnection(getUrl())) { + String schemaName = "TEST"; + String phoenixFullTableName = schemaName + ".S_NEW"; + String indexName = "IDX"; + String localIndexName = "LIDX"; + String[] tableNames = new String[] { phoenixFullTableName, schemaName + "." + indexName, + schemaName + "." + localIndexName, "diff.v", "test.v" }; + conn.createStatement().execute("CREATE TABLE " + phoenixFullTableName + + "(k VARCHAR PRIMARY KEY, v INTEGER, f INTEGER, g INTEGER NULL, h INTEGER NULL)"); + PreparedStatement upsertStmt = conn + .prepareStatement("UPSERT INTO " + phoenixFullTableName + " VALUES(?, ?, 0, 0, 0)"); + int i = 1; + for (String str : strings) { + upsertStmt.setString(1, str); + upsertStmt.setInt(2, i++); + upsertStmt.execute(); + } + conn.commit(); + // creating local index + conn.createStatement() + .execute("create local index " + localIndexName + " on " + phoenixFullTableName + "(K)"); + // creating global index + conn.createStatement().execute("create index " + indexName + " on " + phoenixFullTableName + "(k)"); + // creating view in schema 'diff' + conn.createStatement().execute("CREATE VIEW diff.v (col VARCHAR) AS SELECT * FROM " + phoenixFullTableName); + // creating view in schema 'test' + conn.createStatement().execute("CREATE VIEW test.v (col VARCHAR) AS SELECT * FROM " + phoenixFullTableName); + // Creating index on views + conn.createStatement().execute("create index v_idx on diff.v(col)"); + conn.createStatement().execute("create index v_idx on test.v(col)"); + + // validate data + for (String tableName : tableNames) { + ResultSet rs = conn.createStatement().executeQuery("select * from " + tableName); + for (String str : strings) { + assertTrue(rs.next()); + assertEquals(str, rs.getString(1)); + } + } + + HBaseAdmin admin = conn.unwrap(PhoenixConnection.class).getQueryServices().getAdmin(); + assertTrue(admin.tableExists(phoenixFullTableName)); + assertTrue(admin.tableExists(MetaDataUtil.getLocalIndexPhysicalName(Bytes.toBytes(phoenixFullTableName)))); + assertTrue(admin.tableExists(schemaName + QueryConstants.NAME_SEPARATOR + indexName)); + assertTrue(admin.tableExists(MetaDataUtil.getViewIndexPhysicalName(Bytes.toBytes(phoenixFullTableName)))); + Properties props = new Properties(); + props.setProperty(QueryServices.IS_NAMESPACE_MAPPING_ENABLED, Boolean.toString(true)); + admin.close(); + PhoenixConnection phxConn = DriverManager.getConnection(getUrl(), props).unwrap(PhoenixConnection.class); + UpgradeUtil.upgradeTable(phxConn, phoenixFullTableName); + Set<String> viewNames = MetaDataUtil.getViewNames(phxConn, phoenixFullTableName); + for (String viewName : viewNames) { + UpgradeUtil.upgradeTable(phxConn, viewName); + } + admin = phxConn.unwrap(PhoenixConnection.class).getQueryServices().getAdmin(); + String hbaseTableName = SchemaUtil.getPhysicalTableName(Bytes.toBytes(phoenixFullTableName), true) + .getNameAsString(); + assertTrue(admin.tableExists(hbaseTableName)); + assertTrue(admin.tableExists(MetaDataUtil.getLocalIndexPhysicalName(Bytes.toBytes(hbaseTableName)))); + assertTrue(admin.tableExists(schemaName + QueryConstants.NAMESPACE_SEPARATOR + indexName)); + assertTrue(admin.tableExists(MetaDataUtil.getViewIndexPhysicalName(Bytes.toBytes(hbaseTableName)))); + i = 0; + // validate data + for (String tableName : tableNames) { + ResultSet rs = phxConn.createStatement().executeQuery("select * from " + tableName); + for (String str : strings) { + assertTrue(rs.next()); + assertEquals(str, rs.getString(1)); + } + } + phxConn.close(); + admin.close(); + } + } @Test public void testSettingBaseColumnCountForMultipleViewsOnTable() throws Exception { @@ -329,4 +415,5 @@ public class UpgradeIT extends BaseHBaseManagedTimeIT { } return DriverManager.getConnection(getUrl()); } + } http://git-wip-us.apache.org/repos/asf/phoenix/blob/de9a2c7b/phoenix-core/src/it/java/org/apache/phoenix/end2end/UseSchemaIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/UseSchemaIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/UseSchemaIT.java new file mode 100644 index 0000000..f202750 --- /dev/null +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/UseSchemaIT.java @@ -0,0 +1,133 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.phoenix.end2end; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Properties; + +import org.apache.hadoop.hbase.HColumnDescriptor; +import org.apache.hadoop.hbase.HTableDescriptor; +import org.apache.hadoop.hbase.NamespaceDescriptor; +import org.apache.hadoop.hbase.client.HBaseAdmin; +import org.apache.hadoop.hbase.client.HTable; +import org.apache.hadoop.hbase.client.Put; +import org.apache.phoenix.exception.SQLExceptionCode; +import org.apache.phoenix.query.QueryConstants; +import org.apache.phoenix.query.QueryServices; +import org.apache.phoenix.schema.types.PVarchar; +import org.apache.phoenix.util.SchemaUtil; +import org.apache.phoenix.util.TestUtil; +import org.junit.Test; + +public class UseSchemaIT extends BaseHBaseManagedTimeIT { + + @Test + public void testUseSchema() throws Exception { + Properties props = new Properties(); + props.setProperty(QueryServices.IS_NAMESPACE_MAPPING_ENABLED, Boolean.toString(true)); + Connection conn = DriverManager.getConnection(getUrl(), props); + String ddl = "CREATE SCHEMA IF NOT EXISTS TEST_SCHEMA"; + conn.createStatement().execute(ddl); + ddl = "create table test_schema.test(id varchar primary key)"; + conn.createStatement().execute(ddl); + conn.createStatement().execute("use test_schema"); + String query = "select count(*) from test"; + ResultSet rs = conn.createStatement().executeQuery(query); + assertTrue(rs.next()); + assertEquals(0, rs.getInt(1)); + try { + conn.createStatement().execute("use test"); + fail(); + } catch (SQLException e) { + assertEquals(SQLExceptionCode.SCHEMA_NOT_FOUND.getErrorCode(), e.getErrorCode()); + } + conn.createStatement().execute("use default"); + ddl = "create table IF NOT EXISTS test(schema_name varchar primary key)"; + conn.createStatement().execute(ddl); + conn.createStatement().executeUpdate("upsert into test values('"+SchemaUtil.SCHEMA_FOR_DEFAULT_NAMESPACE+"')"); + conn.commit(); + rs = conn.createStatement().executeQuery("select schema_name from test"); + assertTrue(rs.next()); + assertEquals(SchemaUtil.SCHEMA_FOR_DEFAULT_NAMESPACE, rs.getString(1)); + conn.close(); + } + + @Test + public void testSchemaInJdbcUrl() throws Exception { + Properties props = new Properties(); + String schema = "TEST_SCHEMA"; + props.setProperty(QueryServices.SCHEMA_ATTRIB, schema); + props.setProperty(QueryServices.IS_NAMESPACE_MAPPING_ENABLED, Boolean.toString(true)); + Connection conn = DriverManager.getConnection(getUrl(), props); + conn.setAutoCommit(true); + String ddl = "CREATE SCHEMA IF NOT EXISTS " + schema; + conn.createStatement().execute(ddl); + ddl = "create table IF NOT EXISTS " + schema + ".test(schema_name varchar primary key)"; + conn.createStatement().execute(ddl); + conn.createStatement().executeUpdate("upsert into " + schema + ".test values('" + schema + "')"); + String query = "select schema_name from test"; + ResultSet rs = conn.createStatement().executeQuery(query); + assertTrue(rs.next()); + assertEquals(schema, rs.getString(1)); + + schema = "test"; + ddl = "CREATE SCHEMA " + schema; + conn.createStatement().execute(ddl); + conn.createStatement().execute("use " + schema); + ddl = "create table test(schema_name varchar primary key)"; + conn.createStatement().execute(ddl); + conn.createStatement().executeUpdate("upsert into test values('" + schema + "')"); + rs = conn.createStatement().executeQuery("select schema_name from test"); + assertTrue(rs.next()); + assertEquals(schema, rs.getString(1)); + conn.close(); + } + + @Test + public void testMappedView() throws Exception { + Properties props = new Properties(); + String schema = "TEST_SCHEMA_V"; + String tableName = "TEST"; + String fullTablename = schema + QueryConstants.NAME_SEPARATOR + tableName; + props.setProperty(QueryServices.SCHEMA_ATTRIB, schema); + Connection conn = DriverManager.getConnection(getUrl(), props); + HBaseAdmin admin = driver.getConnectionQueryServices(getUrl(), TestUtil.TEST_PROPERTIES).getAdmin(); + admin.createNamespace(NamespaceDescriptor.create(schema).build()); + admin.createTable(new HTableDescriptor(fullTablename) + .addFamily(new HColumnDescriptor(QueryConstants.DEFAULT_COLUMN_FAMILY_BYTES))); + Put put = new Put(PVarchar.INSTANCE.toBytes(fullTablename)); + put.addColumn(QueryConstants.DEFAULT_COLUMN_FAMILY_BYTES, QueryConstants.EMPTY_COLUMN_BYTES, + QueryConstants.EMPTY_COLUMN_VALUE_BYTES); + HTable phoenixSchematable = new HTable(admin.getConfiguration(), fullTablename); + phoenixSchematable.put(put); + phoenixSchematable.close(); + conn.createStatement().execute("CREATE VIEW " + tableName + " (tablename VARCHAR PRIMARY KEY)"); + ResultSet rs = conn.createStatement().executeQuery("select tablename from " + tableName); + assertTrue(rs.next()); + assertEquals(fullTablename, rs.getString(1)); + admin.close(); + conn.close(); + } +} http://git-wip-us.apache.org/repos/asf/phoenix/blob/de9a2c7b/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 146fb1f..c87d82d 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 @@ -34,18 +34,24 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; +import java.util.Properties; +import org.apache.hadoop.hbase.client.HBaseAdmin; import org.apache.phoenix.compile.QueryPlan; import org.apache.phoenix.exception.SQLExceptionCode; +import org.apache.phoenix.jdbc.PhoenixConnection; import org.apache.phoenix.query.KeyRange; +import org.apache.phoenix.query.QueryServices; import org.apache.phoenix.schema.ColumnAlreadyExistsException; import org.apache.phoenix.schema.ReadOnlyTableException; import org.apache.phoenix.schema.TableNotFoundException; import org.apache.phoenix.util.PhoenixRuntime; import org.apache.phoenix.util.QueryUtil; +import org.apache.phoenix.util.SchemaUtil; import org.junit.Test; + public class ViewIT extends BaseViewIT { public ViewIT(boolean transactional) { @@ -325,16 +331,37 @@ public class ViewIT extends BaseViewIT { assertEquals(5, count); } + + @Test + public void testViewAndTableInDifferentSchemasWithNamespaceMappingEnabled() throws Exception { + testViewAndTableInDifferentSchemas(true); + } + @Test public void testViewAndTableInDifferentSchemas() throws Exception { - Connection conn = DriverManager.getConnection(getUrl()); - String fullTableName = "s1.t"+tableSuffix; + testViewAndTableInDifferentSchemas(false); + + } + + public void testViewAndTableInDifferentSchemas(boolean isNamespaceMapped) throws Exception { + Properties props = new Properties(); + props.setProperty(QueryServices.IS_NAMESPACE_MAPPING_ENABLED, Boolean.toString(isNamespaceMapped)); + Connection conn = DriverManager.getConnection(getUrl(),props); + String fullTableName = "s1.t" + tableSuffix + (isNamespaceMapped ? "_N" : ""); + if (isNamespaceMapped) { + conn.createStatement().execute("CREATE SCHEMA IF NOT EXISTS s1"); + } String ddl = "CREATE TABLE " + fullTableName + " (k INTEGER NOT NULL PRIMARY KEY, v1 DATE)" + tableDDLOptions; + HBaseAdmin admin = conn.unwrap(PhoenixConnection.class).getQueryServices().getAdmin(); conn.createStatement().execute(ddl); + assertTrue(admin.tableExists(SchemaUtil.getPhysicalTableName(SchemaUtil.normalizeIdentifier(fullTableName), + conn.unwrap(PhoenixConnection.class).getQueryServices().getProps()))); ddl = "CREATE VIEW s2.v1 (v2 VARCHAR) AS SELECT * FROM " + fullTableName + " WHERE k > 5"; conn.createStatement().execute(ddl); ddl = "CREATE VIEW v2 (v2 VARCHAR) AS SELECT * FROM " + fullTableName + " WHERE k > 5"; conn.createStatement().execute(ddl); + conn.createStatement().executeQuery("SELECT * FROM s2.v1"); + conn.createStatement().executeQuery("SELECT * FROM v2"); ddl = "DROP VIEW v1"; try { conn.createStatement().execute(ddl);