[
https://issues.apache.org/jira/browse/PHOENIX-7490?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Sanjeet Malhotra updated PHOENIX-7490:
--------------------------------------
[Design
doc|https://docs.google.com/document/d/1-OCu_CrAVQmS-JzbkrojIke_KvXzpI1jcAz8VcB3Ek0/edit?tab=t.0#heading=h.k8xjtrkaok7t]
> 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
> Priority: Major
>
> 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)