### Description

For a query with params like `"params": [{"x": 1}, {"y": 2}]` running in a JVM with assertions disabled results in:

```
  "error": {
    "root_cause": [
      {
        "type": "x_content_parse_exception",
        "reason": "Failed to build [params] after last required field arrived"
      }
    ],
    "type": "x_content_parse_exception",
    "reason": "[3:19] [esql/query] failed to parse field [params]",
    "caused_by": {
      "type": "x_content_parse_exception",
      "reason": "Failed to build [params] after last required field arrived",
      "caused_by": {
        "type": "array_index_out_of_bounds_exception",
        "reason": "Index 1 out of bounds for length 0"
      }
    }
  }
```

but with assertions enabled:

```
[2023-09-07T13:03:21,434][ERROR][o.e.b.ElasticsearchUncaughtExceptionHandler] [runTask-0] fatal error in thread [Thread-2], exiting java.lang.AssertionError: [params] must configure at least one constructor argument. If it doesn't have any it should use ObjectParser instead of ConstructingObjectParser. This is a bug in the parser declaration.
┬╗      at org.elasticsearch.xcontent@8.11.0-SNAPSHOT/org.elasticsearch.xcontent.ConstructingObjectParser$Target.finish(ConstructingObjectParser.java:543)
┬╗      at org.elasticsearch.xcontent@8.11.0-SNAPSHOT/org.elasticsearch.xcontent.ConstructingObjectParser.parse(ConstructingObjectParser.java:166)
┬╗      at org.elasticsearch.xcontent@8.11.0-SNAPSHOT/org.elasticsearch.xcontent.ConstructingObjectParser.apply(ConstructingObjectParser.java:158)
┬╗      at org.elasticsearch.xpack.esql.action.EsqlQueryRequest.parseParams(EsqlQueryRequest.java:181)
┬╗      at org.elasticsearch.xcontent@8.11.0-SNAPSHOT/org.elasticsearch.xcontent.AbstractObjectParser.lambda$declareField$0(AbstractObjectParser.java:174)
┬╗      at org.elasticsearch.xcontent@8.11.0-SNAPSHOT/org.elasticsearch.xcontent.ObjectParser.lambda$declareField$10(ObjectParser.java:431)
┬╗      at org.elasticsearch.xcontent@8.11.0-SNAPSHOT/org.elasticsearch.xcontent.ObjectParser.parseValue(ObjectParser.java:609)
┬╗      at org.elasticsearch.xcontent@8.11.0-SNAPSHOT/org.elasticsearch.xcontent.ObjectParser.parseArray(ObjectParser.java:604)
┬╗      at org.elasticsearch.xcontent@8.11.0-SNAPSHOT/org.elasticsearch.xcontent.ObjectParser.parseSub(ObjectParser.java:643)
┬╗      at org.elasticsearch.xcontent@8.11.0-SNAPSHOT/org.elasticsearch.xcontent.ObjectParser.parse(ObjectParser.java:315)
┬╗      at org.elasticsearch.xcontent@8.11.0-SNAPSHOT/org.elasticsearch.xcontent.ObjectParser.parse(ObjectParser.java:259)
┬╗      at org.elasticsearch.xcontent@8.11.0-SNAPSHOT/org.elasticsearch.xcontent.ObjectParser.apply(ObjectParser.java:382)
┬╗      at org.elasticsearch.xpack.esql.action.EsqlQueryRequest.fromXContent(EsqlQueryRequest.java:144)
┬╗      at org.elasticsearch.xpack.esql.action.RestEsqlQueryAction.prepareRequest(RestEsqlQueryAction.java:45)
```
x-pack/plugin/esql/qa/server/src/main/java/org/elasticsearch/xpack/esql/qa/rest/RestEsqlTestCase.java
assertThat(warnings.size(), is(1 + expectedWarnings));
        var firstHeader = "Line 1:36: evaluation of [to_int(case(integer %25 2 == 0, to_str(integer), keyword))] failed, "
            + "treating result as null. Only first 20 failures recorded.";
        assertThat(warnings.get(0), containsString(firstHeader));
        for (int i = 1; i <= expectedWarnings; i++) {
            assertThat(
                warnings.get(i),
                containsString("java.lang.NumberFormatException: For input string: \\\"keyword" + (2 * i - 1) + "\\\"")
            );
        }
    }
    public void testMetadataFieldsOnMultipleIndices() throws IOException {
        var request = new Request("POST", "/" + testIndexName() + "-1/_doc/id-1");
        request.addParameter("refresh", "true");
        request.setJsonEntity("{\"a\": 1}");
        assertEquals(201, client().performRequest(request).getStatusLine().getStatusCode());
        request = new Request("POST", "/" + testIndexName() + "-1/_doc/id-1");
        request.addParameter("refresh", "true");
        request.setJsonEntity("{\"a\": 2}");
        assertEquals(200, client().performRequest(request).getStatusLine().getStatusCode());
        request = new Request("POST", "/" + testIndexName() + "-2/_doc/id-2");
        request.addParameter("refresh", "true");
        request.setJsonEntity("{\"a\": 3}");
        assertEquals(201, client().performRequest(request).getStatusLine().getStatusCode());
        var query = fromIndex() + "* [metadata _index, _version, _id] | sort _version";
        Map<String, Object> result = runEsql(new RequestObjectBuilder().query(query).build());
        var columns = List.of(
            Map.of("name", "a", "type", "long"),
            Map.of("name", "_index", "type", "keyword"),
            Map.of("name", "_version", "type", "long"),