[ 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)