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 26e411e19e5d44146187471c02953de147cfcdb7 Author: Dmitry Lychagin <[email protected]> AuthorDate: Wed Jul 1 10:20:00 2020 -0700 [ASTERIXDB-2754][COMP] LoadRecordFieldsRule must clone expression - user model changes: no - storage format changes: no - interface changes: no Details: - LoadRecordFieldsRule replaces a field access expression with another expression that it gets from a record constructor that created this field. It must clone the replacement expression because it's still used by the record constructor Change-Id: I4ba653bbb82a76783b295c3bc3cfbed897a3b4e6 Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/7064 Integration-Tests: Jenkins <[email protected]> Tested-by: Jenkins <[email protected]> Reviewed-by: Dmitry Lychagin <[email protected]> Reviewed-by: Ali Alsuliman <[email protected]> --- .../optimizer/rules/LoadRecordFieldsRule.java | 2 +- .../optimizerts/queries/common-expr-01.sqlpp | 65 +++++++++++++++++++++ .../optimizerts/results/common-expr-01.plan | 68 ++++++++++++++++++++++ 3 files changed, 134 insertions(+), 1 deletion(-) diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/LoadRecordFieldsRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/LoadRecordFieldsRule.java index 6762e77..ce1312f 100644 --- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/LoadRecordFieldsRule.java +++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/LoadRecordFieldsRule.java @@ -292,7 +292,7 @@ public class LoadRecordFieldsRule implements IAlgebraicRewriteRule { VariableUtilities.getLiveVariables(assign, liveInputVars); usedVariables.removeAll(liveInputVars); if (usedVariables.isEmpty()) { - assign.getExpressions().get(0).setValue(fldExpr); + assign.getExpressions().get(0).setValue(fldExpr.cloneExpression()); return true; } else { return false; diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/queries/common-expr-01.sqlpp b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/common-expr-01.sqlpp new file mode 100644 index 0000000..30249d8 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/common-expr-01.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. + */ +/* + * Test common expression extraction + */ + +DROP DATAVERSE test IF EXISTS; +CREATE DATAVERSE test; + +USE test; + +CREATE TYPE test.TestType AS +{ + id : INTEGER +}; + +CREATE DATASET t1(TestType) PRIMARY KEY id; + +WITH DT_PATTERN AS "YYYY-MM-DDThh:mm:ss" + +SELECT + v2.c11, + v1.c3, + SUM(v1.c4) +FROM ( + SELECT + c1, + c2, + GET_MONTH(PRINT_DATETIME(PARSE_DATETIME(c1,DT_PATTERN),DT_PATTERN)) AS c3, + (CASE WHEN CONTAINS(c2, "x") THEN 1 ELSE 0 END) AS c4 + FROM test.t1 +) AS v1 +INNER JOIN ( + SELECT + GET_HOUR(DURATION_FROM_INTERVAL(INTERVAL( + PARSE_DATETIME(PRINT_DATETIME(CURRENT_DATETIME(),DT_PATTERN),DT_PATTERN), + PARSE_DATETIME(MAX(PRINT_DATETIME(PARSE_DATETIME(t1.c5,DT_PATTERN),DT_PATTERN)),DT_PATTERN) + ))) AS c11 + FROM test.t1 +) AS v2 ON TRUE +WHERE + GET_DAY(DURATION_FROM_INTERVAL(INTERVAL( + PARSE_DATETIME(PRINT_DATETIME(CURRENT_DATETIME(),DT_PATTERN),DT_PATTERN), + PARSE_DATETIME(v1.c1,DT_PATTERN) + ))) <= 30 + AND + (v1.c2 NOT IN ["a","b","c","d"]) +GROUP BY + v1.c3, v2.c11; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/common-expr-01.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/common-expr-01.plan new file mode 100644 index 0000000..83fc968 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/common-expr-01.plan @@ -0,0 +1,68 @@ +-- DISTRIBUTE_RESULT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- SORT_GROUP_BY[$$176, $$177] |PARTITIONED| + { + -- AGGREGATE |LOCAL| + -- NESTED_TUPLE_SOURCE |LOCAL| + } + -- HASH_PARTITION_EXCHANGE [$$176, $$177] |PARTITIONED| + -- SORT_GROUP_BY[$$159, $$160] |PARTITIONED| + { + -- AGGREGATE |LOCAL| + -- NESTED_TUPLE_SOURCE |LOCAL| + } + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- NESTED_LOOP |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- STREAM_SELECT |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- PRE_CLUSTERED_GROUP_BY[$$163] |PARTITIONED| + { + -- AGGREGATE |LOCAL| + -- STREAM_SELECT |LOCAL| + -- NESTED_TUPLE_SOURCE |LOCAL| + } + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STABLE_SORT [$$163(ASC)] |PARTITIONED| + -- HASH_PARTITION_EXCHANGE [$$163] |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- NESTED_LOOP |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STREAM_SELECT |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- REPLICATE |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- DATASOURCE_SCAN |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- EMPTY_TUPLE_SOURCE |PARTITIONED| + -- BROADCAST_EXCHANGE |PARTITIONED| + -- ASSIGN |UNPARTITIONED| + -- UNNEST |UNPARTITIONED| + -- EMPTY_TUPLE_SOURCE |UNPARTITIONED| + -- BROADCAST_EXCHANGE |PARTITIONED| + -- AGGREGATE |UNPARTITIONED| + -- RANDOM_MERGE_EXCHANGE |PARTITIONED| + -- AGGREGATE |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- REPLICATE |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- DATASOURCE_SCAN |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- EMPTY_TUPLE_SOURCE |PARTITIONED| \ No newline at end of file
