Repository: phoenix Updated Branches: refs/heads/4.x-HBase-0.98 4004ed17f -> 519701974
http://git-wip-us.apache.org/repos/asf/phoenix/blob/51970197/phoenix-core/src/it/java/org/apache/phoenix/end2end/QueryDatabaseMetaDataIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/QueryDatabaseMetaDataIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/QueryDatabaseMetaDataIT.java index 12c0bd3..0561843 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/QueryDatabaseMetaDataIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/QueryDatabaseMetaDataIT.java @@ -22,14 +22,7 @@ import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.SYSTEM_CATALOG_TAB import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.SYSTEM_FUNCTION_TABLE; import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.TYPE_SEQUENCE; import static org.apache.phoenix.util.TestUtil.ATABLE_NAME; -import static org.apache.phoenix.util.TestUtil.ATABLE_SCHEMA_NAME; -import static org.apache.phoenix.util.TestUtil.BTABLE_NAME; import static org.apache.phoenix.util.TestUtil.CUSTOM_ENTITY_DATA_FULL_NAME; -import static org.apache.phoenix.util.TestUtil.CUSTOM_ENTITY_DATA_NAME; -import static org.apache.phoenix.util.TestUtil.CUSTOM_ENTITY_DATA_SCHEMA_NAME; -import static org.apache.phoenix.util.TestUtil.GROUPBYTEST_NAME; -import static org.apache.phoenix.util.TestUtil.MDTEST_NAME; -import static org.apache.phoenix.util.TestUtil.MDTEST_SCHEMA_NAME; import static org.apache.phoenix.util.TestUtil.PTSDB_NAME; import static org.apache.phoenix.util.TestUtil.STABLE_NAME; import static org.apache.phoenix.util.TestUtil.TABLE_WITH_SALTING; @@ -57,17 +50,13 @@ import org.apache.hadoop.hbase.HTableDescriptor; import org.apache.hadoop.hbase.client.HBaseAdmin; import org.apache.hadoop.hbase.client.HTableInterface; import org.apache.hadoop.hbase.client.Put; -import org.apache.hadoop.hbase.client.Scan; -import org.apache.hadoop.hbase.filter.FirstKeyOnlyFilter; import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding; import org.apache.hadoop.hbase.util.Bytes; import org.apache.phoenix.coprocessor.GroupedAggregateRegionObserver; import org.apache.phoenix.coprocessor.ServerCachingEndpointImpl; import org.apache.phoenix.coprocessor.UngroupedAggregateRegionObserver; -import org.apache.phoenix.exception.SQLExceptionCode; 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.PTable.ViewType; import org.apache.phoenix.schema.PTableType; @@ -77,265 +66,289 @@ import org.apache.phoenix.schema.types.PChar; import org.apache.phoenix.schema.types.PDecimal; import org.apache.phoenix.schema.types.PInteger; import org.apache.phoenix.schema.types.PLong; -import org.apache.phoenix.util.PhoenixRuntime; import org.apache.phoenix.util.PropertiesUtil; import org.apache.phoenix.util.SchemaUtil; import org.apache.phoenix.util.StringUtil; -import org.apache.phoenix.util.TestUtil; +import org.junit.Before; import org.junit.Test; -public class QueryDatabaseMetaDataIT extends BaseClientManagedTimeIT { - - private static void createMDTestTable(Connection conn, String tableName, String extraProps) throws SQLException { - String ddl = "create table if not exists " + tableName + - " (id char(1) primary key,\n" + - " a.col1 integer,\n" + - " b.col2 bigint,\n" + - " b.col3 decimal,\n" + - " b.col4 decimal(5),\n" + - " b.col5 decimal(6,3))\n" + - " a." + HConstants.VERSIONS + "=" + 1 + "," + "a." + HColumnDescriptor.DATA_BLOCK_ENCODING + "='" + DataBlockEncoding.NONE + "'"; +public class QueryDatabaseMetaDataIT extends ParallelStatsDisabledIT { + + private static void createMDTestTable(Connection conn, String tableName, String extraProps) + throws SQLException { + String ddl = + "create table if not exists " + tableName + " (id char(1) primary key,\n" + + " a.col1 integer,\n" + " b.col2 bigint,\n" + " b.col3 decimal,\n" + + " b.col4 decimal(5),\n" + " b.col5 decimal(6,3))\n" + " a." + + HConstants.VERSIONS + "=" + 1 + "," + "a." + + HColumnDescriptor.DATA_BLOCK_ENCODING + "='" + DataBlockEncoding.NONE + + "'"; if (extraProps != null && extraProps.length() > 0) { ddl += "," + extraProps; } conn.createStatement().execute(ddl); } + @Before + // We need to clean up phoenix metadata to ensure tests don't step on each other + public void deleteMetadata() throws Exception { + try (Connection conn = DriverManager.getConnection(getUrl())) { + String delete = + "DELETE FROM SYSTEM.CATALOG WHERE TABLE_SCHEM IS NULL OR TABLE_SCHEM = '' OR TABLE_SCHEM != 'SYSTEM'"; + conn.createStatement().executeUpdate(delete); + conn.commit(); + delete = "DELETE FROM \"SYSTEM\".\"SEQUENCE\""; + conn.createStatement().executeUpdate(delete); + conn.commit(); + } + } + @Test public void testTableMetadataScan() throws SQLException { - long ts = nextTimestamp(); - ensureTableCreated(getUrl(), ATABLE_NAME, ATABLE_NAME, ts); - ensureTableCreated(getUrl(), STABLE_NAME, STABLE_NAME, ts); - ensureTableCreated(getUrl(), CUSTOM_ENTITY_DATA_FULL_NAME, CUSTOM_ENTITY_DATA_FULL_NAME, ts); - - Properties props = new Properties(); - props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 5)); - Connection conn = DriverManager.getConnection(getUrl(), props); - DatabaseMetaData dbmd = conn.getMetaData(); - String aTableName = StringUtil.escapeLike(TestUtil.ATABLE_NAME); - String aSchemaName = TestUtil.ATABLE_SCHEMA_NAME; - ResultSet rs = dbmd.getTables(null, aSchemaName, aTableName, null); - assertTrue(rs.next()); - assertEquals(rs.getString("TABLE_NAME"),aTableName); - assertEquals(PTableType.TABLE.toString(), rs.getString("TABLE_TYPE")); - assertEquals(rs.getString(3),aTableName); - assertEquals(PTableType.TABLE.toString(), rs.getString(4)); - assertFalse(rs.next()); - - rs = dbmd.getTables(null, null, null, null); - assertTrue(rs.next()); - assertEquals(rs.getString("TABLE_SCHEM"),SYSTEM_CATALOG_SCHEMA); - assertEquals(rs.getString("TABLE_NAME"),SYSTEM_CATALOG_TABLE); - assertEquals(PTableType.SYSTEM.toString(), rs.getString("TABLE_TYPE")); - assertTrue(rs.next()); - assertEquals(rs.getString("TABLE_SCHEM"),SYSTEM_CATALOG_SCHEMA); - assertEquals(rs.getString("TABLE_NAME"),SYSTEM_FUNCTION_TABLE); - assertEquals(PTableType.SYSTEM.toString(), rs.getString("TABLE_TYPE")); - assertTrue(rs.next()); - assertEquals(rs.getString("TABLE_SCHEM"),SYSTEM_CATALOG_SCHEMA); - assertEquals(rs.getString("TABLE_NAME"),TYPE_SEQUENCE); - assertEquals(PTableType.SYSTEM.toString(), rs.getString("TABLE_TYPE")); - assertTrue(rs.next()); - assertEquals(rs.getString("TABLE_SCHEM"),SYSTEM_CATALOG_SCHEMA); - assertEquals(rs.getString("TABLE_NAME"),PhoenixDatabaseMetaData.SYSTEM_STATS_TABLE); - assertEquals(PTableType.SYSTEM.toString(), rs.getString("TABLE_TYPE")); - assertTrue(rs.next()); - assertEquals(rs.getString("TABLE_SCHEM"),null); - assertEquals(rs.getString("TABLE_NAME"),ATABLE_NAME); - assertEquals(PTableType.TABLE.toString(), rs.getString("TABLE_TYPE")); - assertTrue(rs.next()); - assertEquals(rs.getString("TABLE_SCHEM"),null); - assertEquals(rs.getString("TABLE_NAME"),STABLE_NAME); - assertEquals(PTableType.TABLE.toString(), rs.getString("TABLE_TYPE")); - assertTrue(rs.next()); - assertEquals(CUSTOM_ENTITY_DATA_SCHEMA_NAME, rs.getString("TABLE_SCHEM")); - assertEquals(CUSTOM_ENTITY_DATA_NAME, rs.getString("TABLE_NAME")); - assertEquals(PTableType.TABLE.toString(), rs.getString("TABLE_TYPE")); - assertEquals("false", rs.getString(PhoenixDatabaseMetaData.TRANSACTIONAL)); - assertEquals(Boolean.FALSE, rs.getBoolean(PhoenixDatabaseMetaData.IS_NAMESPACE_MAPPED)); + String tableAName = generateUniqueName() + "TABLE"; + String tableASchema = ""; + ensureTableCreated(getUrl(), tableAName, ATABLE_NAME, null); + String tableS = generateUniqueName() + "TABLE"; + ensureTableCreated(getUrl(), tableS, STABLE_NAME, null); + String tableC = generateUniqueName(); + String tableCSchema = generateUniqueName(); + ensureTableCreated(getUrl(), tableCSchema + "." + tableC, CUSTOM_ENTITY_DATA_FULL_NAME, + null); - rs = dbmd.getTables(null, CUSTOM_ENTITY_DATA_SCHEMA_NAME, CUSTOM_ENTITY_DATA_NAME, null); - assertTrue(rs.next()); - try { - rs.getString("RANDOM_COLUMN_NAME"); - fail(); - } catch (ColumnNotFoundException e) { - // expected + try (Connection conn = DriverManager.getConnection(getUrl())) { + DatabaseMetaData dbmd = conn.getMetaData(); + ResultSet rs = dbmd.getTables(null, tableASchema, tableAName, null); + assertTrue(rs.next()); + assertEquals(rs.getString("TABLE_NAME"), tableAName); + assertEquals(PTableType.TABLE.toString(), rs.getString("TABLE_TYPE")); + assertEquals(rs.getString(3), tableAName); + assertEquals(PTableType.TABLE.toString(), rs.getString(4)); + assertFalse(rs.next()); + + rs = dbmd.getTables(null, null, null, null); + assertTrue(rs.next()); + assertEquals(SYSTEM_CATALOG_SCHEMA, rs.getString("TABLE_SCHEM")); + assertEquals(SYSTEM_CATALOG_TABLE, rs.getString("TABLE_NAME")); + assertEquals(PTableType.SYSTEM.toString(), rs.getString("TABLE_TYPE")); + assertTrue(rs.next()); + assertEquals(SYSTEM_CATALOG_SCHEMA, rs.getString("TABLE_SCHEM")); + assertEquals(SYSTEM_FUNCTION_TABLE, rs.getString("TABLE_NAME")); + assertEquals(PTableType.SYSTEM.toString(), rs.getString("TABLE_TYPE")); + assertTrue(rs.next()); + assertEquals(SYSTEM_CATALOG_SCHEMA, rs.getString("TABLE_SCHEM")); + assertEquals(TYPE_SEQUENCE, rs.getString("TABLE_NAME")); + assertEquals(PTableType.SYSTEM.toString(), rs.getString("TABLE_TYPE")); + assertTrue(rs.next()); + assertEquals(SYSTEM_CATALOG_SCHEMA, rs.getString("TABLE_SCHEM")); + assertEquals(PhoenixDatabaseMetaData.SYSTEM_STATS_TABLE, rs.getString("TABLE_NAME")); + assertEquals(PTableType.SYSTEM.toString(), rs.getString("TABLE_TYPE")); + assertTrue(rs.next()); + assertEquals(null, rs.getString("TABLE_SCHEM")); + assertEquals(tableAName, rs.getString("TABLE_NAME")); + assertEquals(PTableType.TABLE.toString(), rs.getString("TABLE_TYPE")); + assertTrue(rs.next()); + assertEquals(null, rs.getString("TABLE_SCHEM")); + assertEquals(tableS, rs.getString("TABLE_NAME")); + assertEquals(PTableType.TABLE.toString(), rs.getString("TABLE_TYPE")); + assertTrue(rs.next()); + assertEquals(tableCSchema, rs.getString("TABLE_SCHEM")); + assertEquals(tableC, rs.getString("TABLE_NAME")); + assertEquals(PTableType.TABLE.toString(), rs.getString("TABLE_TYPE")); + assertEquals("false", rs.getString(PhoenixDatabaseMetaData.TRANSACTIONAL)); + assertEquals(Boolean.FALSE, rs.getBoolean(PhoenixDatabaseMetaData.IS_NAMESPACE_MAPPED)); + + rs = dbmd.getTables(null, tableCSchema, tableC, null); + assertTrue(rs.next()); + try { + rs.getString("RANDOM_COLUMN_NAME"); + fail(); + } catch (ColumnNotFoundException e) { + // expected + } + assertEquals(tableCSchema, rs.getString("TABLE_SCHEM")); + assertEquals(tableC, rs.getString("TABLE_NAME")); + assertEquals(PTableType.TABLE.toString(), rs.getString("TABLE_TYPE")); + assertFalse(rs.next()); + + rs = dbmd.getTables(null, "", "%TABLE", new String[] { PTableType.TABLE.toString() }); + assertTrue(rs.next()); + assertEquals(null, rs.getString("TABLE_SCHEM")); + assertEquals(tableAName, rs.getString("TABLE_NAME")); + assertEquals(PTableType.TABLE.toString(), rs.getString("TABLE_TYPE")); + assertTrue(rs.next()); + assertEquals(null, rs.getString("TABLE_SCHEM")); + assertEquals(tableS, rs.getString("TABLE_NAME")); + assertEquals(PTableType.TABLE.toString(), rs.getString("TABLE_TYPE")); + assertFalse(rs.next()); } - assertEquals(rs.getString("TABLE_SCHEM"),CUSTOM_ENTITY_DATA_SCHEMA_NAME); - assertEquals(rs.getString("TABLE_NAME"),CUSTOM_ENTITY_DATA_NAME); - assertEquals(PTableType.TABLE.toString(), rs.getString("TABLE_TYPE")); - assertFalse(rs.next()); - - rs = dbmd.getTables(null, "", "_TABLE", new String[] {PTableType.TABLE.toString()}); - assertTrue(rs.next()); - assertEquals(rs.getString("TABLE_SCHEM"),null); - assertEquals(rs.getString("TABLE_NAME"),ATABLE_NAME); - assertEquals(PTableType.TABLE.toString(), rs.getString("TABLE_TYPE")); - assertTrue(rs.next()); - assertEquals(rs.getString("TABLE_SCHEM"),null); - assertEquals(rs.getString("TABLE_NAME"),STABLE_NAME); - assertEquals(PTableType.TABLE.toString(), rs.getString("TABLE_TYPE")); - assertFalse(rs.next()); } @Test public void testTableTypes() throws SQLException { - long ts = nextTimestamp(); - Properties props = new Properties(); - props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 10)); - Connection conn = DriverManager.getConnection(getUrl(), props); - DatabaseMetaData dbmd = conn.getMetaData(); - ResultSet rs = dbmd.getTableTypes(); - assertTrue(rs.next()); - assertEquals("INDEX",rs.getString(1)); - assertTrue(rs.next()); - assertEquals("SEQUENCE",rs.getString(1)); - assertTrue(rs.next()); - assertEquals("SYSTEM TABLE",rs.getString(1)); - assertTrue(rs.next()); - assertEquals("TABLE",rs.getString(1)); - assertTrue(rs.next()); - assertEquals("VIEW",rs.getString(1)); - assertFalse(rs.next()); + try (Connection conn = DriverManager.getConnection(getUrl())) { + DatabaseMetaData dbmd = conn.getMetaData(); + ResultSet rs = dbmd.getTableTypes(); + assertTrue(rs.next()); + assertEquals("INDEX", rs.getString(1)); + assertTrue(rs.next()); + assertEquals("SEQUENCE", rs.getString(1)); + assertTrue(rs.next()); + assertEquals("SYSTEM TABLE", rs.getString(1)); + assertTrue(rs.next()); + assertEquals("TABLE", rs.getString(1)); + assertTrue(rs.next()); + assertEquals("VIEW", rs.getString(1)); + assertFalse(rs.next()); + } } - + @Test public void testSequenceMetadataScan() throws SQLException { - long ts = nextTimestamp(); - Properties props = new Properties(); - props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 10)); - Connection conn = DriverManager.getConnection(getUrl(), props); - conn.createStatement().execute("CREATE SEQUENCE b.s1"); - conn.createStatement().execute("CREATE SEQUENCE a.s2"); - conn.createStatement().execute("CREATE SEQUENCE b.s3"); - conn.createStatement().execute("CREATE SEQUENCE c.s1"); - - props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 20)); - conn = DriverManager.getConnection(getUrl(), props); - DatabaseMetaData dbmd = conn.getMetaData(); - ResultSet rs = dbmd.getTables(null, null, null, new String[] {"FOO"}); - assertFalse(rs.next()); - - rs = dbmd.getTables(null, null, null, new String[] {"FOO",PhoenixDatabaseMetaData.SEQUENCE_TABLE_TYPE}); - assertTrue(rs.next()); - assertNull(rs.getString("TABLE_CAT")); - assertEquals("A", rs.getString("TABLE_SCHEM")); - assertEquals("S2", rs.getString("TABLE_NAME")); - assertTrue(rs.next()); - assertNull(rs.getString("TABLE_CAT")); - assertEquals("B", rs.getString("TABLE_SCHEM")); - assertEquals("S1", rs.getString("TABLE_NAME")); - assertTrue(rs.next()); - assertNull(rs.getString("TABLE_CAT")); - assertEquals("B", rs.getString("TABLE_SCHEM")); - assertEquals("S3", rs.getString("TABLE_NAME")); - assertTrue(rs.next()); - assertNull(rs.getString("TABLE_CAT")); - assertEquals("C", rs.getString("TABLE_SCHEM")); - assertEquals("S1", rs.getString("TABLE_NAME")); - assertFalse(rs.next()); - - conn.createStatement().execute("CREATE TABLE foo (k bigint primary key)"); - conn.createStatement().execute("CREATE TABLE z.bas (k bigint primary key)"); - - props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 30)); - conn = DriverManager.getConnection(getUrl(), props); - dbmd = conn.getMetaData(); - rs = dbmd.getTables(null, null, null, new String[] {PTableType.TABLE.toString(),PhoenixDatabaseMetaData.SEQUENCE_TABLE_TYPE}); - assertTrue(rs.next()); - assertNull(rs.getString("TABLE_CAT")); - assertEquals("A", rs.getString("TABLE_SCHEM")); - assertEquals("S2", rs.getString("TABLE_NAME")); - assertEquals(PhoenixDatabaseMetaData.SEQUENCE_TABLE_TYPE, rs.getString("TABLE_TYPE")); - assertTrue(rs.next()); - assertNull(rs.getString("TABLE_CAT")); - assertEquals("B", rs.getString("TABLE_SCHEM")); - assertEquals("S1", rs.getString("TABLE_NAME")); - assertEquals(PhoenixDatabaseMetaData.SEQUENCE_TABLE_TYPE, rs.getString("TABLE_TYPE")); - assertTrue(rs.next()); - assertNull(rs.getString("TABLE_CAT")); - assertEquals("B", rs.getString("TABLE_SCHEM")); - assertEquals("S3", rs.getString("TABLE_NAME")); - assertEquals(PhoenixDatabaseMetaData.SEQUENCE_TABLE_TYPE, rs.getString("TABLE_TYPE")); - assertTrue(rs.next()); - assertNull(rs.getString("TABLE_CAT")); - assertEquals("C", rs.getString("TABLE_SCHEM")); - assertEquals("S1", rs.getString("TABLE_NAME")); - assertEquals(PhoenixDatabaseMetaData.SEQUENCE_TABLE_TYPE, rs.getString("TABLE_TYPE")); - assertTrue(rs.next()); - assertNull(rs.getString("TABLE_CAT")); - assertNull(rs.getString("TABLE_SCHEM")); - assertEquals("FOO", rs.getString("TABLE_NAME")); - assertEquals(PTableType.TABLE.toString(), rs.getString("TABLE_TYPE")); - assertTrue(rs.next()); - assertNull(rs.getString("TABLE_CAT")); - assertEquals("Z", rs.getString("TABLE_SCHEM")); - assertEquals("BAS", rs.getString("TABLE_NAME")); - assertEquals(PTableType.TABLE.toString(), rs.getString("TABLE_TYPE")); - assertFalse(rs.next()); - - rs = dbmd.getTables(null, "B", null, new String[] {PhoenixDatabaseMetaData.SEQUENCE_TABLE_TYPE}); - assertTrue(rs.next()); - assertNull(rs.getString("TABLE_CAT")); - assertEquals("B", rs.getString("TABLE_SCHEM")); - assertEquals("S1", rs.getString("TABLE_NAME")); - assertEquals(PhoenixDatabaseMetaData.SEQUENCE_TABLE_TYPE, rs.getString("TABLE_TYPE")); - assertTrue(rs.next()); - assertNull(rs.getString("TABLE_CAT")); - assertEquals("B", rs.getString("TABLE_SCHEM")); - assertEquals("S3", rs.getString("TABLE_NAME")); - assertEquals(PhoenixDatabaseMetaData.SEQUENCE_TABLE_TYPE, rs.getString("TABLE_TYPE")); - assertFalse(rs.next()); + try (Connection conn = DriverManager.getConnection(getUrl())) { + String schema1 = "B" + generateUniqueName(); + String seq1 = generateUniqueName(); + String seq1FullName = schema1 + "." + seq1; + String schema2 = generateUniqueName(); + String seq2 = generateUniqueName(); + String seq2FullName = schema2 + "." + seq2; + String schema3 = schema1; + String seq3 = generateUniqueName(); + String seq3FullName = schema3 + "." + seq3; + String schema4 = generateUniqueName(); + String seq4 = seq1; + String seq4FullName = schema4 + "." + seq4; + conn.createStatement().execute("CREATE SEQUENCE " + seq1FullName); + conn.createStatement().execute("CREATE SEQUENCE " + seq2FullName); + conn.createStatement().execute("CREATE SEQUENCE " + seq3FullName); + conn.createStatement().execute("CREATE SEQUENCE " + seq4FullName); + DatabaseMetaData dbmd = conn.getMetaData(); + ResultSet rs = dbmd.getTables(null, null, null, new String[] { "FOO" }); + assertFalse(rs.next()); + rs = + dbmd.getTables(null, null, null, + new String[] { "FOO", PhoenixDatabaseMetaData.SEQUENCE_TABLE_TYPE }); + assertTrue(rs.next()); + assertNull(rs.getString("TABLE_CAT")); + assertEquals(schema1, rs.getString("TABLE_SCHEM")); + assertEquals(seq1, rs.getString("TABLE_NAME")); + assertTrue(rs.next()); + assertNull(rs.getString("TABLE_CAT")); + assertEquals(schema3, rs.getString("TABLE_SCHEM")); + assertEquals(seq3, rs.getString("TABLE_NAME")); + assertTrue(rs.next()); + assertNull(rs.getString("TABLE_CAT")); + assertEquals(schema2, rs.getString("TABLE_SCHEM")); + assertEquals(seq2, rs.getString("TABLE_NAME")); + assertTrue(rs.next()); + assertNull(rs.getString("TABLE_CAT")); + assertEquals(schema4, rs.getString("TABLE_SCHEM")); + assertEquals(seq4, rs.getString("TABLE_NAME")); + assertFalse(rs.next()); + + String foo = generateUniqueName(); + String basSchema = generateUniqueName(); + String bas = generateUniqueName(); + conn.createStatement().execute("CREATE TABLE " + foo + " (k bigint primary key)"); + conn.createStatement() + .execute("CREATE TABLE " + basSchema + "." + bas + " (k bigint primary key)"); + + dbmd = conn.getMetaData(); + rs = + dbmd.getTables(null, null, null, new String[] { PTableType.TABLE.toString(), + PhoenixDatabaseMetaData.SEQUENCE_TABLE_TYPE }); + assertTrue(rs.next()); + assertNull(rs.getString("TABLE_CAT")); + assertEquals(schema1, rs.getString("TABLE_SCHEM")); + assertEquals(seq1, rs.getString("TABLE_NAME")); + assertEquals(PhoenixDatabaseMetaData.SEQUENCE_TABLE_TYPE, rs.getString("TABLE_TYPE")); + assertTrue(rs.next()); + assertNull(rs.getString("TABLE_CAT")); + assertEquals(schema3, rs.getString("TABLE_SCHEM")); + assertEquals(seq3, rs.getString("TABLE_NAME")); + assertEquals(PhoenixDatabaseMetaData.SEQUENCE_TABLE_TYPE, rs.getString("TABLE_TYPE")); + assertTrue(rs.next()); + assertNull(rs.getString("TABLE_CAT")); + assertEquals(schema2, rs.getString("TABLE_SCHEM")); + assertEquals(seq2, rs.getString("TABLE_NAME")); + assertEquals(PhoenixDatabaseMetaData.SEQUENCE_TABLE_TYPE, rs.getString("TABLE_TYPE")); + assertTrue(rs.next()); + assertNull(rs.getString("TABLE_CAT")); + assertEquals(schema4, rs.getString("TABLE_SCHEM")); + assertEquals(seq4, rs.getString("TABLE_NAME")); + assertEquals(PhoenixDatabaseMetaData.SEQUENCE_TABLE_TYPE, rs.getString("TABLE_TYPE")); + assertTrue(rs.next()); + assertNull(rs.getString("TABLE_CAT")); + assertNull(rs.getString("TABLE_SCHEM")); + assertEquals(foo, rs.getString("TABLE_NAME")); + assertEquals(PTableType.TABLE.toString(), rs.getString("TABLE_TYPE")); + assertTrue(rs.next()); + assertNull(rs.getString("TABLE_CAT")); + assertEquals(basSchema, rs.getString("TABLE_SCHEM")); + assertEquals(bas, rs.getString("TABLE_NAME")); + assertEquals(PTableType.TABLE.toString(), rs.getString("TABLE_TYPE")); + assertFalse(rs.next()); + + rs = + dbmd.getTables(null, "B%", null, + new String[] { PhoenixDatabaseMetaData.SEQUENCE_TABLE_TYPE }); + assertTrue(rs.next()); + assertNull(rs.getString("TABLE_CAT")); + assertEquals(schema1, rs.getString("TABLE_SCHEM")); + assertEquals(seq1, rs.getString("TABLE_NAME")); + assertEquals(PhoenixDatabaseMetaData.SEQUENCE_TABLE_TYPE, rs.getString("TABLE_TYPE")); + assertTrue(rs.next()); + assertNull(rs.getString("TABLE_CAT")); + assertEquals(schema3, rs.getString("TABLE_SCHEM")); + assertEquals(seq3, rs.getString("TABLE_NAME")); + assertEquals(PhoenixDatabaseMetaData.SEQUENCE_TABLE_TYPE, rs.getString("TABLE_TYPE")); + assertFalse(rs.next()); + } } - + @Test public void testSchemaMetadataScan() throws SQLException { - long ts = nextTimestamp(); - ensureTableCreated(getUrl(), CUSTOM_ENTITY_DATA_FULL_NAME, CUSTOM_ENTITY_DATA_FULL_NAME, ts); - ensureTableCreated(getUrl(), PTSDB_NAME, PTSDB_NAME, ts); - Properties props = new Properties(); - props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 5)); - Connection conn = DriverManager.getConnection(getUrl(), props); - DatabaseMetaData dbmd = conn.getMetaData(); - ResultSet rs; - rs = dbmd.getSchemas(null, CUSTOM_ENTITY_DATA_SCHEMA_NAME); - assertTrue(rs.next()); - assertEquals(rs.getString(1),CUSTOM_ENTITY_DATA_SCHEMA_NAME); - assertEquals(rs.getString(2),null); - assertFalse(rs.next()); + String table1 = generateUniqueName(); + String schema1 = generateUniqueName(); + String fullTable1 = schema1 + "." + table1; + ensureTableCreated(getUrl(), fullTable1, CUSTOM_ENTITY_DATA_FULL_NAME, null); + String fullTable2 = generateUniqueName(); + ensureTableCreated(getUrl(), fullTable2, PTSDB_NAME, null); + try (Connection conn = DriverManager.getConnection(getUrl())) { + DatabaseMetaData dbmd = conn.getMetaData(); + ResultSet rs; + rs = dbmd.getSchemas(null, schema1); + assertTrue(rs.next()); + assertEquals(rs.getString(1), schema1); + assertEquals(rs.getString(2), null); + assertFalse(rs.next()); - rs = dbmd.getSchemas(null, null); - assertTrue(rs.next()); - assertEquals(rs.getString("TABLE_SCHEM"),null); - assertEquals(rs.getString("TABLE_CATALOG"),null); - assertTrue(rs.next()); - assertEquals(rs.getString("TABLE_SCHEM"),CUSTOM_ENTITY_DATA_SCHEMA_NAME); - assertEquals(rs.getString("TABLE_CATALOG"),null); - assertTrue(rs.next()); - assertEquals(rs.getString("TABLE_SCHEM"),PhoenixDatabaseMetaData.SYSTEM_CATALOG_SCHEMA); - assertEquals(rs.getString("TABLE_CATALOG"),null); - assertFalse(rs.next()); + rs = dbmd.getSchemas(null, null); + assertTrue(rs.next()); + assertEquals(null, rs.getString("TABLE_SCHEM")); + assertEquals(null, rs.getString("TABLE_CATALOG")); + assertTrue(rs.next()); + assertEquals(PhoenixDatabaseMetaData.SYSTEM_CATALOG_SCHEMA, + rs.getString("TABLE_SCHEM")); + assertEquals(null, rs.getString("TABLE_CATALOG")); + assertTrue(rs.next()); + assertEquals(schema1, rs.getString("TABLE_SCHEM")); + assertEquals(null, rs.getString("TABLE_CATALOG")); + assertFalse(rs.next()); + } } @Test public void testColumnMetadataScan() throws SQLException { - long ts = nextTimestamp(); - Properties props = new Properties(); - props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); - Connection conn = DriverManager.getConnection(getUrl(), props); - createMDTestTable(conn, MDTEST_NAME, ""); - conn.close(); - props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 5)); - conn = DriverManager.getConnection(getUrl(), props); + Connection conn = DriverManager.getConnection(getUrl()); + String table = generateUniqueName(); + createMDTestTable(conn, table, ""); DatabaseMetaData dbmd = conn.getMetaData(); ResultSet rs; - rs = dbmd.getColumns(null, "", MDTEST_NAME, null); + rs = dbmd.getColumns(null, "", table, null); assertTrue(rs.next()); - - assertEquals(rs.getString("TABLE_SCHEM"),null); - assertEquals(MDTEST_NAME, rs.getString("TABLE_NAME")); + assertEquals(rs.getString("TABLE_SCHEM"), null); + assertEquals(table, rs.getString("TABLE_NAME")); assertEquals(null, rs.getString("TABLE_CAT")); assertEquals(SchemaUtil.normalizeIdentifier("id"), rs.getString("COLUMN_NAME")); assertEquals(DatabaseMetaData.attributeNoNulls, rs.getShort("NULLABLE")); @@ -345,8 +358,8 @@ public class QueryDatabaseMetaDataIT extends BaseClientManagedTimeIT { assertEquals(0, rs.getInt("DECIMAL_DIGITS")); assertTrue(rs.next()); - assertEquals(rs.getString("TABLE_SCHEM"),null); - assertEquals(MDTEST_NAME, rs.getString("TABLE_NAME")); + assertEquals(rs.getString("TABLE_SCHEM"), null); + assertEquals(table, rs.getString("TABLE_NAME")); assertEquals(SchemaUtil.normalizeIdentifier("a"), rs.getString("COLUMN_FAMILY")); assertEquals(SchemaUtil.normalizeIdentifier("col1"), rs.getString("COLUMN_NAME")); assertEquals(DatabaseMetaData.attributeNullable, rs.getShort("NULLABLE")); @@ -358,8 +371,8 @@ public class QueryDatabaseMetaDataIT extends BaseClientManagedTimeIT { assertTrue(rs.wasNull()); assertTrue(rs.next()); - assertEquals(rs.getString("TABLE_SCHEM"),null); - assertEquals(MDTEST_NAME, rs.getString("TABLE_NAME")); + assertEquals(rs.getString("TABLE_SCHEM"), null); + assertEquals(table, rs.getString("TABLE_NAME")); assertEquals(SchemaUtil.normalizeIdentifier("b"), rs.getString("COLUMN_FAMILY")); assertEquals(SchemaUtil.normalizeIdentifier("col2"), rs.getString("COLUMN_NAME")); assertEquals(DatabaseMetaData.attributeNullable, rs.getShort("NULLABLE")); @@ -371,8 +384,8 @@ public class QueryDatabaseMetaDataIT extends BaseClientManagedTimeIT { assertTrue(rs.wasNull()); assertTrue(rs.next()); - assertEquals(rs.getString("TABLE_SCHEM"),null); - assertEquals(MDTEST_NAME, rs.getString("TABLE_NAME")); + assertEquals(rs.getString("TABLE_SCHEM"), null); + assertEquals(table, rs.getString("TABLE_NAME")); assertEquals(SchemaUtil.normalizeIdentifier("b"), rs.getString("COLUMN_FAMILY")); assertEquals(SchemaUtil.normalizeIdentifier("col3"), rs.getString("COLUMN_NAME")); assertEquals(DatabaseMetaData.attributeNullable, rs.getShort("NULLABLE")); @@ -384,8 +397,8 @@ public class QueryDatabaseMetaDataIT extends BaseClientManagedTimeIT { assertTrue(rs.wasNull()); assertTrue(rs.next()); - assertEquals(rs.getString("TABLE_SCHEM"),null); - assertEquals(MDTEST_NAME, rs.getString("TABLE_NAME")); + assertEquals(rs.getString("TABLE_SCHEM"), null); + assertEquals(table, rs.getString("TABLE_NAME")); assertEquals(SchemaUtil.normalizeIdentifier("b"), rs.getString("COLUMN_FAMILY")); assertEquals(SchemaUtil.normalizeIdentifier("col4"), rs.getString("COLUMN_NAME")); assertEquals(DatabaseMetaData.attributeNullable, rs.getShort("NULLABLE")); @@ -395,8 +408,8 @@ public class QueryDatabaseMetaDataIT extends BaseClientManagedTimeIT { assertEquals(0, rs.getInt("DECIMAL_DIGITS")); assertTrue(rs.next()); - assertEquals(rs.getString("TABLE_SCHEM"),null); - assertEquals(MDTEST_NAME, rs.getString("TABLE_NAME")); + assertEquals(rs.getString("TABLE_SCHEM"), null); + assertEquals(table, rs.getString("TABLE_NAME")); assertEquals(SchemaUtil.normalizeIdentifier("b"), rs.getString("COLUMN_FAMILY")); assertEquals(SchemaUtil.normalizeIdentifier("col5"), rs.getString("COLUMN_NAME")); assertEquals(DatabaseMetaData.attributeNullable, rs.getShort("NULLABLE")); @@ -408,10 +421,10 @@ public class QueryDatabaseMetaDataIT extends BaseClientManagedTimeIT { assertFalse(rs.next()); // Look up only columns in a column family - rs = dbmd.getColumns(null, "", MDTEST_NAME, "A."); + rs = dbmd.getColumns(null, "", table, "A."); assertTrue(rs.next()); - assertEquals(rs.getString("TABLE_SCHEM"),null); - assertEquals(MDTEST_NAME, rs.getString("TABLE_NAME")); + assertEquals(rs.getString("TABLE_SCHEM"), null); + assertEquals(table, rs.getString("TABLE_NAME")); assertEquals(SchemaUtil.normalizeIdentifier("a"), rs.getString("COLUMN_FAMILY")); assertEquals(SchemaUtil.normalizeIdentifier("col1"), rs.getString("COLUMN_NAME")); assertEquals(DatabaseMetaData.attributeNullable, rs.getShort("NULLABLE")); @@ -425,10 +438,10 @@ public class QueryDatabaseMetaDataIT extends BaseClientManagedTimeIT { assertFalse(rs.next()); // Look up KV columns in a column family - rs = dbmd.getColumns("", "", MDTEST_NAME, "%.COL%"); + rs = dbmd.getColumns("", "", table, "%.COL%"); assertTrue(rs.next()); - assertEquals(rs.getString("TABLE_SCHEM"),null); - assertEquals(MDTEST_NAME, rs.getString("TABLE_NAME")); + assertEquals(rs.getString("TABLE_SCHEM"), null); + assertEquals(table, rs.getString("TABLE_NAME")); assertEquals(SchemaUtil.normalizeIdentifier("a"), rs.getString("COLUMN_FAMILY")); assertEquals(SchemaUtil.normalizeIdentifier("col1"), rs.getString("COLUMN_NAME")); assertEquals(DatabaseMetaData.attributeNullable, rs.getShort("NULLABLE")); @@ -440,8 +453,8 @@ public class QueryDatabaseMetaDataIT extends BaseClientManagedTimeIT { assertTrue(rs.wasNull()); assertTrue(rs.next()); - assertEquals(rs.getString("TABLE_SCHEM"),null); - assertEquals(MDTEST_NAME, rs.getString("TABLE_NAME")); + assertEquals(rs.getString("TABLE_SCHEM"), null); + assertEquals(table, rs.getString("TABLE_NAME")); assertEquals(SchemaUtil.normalizeIdentifier("b"), rs.getString("COLUMN_FAMILY")); assertEquals(SchemaUtil.normalizeIdentifier("col2"), rs.getString("COLUMN_NAME")); assertEquals(DatabaseMetaData.attributeNullable, rs.getShort("NULLABLE")); @@ -453,8 +466,8 @@ public class QueryDatabaseMetaDataIT extends BaseClientManagedTimeIT { assertTrue(rs.wasNull()); assertTrue(rs.next()); - assertEquals(rs.getString("TABLE_SCHEM"),null); - assertEquals(MDTEST_NAME, rs.getString("TABLE_NAME")); + assertEquals(rs.getString("TABLE_SCHEM"), null); + assertEquals(table, rs.getString("TABLE_NAME")); assertEquals(SchemaUtil.normalizeIdentifier("b"), rs.getString("COLUMN_FAMILY")); assertEquals(SchemaUtil.normalizeIdentifier("col3"), rs.getString("COLUMN_NAME")); assertEquals(DatabaseMetaData.attributeNullable, rs.getShort("NULLABLE")); @@ -466,8 +479,8 @@ public class QueryDatabaseMetaDataIT extends BaseClientManagedTimeIT { assertTrue(rs.wasNull()); assertTrue(rs.next()); - assertEquals(rs.getString("TABLE_SCHEM"),null); - assertEquals(MDTEST_NAME, rs.getString("TABLE_NAME")); + assertEquals(rs.getString("TABLE_SCHEM"), null); + assertEquals(table, rs.getString("TABLE_NAME")); assertEquals(SchemaUtil.normalizeIdentifier("b"), rs.getString("COLUMN_FAMILY")); assertEquals(SchemaUtil.normalizeIdentifier("col4"), rs.getString("COLUMN_NAME")); assertEquals(DatabaseMetaData.attributeNullable, rs.getShort("NULLABLE")); @@ -478,8 +491,8 @@ public class QueryDatabaseMetaDataIT extends BaseClientManagedTimeIT { assertFalse(rs.wasNull()); assertTrue(rs.next()); - assertEquals(rs.getString("TABLE_SCHEM"),null); - assertEquals(MDTEST_NAME, rs.getString("TABLE_NAME")); + assertEquals(rs.getString("TABLE_SCHEM"), null); + assertEquals(table, rs.getString("TABLE_NAME")); assertEquals(SchemaUtil.normalizeIdentifier("b"), rs.getString("COLUMN_FAMILY")); assertEquals(SchemaUtil.normalizeIdentifier("col5"), rs.getString("COLUMN_NAME")); assertEquals(DatabaseMetaData.attributeNullable, rs.getShort("NULLABLE")); @@ -489,790 +502,564 @@ public class QueryDatabaseMetaDataIT extends BaseClientManagedTimeIT { assertEquals(3, rs.getInt("DECIMAL_DIGITS")); assertFalse(rs.next()); - + // Look up KV columns in a column family - rs = dbmd.getColumns("", "", MDTEST_NAME, "B.COL2"); + rs = dbmd.getColumns("", "", table, "B.COL2"); assertTrue(rs.next()); - assertEquals(rs.getString("TABLE_SCHEM"),null); - assertEquals(MDTEST_NAME, rs.getString("TABLE_NAME")); + assertEquals(rs.getString("TABLE_SCHEM"), null); + assertEquals(table, rs.getString("TABLE_NAME")); assertEquals(SchemaUtil.normalizeIdentifier("b"), rs.getString("COLUMN_FAMILY")); assertEquals(SchemaUtil.normalizeIdentifier("col2"), rs.getString("COLUMN_NAME")); assertFalse(rs.next()); - ensureTableCreated(getUrl(), TABLE_WITH_SALTING, TABLE_WITH_SALTING, ts); - rs = dbmd.getColumns("", "", TABLE_WITH_SALTING, StringUtil.escapeLike("A_INTEGER")); + String table2 = generateUniqueName(); + ensureTableCreated(getUrl(), table2, TABLE_WITH_SALTING, null); + rs = dbmd.getColumns("", "", table2, StringUtil.escapeLike("A_INTEGER")); assertTrue(rs.next()); assertEquals(1, rs.getInt("ORDINAL_POSITION")); assertFalse(rs.next()); - + } @Test public void testPrimaryKeyMetadataScan() throws SQLException { - long ts = nextTimestamp(); - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts)); - Connection conn = DriverManager.getConnection(getUrl(), props); - createMDTestTable(conn, MDTEST_NAME, ""); - conn.close(); - ensureTableCreated(getUrl(), CUSTOM_ENTITY_DATA_FULL_NAME, CUSTOM_ENTITY_DATA_FULL_NAME, ts); - props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 5)); - conn = DriverManager.getConnection(getUrl(), props); - DatabaseMetaData dbmd = conn.getMetaData(); - ResultSet rs; - rs = dbmd.getPrimaryKeys(null, "", MDTEST_NAME); - assertTrue(rs.next()); - assertEquals(rs.getString("TABLE_SCHEM"),null); - assertEquals(MDTEST_NAME, rs.getString("TABLE_NAME")); - assertEquals(null, rs.getString("TABLE_CAT")); - assertEquals(SchemaUtil.normalizeIdentifier("id"), rs.getString("COLUMN_NAME")); - assertEquals(1, rs.getInt("KEY_SEQ")); - assertEquals(null, rs.getString("PK_NAME")); - assertFalse(rs.next()); - - rs = dbmd.getPrimaryKeys(null, CUSTOM_ENTITY_DATA_SCHEMA_NAME, CUSTOM_ENTITY_DATA_NAME); - assertTrue(rs.next()); - assertEquals(CUSTOM_ENTITY_DATA_SCHEMA_NAME, rs.getString("TABLE_SCHEM")); - assertEquals(CUSTOM_ENTITY_DATA_NAME, rs.getString("TABLE_NAME")); - assertEquals(null, rs.getString("TABLE_CAT")); - assertEquals(SchemaUtil.normalizeIdentifier("custom_entity_data_id"), rs.getString("COLUMN_NAME")); - assertEquals(3, rs.getInt("KEY_SEQ")); - assertEquals(SchemaUtil.normalizeIdentifier("pk"), rs.getString("PK_NAME")); + try (Connection conn = DriverManager.getConnection(getUrl())) { + String table1 = generateUniqueName(); + createMDTestTable(conn, table1, ""); + String schema2 = generateUniqueName(); + String table2 = generateUniqueName(); + String fullTable2 = schema2 + "." + table2; + ensureTableCreated(getUrl(), fullTable2, CUSTOM_ENTITY_DATA_FULL_NAME, null); + DatabaseMetaData dbmd = conn.getMetaData(); + ResultSet rs; + rs = dbmd.getPrimaryKeys(null, "", table1); + assertTrue(rs.next()); + assertEquals(rs.getString("TABLE_SCHEM"), null); + assertEquals(table1, rs.getString("TABLE_NAME")); + assertEquals(null, rs.getString("TABLE_CAT")); + assertEquals(SchemaUtil.normalizeIdentifier("id"), rs.getString("COLUMN_NAME")); + assertEquals(1, rs.getInt("KEY_SEQ")); + assertEquals(null, rs.getString("PK_NAME")); + assertFalse(rs.next()); - assertTrue(rs.next()); - assertEquals(CUSTOM_ENTITY_DATA_SCHEMA_NAME, rs.getString("TABLE_SCHEM")); - assertEquals(CUSTOM_ENTITY_DATA_NAME, rs.getString("TABLE_NAME")); - assertEquals(null, rs.getString("TABLE_CAT")); - assertEquals(SchemaUtil.normalizeIdentifier("key_prefix"), rs.getString("COLUMN_NAME")); - assertEquals(2, rs.getInt("KEY_SEQ")); - assertEquals(SchemaUtil.normalizeIdentifier("pk"), rs.getString("PK_NAME")); - - assertTrue(rs.next()); - assertEquals(CUSTOM_ENTITY_DATA_SCHEMA_NAME, rs.getString("TABLE_SCHEM")); - assertEquals(CUSTOM_ENTITY_DATA_NAME, rs.getString("TABLE_NAME")); - assertEquals(null, rs.getString("TABLE_CAT")); - assertEquals(SchemaUtil.normalizeIdentifier("organization_id"), rs.getString("COLUMN_NAME")); - assertEquals(1, rs.getInt("KEY_SEQ")); - assertEquals(SchemaUtil.normalizeIdentifier("pk"), rs.getString("PK_NAME")); // TODO: this is on the table row - - assertFalse(rs.next()); + rs = dbmd.getPrimaryKeys(null, schema2, table2); + assertTrue(rs.next()); + assertEquals(schema2, rs.getString("TABLE_SCHEM")); + assertEquals(table2, rs.getString("TABLE_NAME")); + assertEquals(null, rs.getString("TABLE_CAT")); + assertEquals(SchemaUtil.normalizeIdentifier("custom_entity_data_id"), + rs.getString("COLUMN_NAME")); + assertEquals(3, rs.getInt("KEY_SEQ")); + assertEquals(SchemaUtil.normalizeIdentifier("pk"), rs.getString("PK_NAME")); - rs = dbmd.getColumns("", CUSTOM_ENTITY_DATA_SCHEMA_NAME, CUSTOM_ENTITY_DATA_NAME, null); - assertTrue(rs.next()); - assertEquals(CUSTOM_ENTITY_DATA_SCHEMA_NAME, rs.getString("TABLE_SCHEM")); - assertEquals(CUSTOM_ENTITY_DATA_NAME, rs.getString("TABLE_NAME")); - assertEquals(null, rs.getString("TABLE_CAT")); - assertEquals(SchemaUtil.normalizeIdentifier("organization_id"), rs.getString("COLUMN_NAME")); - assertEquals(rs.getInt("COLUMN_SIZE"), 15); - - assertTrue(rs.next()); - assertEquals(CUSTOM_ENTITY_DATA_SCHEMA_NAME, rs.getString("TABLE_SCHEM")); - assertEquals(CUSTOM_ENTITY_DATA_NAME, rs.getString("TABLE_NAME")); - assertEquals(null, rs.getString("TABLE_CAT")); - assertEquals(SchemaUtil.normalizeIdentifier("key_prefix"), rs.getString("COLUMN_NAME")); - assertEquals(rs.getInt("COLUMN_SIZE"), 3); - - assertTrue(rs.next()); - assertEquals(CUSTOM_ENTITY_DATA_SCHEMA_NAME, rs.getString("TABLE_SCHEM")); - assertEquals(CUSTOM_ENTITY_DATA_NAME, rs.getString("TABLE_NAME")); - assertEquals(null, rs.getString("TABLE_CAT")); - assertEquals(SchemaUtil.normalizeIdentifier("custom_entity_data_id"), rs.getString("COLUMN_NAME")); - - // The above returns all columns, starting with the PK columns - assertTrue(rs.next()); - - rs = dbmd.getColumns("", CUSTOM_ENTITY_DATA_SCHEMA_NAME, CUSTOM_ENTITY_DATA_NAME, "KEY_PREFIX"); - assertTrue(rs.next()); - assertEquals(CUSTOM_ENTITY_DATA_SCHEMA_NAME, rs.getString("TABLE_SCHEM")); - assertEquals(CUSTOM_ENTITY_DATA_NAME, rs.getString("TABLE_NAME")); - assertEquals(null, rs.getString("TABLE_CAT")); - assertEquals(SchemaUtil.normalizeIdentifier("key_prefix"), rs.getString("COLUMN_NAME")); - - rs = dbmd.getColumns("", CUSTOM_ENTITY_DATA_SCHEMA_NAME, CUSTOM_ENTITY_DATA_NAME, "KEY_PREFIX"); - assertTrue(rs.next()); - assertEquals(CUSTOM_ENTITY_DATA_SCHEMA_NAME, rs.getString("TABLE_SCHEM")); - assertEquals(CUSTOM_ENTITY_DATA_NAME, rs.getString("TABLE_NAME")); - assertEquals(null, rs.getString("TABLE_CAT")); - assertEquals(SchemaUtil.normalizeIdentifier("key_prefix"), rs.getString("COLUMN_NAME")); - - assertFalse(rs.next()); - - conn.createStatement().execute("CREATE TABLE SALTEDTABLE123 (k INTEGER PRIMARY KEY, v VARCHAR) SALT_BUCKETS=3"); - conn.close(); - props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 10)); - conn = DriverManager.getConnection(getUrl(), props); - dbmd = conn.getMetaData(); - rs = dbmd.getPrimaryKeys(null, "", "SALTEDTABLE123"); - assertTrue(rs.next()); - assertEquals(null, rs.getString("TABLE_SCHEM")); - assertEquals("SALTEDTABLE123", rs.getString("TABLE_NAME")); - assertEquals(null, rs.getString("TABLE_CAT")); - assertEquals("K", rs.getString("COLUMN_NAME")); - assertEquals(1, rs.getInt("KEY_SEQ")); - assertEquals(null, rs.getString("PK_NAME")); - assertFalse(rs.next()); + assertTrue(rs.next()); + assertEquals(schema2, rs.getString("TABLE_SCHEM")); + assertEquals(table2, rs.getString("TABLE_NAME")); + assertEquals(null, rs.getString("TABLE_CAT")); + assertEquals(SchemaUtil.normalizeIdentifier("key_prefix"), rs.getString("COLUMN_NAME")); + assertEquals(2, rs.getInt("KEY_SEQ")); + assertEquals(SchemaUtil.normalizeIdentifier("pk"), rs.getString("PK_NAME")); + + assertTrue(rs.next()); + assertEquals(schema2, rs.getString("TABLE_SCHEM")); + assertEquals(table2, rs.getString("TABLE_NAME")); + assertEquals(null, rs.getString("TABLE_CAT")); + assertEquals(SchemaUtil.normalizeIdentifier("organization_id"), + rs.getString("COLUMN_NAME")); + assertEquals(1, rs.getInt("KEY_SEQ")); + assertEquals(SchemaUtil.normalizeIdentifier("pk"), rs.getString("PK_NAME")); // TODO: + // this is + // on the + // table + // row + + assertFalse(rs.next()); + + rs = dbmd.getColumns("", schema2, table2, null); + assertTrue(rs.next()); + assertEquals(schema2, rs.getString("TABLE_SCHEM")); + assertEquals(table2, rs.getString("TABLE_NAME")); + assertEquals(null, rs.getString("TABLE_CAT")); + assertEquals(SchemaUtil.normalizeIdentifier("organization_id"), + rs.getString("COLUMN_NAME")); + assertEquals(rs.getInt("COLUMN_SIZE"), 15); + + assertTrue(rs.next()); + assertEquals(schema2, rs.getString("TABLE_SCHEM")); + assertEquals(table2, rs.getString("TABLE_NAME")); + assertEquals(null, rs.getString("TABLE_CAT")); + assertEquals(SchemaUtil.normalizeIdentifier("key_prefix"), rs.getString("COLUMN_NAME")); + assertEquals(rs.getInt("COLUMN_SIZE"), 3); + + assertTrue(rs.next()); + assertEquals(schema2, rs.getString("TABLE_SCHEM")); + assertEquals(table2, rs.getString("TABLE_NAME")); + assertEquals(null, rs.getString("TABLE_CAT")); + assertEquals(SchemaUtil.normalizeIdentifier("custom_entity_data_id"), + rs.getString("COLUMN_NAME")); + + // The above returns all columns, starting with the PK columns + assertTrue(rs.next()); + + rs = dbmd.getColumns("", schema2, table2, "KEY_PREFIX"); + assertTrue(rs.next()); + assertEquals(schema2, rs.getString("TABLE_SCHEM")); + assertEquals(table2, rs.getString("TABLE_NAME")); + assertEquals(null, rs.getString("TABLE_CAT")); + assertEquals(SchemaUtil.normalizeIdentifier("key_prefix"), rs.getString("COLUMN_NAME")); + + rs = dbmd.getColumns("", schema2, table2, "KEY_PREFIX"); + assertTrue(rs.next()); + assertEquals(schema2, rs.getString("TABLE_SCHEM")); + assertEquals(table2, rs.getString("TABLE_NAME")); + assertEquals(null, rs.getString("TABLE_CAT")); + assertEquals(SchemaUtil.normalizeIdentifier("key_prefix"), rs.getString("COLUMN_NAME")); + + assertFalse(rs.next()); + + String table3 = generateUniqueName(); + conn.createStatement().execute( + "CREATE TABLE " + table3 + " (k INTEGER PRIMARY KEY, v VARCHAR) SALT_BUCKETS=3"); + dbmd = conn.getMetaData(); + rs = dbmd.getPrimaryKeys(null, "", table3); + assertTrue(rs.next()); + assertEquals(null, rs.getString("TABLE_SCHEM")); + assertEquals(table3, rs.getString("TABLE_NAME")); + assertEquals(null, rs.getString("TABLE_CAT")); + assertEquals("K", rs.getString("COLUMN_NAME")); + assertEquals(1, rs.getInt("KEY_SEQ")); + assertEquals(null, rs.getString("PK_NAME")); + assertFalse(rs.next()); + } } - + @Test public void testMultiTableColumnsMetadataScan() throws SQLException { - long ts = nextTimestamp(); - Properties props = new Properties(); - props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts)); - Connection conn = DriverManager.getConnection(getUrl(), props); - createGroupByTestTable(conn, GROUPBYTEST_NAME); - createMDTestTable(conn, MDTEST_NAME, ""); - conn.close(); - ensureTableCreated(getUrl(), PTSDB_NAME, PTSDB_NAME, ts); - ensureTableCreated(getUrl(), CUSTOM_ENTITY_DATA_FULL_NAME, CUSTOM_ENTITY_DATA_FULL_NAME, ts); - props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 5)); - conn = DriverManager.getConnection(getUrl(), props); - DatabaseMetaData dbmd = conn.getMetaData(); - ResultSet rs = dbmd.getColumns(null, "", "%TEST%", null); - assertTrue(rs.next()); - assertEquals(rs.getString("TABLE_SCHEM"),null); - assertEquals(rs.getString("TABLE_NAME"),GROUPBYTEST_NAME); - assertEquals(null, rs.getString("COLUMN_FAMILY")); - assertEquals(SchemaUtil.normalizeIdentifier("id"), rs.getString("COLUMN_NAME")); - assertTrue(rs.next()); - assertEquals(rs.getString("TABLE_SCHEM"),null); - assertEquals(rs.getString("TABLE_NAME"),GROUPBYTEST_NAME); - assertEquals(PhoenixDatabaseMetaData.TABLE_FAMILY, rs.getString("COLUMN_FAMILY")); - assertEquals(SchemaUtil.normalizeIdentifier("uri"), rs.getString("COLUMN_NAME")); - assertTrue(rs.next()); - assertEquals(rs.getString("TABLE_SCHEM"),null); - assertEquals(rs.getString("TABLE_NAME"),GROUPBYTEST_NAME); - assertEquals(PhoenixDatabaseMetaData.TABLE_FAMILY, rs.getString("COLUMN_FAMILY")); - assertEquals(SchemaUtil.normalizeIdentifier("appcpu"), rs.getString("COLUMN_NAME")); - assertTrue(rs.next()); - assertEquals(rs.getString("TABLE_SCHEM"),null); - assertEquals(rs.getString("TABLE_NAME"),MDTEST_NAME); - assertEquals(null, rs.getString("COLUMN_FAMILY")); - assertEquals(SchemaUtil.normalizeIdentifier("id"), rs.getString("COLUMN_NAME")); - assertTrue(rs.next()); - assertEquals(rs.getString("TABLE_SCHEM"),null); - assertEquals(rs.getString("TABLE_NAME"),MDTEST_NAME); - assertEquals(SchemaUtil.normalizeIdentifier("a"), rs.getString("COLUMN_FAMILY")); - assertEquals(SchemaUtil.normalizeIdentifier("col1"), rs.getString("COLUMN_NAME")); - assertTrue(rs.next()); - assertEquals(rs.getString("TABLE_SCHEM"),null); - assertEquals(rs.getString("TABLE_NAME"),MDTEST_NAME); - assertEquals(SchemaUtil.normalizeIdentifier("b"), rs.getString("COLUMN_FAMILY")); - assertEquals(SchemaUtil.normalizeIdentifier("col2"), rs.getString("COLUMN_NAME")); - assertTrue(rs.next()); - assertEquals(rs.getString("TABLE_SCHEM"),null); - assertEquals(rs.getString("TABLE_NAME"),MDTEST_NAME); - assertEquals(SchemaUtil.normalizeIdentifier("b"), rs.getString("COLUMN_FAMILY")); - assertEquals(SchemaUtil.normalizeIdentifier("col3"), rs.getString("COLUMN_NAME")); - assertTrue(rs.next()); - assertEquals(rs.getString("TABLE_SCHEM"),null); - assertEquals(rs.getString("TABLE_NAME"),MDTEST_NAME); - assertEquals(SchemaUtil.normalizeIdentifier("b"), rs.getString("COLUMN_FAMILY")); - assertEquals(SchemaUtil.normalizeIdentifier("col4"), rs.getString("COLUMN_NAME")); - assertTrue(rs.next()); - assertEquals(rs.getString("TABLE_SCHEM"),null); - assertEquals(rs.getString("TABLE_NAME"),MDTEST_NAME); - assertEquals(SchemaUtil.normalizeIdentifier("b"), rs.getString("COLUMN_FAMILY")); - assertEquals(SchemaUtil.normalizeIdentifier("col5"), rs.getString("COLUMN_NAME")); - assertFalse(rs.next()); - } - - @Test - public void testCreateDropTable() throws Exception { - long ts = nextTimestamp(); - String tenantId = getOrganizationId(); - initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId), null, ts, getUrl(), HColumnDescriptor.KEEP_DELETED_CELLS + "=" + Boolean.TRUE); - - ensureTableCreated(getUrl(), BTABLE_NAME, BTABLE_NAME, ts-2); - ensureTableCreated(getUrl(), PTSDB_NAME, PTSDB_NAME, ts-2); - - Properties props = new Properties(); - props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 5)); - Connection conn5 = DriverManager.getConnection(getUrl(), props); - String query = "SELECT a_string FROM aTable"; - // Data should still be there b/c we only dropped the schema - props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 8)); - assertTrue(conn5.prepareStatement(query).executeQuery().next()); - conn5.createStatement().executeUpdate("DROP TABLE " + ATABLE_NAME); - - // Confirm that data is no longer there because we dropped the table - // This needs to be done natively b/c the metadata is gone - HTableInterface htable = conn5.unwrap(PhoenixConnection.class).getQueryServices().getTable(SchemaUtil.getTableNameAsBytes(ATABLE_SCHEMA_NAME, ATABLE_NAME)); - Scan scan = new Scan(); - scan.setFilter(new FirstKeyOnlyFilter()); - scan.setTimeRange(0, ts+9); - assertNull(htable.getScanner(scan).next()); - conn5.close(); - - // Still should work b/c we're at an earlier timestamp than when table was deleted - props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); - Connection conn2 = DriverManager.getConnection(getUrl(), props); - assertTrue(conn2.prepareStatement(query).executeQuery().next()); - conn2.close(); - - props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 10)); - Connection conn10 = DriverManager.getConnection(getUrl(), props); - try { - conn10.prepareStatement(query).executeQuery().next(); - fail(); - } catch (TableNotFoundException e) { + try (Connection conn = DriverManager.getConnection(getUrl())) { + String table1 = "TEST" + generateUniqueName(); + String table2 = "TEST" + generateUniqueName(); + createGroupByTestTable(conn, table1); + createMDTestTable(conn, table2, ""); + String table3 = generateUniqueName(); + ensureTableCreated(getUrl(), table3, PTSDB_NAME, null); + String table4 = generateUniqueName(); + ensureTableCreated(getUrl(), table4, CUSTOM_ENTITY_DATA_FULL_NAME, null); + DatabaseMetaData dbmd = conn.getMetaData(); + ResultSet rs = dbmd.getColumns(null, "", "%TEST%", null); + assertTrue(rs.next()); + assertEquals(rs.getString("TABLE_SCHEM"), null); + assertEquals(rs.getString("TABLE_NAME"), table1); + assertEquals(null, rs.getString("COLUMN_FAMILY")); + assertEquals(SchemaUtil.normalizeIdentifier("id"), rs.getString("COLUMN_NAME")); + assertTrue(rs.next()); + assertEquals(rs.getString("TABLE_SCHEM"), null); + assertEquals(rs.getString("TABLE_NAME"), table1); + assertEquals(PhoenixDatabaseMetaData.TABLE_FAMILY, rs.getString("COLUMN_FAMILY")); + assertEquals(SchemaUtil.normalizeIdentifier("uri"), rs.getString("COLUMN_NAME")); + assertTrue(rs.next()); + assertEquals(rs.getString("TABLE_SCHEM"), null); + assertEquals(rs.getString("TABLE_NAME"), table1); + assertEquals(PhoenixDatabaseMetaData.TABLE_FAMILY, rs.getString("COLUMN_FAMILY")); + assertEquals(SchemaUtil.normalizeIdentifier("appcpu"), rs.getString("COLUMN_NAME")); + assertTrue(rs.next()); + assertEquals(rs.getString("TABLE_SCHEM"), null); + assertEquals(rs.getString("TABLE_NAME"), table2); + assertEquals(null, rs.getString("COLUMN_FAMILY")); + assertEquals(SchemaUtil.normalizeIdentifier("id"), rs.getString("COLUMN_NAME")); + assertTrue(rs.next()); + assertEquals(rs.getString("TABLE_SCHEM"), null); + assertEquals(rs.getString("TABLE_NAME"), table2); + assertEquals(SchemaUtil.normalizeIdentifier("a"), rs.getString("COLUMN_FAMILY")); + assertEquals(SchemaUtil.normalizeIdentifier("col1"), rs.getString("COLUMN_NAME")); + assertTrue(rs.next()); + assertEquals(rs.getString("TABLE_SCHEM"), null); + assertEquals(rs.getString("TABLE_NAME"), table2); + assertEquals(SchemaUtil.normalizeIdentifier("b"), rs.getString("COLUMN_FAMILY")); + assertEquals(SchemaUtil.normalizeIdentifier("col2"), rs.getString("COLUMN_NAME")); + assertTrue(rs.next()); + assertEquals(rs.getString("TABLE_SCHEM"), null); + assertEquals(rs.getString("TABLE_NAME"), table2); + assertEquals(SchemaUtil.normalizeIdentifier("b"), rs.getString("COLUMN_FAMILY")); + assertEquals(SchemaUtil.normalizeIdentifier("col3"), rs.getString("COLUMN_NAME")); + assertTrue(rs.next()); + assertEquals(rs.getString("TABLE_SCHEM"), null); + assertEquals(rs.getString("TABLE_NAME"), table2); + assertEquals(SchemaUtil.normalizeIdentifier("b"), rs.getString("COLUMN_FAMILY")); + assertEquals(SchemaUtil.normalizeIdentifier("col4"), rs.getString("COLUMN_NAME")); + assertTrue(rs.next()); + assertEquals(rs.getString("TABLE_SCHEM"), null); + assertEquals(rs.getString("TABLE_NAME"), table2); + assertEquals(SchemaUtil.normalizeIdentifier("b"), rs.getString("COLUMN_FAMILY")); + assertEquals(SchemaUtil.normalizeIdentifier("col5"), rs.getString("COLUMN_NAME")); + assertFalse(rs.next()); } } - + @Test public void testCreateOnExistingTable() throws Exception { - long ts = nextTimestamp(); - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts)); - PhoenixConnection pconn = DriverManager.getConnection(getUrl(), props).unwrap(PhoenixConnection.class); - String tableName = MDTEST_NAME; - String schemaName = MDTEST_SCHEMA_NAME; - byte[] cfA = Bytes.toBytes(SchemaUtil.normalizeIdentifier("a")); - byte[] cfB = Bytes.toBytes(SchemaUtil.normalizeIdentifier("b")); - byte[] cfC = Bytes.toBytes("c"); - byte[][] familyNames = new byte[][] {cfB, cfC}; - byte[] htableName = SchemaUtil.getTableNameAsBytes(schemaName, tableName); - HBaseAdmin admin = pconn.getQueryServices().getAdmin(); - try { - admin.disableTable(htableName); - admin.deleteTable(htableName); - admin.enableTable(htableName); - } catch (org.apache.hadoop.hbase.TableNotFoundException e) { - } - - @SuppressWarnings("deprecation") - HTableDescriptor descriptor = new HTableDescriptor(htableName); - for (byte[] familyName : familyNames) { - HColumnDescriptor columnDescriptor = new HColumnDescriptor(familyName); - descriptor.addFamily(columnDescriptor); - } - admin.createTable(descriptor); - - ts = nextTimestamp(); - props = new Properties(); - props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); - props.setProperty(QueryServices.DEFAULT_KEEP_DELETED_CELLS_ATTRIB, Boolean.TRUE.toString()); - PhoenixConnection conn0 = DriverManager.getConnection(getUrl(), props).unwrap(PhoenixConnection.class); - createMDTestTable(conn0,tableName, "a." + HColumnDescriptor.KEEP_DELETED_CELLS + "=" + Boolean.TRUE); - conn0.close(); - - descriptor = admin.getTableDescriptor(htableName); - assertEquals(3,descriptor.getColumnFamilies().length); - HColumnDescriptor cdA = descriptor.getFamily(cfA); - assertNotEquals(HColumnDescriptor.DEFAULT_KEEP_DELETED, cdA.getKeepDeletedCells()); - assertEquals(DataBlockEncoding.NONE, cdA.getDataBlockEncoding()); // Overriden using WITH - assertEquals(1,cdA.getMaxVersions());// Overriden using WITH - HColumnDescriptor cdB = descriptor.getFamily(cfB); - // Allow KEEP_DELETED_CELLS to be false for VIEW - assertEquals(HColumnDescriptor.DEFAULT_KEEP_DELETED, cdB.getKeepDeletedCells()); - assertEquals(DataBlockEncoding.NONE, cdB.getDataBlockEncoding()); // Should keep the original value. - // CF c should stay the same since it's not a Phoenix cf. - HColumnDescriptor cdC = descriptor.getFamily(cfC); - assertNotNull("Column family not found", cdC); - assertEquals(HColumnDescriptor.DEFAULT_KEEP_DELETED, cdC.getKeepDeletedCells()); - assertFalse(SchemaUtil.DEFAULT_DATA_BLOCK_ENCODING == cdC.getDataBlockEncoding()); - assertTrue(descriptor.hasCoprocessor(UngroupedAggregateRegionObserver.class.getName())); - assertTrue(descriptor.hasCoprocessor(GroupedAggregateRegionObserver.class.getName())); - assertTrue(descriptor.hasCoprocessor(ServerCachingEndpointImpl.class.getName())); - admin.close(); - - props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 5)); - props.setProperty(QueryServices.DEFAULT_KEEP_DELETED_CELLS_ATTRIB, Boolean.TRUE.toString()); - PhoenixConnection conn1 = DriverManager.getConnection(getUrl(), props).unwrap(PhoenixConnection.class); - int rowCount = 5; - String upsert = "UPSERT INTO " + tableName + "(id,col1,col2) VALUES(?,?,?)"; - PreparedStatement ps = conn1.prepareStatement(upsert); - for (int i = 0; i < rowCount; i++) { - ps.setString(1, Integer.toString(i)); - ps.setInt(2, i+1); - ps.setInt(3, i+2); - ps.execute(); - } - conn1.commit(); - conn1.close(); - - props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 6)); - Connection conn2 = DriverManager.getConnection(getUrl(), props); - String query = "SELECT count(1) FROM " + tableName; - ResultSet rs = conn2.createStatement().executeQuery(query); - assertTrue(rs.next()); - assertEquals(rowCount, rs.getLong(1)); - - query = "SELECT id, col1,col2 FROM " + tableName; - rs = conn2.createStatement().executeQuery(query); - for (int i = 0; i < rowCount; i++) { + try (PhoenixConnection pconn = + DriverManager.getConnection(getUrl()).unwrap(PhoenixConnection.class)) { + String tableName = generateUniqueName();// MDTEST_NAME; + String schemaName = "";// MDTEST_SCHEMA_NAME; + byte[] cfA = Bytes.toBytes(SchemaUtil.normalizeIdentifier("a")); + byte[] cfB = Bytes.toBytes(SchemaUtil.normalizeIdentifier("b")); + byte[] cfC = Bytes.toBytes("c"); + byte[][] familyNames = new byte[][] { cfB, cfC }; + byte[] htableName = SchemaUtil.getTableNameAsBytes(schemaName, tableName); + HBaseAdmin admin = pconn.getQueryServices().getAdmin(); + try { + admin.disableTable(htableName); + admin.deleteTable(htableName); + admin.enableTable(htableName); + } catch (org.apache.hadoop.hbase.TableNotFoundException e) { + } + + @SuppressWarnings("deprecation") + HTableDescriptor descriptor = new HTableDescriptor(htableName); + for (byte[] familyName : familyNames) { + HColumnDescriptor columnDescriptor = new HColumnDescriptor(familyName); + descriptor.addFamily(columnDescriptor); + } + admin.createTable(descriptor); + createMDTestTable(pconn, tableName, + "a." + HColumnDescriptor.KEEP_DELETED_CELLS + "=" + Boolean.TRUE); + + descriptor = admin.getTableDescriptor(htableName); + assertEquals(3, descriptor.getColumnFamilies().length); + HColumnDescriptor cdA = descriptor.getFamily(cfA); + assertNotEquals(HColumnDescriptor.DEFAULT_KEEP_DELETED, cdA.getKeepDeletedCells()); + assertEquals(DataBlockEncoding.NONE, cdA.getDataBlockEncoding()); // Overriden using + // WITH + assertEquals(1, cdA.getMaxVersions());// Overriden using WITH + HColumnDescriptor cdB = descriptor.getFamily(cfB); + // Allow KEEP_DELETED_CELLS to be false for VIEW + assertEquals(HColumnDescriptor.DEFAULT_KEEP_DELETED, cdB.getKeepDeletedCells()); + assertEquals(DataBlockEncoding.NONE, cdB.getDataBlockEncoding()); // Should keep the + // original value. + // CF c should stay the same since it's not a Phoenix cf. + HColumnDescriptor cdC = descriptor.getFamily(cfC); + assertNotNull("Column family not found", cdC); + assertEquals(HColumnDescriptor.DEFAULT_KEEP_DELETED, cdC.getKeepDeletedCells()); + assertFalse(SchemaUtil.DEFAULT_DATA_BLOCK_ENCODING == cdC.getDataBlockEncoding()); + assertTrue(descriptor.hasCoprocessor(UngroupedAggregateRegionObserver.class.getName())); + assertTrue(descriptor.hasCoprocessor(GroupedAggregateRegionObserver.class.getName())); + assertTrue(descriptor.hasCoprocessor(ServerCachingEndpointImpl.class.getName())); + admin.close(); + + int rowCount = 5; + String upsert = "UPSERT INTO " + tableName + "(id,col1,col2) VALUES(?,?,?)"; + PreparedStatement ps = pconn.prepareStatement(upsert); + for (int i = 0; i < rowCount; i++) { + ps.setString(1, Integer.toString(i)); + ps.setInt(2, i + 1); + ps.setInt(3, i + 2); + ps.execute(); + } + pconn.commit(); + String query = "SELECT count(1) FROM " + tableName; + ResultSet rs = pconn.createStatement().executeQuery(query); assertTrue(rs.next()); - assertEquals(Integer.toString(i),rs.getString(1)); - assertEquals(i+1, rs.getInt(2)); - assertEquals(i+2, rs.getInt(3)); + assertEquals(rowCount, rs.getLong(1)); + + query = "SELECT id, col1,col2 FROM " + tableName; + rs = pconn.createStatement().executeQuery(query); + for (int i = 0; i < rowCount; i++) { + assertTrue(rs.next()); + assertEquals(Integer.toString(i), rs.getString(1)); + assertEquals(i + 1, rs.getInt(2)); + assertEquals(i + 2, rs.getInt(3)); + } + assertFalse(rs.next()); } - assertFalse(rs.next()); - conn2.close(); } @SuppressWarnings("deprecation") @Test public void testCreateViewOnExistingTable() throws Exception { - PhoenixConnection pconn = DriverManager.getConnection(getUrl(), PropertiesUtil.deepCopy(TEST_PROPERTIES)).unwrap(PhoenixConnection.class); - String tableName = MDTEST_NAME; - String schemaName = MDTEST_SCHEMA_NAME; - byte[] cfB = Bytes.toBytes(SchemaUtil.normalizeIdentifier("b")); - byte[] cfC = Bytes.toBytes("c"); - byte[][] familyNames = new byte[][] {cfB, cfC}; - byte[] htableName = SchemaUtil.getTableNameAsBytes(schemaName, tableName); - HBaseAdmin admin = pconn.getQueryServices().getAdmin(); - try { - admin.disableTable(htableName); - admin.deleteTable(htableName); - } catch (org.apache.hadoop.hbase.TableNotFoundException e) { - } - - HTableDescriptor descriptor = new HTableDescriptor(htableName); - for (byte[] familyName : familyNames) { - HColumnDescriptor columnDescriptor = new HColumnDescriptor(familyName); - descriptor.addFamily(columnDescriptor); - } - admin.createTable(descriptor); - admin.close(); - - long ts = nextTimestamp(); - Properties props = new Properties(); - props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 5)); - Connection conn1 = DriverManager.getConnection(getUrl(), props); - String createStmt = "create view bogusTable" + - " (id char(1) not null primary key,\n" + - " a.col1 integer,\n" + - " d.col2 bigint)\n"; - try { - conn1.createStatement().execute(createStmt); - fail(); - } catch (TableNotFoundException e) { - // expected to fail b/c table doesn't exist - } catch (ReadOnlyTableException e) { - // expected to fail b/c table doesn't exist - } - - createStmt = "create view " + MDTEST_NAME + - " (id char(1) not null primary key,\n" + - " a.col1 integer,\n" + - " b.col2 bigint)\n"; - try { - conn1.createStatement().execute(createStmt); - fail(); - } catch (ReadOnlyTableException e) { - // expected to fail b/c cf a doesn't exist - } - createStmt = "create view " + MDTEST_NAME + - " (id char(1) not null primary key,\n" + - " b.col1 integer,\n" + - " c.col2 bigint)\n"; - try { - conn1.createStatement().execute(createStmt); - fail(); - } catch (ReadOnlyTableException e) { - // expected to fail b/c cf C doesn't exist (case issue) - } + try (PhoenixConnection pconn = + DriverManager.getConnection(getUrl(), PropertiesUtil.deepCopy(TEST_PROPERTIES)) + .unwrap(PhoenixConnection.class)) { + String tableName = generateUniqueName();// MDTEST_NAME; + String schemaName = "";// MDTEST_SCHEMA_NAME; + byte[] cfB = Bytes.toBytes(SchemaUtil.normalizeIdentifier("b")); + byte[] cfC = Bytes.toBytes("c"); + byte[][] familyNames = new byte[][] { cfB, cfC }; + byte[] htableName = SchemaUtil.getTableNameAsBytes(schemaName, tableName); + try (HBaseAdmin admin = pconn.getQueryServices().getAdmin()) { + try { + admin.disableTable(htableName); + admin.deleteTable(htableName); + } catch (org.apache.hadoop.hbase.TableNotFoundException e) { + } - createStmt = "create view " + MDTEST_NAME + - " (id char(1) not null primary key,\n" + - " b.col1 integer,\n" + - " \"c\".col2 bigint) IMMUTABLE_ROWS=true \n"; - // should be ok now - conn1.createStatement().execute(createStmt); - conn1.close(); - - props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 6)); - PhoenixConnection conn2 = DriverManager.getConnection(getUrl(), props).unwrap(PhoenixConnection.class); - - ResultSet rs = conn2.getMetaData().getTables(null, null, MDTEST_NAME, null); - assertTrue(rs.next()); - assertEquals(ViewType.MAPPED.name(), rs.getString(PhoenixDatabaseMetaData.VIEW_TYPE)); - assertFalse(rs.next()); + HTableDescriptor descriptor = new HTableDescriptor(htableName); + for (byte[] familyName : familyNames) { + HColumnDescriptor columnDescriptor = new HColumnDescriptor(familyName); + descriptor.addFamily(columnDescriptor); + } + admin.createTable(descriptor); + } + String createStmt = + "create view " + generateUniqueName() + " (id char(1) not null primary key,\n" + + " a.col1 integer,\n" + " d.col2 bigint)\n"; + try { + pconn.createStatement().execute(createStmt); + fail(); + } catch (TableNotFoundException e) { + // expected to fail b/c table doesn't exist + } catch (ReadOnlyTableException e) { + // expected to fail b/c table doesn't exist + } - String deleteStmt = "DELETE FROM " + MDTEST_NAME; - PreparedStatement ps = conn2.prepareStatement(deleteStmt); - try { - ps.execute(); - fail(); - } catch (ReadOnlyTableException e) { - // expected to fail b/c table is read-only - } + createStmt = + "create view " + tableName + " (id char(1) not null primary key,\n" + + " a.col1 integer,\n" + " b.col2 bigint)\n"; + try { + pconn.createStatement().execute(createStmt); + fail(); + } catch (ReadOnlyTableException e) { + // expected to fail b/c cf a doesn't exist + } + createStmt = + "create view " + tableName + " (id char(1) not null primary key,\n" + + " b.col1 integer,\n" + " c.col2 bigint)\n"; + try { + pconn.createStatement().execute(createStmt); + fail(); + } catch (ReadOnlyTableException e) { + // expected to fail b/c cf C doesn't exist (case issue) + } - String upsert = "UPSERT INTO " + MDTEST_NAME + "(id,col1,col2) VALUES(?,?,?)"; - ps = conn2.prepareStatement(upsert); - try { - ps.setString(1, Integer.toString(0)); - ps.setInt(2, 1); - ps.setInt(3, 2); - ps.execute(); - fail(); - } catch (ReadOnlyTableException e) { - // expected to fail b/c table is read-only - } + createStmt = + "create view " + tableName + " (id char(1) not null primary key,\n" + + " b.col1 integer,\n" + + " \"c\".col2 bigint) IMMUTABLE_ROWS=true \n"; + // should be ok now + pconn.createStatement().execute(createStmt); + ResultSet rs = pconn.getMetaData().getTables(null, null, tableName, null); + assertTrue(rs.next()); + assertEquals(ViewType.MAPPED.name(), rs.getString(PhoenixDatabaseMetaData.VIEW_TYPE)); + assertFalse(rs.next()); - HTableInterface htable = conn2.getQueryServices().getTable(SchemaUtil.getTableNameAsBytes(MDTEST_SCHEMA_NAME,MDTEST_NAME)); - Put put = new Put(Bytes.toBytes("0")); - put.add(cfB, Bytes.toBytes("COL1"), ts+6, PInteger.INSTANCE.toBytes(1)); - put.add(cfC, Bytes.toBytes("COL2"), ts+6, PLong.INSTANCE.toBytes(2)); - htable.put(put); - conn2.close(); - - props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 10)); - Connection conn7 = DriverManager.getConnection(getUrl(), props); - // Should be ok b/c we've marked the view with IMMUTABLE_ROWS=true - conn7.createStatement().execute("CREATE INDEX idx ON " + MDTEST_NAME + "(B.COL1)"); - String select = "SELECT col1 FROM " + MDTEST_NAME + " WHERE col2=?"; - ps = conn7.prepareStatement(select); - ps.setInt(1, 2); - rs = ps.executeQuery(); - assertTrue(rs.next()); - assertEquals(1, rs.getInt(1)); - assertFalse(rs.next()); + String deleteStmt = "DELETE FROM " + tableName; + PreparedStatement ps = pconn.prepareStatement(deleteStmt); + try { + ps.execute(); + fail(); + } catch (ReadOnlyTableException e) { + // expected to fail b/c table is read-only + } - props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 12)); - Connection conn75 = DriverManager.getConnection(getUrl(), props); - String dropTable = "DROP TABLE " + MDTEST_NAME ; - ps = conn75.prepareStatement(dropTable); - try { - ps.execute(); - fail(); - } catch (TableNotFoundException e) { - // expected to fail b/c it is a view - } + String upsert = "UPSERT INTO " + tableName + "(id,col1,col2) VALUES(?,?,?)"; + ps = pconn.prepareStatement(upsert); + try { + ps.setString(1, Integer.toString(0)); + ps.setInt(2, 1); + ps.setInt(3, 2); + ps.execute(); + fail(); + } catch (ReadOnlyTableException e) { + // expected to fail b/c table is read-only + } - String dropView = "DROP VIEW " + MDTEST_NAME ; - ps = conn75.prepareStatement(dropView); - ps.execute(); - conn75.close(); - - props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 15)); - Connection conn8 = DriverManager.getConnection(getUrl(), props); - createStmt = "create view " + MDTEST_NAME + - " (id char(1) not null primary key,\n" + - " b.col1 integer,\n" + - " \"c\".col2 bigint) IMMUTABLE_ROWS=true\n"; - // should be ok to create a view with IMMUTABLE_ROWS = true - conn8.createStatement().execute(createStmt); - conn8.close(); - - props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 20)); - Connection conn9 = DriverManager.getConnection(getUrl(), props); - conn9.createStatement().execute("CREATE INDEX idx ON " + MDTEST_NAME + "(B.COL1)"); - - props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 30)); - Connection conn91 = DriverManager.getConnection(getUrl(), props); - ps = conn91.prepareStatement(dropView); - ps.execute(); - conn91.close(); - - props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 35)); - Connection conn92 = DriverManager.getConnection(getUrl(), props); - createStmt = "create view " + MDTEST_NAME + - " (id char(1) not null primary key,\n" + - " b.col1 integer,\n" + - " \"c\".col2 bigint) as\n" + - " select * from " + MDTEST_NAME + - " where b.col1 = 1"; - conn92.createStatement().execute(createStmt); - conn92.close(); - - put = new Put(Bytes.toBytes("1")); - put.add(cfB, Bytes.toBytes("COL1"), ts+39, PInteger.INSTANCE.toBytes(3)); - put.add(cfC, Bytes.toBytes("COL2"), ts+39, PLong.INSTANCE.toBytes(4)); - htable.put(put); - - props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 40)); - Connection conn92a = DriverManager.getConnection(getUrl(), props); - rs = conn92a.createStatement().executeQuery("select count(*) from " + MDTEST_NAME); - assertTrue(rs.next()); - assertEquals(1,rs.getInt(1)); - conn92a.close(); - - props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 45)); - Connection conn93 = DriverManager.getConnection(getUrl(), props); - try { - String alterView = "alter view " + MDTEST_NAME + " drop column b.col1"; - conn93.createStatement().execute(alterView); - fail(); - } catch (SQLException e) { - assertEquals(SQLExceptionCode.CANNOT_MUTATE_TABLE.getErrorCode(), e.getErrorCode()); - } - conn93.close(); + HTableInterface htable = + pconn.getQueryServices() + .getTable(SchemaUtil.getTableNameAsBytes(schemaName, tableName)); + Put put = new Put(Bytes.toBytes("0")); + put.add(cfB, Bytes.toBytes("COL1"), PInteger.INSTANCE.toBytes(1)); + put.add(cfC, Bytes.toBytes("COL2"), PLong.INSTANCE.toBytes(2)); + htable.put(put); - props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 50)); - Connection conn94 = DriverManager.getConnection(getUrl(), props); - String alterView = "alter view " + MDTEST_NAME + " drop column \"c\".col2"; - conn94.createStatement().execute(alterView); - conn94.close(); + // Should be ok b/c we've marked the view with IMMUTABLE_ROWS=true + pconn.createStatement().execute("CREATE INDEX idx ON " + tableName + "(B.COL1)"); + String select = "SELECT col1 FROM " + tableName + " WHERE col2=?"; + ps = pconn.prepareStatement(select); + ps.setInt(1, 2); + rs = ps.executeQuery(); + assertTrue(rs.next()); + assertEquals(1, rs.getInt(1)); + assertFalse(rs.next()); + String dropTable = "DROP TABLE " + tableName; + ps = pconn.prepareStatement(dropTable); + try { + ps.execute(); + fail(); + } catch (TableNotFoundException e) { + // expected to fail b/c it is a view + } + String alterView = "alter view " + tableName + " drop column \"c\".col2"; + pconn.createStatement().execute(alterView); + } } - + @Test public void testAddKVColumnToExistingFamily() throws Throwable { - long ts = nextTimestamp(); String tenantId = getOrganizationId(); - initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId), null, ts, getUrl(), null); - - Properties props = new Properties(); - props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 5)); - Connection conn1 = DriverManager.getConnection(getUrl(), props); - // Failed attempt to repro table not found bug -// TestUtil.clearMetaDataCache(conn1); -// PhoenixConnection pconn = conn1.unwrap(PhoenixConnection.class); -// pconn.removeTable(ATABLE_SCHEMA_NAME, ATABLE_NAME); - conn1.createStatement().executeUpdate("ALTER TABLE " + ATABLE_NAME + " ADD z_integer integer"); - conn1.close(); - - props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 6)); - Connection conn2 = DriverManager.getConnection(getUrl(), props); - String query = "SELECT z_integer FROM aTable"; - assertTrue(conn2.prepareStatement(query).executeQuery().next()); - conn2.close(); - - props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 3)); - Connection conn3 = DriverManager.getConnection(getUrl(), props); - try { - conn3.prepareStatement(query).executeQuery().next(); - fail(); - } catch (ColumnNotFoundException e) { + String tableName = generateUniqueName(); + initATableValues(tableName, tenantId, getDefaultSplits(tenantId), null, null, getUrl(), + null); + try (Connection conn1 = DriverManager.getConnection(getUrl())) { + conn1.createStatement() + .executeUpdate("ALTER TABLE " + tableName + " ADD z_integer integer"); + String query = "SELECT z_integer FROM " + tableName; + assertTrue(conn1.prepareStatement(query).executeQuery().next()); } } - + @Test public void testAddKVColumnToNewFamily() throws Exception { - long ts = nextTimestamp(); String tenantId = getOrganizationId(); - initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId), null, ts, getUrl(), null); - Properties props = new Properties(); - props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 5)); - Connection conn1 = DriverManager.getConnection(getUrl(), props); - conn1.createStatement().executeUpdate("ALTER TABLE " + ATABLE_NAME + " ADD newcf.z_integer integer"); - conn1.close(); - - props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 6)); - Connection conn2 = DriverManager.getConnection(getUrl(), props); - String query = "SELECT z_integer FROM aTable"; - assertTrue(conn2.prepareStatement(query).executeQuery().next()); - conn2.close(); - - props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 3)); - Connection conn3 = DriverManager.getConnection(getUrl(), props); - try { - conn3.prepareStatement(query).executeQuery().next(); - fail(); - } catch (ColumnNotFoundException e) { + String tableName = + initATableValues(null, tenantId, getDefaultSplits(tenantId), null, null, getUrl(), + null); + try (Connection conn1 = DriverManager.getConnection(getUrl())) { + conn1.createStatement() + .executeUpdate("ALTER TABLE " + tableName + " ADD newcf.z_integer integer"); + String query = "SELECT z_integer FROM " + tableName; + assertTrue(conn1.prepareStatement(query).executeQuery().next()); } } - + @Test public void testAddPKColumn() throws Exception { - long ts = nextTimestamp(); String tenantId = getOrganizationId(); - initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId), null, ts, getUrl(), null); - - Properties props = new Properties(); - props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 5)); - Connection conn1 = DriverManager.getConnection(getUrl(), props); - try { - conn1.createStatement().executeUpdate("ALTER TABLE " + ATABLE_NAME + " ADD z_string varchar not null primary key"); - fail(); - } catch (SQLException e) { - assertTrue(e.getMessage(), e.getMessage().contains("ERROR 1006 (42J04): Only nullable columns may be added to a multi-part row key.")); - } - conn1.createStatement().execu <TRUNCATED>