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 562fe20fede366b85f1507df9a962b2202248df6 Author: Dmitry Lychagin <[email protected]> AuthorDate: Mon Jun 28 11:03:21 2021 -0700 [ASTERIXDB-2917][COMP] Incorrect result with group by over cross product - user model changes: no - storage format changes: no - interface changes: no Details: - Fix incorrect result caused PushGroupByThroughProduct rule - Add testcase Change-Id: I85400289d3096c4da38ed73c7576e7c8b79a4909 Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/12104 Integration-Tests: Jenkins <[email protected]> Tested-by: Jenkins <[email protected]> Reviewed-by: Dmitry Lychagin <[email protected]> Reviewed-by: Ali Alsuliman <[email protected]> --- .../optimizer/rules/PushGroupByThroughProduct.java | 17 ++++++----- .../gby-cross-join/gby-cross-join.1.ddl.sqlpp | 34 ++++++++++++++++++++++ .../gby-cross-join/gby-cross-join.2.update.sqlpp | 34 ++++++++++++++++++++++ .../gby-cross-join/gby-cross-join.3.query.sqlpp | 25 ++++++++++++++++ .../group-by/gby-cross-join/gby-cross-join.3.adm | 2 ++ .../test/resources/runtimets/testsuite_sqlpp.xml | 5 ++++ 6 files changed, 110 insertions(+), 7 deletions(-) diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushGroupByThroughProduct.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushGroupByThroughProduct.java index 48c4324..6d92b51 100644 --- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushGroupByThroughProduct.java +++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushGroupByThroughProduct.java @@ -84,24 +84,27 @@ public class PushGroupByThroughProduct implements IAlgebraicRewriteRule { Mutable<ILogicalOperator> opLeftRef = join.getInputs().get(0); ILogicalOperator opLeft = opLeftRef.getValue(); + Mutable<ILogicalOperator> opRightRef = join.getInputs().get(1); + ILogicalOperator opRight = opRightRef.getValue(); switch (canPushThrough(gby, opLeft, decorToPush, decorNotToPush)) { case REPEATED_DECORS: { return false; } case TRUE: { - push(opRef, opRef2, 0, decorToPush, decorNotToPush, context); - return true; + if (OperatorPropertiesUtil.isCardinalityZeroOrOne(opRight)) { + push(opRef, opRef2, 0, decorToPush, decorNotToPush, context); + return true; + } + return false; } case FALSE: { decorToPush.clear(); - Mutable<ILogicalOperator> opRightRef = join.getInputs().get(1); - ILogicalOperator opRight = opRightRef.getValue(); - if (canPushThrough(gby, opRight, decorToPush, decorNotToPush) == PushTestResult.TRUE) { + if (canPushThrough(gby, opRight, decorToPush, decorNotToPush) == PushTestResult.TRUE + && OperatorPropertiesUtil.isCardinalityZeroOrOne(opLeft)) { push(opRef, opRef2, 1, decorToPush, decorNotToPush, context); return true; - } else { - return false; } + return false; } default: { throw new IllegalStateException(); diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/group-by/gby-cross-join/gby-cross-join.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/group-by/gby-cross-join/gby-cross-join.1.ddl.sqlpp new file mode 100644 index 0000000..10f5546 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/group-by/gby-cross-join/gby-cross-join.1.ddl.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. + */ + +/* + * Description : Testing group by over cross product (ASTERIXDB-2917) + * Expected : SUCCESS + */ + + +drop dataverse test if exists; +create dataverse test; + +use test; + +create dataset t1(id integer not unknown) open type primary key id; + +create dataset t2(id integer not unknown) open type primary key id; + diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/group-by/gby-cross-join/gby-cross-join.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/group-by/gby-cross-join/gby-cross-join.2.update.sqlpp new file mode 100644 index 0000000..7fe3777 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/group-by/gby-cross-join/gby-cross-join.2.update.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. + */ + +use test; + +insert into t1 ([ + { "id": 1, "x": "a" }, + { "id": 2, "x": "a" }, + { "id": 3, "x": "a" }, + { "id": 4, "x": "b" }, + { "id": 5, "x": "b" }, + { "id": 6, "x": "b" } +]); + +insert into t2 ([ + { "id": 11, "y": "c" }, + { "id": 12, "y": "c" } +]); \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/group-by/gby-cross-join/gby-cross-join.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/group-by/gby-cross-join/gby-cross-join.3.query.sqlpp new file mode 100644 index 0000000..34ec706 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/group-by/gby-cross-join/gby-cross-join.3.query.sqlpp @@ -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. + */ + +use test; + +select t1.x, count(*) as cnt +from t2, t1 +group by t1.x +order by t1.x; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/group-by/gby-cross-join/gby-cross-join.3.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/group-by/gby-cross-join/gby-cross-join.3.adm new file mode 100644 index 0000000..e1e3cf1 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/group-by/gby-cross-join/gby-cross-join.3.adm @@ -0,0 +1,2 @@ +{ "cnt": 6, "x": "a" } +{ "cnt": 6, "x": "b" } \ 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 4c034ad..8d06f71 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml +++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml @@ -5323,6 +5323,11 @@ </compilation-unit> </test-case> <test-case FilePath="group-by"> + <compilation-unit name="gby-cross-join"> + <output-dir compare="Text">gby-cross-join</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="group-by"> <compilation-unit name="gby-nested-01"> <output-dir compare="Text">gby-nested-01</output-dir> </compilation-unit>
