This is an automated email from the ASF dual-hosted git repository. dlych pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/asterixdb.git
commit 7c62452039c684d6d38afcad8854653024cb41de Author: Dmitry Lychagin <[email protected]> AuthorDate: Fri Dec 4 18:01:45 2020 -0800 [NO ISSUE][COMP] Handle parsing failures for index related hints - user model changes: no - storage format changes: no - interface changes: no Details: - Recover from parameter parsing failure for index-related hints. Log a warning, do not fail the whole query - Add testcases Change-Id: If5c1dc78ddd9c4b08628b94b5703c5ca359c0702 Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/9165 Integration-Tests: Jenkins <[email protected]> Tested-by: Jenkins <[email protected]> Reviewed-by: Dmitry Lychagin <[email protected]> Reviewed-by: Ali Alsuliman <[email protected]> --- .../hints-indexnl-params-8.sqlpp | 65 +++++++++++++++++++++ .../hints-skip-index/hints-skip-index-13.sqlpp | 60 +++++++++++++++++++ .../hints-use-index/hints-use-index-18.sqlpp | 67 ++++++++++++++++++++++ .../hints-use-index/hints-use-index-19.sqlpp | 67 ++++++++++++++++++++++ .../hints-indexnl-params-8.plan | 25 ++++++++ .../hints-skip-index/hints-skip-index-13.plan | 19 ++++++ .../hints-use-index/hints-use-index-18.plan | 19 ++++++ .../hints-use-index/hints-use-index-19.plan | 19 ++++++ .../hints-indexnl-params.8.query.sqlpp | 36 ++++++++++++ .../hints-skip-index.11.query.sqlpp | 30 ++++++++++ .../hints-skip-index.12.query.sqlpp | 30 ++++++++++ .../hints-skip-index.13.query.sqlpp | 33 +++++++++++ .../hints-use-index/hints-use-index.18.query.sqlpp | 34 +++++++++++ .../hints-use-index/hints-use-index.19.query.sqlpp | 34 +++++++++++ .../hints-indexnl-params.8.adm | 10 ++++ .../hints-skip-index/hints-skip-index.11.adm | 20 +++++++ .../hints-skip-index/hints-skip-index.12.adm | 20 +++++++ .../hints-skip-index/hints-skip-index.13.adm | 10 ++++ .../hints-use-index/hints-use-index.18.adm | 10 ++++ .../hints-use-index/hints-use-index.19.adm | 10 ++++ .../test/resources/runtimets/testsuite_sqlpp.xml | 10 +++- .../asterix/common/exceptions/ErrorCode.java | 1 + .../src/main/resources/asx_errormsg/en.properties | 1 + .../asterix-lang-sqlpp/src/main/javacc/SQLPP.jj | 26 +++++++-- 24 files changed, 647 insertions(+), 9 deletions(-) diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/queries/btree-index-join/hints-indexnl-params/hints-indexnl-params-8.sqlpp b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/btree-index-join/hints-indexnl-params/hints-indexnl-params-8.sqlpp new file mode 100644 index 0000000..b9e443c --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/btree-index-join/hints-indexnl-params/hints-indexnl-params-8.sqlpp @@ -0,0 +1,65 @@ +/* + * 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. + */ + +drop dataverse test if exists; +create dataverse test; + +use test; + +create type tenkType as closed { + unique1 : integer, + unique2 : integer, + two : integer, + four : integer, + ten : integer, + twenty : integer, + hundred : integer, + thousand : integer, + twothousand : integer, + fivethous : integer, + tenthous : integer, + odd100 : integer, + even100 : integer, + stringu1 : string, + stringu2 : string, + string4 : string +}; + +create dataset tenk1(tenkType) primary key unique2; + +create index idx_tenk1_1k on tenk1(thousand); + +create dataset tenk2(tenkType) primary key unique2; + +create index idx_tenk2_1k on tenk2(thousand); + +create index idx_tenk2_1k_2k on tenk2(thousand, twothousand); + +/* + * indexnl hint with invalid parameter syntax -> its parameters are ignored (hint is treated as having no parameters) + * explain plan -> index join using idx_tenk2_1k + */ + +select value tenk2.unique1 +from tenk1, tenk2 +where + tenk1.unique2 < 1 +and + tenk1.thousand /* +indexnl(8, idx_tenk2_1k_2k) */ = tenk2.thousand +order by tenk2.unique1; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/queries/btree-index-selection/hints-skip-index/hints-skip-index-13.sqlpp b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/btree-index-selection/hints-skip-index/hints-skip-index-13.sqlpp new file mode 100644 index 0000000..e81c7f9 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/btree-index-selection/hints-skip-index/hints-skip-index-13.sqlpp @@ -0,0 +1,60 @@ +/* + * 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. + */ + +drop dataverse test if exists; +create dataverse test; + +use test; + +create type tenkType as closed { + unique1 : integer, + unique2 : integer, + two : integer, + four : integer, + ten : integer, + twenty : integer, + hundred : integer, + thousand : integer, + twothousand : integer, + fivethous : integer, + tenthous : integer, + odd100 : integer, + even100 : integer, + stringu1 : string, + stringu2 : string, + string4 : string +}; + +create dataset tenk(tenkType) primary key unique2; + +create index idx_1k on tenk(thousand); + +create index idx_1k_2k on tenk(thousand, twothousand); + +create index idx_2k on tenk(twothousand); + +/* + * skip-index hint with invalid parameter syntax -> the whole hint is ignored. + * explain plan -> idx_1k is used. + */ + +select value unique1 +from tenk +where thousand /* +skip-index(13, idx_1k) */ = 0 +order by unique1; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/queries/btree-index-selection/hints-use-index/hints-use-index-18.sqlpp b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/btree-index-selection/hints-use-index/hints-use-index-18.sqlpp new file mode 100644 index 0000000..6ed480e --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/btree-index-selection/hints-use-index/hints-use-index-18.sqlpp @@ -0,0 +1,67 @@ +/* + * 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. + */ + +drop dataverse test if exists; +create dataverse test; + +use test; + +create type tenkType as closed { + unique1 : integer, + unique2 : integer, + two : integer, + four : integer, + ten : integer, + twenty : integer, + hundred : integer, + thousand : integer, + twothousand : integer, + fivethous : integer, + tenthous : integer, + odd100 : integer, + even100 : integer, + stringu1 : string, + stringu2 : string, + string4 : string +}; + +create dataset tenk(tenkType) primary key unique2; + +create index idx_1k on tenk(thousand); + +create index idx_1k_2k on tenk(thousand, twothousand); + +create index idx_2k on tenk(twothousand); + +create index idx_2k_5k on tenk(twothousand, fivethous); + +create index idx_5k on tenk(fivethous); + +create index idx_5k_10k on tenk(fivethous, tenthous); + +/* + * use-index hint with invalid parameter syntax. the whole hint is ignored. + * explain plan -> idx_1k is used. + */ + +select value unique1 +from tenk +where + thousand /* +use-index(18, idx_1k_2k) */ = 0 +order by unique1; diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/queries/btree-index-selection/hints-use-index/hints-use-index-19.sqlpp b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/btree-index-selection/hints-use-index/hints-use-index-19.sqlpp new file mode 100644 index 0000000..6c87b3e --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/btree-index-selection/hints-use-index/hints-use-index-19.sqlpp @@ -0,0 +1,67 @@ +/* + * 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. + */ + +drop dataverse test if exists; +create dataverse test; + +use test; + +create type tenkType as closed { + unique1 : integer, + unique2 : integer, + two : integer, + four : integer, + ten : integer, + twenty : integer, + hundred : integer, + thousand : integer, + twothousand : integer, + fivethous : integer, + tenthous : integer, + odd100 : integer, + even100 : integer, + stringu1 : string, + stringu2 : string, + string4 : string +}; + +create dataset tenk(tenkType) primary key unique2; + +create index idx_1k on tenk(thousand); + +create index idx_1k_2k on tenk(thousand, twothousand); + +create index idx_2k on tenk(twothousand); + +create index idx_2k_5k on tenk(twothousand, fivethous); + +create index idx_5k on tenk(fivethous); + +create index idx_5k_10k on tenk(fivethous, tenthous); + +/* + * use-index hint with no parameters. the whole hint is ignored. + * explain plan -> idx_1k is used. + */ + +select value unique1 +from tenk +where + thousand /* +use-index() */ = 0 +order by unique1; diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-join/hints-indexnl-params/hints-indexnl-params-8.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-join/hints-indexnl-params/hints-indexnl-params-8.plan new file mode 100644 index 0000000..758182a --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-join/hints-indexnl-params/hints-indexnl-params-8.plan @@ -0,0 +1,25 @@ +-- DISTRIBUTE_RESULT |PARTITIONED| + -- SORT_MERGE_EXCHANGE [$$37(ASC) ] |PARTITIONED| + -- STABLE_SORT [$$37(ASC)] |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- STREAM_SELECT |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- BTREE_SEARCH (test.tenk2.tenk2) |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STABLE_SORT [$$42(ASC)] |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- BTREE_SEARCH (test.tenk2.idx_tenk2_1k) |PARTITIONED| + -- BROADCAST_EXCHANGE |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- BTREE_SEARCH (test.tenk1.tenk1) |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- EMPTY_TUPLE_SOURCE |PARTITIONED| \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/hints-skip-index/hints-skip-index-13.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/hints-skip-index/hints-skip-index-13.plan new file mode 100644 index 0000000..102a5e7 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/hints-skip-index/hints-skip-index-13.plan @@ -0,0 +1,19 @@ +-- DISTRIBUTE_RESULT |PARTITIONED| + -- SORT_MERGE_EXCHANGE [$$19(ASC) ] |PARTITIONED| + -- STABLE_SORT [$$19(ASC)] |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- STREAM_SELECT |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- BTREE_SEARCH (test.tenk.tenk) |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STABLE_SORT [$$23(ASC)] |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- BTREE_SEARCH (test.tenk.idx_1k) |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- EMPTY_TUPLE_SOURCE |PARTITIONED| \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/hints-use-index/hints-use-index-18.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/hints-use-index/hints-use-index-18.plan new file mode 100644 index 0000000..102a5e7 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/hints-use-index/hints-use-index-18.plan @@ -0,0 +1,19 @@ +-- DISTRIBUTE_RESULT |PARTITIONED| + -- SORT_MERGE_EXCHANGE [$$19(ASC) ] |PARTITIONED| + -- STABLE_SORT [$$19(ASC)] |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- STREAM_SELECT |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- BTREE_SEARCH (test.tenk.tenk) |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STABLE_SORT [$$23(ASC)] |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- BTREE_SEARCH (test.tenk.idx_1k) |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- EMPTY_TUPLE_SOURCE |PARTITIONED| \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/hints-use-index/hints-use-index-19.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/hints-use-index/hints-use-index-19.plan new file mode 100644 index 0000000..102a5e7 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/hints-use-index/hints-use-index-19.plan @@ -0,0 +1,19 @@ +-- DISTRIBUTE_RESULT |PARTITIONED| + -- SORT_MERGE_EXCHANGE [$$19(ASC) ] |PARTITIONED| + -- STABLE_SORT [$$19(ASC)] |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- STREAM_SELECT |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- BTREE_SEARCH (test.tenk.tenk) |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STABLE_SORT [$$23(ASC)] |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- BTREE_SEARCH (test.tenk.idx_1k) |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- EMPTY_TUPLE_SOURCE |PARTITIONED| \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-join/hints-indexnl-params/hints-indexnl-params.8.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-join/hints-indexnl-params/hints-indexnl-params.8.query.sqlpp new file mode 100644 index 0000000..fab0baf --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-join/hints-indexnl-params/hints-indexnl-params.8.query.sqlpp @@ -0,0 +1,36 @@ +/* + * 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. + */ + +// requesttype=application/json +// param max-warnings:json=10 + +use test; + +/* + * indexnl hint with invalid parameter syntax -> its parameters are ignored (hint is treated as having no parameters) + * explain plan -> index join using idx_tenk2_1k + */ + +select value tenk2.unique1 +from tenk1, tenk2 +where + tenk1.unique2 < 1 +and + tenk1.thousand /* +indexnl(8, idx_tenk2_1k_2k) */ = tenk2.thousand +order by tenk2.unique1; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/hints-skip-index/hints-skip-index.11.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/hints-skip-index/hints-skip-index.11.query.sqlpp new file mode 100644 index 0000000..8f71036 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/hints-skip-index/hints-skip-index.11.query.sqlpp @@ -0,0 +1,30 @@ +/* + * 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. + */ + +use test; + +/* + * disjunctive predicate is translated into an index join, use skip-index to disable index join. + * explain plan -> expect broadcast hash join + */ + +select value unique1 +from tenk +where thousand /* +skip-index */ = 0 or thousand = 1 +order by unique1; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/hints-skip-index/hints-skip-index.12.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/hints-skip-index/hints-skip-index.12.query.sqlpp new file mode 100644 index 0000000..34e6474 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/hints-skip-index/hints-skip-index.12.query.sqlpp @@ -0,0 +1,30 @@ +/* + * 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. + */ + +use test; + +/* + * disjunctive predicate is translated into an index join, use skip-index to disable idx_1k for index join. + * explain plan -> expect index join using idx_1k_2k + */ + +select value unique1 +from tenk +where thousand /* +skip-index(idx_1k) */ = 0 or thousand = 1 +order by unique1; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/hints-skip-index/hints-skip-index.13.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/hints-skip-index/hints-skip-index.13.query.sqlpp new file mode 100644 index 0000000..c16d23b --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/hints-skip-index/hints-skip-index.13.query.sqlpp @@ -0,0 +1,33 @@ +/* + * 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. + */ + +// requesttype=application/json +// param max-warnings:json=10 + +use test; + +/* + * skip-index hint with invalid parameter syntax -> the whole hint is ignored. + * explain plan -> idx_1k is used. + */ + +select value unique1 +from tenk +where thousand /* +skip-index(13, idx_1k) */ = 0 +order by unique1; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/hints-use-index/hints-use-index.18.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/hints-use-index/hints-use-index.18.query.sqlpp new file mode 100644 index 0000000..fbc9e6a --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/hints-use-index/hints-use-index.18.query.sqlpp @@ -0,0 +1,34 @@ +/* + * 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. + */ + +// requesttype=application/json +// param max-warnings:json=10 + +use test; + +/* + * use-index hint with invalid parameter syntax. the whole hint is ignored. + * explain plan -> idx_1k is used. + */ + +select value unique1 +from tenk +where + thousand /* +use-index(18, idx_1k_2k) */ = 0 +order by unique1; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/hints-use-index/hints-use-index.19.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/hints-use-index/hints-use-index.19.query.sqlpp new file mode 100644 index 0000000..72eed33 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/hints-use-index/hints-use-index.19.query.sqlpp @@ -0,0 +1,34 @@ +/* + * 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. + */ + +// requesttype=application/json +// param max-warnings:json=10 + +use test; + +/* + * use-index hint with no parameters. the whole hint is ignored. + * explain plan -> idx_1k is used. + */ + +select value unique1 +from tenk +where + thousand /* +use-index() */ = 0 +order by unique1; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/index-join/hints-indexnl-params/hints-indexnl-params.8.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/index-join/hints-indexnl-params/hints-indexnl-params.8.adm new file mode 100644 index 0000000..7336a43 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/index-join/hints-indexnl-params/hints-indexnl-params.8.adm @@ -0,0 +1,10 @@ +800 +1800 +2800 +3800 +4800 +5800 +6800 +7800 +8800 +9800 \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/index-selection/hints-skip-index/hints-skip-index.11.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/index-selection/hints-skip-index/hints-skip-index.11.adm new file mode 100644 index 0000000..5d5162b --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/index-selection/hints-skip-index/hints-skip-index.11.adm @@ -0,0 +1,20 @@ +0 +1 +1000 +1001 +2000 +2001 +3000 +3001 +4000 +4001 +5000 +5001 +6000 +6001 +7000 +7001 +8000 +8001 +9000 +9001 \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/index-selection/hints-skip-index/hints-skip-index.12.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/index-selection/hints-skip-index/hints-skip-index.12.adm new file mode 100644 index 0000000..5d5162b --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/index-selection/hints-skip-index/hints-skip-index.12.adm @@ -0,0 +1,20 @@ +0 +1 +1000 +1001 +2000 +2001 +3000 +3001 +4000 +4001 +5000 +5001 +6000 +6001 +7000 +7001 +8000 +8001 +9000 +9001 \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/index-selection/hints-skip-index/hints-skip-index.13.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/index-selection/hints-skip-index/hints-skip-index.13.adm new file mode 100644 index 0000000..17cce63 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/index-selection/hints-skip-index/hints-skip-index.13.adm @@ -0,0 +1,10 @@ +0 +1000 +2000 +3000 +4000 +5000 +6000 +7000 +8000 +9000 \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/index-selection/hints-use-index/hints-use-index.18.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/index-selection/hints-use-index/hints-use-index.18.adm new file mode 100644 index 0000000..17cce63 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/index-selection/hints-use-index/hints-use-index.18.adm @@ -0,0 +1,10 @@ +0 +1000 +2000 +3000 +4000 +5000 +6000 +7000 +8000 +9000 \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/index-selection/hints-use-index/hints-use-index.19.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/index-selection/hints-use-index/hints-use-index.19.adm new file mode 100644 index 0000000..17cce63 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/index-selection/hints-use-index/hints-use-index.19.adm @@ -0,0 +1,10 @@ +0 +1000 +2000 +3000 +4000 +5000 +6000 +7000 +8000 +9000 \ 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 f6113c4..ed5399d 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml +++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml @@ -5880,9 +5880,10 @@ <output-dir compare="Text">btree-secondary-self-equi-join_01</output-dir> </compilation-unit> </test-case> - <test-case FilePath="index-join"> + <test-case FilePath="index-join" check-warnings="true"> <compilation-unit name="hints-indexnl-params"> <output-dir compare="Text">hints-indexnl-params</output-dir> + <expected-warn><![CDATA[ASX1132: Invalid specification for hint indexnl. ASX1001: Syntax error: In line 1 >>(8, idx_tenk2_1k_2k)<< Encountered <INTEGER_LITERAL> "8" at column 2. (in line 35, at column 21)]]></expected-warn> </compilation-unit> </test-case> <test-case FilePath="index-join"> @@ -6157,14 +6158,17 @@ <output-dir compare="Text">dataset-with-meta</output-dir> </compilation-unit> </test-case> - <test-case FilePath="index-selection"> + <test-case FilePath="index-selection" check-warnings="true"> <compilation-unit name="hints-skip-index"> <output-dir compare="Text">hints-skip-index</output-dir> + <expected-warn><![CDATA[ASX1132: Invalid specification for hint skip-index. ASX1001: Syntax error: In line 1 >>(13, idx_1k)<< Encountered <INTEGER_LITERAL> "13" at column 2. (in line 32, at column 19)]]></expected-warn> </compilation-unit> </test-case> - <test-case FilePath="index-selection"> + <test-case FilePath="index-selection" check-warnings="true"> <compilation-unit name="hints-use-index"> <output-dir compare="Text">hints-use-index</output-dir> + <expected-warn><![CDATA[ASX1132: Invalid specification for hint use-index. ASX1001: Syntax error: In line 1 >>(18, idx_1k_2k)<< Encountered <INTEGER_LITERAL> "18" at column 2. (in line 33, at column 15)]]></expected-warn> + <expected-warn><![CDATA[ASX1132: Invalid specification for hint use-index. ASX1001: Syntax error: In line 1 >>()<< Encountered ")" at column 2. (in line 33, at column 15)]]></expected-warn> </compilation-unit> </test-case> <test-case FilePath="index-selection"> diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java index 0efddeb..6dbb46b 100644 --- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java +++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java @@ -221,6 +221,7 @@ public class ErrorCode { public static final int UNSUPPORTED_GBY_OBY_SELECT_COMBO = 1129; public static final int ILLEGAL_RIGHT_OUTER_JOIN = 1130; public static final int SYNONYM_EXISTS = 1131; + public static final int INVALID_HINT = 1132; // Feed errors public static final int DATAFLOW_ILLEGAL_STATE = 3001; public static final int UTIL_DATAFLOW_UTILS_TUPLE_TOO_LARGE = 3002; 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 1a9afd3..22f7308 100644 --- a/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties +++ b/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties @@ -218,6 +218,7 @@ 1129 = Cannot compile SELECT variable.* with GROUP BY GROUPING SETS/ROLLUP/CUBE followed by ORDER BY/LIMIT 1130 = Illegal use of RIGHT OUTER JOIN 1131 = A synonym with this name %1$s already exists +1132 = Invalid specification for hint %1$s. %2$s # Feed Errors 3001 = Illegal state. diff --git a/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj b/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj index 645fc27..c9a7370 100644 --- a/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj +++ b/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj @@ -580,7 +580,9 @@ class SQLPPParser extends ScopeChecker implements IParser { } } - private IExpressionAnnotation parseExpressionAnnotation(Token hintToken) throws SqlppParseException { + private IExpressionAnnotation parseExpressionAnnotation(Token hintToken) { + // placeholder for the annotation that should be returned if this hint's parameters cannot be parsed + IExpressionAnnotation onParseErrorReturn = null; try { switch (hintToken.hint) { case HASH_BROADCAST_JOIN_HINT: @@ -589,6 +591,8 @@ class SQLPPParser extends ScopeChecker implements IParser { if (hintToken.hintParams == null) { return IndexedNLJoinExpressionAnnotation.INSTANCE_ANY_INDEX; } else { + // if parameter parsing fails then return hint annotation without parameters + onParseErrorReturn = IndexedNLJoinExpressionAnnotation.INSTANCE_ANY_INDEX; List<String> indexNames = parseParenthesizedIdentifierList(hintToken.hintParams); return IndexedNLJoinExpressionAnnotation.newInstance(indexNames); } @@ -600,23 +604,33 @@ class SQLPPParser extends ScopeChecker implements IParser { if (hintToken.hintParams == null) { return SkipSecondaryIndexSearchExpressionAnnotation.INSTANCE_ANY_INDEX; } else { + // if parameter parsing fails then ignore this hint List<String> indexNames = parseParenthesizedIdentifierList(hintToken.hintParams); return SkipSecondaryIndexSearchExpressionAnnotation.newInstance(indexNames); } case USE_SECONDARY_INDEX_SEARCH_HINT: if (hintToken.hintParams == null) { - throw new SqlppParseException(getSourceLocation(hintToken), "Expected index name"); + throw new SqlppParseException(getSourceLocation(hintToken), "Expected index name(s)"); } else { + // if parameter parsing fails then ignore this hint List<String> indexNames = parseParenthesizedIdentifierList(hintToken.hintParams); return SecondaryIndexSearchPreferenceAnnotation.newInstance(indexNames); } default: - throw new SqlppParseException(getSourceLocation(hintToken), "Unexpected hint " + hintToken.hint); + throw new SqlppParseException(getSourceLocation(hintToken), "Unexpected hint"); } + } catch (SqlppParseException e) { + if (warningCollector.shouldWarn()) { + warningCollector.warn(WarningUtil.forAsterix(getSourceLocation(hintToken), ErrorCode.INVALID_HINT, + hintToken.hint.toString(), e.getMessage())); + } + return onParseErrorReturn; } catch (CompilationException e) { - SqlppParseException pe = new SqlppParseException(getSourceLocation(hintToken), e.getMessage()); - pe.initCause(e); - throw pe; + if (warningCollector.shouldWarn()) { + warningCollector.warn(WarningUtil.forAsterix(getSourceLocation(hintToken), ErrorCode.INVALID_HINT, + hintToken.hint.toString(), e.getMessage())); + } + return onParseErrorReturn; } }
