Repository: phoenix Updated Branches: refs/heads/4.x-HBase-0.98 df65b174d -> 3c205ac49
PHOENIX-2901 If namespaces are enabled, check for existence of schema when sequence created Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/45e4af51 Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/45e4af51 Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/45e4af51 Branch: refs/heads/4.x-HBase-0.98 Commit: 45e4af519ff90a7969ba0ef690c3a9c5fe178229 Parents: df65b17 Author: Ankit Singhal <ankitsingha...@gmail.com> Authored: Fri Jun 10 16:49:54 2016 +0530 Committer: Ankit Singhal <ankitsingha...@gmail.com> Committed: Fri Jun 10 16:49:54 2016 +0530 ---------------------------------------------------------------------- .../org/apache/phoenix/end2end/SequenceIT.java | 58 ++++- .../end2end/TenantSpecificViewIndexIT.java | 211 +++++++++++++------ .../org/apache/phoenix/end2end/UpgradeIT.java | 41 +++- .../phoenix/end2end/index/ViewIndexIT.java | 22 +- .../apache/phoenix/compile/FromCompiler.java | 4 + .../phoenix/query/ConnectionQueryServices.java | 1 - .../query/ConnectionQueryServicesImpl.java | 26 ++- .../apache/phoenix/schema/MetaDataClient.java | 21 +- .../org/apache/phoenix/util/MetaDataUtil.java | 35 +-- .../org/apache/phoenix/util/PhoenixRuntime.java | 6 +- .../org/apache/phoenix/util/UpgradeUtil.java | 55 ++++- 11 files changed, 367 insertions(+), 113 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/45e4af51/phoenix-core/src/it/java/org/apache/phoenix/end2end/SequenceIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/SequenceIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/SequenceIT.java index 3e7ec31..3ed4fd7 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/SequenceIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/SequenceIT.java @@ -37,6 +37,7 @@ import java.util.Properties; import org.apache.phoenix.exception.SQLExceptionCode; import org.apache.phoenix.jdbc.PhoenixStatement; import org.apache.phoenix.query.QueryServices; +import org.apache.phoenix.schema.SchemaNotFoundException; import org.apache.phoenix.schema.SequenceAlreadyExistsException; import org.apache.phoenix.schema.SequenceNotFoundException; import org.apache.phoenix.util.PhoenixRuntime; @@ -110,6 +111,49 @@ public class SequenceIT extends BaseClientManagedTimeIT { } } + @Test + public void testCreateSequenceWhenNamespaceEnabled() throws Exception { + Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); + props.setProperty(QueryServices.IS_NAMESPACE_MAPPING_ENABLED, Boolean.toString(true)); + String sequenceSchemaName = "ALPHA"; + String sequenceName = sequenceSchemaName + ".M_OMEGA"; + + nextConnection(props); + try { + conn.createStatement().execute("CREATE SEQUENCE " + sequenceName + " START WITH 2 INCREMENT BY 4"); + fail(); + } catch (SchemaNotFoundException e) { + // expected + } + + conn.createStatement().execute("CREATE SCHEMA " + sequenceSchemaName); + nextConnection(props); + conn.createStatement().execute("CREATE SEQUENCE " + sequenceName + " START WITH 2 INCREMENT BY 4"); + sequenceSchemaName = "TEST_SEQ_SCHEMA"; + sequenceName = "M_SEQ"; + conn.createStatement().execute("CREATE SCHEMA " + sequenceSchemaName); + nextConnection(props); + conn.createStatement().execute("USE " + sequenceSchemaName); + conn.createStatement().execute("CREATE SEQUENCE " + sequenceName + " START WITH 2 INCREMENT BY 4"); + nextConnection(props); + String query = "SELECT sequence_schema, sequence_name, current_value, increment_by FROM SYSTEM.\"SEQUENCE\" WHERE sequence_name='" + + sequenceName + "'"; + ResultSet rs = conn.prepareStatement(query).executeQuery(); + assertTrue(rs.next()); + assertEquals(sequenceSchemaName, rs.getString("sequence_schema")); + assertEquals(sequenceName, rs.getString("sequence_name")); + assertEquals(2, rs.getInt("current_value")); + assertEquals(4, rs.getInt("increment_by")); + assertFalse(rs.next()); + try { + conn.createStatement().execute( + "CREATE SEQUENCE " + sequenceSchemaName + "." + sequenceName + " START WITH 2 INCREMENT BY 4"); + fail(); + } catch (SequenceAlreadyExistsException e) { + + } + } + @Test public void testCreateSequence() throws Exception { nextConnection(); @@ -696,15 +740,19 @@ public class SequenceIT extends BaseClientManagedTimeIT { assertTrue(rs.next()); assertEquals(4, rs.getInt(1)); } - - // if nextConnection() is not used to get to get a connection, make sure you call .close() so that connections are not leaked - private void nextConnection() throws Exception { + + private void nextConnection(Properties props) throws Exception { if (conn != null) conn.close(); long ts = nextTimestamp(); - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts)); conn = DriverManager.getConnection(getUrl(), props); - } + } + + // if nextConnection() is not used to get to get a connection, make sure you call .close() so that connections are + // not leaked + private void nextConnection() throws Exception { + nextConnection(PropertiesUtil.deepCopy(TEST_PROPERTIES)); + } @Test public void testSequenceDefault() throws Exception { http://git-wip-us.apache.org/repos/asf/phoenix/blob/45e4af51/phoenix-core/src/it/java/org/apache/phoenix/end2end/TenantSpecificViewIndexIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/TenantSpecificViewIndexIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/TenantSpecificViewIndexIT.java index fc9489d..84c2508 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/TenantSpecificViewIndexIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/TenantSpecificViewIndexIT.java @@ -26,11 +26,19 @@ 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 org.apache.hadoop.hbase.util.Bytes; +import org.apache.phoenix.jdbc.PhoenixConnection; +import org.apache.phoenix.jdbc.PhoenixDatabaseMetaData; +import org.apache.phoenix.query.QueryServices; import org.apache.phoenix.schema.ColumnNotFoundException; +import org.apache.phoenix.schema.PTableType; +import org.apache.phoenix.util.MetaDataUtil; import org.apache.phoenix.util.PhoenixRuntime; import org.apache.phoenix.util.QueryUtil; +import org.apache.phoenix.util.SchemaUtil; import org.junit.Test; @@ -63,98 +71,179 @@ public class TenantSpecificViewIndexIT extends BaseTenantSpecificViewIndexIT { @Test public void testMultiCFViewIndex() throws Exception { - testMultiCFViewIndex(false); + testMultiCFViewIndex(false, false); + } + + @Test + public void testMultiCFViewIndexWithNamespaceMapping() throws Exception { + testMultiCFViewIndex(false, true); } @Test public void testMultiCFViewLocalIndex() throws Exception { - testMultiCFViewIndex(true); + testMultiCFViewIndex(true, false); } - - private void testMultiCFViewIndex(boolean localIndex) throws Exception { - Connection conn = DriverManager.getConnection(getUrl()); - String ddl = "CREATE TABLE MT_BASE (PK1 VARCHAR not null, PK2 VARCHAR not null, " - + "MYCF1.COL1 varchar,MYCF2.COL2 varchar " - + "CONSTRAINT pk PRIMARY KEY(PK1,PK2)) MULTI_TENANT=true"; + + private void createTableAndValidate(String tableName, boolean isNamespaceEnabled) throws Exception { + Properties props = new Properties(); + if (isNamespaceEnabled) { + props.setProperty(QueryServices.IS_NAMESPACE_MAPPING_ENABLED, Boolean.toString(true)); + } + Connection conn = DriverManager.getConnection(getUrl(), props); + if (isNamespaceEnabled) { + conn.createStatement().execute("CREATE SCHEMA " + SchemaUtil.getSchemaNameFromFullName(tableName)); + } + String ddl = "CREATE TABLE " + tableName + " (PK1 VARCHAR not null, PK2 VARCHAR not null, " + + "MYCF1.COL1 varchar,MYCF2.COL2 varchar " + "CONSTRAINT pk PRIMARY KEY(PK1,PK2)) MULTI_TENANT=true"; conn.createStatement().execute(ddl); - conn.createStatement().execute("UPSERT INTO MT_BASE values ('a','b','c','d')"); + + conn.createStatement().execute("UPSERT INTO " + tableName + " values ('a','b','c','d')"); conn.commit(); - - ResultSet rs = conn.createStatement().executeQuery("select * from mt_base where (pk1,pk2) IN (('a','b'),('b','b'))"); + + ResultSet rs = conn.createStatement() + .executeQuery("select * from " + tableName + " where (pk1,pk2) IN (('a','b'),('b','b'))"); assertTrue(rs.next()); - assertEquals("a",rs.getString(1)); - assertEquals("b",rs.getString(2)); + assertEquals("a", rs.getString(1)); + assertEquals("b", rs.getString(2)); assertFalse(rs.next()); - conn.close(); - String tenantId = "a"; + } + + private void testMultiCFViewIndex(boolean localIndex, boolean isNamespaceEnabled) throws Exception { + String tableName = "A.MT_BASE"; + String baseViewName = "acme"; + createTableAndValidate(tableName, isNamespaceEnabled); + createViewAndIndexesWithTenantId(tableName, baseViewName, localIndex, "b", isNamespaceEnabled); + createViewAndIndexesWithTenantId(tableName, baseViewName, localIndex, "a", isNamespaceEnabled); + validateSequence(tableName, isNamespaceEnabled, "-32767,-32767"); Properties props = new Properties(); - props.setProperty(PhoenixRuntime.TENANT_ID_ATTRIB, tenantId); - conn = DriverManager.getConnection(getUrl(),props); - conn.createStatement().execute("CREATE VIEW acme AS SELECT * FROM MT_BASE"); - rs = conn.createStatement().executeQuery("select * from acme"); - assertTrue(rs.next()); - assertEquals("b",rs.getString(1)); - assertEquals("c",rs.getString(2)); - assertEquals("d",rs.getString(3)); + props.setProperty(PhoenixRuntime.TENANT_ID_ATTRIB, "a"); + try (Connection conn = DriverManager.getConnection(getUrl(), props)) { + conn.createStatement().execute("DROP VIEW " + baseViewName + "_a"); + } + props.setProperty(PhoenixRuntime.TENANT_ID_ATTRIB, "b"); + try (Connection conn = DriverManager.getConnection(getUrl(), props)) { + conn.createStatement().execute("DROP VIEW " + baseViewName + "_b"); + } + DriverManager.getConnection(getUrl()).createStatement().execute("DROP TABLE " + tableName + " CASCADE"); + validateSequence(tableName, isNamespaceEnabled, null); + } + + private void validateSequence(String tableName, boolean isNamespaceEnabled, String expectedResult) + throws SQLException { + PhoenixConnection phxConn = DriverManager.getConnection(getUrl()).unwrap(PhoenixConnection.class); + ResultSet rs = phxConn.createStatement().executeQuery("SELECT " + PhoenixDatabaseMetaData.CURRENT_VALUE + + " FROM " + PhoenixDatabaseMetaData.SYSTEM_SEQUENCE); + if (expectedResult != null) { + String[] splits = expectedResult.split(","); + for (String seq : splits) { + assertTrue(rs.next()); + assertEquals(seq, rs.getString(1)); + } + } else { + assertFalse(rs.next()); + } + phxConn.close(); + } + + private void createViewAndIndexesWithTenantId(String tableName,String baseViewName, boolean localIndex, String tenantId, + boolean isNamespaceMapped) throws Exception { + Properties props = new Properties(); + String viewName = baseViewName + "_" + tenantId; + String indexName = "idx_" + viewName; + if (tenantId != null) { + props.setProperty(PhoenixRuntime.TENANT_ID_ATTRIB, tenantId); + } + Connection conn = DriverManager.getConnection(getUrl(), props); + conn.createStatement().execute("CREATE VIEW " + viewName + " AS SELECT * FROM " + tableName); + ResultSet rs = conn.createStatement().executeQuery("select * from " + viewName); + + int i = 1; + if ("a".equals(tenantId)) { + assertTrue(rs.next()); + assertEquals("b", rs.getString(i++)); + assertEquals("c", rs.getString(i++)); + assertEquals("d", rs.getString(i++)); + } assertFalse(rs.next()); - conn.createStatement().execute("UPSERT INTO acme VALUES ('e','f','g')"); + conn.createStatement().execute("UPSERT INTO " + viewName + " VALUES ('e','f','g')"); conn.commit(); - if(localIndex){ - conn.createStatement().execute("create local index idx_acme on acme (COL1)"); + if (localIndex) { + conn.createStatement().execute("create local index " + indexName + " on " + viewName + " (COL1)"); } else { - conn.createStatement().execute("create index idx_acme on acme (COL1)"); + conn.createStatement().execute("create index " + indexName + " on " + viewName + " (COL1)"); + } + rs = conn.createStatement().executeQuery("select * from " + viewName); + i = 1; + if ("a".equals(tenantId)) { + assertTrue(rs.next()); + assertEquals("b", rs.getString(i++)); + assertEquals("c", rs.getString(i++)); + assertEquals("d", rs.getString(i++)); } - rs = conn.createStatement().executeQuery("select * from acme"); - assertTrue(rs.next()); - assertEquals("b",rs.getString(1)); - assertEquals("c",rs.getString(2)); - assertEquals("d",rs.getString(3)); assertTrue(rs.next()); - assertEquals("e",rs.getString(1)); - assertEquals("f",rs.getString(2)); - assertEquals("g",rs.getString(3)); + assertEquals("e", rs.getString(1)); + assertEquals("f", rs.getString(2)); + assertEquals("g", rs.getString(3)); assertFalse(rs.next()); - rs = conn.createStatement().executeQuery("explain select * from acme"); - assertEquals("CLIENT PARALLEL 1-WAY RANGE SCAN OVER MT_BASE ['a']",QueryUtil.getExplainPlan(rs)); + rs = conn.createStatement().executeQuery("explain select * from " + viewName); + assertEquals("CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + + SchemaUtil.getPhysicalHBaseTableName(tableName, isNamespaceMapped, PTableType.TABLE) + " ['" + + tenantId + "']", QueryUtil.getExplainPlan(rs)); - rs = conn.createStatement().executeQuery("select pk2,col1 from acme where col1='f'"); + rs = conn.createStatement().executeQuery("select pk2,col1 from " + viewName + " where col1='f'"); assertTrue(rs.next()); - assertEquals("e",rs.getString(1)); - assertEquals("f",rs.getString(2)); + assertEquals("e", rs.getString(1)); + assertEquals("f", rs.getString(2)); assertFalse(rs.next()); - rs = conn.createStatement().executeQuery("explain select pk2,col1 from acme where col1='f'"); - if(localIndex){ - assertEquals("CLIENT PARALLEL 1-WAY RANGE SCAN OVER _LOCAL_IDX_MT_BASE ['a',-32768,'f']\n" - + " SERVER FILTER BY FIRST KEY ONLY\n" - + "CLIENT MERGE SORT",QueryUtil.getExplainPlan(rs)); + rs = conn.createStatement().executeQuery("explain select pk2,col1 from " + viewName + " where col1='f'"); + if (localIndex) { + assertEquals("CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + + Bytes.toString(MetaDataUtil.getLocalIndexPhysicalName(SchemaUtil.getPhysicalHBaseTableName(tableName, isNamespaceMapped, PTableType.TABLE).getBytes())) + " ['" + + tenantId + "',-32768,'f']\n" + " SERVER FILTER BY FIRST KEY ONLY\n" + "CLIENT MERGE SORT", + QueryUtil.getExplainPlan(rs)); } else { - assertEquals("CLIENT PARALLEL 1-WAY RANGE SCAN OVER _IDX_MT_BASE ['a',-32768,'f']\n" - + " SERVER FILTER BY FIRST KEY ONLY",QueryUtil.getExplainPlan(rs)); + assertEquals("CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + + Bytes.toString(MetaDataUtil.getViewIndexPhysicalName(SchemaUtil + .getPhysicalHBaseTableName(tableName, isNamespaceMapped, PTableType.TABLE).getBytes())) + + " ['" + tenantId + "',-32768,'f']\n" + " SERVER FILTER BY FIRST KEY ONLY", + QueryUtil.getExplainPlan(rs)); } - + try { // Cannot reference tenant_id column in tenant specific connection - conn.createStatement().executeQuery("select * from mt_base where (pk1,pk2) IN (('a','b'),('b','b'))"); - fail(); + conn.createStatement() + .executeQuery("select * from " + tableName + " where (pk1,pk2) IN (('a','b'),('b','b'))"); + if (tenantId != null) { + fail(); + } } catch (ColumnNotFoundException e) { + if (tenantId == null) { + fail(); + } } - + // This is ok, though - rs = conn.createStatement().executeQuery("select * from mt_base where pk2 IN ('b','e')"); - assertTrue(rs.next()); - assertEquals("b",rs.getString(1)); + rs = conn.createStatement().executeQuery("select * from " + tableName + " where pk2 IN ('b','e')"); + if ("a".equals(tenantId)) { + assertTrue(rs.next()); + assertEquals("b", rs.getString(1)); + } assertTrue(rs.next()); - assertEquals("e",rs.getString(1)); + assertEquals("e", rs.getString(1)); assertFalse(rs.next()); - - rs = conn.createStatement().executeQuery("select * from acme where pk2 IN ('b','e')"); - assertTrue(rs.next()); - assertEquals("b",rs.getString(1)); + + rs = conn.createStatement().executeQuery("select * from " + viewName + " where pk2 IN ('b','e')"); + if ("a".equals(tenantId)) { + assertTrue(rs.next()); + assertEquals("b", rs.getString(1)); + } assertTrue(rs.next()); - assertEquals("e",rs.getString(1)); + assertEquals("e", rs.getString(1)); assertFalse(rs.next()); - + + conn.close(); + } @Test http://git-wip-us.apache.org/repos/asf/phoenix/blob/45e4af51/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 37d285f..f77f0f3 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 @@ -45,6 +45,8 @@ 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.PName; +import org.apache.phoenix.schema.PNameFactory; import org.apache.phoenix.util.MetaDataUtil; import org.apache.phoenix.util.PhoenixRuntime; import org.apache.phoenix.util.SchemaUtil; @@ -130,6 +132,7 @@ public class UpgradeIT extends BaseHBaseManagedTimeIT { String localIndexName = "LIDX"; String[] tableNames = new String[] { phoenixFullTableName, schemaName + "." + indexName, schemaName + "." + localIndexName, "diff.v", "test.v","v"}; + String[] viewIndexes = new String[] { "diff.v_idx", "test.v_idx" }; conn.createStatement().execute("CREATE TABLE " + phoenixFullTableName + "(k VARCHAR PRIMARY KEY, v INTEGER, f INTEGER, g INTEGER NULL, h INTEGER NULL)"); PreparedStatement upsertStmt = conn @@ -164,6 +167,15 @@ public class UpgradeIT extends BaseHBaseManagedTimeIT { } } + // validate view Index data + for (String viewIndex : viewIndexes) { + ResultSet rs = conn.createStatement().executeQuery("select * from " + viewIndex); + for (String str : strings) { + assertTrue(rs.next()); + assertEquals(str, rs.getString(2)); + } + } + HBaseAdmin admin = conn.unwrap(PhoenixConnection.class).getQueryServices().getAdmin(); assertTrue(admin.tableExists(phoenixFullTableName)); assertTrue(admin.tableExists(MetaDataUtil.getLocalIndexPhysicalName(Bytes.toBytes(phoenixFullTableName)))); @@ -179,7 +191,7 @@ public class UpgradeIT extends BaseHBaseManagedTimeIT { for (String viewName : viewNames) { UpgradeUtil.upgradeTable(phxConn, viewName); } - admin = phxConn.unwrap(PhoenixConnection.class).getQueryServices().getAdmin(); + admin = phxConn.getQueryServices().getAdmin(); String hbaseTableName = SchemaUtil.getPhysicalTableName(Bytes.toBytes(phoenixFullTableName), true) .getNameAsString(); assertTrue(admin.tableExists(hbaseTableName)); @@ -195,8 +207,35 @@ public class UpgradeIT extends BaseHBaseManagedTimeIT { assertEquals(str, rs.getString(1)); } } + // validate view Index data + for (String viewIndex : viewIndexes) { + ResultSet rs = conn.createStatement().executeQuery("select * from " + viewIndex); + for (String str : strings) { + assertTrue(rs.next()); + assertEquals(str, rs.getString(2)); + } + } + PName tenantId = phxConn.getTenantId(); + PName physicalName = PNameFactory.newName(hbaseTableName); + String oldSchemaName = MetaDataUtil.getViewIndexSequenceSchemaName(PNameFactory.newName(phoenixFullTableName), + false); + String newSchemaName = MetaDataUtil.getViewIndexSequenceSchemaName(physicalName, true); + String newSequenceName = MetaDataUtil.getViewIndexSequenceName(physicalName, tenantId, true); + ResultSet rs = phxConn.createStatement() + .executeQuery("SELECT " + PhoenixDatabaseMetaData.CURRENT_VALUE + " FROM " + + PhoenixDatabaseMetaData.SYSTEM_SEQUENCE + " WHERE " + PhoenixDatabaseMetaData.TENANT_ID + + " IS NULL AND " + PhoenixDatabaseMetaData.SEQUENCE_SCHEMA + " = '" + newSchemaName + + "' AND " + PhoenixDatabaseMetaData.SEQUENCE_NAME + "='" + newSequenceName + "'"); + assertTrue(rs.next()); + assertEquals("-32765", rs.getString(1)); + rs = phxConn.createStatement().executeQuery("SELECT " + PhoenixDatabaseMetaData.SEQUENCE_SCHEMA + "," + + PhoenixDatabaseMetaData.SEQUENCE_SCHEMA + "," + PhoenixDatabaseMetaData.CURRENT_VALUE + " FROM " + + PhoenixDatabaseMetaData.SYSTEM_SEQUENCE + " WHERE " + PhoenixDatabaseMetaData.TENANT_ID + + " IS NULL AND " + PhoenixDatabaseMetaData.SEQUENCE_SCHEMA + " = '" + oldSchemaName + "'"); + assertFalse(rs.next()); phxConn.close(); admin.close(); + } } http://git-wip-us.apache.org/repos/asf/phoenix/blob/45e4af51/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/ViewIndexIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/ViewIndexIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/ViewIndexIT.java index 450cffa..c139a0c 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/ViewIndexIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/ViewIndexIT.java @@ -37,6 +37,7 @@ import org.apache.phoenix.end2end.BaseHBaseManagedTimeIT; import org.apache.phoenix.end2end.Shadower; import org.apache.phoenix.jdbc.PhoenixDatabaseMetaData; import org.apache.phoenix.query.QueryServices; +import org.apache.phoenix.schema.PNameFactory; import org.apache.phoenix.util.MetaDataUtil; import org.apache.phoenix.util.QueryUtil; import org.apache.phoenix.util.ReadOnlyProps; @@ -116,21 +117,32 @@ public class ViewIndexIT extends BaseHBaseManagedTimeIT { this.viewIndexPhysicalTableName = MetaDataUtil.getLocalIndexTableName(physicalTableName.getNameAsString()); } - @Test public void testDeleteViewIndexSequences() throws Exception { createBaseTable(tableName, false, null, null); Connection conn1 = getConnection(); Connection conn2 = getConnection(); - conn1.createStatement().execute("CREATE VIEW " + VIEW_NAME + " AS SELECT * FROM " + tableName); - conn1.createStatement().execute("CREATE INDEX " + indexName + " ON " + VIEW_NAME + " (v1)"); + String viewName = schemaName + "." + VIEW_NAME; + conn1.createStatement().execute("CREATE VIEW " + viewName + " AS SELECT * FROM " + tableName); + conn1.createStatement().execute("CREATE INDEX " + indexName + " ON " + viewName + " (v1)"); conn2.createStatement().executeQuery("SELECT * FROM " + tableName).next(); + String query = "SELECT sequence_schema, sequence_name, current_value, increment_by FROM SYSTEM.\"SEQUENCE\" WHERE sequence_schema like '%" + + schemaName + "%'"; + ResultSet rs = conn1.prepareStatement(query).executeQuery(); + assertTrue(rs.next()); + assertEquals(MetaDataUtil.getViewIndexSequenceSchemaName(PNameFactory.newName(tableName), isNamespaceMapped), + rs.getString("sequence_schema")); + assertEquals(MetaDataUtil.getViewIndexSequenceName(PNameFactory.newName(tableName), null, isNamespaceMapped), + rs.getString("sequence_name")); + assertEquals(-32767, rs.getInt("current_value")); + assertEquals(1, rs.getInt("increment_by")); + assertFalse(rs.next()); HBaseAdmin admin = driver.getConnectionQueryServices(getUrl(), TestUtil.TEST_PROPERTIES).getAdmin(); - conn1.createStatement().execute("DROP VIEW " + VIEW_NAME); + conn1.createStatement().execute("DROP VIEW " + viewName); conn1.createStatement().execute("DROP TABLE "+ tableName); admin = driver.getConnectionQueryServices(getUrl(), TestUtil.TEST_PROPERTIES).getAdmin(); assertFalse("View index table should be deleted.", admin.tableExists(TableName.valueOf(viewIndexPhysicalTableName))); - ResultSet rs = conn2.createStatement().executeQuery("SELECT " + rs = conn2.createStatement().executeQuery("SELECT " + PhoenixDatabaseMetaData.SEQUENCE_SCHEMA + "," + PhoenixDatabaseMetaData.SEQUENCE_NAME + " FROM " + PhoenixDatabaseMetaData.SYSTEM_SEQUENCE); http://git-wip-us.apache.org/repos/asf/phoenix/blob/45e4af51/phoenix-core/src/main/java/org/apache/phoenix/compile/FromCompiler.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/FromCompiler.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/FromCompiler.java index ddf9c0c..46e7d14 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/compile/FromCompiler.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/FromCompiler.java @@ -222,6 +222,10 @@ public class FromCompiler { return new SchemaResolver(connection, SchemaUtil.normalizeIdentifier(statement.getSchemaName()), true); } + public static ColumnResolver getResolverForSchema(String schema, PhoenixConnection connection) throws SQLException { + return new SchemaResolver(connection, SchemaUtil.normalizeIdentifier(schema), true); + } + public static ColumnResolver getResolver(NamedTableNode tableNode, PhoenixConnection connection) throws SQLException { SingleTableColumnResolver visitor = new SingleTableColumnResolver(connection, tableNode, true); return visitor; http://git-wip-us.apache.org/repos/asf/phoenix/blob/45e4af51/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServices.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServices.java b/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServices.java index 408b144..6ed0b74 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServices.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServices.java @@ -43,7 +43,6 @@ import org.apache.phoenix.schema.Sequence; import org.apache.phoenix.schema.SequenceAllocation; import org.apache.phoenix.schema.SequenceKey; import org.apache.phoenix.schema.stats.PTableStats; - import org.apache.tephra.TransactionSystemClient; http://git-wip-us.apache.org/repos/asf/phoenix/blob/45e4af51/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServicesImpl.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServicesImpl.java b/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServicesImpl.java index 62ffeb5..fad79b8 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServicesImpl.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServicesImpl.java @@ -189,6 +189,11 @@ import org.apache.phoenix.util.ReadOnlyProps; import org.apache.phoenix.util.SchemaUtil; import org.apache.phoenix.util.ServerUtil; import org.apache.phoenix.util.UpgradeUtil; +import org.apache.tephra.TransactionSystemClient; +import org.apache.tephra.TxConstants; +import org.apache.tephra.distributed.PooledClientProvider; +import org.apache.tephra.distributed.TransactionServiceClient; +import org.apache.tephra.zookeeper.TephraZKClientService; import org.apache.twill.discovery.ZKDiscoveryService; import org.apache.twill.zookeeper.RetryStrategies; import org.apache.twill.zookeeper.ZKClientService; @@ -197,12 +202,6 @@ import org.apache.twill.zookeeper.ZKClients; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.apache.tephra.TransactionSystemClient; -import org.apache.tephra.TxConstants; -import org.apache.tephra.distributed.PooledClientProvider; -import org.apache.tephra.distributed.TransactionServiceClient; -import org.apache.tephra.zookeeper.TephraZKClientService; - import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Joiner; import com.google.common.base.Throwables; @@ -546,7 +545,7 @@ public class ConnectionQueryServicesImpl extends DelegateQueryServices implement return locations; } catch (org.apache.hadoop.hbase.TableNotFoundException e) { String fullName = Bytes.toString(tableName); - throw new TableNotFoundException(SchemaUtil.getSchemaNameFromFullName(fullName), SchemaUtil.getTableNameFromFullName(fullName)); + throw new TableNotFoundException(fullName); } catch (IOException e) { if (retryCount++ < maxRetryCount) { // One retry, in case split occurs while navigating reload = true; @@ -1472,9 +1471,10 @@ public class ConnectionQueryServicesImpl extends DelegateQueryServices implement familiesPlusDefault = Lists.newArrayList(families); familiesPlusDefault.add(new Pair<byte[],Map<String,Object>>(defaultCF,Collections.<String,Object>emptyMap())); } - ensureViewIndexTableCreated(tableName, tableProps, familiesPlusDefault, - MetaDataUtil.isSalted(m, kvBuilder, ptr) ? splits : null, MetaDataUtil.getClientTimeStamp(m), - isNamespaceMapped); + ensureViewIndexTableCreated( + SchemaUtil.getPhysicalHBaseTableName(tableName, isNamespaceMapped, tableType).getBytes(), + tableProps, familiesPlusDefault, MetaDataUtil.isSalted(m, kvBuilder, ptr) ? splits : null, + MetaDataUtil.getClientTimeStamp(m), isNamespaceMapped); } byte[] tableKey = SchemaUtil.getTableKey(tenantIdBytes, schemaBytes, tableBytes); @@ -2625,8 +2625,7 @@ public class ConnectionQueryServicesImpl extends DelegateQueryServices implement if (tableNames.contains(PhoenixDatabaseMetaData.SYSTEM_CATALOG_NAME)) { if (!admin.tableExists(mappedSystemTable)) { UpgradeUtil.mapTableToNamespace(admin, metatable, - PhoenixDatabaseMetaData.SYSTEM_CATALOG_NAME, props, - MetaDataProtocol.MIN_SYSTEM_TABLE_TIMESTAMP_4_1_0, PTableType.SYSTEM); + PhoenixDatabaseMetaData.SYSTEM_CATALOG_NAME, props, null, PTableType.SYSTEM); ConnectionQueryServicesImpl.this.removeTable(null, PhoenixDatabaseMetaData.SYSTEM_CATALOG_NAME, null, MetaDataProtocol.MIN_SYSTEM_TABLE_TIMESTAMP_4_1_0); @@ -2634,8 +2633,7 @@ public class ConnectionQueryServicesImpl extends DelegateQueryServices implement tableNames.remove(PhoenixDatabaseMetaData.SYSTEM_CATALOG_NAME); } for (String table : tableNames) { - UpgradeUtil.mapTableToNamespace(admin, metatable, table, props, - MetaDataProtocol.MIN_SYSTEM_TABLE_TIMESTAMP_4_1_0, PTableType.SYSTEM); + UpgradeUtil.mapTableToNamespace(admin, metatable, table, props, null, PTableType.SYSTEM); ConnectionQueryServicesImpl.this.removeTable(null, table, null, MetaDataProtocol.MIN_SYSTEM_TABLE_TIMESTAMP_4_1_0); } http://git-wip-us.apache.org/repos/asf/phoenix/blob/45e4af51/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 34cedce..a1b7acc 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 @@ -211,11 +211,10 @@ import org.apache.phoenix.util.SchemaUtil; import org.apache.phoenix.util.StringUtil; import org.apache.phoenix.util.TransactionUtil; import org.apache.phoenix.util.UpgradeUtil; +import org.apache.tephra.TxConstants; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.apache.tephra.TxConstants; - import com.google.common.base.Objects; import com.google.common.collect.Iterators; import com.google.common.collect.ListMultimap; @@ -1432,7 +1431,8 @@ public class MetaDataClient { String tenantIdStr = tenantId == null ? null : connection.getTenantId().getString(); PName physicalName = dataTable.getPhysicalName(); int nSequenceSaltBuckets = connection.getQueryServices().getSequenceSaltBuckets(); - SequenceKey key = MetaDataUtil.getViewIndexSequenceKey(tenantIdStr, physicalName, nSequenceSaltBuckets); + SequenceKey key = MetaDataUtil.getViewIndexSequenceKey(tenantIdStr, physicalName, + nSequenceSaltBuckets, dataTable.isNamespaceMapped()); // if scn is set create at scn-1, so we can see the sequence or else use latest timestamp (so that latest server time is used) long sequenceTimestamp = scn!=null ? scn-1 : HConstants.LATEST_TIMESTAMP; createSequence(key.getTenantId(), key.getSchemaName(), key.getSequenceName(), @@ -1511,7 +1511,16 @@ public class MetaDataClient { long timestamp = scn == null ? HConstants.LATEST_TIMESTAMP : scn; String tenantId = connection.getTenantId() == null ? null : connection.getTenantId().getString(); - return createSequence(tenantId, statement.getSequenceName().getSchemaName(), statement + String schemaName=statement.getSequenceName().getSchemaName(); + if (SchemaUtil.isNamespaceMappingEnabled(null, connection.getQueryServices().getProps())) { + if (schemaName == null || schemaName.equals(StringUtil.EMPTY_STRING)) { + schemaName = connection.getSchema(); + } + if (schemaName != null) { + FromCompiler.getResolverForSchema(schemaName, connection); + } + } + return createSequence(tenantId, schemaName, statement .getSequenceName().getTableName(), statement.ifNotExists(), startWith, incrementBy, cacheSize, statement.getCycle(), minValue, maxValue, timestamp); } @@ -2576,7 +2585,7 @@ public class MetaDataClient { if (tableType == PTableType.TABLE && (table.isMultiTenant() || hasViewIndexTable || hasLocalIndexTable)) { - MetaDataUtil.deleteViewIndexSequences(connection, table.getPhysicalName()); + MetaDataUtil.deleteViewIndexSequences(connection, table.getPhysicalName(), table.isNamespaceMapped()); if (hasViewIndexTable) { String viewIndexSchemaName = null; String viewIndexTableName = null; @@ -3113,7 +3122,7 @@ public class MetaDataClient { && Boolean.FALSE.equals(multiTenant) && MetaDataUtil.hasViewIndexTable(connection, table.getPhysicalName())) { connection.setAutoCommit(true); - MetaDataUtil.deleteViewIndexSequences(connection, table.getPhysicalName()); + MetaDataUtil.deleteViewIndexSequences(connection, table.getPhysicalName(), table.isNamespaceMapped()); // If we're not dropping metadata, then make sure no rows are left in // our view index physical table. // TODO: remove this, as the DROP INDEX commands run when the DROP VIEW http://git-wip-us.apache.org/repos/asf/phoenix/blob/45e4af51/phoenix-core/src/main/java/org/apache/phoenix/util/MetaDataUtil.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/util/MetaDataUtil.java b/phoenix-core/src/main/java/org/apache/phoenix/util/MetaDataUtil.java index 116b62b..f040bfe 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/util/MetaDataUtil.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/util/MetaDataUtil.java @@ -65,6 +65,7 @@ import org.apache.phoenix.jdbc.PhoenixDatabaseMetaData; import org.apache.phoenix.query.QueryConstants; import org.apache.phoenix.schema.PColumn; import org.apache.phoenix.schema.PName; +import org.apache.phoenix.schema.PNameFactory; import org.apache.phoenix.schema.PTable; import org.apache.phoenix.schema.PTable.LinkType; import org.apache.phoenix.schema.PTableType; @@ -388,18 +389,25 @@ public class MetaDataUtil { } } - public static String getViewIndexSchemaName(PName physicalName) { - return VIEW_INDEX_SEQUENCE_PREFIX + physicalName.getString(); + public static String getViewIndexSequenceSchemaName(PName physicalName, boolean isNamespaceMapped) { + if (!isNamespaceMapped) { return VIEW_INDEX_SEQUENCE_PREFIX + physicalName.getString(); } + return SchemaUtil.getSchemaNameFromFullName(physicalName.toString()); } - - public static SequenceKey getViewIndexSequenceKey(String tenantId, PName physicalName, int nSaltBuckets) { + + public static String getViewIndexSequenceName(PName physicalName, PName tenantId, boolean isNamespaceMapped) { + if (!isNamespaceMapped) { return VIEW_INDEX_SEQUENCE_NAME_PREFIX + (tenantId == null ? "" : tenantId); } + return SchemaUtil.getTableNameFromFullName(physicalName.toString()) + VIEW_INDEX_SEQUENCE_NAME_PREFIX; + } + + public static SequenceKey getViewIndexSequenceKey(String tenantId, PName physicalName, int nSaltBuckets, + boolean isNamespaceMapped) { // Create global sequence of the form: <prefixed base table name><tenant id> // rather than tenant-specific sequence, as it makes it much easier // to cleanup when the physical table is dropped, as we can delete // all global sequences leading with <prefix> + physical name. - String schemaName = getViewIndexSchemaName(physicalName); - String tableName = VIEW_INDEX_SEQUENCE_NAME_PREFIX + (tenantId == null ? "" : tenantId); - return new SequenceKey(null, schemaName, tableName, nSaltBuckets); + String schemaName = getViewIndexSequenceSchemaName(physicalName, isNamespaceMapped); + String tableName = getViewIndexSequenceName(physicalName, PNameFactory.newName(tenantId), isNamespaceMapped); + return new SequenceKey(isNamespaceMapped ? tenantId : null, schemaName, tableName, nSaltBuckets); } public static PDataType getViewIndexIdDataType() { @@ -439,11 +447,14 @@ public class MetaDataUtil { } } - public static void deleteViewIndexSequences(PhoenixConnection connection, PName name) throws SQLException { - String schemaName = getViewIndexSchemaName(name); - connection.createStatement().executeUpdate("DELETE FROM " + PhoenixDatabaseMetaData.SYSTEM_SEQUENCE + - " WHERE " + PhoenixDatabaseMetaData.TENANT_ID + " IS NULL AND " + - PhoenixDatabaseMetaData.SEQUENCE_SCHEMA + " = '" + schemaName + "'"); + public static void deleteViewIndexSequences(PhoenixConnection connection, PName name, boolean isNamespaceMapped) + throws SQLException { + String schemaName = getViewIndexSequenceSchemaName(name, isNamespaceMapped); + String sequenceName = getViewIndexSequenceName(name, null, isNamespaceMapped); + connection.createStatement().executeUpdate("DELETE FROM " + PhoenixDatabaseMetaData.SYSTEM_SEQUENCE + " WHERE " + + PhoenixDatabaseMetaData.SEQUENCE_SCHEMA + + (schemaName.length() > 0 ? "='" + schemaName + "'" : " IS NULL") + (isNamespaceMapped + ? " AND " + PhoenixDatabaseMetaData.SEQUENCE_NAME + " = '" + sequenceName + "'" : "")); } http://git-wip-us.apache.org/repos/asf/phoenix/blob/45e4af51/phoenix-core/src/main/java/org/apache/phoenix/util/PhoenixRuntime.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/util/PhoenixRuntime.java b/phoenix-core/src/main/java/org/apache/phoenix/util/PhoenixRuntime.java index 22ef731..5754298 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/util/PhoenixRuntime.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/util/PhoenixRuntime.java @@ -85,14 +85,13 @@ import org.apache.phoenix.schema.RowKeyValueAccessor; import org.apache.phoenix.schema.TableNotFoundException; import org.apache.phoenix.schema.ValueBitSet; import org.apache.phoenix.schema.types.PDataType; +import org.apache.tephra.util.TxUtils; import com.google.common.base.Joiner; import com.google.common.base.Splitter; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; -import org.apache.tephra.util.TxUtils; - /** * * Collection of non JDBC compliant utility methods @@ -218,9 +217,10 @@ public class PhoenixRuntime { conn = DriverManager.getConnection(jdbcUrl, props).unwrap(PhoenixConnection.class); if (execCmd.isMapNamespace()) { String srcTable = execCmd.getSrcTable(); + System.out.println("Starting upgrading table:" + srcTable + "... please don't kill it in between!!"); UpgradeUtil.upgradeTable(conn, srcTable); Set<String> viewNames = MetaDataUtil.getViewNames(conn, srcTable); - System.out.println("Views found:"+viewNames); + System.out.println("upgrading following views:"+viewNames); for (String viewName : viewNames) { UpgradeUtil.upgradeTable(conn, viewName); } http://git-wip-us.apache.org/repos/asf/phoenix/blob/45e4af51/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 b3c2bb2..d635acd 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 @@ -19,14 +19,22 @@ package org.apache.phoenix.util; import static com.google.common.base.Preconditions.checkNotNull; import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.ARRAY_SIZE; +import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.CACHE_SIZE; import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.COLUMN_FAMILY; import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.COLUMN_NAME; import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.COLUMN_SIZE; +import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.CURRENT_VALUE; +import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.CYCLE_FLAG; import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.DATA_TYPE; import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.DECIMAL_DIGITS; +import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.INCREMENT_BY; +import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.LIMIT_REACHED_FLAG; import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.LINK_TYPE; +import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.MAX_VALUE; +import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.MIN_VALUE; import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.ORDINAL_POSITION; import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.SORT_ORDER; +import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.START_WITH; import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.SYSTEM_CATALOG_NAME; import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.SYSTEM_CATALOG_SCHEMA; import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.SYSTEM_CATALOG_TABLE; @@ -478,7 +486,8 @@ public class UpgradeUtil { byte[] tableName = rowKeyMetaData[PhoenixDatabaseMetaData.TABLE_NAME_INDEX]; PName physicalName = PNameFactory.newName(unprefixedSchemaName); // Reformulate key based on correct data - newBuf = MetaDataUtil.getViewIndexSequenceKey(tableName == null ? null : Bytes.toString(tableName), physicalName, nSaltBuckets).getKey(); + newBuf = MetaDataUtil.getViewIndexSequenceKey(tableName == null ? null : Bytes.toString(tableName), + physicalName, nSaltBuckets, false).getKey(); } else { newBuf = new byte[length + 1]; System.arraycopy(buf, offset, newBuf, SaltingUtil.NUM_SALTING_BYTES, length); @@ -1336,9 +1345,22 @@ public class UpgradeUtil { } } // Update flag to represent table is mapped to namespace - logger.info(String.format("Updating meta information of phoenix table '%s' to map to namespace..", phoenixTableName)); - Put put = new Put(SchemaUtil.getTableKey(null, SchemaUtil.getSchemaNameFromFullName(phoenixTableName), - SchemaUtil.getTableNameFromFullName(phoenixTableName)), ts); + byte[] tableKey = SchemaUtil.getTableKey(null, SchemaUtil.getSchemaNameFromFullName(phoenixTableName), + SchemaUtil.getTableNameFromFullName(phoenixTableName)); + List<Cell> columnCells = metatable.get(new Get(tableKey)) + .getColumnCells(PhoenixDatabaseMetaData.TABLE_FAMILY_BYTES, QueryConstants.EMPTY_COLUMN_BYTES); + if (ts == null) { + if (!columnCells.isEmpty()) { + ts = columnCells.get(0).getTimestamp(); + } else { + throw new IllegalArgumentException( + "Timestamp passed is null and cannot derive timestamp for " + tableKey + " from meta table!!"); + } + } + // Update flag to represent table is mapped to namespace + logger.info(String.format("Updating meta information of phoenix table '%s' to map to namespace..", + phoenixTableName)); + Put put = new Put(tableKey, ts); put.add(QueryConstants.DEFAULT_COLUMN_FAMILY_BYTES, PhoenixDatabaseMetaData.IS_NAMESPACE_MAPPED_BYTES, PBoolean.INSTANCE.toBytes(Boolean.TRUE)); metatable.put(put); @@ -1443,11 +1465,14 @@ public class UpgradeUtil { if (updateLink) { logger.info(String.format("Updating link information for index '%s' ..", index.getName())); updateLink(conn, srcTableName, destTableName); + conn.commit(); } conn.getQueryServices().clearTableFromCache(ByteUtil.EMPTY_BYTE_ARRAY, index.getSchemaName().getBytes(), index.getTableName().getBytes(), PhoenixRuntime.getCurrentScn(readOnlyProps)); } + updateIndexesSequenceIfPresent(conn, table); + conn.commit(); } else { throw new RuntimeException("Error: problem occured during upgrade. Table is not upgraded successfully"); @@ -1455,6 +1480,27 @@ public class UpgradeUtil { } } + private static void updateIndexesSequenceIfPresent(PhoenixConnection connection, PTable dataTable) + throws SQLException { + PName tenantId = connection.getTenantId(); + PName physicalName = dataTable.getPhysicalName(); + PName oldPhysicalName = PNameFactory.newName( + physicalName.toString().replace(QueryConstants.NAMESPACE_SEPARATOR, QueryConstants.NAME_SEPARATOR)); + String oldSchemaName = MetaDataUtil.getViewIndexSequenceSchemaName(oldPhysicalName, false); + String newSchemaName = MetaDataUtil.getViewIndexSequenceSchemaName(physicalName, true); + String newSequenceName = MetaDataUtil.getViewIndexSequenceName(physicalName, tenantId, true); + // create new entry with new schema format + String upsert = "UPSERT INTO " + PhoenixDatabaseMetaData.SYSTEM_SEQUENCE + " SELECT " + TENANT_ID + ",\'" + + newSchemaName + "\',\'" + newSequenceName + "\'," + START_WITH + "," + CURRENT_VALUE + "," + + INCREMENT_BY + "," + CACHE_SIZE + "," + MIN_VALUE + "," + MAX_VALUE + "," + CYCLE_FLAG + "," + + LIMIT_REACHED_FLAG + " FROM " + PhoenixDatabaseMetaData.SYSTEM_SEQUENCE + " WHERE " + + PhoenixDatabaseMetaData.TENANT_ID + " IS NULL AND " + PhoenixDatabaseMetaData.SEQUENCE_SCHEMA + " = '" + + oldSchemaName + "'"; + connection.createStatement().executeUpdate(upsert); + // delete old sequence + MetaDataUtil.deleteViewIndexSequences(connection, oldPhysicalName, false); + } + private static void updateLink(PhoenixConnection conn, String srcTableName, String destTableName) throws SQLException { PreparedStatement deleteLinkStatment = conn.prepareStatement(DELETE_LINK); @@ -1463,7 +1509,6 @@ public class UpgradeUtil { updateLinkStatment.setString(1, srcTableName); deleteLinkStatment.execute(); updateLinkStatment.execute(); - conn.commit(); } } \ No newline at end of file