PHOENIX-4250 Breakup AlterTableIT into several integration tests so as not to create too many tables in one test
Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/eafb58be Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/eafb58be Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/eafb58be Branch: refs/heads/master Commit: eafb58bec2e35e0a999e40b2831b504c05295328 Parents: 3593ec8 Author: James Taylor <[email protected]> Authored: Thu Sep 28 17:46:27 2017 -0700 Committer: James Taylor <[email protected]> Committed: Thu Sep 28 18:23:44 2017 -0700 ---------------------------------------------------------------------- .../apache/phoenix/end2end/AlterTableIT.java | 1231 ------------------ .../apache/phoenix/end2end/SetPropertyIT.java | 1022 +++++++++++++++ .../end2end/SetPropertyOnEncodedTableIT.java | 34 + .../end2end/SetPropertyOnNonEncodedTableIT.java | 34 + .../index/IndexWithTableSchemaChangeIT.java | 318 +++++ 5 files changed, 1408 insertions(+), 1231 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/eafb58be/phoenix-core/src/it/java/org/apache/phoenix/end2end/AlterTableIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/AlterTableIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/AlterTableIT.java index d3a9c45..5265b09 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/AlterTableIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/AlterTableIT.java @@ -17,7 +17,6 @@ */ package org.apache.phoenix.end2end; -import static org.apache.hadoop.hbase.HColumnDescriptor.DEFAULT_REPLICATION_SCOPE; 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_QUALIFIER; @@ -37,7 +36,6 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; -import java.math.BigDecimal; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; @@ -50,12 +48,7 @@ import java.util.Properties; import org.apache.hadoop.hbase.HColumnDescriptor; import org.apache.hadoop.hbase.HTableDescriptor; -import org.apache.hadoop.hbase.KeepDeletedCells; import org.apache.hadoop.hbase.client.HBaseAdmin; -import org.apache.hadoop.hbase.client.HTable; -import org.apache.hadoop.hbase.client.Result; -import org.apache.hadoop.hbase.client.ResultScanner; -import org.apache.hadoop.hbase.client.Scan; import org.apache.hadoop.hbase.util.Bytes; import org.apache.phoenix.exception.SQLExceptionCode; import org.apache.phoenix.jdbc.PhoenixConnection; @@ -93,11 +86,8 @@ public class AlterTableIT extends ParallelStatsDisabledIT { private String schemaName; private String dataTableName; private String indexTableName; - private String localIndexTableName; - private String viewName; private String dataTableFullName; private String indexTableFullName; - private String localIndexTableFullName; private String tableDDLOptions; private final boolean columnEncoded; @@ -116,11 +106,8 @@ public class AlterTableIT extends ParallelStatsDisabledIT { schemaName = ""; dataTableName = generateUniqueName(); indexTableName = "I_" + generateUniqueName(); - localIndexTableName = "LI_" + generateUniqueName(); dataTableFullName = SchemaUtil.getTableName(schemaName, dataTableName); indexTableFullName = SchemaUtil.getTableName(schemaName, indexTableName); - localIndexTableFullName = SchemaUtil.getTableName(schemaName, localIndexTableName); - viewName = generateUniqueName(); } @Test @@ -257,22 +244,6 @@ public class AlterTableIT extends ParallelStatsDisabledIT { } } - private void assertIndexExists(Connection conn, boolean exists) throws SQLException { - ResultSet rs = conn.getMetaData().getIndexInfo(null, schemaName, dataTableName, false, false); - assertEquals(exists, rs.next()); - } - - - @Test - public void testDropIndexedColumnImmutableIndex() throws Exception { - helpTestDropIndexedColumn(true); - } - - @Test - public void testDropIndexedColumnMutableIndex() throws Exception { - helpTestDropIndexedColumn(false); - } - private String generateDDLOptions(String options) { StringBuilder sb = new StringBuilder(); if (!options.isEmpty()) { @@ -286,270 +257,6 @@ public class AlterTableIT extends ParallelStatsDisabledIT { return sb.toString(); } - private void helpTestDropIndexedColumn(boolean immutable) throws Exception { - String query; - ResultSet rs; - PreparedStatement stmt; - - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - conn.setAutoCommit(false); - - // make sure that the tables are empty, but reachable - conn.createStatement().execute( - "CREATE TABLE " + dataTableFullName - + " (k VARCHAR NOT NULL PRIMARY KEY, v1 VARCHAR, v2 VARCHAR) " - + generateDDLOptions(immutable ? "IMMUTABLE_ROWS = true" : "") - + (!columnEncoded ? ",IMMUTABLE_STORAGE_SCHEME=" + PTable.ImmutableStorageScheme.ONE_CELL_PER_COLUMN : "")); - query = "SELECT * FROM " + dataTableFullName; - rs = conn.createStatement().executeQuery(query); - assertFalse(rs.next()); - - conn.createStatement().execute( - "CREATE INDEX " + indexTableName + " ON " + dataTableFullName + " (v1, v2)"); - conn.createStatement().execute( - "CREATE LOCAL INDEX " + localIndexTableName + " ON " + dataTableFullName + " (v1, v2)"); - - query = "SELECT * FROM " + indexTableFullName; - rs = conn.createStatement().executeQuery(query); - assertFalse(rs.next()); - - // load some data into the table - stmt = conn.prepareStatement("UPSERT INTO " + dataTableFullName + " VALUES(?,?,?)"); - stmt.setString(1, "a"); - stmt.setString(2, "x"); - stmt.setString(3, "1"); - stmt.execute(); - conn.commit(); - - assertIndexExists(conn,true); - conn.createStatement().execute("ALTER TABLE " + dataTableFullName + " DROP COLUMN v1"); - assertIndexExists(conn,false); - - query = "SELECT * FROM " + dataTableFullName; - rs = conn.createStatement().executeQuery(query); - assertTrue(rs.next()); - assertEquals("a",rs.getString(1)); - assertEquals("1",rs.getString(2)); - assertFalse(rs.next()); - - // load some data into the table - stmt = conn.prepareStatement("UPSERT INTO " + dataTableFullName + " VALUES(?,?)"); - stmt.setString(1, "a"); - stmt.setString(2, "2"); - stmt.execute(); - conn.commit(); - - query = "SELECT * FROM " + dataTableFullName; - rs = conn.createStatement().executeQuery(query); - assertTrue(rs.next()); - assertEquals("a",rs.getString(1)); - assertEquals("2",rs.getString(2)); - assertFalse(rs.next()); - } - - @Test - public void testDropCoveredColumn() throws Exception { - ResultSet rs; - PreparedStatement stmt; - - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - conn.setAutoCommit(false); - - // make sure that the tables are empty, but reachable - conn.createStatement().execute( - "CREATE TABLE " + dataTableFullName - + " (k VARCHAR NOT NULL PRIMARY KEY, v1 VARCHAR, v2 VARCHAR, v3 VARCHAR) " + tableDDLOptions); - String dataTableQuery = "SELECT * FROM " + dataTableFullName; - rs = conn.createStatement().executeQuery(dataTableQuery); - assertFalse(rs.next()); - - conn.createStatement().execute( - "CREATE INDEX " + indexTableName + " ON " + dataTableFullName + " (v1) include (v2, v3)"); - conn.createStatement().execute( - "CREATE LOCAL INDEX " + localIndexTableName + " ON " + dataTableFullName + " (v1) include (v2, v3)"); - rs = conn.createStatement().executeQuery(dataTableQuery); - assertFalse(rs.next()); - String indexTableQuery = "SELECT * FROM " + indexTableName; - rs = conn.createStatement().executeQuery(indexTableQuery); - assertFalse(rs.next()); - String localIndexTableQuery = "SELECT * FROM " + localIndexTableFullName; - rs = conn.createStatement().executeQuery(localIndexTableQuery); - assertFalse(rs.next()); - - // load some data into the table - stmt = conn.prepareStatement("UPSERT INTO " + dataTableFullName + " VALUES(?,?,?,?)"); - stmt.setString(1, "a"); - stmt.setString(2, "x"); - stmt.setString(3, "1"); - stmt.setString(4, "j"); - stmt.execute(); - conn.commit(); - - assertIndexExists(conn,true); - conn.createStatement().execute("ALTER TABLE " + dataTableFullName + " DROP COLUMN v2"); - assertIndexExists(conn,true); - - // verify data table rows - Scan scan = new Scan(); - HTable table = (HTable) conn.unwrap(PhoenixConnection.class).getQueryServices().getTable(Bytes.toBytes(dataTableFullName)); - ResultScanner results = table.getScanner(scan); - for (Result res : results) { - assertNull("Column value was not deleted",res.getValue(QueryConstants.DEFAULT_COLUMN_FAMILY_BYTES, Bytes.toBytes("V2"))); - } - results.close(); - rs = conn.createStatement().executeQuery(dataTableQuery); - assertTrue(rs.next()); - assertEquals("a",rs.getString(1)); - assertEquals("x",rs.getString(2)); - assertEquals("j",rs.getString(3)); - assertFalse(rs.next()); - - // verify index table rows - scan = new Scan(); - table = (HTable) conn.unwrap(PhoenixConnection.class).getQueryServices().getTable(Bytes.toBytes(indexTableFullName)); - results = table.getScanner(scan); - for (Result res : results) { - assertNull("Column value was not deleted",res.getValue(QueryConstants.DEFAULT_COLUMN_FAMILY_BYTES, Bytes.toBytes("0:V2"))); - } - results.close(); - rs = conn.createStatement().executeQuery(indexTableQuery); - assertTrue(rs.next()); - assertEquals("x",rs.getString(1)); - assertEquals("a",rs.getString(2)); - assertEquals("j",rs.getString(3)); - assertFalse(rs.next()); - - // verify local index table rows - rs = conn.createStatement().executeQuery(localIndexTableQuery); - assertTrue(rs.next()); - assertEquals("x",rs.getString(1)); - assertEquals("a",rs.getString(2)); - assertEquals("j",rs.getString(3)); - assertFalse(rs.next()); - - // load some data into the table - stmt = conn.prepareStatement("UPSERT INTO " + dataTableFullName + " VALUES(?,?,?)"); - stmt.setString(1, "a"); - stmt.setString(2, "y"); - stmt.setString(3, "k"); - stmt.execute(); - conn.commit(); - - // verify data table rows - rs = conn.createStatement().executeQuery(dataTableQuery); - assertTrue(rs.next()); - assertEquals("a",rs.getString(1)); - assertEquals("y",rs.getString(2)); - assertEquals("k",rs.getString(3)); - assertFalse(rs.next()); - - // verify index table rows - rs = conn.createStatement().executeQuery(indexTableQuery); - assertTrue(rs.next()); - assertEquals("y",rs.getString(1)); - assertEquals("a",rs.getString(2)); - assertEquals("k",rs.getString(3)); - assertFalse(rs.next()); - - // verify local index table rows - rs = conn.createStatement().executeQuery(localIndexTableQuery); - assertTrue(rs.next()); - assertEquals("y",rs.getString(1)); - assertEquals("a",rs.getString(2)); - assertEquals("k",rs.getString(3)); - assertFalse(rs.next()); - } - - @Test - public void testAddPKColumnToTableWithIndex() throws Exception { - String query; - ResultSet rs; - PreparedStatement stmt; - - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - conn.setAutoCommit(false); - - // make sure that the tables are empty, but reachable - conn.createStatement().execute( - "CREATE TABLE " + dataTableFullName - + " (k VARCHAR NOT NULL PRIMARY KEY, v1 VARCHAR, v2 VARCHAR) " + tableDDLOptions); - query = "SELECT * FROM " + dataTableFullName; - rs = conn.createStatement().executeQuery(query); - assertFalse(rs.next()); - - conn.createStatement().execute( - "CREATE INDEX " + indexTableName + " ON " + dataTableFullName + " (v1) include (v2)"); - query = "SELECT * FROM " + indexTableFullName; - rs = conn.createStatement().executeQuery(query); - assertFalse(rs.next()); - - // load some data into the table - stmt = conn.prepareStatement("UPSERT INTO " + dataTableFullName + " VALUES(?,?,?)"); - stmt.setString(1, "a"); - stmt.setString(2, "x"); - stmt.setString(3, "1"); - stmt.execute(); - conn.commit(); - - assertIndexExists(conn,true); - conn.createStatement().execute("ALTER TABLE " + dataTableFullName + " ADD v3 VARCHAR, k2 DECIMAL PRIMARY KEY, k3 DECIMAL PRIMARY KEY"); - rs = conn.getMetaData().getPrimaryKeys("", schemaName, dataTableName); - assertTrue(rs.next()); - assertEquals("K",rs.getString("COLUMN_NAME")); - assertEquals(1, rs.getShort("KEY_SEQ")); - assertTrue(rs.next()); - assertEquals("K2",rs.getString("COLUMN_NAME")); - assertEquals(2, rs.getShort("KEY_SEQ")); - assertTrue(rs.next()); - assertEquals("K3",rs.getString("COLUMN_NAME")); - assertEquals(3, rs.getShort("KEY_SEQ")); - assertFalse(rs.next()); - - rs = conn.getMetaData().getPrimaryKeys("", schemaName, indexTableName); - assertTrue(rs.next()); - assertEquals(QueryConstants.DEFAULT_COLUMN_FAMILY + IndexUtil.INDEX_COLUMN_NAME_SEP + "V1",rs.getString("COLUMN_NAME")); - assertEquals(1, rs.getShort("KEY_SEQ")); - assertTrue(rs.next()); - assertEquals(IndexUtil.INDEX_COLUMN_NAME_SEP + "K",rs.getString("COLUMN_NAME")); - assertEquals(2, rs.getShort("KEY_SEQ")); - assertTrue(rs.next()); - assertEquals(IndexUtil.INDEX_COLUMN_NAME_SEP + "K2",rs.getString("COLUMN_NAME")); - assertEquals(3, rs.getShort("KEY_SEQ")); - assertTrue(rs.next()); - assertEquals(IndexUtil.INDEX_COLUMN_NAME_SEP + "K3",rs.getString("COLUMN_NAME")); - assertEquals(4, rs.getShort("KEY_SEQ")); - assertFalse(rs.next()); - - query = "SELECT * FROM " + dataTableFullName; - rs = conn.createStatement().executeQuery(query); - assertTrue(rs.next()); - assertEquals("a",rs.getString(1)); - assertEquals("x",rs.getString(2)); - assertEquals("1",rs.getString(3)); - assertNull(rs.getBigDecimal(4)); - assertFalse(rs.next()); - - // load some data into the table - stmt = conn.prepareStatement("UPSERT INTO " + dataTableFullName + "(K,K2,V1,V2,K3) VALUES(?,?,?,?,?)"); - stmt.setString(1, "b"); - stmt.setBigDecimal(2, BigDecimal.valueOf(2)); - stmt.setString(3, "y"); - stmt.setString(4, "2"); - stmt.setBigDecimal(5, BigDecimal.valueOf(3)); - stmt.execute(); - conn.commit(); - - query = "SELECT k,k2,k3 FROM " + dataTableFullName + " WHERE v1='y'"; - rs = conn.createStatement().executeQuery(query); - assertTrue(rs.next()); - assertEquals("b",rs.getString(1)); - assertEquals(BigDecimal.valueOf(2),rs.getBigDecimal(2)); - assertEquals(BigDecimal.valueOf(3),rs.getBigDecimal(3)); - assertFalse(rs.next()); - } @Test public void testSetSaltedTableAsImmutable() throws Exception { @@ -1142,903 +849,6 @@ public class AlterTableIT extends ParallelStatsDisabledIT { conn1.close(); } - @Test - public void testSetHColumnProperties() throws Exception { - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - String ddl = "CREATE TABLE " + dataTableFullName + " (\n" - +"ID1 VARCHAR(15) NOT NULL,\n" - +"ID2 VARCHAR(15) NOT NULL,\n" - +"CREATED_DATE DATE,\n" - +"CREATION_TIME BIGINT,\n" - +"LAST_USED DATE,\n" - +"CONSTRAINT PK PRIMARY KEY (ID1, ID2)) " + generateDDLOptions("SALT_BUCKETS = 8"); - Connection conn1 = DriverManager.getConnection(getUrl(), props); - conn1.createStatement().execute(ddl); - ddl = "ALTER TABLE " + dataTableFullName + " SET REPLICATION_SCOPE=1"; - conn1.createStatement().execute(ddl); - try (HBaseAdmin admin = conn1.unwrap(PhoenixConnection.class).getQueryServices().getAdmin()) { - HColumnDescriptor[] columnFamilies = admin.getTableDescriptor(Bytes.toBytes(dataTableFullName)) - .getColumnFamilies(); - assertEquals(1, columnFamilies.length); - assertEquals("0", columnFamilies[0].getNameAsString()); - assertEquals(1, columnFamilies[0].getScope()); - } - } - - @Test - public void testSetHTableProperties() throws Exception { - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - String ddl = "CREATE TABLE " + dataTableFullName + " (\n" - +"ID1 VARCHAR(15) NOT NULL,\n" - +"ID2 VARCHAR(15) NOT NULL,\n" - +"CREATED_DATE DATE,\n" - +"CREATION_TIME BIGINT,\n" - +"LAST_USED DATE,\n" - +"CONSTRAINT PK PRIMARY KEY (ID1, ID2)) " + generateDDLOptions("SALT_BUCKETS = 8"); - Connection conn1 = DriverManager.getConnection(getUrl(), props); - conn1.createStatement().execute(ddl); - ddl = "ALTER TABLE " + dataTableFullName + " SET COMPACTION_ENABLED=FALSE"; - conn1.createStatement().execute(ddl); - try (HBaseAdmin admin = conn1.unwrap(PhoenixConnection.class).getQueryServices().getAdmin()) { - HTableDescriptor tableDesc = admin.getTableDescriptor(Bytes.toBytes(dataTableFullName)); - assertEquals(1, tableDesc.getColumnFamilies().length); - assertEquals("0", tableDesc.getColumnFamilies()[0].getNameAsString()); - assertEquals(Boolean.toString(false), tableDesc.getValue(HTableDescriptor.COMPACTION_ENABLED)); - } - } - - @Test - public void testSetHTableAndHColumnProperties() throws Exception { - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - String ddl = "CREATE TABLE " + dataTableFullName + " (\n" - +"ID1 VARCHAR(15) NOT NULL,\n" - +"ID2 VARCHAR(15) NOT NULL,\n" - +"CREATED_DATE DATE,\n" - +"CREATION_TIME BIGINT,\n" - +"LAST_USED DATE,\n" - +"CONSTRAINT PK PRIMARY KEY (ID1, ID2)) " + generateDDLOptions("SALT_BUCKETS = 8"); - Connection conn1 = DriverManager.getConnection(getUrl(), props); - conn1.createStatement().execute(ddl); - ddl = "ALTER TABLE " + dataTableFullName + " SET COMPACTION_ENABLED = FALSE, REPLICATION_SCOPE = 1"; - conn1.createStatement().execute(ddl); - try (HBaseAdmin admin = conn1.unwrap(PhoenixConnection.class).getQueryServices().getAdmin()) { - HTableDescriptor tableDesc = admin.getTableDescriptor(Bytes.toBytes(dataTableFullName)); - HColumnDescriptor[] columnFamilies = tableDesc.getColumnFamilies(); - assertEquals(1, columnFamilies.length); - assertEquals("0", columnFamilies[0].getNameAsString()); - assertEquals(1, columnFamilies[0].getScope()); - assertEquals(false, tableDesc.isCompactionEnabled()); - } - } - - @Test - public void testSetHTableHColumnAndPhoenixTableProperties() throws Exception { - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - String ddl = "CREATE TABLE " + dataTableFullName + " (\n" - +"ID1 VARCHAR(15) NOT NULL,\n" - +"ID2 VARCHAR(15) NOT NULL,\n" - +"CREATED_DATE DATE,\n" - +"CF1.CREATION_TIME BIGINT,\n" - +"CF2.LAST_USED DATE,\n" - +"CONSTRAINT PK PRIMARY KEY (ID1, ID2)) " + generateDDLOptions("IMMUTABLE_ROWS=true" - + (!columnEncoded ? ",IMMUTABLE_STORAGE_SCHEME=" + PTable.ImmutableStorageScheme.ONE_CELL_PER_COLUMN : "")); - Connection conn = DriverManager.getConnection(getUrl(), props); - conn.createStatement().execute(ddl); - assertImmutableRows(conn, dataTableFullName, true); - ddl = "ALTER TABLE " + dataTableFullName + " SET COMPACTION_ENABLED = FALSE, VERSIONS = 10"; - conn.createStatement().execute(ddl); - ddl = "ALTER TABLE " + dataTableFullName + " SET COMPACTION_ENABLED = FALSE, CF1.MIN_VERSIONS = 1, CF2.MIN_VERSIONS = 3, MIN_VERSIONS = 8, CF1.KEEP_DELETED_CELLS = true, KEEP_DELETED_CELLS = false"; - conn.createStatement().execute(ddl); - - try (HBaseAdmin admin = conn.unwrap(PhoenixConnection.class).getQueryServices().getAdmin()) { - HTableDescriptor tableDesc = admin.getTableDescriptor(Bytes.toBytes(dataTableFullName)); - HColumnDescriptor[] columnFamilies = tableDesc.getColumnFamilies(); - assertEquals(3, columnFamilies.length); - - assertEquals("0", columnFamilies[0].getNameAsString()); - assertEquals(8, columnFamilies[0].getMinVersions()); - assertEquals(10, columnFamilies[0].getMaxVersions()); - assertEquals(KeepDeletedCells.FALSE, columnFamilies[0].getKeepDeletedCells()); - - assertEquals("CF1", columnFamilies[1].getNameAsString()); - assertEquals(1, columnFamilies[1].getMinVersions()); - assertEquals(10, columnFamilies[1].getMaxVersions()); - assertEquals(KeepDeletedCells.TRUE, columnFamilies[1].getKeepDeletedCells()); - - assertEquals("CF2", columnFamilies[2].getNameAsString()); - assertEquals(3, columnFamilies[2].getMinVersions()); - assertEquals(10, columnFamilies[2].getMaxVersions()); - assertEquals(KeepDeletedCells.FALSE, columnFamilies[2].getKeepDeletedCells()); - - assertEquals(Boolean.toString(false), tableDesc.getValue(HTableDescriptor.COMPACTION_ENABLED)); - } - } - - @Test - public void testSpecifyingColumnFamilyForHTablePropertyFails() throws Exception { - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - String ddl = "CREATE TABLE " + dataTableFullName + " (\n" - +"ID1 VARCHAR(15) NOT NULL,\n" - +"ID2 VARCHAR(15) NOT NULL,\n" - +"CREATED_DATE DATE,\n" - +"CREATION_TIME BIGINT,\n" - +"LAST_USED DATE,\n" - +"CONSTRAINT PK PRIMARY KEY (ID1, ID2)) " + generateDDLOptions("SALT_BUCKETS = 8"); - Connection conn1 = DriverManager.getConnection(getUrl(), props); - conn1.createStatement().execute(ddl); - ddl = "ALTER TABLE " + dataTableFullName + " SET CF.COMPACTION_ENABLED = FALSE"; - try { - conn1.createStatement().execute(ddl); - fail(); - } catch (SQLException e) { - assertEquals(SQLExceptionCode.COLUMN_FAMILY_NOT_ALLOWED_TABLE_PROPERTY.getErrorCode(), e.getErrorCode()); - } - } - - @Test - public void testSpecifyingColumnFamilyForPhoenixTablePropertyFails() throws Exception { - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - String ddl = "CREATE TABLE " + dataTableFullName + " (\n" - +"ID1 VARCHAR(15) NOT NULL,\n" - +"ID2 VARCHAR(15) NOT NULL,\n" - +"CREATED_DATE DATE,\n" - +"CREATION_TIME BIGINT,\n" - +"LAST_USED DATE,\n" - +"CONSTRAINT PK PRIMARY KEY (ID1, ID2)) " + generateDDLOptions("SALT_BUCKETS = 8"); - Connection conn1 = DriverManager.getConnection(getUrl(), props); - conn1.createStatement().execute(ddl); - ddl = "ALTER TABLE " + dataTableFullName + " SET CF.DISABLE_WAL = TRUE"; - try { - conn1.createStatement().execute(ddl); - fail(); - } catch (SQLException e) { - assertEquals(SQLExceptionCode.COLUMN_FAMILY_NOT_ALLOWED_TABLE_PROPERTY.getErrorCode(), e.getErrorCode()); - } - } - - @Test - public void testSpecifyingColumnFamilyForTTLFails() throws Exception { - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - String ddl = "CREATE TABLE " + dataTableFullName + " (\n" - +"ID1 VARCHAR(15) NOT NULL,\n" - +"ID2 VARCHAR(15) NOT NULL,\n" - +"CREATED_DATE DATE,\n" - +"CREATION_TIME BIGINT,\n" - +"CF.LAST_USED DATE,\n" - +"CONSTRAINT PK PRIMARY KEY (ID1, ID2)) " + generateDDLOptions("SALT_BUCKETS = 8"); - Connection conn1 = DriverManager.getConnection(getUrl(), props); - conn1.createStatement().execute(ddl); - ddl = "ALTER TABLE " + dataTableFullName + " SET CF.TTL = 86400"; - try { - conn1.createStatement().execute(ddl); - fail(); - } catch (SQLException e) { - assertEquals(SQLExceptionCode.COLUMN_FAMILY_NOT_ALLOWED_FOR_TTL.getErrorCode(), e.getErrorCode()); - } - } - - @Test - public void testSetPropertyNeedsColumnFamilyToExist() throws Exception { - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - String ddl = "CREATE TABLE " + dataTableFullName + " (\n" - +"ID1 VARCHAR(15) NOT NULL,\n" - +"ID2 VARCHAR(15) NOT NULL,\n" - +"CREATED_DATE DATE,\n" - +"CREATION_TIME BIGINT,\n" - +"LAST_USED DATE,\n" - +"CONSTRAINT PK PRIMARY KEY (ID1, ID2)) " + generateDDLOptions("SALT_BUCKETS = 8"); - Connection conn1 = DriverManager.getConnection(getUrl(), props); - conn1.createStatement().execute(ddl); - ddl = "ALTER TABLE " + dataTableFullName + " SET CF.REPLICATION_SCOPE = 1"; - try { - conn1.createStatement().execute(ddl); - fail(); - } catch (SQLException e) { - assertEquals(SQLExceptionCode.COLUMN_FAMILY_NOT_FOUND.getErrorCode(), e.getErrorCode()); - } - } - - @Test - public void testSetDefaultColumnFamilyNotAllowed() throws Exception { - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - String ddl = "CREATE TABLE " + dataTableFullName + " (\n" - +"ID1 VARCHAR(15) NOT NULL,\n" - +"ID2 VARCHAR(15) NOT NULL,\n" - +"CREATED_DATE DATE,\n" - +"CREATION_TIME BIGINT,\n" - +"LAST_USED DATE,\n" - +"CONSTRAINT PK PRIMARY KEY (ID1, ID2)) " + generateDDLOptions(" SALT_BUCKETS = 8"); - Connection conn1 = DriverManager.getConnection(getUrl(), props); - conn1.createStatement().execute(ddl); - ddl = "ALTER TABLE " + dataTableFullName + " SET DEFAULT_COLUMN_FAMILY = 'A'"; - try { - conn1.createStatement().execute(ddl); - fail(); - } catch (SQLException e) { - assertEquals(SQLExceptionCode.DEFAULT_COLUMN_FAMILY_ONLY_ON_CREATE_TABLE.getErrorCode(), e.getErrorCode()); - } - } - - @Test - public void testSetHColumnOrHTablePropertiesOnViewsNotAllowed() throws Exception { - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - String ddl = "CREATE TABLE " + dataTableFullName + " (\n" - +"ID1 VARCHAR(15) NOT NULL,\n" - +"ID2 VARCHAR(15) NOT NULL,\n" - +"CREATED_DATE DATE,\n" - +"CREATION_TIME BIGINT,\n" - +"LAST_USED DATE,\n" - +"CONSTRAINT PK PRIMARY KEY (ID1, ID2)) " + generateDDLOptions("SALT_BUCKETS = 8"); - Connection conn1 = DriverManager.getConnection(getUrl(), props); - conn1.createStatement().execute(ddl); - ddl = "CREATE VIEW " + viewName + " AS SELECT * FROM " + dataTableFullName + " WHERE CREATION_TIME = 1"; - conn1.createStatement().execute(ddl); - ddl = "ALTER VIEW " + viewName + " SET REPLICATION_SCOPE = 1"; - try { - conn1.createStatement().execute(ddl); - fail(); - } catch (SQLException e) { - assertEquals(SQLExceptionCode.VIEW_WITH_PROPERTIES.getErrorCode(), e.getErrorCode()); - } - ddl = "ALTER VIEW " + viewName + " SET COMPACTION_ENABLED = FALSE"; - try { - conn1.createStatement().execute(ddl); - fail(); - } catch (SQLException e) { - assertEquals(SQLExceptionCode.VIEW_WITH_PROPERTIES.getErrorCode(), e.getErrorCode()); - } - } - - @Test - public void testSetForSomePhoenixTablePropertiesOnViewsAllowed() throws Exception { - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - String ddl = "CREATE TABLE " + dataTableFullName + " (\n" - +"ID1 VARCHAR(15) NOT NULL,\n" - +"ID2 VARCHAR(15) NOT NULL,\n" - +"CREATED_DATE DATE,\n" - +"CREATION_TIME BIGINT,\n" - +"LAST_USED DATE,\n" - +"CONSTRAINT PK PRIMARY KEY (ID1, ID2)) " + generateDDLOptions("SALT_BUCKETS = 8"); - Connection conn1 = DriverManager.getConnection(getUrl(), props); - conn1.createStatement().execute(ddl); - String viewFullName = SchemaUtil.getTableName(schemaName, generateUniqueName()); - ddl = "CREATE VIEW " + viewFullName + " AS SELECT * FROM " + dataTableFullName + " WHERE CREATION_TIME = 1"; - conn1.createStatement().execute(ddl); - ddl = "ALTER VIEW " + viewFullName + " SET UPDATE_CACHE_FREQUENCY = 10"; - conn1.createStatement().execute(ddl); - conn1.createStatement().execute("SELECT * FROM " + viewFullName); - PhoenixConnection pconn = conn1.unwrap(PhoenixConnection.class); - assertEquals(10, pconn.getTable(new PTableKey(pconn.getTenantId(), viewFullName)).getUpdateCacheFrequency()); - ddl = "ALTER VIEW " + viewFullName + " SET UPDATE_CACHE_FREQUENCY = 20"; - conn1.createStatement().execute(ddl); - conn1.createStatement().execute("SELECT * FROM " + viewFullName); - pconn = conn1.unwrap(PhoenixConnection.class); - assertEquals(20, pconn.getTable(new PTableKey(pconn.getTenantId(), viewFullName)).getUpdateCacheFrequency()); - assertImmutableRows(conn1, viewFullName, false); - ddl = "ALTER VIEW " + viewFullName + " SET DISABLE_WAL = TRUE"; - try { - conn1.createStatement().execute(ddl); - fail(); - } catch (SQLException e) { - assertEquals(SQLExceptionCode.VIEW_WITH_PROPERTIES.getErrorCode(), e.getErrorCode()); - } - ddl = "ALTER VIEW " + viewFullName + " SET THROW_INDEX_WRITE_FAILURE = FALSE"; - try { - conn1.createStatement().execute(ddl); - fail(); - } catch (SQLException e) { - assertEquals(SQLExceptionCode.VIEW_WITH_PROPERTIES.getErrorCode(), e.getErrorCode()); - } - } - - @Test - public void testSettingPropertiesWhenTableHasDefaultColFamilySpecified() throws Exception { - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - String ddl = "CREATE TABLE " + dataTableFullName + " (\n" - +"ID1 VARCHAR(15) NOT NULL,\n" - +"ID2 VARCHAR(15) NOT NULL,\n" - +"CREATED_DATE DATE,\n" - +"CREATION_TIME BIGINT,\n" - +"CF.LAST_USED DATE,\n" - +"CONSTRAINT PK PRIMARY KEY (ID1, ID2)) " + generateDDLOptions("IMMUTABLE_ROWS=true, DEFAULT_COLUMN_FAMILY = 'XYZ'" - + (!columnEncoded ? ",IMMUTABLE_STORAGE_SCHEME=" + PTable.ImmutableStorageScheme.ONE_CELL_PER_COLUMN : "")); - Connection conn = DriverManager.getConnection(getUrl(), props); - conn.createStatement().execute(ddl); - assertImmutableRows(conn, dataTableFullName, true); - ddl = "ALTER TABLE " + dataTableFullName - + " SET COMPACTION_ENABLED = FALSE, CF.REPLICATION_SCOPE=1, IMMUTABLE_ROWS = TRUE, TTL=1000"; - conn.createStatement().execute(ddl); - assertImmutableRows(conn, dataTableFullName, true); - try (HBaseAdmin admin = conn.unwrap(PhoenixConnection.class).getQueryServices().getAdmin()) { - HTableDescriptor tableDesc = admin.getTableDescriptor(Bytes.toBytes(dataTableFullName)); - HColumnDescriptor[] columnFamilies = tableDesc.getColumnFamilies(); - assertEquals(2, columnFamilies.length); - assertEquals("CF", columnFamilies[0].getNameAsString()); - assertEquals(1, columnFamilies[0].getScope()); - assertEquals(1000, columnFamilies[0].getTimeToLive()); - assertEquals("XYZ", columnFamilies[1].getNameAsString()); - assertEquals(DEFAULT_REPLICATION_SCOPE, columnFamilies[1].getScope()); - assertEquals(1000, columnFamilies[1].getTimeToLive()); - assertEquals(Boolean.toString(false), tableDesc.getValue(HTableDescriptor.COMPACTION_ENABLED)); - } - } - - private static void assertImmutableRows(Connection conn, String fullTableName, boolean expectedValue) throws SQLException { - PhoenixConnection pconn = conn.unwrap(PhoenixConnection.class); - assertEquals(expectedValue, pconn.getTable(new PTableKey(pconn.getTenantId(), fullTableName)).isImmutableRows()); - } - - @Test - public void testSetPropertyAndAddColumnForExistingColumnFamily() throws Exception { - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - String ddl = "CREATE TABLE " + dataTableFullName - + - " (a_string varchar not null, col1 integer, CF.col2 integer" + - " CONSTRAINT pk PRIMARY KEY (a_string)) " + tableDDLOptions; - try { - conn.createStatement().execute(ddl); - conn.createStatement().execute( - "ALTER TABLE " + dataTableFullName + " ADD CF.col3 integer CF.IN_MEMORY=true"); - try (HBaseAdmin admin = conn.unwrap(PhoenixConnection.class).getQueryServices().getAdmin()) { - HColumnDescriptor[] columnFamilies = admin.getTableDescriptor(Bytes.toBytes(dataTableFullName)) - .getColumnFamilies(); - assertEquals(2, columnFamilies.length); - assertEquals("0", columnFamilies[0].getNameAsString()); - assertFalse(columnFamilies[0].isInMemory()); - assertEquals("CF", columnFamilies[1].getNameAsString()); - assertTrue(columnFamilies[1].isInMemory()); - } - } finally { - conn.close(); - } - } - - @Test - public void testSetPropertyAndAddColumnForNewAndExistingColumnFamily() throws Exception { - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - String ddl = "CREATE TABLE " + dataTableFullName + " " - + - " (a_string varchar not null, col1 integer, CF1.col2 integer" + - " CONSTRAINT pk PRIMARY KEY (a_string)) " + tableDDLOptions; - try { - conn.createStatement().execute(ddl); - conn.createStatement() - .execute( - "ALTER TABLE " - + dataTableFullName - + " ADD col4 integer, CF1.col5 integer, CF2.col6 integer IN_MEMORY=true, CF1.REPLICATION_SCOPE=1, CF2.IN_MEMORY=false "); - try (HBaseAdmin admin = conn.unwrap(PhoenixConnection.class).getQueryServices().getAdmin()) { - HColumnDescriptor[] columnFamilies = admin.getTableDescriptor(Bytes.toBytes(dataTableFullName)) - .getColumnFamilies(); - assertEquals(3, columnFamilies.length); - assertEquals("0", columnFamilies[0].getNameAsString()); - assertTrue(columnFamilies[0].isInMemory()); - assertEquals(0, columnFamilies[0].getScope()); - assertEquals("CF1", columnFamilies[1].getNameAsString()); - assertTrue(columnFamilies[1].isInMemory()); - assertEquals(1, columnFamilies[1].getScope()); - assertEquals("CF2", columnFamilies[2].getNameAsString()); - assertFalse(columnFamilies[2].isInMemory()); - assertEquals(0, columnFamilies[2].getScope()); - } - } finally { - conn.close(); - } - } - - @Test - public void testSetPropertyAndAddColumnWhenTableHasExplicitDefaultColumnFamily() throws Exception { - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - String ddl = "CREATE TABLE " + dataTableFullName + " " - + - " (a_string varchar not null, col1 integer, CF1.col2 integer" + - " CONSTRAINT pk PRIMARY KEY (a_string)) " + generateDDLOptions("DEFAULT_COLUMN_FAMILY = 'XYZ'"); - try { - conn.createStatement().execute(ddl); - conn.createStatement() - .execute( - "ALTER TABLE " - + dataTableFullName - + " ADD col4 integer, CF1.col5 integer, CF2.col6 integer IN_MEMORY=true, CF1.REPLICATION_SCOPE=1, CF2.IN_MEMORY=false, XYZ.REPLICATION_SCOPE=1 "); - try (HBaseAdmin admin = conn.unwrap(PhoenixConnection.class).getQueryServices().getAdmin()) { - HColumnDescriptor[] columnFamilies = admin.getTableDescriptor(Bytes.toBytes(dataTableFullName)) - .getColumnFamilies(); - assertEquals(3, columnFamilies.length); - assertEquals("CF1", columnFamilies[0].getNameAsString()); - assertTrue(columnFamilies[0].isInMemory()); - assertEquals(1, columnFamilies[0].getScope()); - assertEquals("CF2", columnFamilies[1].getNameAsString()); - assertFalse(columnFamilies[1].isInMemory()); - assertEquals(0, columnFamilies[1].getScope()); - assertEquals("XYZ", columnFamilies[2].getNameAsString()); - assertTrue(columnFamilies[2].isInMemory()); - assertEquals(1, columnFamilies[2].getScope()); - } - } finally { - conn.close(); - } - } - - @Test - public void testSetPropertyAndAddColumnFailsForColumnFamilyNotPresentInAddCol() throws Exception { - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - String ddl = "CREATE TABLE " + dataTableFullName + " " - + - " (a_string varchar not null, col1 integer, CF1.col2 integer" + - " CONSTRAINT pk PRIMARY KEY (a_string)) "+ generateDDLOptions("DEFAULT_COLUMN_FAMILY = 'XYZ'"); - try { - conn.createStatement().execute(ddl); - try { - conn.createStatement().execute( - "ALTER TABLE " + dataTableFullName - + " ADD col4 integer CF1.REPLICATION_SCOPE=1, XYZ.IN_MEMORY=true "); - fail(); - } catch(SQLException e) { - assertEquals(SQLExceptionCode.CANNOT_SET_PROPERTY_FOR_COLUMN_NOT_ADDED.getErrorCode(), e.getErrorCode()); - } - } finally { - conn.close(); - } - } - - @Test - public void testSetPropertyAndAddColumnForDifferentColumnFamilies() throws Exception { - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - String ddl = "CREATE TABLE " + dataTableFullName - + - " (a_string varchar not null, col1 integer, CF1.col2 integer, CF2.col3 integer" + - " CONSTRAINT pk PRIMARY KEY (a_string)) " + generateDDLOptions("DEFAULT_COLUMN_FAMILY = 'XYZ' "); - try { - conn.createStatement().execute(ddl); - conn.createStatement() - .execute( - "ALTER TABLE " - + dataTableFullName - + " ADD col4 integer, CF1.col5 integer, CF2.col6 integer, CF3.col7 integer CF1.REPLICATION_SCOPE=1, CF1.IN_MEMORY=false, IN_MEMORY=true "); - try (HBaseAdmin admin = conn.unwrap(PhoenixConnection.class).getQueryServices().getAdmin()) { - HColumnDescriptor[] columnFamilies = admin.getTableDescriptor(Bytes.toBytes(dataTableFullName)) - .getColumnFamilies(); - assertEquals(4, columnFamilies.length); - assertEquals("CF1", columnFamilies[0].getNameAsString()); - assertFalse(columnFamilies[0].isInMemory()); - assertEquals(1, columnFamilies[0].getScope()); - assertEquals("CF2", columnFamilies[1].getNameAsString()); - assertTrue(columnFamilies[1].isInMemory()); - assertEquals(0, columnFamilies[1].getScope()); - assertEquals("CF3", columnFamilies[2].getNameAsString()); - assertTrue(columnFamilies[2].isInMemory()); - assertEquals(0, columnFamilies[2].getScope()); - assertEquals("XYZ", columnFamilies[3].getNameAsString()); - assertTrue(columnFamilies[3].isInMemory()); - assertEquals(0, columnFamilies[3].getScope()); - } - } finally { - conn.close(); - } - } - - @Test - public void testSetPropertyAndAddColumnUsingDefaultColumnFamilySpecifier() throws Exception { - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - String ddl = "CREATE TABLE " + dataTableFullName - + - " (a_string varchar not null, col1 integer, CF1.col2 integer" + - " CONSTRAINT pk PRIMARY KEY (a_string)) " + generateDDLOptions("DEFAULT_COLUMN_FAMILY = 'XYZ'"); - try { - conn.createStatement().execute(ddl); - conn.createStatement().execute( - "ALTER TABLE " + dataTableFullName + " ADD col4 integer XYZ.REPLICATION_SCOPE=1 "); - conn.createStatement() - .execute("ALTER TABLE " + dataTableFullName + " ADD XYZ.col5 integer IN_MEMORY=true "); - try (HBaseAdmin admin = conn.unwrap(PhoenixConnection.class).getQueryServices().getAdmin()) { - HColumnDescriptor[] columnFamilies = admin.getTableDescriptor(Bytes.toBytes(dataTableFullName)) - .getColumnFamilies(); - assertEquals(2, columnFamilies.length); - assertEquals("CF1", columnFamilies[0].getNameAsString()); - assertFalse(columnFamilies[0].isInMemory()); - assertEquals(0, columnFamilies[0].getScope()); - assertEquals("XYZ", columnFamilies[1].getNameAsString()); - assertTrue(columnFamilies[1].isInMemory()); - assertEquals(1, columnFamilies[1].getScope()); - } - } finally { - conn.close(); - } - } - - @Test - public void testSetPropertyAndAddColumnForDefaultColumnFamily() throws Exception { - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - conn.setAutoCommit(false); - String ddl = "CREATE TABLE " + dataTableFullName + - " (a_string varchar not null, col1 integer" + - " CONSTRAINT pk PRIMARY KEY (a_string)) " + tableDDLOptions; - try { - conn.createStatement().execute(ddl); - conn.createStatement().execute("ALTER TABLE " + dataTableFullName + " ADD col2 integer IN_MEMORY=true"); - try (HBaseAdmin admin = conn.unwrap(PhoenixConnection.class).getQueryServices().getAdmin()) { - HColumnDescriptor[] columnFamilies = admin.getTableDescriptor(Bytes.toBytes(dataTableFullName)) - .getColumnFamilies(); - assertEquals(1, columnFamilies.length); - assertEquals("0", columnFamilies[0].getNameAsString()); - assertTrue(columnFamilies[0].isInMemory()); - } - } finally { - conn.close(); - } - } - - @Test - public void testAddNewColumnFamilyProperties() throws Exception { - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - conn.setAutoCommit(false); - - try { - conn.createStatement() - .execute( - "CREATE TABLE " - + dataTableFullName - + " (a_string varchar not null, col1 integer, cf1.col2 integer, col3 integer , cf2.col4 integer " - + " CONSTRAINT pk PRIMARY KEY (a_string)) " + generateDDLOptions("immutable_rows=true , SALT_BUCKETS=3 " - + (!columnEncoded ? ",IMMUTABLE_STORAGE_SCHEME=" + PTable.ImmutableStorageScheme.ONE_CELL_PER_COLUMN : ""))); - - String ddl = "Alter table " + dataTableFullName + " add cf3.col5 integer, cf4.col6 integer in_memory=true"; - conn.createStatement().execute(ddl); - - try (HBaseAdmin admin = conn.unwrap(PhoenixConnection.class).getQueryServices().getAdmin()) { - HTableDescriptor tableDesc = admin.getTableDescriptor(Bytes.toBytes(dataTableFullName)); - assertTrue(tableDesc.isCompactionEnabled()); - HColumnDescriptor[] columnFamilies = tableDesc.getColumnFamilies(); - assertEquals(5, columnFamilies.length); - assertEquals("0", columnFamilies[0].getNameAsString()); - assertFalse(columnFamilies[0].isInMemory()); - assertEquals("CF1", columnFamilies[1].getNameAsString()); - assertFalse(columnFamilies[1].isInMemory()); - assertEquals("CF2", columnFamilies[2].getNameAsString()); - assertFalse(columnFamilies[2].isInMemory()); - assertEquals("CF3", columnFamilies[3].getNameAsString()); - assertTrue(columnFamilies[3].isInMemory()); - assertEquals("CF4", columnFamilies[4].getNameAsString()); - assertTrue(columnFamilies[4].isInMemory()); - } - } finally { - conn.close(); - } - } - - @Test - public void testAddProperyToExistingColumnFamily() throws Exception { - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - conn.setAutoCommit(false); - - try { - conn.createStatement() - .execute( - "CREATE TABLE " - + dataTableFullName - + " (a_string varchar not null, col1 integer, cf1.col2 integer, col3 integer , cf2.col4 integer " - + " CONSTRAINT pk PRIMARY KEY (a_string)) " + generateDDLOptions("immutable_rows=true , SALT_BUCKETS=3 " - + (!columnEncoded ? ",IMMUTABLE_STORAGE_SCHEME=" + PTable.ImmutableStorageScheme.ONE_CELL_PER_COLUMN : ""))); - - String ddl = "Alter table " + dataTableFullName + " add cf1.col5 integer in_memory=true"; - conn.createStatement().execute(ddl); - - try (HBaseAdmin admin = conn.unwrap(PhoenixConnection.class).getQueryServices().getAdmin()) { - HTableDescriptor tableDesc = admin.getTableDescriptor(Bytes.toBytes(dataTableFullName)); - assertTrue(tableDesc.isCompactionEnabled()); - HColumnDescriptor[] columnFamilies = tableDesc.getColumnFamilies(); - assertEquals(3, columnFamilies.length); - assertEquals("0", columnFamilies[0].getNameAsString()); - assertFalse(columnFamilies[0].isInMemory()); - assertEquals("CF1", columnFamilies[1].getNameAsString()); - assertTrue(columnFamilies[1].isInMemory()); - assertEquals("CF2", columnFamilies[2].getNameAsString()); - assertFalse(columnFamilies[2].isInMemory()); - } - } finally { - conn.close(); - } - } - - @Test - public void testAddTTLToExistingColumnFamily() throws Exception { - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - conn.setAutoCommit(false); - - try { - String ddl = "CREATE TABLE " + dataTableFullName - + " (pk char(2) not null primary key, col1 integer, b.col1 integer) " + tableDDLOptions + " SPLIT ON ('EA','EZ') "; - conn.createStatement().execute(ddl); - ddl = "ALTER TABLE " + dataTableFullName + " add b.col2 varchar ttl=30"; - conn.createStatement().execute(ddl); - fail(); - } catch (SQLException e) { - assertEquals(SQLExceptionCode.CANNOT_SET_TABLE_PROPERTY_ADD_COLUMN.getErrorCode(), e.getErrorCode()); - } finally { - conn.close(); - } - } - - @Test - public void testSettingTTLWhenAddingColumnNotAllowed() throws Exception { - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - conn.setAutoCommit(false); - - try { - String ddl = "CREATE TABLE " + dataTableFullName - + " (pk char(2) not null primary key) " + generateDDLOptions("TTL=100") + " SPLIT ON ('EA','EZ')"; - conn.createStatement().execute(ddl); - ddl = "ALTER TABLE " + dataTableFullName + " add col1 varchar ttl=30"; - conn.createStatement().execute(ddl); - fail(); - } catch (SQLException e) { - assertEquals(SQLExceptionCode.CANNOT_SET_TABLE_PROPERTY_ADD_COLUMN.getErrorCode(), e.getErrorCode()); - } - try { - String ddl = "ALTER TABLE " + dataTableFullName + " add col1 varchar a.ttl=30"; - conn.createStatement().execute(ddl); - fail(); - } catch (SQLException e) { - assertEquals(SQLExceptionCode.COLUMN_FAMILY_NOT_ALLOWED_FOR_TTL.getErrorCode(), e.getErrorCode()); - } finally { - conn.close(); - } - } - - @Test - public void testSetTTLForTableWithOnlyPKCols() throws Exception { - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - conn.setAutoCommit(false); - try { - String ddl = "create table " + dataTableFullName + " (" - + " id char(1) NOT NULL," - + " col1 integer NOT NULL," - + " col2 bigint NOT NULL," - + " CONSTRAINT NAME_PK PRIMARY KEY (id, col1, col2)" - + " ) " + generateDDLOptions("TTL=86400, SALT_BUCKETS = 4, DEFAULT_COLUMN_FAMILY='XYZ'"); - conn.createStatement().execute(ddl); - try (HBaseAdmin admin = conn.unwrap(PhoenixConnection.class).getQueryServices().getAdmin()) { - HTableDescriptor tableDesc = admin.getTableDescriptor(Bytes.toBytes(dataTableFullName)); - HColumnDescriptor[] columnFamilies = tableDesc.getColumnFamilies(); - assertEquals(1, columnFamilies.length); - assertEquals("XYZ", columnFamilies[0].getNameAsString()); - assertEquals(86400, columnFamilies[0].getTimeToLive()); - } - ddl = "ALTER TABLE " + dataTableFullName + " SET TTL=30"; - conn.createStatement().execute(ddl); - conn.commit(); - try (HBaseAdmin admin = conn.unwrap(PhoenixConnection.class).getQueryServices().getAdmin()) { - HTableDescriptor tableDesc = admin.getTableDescriptor(Bytes.toBytes(dataTableFullName)); - HColumnDescriptor[] columnFamilies = tableDesc.getColumnFamilies(); - assertEquals(1, columnFamilies.length); - assertEquals(30, columnFamilies[0].getTimeToLive()); - assertEquals("XYZ", columnFamilies[0].getNameAsString()); - } - } finally { - conn.close(); - } - } - - @Test - public void testSetHColumnPropertyForTableWithOnlyPKCols1() throws Exception { - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - conn.setAutoCommit(false); - try { - String ddl = "create table " + dataTableFullName + " (" - + " id char(1) NOT NULL," - + " col1 integer NOT NULL," - + " col2 bigint NOT NULL," - + " CONSTRAINT NAME_PK PRIMARY KEY (id, col1, col2)" - + " ) " + generateDDLOptions("TTL=86400, SALT_BUCKETS = 4, DEFAULT_COLUMN_FAMILY='XYZ'"); - conn.createStatement().execute(ddl); - ddl = "ALTER TABLE " + dataTableFullName + " SET IN_MEMORY=true"; - conn.createStatement().execute(ddl); - conn.commit(); - try (HBaseAdmin admin = conn.unwrap(PhoenixConnection.class).getQueryServices().getAdmin()) { - HTableDescriptor tableDesc = admin.getTableDescriptor(Bytes.toBytes(dataTableFullName)); - HColumnDescriptor[] columnFamilies = tableDesc.getColumnFamilies(); - assertEquals(1, columnFamilies.length); - assertEquals(true, columnFamilies[0].isInMemory()); - assertEquals("XYZ", columnFamilies[0].getNameAsString()); - } - } finally { - conn.close(); - } - } - - @Test - public void testSetHColumnPropertyForTableWithOnlyPKCols2() throws Exception { - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - conn.setAutoCommit(false); - try { - String ddl = "create table " + dataTableFullName + " (" - + " id char(1) NOT NULL," - + " col1 integer NOT NULL," - + " col2 bigint NOT NULL," - + " CONSTRAINT NAME_PK PRIMARY KEY (id, col1, col2)" - + " ) " + generateDDLOptions("TTL=86400, SALT_BUCKETS = 4"); - conn.createStatement().execute(ddl); - ddl = "ALTER TABLE " + dataTableFullName + " SET IN_MEMORY=true"; - conn.createStatement().execute(ddl); - conn.commit(); - try (HBaseAdmin admin = conn.unwrap(PhoenixConnection.class).getQueryServices().getAdmin()) { - HTableDescriptor tableDesc = admin.getTableDescriptor(Bytes.toBytes(dataTableFullName)); - HColumnDescriptor[] columnFamilies = tableDesc.getColumnFamilies(); - assertEquals(1, columnFamilies.length); - assertEquals(true, columnFamilies[0].isInMemory()); - assertEquals("0", columnFamilies[0].getNameAsString()); - } - } finally { - conn.close(); - } - } - - @Test - public void testSetHColumnPropertyAndAddColumnForDefaultCFForTableWithOnlyPKCols() throws Exception { - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - conn.setAutoCommit(false); - try { - String ddl = "create table " + dataTableFullName + " (" - + " id char(1) NOT NULL," - + " col1 integer NOT NULL," - + " col2 bigint NOT NULL," - + " CONSTRAINT NAME_PK PRIMARY KEY (id, col1, col2)" - + " ) " + generateDDLOptions("TTL=86400, SALT_BUCKETS = 4, DEFAULT_COLUMN_FAMILY='XYZ'"); - conn.createStatement().execute(ddl); - ddl = "ALTER TABLE " + dataTableFullName + " ADD COL3 INTEGER IN_MEMORY=true"; - conn.createStatement().execute(ddl); - conn.commit(); - try (HBaseAdmin admin = conn.unwrap(PhoenixConnection.class).getQueryServices().getAdmin()) { - HTableDescriptor tableDesc = admin.getTableDescriptor(Bytes.toBytes(dataTableFullName)); - HColumnDescriptor[] columnFamilies = tableDesc.getColumnFamilies(); - assertEquals(1, columnFamilies.length); - assertEquals(true, columnFamilies[0].isInMemory()); - assertEquals("XYZ", columnFamilies[0].getNameAsString()); - } - } finally { - conn.close(); - } - } - - @Test - public void testSetHColumnPropertyAndAddColumnForNewCFForTableWithOnlyPKCols() throws Exception { - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - conn.setAutoCommit(false); - try { - String ddl = "create table " + dataTableFullName + " (" - + " id char(1) NOT NULL," - + " col1 integer NOT NULL," - + " col2 bigint NOT NULL," - + " CONSTRAINT NAME_PK PRIMARY KEY (id, col1, col2)" - + " ) " + generateDDLOptions("TTL=86400, SALT_BUCKETS = 4, DEFAULT_COLUMN_FAMILY='XYZ'"); - conn.createStatement().execute(ddl); - ddl = "ALTER TABLE " + dataTableFullName + " ADD NEWCF.COL3 INTEGER IN_MEMORY=true"; - conn.createStatement().execute(ddl); - conn.commit(); - try (HBaseAdmin admin = conn.unwrap(PhoenixConnection.class).getQueryServices().getAdmin()) { - HTableDescriptor tableDesc = admin.getTableDescriptor(Bytes.toBytes(dataTableFullName)); - HColumnDescriptor[] columnFamilies = tableDesc.getColumnFamilies(); - assertEquals(2, columnFamilies.length); - assertEquals("NEWCF", columnFamilies[0].getNameAsString()); - assertEquals(true, columnFamilies[0].isInMemory()); - assertEquals("XYZ", columnFamilies[1].getNameAsString()); - assertEquals(false, columnFamilies[1].isInMemory()); - } - } finally { - conn.close(); - } - } - - @Test - public void testTTLAssignmentForNewEmptyCF() throws Exception { - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - conn.setAutoCommit(false); - try { - String ddl = "create table " + dataTableFullName + " (" - + " id char(1) NOT NULL," - + " col1 integer NOT NULL," - + " col2 bigint NOT NULL," - + " CONSTRAINT NAME_PK PRIMARY KEY (id, col1, col2)" - + " ) " + generateDDLOptions("TTL=86400, SALT_BUCKETS = 4, DEFAULT_COLUMN_FAMILY='XYZ'"); - conn.createStatement().execute(ddl); - ddl = "ALTER TABLE " + dataTableFullName + " ADD NEWCF.COL3 INTEGER IN_MEMORY=true"; - conn.createStatement().execute(ddl); - conn.commit(); - try (HBaseAdmin admin = conn.unwrap(PhoenixConnection.class).getQueryServices().getAdmin()) { - HTableDescriptor tableDesc = admin.getTableDescriptor(Bytes.toBytes(dataTableFullName)); - HColumnDescriptor[] columnFamilies = tableDesc.getColumnFamilies(); - assertEquals(2, columnFamilies.length); - assertEquals("NEWCF", columnFamilies[0].getNameAsString()); - assertEquals(true, columnFamilies[0].isInMemory()); - assertEquals(86400, columnFamilies[0].getTimeToLive()); - assertEquals("XYZ", columnFamilies[1].getNameAsString()); - assertEquals(false, columnFamilies[1].isInMemory()); - assertEquals(86400, columnFamilies[1].getTimeToLive()); - } - - ddl = "ALTER TABLE " + dataTableFullName + " SET TTL=1000"; - conn.createStatement().execute(ddl); - conn.commit(); - try (HBaseAdmin admin = conn.unwrap(PhoenixConnection.class).getQueryServices().getAdmin()) { - HTableDescriptor tableDesc = admin.getTableDescriptor(Bytes.toBytes(dataTableFullName)); - HColumnDescriptor[] columnFamilies = tableDesc.getColumnFamilies(); - assertEquals(2, columnFamilies.length); - assertEquals("NEWCF", columnFamilies[0].getNameAsString()); - assertEquals(true, columnFamilies[0].isInMemory()); - assertEquals(1000, columnFamilies[0].getTimeToLive()); - assertEquals("XYZ", columnFamilies[1].getNameAsString()); - assertEquals(false, columnFamilies[1].isInMemory()); - assertEquals(86400, columnFamilies[1].getTimeToLive()); - } - - // the new column will be assigned to the column family XYZ. With the a KV column getting added for XYZ, - // the column family will start showing up in PTable.getColumnFamilies() after the column is added. Thus - // being a new column family for the PTable, it will end up inheriting the TTL of the emptyCF (NEWCF). - ddl = "ALTER TABLE " + dataTableFullName + " ADD COL3 INTEGER"; - conn.createStatement().execute(ddl); - conn.commit(); - try (HBaseAdmin admin = conn.unwrap(PhoenixConnection.class).getQueryServices().getAdmin()) { - HTableDescriptor tableDesc = admin.getTableDescriptor(Bytes.toBytes(dataTableFullName)); - HColumnDescriptor[] columnFamilies = tableDesc.getColumnFamilies(); - assertEquals(2, columnFamilies.length); - assertEquals("NEWCF", columnFamilies[0].getNameAsString()); - assertEquals(true, columnFamilies[0].isInMemory()); - assertEquals(1000, columnFamilies[0].getTimeToLive()); - assertEquals("XYZ", columnFamilies[1].getNameAsString()); - assertEquals(false, columnFamilies[1].isInMemory()); - assertEquals(1000, columnFamilies[1].getTimeToLive()); - } - } finally { - conn.close(); - } - } - - @Test - public void testSettingNotHColumnNorPhoenixPropertyEndsUpAsHTableProperty() throws Exception { - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - try { - String ddl = "create table " + dataTableFullName + " (" - + " id char(1) NOT NULL," - + " col1 integer NOT NULL," - + " col2 bigint NOT NULL," - + " CONSTRAINT NAME_PK PRIMARY KEY (id, col1, col2)" - + " ) " + tableDDLOptions; - conn.createStatement().execute(ddl); - ddl = "ALTER TABLE " + dataTableFullName + " ADD NEWCF.COL3 INTEGER NEWCF.UNKNOWN_PROP='ABC'"; - try { - conn.createStatement().execute(ddl); - fail(); - } catch (SQLException e) { - assertEquals(SQLExceptionCode.CANNOT_SET_TABLE_PROPERTY_ADD_COLUMN.getErrorCode(), e.getErrorCode()); - } - ddl = "ALTER TABLE " + dataTableFullName + " SET UNKNOWN_PROP='ABC'"; - conn.createStatement().execute(ddl); - try (HBaseAdmin admin = conn.unwrap(PhoenixConnection.class).getQueryServices().getAdmin()) { - HTableDescriptor tableDesc = admin.getTableDescriptor(Bytes.toBytes(dataTableFullName)); - assertEquals("ABC", tableDesc.getValue("UNKNOWN_PROP")); - } - } finally { - conn.close(); - } - } @Test public void testAlterStoreNulls() throws SQLException { @@ -2534,46 +1344,5 @@ public class AlterTableIT extends ParallelStatsDisabledIT { } } - @Test - public void testAlterImmutableRowsPropertyForOneCellPerKeyValueColumnStorageScheme() throws Exception { - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - String ddl = "CREATE TABLE " + dataTableFullName + " (\n" - +"ID VARCHAR(15) NOT NULL,\n" - +"CREATED_DATE DATE,\n" - +"CREATION_TIME BIGINT,\n" - +"CONSTRAINT PK PRIMARY KEY (ID)) " + tableDDLOptions; - Connection conn = DriverManager.getConnection(getUrl(), props); - conn.createStatement().execute(ddl); - assertImmutableRows(conn, dataTableFullName, false); - ddl = "ALTER TABLE " + dataTableFullName + " SET IMMUTABLE_ROWS = true"; - conn.createStatement().execute(ddl); - assertImmutableRows(conn, dataTableFullName, true); - } - - @Test - public void testAlterImmutableRowsPropertyForOneCellPerColumnFamilyStorageScheme() throws Exception { - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - String ddl = "CREATE TABLE " + dataTableFullName + " (\n" - +"ID VARCHAR(15) NOT NULL,\n" - +"CREATED_DATE DATE,\n" - +"CREATION_TIME BIGINT,\n" - +"CONSTRAINT PK PRIMARY KEY (ID)) " + generateDDLOptions("COLUMN_ENCODED_BYTES=4, IMMUTABLE_ROWS=true" - + (!columnEncoded ? ",IMMUTABLE_STORAGE_SCHEME=" + PTable.ImmutableStorageScheme.ONE_CELL_PER_COLUMN : "")); - Connection conn = DriverManager.getConnection(getUrl(), props); - conn.createStatement().execute(ddl); - assertImmutableRows(conn, dataTableFullName, true); - try { - ddl = "ALTER TABLE " + dataTableFullName + " SET IMMUTABLE_ROWS = false"; - conn.createStatement().execute(ddl); - if (columnEncoded) { - fail(); - } - } - catch(SQLException e) { - assertEquals(SQLExceptionCode.CANNOT_ALTER_IMMUTABLE_ROWS_PROPERTY.getErrorCode(), e.getErrorCode()); - } - assertImmutableRows(conn, dataTableFullName, columnEncoded); - } - }
