phoenix-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From elilev...@apache.org
Subject git commit: Fix for PHOENIX-1077 in 4.0 branch (fixed by Kyle Buzsaki)
Date Sat, 12 Jul 2014 05:55:40 GMT
Repository: phoenix
Updated Branches:
  refs/heads/4.0 55eeb3729 -> 22d6478b7


Fix for PHOENIX-1077 in 4.0 branch (fixed by Kyle Buzsaki)


Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo
Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/22d6478b
Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/22d6478b
Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/22d6478b

Branch: refs/heads/4.0
Commit: 22d6478b7059904b1e3db81cae9fa23171d8ace5
Parents: 55eeb37
Author: Eli Levine <elilevine@apache.org>
Authored: Fri Jul 11 22:55:25 2014 -0700
Committer: Eli Levine <elilevine@apache.org>
Committed: Fri Jul 11 22:55:25 2014 -0700

----------------------------------------------------------------------
 .../phoenix/end2end/RowValueConstructorIT.java  | 197 +++++++++++++++++++
 .../org/apache/phoenix/schema/SaltingUtil.java  |   2 +-
 .../org/apache/phoenix/schema/ValueSchema.java  |   3 +
 3 files changed, 201 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/phoenix/blob/22d6478b/phoenix-core/src/it/java/org/apache/phoenix/end2end/RowValueConstructorIT.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/RowValueConstructorIT.java
b/phoenix-core/src/it/java/org/apache/phoenix/end2end/RowValueConstructorIT.java
index 29cf38b..dec44c2 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/RowValueConstructorIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/RowValueConstructorIT.java
@@ -894,4 +894,201 @@ public class RowValueConstructorIT extends BaseClientManagedTimeIT {
         assertEquals("b",rs.getString(2));
         assertFalse(rs.next());
     }
+    
+    private Connection nextConnection(String url) throws SQLException {
+        Properties props = new Properties(TestUtil.TEST_PROPERTIES);
+        props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(nextTimestamp()));
+        return DriverManager.getConnection(url, props);
+    }
+    
+    //Table type - multi-tenant. Salted - No. Query against - tenant specific view. Connection
used for running IN list query - tenant specific. 
+    @Test
+    public void testInListOfRVC1() throws Exception {
+        String tenantId = "ABC";
+        String tenantSpecificUrl = getUrl() + ";" + PhoenixRuntime.TENANT_ID_ATTRIB + '='
+ tenantId;
+        String baseTableDDL = "CREATE TABLE t (tenantId varchar(5) NOT NULL, pk2 varchar(5)
NOT NULL, pk3 INTEGER NOT NULL, c1 INTEGER constraint pk primary key (tenantId,pk2,pk3)) MULTI_TENANT=true";
+        createTestTable(getUrl(), baseTableDDL, null, nextTimestamp());
+        String tenantTableDDL = "CREATE VIEW t_view (tenant_col VARCHAR) AS SELECT *\n" +

+                "                FROM t";
+        createTestTable(tenantSpecificUrl, tenantTableDDL, null, nextTimestamp());
+
+        Connection conn = nextConnection(tenantSpecificUrl);
+        conn.createStatement().executeUpdate("upsert into t_view (pk2, pk3, c1) values ('helo1',
1, 1)");
+        conn.createStatement().executeUpdate("upsert into t_view (pk2, pk3, c1) values ('helo2',
2, 2)");
+        conn.createStatement().executeUpdate("upsert into t_view (pk2, pk3, c1) values ('helo3',
3, 3)");
+        conn.createStatement().executeUpdate("upsert into t_view (pk2, pk3, c1) values ('helo4',
4, 4)");
+        conn.createStatement().executeUpdate("upsert into t_view (pk2, pk3, c1) values ('helo5',
5, 5)");
+        conn.commit();
+        conn.close();
+
+        conn = nextConnection(tenantSpecificUrl);
+        //order by needed on the query to make the order of rows returned deterministic.
+        PreparedStatement stmt = conn.prepareStatement("select pk2, pk3 from t_view WHERE
(pk2, pk3) IN ((?, ?), (?, ?)) ORDER BY pk2");
+        stmt.setString(1, "helo3");
+        stmt.setInt(2, 3);
+        stmt.setString(3, "helo5");
+        stmt.setInt(4, 5);
+
+        ResultSet rs = stmt.executeQuery();
+        assertTrue(rs.next());
+        assertEquals("helo3", rs.getString(1));
+        assertEquals(3, rs.getInt(2));
+        assertTrue(rs.next());
+        assertEquals("helo5", rs.getString(1));
+        assertEquals(5, rs.getInt(2));
+        conn.close();
+    }
+    
+    //Table type - multi-tenant. Salted - No. Query against - base table. Connection used
for running IN list query - global. 
+    @Test
+    public void testInListOfRVC2() throws Exception {
+        String tenantId = "ABC";
+        String tenantSpecificUrl = getUrl() + ";" + PhoenixRuntime.TENANT_ID_ATTRIB + '='
+ tenantId;
+        String baseTableDDL = "CREATE TABLE t (tenantId varchar(5) NOT NULL, pk2 varchar(5)
NOT NULL, pk3 INTEGER NOT NULL, c1 INTEGER constraint pk primary key (tenantId,pk2,pk3)) MULTI_TENANT=true";
+        createTestTable(getUrl(), baseTableDDL, null, nextTimestamp());
+        String tenantTableDDL = "CREATE VIEW t_view (tenant_col VARCHAR) AS SELECT *\n" +

+                "                FROM t";
+        createTestTable(tenantSpecificUrl, tenantTableDDL, null, nextTimestamp());
+
+        Connection conn = nextConnection(tenantSpecificUrl);
+        conn.createStatement().executeUpdate("upsert into t_view (pk2, pk3, c1) values ('helo1',
1, 1)");
+        conn.createStatement().executeUpdate("upsert into t_view (pk2, pk3, c1) values ('helo2',
2, 2)");
+        conn.createStatement().executeUpdate("upsert into t_view (pk2, pk3, c1) values ('helo3',
3, 3)");
+        conn.createStatement().executeUpdate("upsert into t_view (pk2, pk3, c1) values ('helo4',
4, 4)");
+        conn.createStatement().executeUpdate("upsert into t_view (pk2, pk3, c1) values ('helo5',
5, 5)");
+        conn.commit();
+        conn.close();
+
+        conn = nextConnection(getUrl());
+        //order by needed on the query to make the order of rows returned deterministic.
+        PreparedStatement stmt = conn.prepareStatement("select pk2, pk3 from t WHERE (tenantId,
pk2, pk3) IN ((?, ?, ?), (?, ?, ?)) ORDER BY pk2");
+        stmt.setString(1, tenantId);
+        stmt.setString(2, "helo3");
+        stmt.setInt(3, 3);
+        stmt.setString(4, tenantId);
+        stmt.setString(5, "helo5");
+        stmt.setInt(6, 5);
+
+        ResultSet rs = stmt.executeQuery();
+        assertTrue(rs.next());
+        assertEquals("helo3", rs.getString(1));
+        assertEquals(3, rs.getInt(2));
+        assertTrue(rs.next());
+        assertEquals("helo5", rs.getString(1));
+        assertEquals(5, rs.getInt(2));
+        conn.close();
+    }
+    
+    //Table type - non multi-tenant. Salted - No. Query against - Table. Connection used
for running IN list query - global. 
+    @Test
+    public void testInListOfRVC3() throws Exception {
+        String tenantId = "ABC";
+        String tableDDL = "CREATE TABLE t (tenantId varchar(5) NOT NULL, pk2 varchar(5) NOT
NULL, pk3 INTEGER NOT NULL, c1 INTEGER constraint pk primary key (tenantId,pk2,pk3))";
+        createTestTable(getUrl(), tableDDL, null, nextTimestamp());
+
+        Connection conn = nextConnection(getUrl());
+        conn.createStatement().executeUpdate("upsert into t (tenantId, pk2, pk3, c1) values
('ABC', 'helo1', 1, 1)");
+        conn.createStatement().executeUpdate("upsert into t (tenantId, pk2, pk3, c1) values
('ABC', 'helo2', 2, 2)");
+        conn.createStatement().executeUpdate("upsert into t (tenantId, pk2, pk3, c1) values
('ABC', 'helo3', 3, 3)");
+        conn.createStatement().executeUpdate("upsert into t (tenantId, pk2, pk3, c1) values
('ABC', 'helo4', 4, 4)");
+        conn.createStatement().executeUpdate("upsert into t (tenantId, pk2, pk3, c1) values
('ABC', 'helo5', 5, 5)");
+        conn.commit();
+        conn.close();
+
+        conn = nextConnection(getUrl());
+        //order by needed on the query to make the order of rows returned deterministic.
+        PreparedStatement stmt = conn.prepareStatement("select pk2, pk3 from t WHERE (tenantId,
pk2, pk3) IN ((?, ?, ?), (?, ?, ?)) ORDER BY pk2");
+        stmt.setString(1, tenantId);
+        stmt.setString(2, "helo3");
+        stmt.setInt(3, 3);
+        stmt.setString(4, tenantId);
+        stmt.setString(5, "helo5");
+        stmt.setInt(6, 5);
+
+        ResultSet rs = stmt.executeQuery();
+        assertTrue(rs.next());
+        assertEquals("helo3", rs.getString(1));
+        assertEquals(3, rs.getInt(2));
+        assertTrue(rs.next());
+        assertEquals("helo5", rs.getString(1));
+        assertEquals(5, rs.getInt(2));
+        conn.close();
+    }
+    
+    //Table type - multi-tenant. Salted - Yes. Query against - base table. Connection used
for running IN list query - global. 
+    @Test 
+    public void testInListOfRVC4() throws Exception {
+        String tenantId = "ABC";
+        String tenantSpecificUrl = getUrl() + ";" + PhoenixRuntime.TENANT_ID_ATTRIB + '='
+ tenantId;
+        String baseTableDDL = "CREATE TABLE t (tenantId varchar(5) NOT NULL, pk2 varchar(5)
NOT NULL, pk3 INTEGER NOT NULL, c1 INTEGER constraint pk primary key (tenantId,pk2,pk3)) SALT_BUCKETS=4,
MULTI_TENANT=true";
+        createTestTable(getUrl(), baseTableDDL, null, nextTimestamp());
+        String tenantTableDDL = "CREATE VIEW t_view (tenant_col VARCHAR) AS SELECT *\n" +

+                "                FROM t";
+        createTestTable(tenantSpecificUrl, tenantTableDDL, null, nextTimestamp());
+
+        Connection conn = nextConnection(tenantSpecificUrl);
+        conn.createStatement().executeUpdate("upsert into t_view (pk2, pk3, c1) values ('helo1',
1, 1)");
+        conn.createStatement().executeUpdate("upsert into t_view (pk2, pk3, c1) values ('helo2',
2, 2)");
+        conn.createStatement().executeUpdate("upsert into t_view (pk2, pk3, c1) values ('helo3',
3, 3)");
+        conn.createStatement().executeUpdate("upsert into t_view (pk2, pk3, c1) values ('helo4',
4, 4)");
+        conn.createStatement().executeUpdate("upsert into t_view (pk2, pk3, c1) values ('helo5',
5, 5)");
+        conn.commit();
+        conn.close();
+
+        conn = nextConnection(getUrl());
+        //order by needed on the query to make the order of rows returned deterministic.
+        PreparedStatement stmt = conn.prepareStatement("select pk2, pk3 from t WHERE (tenantId,
pk2, pk3) IN ((?, ?, ?), (?, ?, ?)) ORDER BY pk2");
+        stmt.setString(1, tenantId);
+        stmt.setString(2, "helo3");
+        stmt.setInt(3, 3);
+        stmt.setString(4, tenantId);
+        stmt.setString(5, "helo5");
+        stmt.setInt(6, 5);
+
+        ResultSet rs = stmt.executeQuery();
+        assertTrue(rs.next());
+        assertEquals("helo3", rs.getString(1));
+        assertEquals(3, rs.getInt(2));
+        assertTrue(rs.next());
+        assertEquals("helo5", rs.getString(1));
+        assertEquals(5, rs.getInt(2));
+        conn.close();
+    }
+    
+    //Table type - non multi-tenant. Salted - Yes. Query against - regular table. Connection
used for running IN list query - global. 
+    @Test 
+    public void testInListOfRVC5() throws Exception {
+        String tenantId = "ABC";
+        String tableDDL = "CREATE TABLE t (tenantId varchar(5) NOT NULL, pk2 varchar(5) NOT
NULL, pk3 INTEGER NOT NULL, c1 INTEGER constraint pk primary key (tenantId,pk2,pk3)) SALT_BUCKETS=4";
+        createTestTable(getUrl(), tableDDL, null, nextTimestamp());
+
+        Connection conn = nextConnection(getUrl());
+        conn.createStatement().executeUpdate("upsert into t (tenantId, pk2, pk3, c1) values
('ABC', 'helo1', 1, 1)");
+        conn.createStatement().executeUpdate("upsert into t (tenantId, pk2, pk3, c1) values
('ABC', 'helo2', 2, 2)");
+        conn.createStatement().executeUpdate("upsert into t (tenantId, pk2, pk3, c1) values
('ABC', 'helo3', 3, 3)");
+        conn.createStatement().executeUpdate("upsert into t (tenantId, pk2, pk3, c1) values
('ABC', 'helo4', 4, 4)");
+        conn.createStatement().executeUpdate("upsert into t (tenantId, pk2, pk3, c1) values
('ABC', 'helo5', 5, 5)");
+        conn.commit();
+        conn.close();
+
+        conn = nextConnection(getUrl());
+        //order by needed on the query to make the order of rows returned deterministic.
+        PreparedStatement stmt = conn.prepareStatement("select pk2, pk3 from t WHERE (tenantId,
pk2, pk3) IN ((?, ?, ?), (?, ?, ?)) ORDER BY pk2");
+        stmt.setString(1, tenantId);
+        stmt.setString(2, "helo3");
+        stmt.setInt(3, 3);
+        stmt.setString(4, tenantId);
+        stmt.setString(5, "helo5");
+        stmt.setInt(6, 5);
+
+        ResultSet rs = stmt.executeQuery();
+        assertTrue(rs.next());
+        assertEquals("helo3", rs.getString(1));
+        assertEquals(3, rs.getInt(2));
+        assertTrue(rs.next());
+        assertEquals("helo5", rs.getString(1));
+        assertEquals(5, rs.getInt(2));
+        conn.close();
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/phoenix/blob/22d6478b/phoenix-core/src/main/java/org/apache/phoenix/schema/SaltingUtil.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/schema/SaltingUtil.java b/phoenix-core/src/main/java/org/apache/phoenix/schema/SaltingUtil.java
index 8ae43e3..4a27ef5 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/schema/SaltingUtil.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/schema/SaltingUtil.java
@@ -37,7 +37,7 @@ public class SaltingUtil {
     public static final String SALTED_ROW_KEY_NAME = "_SALTED_KEY";
     public static final PColumnImpl SALTING_COLUMN = new PColumnImpl(
             PNameFactory.newName(SALTING_COLUMN_NAME), null, PDataType.BINARY, 1, 0, false,
0, SortOrder.getDefault(), 0, null, false);
-    public static final RowKeySchema VAR_BINARY_SALTED_SCHEMA = new RowKeySchemaBuilder(1)
+    public static final RowKeySchema VAR_BINARY_SALTED_SCHEMA = new RowKeySchemaBuilder(2)
         .addField(SALTING_COLUMN, false, SortOrder.getDefault())
         .addField(SchemaUtil.VAR_BINARY_DATUM, false, SortOrder.getDefault()).build();
 

http://git-wip-us.apache.org/repos/asf/phoenix/blob/22d6478b/phoenix-core/src/main/java/org/apache/phoenix/schema/ValueSchema.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/schema/ValueSchema.java b/phoenix-core/src/main/java/org/apache/phoenix/schema/ValueSchema.java
index 65796eb..661e48f 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/schema/ValueSchema.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/schema/ValueSchema.java
@@ -275,6 +275,9 @@ public abstract class ValueSchema implements Writable {
         }
         
         protected ValueSchemaBuilder addField(PDatum datum, boolean isNullable, SortOrder
sortOrder) {
+            if(fields.size() >= nFields) {
+                throw new IllegalArgumentException("Adding too many fields to Schema (max
" + nFields + ")");
+            }
             fields.add(new Field(datum, isNullable, 1, sortOrder));
             return this;
         }


Mime
View raw message