This is an automated email from the ASF dual-hosted git repository. mblow pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/asterixdb.git
commit aa7ff7bd063ece0933be97d67bce647935c1ac57 Author: Ali Alsuliman <[email protected]> AuthorDate: Tue May 12 21:02:39 2020 -0700 [ASTERIXDB-2731][API] GET is not supported for the query service servlet - user model changes: no - storage format changes: no - interface changes: no Details: Remove the restriction of only supporting POST requests in the query service servlet while maintaining that GET requests cannot change the state of the system (i.e. no modifying statements can be evaluated when using the GET method). Change-Id: I989ff489d863697808cdc26898a52b867a9621d6 Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/6303 Reviewed-by: Ali Alsuliman <[email protected]> Reviewed-by: Till Westmann <[email protected]> Integration-Tests: Jenkins <[email protected]> Tested-by: Jenkins <[email protected]> --- .../api/http/server/QueryServiceServlet.java | 13 ++++++-- .../asterix/test/common/ResultExtractor.java | 4 +++ .../apache/asterix/test/common/TestExecutor.java | 15 +++++++-- .../api/get-non-query/get-non-query.1.get.http | 24 ++++++++++++++ .../api/get-non-query/get-non-query.2.get.http | 24 ++++++++++++++ .../api/get-non-query/get-non-query.3.get.http | 24 ++++++++++++++ .../api/get-query/get-query.1.get.http | 25 +++++++++++++++ .../api/get-query/get-query.2.get.http | 25 +++++++++++++++ .../api/get-query/get-query.3.get.http | 25 +++++++++++++++ .../api/post-non-query/post-non-query.1.post.http | 24 ++++++++++++++ .../api/post-non-query/post-non-query.2.post.http | 25 +++++++++++++++ .../results/api/get-query/get-query.1.adm | 1 + .../results/api/get-query/get-query.2.adm | 1 + .../results/api/get-query/get-query.3.adm | 1 + .../api/post-non-query/post-non-query.2.adm | 1 + .../test/resources/runtimets/testsuite_sqlpp.xml | 37 ++++++++++++++++------ .../src/main/resources/asx_errormsg/en.properties | 2 +- 17 files changed, 256 insertions(+), 15 deletions(-) diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java index 63678f8..319d959 100644 --- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java +++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java @@ -134,8 +134,13 @@ public class QueryServiceServlet extends AbstractQueryApiServlet { } @Override + protected void get(IServletRequest request, IServletResponse response) throws IOException { + handleRequest(request, response, true); + } + + @Override protected void post(IServletRequest request, IServletResponse response) throws IOException { - handleRequest(request, response); + handleRequest(request, response, false); } @Override @@ -237,7 +242,8 @@ public class QueryServiceServlet extends AbstractQueryApiServlet { return "http://" + host + path + handlePath(delivery); } - private void handleRequest(IServletRequest request, IServletResponse response) throws IOException { + private void handleRequest(IServletRequest request, IServletResponse response, boolean forceReadOnly) + throws IOException { final IRequestReference requestRef = receptionist.welcome(request); long elapsedStart = System.nanoTime(); long errorCount = 1; @@ -258,6 +264,9 @@ public class QueryServiceServlet extends AbstractQueryApiServlet { optionalParams = optionalParamProvider.apply(request); } setRequestParam(request, param, optionalParams); + if (forceReadOnly) { + param.setReadOnly(true); + } LOGGER.info(() -> "handleRequest: " + LogRedactionUtil.userData(param.toString())); delivery = param.getMode(); setSessionConfig(sessionOutput, param, delivery); diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/ResultExtractor.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/ResultExtractor.java index 5e53d54..ed0c802 100644 --- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/ResultExtractor.java +++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/ResultExtractor.java @@ -108,6 +108,10 @@ public class ResultExtractor { return extract(resultStream, EnumSet.of(ResultField.PLANS), resultCharset).getResult(); } + public static InputStream extractStatus(InputStream resultStream, Charset resultCharset) throws Exception { + return extract(resultStream, EnumSet.of(ResultField.STATUS), resultCharset).getResult(); + } + public static String extractHandle(InputStream resultStream, Charset responseCharset) throws Exception { String result = IOUtils.toString(resultStream, responseCharset); ObjectNode resultJson = OBJECT_MAPPER.readValue(result, ObjectNode.class); diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java index 10869c1..fa2ce19 100644 --- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java +++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java @@ -154,6 +154,7 @@ public class TestExecutor { Pattern.compile("maxresultreads=(\\d+)(\\D|$)", Pattern.MULTILINE); private static final Pattern HTTP_REQUEST_TYPE = Pattern.compile("requesttype=(.*)", Pattern.MULTILINE); private static final Pattern EXTRACT_RESULT_TYPE = Pattern.compile("extractresult=(.*)", Pattern.MULTILINE); + private static final Pattern EXTRACT_STATUS_PATTERN = Pattern.compile("extractstatus", Pattern.MULTILINE); private static final String NC_ENDPOINT_PREFIX = "nc:"; public static final int TRUNCATE_THRESHOLD = 16384; public static final Set<String> NON_CANCELLABLE = @@ -1278,6 +1279,7 @@ public class TestExecutor { final Optional<String> body = extractBody(statement); final Predicate<Integer> statusCodePredicate = extractStatusCodePredicate(statement); final boolean extracResult = isExtracResult(statement); + final boolean extractStatus = isExtractStatus(statement); final String mimeReqType = extractHttpRequestType(statement); ContentType contentType = mimeReqType != null ? ContentType.create(mimeReqType, UTF_8) : TEXT_PLAIN_UTF8; InputStream resultStream; @@ -1286,12 +1288,14 @@ public class TestExecutor { } else if ("uri".equals(extension)) { resultStream = executeURI(reqType, URI.create(variablesReplaced), fmt, params, statusCodePredicate, body, contentType); - if (extracResult) { - resultStream = ResultExtractor.extract(resultStream, UTF_8).getResult(); - } } else { throw new IllegalArgumentException("Unexpected format for method " + reqType + ": " + extension); } + if (extracResult) { + resultStream = ResultExtractor.extract(resultStream, UTF_8).getResult(); + } else if (extractStatus) { + resultStream = ResultExtractor.extractStatus(resultStream, UTF_8); + } if (handleVar != null) { String handle = ResultExtractor.extractHandle(resultStream, UTF_8); if (handle != null) { @@ -1700,6 +1704,11 @@ public class TestExecutor { return m.find() ? Boolean.valueOf(m.group(1)) : false; } + private static boolean isExtractStatus(String statement) { + Matcher m = EXTRACT_STATUS_PATTERN.matcher(statement); + return m.find(); + } + private static boolean isJsonEncoded(String httpRequestType) throws Exception { if (httpRequestType == null || httpRequestType.isEmpty()) { return true; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/api/get-non-query/get-non-query.1.get.http b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/api/get-non-query/get-non-query.1.get.http new file mode 100644 index 0000000..e6aff85 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/api/get-non-query/get-non-query.1.get.http @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +/* + * Description: testing passing a non-query statement using GET + * Result: failure + */ +/query/service +--body={"statement": "CREATE DATAVERSE dv1;"} \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/api/get-non-query/get-non-query.2.get.http b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/api/get-non-query/get-non-query.2.get.http new file mode 100644 index 0000000..5dc6ec7 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/api/get-non-query/get-non-query.2.get.http @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +/* + * Description: testing passing a non-query statement using GET + * Result: failure + */ +/query/service +--body={"statement": "CREATE TYPE t1 AS {id: int};", "readonly": true} \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/api/get-non-query/get-non-query.3.get.http b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/api/get-non-query/get-non-query.3.get.http new file mode 100644 index 0000000..4f08b95 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/api/get-non-query/get-non-query.3.get.http @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +/* + * Description: testing passing a non-query statement using GET + * Result: failure + */ +/query/service +--body={"statement": "CREATE FUNCTION foo(){1};", "readonly": false} \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/api/get-query/get-query.1.get.http b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/api/get-query/get-query.1.get.http new file mode 100644 index 0000000..4743d9f --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/api/get-query/get-query.1.get.http @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +/* + * Description: testing passing a query statement using GET + * Result: success + */ +-- extractresult=true +/query/service +--body={"statement": "FROM Metadata.`Dataverse` v WHERE v.DataverseName = 'Metadata' SELECT VALUE v.DataverseName;"} \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/api/get-query/get-query.2.get.http b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/api/get-query/get-query.2.get.http new file mode 100644 index 0000000..8995d4f --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/api/get-query/get-query.2.get.http @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +/* + * Description: testing passing a query statement using GET + * Result: success + */ +-- extractresult=true +/query/service +--body={"statement": "FROM Metadata.`Dataverse` v WHERE v.DataverseName = 'Metadata' SELECT VALUE v.DataverseName;", "readonly": false} \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/api/get-query/get-query.3.get.http b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/api/get-query/get-query.3.get.http new file mode 100644 index 0000000..f821428 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/api/get-query/get-query.3.get.http @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +/* + * Description: testing passing a query statement using GET + * Result: success + */ +-- extractresult=true +/query/service +--body={"statement": "FROM Metadata.`Dataverse` v WHERE v.DataverseName = 'Metadata' SELECT VALUE v.DataverseName;", "readonly": true} \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/api/post-non-query/post-non-query.1.post.http b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/api/post-non-query/post-non-query.1.post.http new file mode 100644 index 0000000..eec1d95 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/api/post-non-query/post-non-query.1.post.http @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +/* + * Description: testing passing a non-query statement using POST with readonly set to true + * Result: failure + */ +/query/service +--body={"statement": "CREATE TYPE t1 AS {id: int};", "readonly": true} \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/api/post-non-query/post-non-query.2.post.http b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/api/post-non-query/post-non-query.2.post.http new file mode 100644 index 0000000..0fa570b --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/api/post-non-query/post-non-query.2.post.http @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +/* + * Description: testing passing a non-query statement using POST with readonly set to false + * Result: success + */ +-- extractstatus +/query/service +--body={"statement": "CREATE TYPE t1 AS {id: int};", "readonly": false} \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/api/get-query/get-query.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/api/get-query/get-query.1.adm new file mode 100644 index 0000000..da1b8a2 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/api/get-query/get-query.1.adm @@ -0,0 +1 @@ +"Metadata" \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/api/get-query/get-query.2.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/api/get-query/get-query.2.adm new file mode 100644 index 0000000..da1b8a2 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/api/get-query/get-query.2.adm @@ -0,0 +1 @@ +"Metadata" \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/api/get-query/get-query.3.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/api/get-query/get-query.3.adm new file mode 100644 index 0000000..da1b8a2 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/api/get-query/get-query.3.adm @@ -0,0 +1 @@ +"Metadata" \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/api/post-non-query/post-non-query.2.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/api/post-non-query/post-non-query.2.adm new file mode 100644 index 0000000..4063cf1 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/api/post-non-query/post-non-query.2.adm @@ -0,0 +1 @@ +"success" \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml index 7dac28d..3bed78a 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml +++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml @@ -31,15 +31,15 @@ <test-case FilePath="api"> <compilation-unit name="readonly-request"> <output-dir compare="Text">readonly-request</output-dir> - <expected-error>ASX0044: CREATE_DATAVERSE statement is prohibited by this request</expected-error> - <expected-error>ASX0044: DATAVERSE_DROP statement is prohibited by this request</expected-error> - <expected-error>ASX0044: DATASET_DECL statement is prohibited by this request</expected-error> - <expected-error>ASX0044: DATASET_DROP statement is prohibited by this request</expected-error> - <expected-error>ASX0044: CREATE_INDEX statement is prohibited by this request</expected-error> - <expected-error>ASX0044: INDEX_DROP statement is prohibited by this request</expected-error> - <expected-error>ASX0044: INSERT statement is prohibited by this request</expected-error> - <expected-error>ASX0044: UPSERT statement is prohibited by this request</expected-error> - <expected-error>ASX0044: DELETE statement is prohibited by this request</expected-error> + <expected-error>ASX0044: CREATE_DATAVERSE statement is not supported in read-only mode</expected-error> + <expected-error>ASX0044: DATAVERSE_DROP statement is not supported in read-only mode</expected-error> + <expected-error>ASX0044: DATASET_DECL statement is not supported in read-only mode</expected-error> + <expected-error>ASX0044: DATASET_DROP statement is not supported in read-only mode</expected-error> + <expected-error>ASX0044: CREATE_INDEX statement is not supported in read-only mode</expected-error> + <expected-error>ASX0044: INDEX_DROP statement is not supported in read-only mode</expected-error> + <expected-error>ASX0044: INSERT statement is not supported in read-only mode</expected-error> + <expected-error>ASX0044: UPSERT statement is not supported in read-only mode</expected-error> + <expected-error>ASX0044: DELETE statement is not supported in read-only mode</expected-error> </compilation-unit> </test-case> <test-case FilePath="api"> @@ -108,6 +108,25 @@ <output-dir compare="AST">format-param-in-accept-05</output-dir> </compilation-unit> </test-case> + <test-case FilePath="api"> + <compilation-unit name="get-non-query"> + <output-dir compare="Text">get-non-query</output-dir> + <expected-error>CREATE_DATAVERSE statement is not supported in read-only mode</expected-error> + <expected-error>TYPE_DECL statement is not supported in read-only mode</expected-error> + <expected-error>CREATE_FUNCTION statement is not supported in read-only mode</expected-error> + </compilation-unit> + </test-case> + <test-case FilePath="api"> + <compilation-unit name="get-query"> + <output-dir compare="Text">get-query</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="api"> + <compilation-unit name="post-non-query"> + <output-dir compare="Text">post-non-query</output-dir> + <expected-error>TYPE_DECL statement is not supported in read-only mode</expected-error> + </compilation-unit> + </test-case> </test-group> <test-group name="flwor"> <test-case FilePath="flwor"> diff --git a/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties b/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties index 666b190..37a8818 100644 --- a/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties +++ b/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties @@ -78,7 +78,7 @@ 41 = Request %1$s has been cancelled 42 = %1$s: \"%2$s\" is not a TPC-DS table name 43 = Value out of range, function %1$s expects its %2$s input parameter value to be between %3$s and %4$s, received %5$s -44 = %1$s statement is prohibited by this request +44 = %1$s statement is not supported in read-only mode 45 = Invalid value: function %1$s expects its %2$s input parameter to be an integer value, got %3$s 46 = Invalid pattern \"%1$s\" for LIKE 47 = Invalid value for parameter \"%1$s\": %2$s
