You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by an...@apache.org on 2016/06/10 10:31:34 UTC
[1/2] phoenix git commit: PHOENIX-2901 If namespaces are enabled,
check for existence of schema when sequence created
Repository: phoenix
Updated Branches:
refs/heads/master 865458fbf -> 49618c835
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/8eba8e2e
Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/8eba8e2e
Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/8eba8e2e
Branch: refs/heads/master
Commit: 8eba8e2e975b073ee9afed99e3d1a2da9d89a772
Parents: 865458f
Author: Ankit Singhal <an...@gmail.com>
Authored: Fri Jun 10 15:51:38 2016 +0530
Committer: Ankit Singhal <an...@gmail.com>
Committed: Fri Jun 10 15:51:38 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 | 36 ++--
.../org/apache/phoenix/util/PhoenixRuntime.java | 6 +-
.../org/apache/phoenix/util/UpgradeUtil.java | 55 ++++-
11 files changed, 367 insertions(+), 114 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/phoenix/blob/8eba8e2e/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/8eba8e2e/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 520de85..69d9140 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 MT_BASE ['a',1,'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 "
+ + SchemaUtil.getPhysicalHBaseTableName(tableName, isNamespaceMapped, PTableType.TABLE) + " ['"
+ + tenantId + "',1,'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/8eba8e2e/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 64c0d26..e6d0b66 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(schemaName + QueryConstants.NAME_SEPARATOR + indexName));
@@ -178,7 +190,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));
@@ -194,8 +206,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/8eba8e2e/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 6b980a4..7b6e476 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 = this.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/8eba8e2e/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/8eba8e2e/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/8eba8e2e/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 8592a7f..03ed549 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
@@ -187,6 +187,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;
@@ -195,12 +200,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;
@@ -545,7 +544,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;
@@ -1429,9 +1428,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);
@@ -2600,8 +2600,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);
@@ -2609,8 +2608,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/8eba8e2e/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 f52fc52..cacf687 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);
}
@@ -2584,7 +2593,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;
@@ -3119,7 +3128,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/8eba8e2e/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 b65677c..9f2f9fa 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
@@ -66,6 +66,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;
@@ -389,18 +390,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() {
@@ -459,13 +467,15 @@ public class MetaDataUtil {
return families;
}
+ 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 + "'" : ""));
- 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 + "'");
-
}
/**
http://git-wip-us.apache.org/repos/asf/phoenix/blob/8eba8e2e/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 c0fc765..8cc536b 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
@@ -215,9 +214,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/8eba8e2e/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 474cf34..5b81a6c 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;
@@ -593,7 +601,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);
@@ -1450,10 +1459,23 @@ public class UpgradeUtil {
admin.deleteSnapshot(snapshotName);
}
}
+
+ 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(SchemaUtil.getTableKey(null, SchemaUtil.getSchemaNameFromFullName(phoenixTableName),
- SchemaUtil.getTableNameFromFullName(phoenixTableName)), ts);
+ logger.info(String.format("Updating meta information of phoenix table '%s' to map to namespace..",
+ phoenixTableName));
+ Put put = new Put(tableKey, ts);
put.addColumn(QueryConstants.DEFAULT_COLUMN_FAMILY_BYTES, PhoenixDatabaseMetaData.IS_NAMESPACE_MAPPED_BYTES,
PBoolean.INSTANCE.toBytes(Boolean.TRUE));
metatable.put(put);
@@ -1558,11 +1580,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");
@@ -1570,6 +1595,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);
@@ -1578,7 +1624,6 @@ public class UpgradeUtil {
updateLinkStatment.setString(1, srcTableName);
deleteLinkStatment.execute();
updateLinkStatment.execute();
- conn.commit();
}
}
\ No newline at end of file
[2/2] phoenix git commit: PHOENIX-2915 Dropping of Index can still
leave some non-replayed writes in WAL
Posted by an...@apache.org.
PHOENIX-2915 Dropping of Index can still leave some non-replayed writes in WAL
Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo
Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/49618c83
Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/49618c83
Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/49618c83
Branch: refs/heads/master
Commit: 49618c835bf053d7e3846c809b2fba22418c4b26
Parents: 8eba8e2
Author: Ankit Singhal <an...@gmail.com>
Authored: Fri Jun 10 16:00:32 2016 +0530
Committer: Ankit Singhal <an...@gmail.com>
Committed: Fri Jun 10 16:00:32 2016 +0530
----------------------------------------------------------------------
.../query/ConnectionQueryServicesImpl.java | 58 +++++++++++++-------
1 file changed, 39 insertions(+), 19 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/phoenix/blob/49618c83/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 03ed549..56bd50c 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
@@ -1488,7 +1488,8 @@ public class ConnectionQueryServicesImpl extends DelegateQueryServices implement
}
@Override
- public MetaDataMutationResult dropTable(final List<Mutation> tableMetaData, final PTableType tableType, final boolean cascade) throws SQLException {
+ public MetaDataMutationResult dropTable(final List<Mutation> tableMetaData, final PTableType tableType,
+ final boolean cascade) throws SQLException {
byte[][] rowKeyMetadata = new byte[3][];
SchemaUtil.getVarChars(tableMetaData.get(0).getRow(), rowKeyMetadata);
byte[] tenantIdBytes = rowKeyMetadata[PhoenixDatabaseMetaData.TENANT_ID_INDEX];
@@ -1523,19 +1524,15 @@ public class ConnectionQueryServicesImpl extends DelegateQueryServices implement
case TABLE_ALREADY_EXISTS:
ReadOnlyProps props = this.getProps();
boolean dropMetadata = props.getBoolean(DROP_METADATA_ATTRIB, DEFAULT_DROP_METADATA);
+ PTable table = result.getTable();
if (dropMetadata) {
+ flushParentPhysicalTable(table);
dropTables(result.getTableNamesToDelete());
}
invalidateTables(result.getTableNamesToDelete());
long timestamp = MetaDataUtil.getClientTimeStamp(tableMetaData);
if (tableType == PTableType.TABLE) {
- boolean isNamespaceMapped = result.getTable().isNamespaceMapped();
- byte[] physicalName;
- if (!isNamespaceMapped) {
- physicalName = SchemaUtil.getTableNameAsBytes(schemaBytes, tableBytes);
- } else {
- physicalName = TableName.valueOf(schemaBytes, tableBytes).getName();
- }
+ byte[] physicalName = table.getPhysicalName().getBytes();
ensureViewIndexTableDropped(physicalName, timestamp);
ensureLocalIndexTableDropped(physicalName, timestamp);
tableStatsCache.invalidate(new ImmutableBytesPtr(physicalName));
@@ -1547,6 +1544,25 @@ public class ConnectionQueryServicesImpl extends DelegateQueryServices implement
return result;
}
+ /*
+ * PHOENIX-2915 while dropping index, flush data table to avoid stale WAL edits of indexes 1. Flush parent table if
+ * dropping view has indexes 2. Dropping table indexes 3. Dropping view indexes
+ */
+ private void flushParentPhysicalTable(PTable table) throws SQLException {
+ byte[] parentPhysicalTableName = null;
+ if (PTableType.VIEW == table.getType()) {
+ if (!table.getIndexes().isEmpty()) {
+ parentPhysicalTableName = table.getPhysicalName().getBytes();
+ }
+ } else if (PTableType.INDEX == table.getType()) {
+ PTable parentTable = getTable(null, table.getParentName().getString(), HConstants.LATEST_TIMESTAMP);
+ parentPhysicalTableName = parentTable.getPhysicalName().getBytes();
+ }
+ if (parentPhysicalTableName != null) {
+ flushTable(parentPhysicalTableName);
+ }
+ }
+
@Override
public MetaDataMutationResult dropFunction(final List<Mutation> functionData, final boolean ifExists) throws SQLException {
byte[][] rowKeyMetadata = new byte[2][];
@@ -1623,31 +1639,35 @@ public class ConnectionQueryServicesImpl extends DelegateQueryServices implement
private void ensureViewIndexTableCreated(PName tenantId, byte[] physicalIndexTableName, long timestamp,
boolean isNamespaceMapped) throws SQLException {
- PTable table;
String name = Bytes
.toString(SchemaUtil.getParentTableNameFromIndexTable(physicalIndexTableName,
MetaDataUtil.VIEW_INDEX_TABLE_PREFIX))
.replace(QueryConstants.NAMESPACE_SEPARATOR, QueryConstants.NAME_SEPARATOR);
-
+ PTable table = getTable(tenantId, name, timestamp);
+ ensureViewIndexTableCreated(table, timestamp, isNamespaceMapped);
+ }
+
+ private PTable getTable(PName tenantId, String fullTableName, long timestamp) throws SQLException {
+ PTable table;
try {
PMetaData metadata = latestMetaData;
if (metadata == null) {
throwConnectionClosedException();
}
- table = metadata.getTableRef(new PTableKey(tenantId, name)).getTable();
- if (table.getTimeStamp() >= timestamp) { // Table in cache is newer than client timestamp which shouldn't be the case
+ table = metadata.getTableRef(new PTableKey(tenantId, fullTableName)).getTable();
+ if (table.getTimeStamp() >= timestamp) { // Table in cache is newer than client timestamp which shouldn't be
+ // the case
throw new TableNotFoundException(table.getSchemaName().getString(), table.getTableName().getString());
}
} catch (TableNotFoundException e) {
- byte[] schemaName = Bytes.toBytes(SchemaUtil.getSchemaNameFromFullName(name));
- byte[] tableName = Bytes.toBytes(SchemaUtil.getTableNameFromFullName(name));
- MetaDataMutationResult result = this.getTable(null, schemaName, tableName, HConstants.LATEST_TIMESTAMP, timestamp);
+ byte[] schemaName = Bytes.toBytes(SchemaUtil.getSchemaNameFromFullName(fullTableName));
+ byte[] tableName = Bytes.toBytes(SchemaUtil.getTableNameFromFullName(fullTableName));
+ MetaDataMutationResult result = this.getTable(null, schemaName, tableName, HConstants.LATEST_TIMESTAMP,
+ timestamp);
table = result.getTable();
- if (table == null) {
- throw e;
- }
+ if (table == null) { throw e; }
}
- ensureViewIndexTableCreated(table, timestamp, isNamespaceMapped);
+ return table;
}
private void ensureViewIndexTableCreated(PTable table, long timestamp, boolean isNamespaceMapped)