You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@phoenix.apache.org by "Daniel Wong (Jira)" <ji...@apache.org> on 2020/01/25 01:21:00 UTC
[jira] [Created] (PHOENIX-5698) Phoenix Query with RVC IN list
expression generates wrong scan with non-pk ordered pks
Daniel Wong created PHOENIX-5698:
------------------------------------
Summary: Phoenix Query with RVC IN list expression generates wrong scan with non-pk ordered pks
Key: PHOENIX-5698
URL: https://issues.apache.org/jira/browse/PHOENIX-5698
Project: Phoenix
Issue Type: Bug
Affects Versions: 4.14.3, 4.15.0
Reporter: Daniel Wong
n the code below ideally we'd expect a SINGLE ROW DELETE plan client side. However, this generates an incorrect scan with range ['tenant1 0CY005xx000001Sv6o'). If the order of the RVCs is changed to row key order Phoenix correctly generates a SINGLE ROW SCAN.
@Test
public void testInListExpressionWithDescAgain() throws Exception \{
String fullTableName = generateUniqueName();
String fullViewName = generateUniqueName();
String tenantView = generateUniqueName();
// create base table and global view using global connection
try (Connection conn = DriverManager.getConnection(getUrl())) {
conn.setAutoCommit(true);
Statement stmt = conn.createStatement();
stmt.execute("CREATE TABLE " + fullTableName + "(\n" +
" TENANT_ID CHAR(15) NOT NULL,\n" +
" KEY_PREFIX CHAR(3) NOT NULL,\n" +
" CONSTRAINT PK PRIMARY KEY (\n" +
" TENANT_ID," +
" KEY_PREFIX" +
")) MULTI_TENANT=TRUE");
stmt.execute("CREATE VIEW " + fullViewName + "(\n" +
" ID1 VARCHAR NOT NULL,\n" +
" ID2 VARCHAR NOT NULL,\n" +
" EVENT_DATE DATE NOT NULL,\n" +
" CONSTRAINT PKVIEW PRIMARY KEY\n" +
" (\n" +
" ID1, ID2 DESC, EVENT_DATE DESC\n" +
")) AS SELECT * FROM " + fullTableName + " WHERE KEY_PREFIX = '0CY'");
}
// create and use a tenant specific view to write data
try (Connection viewConn = DriverManager.getConnection(TENANT_SPECIFIC_URL1) ) \{
viewConn.setAutoCommit(true); //need autocommit for serverside deletion
Statement stmt = viewConn.createStatement();
stmt.execute("CREATE VIEW IF NOT EXISTS " + tenantView + " AS SELECT * FROM " + fullViewName );
viewConn.createStatement().execute("UPSERT INTO " + tenantView + "(ID1, ID2, EVENT_DATE) VALUES ('005xx000001Sv6o', '000000000000300', 1532458230000)");
viewConn.createStatement().execute("UPSERT INTO " + tenantView + "(ID1, ID2, EVENT_DATE) VALUES ('005xx000001Sv6o', '000000000000400', 1532458240000)");
viewConn.createStatement().execute("UPSERT INTO " + tenantView + "(ID1, ID2, EVENT_DATE) VALUES ('005xx000001Sv6o', '000000000000500', 1532458250000)");
viewConn.commit();
ResultSet rs = stmt.executeQuery("SELECT ID1, ID2, EVENT_DATE FROM " + tenantView );
printResultSet(rs);
System.out.println("Delete Start");
rs = stmt.executeQuery("EXPLAIN DELETE FROM " + tenantView + " WHERE (ID1, EVENT_DATE, ID2) IN (('005xx000001Sv6o', 1532458240000, '000000000000400'),('005xx000001Sv6o', 1532458230000, '000000000000300'))");
printResultSet(rs); // THIS SHOULD BE A SINGLE ROW SCAN
stmt.execute("DELETE FROM " + tenantView + " WHERE (ID1, EVENT_DATE, ID2) IN (('005xx000001Sv6o', 1532458240000, '000000000000400'),('005xx000001Sv6o', 1532458230000, '000000000000300'))");
viewConn.commit();
System.out.println("Delete End");
rs = stmt.executeQuery("SELECT ID1, ID2, EVENT_DATE FROM " + tenantView );
printResultSet(rs);
}
}
private void printResultSet(ResultSet rs) throws SQLException \{
StringBuilder builder = new StringBuilder();
while(rs.next()) {
for(int i = 0; i < rs.getMetaData().getColumnCount(); i++) {
Object col = rs.getObject(i + 1);
if(col == null) {
builder.append("null");
} else \{
if(col instanceof Date) {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
builder.append(df.format(col));
} else \{
builder.append(col.toString());
}
}
builder.append(",");
}
builder.append("\n");
}
System.out.println(builder.toString());
}
--
This message was sent by Atlassian Jira
(v8.3.4#803005)