|  | @@ -300,6 +300,53 @@ public class HeapAttackIT extends ESRestTestCase {
 | 
	
		
			
				|  |  |          assertMap(map, matchesMap().entry("columns", columns));
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    public void testAggMvLongs() throws IOException {
 | 
	
		
			
				|  |  | +        int fieldValues = 100;
 | 
	
		
			
				|  |  | +        initMvLongsIndex(1, 3, fieldValues);
 | 
	
		
			
				|  |  | +        Response response = aggMvLongs(3);
 | 
	
		
			
				|  |  | +        Map<?, ?> map = XContentHelper.convertToMap(JsonXContent.jsonXContent, EntityUtils.toString(response.getEntity()), false);
 | 
	
		
			
				|  |  | +        ListMatcher columns = matchesList().item(matchesMap().entry("name", "MAX(f00)").entry("type", "long"))
 | 
	
		
			
				|  |  | +            .item(matchesMap().entry("name", "f00").entry("type", "long"))
 | 
	
		
			
				|  |  | +            .item(matchesMap().entry("name", "f01").entry("type", "long"))
 | 
	
		
			
				|  |  | +            .item(matchesMap().entry("name", "f02").entry("type", "long"));
 | 
	
		
			
				|  |  | +        assertMap(map, matchesMap().entry("columns", columns));
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    public void testAggTooManyMvLongs() throws IOException {
 | 
	
		
			
				|  |  | +        initMvLongsIndex(1, 3, 1000);
 | 
	
		
			
				|  |  | +        assertCircuitBreaks(() -> aggMvLongs(3));
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private Response aggMvLongs(int fields) throws IOException {
 | 
	
		
			
				|  |  | +        StringBuilder builder = new StringBuilder("{\"query\": \"FROM mv_longs | STATS MAX(f00) BY f00");
 | 
	
		
			
				|  |  | +        for (int f = 1; f < fields; f++) {
 | 
	
		
			
				|  |  | +            builder.append(", f").append(String.format(Locale.ROOT, "%02d", f));
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return query(builder.append("\"}").toString(), "columns");
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    public void testFetchMvLongs() throws IOException {
 | 
	
		
			
				|  |  | +        int fields = 100;
 | 
	
		
			
				|  |  | +        initMvLongsIndex(100, fields, 1000);
 | 
	
		
			
				|  |  | +        Response response = fetchMvLongs();
 | 
	
		
			
				|  |  | +        Map<?, ?> map = XContentHelper.convertToMap(JsonXContent.jsonXContent, EntityUtils.toString(response.getEntity()), false);
 | 
	
		
			
				|  |  | +        ListMatcher columns = matchesList();
 | 
	
		
			
				|  |  | +        for (int f = 0; f < fields; f++) {
 | 
	
		
			
				|  |  | +            columns = columns.item(matchesMap().entry("name", String.format(Locale.ROOT, "f%02d", f)).entry("type", "long"));
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        assertMap(map, matchesMap().entry("columns", columns));
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @AwaitsFix(bugUrl = "https://github.com/elastic/elasticsearch/issues/99826")
 | 
	
		
			
				|  |  | +    public void testFetchTooManyMvLongs() throws IOException {
 | 
	
		
			
				|  |  | +        initMvLongsIndex(500, 100, 1000);
 | 
	
		
			
				|  |  | +        assertCircuitBreaks(() -> fetchMvLongs());
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private Response fetchMvLongs() throws IOException {
 | 
	
		
			
				|  |  | +        return query("{\"query\": \"FROM mv_longs\"}", "columns");
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      private void initManyLongs() throws IOException {
 | 
	
		
			
				|  |  |          logger.info("loading many documents with longs");
 | 
	
		
			
				|  |  |          StringBuilder bulk = new StringBuilder();
 | 
	
	
		
			
				|  | @@ -371,6 +418,39 @@ public class HeapAttackIT extends ESRestTestCase {
 | 
	
		
			
				|  |  |          initIndex("manybigfields", bulk.toString());
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    private void initMvLongsIndex(int docs, int fields, int fieldValues) throws IOException {
 | 
	
		
			
				|  |  | +        logger.info("loading documents with many multivalued longs");
 | 
	
		
			
				|  |  | +        int docsPerBulk = 100;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        StringBuilder bulk = new StringBuilder();
 | 
	
		
			
				|  |  | +        for (int d = 0; d < docs; d++) {
 | 
	
		
			
				|  |  | +            bulk.append("{\"create\":{}}\n");
 | 
	
		
			
				|  |  | +            for (int f = 0; f < fields; f++) {
 | 
	
		
			
				|  |  | +                if (f == 0) {
 | 
	
		
			
				|  |  | +                    bulk.append('{');
 | 
	
		
			
				|  |  | +                } else {
 | 
	
		
			
				|  |  | +                    bulk.append(", ");
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                bulk.append('"').append("f").append(String.format(Locale.ROOT, "%02d", f)).append("\": ");
 | 
	
		
			
				|  |  | +                for (int fv = 0; fv < fieldValues; fv++) {
 | 
	
		
			
				|  |  | +                    if (fv == 0) {
 | 
	
		
			
				|  |  | +                        bulk.append('[');
 | 
	
		
			
				|  |  | +                    } else {
 | 
	
		
			
				|  |  | +                        bulk.append(", ");
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                    bulk.append(f + fv);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                bulk.append(']');
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            bulk.append("}\n");
 | 
	
		
			
				|  |  | +            if (d % docsPerBulk == docsPerBulk - 1 && d != docs - 1) {
 | 
	
		
			
				|  |  | +                bulk("mv_longs", bulk.toString());
 | 
	
		
			
				|  |  | +                bulk.setLength(0);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        initIndex("mv_longs", bulk.toString());
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      private void bulk(String name, String bulk) throws IOException {
 | 
	
		
			
				|  |  |          Request request = new Request("POST", "/" + name + "/_bulk");
 | 
	
		
			
				|  |  |          request.addParameter("filter_path", "errors");
 |