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 87f19a1e8f9bad67135cdbb134f4090be9465fad Author: Ritik Raj <[email protected]> AuthorDate: Fri Dec 27 13:04:41 2024 +0530 [ASTERIXDB-3540][COMP] Fixed calculation of expected schema for pushdown - user model changes: no - storage format changes: no - interface changes: no Details: if the getField expr consisted of a function which needs to be evaluated at runtime, the pushdown computer was not evaluating those expression leading to incorrect computation. eg: 1. `field-access-by-name`(t.r.p, x.y.age_field) 2. `field-access-by-name`(t.r.p, substring(x.y.age_field, 0, 4)) Ext-ref: MB-64721 Change-Id: I9b665cf86e7dee20c847a883554f5f32ecd0671f Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/19226 Tested-by: Jenkins <[email protected]> Reviewed-by: Murtadha Hubail <[email protected]> --- .../pushdown/schema/ExpectedSchemaBuilder.java | 69 ++++ .../ASTERIXDB-3540/ASTERIXDB-3540.001.ddl.sqlpp | 33 ++ .../ASTERIXDB-3540/ASTERIXDB-3540.002.update.sqlpp | 37 ++ .../ASTERIXDB-3540/ASTERIXDB-3540.003.query.sqlpp | 23 ++ .../ASTERIXDB-3540/ASTERIXDB-3540.004.query.sqlpp | 23 ++ .../ASTERIXDB-3540/ASTERIXDB-3540.005.query.sqlpp | 23 ++ .../ASTERIXDB-3540/ASTERIXDB-3540.006.query.sqlpp | 23 ++ .../ASTERIXDB-3540/ASTERIXDB-3540.003.plan | 20 ++ .../ASTERIXDB-3540/ASTERIXDB-3540.004.plan | 20 ++ .../pushdown/ASTERIXDB-3540/ASTERIXDB-3540.005.adm | 1 + .../pushdown/ASTERIXDB-3540/ASTERIXDB-3540.006.adm | 1 + .../src/test/resources/runtimets/sqlpp_queries.xml | 5 + .../runtimets/testsuite_single_partition_sqlpp.xml | 387 +++++++++++++++++++++ 13 files changed, 665 insertions(+) diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/schema/ExpectedSchemaBuilder.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/schema/ExpectedSchemaBuilder.java index e442d64ae9..f4b6cb0c55 100644 --- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/schema/ExpectedSchemaBuilder.java +++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/schema/ExpectedSchemaBuilder.java @@ -56,6 +56,11 @@ public class ExpectedSchemaBuilder { public boolean setSchemaFromExpression(AbstractFunctionCallExpression expr, LogicalVariable producedVar, IVariableTypeEnvironment typeEnv) throws AlgebricksException { + return buildExpectedSchemaNodes(expr, typeEnv, producedVar); + } + + private boolean setSchemaFromCalculatedExpression(AbstractFunctionCallExpression expr, LogicalVariable producedVar, + IVariableTypeEnvironment typeEnv) throws AlgebricksException { //Parent always nested AbstractComplexExpectedSchemaNode parent = (AbstractComplexExpectedSchemaNode) buildNestedNode(expr, typeEnv); if (parent != null) { @@ -104,6 +109,70 @@ public class ExpectedSchemaBuilder { return varToNode.get(variable); } + private boolean buildExpectedSchemaNodes(ILogicalExpression expr, IVariableTypeEnvironment typeEnv, + LogicalVariable producedVar) throws AlgebricksException { + return buildNestedNodes(expr, typeEnv, producedVar); + } + + private boolean buildNestedNodes(ILogicalExpression expr, IVariableTypeEnvironment typeEnv, + LogicalVariable producedVar) throws AlgebricksException { + //The current node expression + boolean changed = false; + if (expr.getExpressionTag() != LogicalExpressionTag.FUNCTION_CALL) { + return false; + } + + AbstractFunctionCallExpression myExpr = (AbstractFunctionCallExpression) expr; + if (!SUPPORTED_FUNCTIONS.contains(myExpr.getFunctionIdentifier()) || noArgsOrFirstArgIsConstant(myExpr)) { + // Check if the function consists of the Supported Functions + for (Mutable<ILogicalExpression> arg : myExpr.getArguments()) { + changed |= buildNestedNodes(arg.getValue(), typeEnv, producedVar); + } + + return changed; + } + + // if the child is not a function expression, then just one node. + if (BuiltinFunctions.ARRAY_STAR.equals(myExpr.getFunctionIdentifier()) + || BuiltinFunctions.SCAN_COLLECTION.equals(myExpr.getFunctionIdentifier())) { + // these supported function won't have second child + IExpectedSchemaNode expectedSchemaNode = buildNestedNode(expr, typeEnv); + if (expectedSchemaNode != null) { + changed |= + setSchemaFromCalculatedExpression((AbstractFunctionCallExpression) expr, producedVar, typeEnv); + } + } else { + ILogicalExpression childExpr = myExpr.getArguments().get(1).getValue(); + if (childExpr.getExpressionTag() != LogicalExpressionTag.FUNCTION_CALL) { + // must be a variable or constant + IExpectedSchemaNode expectedSchemaNode = buildNestedNode(expr, typeEnv); + if (expectedSchemaNode != null) { + changed |= setSchemaFromCalculatedExpression((AbstractFunctionCallExpression) expr, producedVar, + typeEnv); + } + } else { + // as the childExpr is a function. + // if the function had been evaluated at compile time, it would have been + // evaluated at this stage of compilation. + // eg: field-access(t.r.p, substring("name",2,4)) + // this will be evaluated to field-access(t.r.p, "me") at compile time itself. + + // since the execution reached this branch, this means the childExpr + // need to be evaluated at runtime, hence the childExpr should also be checked + // for possible pushdown. + // eg: field-access(t.r.p, substring(x.y.age_field, 0, 4)) + ILogicalExpression parentExpr = myExpr.getArguments().get(0).getValue(); + IExpectedSchemaNode parentExpectedNode = buildNestedNode(parentExpr, typeEnv); + if (parentExpectedNode != null) { + changed |= setSchemaFromCalculatedExpression((AbstractFunctionCallExpression) parentExpr, + producedVar, typeEnv); + } + changed |= buildNestedNodes(childExpr, typeEnv, producedVar); + } + } + return changed; + } + private IExpectedSchemaNode buildNestedNode(ILogicalExpression expr, IVariableTypeEnvironment typeEnv) throws AlgebricksException { //The current node expression diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/pushdown/ASTERIXDB-3540/ASTERIXDB-3540.001.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/pushdown/ASTERIXDB-3540/ASTERIXDB-3540.001.ddl.sqlpp new file mode 100644 index 0000000000..8a95edc189 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/pushdown/ASTERIXDB-3540/ASTERIXDB-3540.001.ddl.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. + */ + +DROP DATAVERSE test IF EXISTS; +CREATE DATAVERSE test; + +USE test; + +CREATE TYPE ColumnType AS { + id: string +}; + + +CREATE DATASET ColumnDataset(ColumnType) +PRIMARY KEY id WITH { + "storage-format": {"format" : "column"} +}; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/pushdown/ASTERIXDB-3540/ASTERIXDB-3540.002.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/pushdown/ASTERIXDB-3540/ASTERIXDB-3540.002.update.sqlpp new file mode 100644 index 0000000000..9bf4aadbab --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/pushdown/ASTERIXDB-3540/ASTERIXDB-3540.002.update.sqlpp @@ -0,0 +1,37 @@ +/* + * 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; + UPSERT INTO ColumnDataset( + { + "id": "1", + "name": "Monica", + "x": { + "y": { + "age_field": "age" + } + }, + "t": { + "r": { + "p": { + "age": "26" + } + } + } + }); \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/pushdown/ASTERIXDB-3540/ASTERIXDB-3540.003.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/pushdown/ASTERIXDB-3540/ASTERIXDB-3540.003.query.sqlpp new file mode 100644 index 0000000000..93ab4cd09a --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/pushdown/ASTERIXDB-3540/ASTERIXDB-3540.003.query.sqlpp @@ -0,0 +1,23 @@ +/* + * 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; + +EXPLAIN SELECT t.r.g, `field-access-by-name`(t.r.p, x.y.age_field) +FROM ColumnDataset; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/pushdown/ASTERIXDB-3540/ASTERIXDB-3540.004.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/pushdown/ASTERIXDB-3540/ASTERIXDB-3540.004.query.sqlpp new file mode 100644 index 0000000000..75c01678b6 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/pushdown/ASTERIXDB-3540/ASTERIXDB-3540.004.query.sqlpp @@ -0,0 +1,23 @@ +/* + * 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; + +EXPLAIN SELECT t.r.g, `field-access-by-name`(t.r.p, substring(x.y.age_field, 0, 4)) +FROM ColumnDataset; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/pushdown/ASTERIXDB-3540/ASTERIXDB-3540.005.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/pushdown/ASTERIXDB-3540/ASTERIXDB-3540.005.query.sqlpp new file mode 100644 index 0000000000..4ce0ec5115 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/pushdown/ASTERIXDB-3540/ASTERIXDB-3540.005.query.sqlpp @@ -0,0 +1,23 @@ +/* + * 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 t.r.g, `field-access-by-name`(t.r.p, x.y.age_field) +FROM ColumnDataset; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/pushdown/ASTERIXDB-3540/ASTERIXDB-3540.006.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/pushdown/ASTERIXDB-3540/ASTERIXDB-3540.006.query.sqlpp new file mode 100644 index 0000000000..e0fbee0e1d --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/pushdown/ASTERIXDB-3540/ASTERIXDB-3540.006.query.sqlpp @@ -0,0 +1,23 @@ +/* + * 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 t.r.g, `field-access-by-name`(t.r.p, substring(x.y.age_field, 0, 4)) +FROM ColumnDataset; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/ASTERIXDB-3540/ASTERIXDB-3540.003.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/ASTERIXDB-3540/ASTERIXDB-3540.003.plan new file mode 100644 index 0000000000..40cfb0053c --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/ASTERIXDB-3540/ASTERIXDB-3540.003.plan @@ -0,0 +1,20 @@ +distribute result [$$25] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0] +-- DISTRIBUTE_RESULT |PARTITIONED| + exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0] + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + project ([$$25]) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0] + -- STREAM_PROJECT |PARTITIONED| + assign [$$25] <- [{"g": $$26.getField("g"), "$1": $$26.getField("p").getField("$$ColumnDataset.getField("x").getField("y").getField("age_field")")}] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0] + -- ASSIGN |PARTITIONED| + assign [$$26] <- [$$ColumnDataset.getField("t").getField("r")] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0] + -- ASSIGN |PARTITIONED| + project ([$$ColumnDataset]) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0] + -- STREAM_PROJECT |PARTITIONED| + exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0] + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + data-scan []<-[$$27, $$ColumnDataset] <- test.ColumnDataset project ({t:{r:{p:any,g:any}},x:{y:{age_field:any}}}) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0] + -- DATASOURCE_SCAN |PARTITIONED| + exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0] + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + empty-tuple-source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0] + -- EMPTY_TUPLE_SOURCE |PARTITIONED| \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/ASTERIXDB-3540/ASTERIXDB-3540.004.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/ASTERIXDB-3540/ASTERIXDB-3540.004.plan new file mode 100644 index 0000000000..7e0e44494e --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/ASTERIXDB-3540/ASTERIXDB-3540.004.plan @@ -0,0 +1,20 @@ +distribute result [$$26] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0] +-- DISTRIBUTE_RESULT |PARTITIONED| + exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0] + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + project ([$$26]) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0] + -- STREAM_PROJECT |PARTITIONED| + assign [$$26] <- [{"g": $$27.getField("g"), "$1": $$27.getField("p").getField("substring($$ColumnDataset.getField("x").getField("y").getField("age_field"), 0, 4)")}] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0] + -- ASSIGN |PARTITIONED| + assign [$$27] <- [$$ColumnDataset.getField("t").getField("r")] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0] + -- ASSIGN |PARTITIONED| + project ([$$ColumnDataset]) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0] + -- STREAM_PROJECT |PARTITIONED| + exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0] + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + data-scan []<-[$$28, $$ColumnDataset] <- test.ColumnDataset project ({t:{r:{p:any,g:any}},x:{y:{age_field:any}}}) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0] + -- DATASOURCE_SCAN |PARTITIONED| + exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0] + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + empty-tuple-source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0] + -- EMPTY_TUPLE_SOURCE |PARTITIONED| \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/ASTERIXDB-3540/ASTERIXDB-3540.005.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/ASTERIXDB-3540/ASTERIXDB-3540.005.adm new file mode 100644 index 0000000000..224633561b --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/ASTERIXDB-3540/ASTERIXDB-3540.005.adm @@ -0,0 +1 @@ +{ "$1": "26" } \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/ASTERIXDB-3540/ASTERIXDB-3540.006.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/ASTERIXDB-3540/ASTERIXDB-3540.006.adm new file mode 100644 index 0000000000..224633561b --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/ASTERIXDB-3540/ASTERIXDB-3540.006.adm @@ -0,0 +1 @@ +{ "$1": "26" } \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/sqlpp_queries.xml b/asterixdb/asterix-app/src/test/resources/runtimets/sqlpp_queries.xml index 5476877fc7..b5ea9efe7c 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/sqlpp_queries.xml +++ b/asterixdb/asterix-app/src/test/resources/runtimets/sqlpp_queries.xml @@ -16493,6 +16493,11 @@ <output-dir compare="Text">pushdown/array-access-pushdown</output-dir> </compilation-unit> </test-case> + <test-case FilePath="column"> + <compilation-unit name="pushdown/ASTERIXDB-3540"> + <output-dir compare="Text">pushdown/ASTERIXDB-3540</output-dir> + </compilation-unit> + </test-case> <test-case FilePath="column"> <compilation-unit name="pushdown/field-access-pushdown"> <output-dir compare="Text">pushdown/field-access-pushdown</output-dir> diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_single_partition_sqlpp.xml b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_single_partition_sqlpp.xml index 3dcfe8d467..dc35948db7 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_single_partition_sqlpp.xml +++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_single_partition_sqlpp.xml @@ -19,6 +19,91 @@ !--> <test-suite xmlns="urn:xml.testframework.asterix.apache.org" ResultOffsetPath="results" QueryOffsetPath="queries_sqlpp" QueryFileExtension=".sqlpp"> <test-group name="column"> + <test-case FilePath="column"> + <compilation-unit name="assembly/001"> + <output-dir compare="Text">assembly/001</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="assembly/002"> + <output-dir compare="Text">assembly/002</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="assembly/003"> + <output-dir compare="Text">assembly/003</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="assembly/004"> + <output-dir compare="Text">assembly/004</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="assembly/ASTERIXDB-3491"> + <output-dir compare="Text">assembly/ASTERIXDB-3491</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="assembly/ASTERIXDB-3504"> + <output-dir compare="Text">assembly/ASTERIXDB-3504</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="assembly/ASTERIXDB-3491-2"> + <output-dir compare="Text">assembly/ASTERIXDB-3491-2</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="assembly/ASTERIXDB-3491-3"> + <output-dir compare="Text">assembly/ASTERIXDB-3491-3</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="assembly/ASTERIXDB-3491-4"> + <output-dir compare="Text">assembly/ASTERIXDB-3491-4</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="assembly/ASTERIXDB-3491-5"> + <output-dir compare="Text">assembly/ASTERIXDB-3491-5</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="assembly/ASTERIXDB-3491-6"> + <output-dir compare="Text">assembly/ASTERIXDB-3491-6</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="assembly/ASTERIXDB-3491-7"> + <output-dir compare="Text">assembly/ASTERIXDB-3491-7</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="assembly/ASTERIXDB-3539"> + <output-dir compare="Text">assembly/ASTERIXDB-3539</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="filter/ASTERIXDB-3499"> + <output-dir compare="Text">filter/ASTERIXDB-3499</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="filter/ASTERIXDB-3502"> + <output-dir compare="Text">filter/ASTERIXDB-3502</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="delete/001"> + <output-dir compare="Text">delete/001</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="delete/002"> + <output-dir compare="Text">delete/002</output-dir> + </compilation-unit> + </test-case> <test-case FilePath="column"> <compilation-unit name="delete/003"> <output-dir compare="Text">delete/003</output-dir> @@ -34,5 +119,307 @@ <output-dir compare="Text">delete/005</output-dir> </compilation-unit> </test-case> + <test-case FilePath="column"> + <compilation-unit name="nested-pk"> + <output-dir compare="Text">nested-pk</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="composite-pks"> + <output-dir compare="Text">composite-pks</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="meta/meta_after_gby"> + <output-dir compare="Text">meta/meta_after_gby</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="meta/meta_in_with_clause"> + <output-dir compare="Text">meta/meta_in_with_clause</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="meta/resolving_pk_with_meta"> + <output-dir compare="Text">meta/resolving_pk_with_meta</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="missing-null-values/001"> + <output-dir compare="Text">missing-null-values/001</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="missing-null-values/002"> + <output-dir compare="Text">missing-null-values/002</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="missing-null-values/003"> + <output-dir compare="Text">missing-null-values/003</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="missing-null-values/003"> + <output-dir compare="Text">missing-null-values/003</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="missing-null-values/005"> + <output-dir compare="Text">missing-null-values/005</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="missing-null-values/006"> + <output-dir compare="Text">missing-null-values/006</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="missing-null-values/007"> + <output-dir compare="Text">missing-null-values/007</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="missing-null-values/008"> + <output-dir compare="Text">missing-null-values/008</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="empty-array/001"> + <output-dir compare="Text">empty-array/001</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="empty-array/002"> + <output-dir compare="Text">empty-array/002</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="empty-array/003"> + <output-dir compare="Text">empty-array/003</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="pushdown/array-access-pushdown"> + <output-dir compare="Text">pushdown/array-access-pushdown</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="pushdown/field-access-pushdown"> + <output-dir compare="Text">pushdown/field-access-pushdown</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="pushdown/ASTERIXDB-3540"> + <output-dir compare="Text">pushdown/ASTERIXDB-3540</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="pushdown/heterogeneous-access-pushdown"> + <output-dir compare="Text">pushdown/heterogeneous-access-pushdown</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="pushdown/join/condition-pushdown"> + <output-dir compare="Text">pushdown/join/condition-pushdown</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="pushdown/join/left-outer"> + <output-dir compare="Text">pushdown/join/left-outer</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="pushdown/other-pushdowns"> + <output-dir compare="Text">pushdown/other-pushdowns</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="pushdown/replicate"> + <output-dir compare="Text">pushdown/replicate</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="select-count-one-field"> + <output-dir compare="Text">select-count-one-field</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="upsert/001"> + <output-dir compare="Text">upsert/001</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="upsert/002"> + <output-dir compare="Text">upsert/002</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="upsert/003"> + <output-dir compare="Text">upsert/003</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column" check-warnings="true"> + <compilation-unit name="filter/001"> + <output-dir compare="Text">filter/001</output-dir> + <expected-warn>ASX0051: Incomparable input types: string and bigint (in line 30, at column 23)</expected-warn> + <expected-warn>ASX0051: Incomparable input types: bigint and string (in line 29, at column 38)</expected-warn> + <expected-warn>ASX0051: Incomparable input types: array and bigint (in line 28, at column 15)</expected-warn> + </compilation-unit> + </test-case> + <test-case FilePath="column" check-warnings="true"> + <compilation-unit name="filter/002"> + <output-dir compare="Text">filter/002</output-dir> + <expected-warn>ASX0051: Incomparable input types: string and bigint (in line 29, at column 23)</expected-warn> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="filter/003"> + <output-dir compare="Text">filter/003</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="filter/004"> + <output-dir compare="Text">filter/004</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="filter/005"> + <output-dir compare="Text">filter/005</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="filter/006"> + <output-dir compare="Text">filter/006</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="filter/007"> + <output-dir compare="Text">filter/007</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="filter/008"> + <output-dir compare="Text">filter/008</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column" check-warnings="true"> + <compilation-unit name="filter/boolean"> + <output-dir compare="Text">filter/boolean</output-dir> + <expected-warn>ASX0051: Incomparable input types: array and boolean (in line 27, at column 8)</expected-warn> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="filter/delete"> + <output-dir compare="Text">filter/delete</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="filter/not-in_every"> + <output-dir compare="Text">filter/not-in_every</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column" check-warnings="true"> + <compilation-unit name="filter/non-existing-fields"> + <output-dir compare="Text">filter/non-existing-fields</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="filter/sql-compat"> + <output-dir compare="Text">filter/sql-compat</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="filter/subplan"> + <output-dir compare="Text">filter/subplan</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="big-object"> + <output-dir compare="Text">big-object</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="secondary-index/array-index/use-case-1"> + <output-dir compare="Text">secondary-index/array-index/use-case-1</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="secondary-index/array-index/use-case-2"> + <output-dir compare="Text">secondary-index/array-index/use-case-2</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="secondary-index/array-index/use-case-3"> + <output-dir compare="Text">secondary-index/array-index/use-case-3</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="secondary-index/array-index/use-case-4"> + <output-dir compare="Text">secondary-index/array-index/use-case-4</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="secondary-index/array-index/with-additional-atomic-index"> + <output-dir compare="Text">secondary-index/array-index/with-additional-atomic-index</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="secondary-index/array-index/with-composite-sk"> + <output-dir compare="Text">secondary-index/array-index/with-composite-sk</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="secondary-index/index-with-meta"> + <output-dir compare="Text">secondary-index/index-with-meta</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="secondary-index/create-index/after-bulkload"> + <output-dir compare="Text">secondary-index/create-index/after-bulkload</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="secondary-index/create-index/after-insert"> + <output-dir compare="Text">secondary-index/create-index/after-insert</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="secondary-index/create-index/after-upsert-with-meta"> + <output-dir compare="Text">secondary-index/create-index/after-upsert-with-meta</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="secondary-index/outer-join"> + <output-dir compare="Text">secondary-index/outer-join</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="metadata"> + <output-dir compare="Text">metadata</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="supported-types"> + <output-dir compare="Text">supported-types</output-dir> + <expected-error>ASX0067: Type(s) '[datetime]' are not supported in columnar storage format. Supported types are [bigint, float, double, string, boolean, uuid]</expected-error> + <expected-error>ASX0067: Type(s) '[datetime, date, time, duration]' are not supported in columnar storage format. Supported types are [bigint, float, double, string, boolean, uuid]</expected-error> + <expected-error>ASX0067: Type(s) '[datetime]' are not supported in columnar storage format. Supported types are [bigint, float, double, string, boolean, uuid]</expected-error> + <expected-error>ASX0067: Type(s) '[datetime]' are not supported in columnar storage format. Supported types are [bigint, float, double, string, boolean, uuid]</expected-error> + <source-location>false</source-location> + </compilation-unit> + </test-case> + <test-case FilePath="column"> + <compilation-unit name="validation"> + <output-dir compare="Text">validation</output-dir> + <expected-error>ASX1191: Merge policy 'correlated-prefix' is not supported with columnar storage format</expected-error> + <expected-error>ASX1192: Filters are not supported with columnar storage format</expected-error> + <expected-error>ASX1193: Unknown storage format 'col'</expected-error> + <expected-error>ASX1194: Index type 'RTREE' is not supported with columnar storage format</expected-error> + <expected-error>ASX1194: Index type 'LENGTH_PARTITIONED_NGRAM_INVIX' is not supported with columnar storage format</expected-error> + <expected-error>ASX1194: Index type 'LENGTH_PARTITIONED_WORD_INVIX' is not supported with columnar storage format</expected-error> + <source-location>false</source-location> + </compilation-unit> + </test-case> </test-group> </test-suite>
