Yingyi Bu has submitted this change and it was merged. Change subject: ASTERIXDB-1576: fix and add negative regression tests. ......................................................................
ASTERIXDB-1576: fix and add negative regression tests. Change-Id: I8b4f66907f8ac8043fe245c9c5a331884db2b005 Reviewed-on: https://asterix-gerrit.ics.uci.edu/1079 Tested-by: Jenkins <[email protected]> Integration-Tests: Jenkins <[email protected]> Sonar-Qube: Jenkins <[email protected]> Reviewed-by: Yingyi Bu <[email protected]> --- A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/query-ASTERIXDB-1576-2/query-ASTERIXDB-1576-2.1.ddl.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/query-ASTERIXDB-1576-2/query-ASTERIXDB-1576-2.2.update.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/query-ASTERIXDB-1576-2/query-ASTERIXDB-1576-2.3.query.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/query-ASTERIXDB-1576-3/query-ASTERIXDB-1576-3.1.ddl.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/query-ASTERIXDB-1576-3/query-ASTERIXDB-1576-3.2.update.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/query-ASTERIXDB-1576-3/query-ASTERIXDB-1576-3.3.query.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/query-ASTERIXDB-1576/query-ASTERIXDB-1576.1.ddl.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/query-ASTERIXDB-1576/query-ASTERIXDB-1576.2.update.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/query-ASTERIXDB-1576/query-ASTERIXDB-1576.3.query.sqlpp M asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml M asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/context/Scope.java M asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/struct/VarIdentifier.java M asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/base/AbstractSqlppExpressionScopingVisitor.java 13 files changed, 314 insertions(+), 22 deletions(-) Approvals: Yingyi Bu: Looks good to me, approved Jenkins: Verified; No violations found; Verified diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/query-ASTERIXDB-1576-2/query-ASTERIXDB-1576-2.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/query-ASTERIXDB-1576-2/query-ASTERIXDB-1576-2.1.ddl.sqlpp new file mode 100644 index 0000000..47ceba2 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/query-ASTERIXDB-1576-2/query-ASTERIXDB-1576-2.1.ddl.sqlpp @@ -0,0 +1,31 @@ +/* + * 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; + +drop dataset samptable if exists; +drop type samptabletype if exists; + +create type samptabletype as closed { + id: int8 +}; + +create dataset samptable1(samptabletype) primary key id; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/query-ASTERIXDB-1576-2/query-ASTERIXDB-1576-2.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/query-ASTERIXDB-1576-2/query-ASTERIXDB-1576-2.2.update.sqlpp new file mode 100644 index 0000000..06ec978 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/query-ASTERIXDB-1576-2/query-ASTERIXDB-1576-2.2.update.sqlpp @@ -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. + */ + +use test; + +insert into samptable1 ({'id' : 0}); + +insert into samptable1 ({'id' : 1}); diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/query-ASTERIXDB-1576-2/query-ASTERIXDB-1576-2.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/query-ASTERIXDB-1576-2/query-ASTERIXDB-1576-2.3.query.sqlpp new file mode 100644 index 0000000..9f61a07 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/query-ASTERIXDB-1576-2/query-ASTERIXDB-1576-2.3.query.sqlpp @@ -0,0 +1,26 @@ +/* + * 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; + +// Negative test for duplicate alias names. +select * +from sample1 s1, + samptable1 s2 join samptable1 s2 on s2.id=s2.id +; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/query-ASTERIXDB-1576-3/query-ASTERIXDB-1576-3.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/query-ASTERIXDB-1576-3/query-ASTERIXDB-1576-3.1.ddl.sqlpp new file mode 100644 index 0000000..47ceba2 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/query-ASTERIXDB-1576-3/query-ASTERIXDB-1576-3.1.ddl.sqlpp @@ -0,0 +1,31 @@ +/* + * 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; + +drop dataset samptable if exists; +drop type samptabletype if exists; + +create type samptabletype as closed { + id: int8 +}; + +create dataset samptable1(samptabletype) primary key id; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/query-ASTERIXDB-1576-3/query-ASTERIXDB-1576-3.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/query-ASTERIXDB-1576-3/query-ASTERIXDB-1576-3.2.update.sqlpp new file mode 100644 index 0000000..06ec978 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/query-ASTERIXDB-1576-3/query-ASTERIXDB-1576-3.2.update.sqlpp @@ -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. + */ + +use test; + +insert into samptable1 ({'id' : 0}); + +insert into samptable1 ({'id' : 1}); diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/query-ASTERIXDB-1576-3/query-ASTERIXDB-1576-3.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/query-ASTERIXDB-1576-3/query-ASTERIXDB-1576-3.3.query.sqlpp new file mode 100644 index 0000000..2132251 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/query-ASTERIXDB-1576-3/query-ASTERIXDB-1576-3.3.query.sqlpp @@ -0,0 +1,26 @@ +/* + * 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; + +// Negative test for duplicate alias names. +with s1 as sample1, s1 as sample1 +select * +from s1, s1 +; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/query-ASTERIXDB-1576/query-ASTERIXDB-1576.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/query-ASTERIXDB-1576/query-ASTERIXDB-1576.1.ddl.sqlpp new file mode 100644 index 0000000..47ceba2 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/query-ASTERIXDB-1576/query-ASTERIXDB-1576.1.ddl.sqlpp @@ -0,0 +1,31 @@ +/* + * 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; + +drop dataset samptable if exists; +drop type samptabletype if exists; + +create type samptabletype as closed { + id: int8 +}; + +create dataset samptable1(samptabletype) primary key id; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/query-ASTERIXDB-1576/query-ASTERIXDB-1576.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/query-ASTERIXDB-1576/query-ASTERIXDB-1576.2.update.sqlpp new file mode 100644 index 0000000..06ec978 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/query-ASTERIXDB-1576/query-ASTERIXDB-1576.2.update.sqlpp @@ -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. + */ + +use test; + +insert into samptable1 ({'id' : 0}); + +insert into samptable1 ({'id' : 1}); diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/query-ASTERIXDB-1576/query-ASTERIXDB-1576.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/query-ASTERIXDB-1576/query-ASTERIXDB-1576.3.query.sqlpp new file mode 100644 index 0000000..8a7804f --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/query-ASTERIXDB-1576/query-ASTERIXDB-1576.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; + +// Negative test for duplicate alias names. +select * +from samptable1, samptable1, samptable1 +; \ 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 5100f52..912b592 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml +++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml @@ -67,6 +67,24 @@ <output-dir compare="Text">query-ASTERIXDB-883</output-dir> </compilation-unit> </test-case> + <test-case FilePath="flwor"> + <compilation-unit name="query-ASTERIXDB-1576"> + <output-dir compare="Text">query-ASTERIXDB-883</output-dir> + <expected-error>Duplicate alias definitions: samptable1</expected-error> + </compilation-unit> + </test-case> + <test-case FilePath="flwor"> + <compilation-unit name="query-ASTERIXDB-1576-2"> + <output-dir compare="Text">query-ASTERIXDB-883</output-dir> + <expected-error>Duplicate alias definitions: s2</expected-error> + </compilation-unit> + </test-case> + <test-case FilePath="flwor"> + <compilation-unit name="query-ASTERIXDB-1576-3"> + <output-dir compare="Text">query-ASTERIXDB-883</output-dir> + <expected-error>Duplicate alias definitions: s1</expected-error> + </compilation-unit> + </test-case> </test-group> <test-group name="explain"> <test-case FilePath="explain"> diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/context/Scope.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/context/Scope.java index 97cad5e..ad277d3 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/context/Scope.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/context/Scope.java @@ -225,6 +225,11 @@ return vars; } + // Returns local symbols within the current scope. + public Set<String> getLocalSymbols() { + return symbols.keySet(); + } + public Scope getParentScope(){ return parent; } diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/struct/VarIdentifier.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/struct/VarIdentifier.java index c2a6f38..ca165ac 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/struct/VarIdentifier.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/struct/VarIdentifier.java @@ -84,4 +84,9 @@ VarIdentifier vid = (VarIdentifier) obj; return ObjectUtils.equals(value, vid.value); } + + @Override + public String toString() { + return value; + } } diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/base/AbstractSqlppExpressionScopingVisitor.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/base/AbstractSqlppExpressionScopingVisitor.java index c13f00d..9c3e1fb 100644 --- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/base/AbstractSqlppExpressionScopingVisitor.java +++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/base/AbstractSqlppExpressionScopingVisitor.java @@ -22,8 +22,8 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Map.Entry; import java.util.Set; +import java.util.Map.Entry; import org.apache.asterix.common.config.MetadataConstants; import org.apache.asterix.common.exceptions.AsterixException; @@ -80,9 +80,13 @@ @Override public Expression visit(FromClause fromClause, ILangExpression arg) throws AsterixException { - scopeChecker.extendCurrentScope(); + Scope scopeForFromClause = scopeChecker.extendCurrentScope(); for (FromTerm fromTerm : fromClause.getFromTerms()) { fromTerm.accept(this, fromClause); + + // Merges the variables defined in the current from term into the scope of the current from clause. + Scope scopeForFromTerm = scopeChecker.removeCurrentScope(); + mergeScopes(scopeForFromClause, scopeForFromTerm); } return null; } @@ -95,12 +99,12 @@ // Registers the data item variable. VariableExpr leftVar = fromTerm.getLeftVariable(); - scopeChecker.getCurrentScope().addNewVarSymbolToScope(leftVar.getVar()); + addNewVarSymbolToScope(scopeChecker.getCurrentScope(), leftVar.getVar()); // Registers the positional variable if (fromTerm.hasPositionalVariable()) { VariableExpr posVar = fromTerm.getPositionalVariable(); - scopeChecker.getCurrentScope().addNewVarSymbolToScope(posVar.getVar()); + addNewVarSymbolToScope(scopeChecker.getCurrentScope(), posVar.getVar()); } // Visits join/unnest/nest clauses. for (AbstractBinaryCorrelateClause correlateClause : fromTerm.getCorrelateClauses()) { @@ -111,8 +115,7 @@ @Override public Expression visit(JoinClause joinClause, ILangExpression arg) throws AsterixException { - Scope backupScope = scopeChecker.removeCurrentScope(); - Scope parentScope = scopeChecker.getCurrentScope(); + Scope leftScope = scopeChecker.removeCurrentScope(); scopeChecker.createNewScope(); // NOTE: the two join branches cannot be correlated, instead of checking // the correlation here, @@ -121,19 +124,17 @@ // Registers the data item variable. VariableExpr rightVar = joinClause.getRightVariable(); - scopeChecker.getCurrentScope().addNewVarSymbolToScope(rightVar.getVar()); + addNewVarSymbolToScope(scopeChecker.getCurrentScope(), rightVar.getVar()); if (joinClause.hasPositionalVariable()) { // Registers the positional variable. VariableExpr posVar = joinClause.getPositionalVariable(); - scopeChecker.getCurrentScope().addNewVarSymbolToScope(posVar.getVar()); + addNewVarSymbolToScope(scopeChecker.getCurrentScope(), posVar.getVar()); } Scope rightScope = scopeChecker.removeCurrentScope(); - Scope mergedScope = new Scope(scopeChecker, parentScope); - mergedScope.merge(backupScope); - mergedScope.merge(rightScope); - scopeChecker.pushExistingScope(mergedScope); + mergeScopes(leftScope, rightScope); + scopeChecker.pushExistingScope(leftScope); // The condition expression can refer to the just registered variables // for the right branch. joinClause.setConditionExpression(visit(joinClause.getConditionExpression(), joinClause)); @@ -149,12 +150,12 @@ // Registers the data item variable. VariableExpr rightVar = nestClause.getRightVariable(); - scopeChecker.getCurrentScope().addNewVarSymbolToScope(rightVar.getVar()); + addNewVarSymbolToScope(scopeChecker.getCurrentScope(), rightVar.getVar()); if (nestClause.hasPositionalVariable()) { // Registers the positional variable. VariableExpr posVar = nestClause.getPositionalVariable(); - scopeChecker.getCurrentScope().addNewVarSymbolToScope(posVar.getVar()); + addNewVarSymbolToScope(scopeChecker.getCurrentScope(), posVar.getVar()); } // The condition expression can refer to the just registered variables @@ -169,12 +170,12 @@ // register the data item variable VariableExpr rightVar = unnestClause.getRightVariable(); - scopeChecker.getCurrentScope().addNewVarSymbolToScope(rightVar.getVar()); + addNewVarSymbolToScope(scopeChecker.getCurrentScope(), rightVar.getVar()); if (unnestClause.hasPositionalVariable()) { // register the positional variable VariableExpr posVar = unnestClause.getPositionalVariable(); - scopeChecker.getCurrentScope().addNewVarSymbolToScope(posVar.getVar()); + addNewVarSymbolToScope(scopeChecker.getCurrentScope(), posVar.getVar()); } return null; } @@ -227,7 +228,7 @@ gbyKeyVarExpr.setExpr(visit(gbyKeyVarExpr.getExpr(), gc)); VariableExpr gbyKeyVar = gbyKeyVarExpr.getVar(); if (gbyKeyVar != null) { - newScope.addNewVarSymbolToScope(gbyKeyVar.getVar()); + addNewVarSymbolToScope(newScope, gbyKeyVar.getVar()); } } if (gc.hasGroupFieldList()) { @@ -240,12 +241,12 @@ decorVarExpr.setExpr(visit(decorVarExpr.getExpr(), gc)); VariableExpr decorVar = decorVarExpr.getVar(); if (decorVar != null) { - newScope.addNewVarSymbolToScope(decorVar.getVar()); + addNewVarSymbolToScope(newScope, decorVar.getVar()); } } } if (gc.hasGroupVar()) { - scopeChecker.getCurrentScope().addNewVarSymbolToScope(gc.getGroupVar().getVar()); + addNewVarSymbolToScope(scopeChecker.getCurrentScope(), gc.getGroupVar().getVar()); } if (gc.hasWithMap()) { Map<Expression, VariableExpr> newWithMap = new HashMap<>(); @@ -253,7 +254,7 @@ Expression expr = visit(entry.getKey(), arg); Expression newKey = expr; VariableExpr value = entry.getValue(); - newScope.addNewVarSymbolToScope(value.getVar()); + addNewVarSymbolToScope(newScope, value.getVar()); newWithMap.put(newKey, value); } gc.setWithVarMap(newWithMap); @@ -278,7 +279,7 @@ public Expression visit(LetClause letClause, ILangExpression arg) throws AsterixException { scopeChecker.extendCurrentScope(); letClause.setBindingExpr(visit(letClause.getBindingExpr(), letClause)); - scopeChecker.getCurrentScope().addNewVarSymbolToScope(letClause.getVarExpr().getVar()); + addNewVarSymbolToScope(scopeChecker.getCurrentScope(), letClause.getVarExpr().getVar()); return null; } @@ -334,7 +335,7 @@ scopeChecker.createNewScope(); for (QuantifiedPair pair : qe.getQuantifiedList()) { pair.setExpr(visit(pair.getExpr(), qe)); - scopeChecker.getCurrentScope().addNewVarSymbolToScope(pair.getVarExpr().getVar()); + addNewVarSymbolToScope(scopeChecker.getCurrentScope(), pair.getVarExpr().getVar()); } qe.setSatisfiesExpr(visit(qe.getSatisfiesExpr(), qe)); scopeChecker.removeCurrentScope(); @@ -368,4 +369,25 @@ argList.addAll(liveVars); return new CallExpr(resolveFunction, argList); } + + // Adds a new encountered alias identifier into a scope + private void addNewVarSymbolToScope(Scope scope, VarIdentifier var) throws AsterixException { + if (scope.findLocalSymbol(var.getValue()) != null) { + throw new AsterixException("Duplicate alias definitions: " + + SqlppVariableUtil.toUserDefinedName(var.getValue())); + } + scope.addNewVarSymbolToScope(var); + } + + // Merges <code>scopeToBeMerged</code> into <code>hostScope</code>. + private void mergeScopes(Scope hostScope, Scope scopeToBeMerged) throws AsterixException { + Set<String> symbolsToBeMerged = scopeToBeMerged.getLocalSymbols(); + for (String symbolToBeMerged : symbolsToBeMerged) { + if (hostScope.findLocalSymbol(symbolToBeMerged) != null) { + throw new AsterixException("Duplicate alias definitions: " + + SqlppVariableUtil.toUserDefinedName(symbolToBeMerged)); + } + } + hostScope.merge(scopeToBeMerged); + } } -- To view, visit https://asterix-gerrit.ics.uci.edu/1079 To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings Gerrit-MessageType: merged Gerrit-Change-Id: I8b4f66907f8ac8043fe245c9c5a331884db2b005 Gerrit-PatchSet: 8 Gerrit-Project: asterixdb Gerrit-Branch: master Gerrit-Owner: Yingyi Bu <[email protected]> Gerrit-Reviewer: Jenkins <[email protected]> Gerrit-Reviewer: Till Westmann <[email protected]> Gerrit-Reviewer: Yingyi Bu <[email protected]>
