http://git-wip-us.apache.org/repos/asf/phoenix/blob/3c7ff99b/phoenix-core/src/it/java/org/apache/phoenix/end2end/AlterTableWithViewsIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/AlterTableWithViewsIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/AlterTableWithViewsIT.java index 211145e..6b57148 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/AlterTableWithViewsIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/AlterTableWithViewsIT.java @@ -54,22 +54,41 @@ import org.junit.runners.Parameterized.Parameters; public class AlterTableWithViewsIT extends ParallelStatsDisabledIT { private final boolean isMultiTenant; + private final boolean columnEncoded; private final String TENANT_SPECIFIC_URL1 = getUrl() + ';' + TENANT_ID_ATTRIB + "=tenant1"; private final String TENANT_SPECIFIC_URL2 = getUrl() + ';' + TENANT_ID_ATTRIB + "=tenant2"; - public AlterTableWithViewsIT(boolean isMultiTenant) { + public AlterTableWithViewsIT(boolean isMultiTenant, boolean columnEncoded) { this.isMultiTenant = isMultiTenant; + this.columnEncoded = columnEncoded; } - @Parameters(name="AlterTableWithViewsIT_multiTenant={0}") // name is used by failsafe as file name in reports - public static Collection<Boolean> data() { - return Arrays.asList(false, true); + @Parameters(name="AlterTableWithViewsIT_multiTenant={0}, columnEncoded={1}") // name is used by failsafe as file name in reports + public static Collection<Boolean[]> data() { + return Arrays.asList(new Boolean[][] { + { false, false }, { false, true }, + { true, false }, { true, true } }); } - + private String generateDDL(String format) { + return generateDDL("", format); + } + + private String generateDDL(String options, String format) { + StringBuilder optionsBuilder = new StringBuilder(options); + if (!columnEncoded) { + if (optionsBuilder.length()!=0) + optionsBuilder.append(","); + optionsBuilder.append("COLUMN_ENCODED_BYTES=0"); + } + if (isMultiTenant) { + if (optionsBuilder.length()!=0) + optionsBuilder.append(","); + optionsBuilder.append("MULTI_TENANT=true"); + } return String.format(format, isMultiTenant ? "TENANT_ID VARCHAR NOT NULL, " : "", - isMultiTenant ? "TENANT_ID, " : "", isMultiTenant ? "MULTI_TENANT=true" : ""); + isMultiTenant ? "TENANT_ID, " : "", optionsBuilder.toString()); } @Test @@ -92,7 +111,7 @@ public class AlterTableWithViewsIT extends ParallelStatsDisabledIT { // adding a new pk column and a new regular column conn.createStatement().execute("ALTER TABLE " + tableName + " ADD COL3 varchar(10) PRIMARY KEY, COL4 integer"); - assertTableDefinition(conn, tableName, PTableType.TABLE, null, 1, 5, QueryConstants.BASE_TABLE_BASE_COLUMN_COUNT, "ID", "COL1", "COL2", "COL3", "COL4"); + assertTableDefinition(conn, tableName, PTableType.TABLE, null, columnEncoded ? 2 : 1, 5, QueryConstants.BASE_TABLE_BASE_COLUMN_COUNT, "ID", "COL1", "COL2", "COL3", "COL4"); assertTableDefinition(conn, viewOfTable, PTableType.VIEW, tableName, 1, 7, 5, "ID", "COL1", "COL2", "COL3", "COL4", "VIEW_COL1", "VIEW_COL2"); } } @@ -109,28 +128,27 @@ public class AlterTableWithViewsIT extends ParallelStatsDisabledIT { + " COL1 integer NOT NULL," + " COL2 bigint NOT NULL," + " CONSTRAINT NAME_PK PRIMARY KEY (%s ID, COL1, COL2)" - + " ) UPDATE_CACHE_FREQUENCY=15 " - + (isMultiTenant ? ",%s" : "%s"); - conn.createStatement().execute(generateDDL(ddlFormat)); + + " ) %s "; + conn.createStatement().execute(generateDDL("UPDATE_CACHE_FREQUENCY=2", ddlFormat)); viewConn.createStatement().execute("CREATE VIEW " + viewOfTable1 + " ( VIEW_COL1 DECIMAL(10,2), VIEW_COL2 VARCHAR ) AS SELECT * FROM " + tableName); viewConn.createStatement().execute("CREATE VIEW " + viewOfTable2 + " ( VIEW_COL1 DECIMAL(10,2), VIEW_COL2 VARCHAR ) AS SELECT * FROM " + tableName); - viewConn.createStatement().execute("ALTER VIEW " + viewOfTable2 + " SET UPDATE_CACHE_FREQUENCY = 5"); + viewConn.createStatement().execute("ALTER VIEW " + viewOfTable2 + " SET UPDATE_CACHE_FREQUENCY = 1"); PhoenixConnection phoenixConn = conn.unwrap(PhoenixConnection.class); PTable table = phoenixConn.getTable(new PTableKey(null, tableName)); PName tenantId = isMultiTenant ? PNameFactory.newName("tenant1") : null; assertFalse(table.isImmutableRows()); - assertEquals(15, table.getUpdateCacheFrequency()); + assertEquals(2, table.getUpdateCacheFrequency()); PTable viewTable1 = viewConn.unwrap(PhoenixConnection.class).getTable(new PTableKey(tenantId, viewOfTable1)); assertFalse(viewTable1.isImmutableRows()); - assertEquals(15, viewTable1.getUpdateCacheFrequency()); + assertEquals(2, viewTable1.getUpdateCacheFrequency()); // query the view to force the table cache to be updated viewConn.createStatement().execute("SELECT * FROM "+viewOfTable2); PTable viewTable2 = viewConn.unwrap(PhoenixConnection.class).getTable(new PTableKey(tenantId, viewOfTable2)); assertFalse(viewTable2.isImmutableRows()); - assertEquals(5, viewTable2.getUpdateCacheFrequency()); + assertEquals(1, viewTable2.getUpdateCacheFrequency()); - conn.createStatement().execute("ALTER TABLE " + tableName + " SET IMMUTABLE_ROWS=true, UPDATE_CACHE_FREQUENCY=10"); + conn.createStatement().execute("ALTER TABLE " + tableName + " SET IMMUTABLE_ROWS=true, UPDATE_CACHE_FREQUENCY=3"); // query the views to force the table cache to be updated viewConn.createStatement().execute("SELECT * FROM "+viewOfTable1); viewConn.createStatement().execute("SELECT * FROM "+viewOfTable2); @@ -138,16 +156,16 @@ public class AlterTableWithViewsIT extends ParallelStatsDisabledIT { phoenixConn = conn.unwrap(PhoenixConnection.class); table = phoenixConn.getTable(new PTableKey(null, tableName)); assertTrue(table.isImmutableRows()); - assertEquals(10, table.getUpdateCacheFrequency()); + assertEquals(3, table.getUpdateCacheFrequency()); viewTable1 = viewConn.unwrap(PhoenixConnection.class).getTable(new PTableKey(tenantId, viewOfTable1)); assertTrue(viewTable1.isImmutableRows()); - assertEquals(10, viewTable1.getUpdateCacheFrequency()); + assertEquals(3, viewTable1.getUpdateCacheFrequency()); viewTable2 = viewConn.unwrap(PhoenixConnection.class).getTable(new PTableKey(tenantId, viewOfTable2)); assertTrue(viewTable2.isImmutableRows()); // update cache frequency is not propagated to the view since it was altered on the view - assertEquals(5, viewTable2.getUpdateCacheFrequency()); + assertEquals(1, viewTable2.getUpdateCacheFrequency()); } } @@ -174,7 +192,7 @@ public class AlterTableWithViewsIT extends ParallelStatsDisabledIT { // drop two columns from the base table conn.createStatement().execute("ALTER TABLE " + tableName + " DROP COLUMN COL3, COL5"); - assertTableDefinition(conn, tableName, PTableType.TABLE, null, 1, 4, + assertTableDefinition(conn, tableName, PTableType.TABLE, null, columnEncoded ? 2 : 1, 4, QueryConstants.BASE_TABLE_BASE_COLUMN_COUNT, "ID", "COL1", "COL2", "COL4"); assertTableDefinition(conn, viewOfTable, PTableType.VIEW, tableName, 1, 6, 4, "ID", "COL1", "COL2", "COL4", "VIEW_COL1", "VIEW_COL2"); @@ -253,38 +271,49 @@ public class AlterTableWithViewsIT extends ParallelStatsDisabledIT { assertEquals("Unexpected exception", CANNOT_MUTATE_TABLE.getErrorCode(), e.getErrorCode()); } - // validate that there were no columns added to the table or view - assertTableDefinition(conn, tableName, PTableType.TABLE, null, 0, 3, QueryConstants.BASE_TABLE_BASE_COLUMN_COUNT, "ID", "COL1", "COL2"); + // validate that there were no columns added to the table or view, if its table is column encoded the sequence number changes when we increment the cq counter + assertTableDefinition(conn, tableName, PTableType.TABLE, null, columnEncoded ? 1 : 0, 3, QueryConstants.BASE_TABLE_BASE_COLUMN_COUNT, "ID", "COL1", "COL2"); assertTableDefinition(conn, viewOfTable, PTableType.VIEW, tableName, 0, 9, 3, "ID", "COL1", "COL2", "VIEW_COL1", "VIEW_COL2", "VIEW_COL3", "VIEW_COL4", "VIEW_COL5", "VIEW_COL6"); - // should succeed - conn.createStatement().execute("ALTER TABLE " + tableName + " ADD VIEW_COL4 DECIMAL, VIEW_COL2 VARCHAR(256)"); - assertTableDefinition(conn, tableName, PTableType.TABLE, null, 1, 5, QueryConstants.BASE_TABLE_BASE_COLUMN_COUNT, "ID", "COL1", "COL2", "VIEW_COL4", "VIEW_COL2"); - assertTableDefinition(conn, viewOfTable, PTableType.VIEW, tableName, 1, 9, 5, "ID", "COL1", "COL2", "VIEW_COL4", "VIEW_COL2", "VIEW_COL1", "VIEW_COL3", "VIEW_COL5", "VIEW_COL6"); - - // query table - ResultSet rs = stmt.executeQuery("SELECT * FROM " + tableName); - assertTrue(rs.next()); - assertEquals("view1", rs.getString("ID")); - assertEquals(12, rs.getInt("COL1")); - assertEquals(13, rs.getInt("COL2")); - assertEquals("view5", rs.getString("VIEW_COL2")); - assertEquals(17, rs.getInt("VIEW_COL4")); - assertFalse(rs.next()); - - // query view - rs = stmt.executeQuery("SELECT * FROM " + viewOfTable); - assertTrue(rs.next()); - assertEquals("view1", rs.getString("ID")); - assertEquals(12, rs.getInt("COL1")); - assertEquals(13, rs.getInt("COL2")); - assertEquals(14, rs.getInt("VIEW_COL1")); - assertEquals("view5", rs.getString("VIEW_COL2")); - assertEquals("view6", rs.getString("VIEW_COL3")); - assertEquals(17, rs.getInt("VIEW_COL4")); - assertEquals(18, rs.getInt("VIEW_COL5")); - assertEquals("view9", rs.getString("VIEW_COL6")); - assertFalse(rs.next()); + if (columnEncoded) { + try { + // adding a key value column to the base table that already exists in the view is not allowed + conn.createStatement().execute("ALTER TABLE " + tableName + " ADD VIEW_COL4 DECIMAL, VIEW_COL2 VARCHAR(256)"); + fail(); + } catch (SQLException e) { + assertEquals("Unexpected exception", CANNOT_MUTATE_TABLE.getErrorCode(), e.getErrorCode()); + } + } + else { + // should succeed + conn.createStatement().execute("ALTER TABLE " + tableName + " ADD VIEW_COL4 DECIMAL, VIEW_COL2 VARCHAR(256)"); + assertTableDefinition(conn, tableName, PTableType.TABLE, null, columnEncoded ? 2 : 1, 5, QueryConstants.BASE_TABLE_BASE_COLUMN_COUNT, "ID", "COL1", "COL2", "VIEW_COL4", "VIEW_COL2"); + assertTableDefinition(conn, viewOfTable, PTableType.VIEW, tableName, 1, 9, 5, "ID", "COL1", "COL2", "VIEW_COL4", "VIEW_COL2", "VIEW_COL1", "VIEW_COL3", "VIEW_COL5", "VIEW_COL6"); + + // query table + ResultSet rs = stmt.executeQuery("SELECT * FROM " + tableName); + assertTrue(rs.next()); + assertEquals("view1", rs.getString("ID")); + assertEquals(12, rs.getInt("COL1")); + assertEquals(13, rs.getInt("COL2")); + assertEquals("view5", rs.getString("VIEW_COL2")); + assertEquals(17, rs.getInt("VIEW_COL4")); + assertFalse(rs.next()); + + // query view + rs = stmt.executeQuery("SELECT * FROM " + viewOfTable); + assertTrue(rs.next()); + assertEquals("view1", rs.getString("ID")); + assertEquals(12, rs.getInt("COL1")); + assertEquals(13, rs.getInt("COL2")); + assertEquals(14, rs.getInt("VIEW_COL1")); + assertEquals("view5", rs.getString("VIEW_COL2")); + assertEquals("view6", rs.getString("VIEW_COL3")); + assertEquals(17, rs.getInt("VIEW_COL4")); + assertEquals(18, rs.getInt("VIEW_COL5")); + assertEquals("view9", rs.getString("VIEW_COL6")); + assertFalse(rs.next()); + } } } @@ -603,9 +632,9 @@ public class AlterTableWithViewsIT extends ParallelStatsDisabledIT { @Test public void testAlteringViewThatHasChildViews() throws Exception { - String baseTable = "testAlteringViewThatHasChildViews"; - String childView = "childView"; - String grandChildView = "grandChildView"; + String baseTable = generateUniqueName(); + String childView = baseTable + "cildView"; + String grandChildView = baseTable + "grandChildView"; try (Connection conn = DriverManager.getConnection(getUrl()); Connection viewConn = isMultiTenant ? DriverManager.getConnection(TENANT_SPECIFIC_URL1) : conn ) { String ddlFormat = "CREATE TABLE IF NOT EXISTS " + baseTable + " ("
http://git-wip-us.apache.org/repos/asf/phoenix/blob/3c7ff99b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ArrayIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ArrayIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ArrayIT.java index 4a21864..77af84c 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ArrayIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ArrayIT.java @@ -2777,4 +2777,32 @@ public class ArrayIT extends BaseClientManagedTimeIT { assertTrue(rs.next()); assertEquals(conn.createArrayOf("CHAR", new String[]{"aaa", "bbb", "ccc"}), rs.getArray(1)); } + + @Test + public void testArrayIndexFunctionForImmutableTable() throws Exception { + String tableName = "testArrayIndexFunctionForImmutableTable".toUpperCase(); + long ts = nextTimestamp(); + Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); + props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 10)); + try (Connection conn = DriverManager.getConnection(getUrl(), props)) { + String ddl = "CREATE IMMUTABLE TABLE " + tableName + " (region_name VARCHAR PRIMARY KEY, ZIP VARCHAR ARRAY[10])"; + conn.createStatement().execute(ddl); + } + props = PropertiesUtil.deepCopy(TEST_PROPERTIES); + props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 20)); + try (Connection conn = DriverManager.getConnection(getUrl(), props)) { + conn.createStatement().executeUpdate("UPSERT INTO " + tableName + " (region_name,zip) VALUES('SF Bay Area',ARRAY['94115','94030','94125'])"); + conn.commit(); + } + props = PropertiesUtil.deepCopy(TEST_PROPERTIES); + props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 30)); + try (Connection conn = DriverManager.getConnection(getUrl(), props)) { + String sql = "SELECT ZIP[2] FROM " + tableName; + try (ResultSet rs = conn.createStatement().executeQuery(sql)) { + assertTrue(rs.next()); + assertEquals("94030", rs.getString(1)); + } + } + } + } http://git-wip-us.apache.org/repos/asf/phoenix/blob/3c7ff99b/phoenix-core/src/it/java/org/apache/phoenix/end2end/BaseJoinIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/BaseJoinIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/BaseJoinIT.java index f1c1808..152bdf0 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/BaseJoinIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/BaseJoinIT.java @@ -60,14 +60,14 @@ public abstract class BaseJoinIT extends ParallelStatsDisabledIT { " \"item_id\" varchar(10), " + " price integer, " + " quantity integer, " + - " date timestamp)"); + " date timestamp) IMMUTABLE_ROWS=true"); builder.put(JOIN_CUSTOMER_TABLE_FULL_NAME, "create table " + JOIN_CUSTOMER_TABLE_FULL_NAME + " (\"customer_id\" varchar(10) not null primary key, " + " name varchar, " + " phone varchar(12), " + " address varchar, " + " loc_id varchar(5), " + - " date date)"); + " date date) IMMUTABLE_ROWS=true"); builder.put(JOIN_ITEM_TABLE_FULL_NAME, "create table " + JOIN_ITEM_TABLE_FULL_NAME + " (\"item_id\" varchar(10) not null primary key, " + " name varchar, " + http://git-wip-us.apache.org/repos/asf/phoenix/blob/3c7ff99b/phoenix-core/src/it/java/org/apache/phoenix/end2end/BaseQueryIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/BaseQueryIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/BaseQueryIT.java index 9ad12e5..e82daf9 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/BaseQueryIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/BaseQueryIT.java @@ -18,7 +18,6 @@ package org.apache.phoenix.end2end; import static org.apache.phoenix.util.TestUtil.TEST_PROPERTIES; -import static org.apache.phoenix.util.TestUtil.ATABLE_NAME; import java.io.IOException; import java.sql.Connection; @@ -30,14 +29,18 @@ import java.util.List; import java.util.Map; import java.util.Properties; import java.util.concurrent.atomic.AtomicInteger; + import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp; import org.apache.hadoop.hbase.io.ImmutableBytesWritable; import org.apache.hadoop.hbase.util.Bytes; +import org.apache.hadoop.hbase.util.Pair; import org.apache.phoenix.query.QueryServices; +import org.apache.phoenix.schema.PTableImpl; import org.apache.phoenix.util.ByteUtil; import org.apache.phoenix.util.PhoenixRuntime; import org.apache.phoenix.util.PropertiesUtil; import org.apache.phoenix.util.ReadOnlyProps; +import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.runner.RunWith; @@ -45,6 +48,7 @@ import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; import com.google.common.collect.Lists; +import com.google.common.collect.Maps; @@ -61,6 +65,21 @@ public abstract class BaseQueryIT extends BaseClientManagedTimeIT { protected static final String tenantId = getOrganizationId(); protected static final String ATABLE_INDEX_NAME = "ATABLE_IDX"; protected static final long BATCH_SIZE = 3; + protected static final String[] INDEX_DDLS = new String[] { + "CREATE INDEX %s ON %s (a_integer DESC) INCLUDE (" + + " A_STRING, " + " B_STRING, " + " A_DATE)"}; +// , +// "CREATE INDEX %s ON %s (a_integer, a_string) INCLUDE (" +// + " B_STRING, " + " A_DATE)", +// "CREATE INDEX %s ON %s (a_integer) INCLUDE (" +// + " A_STRING, " + " B_STRING, " + " A_DATE)", +// "CREATE LOCAL INDEX %s ON %s (a_integer DESC) INCLUDE (" +// + " A_STRING, " + " B_STRING, " + " A_DATE)", +// "CREATE LOCAL INDEX %s ON %s (a_integer, a_string) INCLUDE (" + " B_STRING, " +// + " A_DATE)", +// "CREATE LOCAL INDEX %s ON %s (a_integer) INCLUDE (" +// + " A_STRING, " + " B_STRING, " + " A_DATE)", +// "" }; @BeforeClass @Shadower(classBeingShadowed = BaseClientManagedTimeIT.class) @@ -79,42 +98,69 @@ public abstract class BaseQueryIT extends BaseClientManagedTimeIT { setUpTestDriver(new ReadOnlyProps(props.entrySet().iterator())); } + private static Map<Pair<String, String>, Pair<String, String>> namesByParams = Maps.newHashMapWithExpectedSize(10); + protected long ts; protected Date date; private String indexDDL; + private String tableDDLOptions; + protected String tableName; + protected String indexName; - public BaseQueryIT(String indexDDL) { - this.indexDDL = indexDDL; + public BaseQueryIT(String idxDdl, boolean mutable, boolean columnEncoded) { + StringBuilder optionBuilder = new StringBuilder(); + if (!columnEncoded) { + optionBuilder.append("COLUMN_ENCODED_BYTES=0"); + } + if (!mutable) { + if (optionBuilder.length()>0) + optionBuilder.append(","); + optionBuilder.append("IMMUTABLE_ROWS=true"); + if (!columnEncoded) { + optionBuilder.append(",IMMUTABLE_STORAGE_SCHEME="+PTableImpl.ImmutableStorageScheme.ONE_CELL_PER_COLUMN); + } + } + this.tableDDLOptions = optionBuilder.toString(); + try { + this.ts = nextTimestamp(); + Pair<String, String> runParam = new Pair<>(idxDdl, tableDDLOptions); + Pair<String, String> tableIndexNames = namesByParams.get(runParam); + if (tableIndexNames == null) { + this.tableName = initATableValues(null, tenantId, getDefaultSplits(tenantId), date=new Date(System.currentTimeMillis()), ts, getUrl(), tableDDLOptions); + this.indexName = generateUniqueName(); + namesByParams.put(runParam, new Pair<>(tableName, indexName)); + if (idxDdl.length() > 0) { + this.indexDDL = String.format(idxDdl, indexName, tableName); + Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); + props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts)); + Connection conn = DriverManager.getConnection(getUrl(), props); + conn.createStatement().execute(this.indexDDL); + } + } else { + this.tableName = tableIndexNames.getFirst(); + this.indexName = tableIndexNames.getSecond(); + initATableValues(this.tableName, tenantId, getDefaultSplits(tenantId), date=new Date(System.currentTimeMillis()), ts, getUrl(), tableDDLOptions); + } + } catch (Exception e) { + throw new RuntimeException(e); + } } @Before - public void initTable() throws Exception { - ts = nextTimestamp(); - initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId), date=new Date(System.currentTimeMillis()), ts, getUrl()); - if (indexDDL != null && indexDDL.length() > 0) { - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts)); - Connection conn = DriverManager.getConnection(getUrl(), props); - conn.createStatement().execute(indexDDL); - } + public void init() throws Exception { + this.ts = nextTimestamp(); } - @Parameters(name="{0}") + @Parameters(name="indexDDL={0},mutable={1},columnEncoded={2}") public static Collection<Object> data() { List<Object> testCases = Lists.newArrayList(); - testCases.add(new String[] { "CREATE INDEX " + ATABLE_INDEX_NAME + " ON aTable (a_integer DESC) INCLUDE (" - + " A_STRING, " + " B_STRING, " + " A_DATE)" }); - testCases.add(new String[] { "CREATE INDEX " + ATABLE_INDEX_NAME + " ON aTable (a_integer, a_string) INCLUDE (" - + " B_STRING, " + " A_DATE)" }); - testCases.add(new String[] { "CREATE INDEX " + ATABLE_INDEX_NAME + " ON aTable (a_integer) INCLUDE (" - + " A_STRING, " + " B_STRING, " + " A_DATE)" }); - testCases.add(new String[] { "CREATE LOCAL INDEX " + ATABLE_INDEX_NAME + " ON aTable (a_integer DESC) INCLUDE (" - + " A_STRING, " + " B_STRING, " + " A_DATE)" }); - testCases.add(new String[] { "CREATE LOCAL INDEX " + ATABLE_INDEX_NAME + " ON aTable (a_integer, a_string) INCLUDE (" - + " B_STRING, " + " A_DATE)" }); - testCases.add(new String[] { "CREATE LOCAL INDEX " + ATABLE_INDEX_NAME + " ON aTable (a_integer) INCLUDE (" - + " A_STRING, " + " B_STRING, " + " A_DATE)" }); - testCases.add(new String[] { "" }); + for (String indexDDL : INDEX_DDLS) { + for (boolean mutable : new boolean[]{false}) { + for (boolean columnEncoded : new boolean[]{false}) { + testCases.add(new Object[] { indexDDL, mutable, columnEncoded }); + } + } + } return testCases; } @@ -132,4 +178,5 @@ public abstract class BaseQueryIT extends BaseClientManagedTimeIT { protected static int nextRunCount() { return runCount.getAndAdd(1); } + } http://git-wip-us.apache.org/repos/asf/phoenix/blob/3c7ff99b/phoenix-core/src/it/java/org/apache/phoenix/end2end/CaseStatementIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/CaseStatementIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/CaseStatementIT.java index 59b0f41..d2b14a9 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/CaseStatementIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/CaseStatementIT.java @@ -44,6 +44,7 @@ import java.util.Properties; import org.apache.phoenix.util.PhoenixRuntime; import org.apache.phoenix.util.PropertiesUtil; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -54,8 +55,8 @@ import com.google.common.collect.Lists; @RunWith(Parameterized.class) public class CaseStatementIT extends BaseQueryIT { - public CaseStatementIT(String indexDDL) { - super(indexDDL); + public CaseStatementIT(String indexDDL, boolean mutable, boolean columnEncoded) { + super(indexDDL, mutable, columnEncoded); } @Parameters(name="CaseStatementIT_{index}") // name is used by failsafe as file name in reports @@ -65,7 +66,7 @@ public class CaseStatementIT extends BaseQueryIT { @Test public void testSimpleCaseStatement() throws Exception { - String query = "SELECT CASE a_integer WHEN 1 THEN 'a' WHEN 2 THEN 'b' WHEN 3 THEN 'c' ELSE 'd' END, entity_id AS a FROM ATABLE WHERE organization_id=? AND a_integer < 6"; + String query = "SELECT CASE a_integer WHEN 1 THEN 'a' WHEN 2 THEN 'b' WHEN 3 THEN 'c' ELSE 'd' END, entity_id AS a FROM " + tableName + " WHERE organization_id=? AND a_integer < 6"; String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); Connection conn = DriverManager.getConnection(url, props); @@ -88,7 +89,7 @@ public class CaseStatementIT extends BaseQueryIT { @Test public void testMultiCondCaseStatement() throws Exception { - String query = "SELECT CASE WHEN a_integer <= 2 THEN 1.5 WHEN a_integer = 3 THEN 2 WHEN a_integer <= 6 THEN 4.5 ELSE 5 END AS a FROM ATABLE WHERE organization_id=?"; + String query = "SELECT CASE WHEN a_integer <= 2 THEN 1.5 WHEN a_integer = 3 THEN 2 WHEN a_integer <= 6 THEN 4.5 ELSE 5 END AS a FROM " + tableName + " WHERE organization_id=?"; String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); Connection conn = DriverManager.getConnection(url, props); @@ -122,7 +123,7 @@ public class CaseStatementIT extends BaseQueryIT { @Test public void testPartialEvalCaseStatement() throws Exception { - String query = "SELECT entity_id FROM ATABLE WHERE organization_id=? and CASE WHEN 1234 = a_integer THEN 1 WHEN x_integer = 5 THEN 2 ELSE 3 END = 2"; + String query = "SELECT entity_id FROM " + tableName + " WHERE organization_id=? and CASE WHEN 1234 = a_integer THEN 1 WHEN x_integer = 5 THEN 2 ELSE 3 END = 2"; String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); Connection conn = DriverManager.getConnection(url, props); @@ -140,7 +141,7 @@ public class CaseStatementIT extends BaseQueryIT { @Test public void testFoundIndexOnPartialEvalCaseStatement() throws Exception { - String query = "SELECT entity_id FROM ATABLE WHERE organization_id=? and CASE WHEN a_integer = 1234 THEN 1 WHEN x_integer = 3 THEN y_integer ELSE 3 END = 300"; + String query = "SELECT entity_id FROM " + tableName + " WHERE organization_id=? and CASE WHEN a_integer = 1234 THEN 1 WHEN x_integer = 3 THEN y_integer ELSE 3 END = 300"; String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); Connection conn = DriverManager.getConnection(url, props); @@ -159,7 +160,7 @@ public class CaseStatementIT extends BaseQueryIT { // TODO: we need some tests that have multiple versions of key values @Test public void testUnfoundMultiColumnCaseStatement() throws Exception { - String query = "SELECT entity_id, b_string FROM ATABLE WHERE organization_id=? and CASE WHEN a_integer = 1234 THEN 1 WHEN a_date < ? THEN y_integer WHEN x_integer = 4 THEN 4 ELSE 3 END = 4"; + String query = "SELECT entity_id, b_string FROM " + tableName + " WHERE organization_id=? and CASE WHEN a_integer = 1234 THEN 1 WHEN a_date < ? THEN y_integer WHEN x_integer = 4 THEN 4 ELSE 3 END = 4"; String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); Connection conn = DriverManager.getConnection(url, props); @@ -177,8 +178,9 @@ public class CaseStatementIT extends BaseQueryIT { } @Test + @Ignore // FIXME:PHOENIX-3695 public void testUnfoundSingleColumnCaseStatement() throws Exception { - String query = "SELECT entity_id, b_string FROM ATABLE WHERE organization_id=? and CASE WHEN a_integer = 0 or a_integer != 0 THEN 1 ELSE 0 END = 0"; + String query = "SELECT entity_id, b_string FROM " + tableName + " WHERE organization_id=? and CASE WHEN a_integer = 0 or a_integer != 0 THEN 1 ELSE 0 END = 0"; String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); Connection conn = DriverManager.getConnection(url, props); @@ -188,8 +190,8 @@ public class CaseStatementIT extends BaseQueryIT { url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 1); // Run query at timestamp 5 Connection upsertConn = DriverManager.getConnection(url, props); String upsertStmt = - "upsert into " + - "ATABLE(" + + "upsert into " + tableName + + "(" + " ENTITY_ID, " + " ORGANIZATION_ID, " + " A_INTEGER) " + @@ -211,7 +213,7 @@ public class CaseStatementIT extends BaseQueryIT { @Test public void testNonNullMultiCondCaseStatement() throws Exception { - String query = "SELECT CASE WHEN entity_id = '000000000000000' THEN 1 WHEN entity_id = '000000000000001' THEN 2 ELSE 3 END FROM ATABLE WHERE organization_id=?"; + String query = "SELECT CASE WHEN entity_id = '000000000000000' THEN 1 WHEN entity_id = '000000000000001' THEN 2 ELSE 3 END FROM " + tableName + " WHERE organization_id=?"; String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); Connection conn = DriverManager.getConnection(url, props); @@ -228,7 +230,7 @@ public class CaseStatementIT extends BaseQueryIT { @Test public void testNullMultiCondCaseStatement() throws Exception { - String query = "SELECT CASE WHEN entity_id = '000000000000000' THEN 1 WHEN entity_id = '000000000000001' THEN 2 END FROM ATABLE WHERE organization_id=?"; + String query = "SELECT CASE WHEN entity_id = '000000000000000' THEN 1 WHEN entity_id = '000000000000001' THEN 2 END FROM " + tableName + " WHERE organization_id=?"; String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); Connection conn = DriverManager.getConnection(url, props); @@ -245,7 +247,7 @@ public class CaseStatementIT extends BaseQueryIT { @Test public void testNullabilityMultiCondCaseStatement() throws Exception { - String query = "SELECT CASE WHEN a_integer <= 2 THEN ? WHEN a_integer = 3 THEN ? WHEN a_integer <= ? THEN ? ELSE 5 END AS a FROM ATABLE WHERE organization_id=?"; + String query = "SELECT CASE WHEN a_integer <= 2 THEN ? WHEN a_integer = 3 THEN ? WHEN a_integer <= ? THEN ? ELSE 5 END AS a FROM " + tableName + " WHERE organization_id=?"; String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); Connection conn = DriverManager.getConnection(url, props); http://git-wip-us.apache.org/repos/asf/phoenix/blob/3c7ff99b/phoenix-core/src/it/java/org/apache/phoenix/end2end/CastAndCoerceIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/CastAndCoerceIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/CastAndCoerceIT.java index 876c23a..bab18d5 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/CastAndCoerceIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/CastAndCoerceIT.java @@ -43,8 +43,8 @@ import org.junit.runners.Parameterized.Parameters; @RunWith(Parameterized.class) public class CastAndCoerceIT extends BaseQueryIT { - public CastAndCoerceIT(String indexDDL) { - super(indexDDL); + public CastAndCoerceIT(String indexDDL, boolean mutable, boolean columnEncoded) { + super(indexDDL, mutable, columnEncoded); } @Parameters(name="CastAndCoerceIT_{index}") // name is used by failsafe as file name in reports @@ -54,7 +54,7 @@ public class CastAndCoerceIT extends BaseQueryIT { @Test public void testCastOperatorInSelect() throws Exception { - String query = "SELECT CAST(a_integer AS decimal)/2 FROM aTable WHERE ?=organization_id and 5=a_integer"; + String query = "SELECT CAST(a_integer AS decimal)/2 FROM " + tableName + " WHERE ?=organization_id and 5=a_integer"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -72,7 +72,7 @@ public class CastAndCoerceIT extends BaseQueryIT { @Test public void testCastOperatorInWhere() throws Exception { - String query = "SELECT a_integer FROM aTable WHERE ?=organization_id and 2.5 = CAST(a_integer AS DECIMAL)/2 "; + String query = "SELECT a_integer FROM " + tableName + " WHERE ?=organization_id and 2.5 = CAST(a_integer AS DECIMAL)/2 "; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -90,7 +90,7 @@ public class CastAndCoerceIT extends BaseQueryIT { @Test public void testCoerceIntegerToLong() throws Exception { - String query = "SELECT entity_id FROM ATABLE WHERE organization_id=? AND x_long >= x_integer"; + String query = "SELECT entity_id FROM " + tableName + " WHERE organization_id=? AND x_long >= x_integer"; String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); Connection conn = DriverManager.getConnection(url, props); @@ -110,7 +110,7 @@ public class CastAndCoerceIT extends BaseQueryIT { @Test public void testCoerceLongToDecimal1() throws Exception { - String query = "SELECT entity_id FROM ATABLE WHERE organization_id=? AND x_decimal > x_integer"; + String query = "SELECT entity_id FROM " + tableName + " WHERE organization_id=? AND x_decimal > x_integer"; String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); Connection conn = DriverManager.getConnection(url, props); @@ -128,7 +128,7 @@ public class CastAndCoerceIT extends BaseQueryIT { @Test public void testCoerceLongToDecimal2() throws Exception { - String query = "SELECT entity_id FROM ATABLE WHERE organization_id=? AND x_integer <= x_decimal"; + String query = "SELECT entity_id FROM " + tableName + " WHERE organization_id=? AND x_integer <= x_decimal"; String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); Connection conn = DriverManager.getConnection(url, props); @@ -146,7 +146,7 @@ public class CastAndCoerceIT extends BaseQueryIT { @Test public void testCoerceTinyIntToSmallInt() throws Exception { - String query = "SELECT entity_id FROM ATABLE WHERE organization_id=? AND a_byte >= a_short"; + String query = "SELECT entity_id FROM " + tableName + " WHERE organization_id=? AND a_byte >= a_short"; String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); Connection conn = DriverManager.getConnection(url, props); @@ -176,12 +176,12 @@ public class CastAndCoerceIT extends BaseQueryIT { url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 3); conn = DriverManager.getConnection(url, props); conn.setAutoCommit(true); - conn.createStatement().execute("UPSERT INTO ATABLE(organization_id,entity_id,a_time,a_timestamp) SELECT organization_id,entity_id,a_date,a_date FROM ATABLE"); + conn.createStatement().execute("UPSERT INTO " + tableName + " (organization_id,entity_id,a_time,a_timestamp) SELECT organization_id,entity_id,a_date,a_date FROM " + tableName); url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); conn = DriverManager.getConnection(url, props); try { - query = "SELECT entity_id, CAST(a_date AS BIGINT) FROM ATABLE WHERE organization_id=? AND a_date IS NOT NULL LIMIT 1"; + query = "SELECT entity_id, CAST(a_date AS BIGINT) FROM " + tableName + " WHERE organization_id=? AND a_date IS NOT NULL LIMIT 1"; statement = conn.prepareStatement(query); statement.setString(1, tenantId); rs = statement.executeQuery(); @@ -190,7 +190,7 @@ public class CastAndCoerceIT extends BaseQueryIT { dateAsLong = rs.getLong(2); assertFalse(rs.next()); - query = "SELECT entity_id FROM ATABLE WHERE organization_id=? AND a_date = CAST(? AS DATE) LIMIT 1"; + query = "SELECT entity_id FROM " + tableName + " WHERE organization_id=? AND a_date = CAST(? AS DATE) LIMIT 1"; statement = conn.prepareStatement(query); statement.setString(1, tenantId); statement.setLong(2, dateAsLong); @@ -199,7 +199,7 @@ public class CastAndCoerceIT extends BaseQueryIT { assertEquals(ROW1, rs.getString(1)); assertFalse(rs.next()); - query = "SELECT entity_id, CAST(a_time AS BIGINT) FROM ATABLE WHERE organization_id=? AND a_time IS NOT NULL LIMIT 1"; + query = "SELECT entity_id, CAST(a_time AS BIGINT) FROM " + tableName + " WHERE organization_id=? AND a_time IS NOT NULL LIMIT 1"; statement = conn.prepareStatement(query); statement.setString(1, tenantId); rs = statement.executeQuery(); @@ -208,7 +208,7 @@ public class CastAndCoerceIT extends BaseQueryIT { dateAsLong = rs.getLong(2); assertFalse(rs.next()); - query = "SELECT entity_id FROM ATABLE WHERE organization_id=? AND a_time = CAST(? AS TIME) LIMIT 1"; + query = "SELECT entity_id FROM " + tableName + " WHERE organization_id=? AND a_time = CAST(? AS TIME) LIMIT 1"; statement = conn.prepareStatement(query); statement.setString(1, tenantId); statement.setLong(2, dateAsLong); @@ -217,7 +217,7 @@ public class CastAndCoerceIT extends BaseQueryIT { assertEquals(ROW1, rs.getString(1)); assertFalse(rs.next()); - query = "SELECT entity_id, CAST(a_timestamp AS DECIMAL) FROM ATABLE WHERE organization_id=? AND a_timestamp IS NOT NULL LIMIT 1"; + query = "SELECT entity_id, CAST(a_timestamp AS DECIMAL) FROM " + tableName + " WHERE organization_id=? AND a_timestamp IS NOT NULL LIMIT 1"; statement = conn.prepareStatement(query); statement.setString(1, tenantId); rs = statement.executeQuery(); @@ -226,7 +226,7 @@ public class CastAndCoerceIT extends BaseQueryIT { dateAsDecimal = rs.getBigDecimal(2); assertFalse(rs.next()); - query = "SELECT entity_id FROM ATABLE WHERE organization_id=? AND a_timestamp = CAST(? AS TIMESTAMP) LIMIT 1"; + query = "SELECT entity_id FROM " + tableName + " WHERE organization_id=? AND a_timestamp = CAST(? AS TIMESTAMP) LIMIT 1"; statement = conn.prepareStatement(query); statement.setString(1, tenantId); statement.setBigDecimal(2, dateAsDecimal); @@ -236,7 +236,7 @@ public class CastAndCoerceIT extends BaseQueryIT { assertFalse(rs.next()); - query = "SELECT entity_id, CAST(a_timestamp AS BIGINT) FROM ATABLE WHERE organization_id=? AND a_timestamp IS NOT NULL LIMIT 1"; + query = "SELECT entity_id, CAST(a_timestamp AS BIGINT) FROM " + tableName + " WHERE organization_id=? AND a_timestamp IS NOT NULL LIMIT 1"; statement = conn.prepareStatement(query); statement.setString(1, tenantId); rs = statement.executeQuery(); @@ -245,7 +245,7 @@ public class CastAndCoerceIT extends BaseQueryIT { dateAsLong = rs.getLong(2); assertFalse(rs.next()); - query = "SELECT entity_id FROM ATABLE WHERE organization_id=? AND a_timestamp = CAST(? AS TIMESTAMP) LIMIT 1"; + query = "SELECT entity_id FROM " + tableName + " WHERE organization_id=? AND a_timestamp = CAST(? AS TIMESTAMP) LIMIT 1"; statement = conn.prepareStatement(query); statement.setString(1, tenantId); statement.setLong(2, dateAsLong); http://git-wip-us.apache.org/repos/asf/phoenix/blob/3c7ff99b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ClientTimeArithmeticQueryIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ClientTimeArithmeticQueryIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ClientTimeArithmeticQueryIT.java index ea4f3ab..3330a08 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ClientTimeArithmeticQueryIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ClientTimeArithmeticQueryIT.java @@ -60,8 +60,8 @@ import com.google.common.collect.Lists; @RunWith(Parameterized.class) public class ClientTimeArithmeticQueryIT extends BaseQueryIT { - public ClientTimeArithmeticQueryIT(String indexDDL) { - super(indexDDL); + public ClientTimeArithmeticQueryIT(String indexDDL, boolean mutable, boolean columnEncoded) { + super(indexDDL, mutable, columnEncoded); } @Parameters(name="ClientTimeArithmeticQueryIT_{index}") // name is used by failsafe as file name in reports @@ -71,7 +71,7 @@ public class ClientTimeArithmeticQueryIT extends BaseQueryIT { @Test public void testDateAdd() throws Exception { - String query = "SELECT entity_id, b_string FROM ATABLE WHERE a_date + CAST(0.5 AS DOUBLE) < ?"; + String query = "SELECT entity_id, b_string FROM " + tableName + " WHERE a_date + CAST(0.5 AS DOUBLE) < ?"; String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); Connection conn = DriverManager.getConnection(url, props); @@ -92,7 +92,7 @@ public class ClientTimeArithmeticQueryIT extends BaseQueryIT { @Test public void testDecimalAddExpression() throws Exception { - String query = "SELECT entity_id FROM aTable where A_INTEGER + X_DECIMAL > 11"; + String query = "SELECT entity_id FROM " + tableName + " where A_INTEGER + X_DECIMAL > 11"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -111,7 +111,7 @@ public class ClientTimeArithmeticQueryIT extends BaseQueryIT { @Test public void testDoubleAddExpression() throws Exception { - String query = "SELECT entity_id FROM aTable where a_double + a_float > 0.08"; + String query = "SELECT entity_id FROM " + tableName + " where a_double + a_float > 0.08"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -130,7 +130,7 @@ public class ClientTimeArithmeticQueryIT extends BaseQueryIT { @Test public void testUnsignedDoubleAddExpression() throws Exception { - String query = "SELECT entity_id FROM aTable where a_unsigned_double + a_unsigned_float > 0.08"; + String query = "SELECT entity_id FROM " + tableName + " where a_unsigned_double + a_unsigned_float > 0.08"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -153,11 +153,11 @@ public class ClientTimeArithmeticQueryIT extends BaseQueryIT { @Test public void testValidArithmetic() throws Exception { String[] queries = new String[] { - "SELECT entity_id,organization_id FROM atable where (A_DATE - A_DATE) * 5 < 0", - "SELECT entity_id,organization_id FROM atable where 1 + A_DATE < A_DATE", - "SELECT entity_id,organization_id FROM atable where A_DATE - 1 < A_DATE", - "SELECT entity_id,organization_id FROM atable where A_INTEGER - 45 < 0", - "SELECT entity_id,organization_id FROM atable where X_DECIMAL / 45 < 0", }; + "SELECT entity_id,organization_id FROM " + tableName + " where (A_DATE - A_DATE) * 5 < 0", + "SELECT entity_id,organization_id FROM " + tableName + " where 1 + A_DATE < A_DATE", + "SELECT entity_id,organization_id FROM " + tableName + " where A_DATE - 1 < A_DATE", + "SELECT entity_id,organization_id FROM " + tableName + " where A_INTEGER - 45 < 0", + "SELECT entity_id,organization_id FROM " + tableName + " where X_DECIMAL / 45 < 0", }; for (String query : queries) { Properties props = new Properties(); @@ -175,7 +175,7 @@ public class ClientTimeArithmeticQueryIT extends BaseQueryIT { @Test public void testIntSubtractionExpression() throws Exception { - String query = "SELECT entity_id FROM aTable where A_INTEGER - 4 <= 0"; + String query = "SELECT entity_id FROM " + tableName + " where A_INTEGER - 4 <= 0"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -189,7 +189,7 @@ public class ClientTimeArithmeticQueryIT extends BaseQueryIT { } @Test public void testDecimalSubtraction1Expression() throws Exception { - String query = "SELECT entity_id FROM aTable where A_INTEGER - 3.5 <= 0"; + String query = "SELECT entity_id FROM " + tableName + " where A_INTEGER - 3.5 <= 0"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -203,7 +203,7 @@ public class ClientTimeArithmeticQueryIT extends BaseQueryIT { } @Test public void testDecimalSubtraction2Expression() throws Exception {// check if decimal part makes a difference - String query = "SELECT entity_id FROM aTable where X_DECIMAL - 3.5 > 0"; + String query = "SELECT entity_id FROM " + tableName + " where X_DECIMAL - 3.5 > 0"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -219,7 +219,7 @@ public class ClientTimeArithmeticQueryIT extends BaseQueryIT { } @Test public void testLongSubtractionExpression() throws Exception { - String query = "SELECT entity_id FROM aTable where X_LONG - 1 < 0"; + String query = "SELECT entity_id FROM " + tableName + " where X_LONG - 1 < 0"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -235,7 +235,7 @@ public class ClientTimeArithmeticQueryIT extends BaseQueryIT { } @Test public void testDoubleSubtractionExpression() throws Exception { - String query = "SELECT entity_id FROM aTable where a_double - CAST(0.0002 AS DOUBLE) < 0"; + String query = "SELECT entity_id FROM " + tableName + " where a_double - CAST(0.0002 AS DOUBLE) < 0"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -251,7 +251,7 @@ public class ClientTimeArithmeticQueryIT extends BaseQueryIT { } @Test public void testSmallIntSubtractionExpression() throws Exception { - String query = "SELECT entity_id FROM aTable where a_short - 129 = 0"; + String query = "SELECT entity_id FROM " + tableName + " where a_short - 129 = 0"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -268,7 +268,7 @@ public class ClientTimeArithmeticQueryIT extends BaseQueryIT { @Test public void testTernarySubtractionExpression() throws Exception { - String query = "SELECT entity_id FROM aTable where X_INTEGER - X_LONG - 10 < 0"; + String query = "SELECT entity_id FROM " + tableName + " where X_INTEGER - X_LONG - 10 < 0"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -286,7 +286,7 @@ public class ClientTimeArithmeticQueryIT extends BaseQueryIT { } @Test public void testSelectWithSubtractionExpression() throws Exception { - String query = "SELECT entity_id, x_integer - 4 FROM aTable where x_integer - 4 = 0"; + String query = "SELECT entity_id, x_integer - 4 FROM " + tableName + " where x_integer - 4 = 0"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -303,7 +303,7 @@ public class ClientTimeArithmeticQueryIT extends BaseQueryIT { } @Test public void testConstantSubtractionExpression() throws Exception { - String query = "SELECT entity_id FROM aTable where A_INTEGER = 5 - 1 - 2"; + String query = "SELECT entity_id FROM " + tableName + " where A_INTEGER = 5 - 1 - 2"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -320,7 +320,7 @@ public class ClientTimeArithmeticQueryIT extends BaseQueryIT { @Test public void testIntDivideExpression() throws Exception { - String query = "SELECT entity_id FROM aTable where A_INTEGER / 3 > 2"; + String query = "SELECT entity_id FROM " + tableName + " where A_INTEGER / 3 > 2"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -337,7 +337,7 @@ public class ClientTimeArithmeticQueryIT extends BaseQueryIT { @Test public void testDoubleDivideExpression() throws Exception { - String query = "SELECT entity_id FROM aTable where a_double / CAST(3.0 AS DOUBLE) = 0.0003"; + String query = "SELECT entity_id FROM " + tableName + " where a_double / CAST(3.0 AS DOUBLE) = 0.0003"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -354,7 +354,7 @@ public class ClientTimeArithmeticQueryIT extends BaseQueryIT { @Test public void testSmallIntDivideExpression() throws Exception { - String query = "SELECT entity_id FROM aTable where a_short / 135 = 1"; + String query = "SELECT entity_id FROM " + tableName + " where a_short / 135 = 1"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -371,7 +371,7 @@ public class ClientTimeArithmeticQueryIT extends BaseQueryIT { @Test public void testIntToDecimalDivideExpression() throws Exception { - String query = "SELECT entity_id FROM aTable where A_INTEGER / 3.0 > 2"; + String query = "SELECT entity_id FROM " + tableName + " where A_INTEGER / 3.0 > 2"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -386,7 +386,7 @@ public class ClientTimeArithmeticQueryIT extends BaseQueryIT { @Test public void testConstantDivideExpression() throws Exception { - String query = "SELECT entity_id FROM aTable where A_INTEGER = 9 / 3 / 3"; + String query = "SELECT entity_id FROM " + tableName + " where A_INTEGER = 9 / 3 / 3"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -402,7 +402,7 @@ public class ClientTimeArithmeticQueryIT extends BaseQueryIT { } @Test public void testSelectWithDivideExpression() throws Exception { - String query = "SELECT entity_id, a_integer/3 FROM aTable where a_integer = 9"; + String query = "SELECT entity_id, a_integer/3 FROM " + tableName + " where a_integer = 9"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -420,7 +420,7 @@ public class ClientTimeArithmeticQueryIT extends BaseQueryIT { @Test public void testNegateExpression() throws Exception { - String query = "SELECT entity_id FROM aTable where A_INTEGER - 4 = -1"; + String query = "SELECT entity_id FROM " + tableName + " where A_INTEGER - 4 = -1"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -437,7 +437,7 @@ public class ClientTimeArithmeticQueryIT extends BaseQueryIT { @Test public void testIntMultiplyExpression() throws Exception { - String query = "SELECT entity_id FROM aTable where A_INTEGER * 2 = 16"; + String query = "SELECT entity_id FROM " + tableName + " where A_INTEGER * 2 = 16"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -454,7 +454,7 @@ public class ClientTimeArithmeticQueryIT extends BaseQueryIT { @Test public void testDoubleMultiplyExpression() throws Exception { - String query = "SELECT entity_id FROM aTable where A_DOUBLE * CAST(2.0 AS DOUBLE) = 0.0002"; + String query = "SELECT entity_id FROM " + tableName + " where A_DOUBLE * CAST(2.0 AS DOUBLE) = 0.0002"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -471,7 +471,7 @@ public class ClientTimeArithmeticQueryIT extends BaseQueryIT { @Test public void testLongMultiplyExpression() throws Exception { - String query = "SELECT entity_id FROM aTable where X_LONG * 2 * 2 = 20"; + String query = "SELECT entity_id FROM " + tableName + " where X_LONG * 2 * 2 = 20"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -488,7 +488,7 @@ public class ClientTimeArithmeticQueryIT extends BaseQueryIT { @Test public void testIntToDecimalMultiplyExpression() throws Exception { - String query = "SELECT entity_id FROM aTable where A_INTEGER * 1.5 > 9"; + String query = "SELECT entity_id FROM " + tableName + " where A_INTEGER * 1.5 > 9"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -504,7 +504,7 @@ public class ClientTimeArithmeticQueryIT extends BaseQueryIT { @Test public void testDecimalMultiplyExpression() throws Exception { - String query = "SELECT entity_id FROM aTable where X_DECIMAL * A_INTEGER > 29.5"; + String query = "SELECT entity_id FROM " + tableName + " where X_DECIMAL * A_INTEGER > 29.5"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -519,7 +519,7 @@ public class ClientTimeArithmeticQueryIT extends BaseQueryIT { @Test public void testIntAddExpression() throws Exception { - String query = "SELECT entity_id FROM aTable where A_INTEGER + 2 = 4"; + String query = "SELECT entity_id FROM " + tableName + " where A_INTEGER + 2 = 4"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -536,11 +536,11 @@ public class ClientTimeArithmeticQueryIT extends BaseQueryIT { @Test public void testCoalesceFunction() throws Exception { - String query = "SELECT entity_id FROM aTable WHERE coalesce(X_DECIMAL,0.0) = 0.0"; + String query = "SELECT entity_id FROM " + tableName + " WHERE coalesce(X_DECIMAL,0.0) = 0.0"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 10)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); - PreparedStatement stmt = conn.prepareStatement("UPSERT INTO aTable(organization_id,entity_id,x_decimal) values(?,?,?)"); + PreparedStatement stmt = conn.prepareStatement("UPSERT INTO " + tableName + " (organization_id,entity_id,x_decimal) values(?,?,?)"); stmt.setString(1, getOrganizationId()); stmt.setString(2, ROW1); stmt.setBigDecimal(3, BigDecimal.valueOf(1.0)); @@ -576,7 +576,7 @@ public class ClientTimeArithmeticQueryIT extends BaseQueryIT { @Test public void testDateSubtract() throws Exception { - String query = "SELECT entity_id, b_string FROM ATABLE WHERE a_date - CAST(0.5 AS DOUBLE) > ?"; + String query = "SELECT entity_id, b_string FROM " + tableName + " WHERE a_date - CAST(0.5 AS DOUBLE) > ?"; String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); Connection conn = DriverManager.getConnection(url, props); @@ -602,7 +602,7 @@ public class ClientTimeArithmeticQueryIT extends BaseQueryIT { url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 15); Connection conn = DriverManager.getConnection(url, props); - PreparedStatement statement = conn.prepareStatement("UPSERT INTO ATABLE(organization_id,entity_id,a_time) VALUES(?,?,?)"); + PreparedStatement statement = conn.prepareStatement("UPSERT INTO " + tableName + " (organization_id,entity_id,a_time) VALUES(?,?,?)"); statement.setString(1, getOrganizationId()); statement.setString(2, ROW2); statement.setDate(3, date); @@ -625,7 +625,7 @@ public class ClientTimeArithmeticQueryIT extends BaseQueryIT { url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 25); conn = DriverManager.getConnection(url, props); try { - statement = conn.prepareStatement("SELECT entity_id, b_string FROM ATABLE WHERE a_date - a_time > 1"); + statement = conn.prepareStatement("SELECT entity_id, b_string FROM " + tableName + " WHERE a_date - a_time > 1"); ResultSet rs = statement.executeQuery(); @SuppressWarnings("unchecked") List<List<Object>> expectedResults = Lists.newArrayList( http://git-wip-us.apache.org/repos/asf/phoenix/blob/3c7ff99b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ColumnEncodedBytesPropIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ColumnEncodedBytesPropIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ColumnEncodedBytesPropIT.java new file mode 100644 index 0000000..dd64428 --- /dev/null +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ColumnEncodedBytesPropIT.java @@ -0,0 +1,95 @@ +package org.apache.phoenix.end2end; + +import static org.apache.phoenix.util.TestUtil.TEST_PROPERTIES; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.Properties; + +import org.apache.phoenix.exception.SQLExceptionCode; +import org.apache.phoenix.jdbc.PhoenixConnection; +import org.apache.phoenix.query.QueryConstants; +import org.apache.phoenix.schema.PTable; +import org.apache.phoenix.schema.PTable.QualifierEncodingScheme; +import org.apache.phoenix.schema.PTableKey; +import org.apache.phoenix.util.PropertiesUtil; +import org.apache.phoenix.util.SchemaUtil; +import org.junit.Test; + +public class ColumnEncodedBytesPropIT extends ParallelStatsDisabledIT { + + private String generateColsDDL(int numCols) { + StringBuilder sb = new StringBuilder(); + for (int i=0; i<numCols; ++i) { + if (i>0) { + sb.append(" , "); + } + sb.append("col_").append(i).append(" VARCHAR "); + } + return sb.toString(); + } + + @Test + public void testValidateProperty() throws SQLException { + Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); + String dataTableFullName1 = SchemaUtil.getTableName("", generateUniqueName()); + String dataTableFullName2 = SchemaUtil.getTableName("", generateUniqueName()); + try (Connection conn = DriverManager.getConnection(getUrl(), props);) { + Statement stmt = conn.createStatement(); + String ddl = "CREATE TABLE " + dataTableFullName1 + + " (id varchar not null, val varchar " + + " CONSTRAINT pk PRIMARY KEY (id)) COLUMN_ENCODED_BYTES=4"; + stmt.execute(ddl); + + ddl = "CREATE TABLE " + dataTableFullName2 + + " (id varchar not null, val varchar " + + " CONSTRAINT pk PRIMARY KEY (id)) COLUMN_ENCODED_BYTES=NONE"; + stmt.execute(ddl); + + PhoenixConnection phxConn = conn.unwrap(PhoenixConnection.class); + PTable dataTable1 = phxConn.getTable(new PTableKey(null, dataTableFullName1)); + assertEquals("Encoding scheme set incorrectly", QualifierEncodingScheme.FOUR_BYTE_QUALIFIERS, dataTable1.getEncodingScheme()); + + PTable dataTable2 = phxConn.getTable(new PTableKey(null, dataTableFullName2)); + assertEquals("Encoding scheme set incorrectly", QualifierEncodingScheme.NON_ENCODED_QUALIFIERS, dataTable2.getEncodingScheme()); + } + } + + @Test + public void testValidateMaxCols() throws SQLException { + Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); + String dataTableFullName = SchemaUtil.getTableName("", generateUniqueName()); + try (Connection conn = DriverManager.getConnection(getUrl(), props);) { + Statement stmt = conn.createStatement(); + // create table with more cols than is supported by the encoding + try { + stmt.execute("CREATE TABLE " + dataTableFullName + + " (id varchar not null, " + generateColsDDL(QualifierEncodingScheme.ONE_BYTE_QUALIFIERS.getMaxQualifier()-QueryConstants.ENCODED_CQ_COUNTER_INITIAL_VALUE+2) + + " CONSTRAINT pk PRIMARY KEY (id)) COLUMN_ENCODED_BYTES=1"); + fail(); + } + catch (SQLException e) { + assertEquals(SQLExceptionCode.MAX_COLUMNS_EXCEEDED.getErrorCode(), e.getErrorCode()); + } + + // create table with number of cols equal to that supported by the encoding + stmt.execute("CREATE TABLE " + dataTableFullName + + " (id varchar not null, " + generateColsDDL(QualifierEncodingScheme.ONE_BYTE_QUALIFIERS.getMaxQualifier()-QueryConstants.ENCODED_CQ_COUNTER_INITIAL_VALUE+1) + + " CONSTRAINT pk PRIMARY KEY (id)) COLUMN_ENCODED_BYTES=1"); + + // add one more column + try { + stmt.execute("ALTER TABLE " + dataTableFullName + " ADD val_x VARCHAR"); + fail(); + } + catch (SQLException e) { + assertEquals(SQLExceptionCode.MAX_COLUMNS_EXCEEDED.getErrorCode(), e.getErrorCode()); + } + } + } + +} http://git-wip-us.apache.org/repos/asf/phoenix/blob/3c7ff99b/phoenix-core/src/it/java/org/apache/phoenix/end2end/CountDistinctCompressionIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/CountDistinctCompressionIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/CountDistinctCompressionIT.java index 1539ad7..db4542e 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/CountDistinctCompressionIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/CountDistinctCompressionIT.java @@ -51,7 +51,7 @@ public class CountDistinctCompressionIT extends BaseUniqueNamesOwnClusterIT { @Test public void testDistinctCountOnColumn() throws Exception { String tenantId = getOrganizationId(); - String tableName = initATableValues(null, tenantId, getDefaultSplits(tenantId), (Date)null, null, getUrl()); + String tableName = initATableValues(null, tenantId, getDefaultSplits(tenantId), (Date)null, null, getUrl(), null); String query = "SELECT count(DISTINCT A_STRING) FROM " + tableName; http://git-wip-us.apache.org/repos/asf/phoenix/blob/3c7ff99b/phoenix-core/src/it/java/org/apache/phoenix/end2end/CreateTableIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/CreateTableIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/CreateTableIT.java index 30bdb41..633d93c 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/CreateTableIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/CreateTableIT.java @@ -19,6 +19,7 @@ package org.apache.phoenix.end2end; import static org.apache.hadoop.hbase.HColumnDescriptor.DEFAULT_REPLICATION_SCOPE; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; @@ -26,21 +27,30 @@ import static org.junit.Assert.fail; import java.sql.Connection; import java.sql.DriverManager; +import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.List; +import java.util.Map.Entry; import java.util.Properties; import org.apache.hadoop.hbase.HColumnDescriptor; import org.apache.hadoop.hbase.client.HBaseAdmin; import org.apache.hadoop.hbase.util.Bytes; import org.apache.phoenix.exception.SQLExceptionCode; +import org.apache.phoenix.jdbc.PhoenixConnection; import org.apache.phoenix.jdbc.PhoenixStatement; import org.apache.phoenix.query.KeyRange; import org.apache.phoenix.query.QueryServices; import org.apache.phoenix.schema.NewerTableAlreadyExistsException; +import org.apache.phoenix.schema.PTable; +import org.apache.phoenix.schema.PTable.EncodedCQCounter; +import org.apache.phoenix.schema.PTable.ImmutableStorageScheme; +import org.apache.phoenix.schema.PTable.QualifierEncodingScheme; +import org.apache.phoenix.schema.PTableKey; import org.apache.phoenix.schema.SchemaNotFoundException; import org.apache.phoenix.schema.TableAlreadyExistsException; +import org.apache.phoenix.schema.TableNotFoundException; import org.apache.phoenix.util.PhoenixRuntime; import org.apache.phoenix.util.PropertiesUtil; import org.apache.phoenix.util.SchemaUtil; @@ -502,4 +512,51 @@ public class CreateTableIT extends BaseClientManagedTimeIT { fail(); } } + + @Test + public void testCreateTableIfNotExistsForEncodedColumnNames() throws Exception { + long ts = nextTimestamp(); + Properties props = PropertiesUtil.deepCopy(TestUtil.TEST_PROPERTIES); + props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts)); + String tableName = "testCreateTableIfNotExistsForEncodedColumnNames".toUpperCase(); + String createTableDDL = "CREATE TABLE IF NOT EXISTS " + tableName + " (pk INTEGER PRIMARY KEY)"; + try (Connection conn = DriverManager.getConnection(getUrl(), props)) { + conn.createStatement().execute(createTableDDL); + assertColumnEncodingMetadata(QualifierEncodingScheme.TWO_BYTE_QUALIFIERS, ImmutableStorageScheme.ONE_CELL_PER_COLUMN, tableName, conn); + } + // Execute the ddl again + props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(nextTimestamp())); + try (Connection conn = DriverManager.getConnection(getUrl(), props)) { + conn.createStatement().execute(createTableDDL); + ResultSet rs = conn.createStatement().executeQuery("SELECT * FROM " + tableName); + assertFalse(rs.next()); + assertColumnEncodingMetadata(QualifierEncodingScheme.TWO_BYTE_QUALIFIERS, ImmutableStorageScheme.ONE_CELL_PER_COLUMN, tableName, conn); + } + // Now execute the ddl with a different COLUMN_ENCODED_BYTES. This shouldn't change the original encoded bytes setting. + props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(nextTimestamp())); + try (Connection conn = DriverManager.getConnection(getUrl(), props)) { + conn.createStatement().execute(createTableDDL + " COLUMN_ENCODED_BYTES = 1"); + ResultSet rs = conn.createStatement().executeQuery("SELECT * FROM " + tableName); + assertFalse(rs.next()); + assertColumnEncodingMetadata(QualifierEncodingScheme.TWO_BYTE_QUALIFIERS, ImmutableStorageScheme.ONE_CELL_PER_COLUMN, tableName, conn); + } + // Now execute the ddl where COLUMN_ENCODED_BYTES=0. This shouldn't change the original encoded bytes setting. + props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(nextTimestamp())); + try (Connection conn = DriverManager.getConnection(getUrl(), props)) { + conn.createStatement().execute(createTableDDL + " COLUMN_ENCODED_BYTES = 0"); + ResultSet rs = conn.createStatement().executeQuery("SELECT * FROM " + tableName); + assertFalse(rs.next()); + assertColumnEncodingMetadata(QualifierEncodingScheme.TWO_BYTE_QUALIFIERS, ImmutableStorageScheme.ONE_CELL_PER_COLUMN, tableName, conn); + } + + } + + private void assertColumnEncodingMetadata(QualifierEncodingScheme expectedEncodingScheme, + ImmutableStorageScheme expectedStorageScheme, String tableName, + Connection conn) throws Exception { + PhoenixConnection phxConn = conn.unwrap(PhoenixConnection.class); + PTable table = phxConn.getTable(new PTableKey(null, tableName)); + assertEquals(expectedEncodingScheme, table.getEncodingScheme()); + assertEquals(expectedStorageScheme, table.getImmutableStorageScheme()); + } } http://git-wip-us.apache.org/repos/asf/phoenix/blob/3c7ff99b/phoenix-core/src/it/java/org/apache/phoenix/end2end/DateTimeIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/DateTimeIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/DateTimeIT.java index ad45d5e..fb43538 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/DateTimeIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/DateTimeIT.java @@ -76,7 +76,7 @@ public class DateTimeIT extends ParallelStatsDisabledIT { private String initAtable() throws SQLException { String tableName = generateUniqueName(); - ensureTableCreated(getUrl(), tableName, ATABLE_NAME, (byte[][])null); + ensureTableCreated(getUrl(), tableName, ATABLE_NAME, (byte[][])null, null); PreparedStatement stmt = conn.prepareStatement( "upsert into " + tableName + "(" + http://git-wip-us.apache.org/repos/asf/phoenix/blob/3c7ff99b/phoenix-core/src/it/java/org/apache/phoenix/end2end/DefaultColumnValueIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/DefaultColumnValueIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/DefaultColumnValueIT.java index 62d79bc..7c04d01 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/DefaultColumnValueIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/DefaultColumnValueIT.java @@ -37,6 +37,7 @@ import org.apache.phoenix.exception.SQLExceptionCode; import org.apache.phoenix.util.ByteUtil; import org.apache.phoenix.util.DateUtil; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; http://git-wip-us.apache.org/repos/asf/phoenix/blob/3c7ff99b/phoenix-core/src/it/java/org/apache/phoenix/end2end/DerivedTableIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/DerivedTableIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/DerivedTableIT.java index 67be132..39fb747 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/DerivedTableIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/DerivedTableIT.java @@ -74,7 +74,7 @@ public class DerivedTableIT extends BaseClientManagedTimeIT { @Before public void initTable() throws Exception { ts = nextTimestamp(); - initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId), null, ts, getUrl()); + initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId), null, ts, getUrl(), null); if (indexDDL != null && indexDDL.length > 0) { Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts)); http://git-wip-us.apache.org/repos/asf/phoenix/blob/3c7ff99b/phoenix-core/src/it/java/org/apache/phoenix/end2end/DistinctCountIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/DistinctCountIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/DistinctCountIT.java index 4484fc1..a7482cb 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/DistinctCountIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/DistinctCountIT.java @@ -287,9 +287,9 @@ public class DistinctCountIT extends BaseClientManagedTimeIT { protected static void initATableValues(String tenantId1, String tenantId2, byte[][] splits, Date date, Long ts) throws Exception { if (ts == null) { - ensureTableCreated(getUrl(), ATABLE_NAME, ATABLE_NAME, splits); + ensureTableCreated(getUrl(), ATABLE_NAME, ATABLE_NAME, splits, null); } else { - ensureTableCreated(getUrl(), ATABLE_NAME, ATABLE_NAME, splits, ts-2); + ensureTableCreated(getUrl(), ATABLE_NAME, ATABLE_NAME, splits, ts-2, null); } Properties props = new Properties(); http://git-wip-us.apache.org/repos/asf/phoenix/blob/3c7ff99b/phoenix-core/src/it/java/org/apache/phoenix/end2end/DynamicColumnIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/DynamicColumnIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/DynamicColumnIT.java index 25e7230..3f02113 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/DynamicColumnIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/DynamicColumnIT.java @@ -213,5 +213,68 @@ public class DynamicColumnIT extends ParallelStatsDisabledIT { conn.close(); } } + + @Test + public void testDynamicColumnOnNewTable() throws Exception { + String tableName = generateUniqueName(); + String ddl = "create table " + tableName + + " (entry varchar not null," + + " F varchar," + + " A.F1v1 varchar," + + " A.F1v2 varchar," + + " B.F2v1 varchar" + + " CONSTRAINT pk PRIMARY KEY (entry))"; + String dml = "UPSERT INTO " + tableName + " values (?, ?, ?, ?, ?)"; + try (Connection conn = DriverManager.getConnection(getUrl())) { + conn.createStatement().execute(ddl); + try (PreparedStatement stmt = conn.prepareStatement(dml)) { + stmt.setString(1, "entry"); + stmt.setString(2, "a"); + stmt.setString(3, "b"); + stmt.setString(4, "c"); + stmt.setString(5, "d"); + stmt.executeUpdate(); + conn.commit(); + } + dml = "UPSERT INTO " + tableName + "(entry, F, A.F1V1, A.F1v2, B.F2V1, DYNCOL1 VARCHAR, DYNCOL2 VARCHAR) VALUES (?, ?, ?, ?, ?, ?, ?)"; + try (PreparedStatement stmt = conn.prepareStatement(dml)) { + stmt.setString(1, "dynentry"); + stmt.setString(2, "a"); + stmt.setString(3, "b"); + stmt.setString(4, "c"); + stmt.setString(5, "d"); + stmt.setString(6, "e"); + stmt.setString(7, "f"); + stmt.executeUpdate(); + conn.commit(); + } + + // test dynamic column in where clause + String query = "SELECT entry, F from " + tableName + " (DYNCOL1 VARCHAR, DYNCOL2 VARCHAR) " + " WHERE DYNCOL1 = ?"; + try (PreparedStatement stmt = conn.prepareStatement(query)) { + stmt.setString(1, "e"); + ResultSet rs = stmt.executeQuery(); + assertTrue(rs.next()); + assertEquals("dynentry", rs.getString(1)); + assertEquals("a", rs.getString(2)); + assertFalse(rs.next()); + } + + // test dynamic column with projection + query = "SELECT entry, dyncol1, dyncol2 from " + tableName + " (DYNCOL1 VARCHAR, DYNCOL2 VARCHAR) "; + try (PreparedStatement stmt = conn.prepareStatement(query)) { + ResultSet rs = stmt.executeQuery(); + assertTrue(rs.next()); + assertEquals("dynentry", rs.getString(1)); + assertEquals("e", rs.getString(2)); + assertEquals("f", rs.getString(3)); + assertTrue(rs.next()); + assertEquals("entry", rs.getString(1)); + assertEquals(null, rs.getString(2)); + assertEquals(null, rs.getString(2)); + assertFalse(rs.next()); + } + } + } } http://git-wip-us.apache.org/repos/asf/phoenix/blob/3c7ff99b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ExtendedQueryExecIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ExtendedQueryExecIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ExtendedQueryExecIT.java index f5c1df2..f46b3e4 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ExtendedQueryExecIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ExtendedQueryExecIT.java @@ -52,7 +52,7 @@ public class ExtendedQueryExecIT extends BaseClientManagedTimeIT { Date date = new Date(1); String tenantId = getOrganizationId(); - initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId),date, ts, getUrl()); + initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId),date, ts, getUrl(), null); Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts+1)); @@ -75,7 +75,7 @@ public class ExtendedQueryExecIT extends BaseClientManagedTimeIT { public void testTypeMismatchToDateFunctionBind() throws Exception { long ts = nextTimestamp(); String tenantId = getOrganizationId(); - initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId),null, ts, getUrl()); + initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId),null, ts, getUrl(), null); Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); Connection conn = DriverManager.getConnection(getUrl(), props); @@ -103,7 +103,7 @@ public class ExtendedQueryExecIT extends BaseClientManagedTimeIT { Date date = new Date(1); String tenantId = getOrganizationId(); - initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId),date, ts, getUrl()); + initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId),date, ts, getUrl(), null); Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts+1)); Connection conn = DriverManager.getConnection(getUrl(), props); @@ -148,7 +148,7 @@ public class ExtendedQueryExecIT extends BaseClientManagedTimeIT { Date date = new Date(1); String tenantId = getOrganizationId(); - initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId),date, ts, getUrl()); + initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId),date, ts, getUrl(), null); Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts+1)); Connection conn = DriverManager.getConnection(getUrl(), props); http://git-wip-us.apache.org/repos/asf/phoenix/blob/3c7ff99b/phoenix-core/src/it/java/org/apache/phoenix/end2end/FunkyNamesIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/FunkyNamesIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/FunkyNamesIT.java index 26e13eb..131e146 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/FunkyNamesIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/FunkyNamesIT.java @@ -39,7 +39,7 @@ import org.junit.Test; public class FunkyNamesIT extends BaseClientManagedTimeIT { protected static void initTableValues(byte[][] splits, long ts) throws Exception { - ensureTableCreated(getUrl(), FUNKY_NAME, FUNKY_NAME,splits, ts-2); + ensureTableCreated(getUrl(), FUNKY_NAME, FUNKY_NAME,splits, ts-2, null); String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + ts; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES);