[ 
https://issues.apache.org/jira/browse/PHOENIX-1077?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14059340#comment-14059340
 ] 

Samarth Jain commented on PHOENIX-1077:
---------------------------------------

{code}
I did some more digging on this and found few more failure scenarios:

1) Table - Salted. Query - IN list of RVCs. Result - fails with exception. 

Details:

Table DDL - CREATE TABLE t (pk1 varchar(5) NOT NULL, pk2 varchar(5) NOT NULL, 
pk3 INTEGER NOT NULL, c1 INTEGER constraint pk primary key (pk1,pk2,pk3)) 
SALT_BUCKETS=4

Query - select pk1, pk2, pk3 from t WHERE (pk1, pk2, pk3) IN ((?, ?, ?), (?, ?, 
?))

Exception:
java.lang.ArrayIndexOutOfBoundsException: 1
        at org.apache.phoenix.schema.ValueSchema.getField(ValueSchema.java:300)
        at org.apache.phoenix.util.ScanUtil.setKey(ScanUtil.java:260)
        at 
org.apache.phoenix.compile.ScanRanges.getPointKeys(ScanRanges.java:185)
        at org.apache.phoenix.compile.ScanRanges.create(ScanRanges.java:61)
        at 
org.apache.phoenix.compile.WhereOptimizer.pushKeyExpressionsToScan(WhereOptimizer.java:224)
        at 
org.apache.phoenix.compile.WhereCompiler.compile(WhereCompiler.java:105)
        at 
org.apache.phoenix.compile.QueryCompiler.compileSingleQuery(QueryCompiler.java:260)
        at 
org.apache.phoenix.compile.QueryCompiler.compile(QueryCompiler.java:128)
        at 
org.apache.phoenix.jdbc.PhoenixStatement$ExecutableSelectStatement.compilePlan(PhoenixStatement.java:264)
        at 
org.apache.phoenix.jdbc.PhoenixStatement$ExecutableSelectStatement.compilePlan(PhoenixStatement.java:1)
        at 
org.apache.phoenix.jdbc.PhoenixStatement.executeQuery(PhoenixStatement.java:199)
        at 
org.apache.phoenix.jdbc.PhoenixPreparedStatement.executeQuery(PhoenixPreparedStatement.java:157)
        at 
org.apache.phoenix.end2end.RowValueConstructorIT.testInListOfRVC5(RowValueConstructorIT.java:1078)

2) Most likely related to 1)  Table - multi-tenant and salted. Query - IN list 
of RVCs. Result - Fails with exception.  

Details:
Base Table DDL - 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

Tenant View DDL - CREATE VIEW t_view (tenant_col VARCHAR) AS SELECT * FROM t

Query using global connection : select pk2, pk3 from t WHERE (tenantId, pk2, 
pk3) IN ((?, ?, ?), (?, ?, ?))

Stacktrace:

java.lang.ArrayIndexOutOfBoundsException: 1
        at org.apache.phoenix.schema.ValueSchema.getField(ValueSchema.java:300)
        at org.apache.phoenix.util.ScanUtil.setKey(ScanUtil.java:260)
        at 
org.apache.phoenix.compile.ScanRanges.getPointKeys(ScanRanges.java:185)
        at org.apache.phoenix.compile.ScanRanges.create(ScanRanges.java:61)
        at 
org.apache.phoenix.compile.WhereOptimizer.pushKeyExpressionsToScan(WhereOptimizer.java:224)
        at 
org.apache.phoenix.compile.WhereCompiler.compile(WhereCompiler.java:105)
        at 
org.apache.phoenix.compile.QueryCompiler.compileSingleQuery(QueryCompiler.java:260)
        at 
org.apache.phoenix.compile.QueryCompiler.compile(QueryCompiler.java:128)
        at 
org.apache.phoenix.jdbc.PhoenixStatement$ExecutableSelectStatement.compilePlan(PhoenixStatement.java:264)
        at 
org.apache.phoenix.jdbc.PhoenixStatement$ExecutableSelectStatement.compilePlan(PhoenixStatement.java:1)
        at 
org.apache.phoenix.jdbc.PhoenixStatement.executeQuery(PhoenixStatement.java:199)
        at 
org.apache.phoenix.jdbc.PhoenixPreparedStatement.executeQuery(PhoenixPreparedStatement.java:157)
        at 
org.apache.phoenix.end2end.RowValueConstructorIT.testInListOfRVC4(RowValueConstructorIT.java:1042)

3) Table type - Multitenant and salted. Query - IN list of RVCs. Result - All 
rows not returned.

Base table DDL - 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, SALT_BUCKETS=4

Tenant View DDL - CREATE VIEW t_view (tenant_col VARCHAR) AS SELECT * FROM t

Upserts:
upsert into t_view (pk2, pk3, c1) values ('helo1', 1, 1)
upsert into t_view (pk2, pk3, c1) values ('helo2', 2, 2)
upsert into t_view (pk2, pk3, c1) values ('helo3', 3, 3)
upsert into t_view (pk2, pk3, c1) values ('helo4', 4, 4)
upsert into t_view (pk2, pk3, c1) values ('helo5', 5, 5)

Query using tenant specific connection - select pk2, pk3 from t_view WHERE 
(pk2, pk3) IN ( ('helo3',  3),  ('helo5',  5) ) ORDER BY pk2

Result - Only one row returned - helo3, 3 

This has likely to do with salting because on removing SALT_BUCKETS=4 from the 
base table DDL all the expected rows are returned.

4) The one Eli pointed above:

CREATE TABLE in_test ( user VARCHAR, tenant_id VARCHAR(5) NOT 
NULL,tenant_type_id VARCHAR(3) NOT NULL,  id INTEGER NOT NULL CONSTRAINT pk 
PRIMARY KEY (tenant_id, tenant_type_id, id))

upsert into in_test (tenant_id, tenant_type_id, id, user) values ('a', 'a', 1, 
'BonA')
upsert into in_test (tenant_id, tenant_type_id, id, user) values ('a', 'a', 2, 
'BonB')

select id from in_test WHERE tenant_id = 'a' and tenant_type_id = 'a' and ((id, 
user) IN ((1, 'BonA'),(1, 'BonA')))

Rows returned - none. Should have returned one row. 

{code}

> IN list of row value constructors doesn't work for tenant specific views
> ------------------------------------------------------------------------
>
>                 Key: PHOENIX-1077
>                 URL: https://issues.apache.org/jira/browse/PHOENIX-1077
>             Project: Phoenix
>          Issue Type: Bug
>    Affects Versions: 3.0.0, 4.0.0, 5.0.0
>            Reporter: Samarth Jain
>            Assignee: Eli Levine
>
> IN list of row value constructors doesn't work when queried against tenant 
> views for multi-tenant phoenix tables. Consider this test (added in 
> TenantSpecificTablesDMLIT.java)
> {code}
> public void testRVCOnTenantSpecificTable() throws Exception {
>         Connection conn = nextConnection(PHOENIX_JDBC_TENANT_SPECIFIC_URL);
>         try {
>             conn.setAutoCommit(true);
>             conn.createStatement().executeUpdate("upsert into " + 
> TENANT_TABLE_NAME + " (id, user) values (1, 'BonA')");
>             conn.createStatement().executeUpdate("upsert into " + 
> TENANT_TABLE_NAME + " (id, user) values (2, 'BonB')");
>             conn.createStatement().executeUpdate("upsert into " + 
> TENANT_TABLE_NAME + " (id, user) values (3, 'BonC')");
>             conn.close();
>             conn = nextConnection(PHOENIX_JDBC_TENANT_SPECIFIC_URL);
>             PreparedStatement stmt = conn.prepareStatement("select id from " 
> + TENANT_TABLE_NAME + " WHERE (id, user) IN ((?, ?), (?, ?), (?, ?))");
>             stmt.setInt(1, 1);
>             stmt.setString(2, "BonA");
>             stmt.setInt(3, 2);
>             stmt.setString(4, "BonB");
>             stmt.setInt(5, 3);
>             stmt.setString(6, "BonC");
>             ResultSet rs = stmt.executeQuery();
>             assertTrue(rs.next());
>             assertEquals(1, rs.getInt(1));
>             assertTrue(rs.next());
>             assertEquals(2, rs.getInt(1));
>             assertTrue(rs.next());
>             assertEquals(3, rs.getInt(1));
>             assertFalse(rs.next());
>         }
>         finally {
>             conn.close();
>         }
>     }
> {code}
> Replacing TENANT_TABLE_NAME with PARENT_TABLE_NAME (that is the base table), 
> the test works fine.



--
This message was sent by Atlassian JIRA
(v6.2#6252)

Reply via email to