
Filing this issue to track a question/comment that was raised by @ywangd  here https://github.com/elastic/elasticsearch/pull/98309#discussion_r1294115440

One question I do have is why we chose to [execute the LookupRequest with the enrich origin](https://github.com/elastic/elasticsearch/blob/2e4440ff1c0decf79f8a40688566411f7d518aa7/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/enrich/EnrichLookupService.java#L141C2-L141C2). It means the following query works when the user has access to only the playlist index without access to either the songs enrich policy or its associated index.

```
FROM playlist | ENRICH songs ON song_id
```

It feels a bit weird to me that we have no control on who can use what enrich process. That said, we don't have a good story around enrich and ingest pipeline either, i.e. we have no control over who can use what pipeline where a pipeline can contain an enrich processor. There have been quite a few complaints from users and we have an https://github.com/elastic/elasticsearch/issues/57586 for it. I wonder whether we should not repeat the problem here with ES|QL. On the surface, it might be easier to tackle compared to ingest pipelines since ES|QL is read-only and has no "bulk" operations. What do you think?
x-pack/plugin/ql/src/test/java/org/elasticsearch/xpack/ql/expression/AttributeMapTests.java
assertEquals(a, map.resolve(b, "default"));
        assertEquals("default", map.resolve("non-existing-key", "default"));
    }
    public void testResolveMultiHopCycle() {
        AttributeMap.Builder<Object> builder = AttributeMap.builder();
        Attribute a = fieldAttribute("a", DataTypes.INTEGER);
        Attribute b = fieldAttribute("b", DataTypes.INTEGER);
        Attribute c = fieldAttribute("c", DataTypes.INTEGER);
        Attribute d = fieldAttribute("d", DataTypes.INTEGER);
        builder.put(a, b);
        builder.put(b, c);
        builder.put(c, d);
        builder.put(d, a);
        AttributeMap<Object> map = builder.build();
        
        
        expectThrows(QlIllegalArgumentException.class, () -> { assertEquals(a, map.resolve(a, c)); });
    }
    private Alias createIntParameterAlias(int index, int value) {
        Source source = new Source(1, index * 5, "?");
        Literal literal = new Literal(source, value, DataTypes.INTEGER);
        Alias alias = new Alias(literal.source(), literal.source().text(), literal);
        return alias;
    }
    public void testEmptyConstructor() {
        AttributeMap<Object> m = new AttributeMap<>();
        assertThat(m.size(), is(0));
        assertThat(m.isEmpty(), is(true));
    }
    public void testBuilder() {