Sanjeet Malhotra created PHOENIX-7490:
-----------------------------------------
Summary: Upserts and queries to tenant view end up upserting and
querying global table if both have same name
Key: PHOENIX-7490
URL: https://issues.apache.org/jira/browse/PHOENIX-7490
Project: Phoenix
Issue Type: Bug
Affects Versions: 5.3.0
Reporter: Sanjeet Malhotra
Assignee: Sanjeet Malhotra
The following IT can be used to observing the bug:
{code:java}
@Test
public void testTenantViewAndGlobalTableWithSameName() throws Exception {
String tableName = generateUniqueName();
// Create a global table
try(Connection conn = DriverManager.getConnection(getUrl())) {
Statement stmt = conn.createStatement();
stmt.execute("CREATE TABLE " + tableName + " (org_id varchar not null,
" +
"pk1 varchar not null, " +
"pk2 varchar not null, " +
"col1 integer constraint PK1 PRIMARY KEY (org_id, pk1, pk2))
MULTI_TENANT=true");
}
Properties props = new Properties();
props.setProperty(TENANT_ID_ATTRIB, "tenant1");
String baseTableName = generateUniqueName();
try(Connection conn = DriverManager.getConnection(getUrl())) {
Statement stmt = conn.createStatement();
stmt.execute("CREATE TABLE " + baseTableName + " (org_id varchar not
null, " +
"pk3 varchar not null, " +
"pk4 varchar not null, " +
"col2 integer constraint PK1 PRIMARY KEY (org_id, pk3, pk4))
MULTI_TENANT=true");
}
// Create a tenant view with same name as global table
try(Connection conn = DriverManager.getConnection(getUrl(), props)) {
Statement stmt = conn.createStatement();
stmt.execute("CREATE VIEW " + tableName + " AS SELECT * FROM " +
baseTableName);
PhoenixConnection pconn = conn.unwrap(PhoenixConnection.class);
PMetaData metadata = pconn.getQueryServices().getMetaDataCache();
Assert.assertNotNull(pconn.getTableRef(new
PTableKey(pconn.getTenantId(), tableName)));
int metadataCacheSize = metadata.size();
metadata.removeTable(pconn.getTenantId(), tableName, null,
HConstants.LATEST_TIMESTAMP);
Assert.assertEquals(metadataCacheSize - 1, metadata.size());
// Assert successful eviction of tenant view PTable from metadata cache
Assert.assertThrows(TableNotFoundException.class, () ->
pconn.getTableRef(new PTableKey(pconn.getTenantId(), tableName)));
// Assert PTable for global table is in the metadata cache
Assert.assertNotNull(pconn.getTableRef(new PTableKey(null, tableName)));
// Insert a row with intention to insert it in tenant view
stmt.executeUpdate("UPSERT INTO " + tableName + " VALUES ('val1',
'val2', 1)");
// Assert that PTable for tenant view is still not there in metadata
cache
Assert.assertThrows(TableNotFoundException.class, () ->
pconn.getTableRef(new PTableKey(pconn.getTenantId(), tableName)));
conn.commit();
// Assert that PTable for tenant view is still not there in metadata
cache
Assert.assertThrows(TableNotFoundException.class, () ->
pconn.getTableRef(new PTableKey(pconn.getTenantId(), tableName)));
}
// Query tenant view with expectation to get 1 row
try(Connection conn = DriverManager.getConnection(getUrl(), props)) {
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM " + tableName);
int rowCount = 0;
while (rs.next()) {
//TODO: Once the bug is fixed then this assertion should be changed
to tenant view's PK3
Assert.assertEquals("PK1", rs.getMetaData().getColumnName(1));
rowCount++;
}
Assert.assertEquals(1, rowCount);
}
// Query global table
try(Connection conn = DriverManager.getConnection(getUrl())) {
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM " + tableName);
int rowCount = 0;
while (rs.next()) {
rowCount++;
Assert.assertEquals("PK1", rs.getMetaData().getColumnName(2));
}
//TODO: Once bug is fixed the expected row count should be changed to 0
Assert.assertEquals(1, rowCount);
stmt = conn.createStatement();
rs = stmt.executeQuery("SELECT COUNT(*) FROM " + baseTableName);
while (rs.next()) {
//TODO: Once bug is fixed the expected row count should be changed
to 1
Assert.assertEquals(0, rs.getInt(1));
}
}
} {code}
Steps to reproduce:
# Add above IT to UpsertValuesIT and it will succeed.
# If we address all the TODOs in the IT then it will fail. After addressing
all the TODOs we get the expected behaviour once this bug is fixed.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)