Dmitry Lychagin has uploaded a new change for review.

  https://asterix-gerrit.ics.uci.edu/2294

Change subject: [ASTERIXDB-2248][SQLPP] Disallow use of column aliases in 
GBY/HAVING
......................................................................

[ASTERIXDB-2248][SQLPP] Disallow use of column aliases in GBY/HAVING

- user model changes: yes
- storage format changes: no
- interface changes: no

Details:
- Column aliases defined by SELECT clause should not be referenceable
  from GROUP BY/HAVING clauses because aliases are not variables.
  References from ORDER BY clause are still allowed.

Change-Id: Ieb734f87904e6bf307a04b2328a2fd109151f70f
---
M 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q24a/q24a.3.query.sqlpp
M 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q24b/q24b.3.query.sqlpp
M asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
M 
asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/InlineColumnAliasVisitor.java
4 files changed, 12 insertions(+), 15 deletions(-)


  git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb 
refs/changes/94/2294/1

diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q24a/q24a.3.query.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q24a/q24a.3.query.sqlpp
index c24c10e..95e4e8c 100644
--- 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q24a/q24a.3.query.sqlpp
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q24a/q24a.3.query.sqlpp
@@ -59,12 +59,13 @@
 SELECT c_last_name
       ,c_first_name
       ,s_store_name
-      ,SUM(netpaid) paid
+      ,paid
 FROM ssales
 WHERE i_color = 'orchid'
 GROUP BY c_last_name
         ,c_first_name
         ,s_store_name
 GROUP AS g
+LET paid = SUM(netpaid)
 HAVING paid > (SELECT value 0.05*avg(g.ssales.netpaid) FROM g)[0]
 ;
\ No newline at end of file
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q24b/q24b.3.query.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q24b/q24b.3.query.sqlpp
index 86ffa7b..3a1590d 100644
--- 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q24b/q24b.3.query.sqlpp
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q24b/q24b.3.query.sqlpp
@@ -59,12 +59,13 @@
 SELECT c_last_name
       ,c_first_name
       ,s_store_name
-      ,SUM(netpaid) paid
+      ,paid
 FROM ssales
 WHERE i_color = 'chiffon'
 GROUP BY c_last_name
         ,c_first_name
         ,s_store_name
 GROUP AS g
+LET paid = SUM(netpaid)
 HAVING paid > (SELECT value 0.05*avg(g.ssales.netpaid) FROM g)[0]
 ;
\ 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 14784d6..9cf1d75 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
@@ -1563,6 +1563,7 @@
     <test-case FilePath="dapd">
       <compilation-unit name="q2-3">
         <output-dir compare="Text">q2</output-dir>
+        <expected-error>Cannot resolve ambiguous alias reference for undefined 
identifier sig_id</expected-error>
       </compilation-unit>
     </test-case>
     <test-case FilePath="dapd">
@@ -2901,11 +2902,13 @@
     <test-case FilePath="group-by">
       <compilation-unit name="sugar-02">
         <output-dir compare="Text">core-02</output-dir>
+        <expected-error>Cannot resolve ambiguous alias reference for undefined 
identifier deptId</expected-error>
       </compilation-unit>
     </test-case>
     <test-case FilePath="group-by">
       <compilation-unit name="sugar-02-2">
         <output-dir compare="Text">core-02</output-dir>
+        <expected-error>Cannot resolve ambiguous alias reference for undefined 
identifier deptId</expected-error>
       </compilation-unit>
     </test-case>
     <test-case FilePath="group-by">
diff --git 
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/InlineColumnAliasVisitor.java
 
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/InlineColumnAliasVisitor.java
index 628bf57..270b366 100644
--- 
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/InlineColumnAliasVisitor.java
+++ 
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/InlineColumnAliasVisitor.java
@@ -28,7 +28,6 @@
 import org.apache.asterix.lang.common.base.Expression.Kind;
 import org.apache.asterix.lang.common.base.ILangExpression;
 import org.apache.asterix.lang.common.base.Literal;
-import org.apache.asterix.lang.common.clause.LetClause;
 import org.apache.asterix.lang.common.expression.FieldBinding;
 import org.apache.asterix.lang.common.expression.LiteralExpr;
 import org.apache.asterix.lang.common.expression.RecordConstructor;
@@ -45,6 +44,11 @@
 import org.apache.asterix.lang.sqlpp.visitor.SqlppSubstituteExpressionVisitor;
 import 
org.apache.asterix.lang.sqlpp.visitor.base.AbstractSqlppExpressionScopingVisitor;
 
+/**
+ * Syntactic sugar rewriting: inlines column aliases defines in SELECT clause 
into ORDER BY and LIMIT clauses. <br/>
+ * Note: column aliases are not cosidered new variables, but they can be 
referenced from ORDER BY and LIMIT clauses
+ *       because of this rewriting (like in SQL)
+ */
 public class InlineColumnAliasVisitor extends 
AbstractSqlppExpressionScopingVisitor {
 
     public InlineColumnAliasVisitor(LangRewritingContext context) {
@@ -67,18 +71,6 @@
         // Creates a substitution visitor.
         SqlppSubstituteExpressionVisitor visitor = new 
SqlppSubstituteExpressionVisitor(context, map);
 
-        // Rewrites GROUP BY/LET/HAVING clauses.
-        if (selectBlock.hasGroupbyClause()) {
-            selectBlock.getGroupbyClause().accept(visitor, arg);
-        }
-        if (selectBlock.hasLetClausesAfterGroupby()) {
-            for (LetClause letClause : selectBlock.getLetListAfterGroupby()) {
-                letClause.accept(visitor, arg);
-            }
-        }
-        if (selectBlock.hasHavingClause()) {
-            selectBlock.getHavingClause().accept(visitor, arg);
-        }
         SelectExpression selectExpression = (SelectExpression) arg;
 
         // For SET operation queries, column aliases will not substitute ORDER 
BY nor LIMIT expressions.

-- 
To view, visit https://asterix-gerrit.ics.uci.edu/2294
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ieb734f87904e6bf307a04b2328a2fd109151f70f
Gerrit-PatchSet: 1
Gerrit-Project: asterixdb
Gerrit-Branch: master
Gerrit-Owner: Dmitry Lychagin <[email protected]>

Reply via email to