@@ -1625,6 +1625,98 @@ d,seven,twelve,day,month,date,duration,guid
16251625 assertEquals(2, StringUtils.countMatches(debugSql, " CONTAINERFILTER " ));
16261626 }
16271627
1628+ // GH Issue 1718: a lookup resolves its target query against the folder the field is defined in, so compiling a query
1629+ // in a folder other than the request's must not move the environment container there.
1630+ @Test
1631+ public void testCompileLeavesEnvironmentContainer() throws Exception
1632+ {
1633+ User user = TestContext.get().getUser();
1634+ Container c = JunitUtil.getTestContainer();
1635+ Container sub = getSubfolder();
1636+
1637+ Object savedContainer = QueryService.get().getEnvironment(QueryService.Environment.CONTAINER);
1638+ try
1639+ {
1640+ QueryDefinition q = QueryService.get().createQueryDef(user, c, SchemaKey.fromString(" core" ), " QEnvContainer " );
1641+ q.setSql(" SELECT Name , ID FROM core. Containers " );
1642+ q.save(user, c);
1643+
1644+ QueryService.get().setEnvironment(QueryService.Environment.CONTAINER, sub);
1645+
1646+ // compile in c, the way a lookup resolves its target in the folder the field is defined in
1647+ UserSchema coreInC = QueryService.get().getUserSchema(user, c, " core" );
1648+ assertNotNull(coreInC.getTable(" QEnvContainer " ));
1649+
1650+ assertEquals(sub, QueryService.get().getEnvironment(QueryService.Environment.CONTAINER));
1651+ }
1652+ finally
1653+ {
1654+ QueryService.get().setEnvironment(QueryService.Environment.CONTAINER, savedContainer);
1655+ deleteQueryDef(user, c, " QEnvContainer " );
1656+ }
1657+ }
1658+
1659+ // GH Issue 1718: folderPath() reports the folder its own query is compiled in. It used to read the same environment
1660+ // container that cross-folder compilation moves, so a sub-query from another folder could answer for its parent.
1661+ @Test
1662+ public void testFolderPathAcrossContainers() throws Exception
1663+ {
1664+ User user = TestContext.get().getUser();
1665+ Container c = JunitUtil.getTestContainer();
1666+ Container sub = getSubfolder();
1667+
1668+ Object savedContainer = QueryService.get().getEnvironment(QueryService.Environment.CONTAINER);
1669+ try
1670+ {
1671+ saveQueryDef(user, c, " QFolderPathInherited " , " SELECT folderPath() AS p FROM core. Containers " , true);
1672+ saveQueryDef(user, sub, " QFolderPathInner " , " SELECT Name , ID FROM core. Containers " , false);
1673+
1674+ QueryService.get().setEnvironment(QueryService.Environment.CONTAINER, c);
1675+
1676+ // an inherited query answers for the folder it runs in, not the one it is defined in
1677+ assertEquals(c.getPath(), selectFolderPath(user, c, " SELECT p FROM QFolderPathInherited " ));
1678+ assertEquals(sub.getPath(), selectFolderPath(user, sub, " SELECT p FROM QFolderPathInherited " ));
1679+
1680+ // compiling a sub-query from another folder must not answer for that folder
1681+ assertEquals(c.getPath(), selectFolderPath(user, c,
1682+ " SELECT folderPath() AS p FROM Folder . qtest.core. QFolderPathInner " ));
1683+
1684+ assertEquals(c, QueryService.get().getEnvironment(QueryService.Environment.CONTAINER));
1685+ }
1686+ finally
1687+ {
1688+ QueryService.get().setEnvironment(QueryService.Environment.CONTAINER, savedContainer);
1689+ deleteQueryDef(user, c, " QFolderPathInherited " );
1690+ deleteQueryDef(user, sub, " QFolderPathInner " );
1691+ }
1692+ }
1693+
1694+ private void saveQueryDef(User user, Container container, String name, String sql, boolean canInherit)
1695+ {
1696+ deleteQueryDef(user, container, name);
1697+ QueryDefinition q = QueryService.get().createQueryDef(user, container, SchemaKey.fromString(" core" ), name);
1698+ q.setSql(sql);
1699+ q.setCanInherit(canInherit);
1700+ q.save(user, container);
1701+ }
1702+
1703+ private void deleteQueryDef(User user, Container container, String name)
1704+ {
1705+ QueryDefinition q = QueryService.get().getQueryDef(user, container, " core" , name);
1706+ if (null != q)
1707+ q.delete(user);
1708+ }
1709+
1710+ private String selectFolderPath(User user, Container container, String sql) throws Exception
1711+ {
1712+ QuerySchema schema = QueryService.get().getUserSchema(user, container, " core" );
1713+ try (Results rs = QueryService.get().getSelectBuilder(schema, sql, true).select(true))
1714+ {
1715+ assertTrue(sql, rs.next());
1716+ return rs.getString(" p" );
1717+ }
1718+ }
1719+
16281720 @Test
16291721 public void testJSONDataLoader() throws Exception
16301722 {
0 commit comments