Repository: asterixdb
Updated Branches:
  refs/heads/master adaff3ce2 -> 309c69c57


http://git-wip-us.apache.org/repos/asf/asterixdb/blob/309c69c5/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpcds/query-ASTERIXDB-1581.plan
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpcds/query-ASTERIXDB-1581.plan
 
b/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpcds/query-ASTERIXDB-1581.plan
index 67965bf..38d0b5f 100644
--- 
a/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpcds/query-ASTERIXDB-1581.plan
+++ 
b/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpcds/query-ASTERIXDB-1581.plan
@@ -16,7 +16,7 @@
                 -- STREAM_PROJECT  |PARTITIONED|
                   -- ASSIGN  |PARTITIONED|
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      -- PRE_CLUSTERED_GROUP_BY[$$146]  |PARTITIONED|
+                      -- PRE_CLUSTERED_GROUP_BY[$$149]  |PARTITIONED|
                               {
                                 -- AGGREGATE  |LOCAL|
                                   -- AGGREGATE  |LOCAL|
@@ -28,9 +28,9 @@
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                           -- STREAM_PROJECT  |PARTITIONED|
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                              -- HYBRID_HASH_JOIN [$$146][$$147]  |PARTITIONED|
+                              -- HYBRID_HASH_JOIN [$$149][$$150]  |PARTITIONED|
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                  -- PRE_CLUSTERED_GROUP_BY[$$82]  
|PARTITIONED|
+                                  -- PRE_CLUSTERED_GROUP_BY[$$85]  
|PARTITIONED|
                                           {
                                             -- AGGREGATE  |LOCAL|
                                               -- AGGREGATE  |LOCAL|
@@ -40,12 +40,12 @@
                                                       -- NESTED_TUPLE_SOURCE  
|LOCAL|
                                           }
                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                      -- STABLE_SORT [$$82(ASC)]  |PARTITIONED|
+                                      -- STABLE_SORT [$$85(ASC)]  |PARTITIONED|
                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                           -- STREAM_PROJECT  |PARTITIONED|
                                             -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
-                                              -- HYBRID_HASH_JOIN 
[$$82][$$139]  |PARTITIONED|
-                                                -- HASH_PARTITION_EXCHANGE 
[$$82]  |PARTITIONED|
+                                              -- HYBRID_HASH_JOIN 
[$$85][$$142]  |PARTITIONED|
+                                                -- HASH_PARTITION_EXCHANGE 
[$$85]  |PARTITIONED|
                                                   -- STREAM_PROJECT  
|UNPARTITIONED|
                                                     -- ASSIGN  |UNPARTITIONED|
                                                       -- ONE_TO_ONE_EXCHANGE  
|UNPARTITIONED|
@@ -63,7 +63,7 @@
                                                                               
-- DATASOURCE_SCAN  |PARTITIONED|
                                                                                
 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                                
   -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                -- HASH_PARTITION_EXCHANGE 
[$$139]  |PARTITIONED|
+                                                -- HASH_PARTITION_EXCHANGE 
[$$142]  |PARTITIONED|
                                                   -- ASSIGN  |PARTITIONED|
                                                     -- STREAM_PROJECT  
|PARTITIONED|
                                                       -- STREAM_SELECT  
|PARTITIONED|
@@ -94,7 +94,7 @@
                                                                                
                         -- DATASOURCE_SCAN  |PARTITIONED|
                                                                                
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                                
                             -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                -- HASH_PARTITION_EXCHANGE [$$147]  
|PARTITIONED|
+                                -- HASH_PARTITION_EXCHANGE [$$150]  
|PARTITIONED|
                                   -- ASSIGN  |PARTITIONED|
                                     -- STREAM_PROJECT  |PARTITIONED|
                                       -- STREAM_SELECT  |PARTITIONED|
@@ -108,7 +108,7 @@
                                                       -- STREAM_SELECT  
|PARTITIONED|
                                                         -- ASSIGN  
|PARTITIONED|
                                                           -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                            -- 
PRE_CLUSTERED_GROUP_BY[$$148]  |PARTITIONED|
+                                                            -- 
PRE_CLUSTERED_GROUP_BY[$$151]  |PARTITIONED|
                                                                     {
                                                                       -- 
AGGREGATE  |LOCAL|
                                                                         -- 
AGGREGATE  |LOCAL|
@@ -117,12 +117,12 @@
                                                                               
-- NESTED_TUPLE_SOURCE  |LOCAL|
                                                                     }
                                                               -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                -- STABLE_SORT 
[$$148(ASC)]  |PARTITIONED|
+                                                                -- STABLE_SORT 
[$$151(ASC)]  |PARTITIONED|
                                                                   -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                     -- 
STREAM_PROJECT  |PARTITIONED|
                                                                       -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                        -- 
HYBRID_HASH_JOIN [$$148][$$149]  |PARTITIONED|
-                                                                          -- 
HASH_PARTITION_EXCHANGE [$$148]  |PARTITIONED|
+                                                                        -- 
HYBRID_HASH_JOIN [$$151][$$152]  |PARTITIONED|
+                                                                          -- 
HASH_PARTITION_EXCHANGE [$$151]  |PARTITIONED|
                                                                             -- 
STREAM_PROJECT  |UNPARTITIONED|
                                                                               
-- ASSIGN  |UNPARTITIONED|
                                                                                
 -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
@@ -140,7 +140,7 @@
                                                                                
                         -- DATASOURCE_SCAN  |PARTITIONED|
                                                                                
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                                
                             -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                                          -- 
HASH_PARTITION_EXCHANGE [$$149]  |PARTITIONED|
+                                                                          -- 
HASH_PARTITION_EXCHANGE [$$152]  |PARTITIONED|
                                                                             -- 
ASSIGN  |PARTITIONED|
                                                                               
-- STREAM_PROJECT  |PARTITIONED|
                                                                                
 -- STREAM_SELECT  |PARTITIONED|

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/309c69c5/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpch/q12_shipping.plan
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpch/q12_shipping.plan
 
b/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpch/q12_shipping.plan
index 2033230..b5e9913 100644
--- 
a/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpch/q12_shipping.plan
+++ 
b/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpch/q12_shipping.plan
@@ -3,13 +3,13 @@
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
         -- SORT_MERGE_EXCHANGE [$$l_shipmode(ASC) ]  |PARTITIONED|
-          -- SORT_GROUP_BY[$$121]  |PARTITIONED|
+          -- SORT_GROUP_BY[$$122]  |PARTITIONED|
                   {
                     -- AGGREGATE  |LOCAL|
                       -- NESTED_TUPLE_SOURCE  |LOCAL|
                   }
-            -- HASH_PARTITION_EXCHANGE [$$121]  |PARTITIONED|
-              -- SORT_GROUP_BY[$$103]  |PARTITIONED|
+            -- HASH_PARTITION_EXCHANGE [$$122]  |PARTITIONED|
+              -- SORT_GROUP_BY[$$104]  |PARTITIONED|
                       {
                         -- AGGREGATE  |LOCAL|
                           -- NESTED_TUPLE_SOURCE  |LOCAL|
@@ -17,12 +17,12 @@
                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                   -- STREAM_PROJECT  |PARTITIONED|
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      -- HYBRID_HASH_JOIN [$$103][$$110]  |PARTITIONED|
+                      -- HYBRID_HASH_JOIN [$$104][$$111]  |PARTITIONED|
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                           -- STREAM_PROJECT  |PARTITIONED|
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                              -- HYBRID_HASH_JOIN [$$112][$$107]  |PARTITIONED|
-                                -- HASH_PARTITION_EXCHANGE [$$112]  
|PARTITIONED|
+                              -- HYBRID_HASH_JOIN [$$113][$$108]  |PARTITIONED|
+                                -- HASH_PARTITION_EXCHANGE [$$113]  
|PARTITIONED|
                                   -- STREAM_PROJECT  |PARTITIONED|
                                     -- STREAM_SELECT  |PARTITIONED|
                                       -- ASSIGN  |PARTITIONED|

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/309c69c5/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpch/q12_shipping_broadcast.plan
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpch/q12_shipping_broadcast.plan
 
b/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpch/q12_shipping_broadcast.plan
index 61d53a7..339e9ce 100644
--- 
a/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpch/q12_shipping_broadcast.plan
+++ 
b/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpch/q12_shipping_broadcast.plan
@@ -3,13 +3,13 @@
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
         -- SORT_MERGE_EXCHANGE [$$l_shipmode(ASC) ]  |PARTITIONED|
-          -- SORT_GROUP_BY[$$121]  |PARTITIONED|
+          -- SORT_GROUP_BY[$$122]  |PARTITIONED|
                   {
                     -- AGGREGATE  |LOCAL|
                       -- NESTED_TUPLE_SOURCE  |LOCAL|
                   }
-            -- HASH_PARTITION_EXCHANGE [$$121]  |PARTITIONED|
-              -- SORT_GROUP_BY[$$103]  |PARTITIONED|
+            -- HASH_PARTITION_EXCHANGE [$$122]  |PARTITIONED|
+              -- SORT_GROUP_BY[$$104]  |PARTITIONED|
                       {
                         -- AGGREGATE  |LOCAL|
                           -- NESTED_TUPLE_SOURCE  |LOCAL|
@@ -17,11 +17,11 @@
                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                   -- STREAM_PROJECT  |PARTITIONED|
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      -- HYBRID_HASH_JOIN [$$103][$$110]  |PARTITIONED|
+                      -- HYBRID_HASH_JOIN [$$104][$$111]  |PARTITIONED|
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                           -- STREAM_PROJECT  |PARTITIONED|
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                              -- HYBRID_HASH_JOIN [$$111][$$107]  |PARTITIONED|
+                              -- HYBRID_HASH_JOIN [$$112][$$108]  |PARTITIONED|
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                   -- STREAM_PROJECT  |PARTITIONED|
                                     -- STREAM_SELECT  |PARTITIONED|

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/309c69c5/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/columnalias.ast
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/columnalias.ast
 
b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/columnalias.ast
index 1e0efba..b27701c 100644
--- 
a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/columnalias.ast
+++ 
b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/columnalias.ast
@@ -1,31 +1,6 @@
 Query:
 SELECT [
-FunctionCall asterix.sql-sum@1[
-  (
-    SELECT ELEMENT [
-    OperatorExpr [
-      FieldAccessor [
-        FieldAccessor [
-          Variable [ Name=#3 ]
-          Field=t
-        ]
-        Field=a
-      ]
-      *
-      FieldAccessor [
-        FieldAccessor [
-          Variable [ Name=#3 ]
-          Field=t
-        ]
-        Field=b
-      ]
-    ]
-    ]
-    FROM [      Variable [ Name=#1 ]
-      AS Variable [ Name=#3 ]
-    ]
-  )
-]
+Variable [ Name=#1 ]
 root
 ]
 FROM [  FunctionCall asterix.dataset@1[
@@ -40,19 +15,20 @@ Groupby
     Variable [ Name=$t ]
     Field=id
   ]
-  GROUP AS Variable [ Name=#1 ]
+  GROUP AS Variable [ Name=#2 ]
   (
     t:=Variable [ Name=$t ]
   )
 
-Orderby
+Let Variable [ Name=#1 ]
+  :=
   FunctionCall asterix.sql-sum@1[
     (
       SELECT ELEMENT [
       OperatorExpr [
         FieldAccessor [
           FieldAccessor [
-            Variable [ Name=#2 ]
+            Variable [ Name=#3 ]
             Field=t
           ]
           Field=a
@@ -60,17 +36,19 @@ Orderby
         *
         FieldAccessor [
           FieldAccessor [
-            Variable [ Name=#2 ]
+            Variable [ Name=#3 ]
             Field=t
           ]
           Field=b
         ]
       ]
       ]
-      FROM [        Variable [ Name=#1 ]
-        AS Variable [ Name=#2 ]
+      FROM [        Variable [ Name=#2 ]
+        AS Variable [ Name=#3 ]
       ]
     )
   ]
+Orderby
+  Variable [ Name=#1 ]
   ASC
 

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/309c69c5/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/columnalias3.ast
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/columnalias3.ast
 
b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/columnalias3.ast
index 7deb117..65cedd3 100644
--- 
a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/columnalias3.ast
+++ 
b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/columnalias3.ast
@@ -4,32 +4,7 @@ RecordConstructor [
   (
     LiteralExpr [STRING] [root]
     :
-    FunctionCall asterix.sql-sum@1[
-      (
-        SELECT ELEMENT [
-        OperatorExpr [
-          FieldAccessor [
-            FieldAccessor [
-              Variable [ Name=#3 ]
-              Field=t
-            ]
-            Field=a
-          ]
-          *
-          FieldAccessor [
-            FieldAccessor [
-              Variable [ Name=#3 ]
-              Field=t
-            ]
-            Field=b
-          ]
-        ]
-        ]
-        FROM [          Variable [ Name=#1 ]
-          AS Variable [ Name=#3 ]
-        ]
-      )
-    ]
+    Variable [ Name=#1 ]
   )
 ]
 ]
@@ -45,19 +20,20 @@ Groupby
     Variable [ Name=$t ]
     Field=id
   ]
-  GROUP AS Variable [ Name=#1 ]
+  GROUP AS Variable [ Name=#2 ]
   (
     t:=Variable [ Name=$t ]
   )
 
-Orderby
+Let Variable [ Name=#1 ]
+  :=
   FunctionCall asterix.sql-sum@1[
     (
       SELECT ELEMENT [
       OperatorExpr [
         FieldAccessor [
           FieldAccessor [
-            Variable [ Name=#2 ]
+            Variable [ Name=#3 ]
             Field=t
           ]
           Field=a
@@ -65,17 +41,19 @@ Orderby
         *
         FieldAccessor [
           FieldAccessor [
-            Variable [ Name=#2 ]
+            Variable [ Name=#3 ]
             Field=t
           ]
           Field=b
         ]
       ]
       ]
-      FROM [        Variable [ Name=#1 ]
-        AS Variable [ Name=#2 ]
+      FROM [        Variable [ Name=#2 ]
+        AS Variable [ Name=#3 ]
       ]
     )
   ]
+Orderby
+  Variable [ Name=#1 ]
   ASC
 

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/309c69c5/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/order-by-13/order-by-13.1.ddl.sqlpp
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/order-by-13/order-by-13.1.ddl.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/order-by-13/order-by-13.1.ddl.sqlpp
new file mode 100644
index 0000000..c4bcf0e
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/order-by-13/order-by-13.1.ddl.sqlpp
@@ -0,0 +1,29 @@
+/*
+ * 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 EmpType AS {
+  name : string
+};
+
+CREATE DATASET Employee(EmpType) PRIMARY KEY name;

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/309c69c5/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/order-by-13/order-by-13.2.update.sqlpp
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/order-by-13/order-by-13.2.update.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/order-by-13/order-by-13.2.update.sqlpp
new file mode 100644
index 0000000..8c4212d
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/order-by-13/order-by-13.2.update.sqlpp
@@ -0,0 +1,36 @@
+/*
+ * 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 Employee (
+[
+   { 'name': 'a', 'deptno': 1, 'salary': 2000 },
+   { 'name': 'b', 'deptno': 1, 'salary': 3000 },
+
+   { 'name': 'f', 'deptno': 2, 'salary': 4000 },
+   { 'name': 'g', 'deptno': 2, 'salary': 5000 },
+
+   { 'name': 'k', 'deptno': 3, 'salary': null },
+   { 'name': 'l', 'deptno': 3, 'salary': 6000 },
+   { 'name': 'm', 'deptno': 3                 },
+
+   { 'name': 'q', 'deptno': 4  }
+]
+);

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/309c69c5/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/order-by-13/order-by-13.3.query.sqlpp
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/order-by-13/order-by-13.3.query.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/order-by-13/order-by-13.3.query.sqlpp
new file mode 100644
index 0000000..879ded7
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/order-by-13/order-by-13.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;
+
+FROM Employee e
+SELECT to_string(deptno) AS deptno_str
+ORDER BY deptno_str, salary
+LIMIT 4;

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/309c69c5/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/group-by/sugar-06-distinct/sugar-06-distinct.9.query.sqlpp
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/group-by/sugar-06-distinct/sugar-06-distinct.9.query.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/group-by/sugar-06-distinct/sugar-06-distinct.9.query.sqlpp
new file mode 100644
index 0000000..340c590
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/group-by/sugar-06-distinct/sugar-06-distinct.9.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 gby;
+
+FROM Employee e
+GROUP BY deptno
+SELECT deptno, MAX(DISTINCT salary) salary_agg
+ORDER BY salary_agg DESC
+LIMIT 3;

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/309c69c5/asterixdb/asterix-app/src/test/resources/runtimets/results/explain/explain_field_access/explain_field_access.1.adm
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/results/explain/explain_field_access/explain_field_access.1.adm
 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/explain/explain_field_access/explain_field_access.1.adm
index cbbd46b..384e8f8 100644
--- 
a/asterixdb/asterix-app/src/test/resources/runtimets/results/explain/explain_field_access/explain_field_access.1.adm
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/explain/explain_field_access/explain_field_access.1.adm
@@ -1,44 +1,44 @@
-distribute result [$$38]
+distribute result [$$40]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
   exchange
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$38])
+    project ([$$40])
     -- STREAM_PROJECT  |PARTITIONED|
-      assign [$$38] <- [{"deptId": $#1, "star_cost": $$41}]
+      assign [$$40] <- [{"deptId": $#1, "star_cost": $$43}]
       -- ASSIGN  |PARTITIONED|
         exchange
         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-          group by ([$#1 := $$46]) decor ([]) {
-                    aggregate [$$41] <- [agg-sql-sum($$45)]
+          group by ([$#1 := $$48]) decor ([]) {
+                    aggregate [$$43] <- [agg-sql-sum($$47)]
                     -- AGGREGATE  |LOCAL|
                       nested tuple source
                       -- NESTED_TUPLE_SOURCE  |LOCAL|
                  }
-          -- SORT_GROUP_BY[$$46]  |PARTITIONED|
+          -- SORT_GROUP_BY[$$48]  |PARTITIONED|
             exchange
-            -- HASH_PARTITION_EXCHANGE [$$46]  |PARTITIONED|
-              group by ([$$46 := $$39]) decor ([]) {
-                        aggregate [$$45] <- [agg-local-sql-sum($$36)]
+            -- HASH_PARTITION_EXCHANGE [$$48]  |PARTITIONED|
+              group by ([$$48 := $$41]) decor ([]) {
+                        aggregate [$$47] <- [agg-local-sql-sum($$38)]
                         -- AGGREGATE  |LOCAL|
                           nested tuple source
                           -- NESTED_TUPLE_SOURCE  |LOCAL|
                      }
-              -- SORT_GROUP_BY[$$39]  |PARTITIONED|
+              -- SORT_GROUP_BY[$$41]  |PARTITIONED|
                 exchange
                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                  project ([$$36, $$39])
+                  project ([$$38, $$41])
                   -- STREAM_PROJECT  |PARTITIONED|
-                    assign [$$39] <- 
[substring($$43.getField("department_id"), 0)]
+                    assign [$$41] <- 
[substring($$45.getField("department_id"), 0)]
                     -- ASSIGN  |PARTITIONED|
-                      project ([$$36, $$43])
+                      project ([$$38, $$45])
                       -- STREAM_PROJECT  |PARTITIONED|
-                        assign [$$36, $$43] <- [$$e.getField("salary"), 
$$e.getField("dept")]
+                        assign [$$38, $$45] <- [$$e.getField("salary"), 
$$e.getField("dept")]
                         -- ASSIGN  |PARTITIONED|
                           project ([$$e])
                           -- STREAM_PROJECT  |PARTITIONED|
                             exchange
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                              data-scan []<-[$$40, $$e] <- gby.Employee
+                              data-scan []<-[$$42, $$e] <- gby.Employee
                               -- DATASOURCE_SCAN  |PARTITIONED|
                                 exchange
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/309c69c5/asterixdb/asterix-app/src/test/resources/runtimets/results/explain/explain_field_access_closed/explain_field_access_closed.1.adm
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/results/explain/explain_field_access_closed/explain_field_access_closed.1.adm
 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/explain/explain_field_access_closed/explain_field_access_closed.1.adm
index 7aec0e1..b82dda7 100644
--- 
a/asterixdb/asterix-app/src/test/resources/runtimets/results/explain/explain_field_access_closed/explain_field_access_closed.1.adm
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/explain/explain_field_access_closed/explain_field_access_closed.1.adm
@@ -1,40 +1,40 @@
-distribute result [$$37]
+distribute result [$$39]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
   exchange
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$37])
+    project ([$$39])
     -- STREAM_PROJECT  |PARTITIONED|
-      assign [$$37] <- [{"deptId": $#1, "star_cost": $$40}]
+      assign [$$39] <- [{"deptId": $#1, "star_cost": $$42}]
       -- ASSIGN  |PARTITIONED|
         exchange
         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-          group by ([$#1 := $$44]) decor ([]) {
-                    aggregate [$$40] <- [agg-sql-sum($$43)]
+          group by ([$#1 := $$46]) decor ([]) {
+                    aggregate [$$42] <- [agg-sql-sum($$45)]
                     -- AGGREGATE  |LOCAL|
                       nested tuple source
                       -- NESTED_TUPLE_SOURCE  |LOCAL|
                  }
-          -- SORT_GROUP_BY[$$44]  |PARTITIONED|
+          -- SORT_GROUP_BY[$$46]  |PARTITIONED|
             exchange
-            -- HASH_PARTITION_EXCHANGE [$$44]  |PARTITIONED|
-              group by ([$$44 := $$38]) decor ([]) {
-                        aggregate [$$43] <- [agg-local-sql-sum($$35)]
+            -- HASH_PARTITION_EXCHANGE [$$46]  |PARTITIONED|
+              group by ([$$46 := $$40]) decor ([]) {
+                        aggregate [$$45] <- [agg-local-sql-sum($$37)]
                         -- AGGREGATE  |LOCAL|
                           nested tuple source
                           -- NESTED_TUPLE_SOURCE  |LOCAL|
                      }
-              -- SORT_GROUP_BY[$$38]  |PARTITIONED|
+              -- SORT_GROUP_BY[$$40]  |PARTITIONED|
                 exchange
                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                  project ([$$35, $$38])
+                  project ([$$37, $$40])
                   -- STREAM_PROJECT  |PARTITIONED|
-                    assign [$$38, $$35] <- [substring($$e.getField(1), 0), 
$$e.getField(2)]
+                    assign [$$40, $$37] <- [substring($$e.getField(1), 0), 
$$e.getField(2)]
                     -- ASSIGN  |PARTITIONED|
                       project ([$$e])
                       -- STREAM_PROJECT  |PARTITIONED|
                         exchange
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                          data-scan []<-[$$39, $$e] <- gby.Employee
+                          data-scan []<-[$$41, $$e] <- gby.Employee
                           -- DATASOURCE_SCAN  |PARTITIONED|
                             exchange
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/309c69c5/asterixdb/asterix-app/src/test/resources/runtimets/results/flwor/order-by-13/order-by-13.3.adm
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/results/flwor/order-by-13/order-by-13.3.adm
 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/flwor/order-by-13/order-by-13.3.adm
new file mode 100644
index 0000000..f82c642
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/flwor/order-by-13/order-by-13.3.adm
@@ -0,0 +1,4 @@
+{ "deptno_str": "1" }
+{ "deptno_str": "1" }
+{ "deptno_str": "2" }
+{ "deptno_str": "2" }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/309c69c5/asterixdb/asterix-app/src/test/resources/runtimets/results/group-by/sugar-06-distinct/sugar-06-distinct.9.adm
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/results/group-by/sugar-06-distinct/sugar-06-distinct.9.adm
 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/group-by/sugar-06-distinct/sugar-06-distinct.9.adm
new file mode 100644
index 0000000..4f19bae
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/group-by/sugar-06-distinct/sugar-06-distinct.9.adm
@@ -0,0 +1,3 @@
+{ "deptno": 3, "salary_agg": 6000 }
+{ "deptno": 2, "salary_agg": 5000 }
+{ "deptno": 1, "salary_agg": 3000 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/309c69c5/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/flwor/at06/at06.3.ast
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/flwor/at06/at06.3.ast
 
b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/flwor/at06/at06.3.ast
index 4748a29..a11de35 100644
--- 
a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/flwor/at06/at06.3.ast
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/flwor/at06/at06.3.ast
@@ -5,10 +5,7 @@ RecordConstructor [
   (
     LiteralExpr [STRING] [partkey]
     :
-    FieldAccessor [
-      Variable [ Name=$gen0 ]
-      Field=partkey
-    ]
+    Variable [ Name=#1 ]
   )
   (
     LiteralExpr [STRING] [pid]
@@ -18,18 +15,12 @@ RecordConstructor [
   (
     LiteralExpr [STRING] [shipdate]
     :
-    FieldAccessor [
-      Variable [ Name=$j ]
-      Field=l_shipdate
-    ]
+    Variable [ Name=#2 ]
   )
   (
     LiteralExpr [STRING] [orderkey]
     :
-    FieldAccessor [
-      Variable [ Name=$j ]
-      Field=l_orderkey
-    ]
+    Variable [ Name=#3 ]
   )
 ]
 ]
@@ -105,26 +96,35 @@ FROM [  (
  AT
 Variable [ Name=$p ]
 ]
-Where
-  OperatorExpr [
-    Variable [ Name=$p ]
-    <
-    LiteralExpr [LONG] [4]
-  ]
-Orderby
+Let Variable [ Name=#1 ]
+  :=
   FieldAccessor [
     Variable [ Name=$gen0 ]
     Field=partkey
   ]
-  ASC
+Let Variable [ Name=#2 ]
+  :=
   FieldAccessor [
     Variable [ Name=$j ]
     Field=l_shipdate
   ]
-  ASC
+Let Variable [ Name=#3 ]
+  :=
   FieldAccessor [
     Variable [ Name=$j ]
     Field=l_orderkey
   ]
+Where
+  OperatorExpr [
+    Variable [ Name=$p ]
+    <
+    LiteralExpr [LONG] [4]
+  ]
+Orderby
+  Variable [ Name=#1 ]
+  ASC
+  Variable [ Name=#2 ]
+  ASC
+  Variable [ Name=#3 ]
   ASC
 

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/309c69c5/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.24.ast
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.24.ast
 
b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.24.ast
index cdd8a53..92376cd 100644
--- 
a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.24.ast
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.24.ast
@@ -1,23 +1,11 @@
 DataverseUse TinySocial
 Query:
 SELECT [
-FieldAccessor [
-  Variable [ Name=$user ]
-  Field=name
-]
+Variable [ Name=#1 ]
 uname
-FieldAccessor [
-  Variable [ Name=$user ]
-  Field=alias
-]
+Variable [ Name=#2 ]
 alias
-FunctionCall TinySocial.substring@2[
-  FieldAccessor [
-    Variable [ Name=$message ]
-    Field=message
-  ]
-  LiteralExpr [LONG] [29]
-]
+Variable [ Name=#3 ]
 msg
 ]
 FROM [  FunctionCall asterix.dataset@1[
@@ -30,6 +18,27 @@ FROM [  FunctionCall asterix.dataset@1[
   ]
   AS Variable [ Name=$user ]
 ]
+Let Variable [ Name=#1 ]
+  :=
+  FieldAccessor [
+    Variable [ Name=$user ]
+    Field=name
+  ]
+Let Variable [ Name=#2 ]
+  :=
+  FieldAccessor [
+    Variable [ Name=$user ]
+    Field=alias
+  ]
+Let Variable [ Name=#3 ]
+  :=
+  FunctionCall TinySocial.substring@2[
+    FieldAccessor [
+      Variable [ Name=$message ]
+      Field=message
+    ]
+    LiteralExpr [LONG] [29]
+  ]
 Where
   OperatorExpr [
     OperatorExpr [
@@ -63,22 +72,10 @@ Where
     ]
   ]
 Orderby
-  FieldAccessor [
-    Variable [ Name=$user ]
-    Field=name
-  ]
+  Variable [ Name=#1 ]
   ASC
-  FieldAccessor [
-    Variable [ Name=$user ]
-    Field=alias
-  ]
+  Variable [ Name=#2 ]
   ASC
-  FunctionCall TinySocial.substring@2[
-    FieldAccessor [
-      Variable [ Name=$message ]
-      Field=message
-    ]
-    LiteralExpr [LONG] [29]
-  ]
+  Variable [ Name=#3 ]
   ASC
 

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/309c69c5/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.24.ast
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.24.ast
 
b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.24.ast
index cdd8a53..92376cd 100644
--- 
a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.24.ast
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.24.ast
@@ -1,23 +1,11 @@
 DataverseUse TinySocial
 Query:
 SELECT [
-FieldAccessor [
-  Variable [ Name=$user ]
-  Field=name
-]
+Variable [ Name=#1 ]
 uname
-FieldAccessor [
-  Variable [ Name=$user ]
-  Field=alias
-]
+Variable [ Name=#2 ]
 alias
-FunctionCall TinySocial.substring@2[
-  FieldAccessor [
-    Variable [ Name=$message ]
-    Field=message
-  ]
-  LiteralExpr [LONG] [29]
-]
+Variable [ Name=#3 ]
 msg
 ]
 FROM [  FunctionCall asterix.dataset@1[
@@ -30,6 +18,27 @@ FROM [  FunctionCall asterix.dataset@1[
   ]
   AS Variable [ Name=$user ]
 ]
+Let Variable [ Name=#1 ]
+  :=
+  FieldAccessor [
+    Variable [ Name=$user ]
+    Field=name
+  ]
+Let Variable [ Name=#2 ]
+  :=
+  FieldAccessor [
+    Variable [ Name=$user ]
+    Field=alias
+  ]
+Let Variable [ Name=#3 ]
+  :=
+  FunctionCall TinySocial.substring@2[
+    FieldAccessor [
+      Variable [ Name=$message ]
+      Field=message
+    ]
+    LiteralExpr [LONG] [29]
+  ]
 Where
   OperatorExpr [
     OperatorExpr [
@@ -63,22 +72,10 @@ Where
     ]
   ]
 Orderby
-  FieldAccessor [
-    Variable [ Name=$user ]
-    Field=name
-  ]
+  Variable [ Name=#1 ]
   ASC
-  FieldAccessor [
-    Variable [ Name=$user ]
-    Field=alias
-  ]
+  Variable [ Name=#2 ]
   ASC
-  FunctionCall TinySocial.substring@2[
-    FieldAccessor [
-      Variable [ Name=$message ]
-      Field=message
-    ]
-    LiteralExpr [LONG] [29]
-  ]
+  Variable [ Name=#3 ]
   ASC
 

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/309c69c5/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
----------------------------------------------------------------------
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 faa621c..67bfb09 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
@@ -60,6 +60,11 @@
       </compilation-unit>
     </test-case>
     <test-case FilePath="flwor">
+      <compilation-unit name="order-by-13">
+        <output-dir compare="Text">order-by-13</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="flwor">
       <compilation-unit name="query-issue550">
         <output-dir compare="Text">query-issue550</output-dir>
       </compilation-unit>

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/309c69c5/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/context/Scope.java
----------------------------------------------------------------------
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 bf46c5d..fa47f5e 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
@@ -23,6 +23,7 @@ import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
 import java.util.Set;
+import java.util.function.Predicate;
 
 import org.apache.asterix.common.functions.FunctionSignature;
 import org.apache.asterix.lang.common.expression.VariableExpr;
@@ -187,12 +188,20 @@ public final class Scope {
     }
 
     public Set<VariableExpr> getLiveVariables(Scope stopAtExclusive) {
+        return getLiveVariables(stopAtExclusive, null);
+    }
+
+    public Set<VariableExpr> getLiveVariables(Scope stopAtExclusive, 
Predicate<? super VarIdentifier> excludeFilter) {
         LinkedHashSet<VariableExpr> vars = new LinkedHashSet<>();
         Iterator<Identifier> identifierIterator = liveSymbols(stopAtExclusive);
         while (identifierIterator.hasNext()) {
             Identifier identifier = identifierIterator.next();
             if (identifier instanceof VarIdentifier) {
-                vars.add(new VariableExpr((VarIdentifier) identifier));
+                VarIdentifier varId = (VarIdentifier) identifier;
+                if (excludeFilter != null && excludeFilter.test(varId)) {
+                    continue;
+                }
+                vars.add(new VariableExpr(varId));
             }
         }
         return vars;

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/309c69c5/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/rewrites/LangRewritingContext.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/rewrites/LangRewritingContext.java
 
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/rewrites/LangRewritingContext.java
index 4173563..b2fd3a0 100644
--- 
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/rewrites/LangRewritingContext.java
+++ 
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/rewrites/LangRewritingContext.java
@@ -19,6 +19,9 @@
 package org.apache.asterix.lang.common.rewrites;
 
 import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
 
 import org.apache.asterix.lang.common.struct.VarIdentifier;
 import org.apache.hyracks.algebricks.core.algebra.base.Counter;
@@ -26,7 +29,8 @@ import 
org.apache.hyracks.algebricks.core.algebra.base.Counter;
 public final class LangRewritingContext {
     private Counter varCounter;
     private int systemVarCounter = 1;
-    private HashMap<Integer, VarIdentifier> oldVarIdToNewVarId = new 
HashMap<>();
+    private Map<Integer, VarIdentifier> oldVarIdToNewVarId = new HashMap<>();
+    private Set<VarIdentifier> excludedForFieldAccessVars = new HashSet<>();
 
     public LangRewritingContext(int varCounter) {
         this.varCounter = new Counter(varCounter);
@@ -68,4 +72,11 @@ public final class LangRewritingContext {
         return varCounter.get();
     }
 
+    public void addExcludedForFieldAccessVar(VarIdentifier varId) {
+        excludedForFieldAccessVars.add(varId);
+    }
+
+    public boolean isExcludedForFieldAccessVar(VarIdentifier varId) {
+        return excludedForFieldAccessVars.contains(varId);
+    }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/309c69c5/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/clause/SelectBlock.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/clause/SelectBlock.java
 
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/clause/SelectBlock.java
index f072fe4..83b03ba 100644
--- 
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/clause/SelectBlock.java
+++ 
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/clause/SelectBlock.java
@@ -96,7 +96,7 @@ public class SelectBlock extends AbstractClause {
     }
 
     public boolean hasLetClauses() {
-        return letClauses != null && !letClauses.isEmpty();
+        return !letClauses.isEmpty();
     }
 
     public boolean hasWhereClause() {
@@ -108,7 +108,7 @@ public class SelectBlock extends AbstractClause {
     }
 
     public boolean hasLetClausesAfterGroupby() {
-        return letClausesAfterGby != null && !letClausesAfterGby.isEmpty();
+        return !letClausesAfterGby.isEmpty();
     }
 
     public List<LetClause> getLetListAfterGroupby() {

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/309c69c5/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/SqlppFunctionBodyRewriter.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/SqlppFunctionBodyRewriter.java
 
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/SqlppFunctionBodyRewriter.java
index 0c0ebd6..fa4018a 100644
--- 
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/SqlppFunctionBodyRewriter.java
+++ 
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/SqlppFunctionBodyRewriter.java
@@ -37,9 +37,6 @@ class SqlppFunctionBodyRewriter extends SqlppQueryRewriter {
         // Sets up parameters.
         setup(declaredFunctions, topStatement, metadataProvider, context, 
externalVars);
 
-        // Inlines column aliases.
-        inlineColumnAlias();
-
         // Generates column names.
         generateColumnNames();
 
@@ -52,6 +49,9 @@ class SqlppFunctionBodyRewriter extends SqlppQueryRewriter {
         // Rewrites set operations.
         rewriteSetOperations();
 
+        // Inlines column aliases.
+        inlineColumnAlias();
+
         // Generate ids for variables (considering scopes) and replace global 
variable access with the dataset function.
         variableCheckAndRewrite();
 

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/309c69c5/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/SqlppQueryRewriter.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/SqlppQueryRewriter.java
 
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/SqlppQueryRewriter.java
index 41ff3e0..ec8b011 100644
--- 
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/SqlppQueryRewriter.java
+++ 
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/SqlppQueryRewriter.java
@@ -100,9 +100,6 @@ public class SqlppQueryRewriter implements IQueryRewriter {
         // Sets up parameters.
         setup(declaredFunctions, topStatement, metadataProvider, context, 
externalVars);
 
-        // Inlines column aliases.
-        inlineColumnAlias();
-
         // Generates column names.
         generateColumnNames();
 
@@ -115,6 +112,9 @@ public class SqlppQueryRewriter implements IQueryRewriter {
         // Rewrites set operations.
         rewriteSetOperations();
 
+        // Inlines column aliases.
+        inlineColumnAlias();
+
         // Generate ids for variables (considering scopes) and replace global 
variable access with the dataset function.
         variableCheckAndRewrite();
 

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/309c69c5/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/InlineColumnAliasVisitor.java
----------------------------------------------------------------------
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 96f0542..a270530 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
@@ -18,16 +18,22 @@
  */
 package org.apache.asterix.lang.sqlpp.rewrites.visitor;
 
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.common.exceptions.ErrorCode;
 import org.apache.asterix.lang.common.base.Expression;
 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;
@@ -43,11 +49,19 @@ import 
org.apache.asterix.lang.sqlpp.expression.SelectExpression;
 import org.apache.asterix.lang.sqlpp.util.SqlppVariableUtil;
 import org.apache.asterix.lang.sqlpp.visitor.SqlppSubstituteExpressionVisitor;
 import 
org.apache.asterix.lang.sqlpp.visitor.base.AbstractSqlppExpressionScopingVisitor;
+import org.apache.hyracks.api.exceptions.SourceLocation;
 
 /**
- * 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)
+ * Syntactic sugar rewriting: inlines column aliases definitions in SELECT 
clause into ORDER BY and LIMIT clauses.
+ * <br/>
+ * Notes
+ * <ul>
+ * <li> column aliases are not considered new variables, but they can be 
referenced from ORDER BY and LIMIT clauses
+ *      because of this rewriting (like in SQL) </li>
+ * <li> if a column alias expression is not a variable or a literal then we 
introduce a new let clause and replace
+ *      that column expression with the let variable reference. The optimizer 
will then decide whether to inline that
+ *      expression or not </li>
+ * </ul>
  */
 public class InlineColumnAliasVisitor extends 
AbstractSqlppExpressionScopingVisitor {
 
@@ -58,44 +72,52 @@ public class InlineColumnAliasVisitor extends 
AbstractSqlppExpressionScopingVisi
     @Override
     public Expression visit(SelectBlock selectBlock, ILangExpression arg) 
throws CompilationException {
         // Gets the map from select clause.
-        Map<Expression, Expression> map = 
getMap(selectBlock.getSelectClause());
+        Map<Expression, ColumnAliasBinding> map = 
getMap(selectBlock.getSelectClause());
 
         // Removes all FROM/LET binding variables
-        if (selectBlock.hasFromClause()) {
-            
map.keySet().removeAll(SqlppVariableUtil.getBindingVariables(selectBlock.getFromClause()));
-        }
-        if (selectBlock.hasLetClauses()) {
-            
map.keySet().removeAll(SqlppVariableUtil.getBindingVariables(selectBlock.getLetList()));
+        if (selectBlock.hasGroupbyClause()) {
+            
map.keySet().removeAll(SqlppVariableUtil.getBindingVariables(selectBlock.getGroupbyClause()));
+            if (selectBlock.hasLetClausesAfterGroupby()) {
+                
map.keySet().removeAll(SqlppVariableUtil.getBindingVariables(selectBlock.getLetListAfterGroupby()));
+            }
+        } else {
+            if (selectBlock.hasFromClause()) {
+                
map.keySet().removeAll(SqlppVariableUtil.getBindingVariables(selectBlock.getFromClause()));
+            }
+            if (selectBlock.hasLetClauses()) {
+                
map.keySet().removeAll(SqlppVariableUtil.getBindingVariables(selectBlock.getLetList()));
+            }
         }
 
-        // Creates a substitution visitor.
-        SqlppSubstituteExpressionVisitor visitor = new 
SubstituteColumnAliasVisitor(context, map);
-
         SelectExpression selectExpression = (SelectExpression) arg;
-
         // For SET operation queries, column aliases will not substitute ORDER 
BY nor LIMIT expressions.
         if (!selectExpression.getSelectSetOperation().hasRightInputs()) {
+            // Creates a substitution visitor.
+            SubstituteColumnAliasVisitor visitor = new 
SubstituteColumnAliasVisitor(context, toExpressionMap(map));
             if (selectExpression.hasOrderby()) {
                 selectExpression.getOrderbyClause().accept(visitor, arg);
             }
             if (selectExpression.hasLimit()) {
                 selectExpression.getLimitClause().accept(visitor, arg);
             }
+            if (!visitor.letVarMap.isEmpty()) {
+                introduceLetClauses(visitor.letVarMap, map, selectBlock);
+            }
         }
         return super.visit(selectBlock, arg);
     }
 
-    private Map<Expression, Expression> getMap(SelectClause selectClause) 
throws CompilationException {
+    private Map<Expression, ColumnAliasBinding> getMap(SelectClause 
selectClause) {
         if (selectClause.selectElement()) {
             return getMap(selectClause.getSelectElement());
         }
         if (selectClause.selectRegular()) {
             return getMap(selectClause.getSelectRegular());
         }
-        return null;
+        return Collections.emptyMap();
     }
 
-    private Map<Expression, Expression> getMap(SelectElement selectElement) {
+    private Map<Expression, ColumnAliasBinding> getMap(SelectElement 
selectElement) {
         Expression expr = selectElement.getExpression();
         if (expr.getKind() == Kind.RECORD_CONSTRUCTOR_EXPRESSION) {
             // Rewrite top-level field names (aliases), in order to be 
consistent with SelectRegular.
@@ -104,12 +126,12 @@ public class InlineColumnAliasVisitor extends 
AbstractSqlppExpressionScopingVisi
         return Collections.emptyMap();
     }
 
-    private Map<Expression, Expression> getMap(SelectRegular selectRegular) {
+    private Map<Expression, ColumnAliasBinding> getMap(SelectRegular 
selectRegular) {
         return mapProjections(selectRegular.getProjections());
     }
 
-    private Map<Expression, Expression> mapRecordConstructor(RecordConstructor 
rc) {
-        Map<Expression, Expression> exprMap = new HashMap<>();
+    private Map<Expression, ColumnAliasBinding> 
mapRecordConstructor(RecordConstructor rc) {
+        Map<Expression, ColumnAliasBinding> exprMap = new HashMap<>();
         for (FieldBinding binding : rc.getFbList()) {
             Expression leftExpr = binding.getLeftExpr();
             // We only need to deal with the case that the left expression 
(for a field name) is
@@ -121,30 +143,105 @@ public class InlineColumnAliasVisitor extends 
AbstractSqlppExpressionScopingVisi
             LiteralExpr literalExpr = (LiteralExpr) leftExpr;
             if (literalExpr.getValue().getLiteralType() == 
Literal.Type.STRING) {
                 String fieldName = 
SqlppVariableUtil.toInternalVariableName(literalExpr.getValue().getStringValue());
-                exprMap.put(new VariableExpr(new VarIdentifier(fieldName)), 
binding.getRightExpr());
+                exprMap.put(new VariableExpr(new VarIdentifier(fieldName)), 
ColumnAliasBinding.of(binding));
             }
         }
         return exprMap;
     }
 
-    private Map<Expression, Expression> mapProjections(List<Projection> 
projections) {
-        Map<Expression, Expression> exprMap = new HashMap<>();
+    private Map<Expression, ColumnAliasBinding> 
mapProjections(List<Projection> projections) {
+        Map<Expression, ColumnAliasBinding> exprMap = new HashMap<>();
         for (Projection projection : projections) {
             if (!projection.star() && !projection.varStar()) {
-                exprMap.put(
-                        new VariableExpr(
-                                new 
VarIdentifier(SqlppVariableUtil.toInternalVariableName(projection.getName()))),
-                        projection.getExpression());
+                String varName = 
SqlppVariableUtil.toInternalVariableName(projection.getName());
+                exprMap.put(new VariableExpr(new VarIdentifier(varName)), 
ColumnAliasBinding.of(projection));
             }
         }
         return exprMap;
     }
 
+    private void introduceLetClauses(Map<Expression, VarIdentifier> letVarMap,
+            Map<Expression, ColumnAliasBinding> aliasBindingMap, SelectBlock 
selectBlock) throws CompilationException {
+
+        List<LetClause> targetLetClauses =
+                selectBlock.hasGroupbyClause() ? 
selectBlock.getLetListAfterGroupby() : selectBlock.getLetList();
+
+        for (Map.Entry<Expression, VarIdentifier> me : letVarMap.entrySet()) {
+            Expression columnAliasVarExpr = me.getKey();
+            SourceLocation sourceLoc = columnAliasVarExpr.getSourceLocation();
+            ColumnAliasBinding columnAliasBinding = 
aliasBindingMap.get(columnAliasVarExpr);
+            if (columnAliasBinding == null) {
+                throw new 
CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE, sourceLoc);
+            }
+            VarIdentifier letVarId = me.getValue();
+
+            // add a let clause defining the new variable
+            VariableExpr letVarDefExpr = new VariableExpr(letVarId);
+            letVarDefExpr.setSourceLocation(sourceLoc);
+            LetClause newLetClause = new LetClause(letVarDefExpr, 
columnAliasBinding.getExpression());
+            newLetClause.setSourceLocation(sourceLoc);
+            targetLetClauses.add(newLetClause);
+
+            // replace original column alias expression with variable reference
+            VariableExpr letVarRefExpr = new VariableExpr(letVarId);
+            letVarRefExpr.setSourceLocation(sourceLoc);
+            columnAliasBinding.setExpression(letVarRefExpr);
+
+            context.addExcludedForFieldAccessVar(letVarId);
+        }
+    }
+
+    private static Map<Expression, Expression> toExpressionMap(Map<Expression, 
ColumnAliasBinding> bindingMap) {
+        Map<Expression, Expression> exprMap = new HashMap<>();
+        for (Map.Entry<Expression, ColumnAliasBinding> me : 
bindingMap.entrySet()) {
+            exprMap.put(me.getKey(), me.getValue().getExpression());
+        }
+        return exprMap;
+    }
+
+    private abstract static class ColumnAliasBinding {
+
+        abstract Expression getExpression();
+
+        abstract void setExpression(Expression expr);
+
+        static ColumnAliasBinding of(FieldBinding fieldBinding) {
+            return new ColumnAliasBinding() {
+                @Override
+                Expression getExpression() {
+                    return fieldBinding.getRightExpr();
+                }
+
+                @Override
+                void setExpression(Expression expr) {
+                    fieldBinding.setRightExpr(expr);
+                }
+            };
+        }
+
+        static ColumnAliasBinding of(Projection projection) {
+            return new ColumnAliasBinding() {
+                @Override
+                Expression getExpression() {
+                    return projection.getExpression();
+                }
+
+                @Override
+                void setExpression(Expression expr) {
+                    projection.setExpression(expr);
+                }
+            };
+        }
+    }
+
     /**
      * Dataset access functions have not yet been introduced at this point, so 
we need to perform substitution
      * on postVisit() to avoid infinite recursion in case of SELECT (SELECT 
... FROM dataset_name) AS dataset_name.
      */
-    private class SubstituteColumnAliasVisitor extends 
SqlppSubstituteExpressionVisitor {
+    private static class SubstituteColumnAliasVisitor extends 
SqlppSubstituteExpressionVisitor {
+
+        private final Map<Expression, VarIdentifier> letVarMap = new 
LinkedHashMap<>();
+
         private SubstituteColumnAliasVisitor(LangRewritingContext context, 
Map<Expression, Expression> exprMap) {
             super(context, exprMap);
         }
@@ -158,5 +255,30 @@ public class InlineColumnAliasVisitor extends 
AbstractSqlppExpressionScopingVisi
         protected Expression postVisit(Expression expr) throws 
CompilationException {
             return substitute(expr);
         }
+
+        @Override
+        protected Expression getMappedExpr(Expression expr) throws 
CompilationException {
+            Expression mappedExpr = super.getMappedExpr(expr);
+            if (mappedExpr == null) {
+                return null;
+            }
+            switch (mappedExpr.getKind()) {
+                case LITERAL_EXPRESSION:
+                case VARIABLE_EXPRESSION:
+                    return mappedExpr;
+                default:
+                    // all other kinds of expressions must be moved out of 
column alias definitions into separate
+                    // let clauses, so we need to return a variable reference 
expression here and
+                    // create a new let variable if we're replacing given 
expression for the first time
+                    VarIdentifier var = letVarMap.get(expr);
+                    if (var == null) {
+                        var = context.newVariable();
+                        letVarMap.put(expr, var);
+                    }
+                    VariableExpr varExpr = new VariableExpr(var);
+                    varExpr.setSourceLocation(expr.getSourceLocation());
+                    return varExpr;
+            }
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/309c69c5/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SubstituteGroupbyExpressionWithVariableVisitor.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SubstituteGroupbyExpressionWithVariableVisitor.java
 
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SubstituteGroupbyExpressionWithVariableVisitor.java
index f157f4f..9e937d0 100644
--- 
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SubstituteGroupbyExpressionWithVariableVisitor.java
+++ 
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SubstituteGroupbyExpressionWithVariableVisitor.java
@@ -37,8 +37,13 @@ import org.apache.asterix.lang.sqlpp.util.FunctionMapUtil;
 import org.apache.asterix.lang.sqlpp.visitor.SqlppSubstituteExpressionVisitor;
 import 
org.apache.asterix.lang.sqlpp.visitor.base.AbstractSqlppExpressionScopingVisitor;
 
-// Replaces expressions that appear in having/select/order-by/limit clause and 
are identical to some
-// group by key expression with the group by key expression.
+/**
+ * <ul>
+ * <li> Generates group by key variables if they were not specified in the 
query </li>
+ * <li> Replaces expressions that appear in having/select/order-by/limit 
clause and are identical to some
+ *      group by key expression with the group by key variable </li>
+ * </ul>
+ */
 public class SubstituteGroupbyExpressionWithVariableVisitor extends 
AbstractSqlppExpressionScopingVisitor {
 
     public SubstituteGroupbyExpressionWithVariableVisitor(LangRewritingContext 
context) {
@@ -62,7 +67,7 @@ public class SubstituteGroupbyExpressionWithVariableVisitor 
extends AbstractSqlp
             // Rewrites LET/HAVING/SELECT clauses.
             if (selectBlock.hasLetClausesAfterGroupby()) {
                 for (LetClause letClause : 
selectBlock.getLetListAfterGroupby()) {
-                    letClause.accept(this, arg);
+                    letClause.accept(visitor, arg);
                 }
             }
             if (selectBlock.hasHavingClause()) {
@@ -84,21 +89,20 @@ public class SubstituteGroupbyExpressionWithVariableVisitor 
extends AbstractSqlp
         return super.visit(selectBlock, arg);
     }
 
-}
-
-class SubstituteGroupbyExpressionVisitor extends 
SqlppSubstituteExpressionVisitor {
+    private static class SubstituteGroupbyExpressionVisitor extends 
SqlppSubstituteExpressionVisitor {
 
-    public SubstituteGroupbyExpressionVisitor(LangRewritingContext context, 
Map<Expression, Expression> exprMap) {
-        super(context, exprMap);
-    }
+        private SubstituteGroupbyExpressionVisitor(LangRewritingContext 
context, Map<Expression, Expression> exprMap) {
+            super(context, exprMap);
+        }
 
-    @Override
-    public Expression visit(CallExpr callExpr, ILangExpression arg) throws 
CompilationException {
-        FunctionSignature signature = callExpr.getFunctionSignature();
-        if (FunctionMapUtil.isSql92AggregateFunction(signature)) {
-            return callExpr;
-        } else {
-            return super.visit(callExpr, arg);
+        @Override
+        public Expression visit(CallExpr callExpr, ILangExpression arg) throws 
CompilationException {
+            FunctionSignature signature = callExpr.getFunctionSignature();
+            if (FunctionMapUtil.isSql92AggregateFunction(signature)) {
+                return callExpr;
+            } else {
+                return super.visit(callExpr, arg);
+            }
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/309c69c5/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/VariableCheckAndRewriteVisitor.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/VariableCheckAndRewriteVisitor.java
 
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/VariableCheckAndRewriteVisitor.java
index b5fd996..8bac4ad 100644
--- 
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/VariableCheckAndRewriteVisitor.java
+++ 
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/VariableCheckAndRewriteVisitor.java
@@ -118,7 +118,8 @@ public class VariableCheckAndRewriteVisitor extends 
AbstractSqlppExpressionScopi
             return resolveAsDataset(dataverseName, datasetName, sourceLoc);
         }
 
-        Set<VariableExpr> localVars = 
scopeChecker.getCurrentScope().getLiveVariables(scopeChecker.getPrecedingScope());
+        Set<VariableExpr> localVars = 
scopeChecker.getCurrentScope().getLiveVariables(scopeChecker.getPrecedingScope(),
+                context::isExcludedForFieldAccessVar);
         switch (localVars.size()) {
             case 0:
                 return resolveAsDataset(dataverseName, datasetName, sourceLoc);

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/309c69c5/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppSubstituteExpressionVisitor.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppSubstituteExpressionVisitor.java
 
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppSubstituteExpressionVisitor.java
index 6db1376..636f8a6 100644
--- 
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppSubstituteExpressionVisitor.java
+++ 
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppSubstituteExpressionVisitor.java
@@ -54,9 +54,15 @@ public class SqlppSubstituteExpressionVisitor extends 
AbstractSqlppExpressionSco
     }
 
     protected Expression substitute(Expression expr) throws 
CompilationException {
+        Expression mappedExpr = getMappedExpr(expr);
+        // Makes a deep copy before returning to avoid shared references.
+        return mappedExpr == null ? expr : (Expression) 
SqlppRewriteUtil.deepCopy(mappedExpr);
+    }
+
+    protected Expression getMappedExpr(Expression expr) throws 
CompilationException {
         Expression mappedExpr = exprMap.get(expr);
         if (mappedExpr == null) {
-            return expr;
+            return null;
         }
         Collection<VariableExpr> freeVars = 
SqlppVariableUtil.getFreeVariables(expr);
         for (VariableExpr freeVar : freeVars) {
@@ -64,10 +70,9 @@ public class SqlppSubstituteExpressionVisitor extends 
AbstractSqlppExpressionSco
             if (currentScope.findSymbol(freeVar.getVar().getValue()) != null) {
                 // If the expression to be substituted uses variables defined 
in the outer-most expresion
                 // that is being visited, we shouldn't perform the 
substitution.
-                return expr;
+                return null;
             }
         }
-        // Makes a deep copy before returning to avoid shared references.
-        return (Expression) SqlppRewriteUtil.deepCopy(mappedExpr);
+        return mappedExpr;
     }
 }

Reply via email to