You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lens.apache.org by pr...@apache.org on 2015/10/27 16:10:43 UTC

lens git commit: LENS-850: Queries with column name alias like "year" fails on some DBs

Repository: lens
Updated Branches:
  refs/heads/master ccf71332f -> 6c4dba51b


LENS-850: Queries with column name alias like "year" fails on some DBs


Project: http://git-wip-us.apache.org/repos/asf/lens/repo
Commit: http://git-wip-us.apache.org/repos/asf/lens/commit/6c4dba51
Tree: http://git-wip-us.apache.org/repos/asf/lens/tree/6c4dba51
Diff: http://git-wip-us.apache.org/repos/asf/lens/diff/6c4dba51

Branch: refs/heads/master
Commit: 6c4dba51bfebba2bd019508d2e44850ef964d150
Parents: ccf7133
Author: Puneet Gupta <pu...@gmail.com>
Authored: Tue Oct 27 20:39:49 2015 +0530
Committer: Rajat Khandelwal <ra...@gmail.com>
Committed: Tue Oct 27 20:39:49 2015 +0530

----------------------------------------------------------------------
 .../org/apache/lens/cube/parse/HQLParser.java   |  6 +-
 .../lens/cube/parse/TestBaseCubeQueries.java    | 97 ++++++++++----------
 .../lens/cube/parse/TestCubeRewriter.java       | 28 +++---
 .../lens/cube/parse/TestExpressionResolver.java | 12 +--
 .../apache/lens/cube/parse/TestHQLParser.java   | 26 +++++-
 .../lens/cube/parse/TestJoinResolver.java       | 33 ++++---
 .../driver/jdbc/TestColumnarSQLRewriter.java    | 12 +--
 .../apache/lens/driver/jdbc/TestJDBCFinal.java  | 12 +--
 8 files changed, 120 insertions(+), 106 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lens/blob/6c4dba51/lens-cube/src/main/java/org/apache/lens/cube/parse/HQLParser.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/main/java/org/apache/lens/cube/parse/HQLParser.java b/lens-cube/src/main/java/org/apache/lens/cube/parse/HQLParser.java
index 1964e32..ea9badd 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/parse/HQLParser.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/parse/HQLParser.java
@@ -345,9 +345,9 @@ public final class HQLParser {
         buf.append(" true ");
       } else if (KW_FALSE == rootType) {
         buf.append(" false ");
-      } else if (Identifier == rootType && TOK_SELEXPR == ((ASTNode) root.getParent()).getToken().getType()
-        && hasSpaces(rootText)) {
-        // If column alias contains spaces, enclose in back quotes
+      } else if (Identifier == rootType && TOK_SELEXPR == ((ASTNode) root.getParent()).getToken().getType()) {
+        // back quote column alias in all cases. This is required since some alias values can match DB keywords
+        // (example : year as alias) and in such case queries can fail on certain DBs if the alias in not back quoted
         buf.append(" as `").append(rootText).append("` ");
       } else if (Identifier == rootType && TOK_FUNCTIONSTAR == ((ASTNode) root.getParent()).getToken().getType()) {
         // count(*) or count(someTab.*): Don't append space after the identifier

http://git-wip-us.apache.org/repos/asf/lens/blob/6c4dba51/lens-cube/src/test/java/org/apache/lens/cube/parse/TestBaseCubeQueries.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestBaseCubeQueries.java b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestBaseCubeQueries.java
index e6c3be0..548bf5c 100644
--- a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestBaseCubeQueries.java
+++ b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestBaseCubeQueries.java
@@ -167,10 +167,10 @@ public class TestBaseCubeQueries extends TestQueryRewrite {
     Assert.assertTrue(candidateFacts.contains("testfact2_base"));
     String hqlQuery = ctx.toHQL();
     String expected1 =
-      getExpectedQuery(cubeName, "select sum(basecube.msr12) msr12 FROM ", null,
+      getExpectedQuery(cubeName, "select sum(basecube.msr12) as `msr12` FROM ", null,
         null, getWhereForDailyAndHourly2days(cubeName, "C1_testFact2_BASE"));
     String expected2 =
-      getExpectedQuery(cubeName, "select round(sum(basecube.msr2)/1000) roundedmsr2 FROM ", null,
+      getExpectedQuery(cubeName, "select round(sum(basecube.msr2)/1000) as `roundedmsr2` FROM ", null,
         null, getWhereForDailyAndHourly2days(cubeName, "C1_testFact1_BASE"));
     TestCubeRewriter.compareContains(expected1, hqlQuery);
     TestCubeRewriter.compareContains(expected2, hqlQuery);
@@ -185,10 +185,10 @@ public class TestBaseCubeQueries extends TestQueryRewrite {
   public void testMultiFactQueryWithSingleCommonDimension() throws Exception {
     String hqlQuery = rewrite("select dim1, roundedmsr2, msr12 from basecube" + " where " + TWO_DAYS_RANGE, conf);
     String expected1 =
-      getExpectedQuery(cubeName, "select basecube.dim1 dim1, sum(basecube.msr12) msr12 FROM ", null,
+      getExpectedQuery(cubeName, "select basecube.dim1 as `dim1`, sum(basecube.msr12) as `msr12` FROM ", null,
         " group by basecube.dim1", getWhereForDailyAndHourly2days(cubeName, "C1_testFact2_BASE"));
-    String expected2 =
-      getExpectedQuery(cubeName, "select basecube.dim1 dim1, round(sum(basecube.msr2)/1000) roundedmsr2 FROM ", null,
+    String expected2 = getExpectedQuery(cubeName,
+        "select basecube.dim1 as `dim1`, round(sum(basecube.msr2)/1000) as `roundedmsr2` FROM ", null,
         " group by basecube.dim1", getWhereForDailyAndHourly2days(cubeName, "C1_testFact1_BASE"));
     TestCubeRewriter.compareContains(expected1, hqlQuery);
     TestCubeRewriter.compareContains(expected2, hqlQuery);
@@ -208,10 +208,10 @@ public class TestBaseCubeQueries extends TestQueryRewrite {
     tConf.setBoolean(CubeQueryConfUtil.LIGHTEST_FACT_FIRST, true);
     String hqlQuery = rewrite("select dim1, roundedmsr2, msr12 from basecube" + " where " + TWO_DAYS_RANGE, tConf);
     String expected1 =
-      getExpectedQuery(cubeName, "select basecube.dim1 dim1, sum(basecube.msr12) msr12 FROM ", null,
+      getExpectedQuery(cubeName, "select basecube.dim1 as `dim1`, sum(basecube.msr12) as `msr12` FROM ", null,
         " group by basecube.dim1", getWhereForDailyAndHourly2days(cubeName, "C1_testFact2_BASE"));
-    String expected2 =
-      getExpectedQuery(cubeName, "select basecube.dim1 dim1, round(sum(basecube.msr2)/1000) roundedmsr2 FROM ", null,
+    String expected2 = getExpectedQuery(cubeName,
+        "select basecube.dim1 as `dim1`, round(sum(basecube.msr2)/1000) as `roundedmsr2` FROM ", null,
         " group by basecube.dim1", getWhereForDailyAndHourly2days(cubeName, "C1_testFact1_BASE"));
     TestCubeRewriter.compareContains(expected1, hqlQuery);
     TestCubeRewriter.compareContains(expected2, hqlQuery);
@@ -230,10 +230,10 @@ public class TestBaseCubeQueries extends TestQueryRewrite {
     // columns in select interchanged
     String hqlQuery = rewrite("select dim1, msr12, roundedmsr2 from basecube" + " where " + TWO_DAYS_RANGE, conf);
     String expected1 =
-      getExpectedQuery(cubeName, "select basecube.dim1 dim1, sum(basecube.msr12) msr12 FROM ", null,
+      getExpectedQuery(cubeName, "select basecube.dim1 as `dim1`, sum(basecube.msr12) as `msr12` FROM ", null,
         " group by basecube.dim1", getWhereForDailyAndHourly2days(cubeName, "C1_testFact2_BASE"));
-    String expected2 =
-      getExpectedQuery(cubeName, "select basecube.dim1 dim1, round(sum(basecube.msr2)/1000) roundedmsr2 FROM ", null,
+    String expected2 = getExpectedQuery(cubeName,
+        "select basecube.dim1 as `dim1`, round(sum(basecube.msr2)/1000) as `roundedmsr2` FROM ", null,
         " group by basecube.dim1", getWhereForDailyAndHourly2days(cubeName, "C1_testFact1_BASE"));
     TestCubeRewriter.compareContains(expected1, hqlQuery);
     TestCubeRewriter.compareContains(expected2, hqlQuery);
@@ -253,14 +253,14 @@ public class TestBaseCubeQueries extends TestQueryRewrite {
     String hqlQuery = rewrite("select dim1, msr12, roundedmsr2, msr13, msr3 from basecube where " + TWO_DAYS_RANGE,
       conf);
     String expected1 =
-      getExpectedQuery(cubeName, "select basecube.dim1 dim1, sum(basecube.msr12) msr12 FROM ", null,
+      getExpectedQuery(cubeName, "select basecube.dim1 as `dim1`, sum(basecube.msr12) as `msr12` FROM ", null,
         " group by basecube.dim1", getWhereForDailyAndHourly2days(cubeName, "C1_testFact2_BASE"));
-    String expected2 =
-      getExpectedQuery(cubeName,
-        "select basecube.dim1 dim1, round(sum(basecube.msr2)/1000) roundedmsr2, max(basecube.msr3) msr3 FROM ", null,
-        " group by basecube.dim1", getWhereForDailyAndHourly2days(cubeName, "C1_testFact1_BASE"));
+    String expected2 = getExpectedQuery(
+        cubeName,
+        "select basecube.dim1 as `dim1`, round(sum(basecube.msr2)/1000) as `roundedmsr2`, max(basecube.msr3) as `msr3` "
+        + "FROM ", null, " group by basecube.dim1", getWhereForDailyAndHourly2days(cubeName, "C1_testFact1_BASE"));
     String expected3 =
-      getExpectedQuery(cubeName, "select basecube.dim1 dim1, max(basecube.msr13) msr13 FROM ", null,
+      getExpectedQuery(cubeName, "select basecube.dim1 as `dim1`, max(basecube.msr13) as `msr13` FROM ", null,
         " group by basecube.dim1", getWhereForDailyAndHourly2days(cubeName, "c1_testfact3_base"));
     TestCubeRewriter.compareContains(expected1, hqlQuery);
     TestCubeRewriter.compareContains(expected2, hqlQuery);
@@ -292,13 +292,13 @@ public class TestBaseCubeQueries extends TestQueryRewrite {
   public void testMultiFactQueryWithTwoCommonDimensions() throws Exception {
     // query two dim attributes
     String hqlQuery = rewrite("select dim1, dim11, msr12, roundedmsr2 from basecube where " + TWO_DAYS_RANGE, conf);
-    String expected1 =
-      getExpectedQuery(cubeName, "select basecube.dim1 dim1, basecube.dim11 dim11, sum(basecube.msr12) msr12 FROM ",
-        null, " group by basecube.dim1", getWhereForDailyAndHourly2days(cubeName, "C1_testFact2_BASE"));
-    String expected2 =
-      getExpectedQuery(cubeName,
-        "select basecube.dim1 dim1, basecube.dim11 dim11, round(sum(basecube.msr2)/1000) roundedmsr2 FROM ", null,
-        " group by basecube.dim1", getWhereForDailyAndHourly2days(cubeName, "C1_testFact1_BASE"));
+    String expected1 = getExpectedQuery(cubeName,
+        "select basecube.dim1 as `dim1`, basecube.dim11 as `dim11`, sum(basecube.msr12) as `msr12` FROM ", null,
+        " group by basecube.dim1", getWhereForDailyAndHourly2days(cubeName, "C1_testFact2_BASE"));
+    String expected2 = getExpectedQuery(
+        cubeName,
+        "select basecube.dim1 as `dim1`, basecube.dim11 as `dim11`, round(sum(basecube.msr2)/1000) as `roundedmsr2` "
+        + "FROM ", null, " group by basecube.dim1", getWhereForDailyAndHourly2days(cubeName, "C1_testFact1_BASE"));
     TestCubeRewriter.compareContains(expected1, hqlQuery);
     TestCubeRewriter.compareContains(expected2, hqlQuery);
     assertTrue(hqlQuery.toLowerCase().startsWith(
@@ -317,10 +317,10 @@ public class TestBaseCubeQueries extends TestQueryRewrite {
     // no aggregates in the query
     String hqlQuery = rewrite("select dim1, msr11, roundedmsr2 from basecube" + " where " + TWO_DAYS_RANGE, conf);
     String expected1 =
-      getExpectedQuery(cubeName, "select basecube.dim1 dim1, basecube.msr11 msr11 FROM ", null, null,
+      getExpectedQuery(cubeName, "select basecube.dim1 as `dim1`, basecube.msr11 as `msr11` FROM ", null, null,
         getWhereForHourly2days(cubeName, "C1_testfact2_raw_base"));
-    String expected2 =
-      getExpectedQuery(cubeName, "select basecube.dim1 dim1, round(basecube.msr2/1000) roundedmsr2 FROM ", null, null,
+    String expected2 = getExpectedQuery(cubeName,
+        "select basecube.dim1 as `dim1`, round(basecube.msr2/1000) as `roundedmsr2` FROM ", null, null,
         getWhereForHourly2days(cubeName, "C1_testfact1_raw_base"));
     TestCubeRewriter.compareContains(expected1, hqlQuery);
     TestCubeRewriter.compareContains(expected2, hqlQuery);
@@ -339,10 +339,10 @@ public class TestBaseCubeQueries extends TestQueryRewrite {
     String hqlQuery =
       rewrite("select dim1 d1, msr12 `my msr12`, roundedmsr2 m2 from basecube" + " where " + TWO_DAYS_RANGE, conf);
     String expected1 =
-      getExpectedQuery(cubeName, "select basecube.dim1 d1, sum(basecube.msr12) expr2 FROM ", null,
+      getExpectedQuery(cubeName, "select basecube.dim1 as `d1`, sum(basecube.msr12) as `expr2` FROM ", null,
         " group by basecube.dim1", getWhereForDailyAndHourly2days(cubeName, "C1_testFact2_BASE"));
     String expected2 =
-      getExpectedQuery(cubeName, "select basecube.dim1 d1, round(sum(basecube.msr2)/1000) m2 FROM ", null,
+      getExpectedQuery(cubeName, "select basecube.dim1 as `d1`, round(sum(basecube.msr2)/1000) as `m2` FROM ", null,
         " group by basecube.dim1", getWhereForDailyAndHourly2days(cubeName, "C1_testFact1_BASE"));
     TestCubeRewriter.compareContains(expected1, hqlQuery);
     TestCubeRewriter.compareContains(expected2, hqlQuery);
@@ -359,10 +359,10 @@ public class TestBaseCubeQueries extends TestQueryRewrite {
    // query with non default aggregate
     String hqlQuery = rewrite("select dim1, avg(msr12), avg(msr2) from basecube" + " where " + TWO_DAYS_RANGE, conf);
     String expected1 =
-      getExpectedQuery(cubeName, "select basecube.dim1 dim1, avg(basecube.msr12) msr12 FROM ", null,
+      getExpectedQuery(cubeName, "select basecube.dim1 as `dim1`, avg(basecube.msr12) as `msr12` FROM ", null,
         " group by basecube.dim1", getWhereForHourly2days(cubeName, "C1_testfact2_raw_base"));
     String expected2 =
-      getExpectedQuery(cubeName, "select basecube.dim1 dim1, avg(basecube.msr2)) msr2 FROM ", null,
+      getExpectedQuery(cubeName, "select basecube.dim1 as `dim1`, avg(basecube.msr2)) as `msr2` FROM ", null,
         " group by basecube.dim1", getWhereForHourly2days(cubeName, "C1_testfact1_raw_base"));
     TestCubeRewriter.compareContains(expected1, hqlQuery);
     TestCubeRewriter.compareContains(expected2, hqlQuery);
@@ -379,15 +379,14 @@ public class TestBaseCubeQueries extends TestQueryRewrite {
   public void testMultiFactQueryWithJoins() throws Exception {
     // query with join
     String hqlQuery = rewrite("select testdim2.name, msr12, roundedmsr2 from basecube where " + TWO_DAYS_RANGE, conf);
-    String expected1 =
-      getExpectedQuery(cubeName, "select testdim2.name name, sum(basecube.msr12) msr12 FROM ", " JOIN " + getDbName()
-          + "c1_testdim2tbl testdim2 ON basecube.dim2 = " + " testdim2.id and (testdim2.dt = 'latest') ", null,
+    String expected1 = getExpectedQuery(cubeName,
+        "select testdim2.name as `name`, sum(basecube.msr12) as `msr12` FROM ", " JOIN " + getDbName()
+            + "c1_testdim2tbl testdim2 ON basecube.dim2 = " + " testdim2.id and (testdim2.dt = 'latest') ", null,
         " group by testdim2.name", null, getWhereForDailyAndHourly2days(cubeName, "C1_testFact2_BASE"));
-    String expected2 =
-      getExpectedQuery(cubeName, "select testdim2.name name, round(sum(basecube.msr2)/1000) roundedmsr2 FROM ", " JOIN "
-          + getDbName() + "c1_testdim2tbl testdim2 ON basecube.dim2 = "
-          + " testdim2.id and (testdim2.dt = 'latest') ", null, " group by testdim2.name", null,
-        getWhereForHourly2days(cubeName, "C1_testfact1_raw_base"));
+    String expected2 = getExpectedQuery(cubeName,
+        "select testdim2.name as `name`, round(sum(basecube.msr2)/1000) as `roundedmsr2` FROM ", " JOIN " + getDbName()
+            + "c1_testdim2tbl testdim2 ON basecube.dim2 = " + " testdim2.id and (testdim2.dt = 'latest') ", null,
+        " group by testdim2.name", null, getWhereForHourly2days(cubeName, "C1_testfact1_raw_base"));
     TestCubeRewriter.compareContains(expected1, hqlQuery);
     TestCubeRewriter.compareContains(expected2, hqlQuery);
     assertTrue(hqlQuery.toLowerCase().startsWith(
@@ -402,12 +401,12 @@ public class TestBaseCubeQueries extends TestQueryRewrite {
   public void testMultiFactQueryWithDenormColumn() throws Exception {
     // query with denorm variable
     String hqlQuery = rewrite("select dim2, msr13, roundedmsr2 from basecube" + " where " + TWO_DAYS_RANGE, conf);
-    String expected1 =
-      getExpectedQuery(cubeName, "select testdim2.id dim2, max(basecube.msr13) msr13 FROM ", " JOIN " + getDbName()
-          + "c1_testdim2tbl testdim2 ON basecube.dim12 = " + " testdim2.id and (testdim2.dt = 'latest') ", null,
-        " group by testdim2.id", null, getWhereForHourly2days(cubeName, "C1_testFact3_RAW_BASE"));
-    String expected2 =
-      getExpectedQuery(cubeName, "select basecube.dim2 dim2, round(sum(basecube.msr2)/1000) roundedmsr2 FROM ", null,
+    String expected1 = getExpectedQuery(cubeName, "select testdim2.id as `dim2`, max(basecube.msr13) as `msr13` FROM ",
+        " JOIN " + getDbName() + "c1_testdim2tbl testdim2 ON basecube.dim12 = "
+            + " testdim2.id and (testdim2.dt = 'latest') ", null, " group by testdim2.id", null,
+        getWhereForHourly2days(cubeName, "C1_testFact3_RAW_BASE"));
+    String expected2 = getExpectedQuery(cubeName,
+        "select basecube.dim2 as `dim2`, round(sum(basecube.msr2)/1000) as `roundedmsr2` FROM ", null,
         " group by basecube.dim2", getWhereForHourly2days(cubeName, "C1_testfact1_raw_base"));
     TestCubeRewriter.compareContains(expected1, hqlQuery);
     TestCubeRewriter.compareContains(expected2, hqlQuery);
@@ -428,14 +427,14 @@ public class TestBaseCubeQueries extends TestQueryRewrite {
         "select booleancut, round(sum(msr2)/1000), avg(msr13 + msr14) from basecube" + " where " + TWO_DAYS_RANGE,
         conf);
     String expected1 =
-      getExpectedQuery(cubeName, "select basecube.dim1 != 'x' AND testdim2.id != 10 booleancut,"
-          + " avg(basecube.msr13 + basecube.msr14) expr3 FROM ", " JOIN " + getDbName()
+      getExpectedQuery(cubeName, "select basecube.dim1 != 'x' AND testdim2.id != 10 as `booleancut`,"
+          + " avg(basecube.msr13 + basecube.msr14) as `expr3` FROM ", " JOIN " + getDbName()
           + "c1_testdim2tbl testdim2 ON basecube.dim12 = " + " testdim2.id and (testdim2.dt = 'latest') ", null,
         " group by basecube.dim1 != 'x' AND testdim2.id != 10", null,
         getWhereForHourly2days(cubeName, "C1_testfact3_raw_base"));
     String expected2 =
-      getExpectedQuery(cubeName, "select basecube.dim1 != 'x' AND basecube.dim2 != 10 booleancut,"
-          + " round(sum(basecube.msr2)/1000) msr2 FROM ", null,
+      getExpectedQuery(cubeName, "select basecube.dim1 != 'x' AND basecube.dim2 != 10 as `booleancut`,"
+          + " round(sum(basecube.msr2)/1000) as `msr2` FROM ", null,
         " group by basecube.dim1 != 'x' AND basecube.dim2 != 10",
         getWhereForHourly2days(cubeName, "C1_testfact1_raw_base"));
     TestCubeRewriter.compareContains(expected1, hqlQuery);

http://git-wip-us.apache.org/repos/asf/lens/blob/6c4dba51/lens-cube/src/test/java/org/apache/lens/cube/parse/TestCubeRewriter.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestCubeRewriter.java b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestCubeRewriter.java
index f5ff49a..efe0980 100644
--- a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestCubeRewriter.java
+++ b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestCubeRewriter.java
@@ -779,10 +779,10 @@ public class TestCubeRewriter extends TestQueryRewrite {
     expected =
       getExpectedQuery(
         cubeName,
-        "SELECT ( citydim.name ) g1 ,"
+        "SELECT ( citydim.name ) as `g1` ,"
           + "  case  when (( citydim.name ) ==  'NULL' ) then  'NULL'  when (( citydim.name ) ==  'X' )"
           + " then  'X-NAME'  when (( citydim.name ) ==  'Y' ) then  'Y-NAME'"
-          + "  else  'DEFAULT'  end  g2 , ( statedim.name ) g3 , ( statedim.id ) g4 ,"
+          + "  else  'DEFAULT'  end  as `g2` , ( statedim.name ) as `g3` , ( statedim.id ) as `g4` ,"
           + " ((( zipdim.code ) !=  1 ) and ((((( zipdim.f1 ) ==  \"xyz\" )"
           + " and (((( zipdim.f2 ) >=  \"3\" ) and (( zipdim.f2 ) !=  \"NULL\" ))"
           + " and (( zipdim.f2 ) !=  \"uk\" ))) or (((( zipdim.f2 ) ==  \"adc\" )"
@@ -791,7 +791,7 @@ public class TestCubeRewriter extends TestQueryRewrite {
           + " or ((((( zipdim.f1 ) ==  \"api\" )"
           + " or (( zipdim.f1 ) ==  \"uk\" )) or ((( zipdim.f1 ) ==  \"adc\" )"
           + " and (( zipdim.f1 ) !=  \"js\" )))"
-          + " and (( citydim.id ) ==  12 )))) g5 , ((( zipdim.code ) ==  1 )"
+          + " and (( citydim.id ) ==  12 )))) as `g5` , ((( zipdim.code ) ==  1 )"
           + " and ((((( zipdim.f1 ) ==  \"xyz\" ) and (((( zipdim.f2 ) >=  \"3\" )"
           + " and (( zipdim.f2 ) !=  \"NULL\" ))"
           + " and (( zipdim.f2 ) !=  \"uk\" ))) or (((( zipdim.f2 ) ==  \"adc\" )"
@@ -800,14 +800,14 @@ public class TestCubeRewriter extends TestQueryRewrite {
           + " or ((((( zipdim.f1 ) ==  \"api\" )"
           + " or (( zipdim.f1 ) ==  \"uk\" )) or ((( zipdim.f1 ) ==  \"adc\" )"
           + " and (( zipdim.f1 ) !=  \"js\" )))"
-          + " and (( citydim.id ) ==  12 )))) g6 , ( zipdim.f1 ) g7 ,"
-          + " format_number(sum(( testcube.msr1 )),  \"##################.###\" ) a1 ,"
-          + " format_number(sum(( testcube.msr2 )),  \"##################.###\" ) a2 ,"
-          + " format_number(sum(( testcube.msr3 )),  \"##################.###\" ) a3, "
-          + " format_number((sum(( testcube.msr1 )) + sum(( testcube.msr2 ))),  \"##################.###\" ) a4 ,"
-          + " format_number((sum(( testcube.msr1 )) + sum(( testcube.msr3 ))),  \"##################.###\" ) a5 ,"
+          + " and (( citydim.id ) ==  12 )))) as `g6` , ( zipdim.f1 ) as `g7` ,"
+          + " format_number(sum(( testcube.msr1 )),  \"##################.###\" ) as `a1` ,"
+          + " format_number(sum(( testcube.msr2 )),  \"##################.###\" ) as `a2` ,"
+          + " format_number(sum(( testcube.msr3 )),  \"##################.###\" ) as `a3`, "
+          + " format_number((sum(( testcube.msr1 )) + sum(( testcube.msr2 ))),  \"##################.###\" ) as `a4` ,"
+          + " format_number((sum(( testcube.msr1 )) + sum(( testcube.msr3 ))),  \"##################.###\" ) as `a5` ,"
           + " format_number((sum(( testcube.msr1 )) - (sum(( testcube.msr2 )) + sum(( testcube.msr3 )))), "
-          + " \"##################.###\" ) a6"
+          + " \"##################.###\" ) as `a6`"
           + "  FROM ",
         actualExpr,
         null,
@@ -885,8 +885,8 @@ public class TestCubeRewriter extends TestQueryRewrite {
       + " on testCube.cityid = citydim.id where " + LAST_HOUR_TIME_RANGE;
 
     String expectedRewrittenQuery = "SELECT ( citydim . name ) as `Alias With Spaces` , sum(( testcube . msr2 )) "
-      + "testmeasure  FROM TestQueryRewrite.c2_testfact testcube inner JOIN TestQueryRewrite.c2_citytable citydim ON "
-      + "(( testcube . cityid ) = ( citydim . id )) WHERE (((( testcube . dt ) =  '"
+      + "as `TestMeasure`  FROM TestQueryRewrite.c2_testfact testcube inner JOIN TestQueryRewrite.c2_citytable citydim "
+      + "ON (( testcube . cityid ) = ( citydim . id )) WHERE (((( testcube . dt ) =  '"
       + CubeTestSetup.getDateUptoHours(LAST_HOUR) + "' ))) GROUP BY ( citydim . name )";
 
     String actualRewrittenQuery = rewrite(inputQuery, getConfWithStorages("C2"));
@@ -902,8 +902,8 @@ public class TestCubeRewriter extends TestQueryRewrite {
       + " on testCube.cityid = citydim.id where " + LAST_HOUR_TIME_RANGE;
 
     String expectedRewrittenQuery = "SELECT ( citydim . name ) as `Alias With Spaces` , sum(( testcube . msr2 )) "
-      + "testmeasure  FROM TestQueryRewrite.c2_testfact testcube inner JOIN TestQueryRewrite.c2_citytable citydim ON "
-      + "(( testcube . cityid ) = ( citydim . id )) WHERE (((( testcube . dt ) =  '"
+      + "as `TestMeasure`  FROM TestQueryRewrite.c2_testfact testcube inner JOIN TestQueryRewrite.c2_citytable citydim "
+      + "ON (( testcube . cityid ) = ( citydim . id )) WHERE (((( testcube . dt ) =  '"
       + CubeTestSetup.getDateUptoHours(LAST_HOUR) + "' ))) GROUP BY ( citydim . name )";
 
     String actualRewrittenQuery = rewrite(inputQuery, getConfWithStorages("C2"));

http://git-wip-us.apache.org/repos/asf/lens/blob/6c4dba51/lens-cube/src/test/java/org/apache/lens/cube/parse/TestExpressionResolver.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestExpressionResolver.java b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestExpressionResolver.java
index b2a15a0..1cb22eb 100644
--- a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestExpressionResolver.java
+++ b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestExpressionResolver.java
@@ -394,9 +394,9 @@ public class TestExpressionResolver extends TestQueryRewrite {
       + "c1_countrytable countrydim on" + " statedim.countryid = countrydim.id";
     joinExpr = join2 + join3 + join1;
     String expected =
-      getExpectedQuery("citydim", "SELECT citydim.name cname, concat((citydim.name), \":\", (statedim.name ),"
-        + " \":\",(countrydim.name),  \":\" , ( zipdim . code )) caddr FROM ", joinExpr, null, null, "c1_citytable",
-        true);
+      getExpectedQuery("citydim", "SELECT citydim.name as `cname`, concat((citydim.name), \":\", (statedim.name ),"
+        + " \":\",(countrydim.name),  \":\" , ( zipdim . code )) as `caddr` FROM ", joinExpr, null, null,
+        "c1_citytable", true);
     TestCubeRewriter.compareQueries(hqlQuery, expected);
   }
 
@@ -438,9 +438,9 @@ public class TestExpressionResolver extends TestQueryRewrite {
         + "";
 
     String expected =
-      getExpectedQuery("ct", "SELECT ct.name cname, concat((ct.name), \":\", (statedim.name ),"
-        + " \":\",(countrydim.name),  \":\" , ( zipdim . code )) caddr FROM ", joinExpr, null, null, "c1_citytable",
-        true);
+      getExpectedQuery("ct", "SELECT ct.name as `cname`, concat((ct.name), \":\", (statedim.name ),"
+        + " \":\",(countrydim.name),  \":\" , ( zipdim . code )) as `caddr` FROM ", joinExpr, null, null,
+        "c1_citytable", true);
     TestCubeRewriter.compareQueries(hqlQuery, expected);
   }
 

http://git-wip-us.apache.org/repos/asf/lens/blob/6c4dba51/lens-cube/src/test/java/org/apache/lens/cube/parse/TestHQLParser.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestHQLParser.java b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestHQLParser.java
index b0b2e88..4afd403 100644
--- a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestHQLParser.java
+++ b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestHQLParser.java
@@ -60,7 +60,7 @@ public class TestHQLParser {
 
     ASTNode select = HQLParser.findNodeByPath(tree, TOK_INSERT, TOK_SELECT);
     String selectStr = HQLParser.getString(select).trim();
-    String expectedSelect = "'abc'  col1 ,  'DEF'  col2";
+    String expectedSelect = "'abc'  as `col1` ,  'DEF'  as `col2`";
     Assert.assertEquals(expectedSelect, selectStr);
 
     ASTNode where = HQLParser.findNodeByPath(tree, TOK_INSERT, TOK_WHERE);
@@ -80,7 +80,7 @@ public class TestHQLParser {
     System.out.println("reconstructed clause ");
     System.out.println(selectStr);
     Assert.assertEquals("case ((( col1  *  100 ) /  200 ) +  5 ) "
-        + "when  'ABC'  then  'def'  when  'EFG'  then  'hij'  " + "else  'XyZ'  end  complexcasestatement",
+        + "when  'ABC'  then  'def'  when  'EFG'  then  'hij'  " + "else  'XyZ'  end  as `ComplexCaseStatement`",
       selectStr.trim());
 
     String q2 = "SELECT " + "CASE WHEN col1 = 'abc' then 'def' " + "when col1 = 'ghi' then 'jkl' "
@@ -92,7 +92,7 @@ public class TestHQLParser {
     System.out.println("reconstructed clause 2");
     System.out.println(selectStr);
     Assert.assertEquals("case  when ( col1  =  'abc' ) then  'def'  " + "when ( col1  =  'ghi' ) then  'jkl'  "
-      + "else  'none'  end  complex_case_statement_2", selectStr.trim());
+      + "else  'none'  end  as `Complex_Case_Statement_2`", selectStr.trim());
 
     String q3 = "SELECT  " + "CASE (col1 * 100)/200 + 5 " + "WHEN 'ABC' THEN 'def' " + "WHEN 'EFG' THEN 'hij' "
       + "END AS ComplexCaseStatement FROM FOO";
@@ -103,7 +103,7 @@ public class TestHQLParser {
     System.out.println("reconstructed clause ");
     System.out.println(selectStr);
     Assert.assertEquals("case ((( col1  *  100 ) /  200 ) +  5 ) " + "when  'ABC'  then  'def'  when  'EFG'  "
-      + "then  'hij'  end  complexcasestatement", selectStr.trim());
+      + "then  'hij'  end  as `ComplexCaseStatement`", selectStr.trim());
 
     String q4 = "SELECT " + "CASE WHEN col1 = 'abc' then 'def' " + "when col1 = 'ghi' then 'jkl' "
       + "END AS Complex_Case_Statement_2" + " from FOO";
@@ -114,7 +114,7 @@ public class TestHQLParser {
     System.out.println("reconstructed clause 2");
     System.out.println(selectStr);
     Assert.assertEquals("case  when ( col1  =  'abc' ) then  " + "'def'  when ( col1  =  'ghi' ) then  'jkl'  "
-      + "end  complex_case_statement_2", selectStr.trim());
+      + "end  as `Complex_Case_Statement_2`", selectStr.trim());
 
   }
 
@@ -248,6 +248,22 @@ public class TestHQLParser {
   }
 
   @Test
+  public void testAliasShouldBeQuoted() throws Exception {
+    Assert.assertEquals(getSelectStrForQuery("select id as identity from sample_dim"), "id  as `identity`");
+    Assert.assertEquals(getSelectStrForQuery("select id as `column identity` from sample_dim"),
+        "id  as `column identity`");
+    Assert.assertEquals(getSelectStrForQuery("select id identity from sample_dim"), "id  as `identity`");
+    Assert.assertEquals(getSelectStrForQuery("select id `column identity` from sample_dim"),
+        "id  as `column identity`");
+  }
+
+  private String getSelectStrForQuery(String query) throws Exception {
+    ASTNode tree = HQLParser.parseHQL(query, conf);
+    ASTNode select = HQLParser.findNodeByPath(tree, TOK_INSERT, TOK_SELECT);
+    return HQLParser.getString(select).trim();
+  }
+
+  @Test
   public void testAllColumns() throws Exception {
     String query = "select * from tab";
     ASTNode select = HQLParser.findNodeByPath(HQLParser.parseHQL(query, conf), TOK_INSERT, TOK_SELECT);

http://git-wip-us.apache.org/repos/asf/lens/blob/6c4dba51/lens-cube/src/test/java/org/apache/lens/cube/parse/TestJoinResolver.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestJoinResolver.java b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestJoinResolver.java
index 7580541..ea561b6 100644
--- a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestJoinResolver.java
+++ b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestJoinResolver.java
@@ -835,23 +835,22 @@ public class TestJoinResolver extends TestQueryRewrite {
     conf.set(CubeQueryConfUtil.DRIVER_SUPPORTED_STORAGES, "C1");
     String query = "select usersports.name, sum(msr2), sum(msr12) from basecube where " + TWO_DAYS_RANGE;
     String hqlQuery = rewrite(query, conf);
-    String expected1 = getExpectedQuery("basecube", "select usersports.name name, sum(basecube.msr2) msr2 FROM ",
-      " join " + getDbName() + "c1_usertable userdim ON basecube.userid = userdim.id "
-        + " join (select user_interests.user_id as user_id,collect_set(usersports.name) as name"
-        + " from " + getDbName() + "c1_user_interests_tbl user_interests"
-        + " join " + getDbName() + "c1_sports_tbl usersports on user_interests.sport_id = usersports.id"
-        + " group by user_interests.user_id) usersports"
-        + " on userdim.id = usersports.user_id ",
-      null, "group by usersports.name", null,
-      getWhereForDailyAndHourly2days("basecube", "c1_testfact1_base"));
-    String expected2 = getExpectedQuery("basecube", "select usersports.name name, sum(basecube.msr12) msr12 FROM ",
-      " join " + getDbName() + "c1_usertable userdim ON basecube.userid = userdim.id "
-        + " join (select user_interests.user_id as user_id,collect_set(usersports.name) as name"
-        + " from " + getDbName() + "c1_user_interests_tbl user_interests"
-        + " join " + getDbName() + "c1_sports_tbl usersports on user_interests.sport_id = usersports.id"
-        + " group by user_interests.user_id) usersports"
-        + " on userdim.id = usersports.user_id ",
-      null, "group by usersports.name", null,
+    String expected1 = getExpectedQuery("basecube",
+        "select usersports.name as `name`, sum(basecube.msr2) as `msr2` FROM ", " join " + getDbName()
+            + "c1_usertable userdim ON basecube.userid = userdim.id "
+            + " join (select user_interests.user_id as user_id,collect_set(usersports.name) as name" + " from "
+            + getDbName() + "c1_user_interests_tbl user_interests" + " join " + getDbName()
+            + "c1_sports_tbl usersports on user_interests.sport_id = usersports.id"
+            + " group by user_interests.user_id) usersports" + " on userdim.id = usersports.user_id ", null,
+        "group by usersports.name", null, getWhereForDailyAndHourly2days("basecube", "c1_testfact1_base"));
+    String expected2 = getExpectedQuery("basecube",
+        "select usersports.name as `name`, sum(basecube.msr12) as `msr12` FROM ", " join " + getDbName()
+            + "c1_usertable userdim ON basecube.userid = userdim.id "
+            + " join (select user_interests.user_id as user_id,collect_set(usersports.name) as name" + " from "
+            + getDbName() + "c1_user_interests_tbl user_interests" + " join " + getDbName()
+            + "c1_sports_tbl usersports on user_interests.sport_id = usersports.id"
+            + " group by user_interests.user_id) usersports" + " on userdim.id = usersports.user_id ", null,
+        "group by usersports.name", null,
       getWhereForDailyAndHourly2days("basecube", "c1_testfact2_base"));
     TestCubeRewriter.compareContains(expected1, hqlQuery);
     TestCubeRewriter.compareContains(expected2, hqlQuery);

http://git-wip-us.apache.org/repos/asf/lens/blob/6c4dba51/lens-driver-jdbc/src/test/java/org/apache/lens/driver/jdbc/TestColumnarSQLRewriter.java
----------------------------------------------------------------------
diff --git a/lens-driver-jdbc/src/test/java/org/apache/lens/driver/jdbc/TestColumnarSQLRewriter.java b/lens-driver-jdbc/src/test/java/org/apache/lens/driver/jdbc/TestColumnarSQLRewriter.java
index 3a00510..149c450 100644
--- a/lens-driver-jdbc/src/test/java/org/apache/lens/driver/jdbc/TestColumnarSQLRewriter.java
+++ b/lens-driver-jdbc/src/test/java/org/apache/lens/driver/jdbc/TestColumnarSQLRewriter.java
@@ -437,7 +437,7 @@ public class TestColumnarSQLRewriter {
     String expected = "select ( sales_fact___fact . time_key ), ( time_dim___time_dim . day_of_week ), "
             + "week((time_dim__time_dim . day )), "
             + "date(( time_dim___time_dim . day )), ( item_dim___item_dim . item_key ),  "
-            + "case  when (sum(alias2) =  0 ) then  0.0  else sum(alias2) end  dollars_sold , "
+            + "case  when (sum(alias2) =  0 ) then  0.0  else sum(alias2) end  as `dollars_sold` , "
             + "format(sum(alias3),  4 ), format(avg(alias4),  '##################.###' ), "
             + "min(alias5), max(alias6) from  (select sales_fact___fact.time_key, "
             + "sales_fact___fact.location_key, sales_fact___fact.item_key,sum(( sales_fact___fact . "
@@ -505,7 +505,7 @@ public class TestColumnarSQLRewriter {
     String actual = qtest.rewrite(query, conf, hconf);
     String expected = "select ( sales_fact___fact . time_key ), ( time_dim___time_dim . day_of_week ), "
             + "( time_dim___time_dim . day ),  case  when (sum(alias2) =  0 ) then  0.0  "
-            + "else sum(alias2) end  dollars_sold  from  (select sales_fact___fact.time_key, "
+            + "else sum(alias2) end  as `dollars_sold`  from  (select sales_fact___fact.time_key, "
             + "sales_fact___fact.location_key,sum(( sales_fact___fact . dollars_sold )) as alias1, "
             + "sum(( sales_fact___fact . dollars_sold )) as alias2 from sales_fact sales_fact___fact "
             + "where sales_fact___fact.time_key in  (  select time_dim .time_key from time_dim where "
@@ -523,7 +523,7 @@ public class TestColumnarSQLRewriter {
             + "( time_dim___time_dim . day_of_week ), ( time_dim___time_dim . day ) "
             + "order by dollars_sold  asc  union all select ( sales_fact___fact . time_key ), "
             + "( time_dim___time_dim . day_of_week ), ( time_dim___time_dim . day ),  "
-            + "case  when (sum(alias2) =  0 ) then  0.0  else sum(alias2) end  dollars_sold  "
+            + "case  when (sum(alias2) =  0 ) then  0.0  else sum(alias2) end  as `dollars_sold`  "
             + "from  (select sales_fact___fact.time_key, sales_fact___fact.location_key,"
             + "sum(( sales_fact___fact . dollars_sold )) as alias1, sum(( sales_fact___fact . dollars_sold )) "
             + "as alias2 from sales_fact sales_fact___fact where sales_fact___fact.time_key in  "
@@ -541,7 +541,7 @@ public class TestColumnarSQLRewriter {
             + "( time_dim___time_dim . day ) order by dollars_sold  asc  union all select "
             + "( sales_fact___fact . time_key ), ( time_dim___time_dim . day_of_week ), "
             + "( time_dim___time_dim . day ),  case  when (sum(alias2) =  0 ) then  0.0  "
-            + "else sum(alias2) end  dollars_sold  from  (select sales_fact___fact.time_key, "
+            + "else sum(alias2) end  as `dollars_sold`  from  (select sales_fact___fact.time_key, "
             + "sales_fact___fact.location_key,sum(( sales_fact___fact . dollars_sold )) as alias1, "
             + "sum(( sales_fact___fact . dollars_sold )) as alias2 from sales_fact sales_fact___fact "
             + "where sales_fact___fact.time_key in  (  select time_dim .time_key from time_dim where "
@@ -1022,13 +1022,13 @@ public class TestColumnarSQLRewriter {
     String actual = qtest.rewrite(query, conf, hconf);
     String expected = "select ( sales_fact__db_sales_fact_fact . time_key ), ( time_dim___time_dim . day_of_week ), "
             + "( time_dim___time_dim . day ), ((sum(( sales_fact__db_sales_fact_fact . item_count )) +  0 ) + "
-            + "(sum(( sales_fact__db_sales_fact_fact . product_count )) +  0 )) expr1 , "
+            + "(sum(( sales_fact__db_sales_fact_fact . product_count )) +  0 )) as `expr1` , "
             + "((sum( case  when ( location_dim__db_location_dim_ld . status_id ) is null  then  0  "
             + "when (( location_dim__db_location_dim_ld . status_id ) =  1 ) then "
             + "( sales_fact__db_sales_fact_fact . item_sold ) else  0  end ) *  1000 ) / sum( case  "
             + "when ( location_dim__db_location_dim_ld . status_id ) is null  then  0  "
             + "when (( location_dim__db_location_dim_ld . status_id ) =  2 ) then "
-            + "( sales_fact__db_sales_fact_fact . dollars_sold ) else  0  end )) expr2  "
+            + "( sales_fact__db_sales_fact_fact . dollars_sold ) else  0  end )) as `expr2`  "
             + "from db.sales_fact sales_fact__db_sales_fact_fact  inner join "
             + "(select time_key,day_of_week,day from time_dim) time_dim___time_dim on "
             + "(( sales_fact__db_sales_fact_fact . time_key ) = ( time_dim___time_dim . time_key ))  "

http://git-wip-us.apache.org/repos/asf/lens/blob/6c4dba51/lens-driver-jdbc/src/test/java/org/apache/lens/driver/jdbc/TestJDBCFinal.java
----------------------------------------------------------------------
diff --git a/lens-driver-jdbc/src/test/java/org/apache/lens/driver/jdbc/TestJDBCFinal.java b/lens-driver-jdbc/src/test/java/org/apache/lens/driver/jdbc/TestJDBCFinal.java
index d8c2f63..053e20d 100644
--- a/lens-driver-jdbc/src/test/java/org/apache/lens/driver/jdbc/TestJDBCFinal.java
+++ b/lens-driver-jdbc/src/test/java/org/apache/lens/driver/jdbc/TestJDBCFinal.java
@@ -181,10 +181,10 @@ public class TestJDBCFinal {
     testCreateJdbcDriver();
     final String query =
 
-      "select fact.time_key,time_dim.day_of_week,time_dim.day," + "sum(fact.dollars_sold) dollars_sold "
+      "select fact.time_key,time_dim.day_of_week,time_dim.day," + "sum(fact.dollars_sold) "
         + "from sales_fact fact " + "inner join time_dim time_dim on fact.time_key = time_dim.time_key "
         + "where time_dim.day between '1900-01-01' and '1900-01-03' "
-        + "group by fact.time_key,time_dim.day_of_week,time_dim.day " + "order by dollars_sold desc";
+        + "group by fact.time_key,time_dim.day_of_week,time_dim.day " + "order by fact.time_key desc";
 
     QueryContext context = new QueryContext(query, "SA", new LensConf(), baseConf, drivers);
 
@@ -210,7 +210,7 @@ public class TestJDBCFinal {
 
       ColumnDescriptor col4 = rsMeta.getColumns().get(3);
       assertEquals(col4.getTypeName().toLowerCase(), "double");
-      assertEquals(col4.getName(), "dollars_sold".toUpperCase());
+      assertEquals(col4.getName(), "c4".toUpperCase());
 
       while (rs.hasNext()) {
         ResultRow row = rs.next();
@@ -234,14 +234,14 @@ public class TestJDBCFinal {
     testCreateJdbcDriver();
     final String query =
 
-      "select fact.time_key,time_dim.day_of_week,time_dim.day, " + "sum(fact.dollars_sold) dollars_sold "
+      "select fact.time_key,time_dim.day_of_week,time_dim.day, " + "sum(fact.dollars_sold)  "
         + "from sales_fact fact " + "inner join time_dim time_dim on fact.time_key = time_dim.time_key "
         + "inner join item_dim item_dim on fact.item_key = item_dim.item_key and item_dim.item_name = 'item2' "
         + "inner join branch_dim branch_dim on fact.branch_key = branch_dim.branch_key "
         + "and branch_dim.branch_name = 'branch2' "
         + "inner join location_dim location_dim on fact.location_key = location_dim.location_key "
         + "where time_dim.day between '1900-01-01' and '1900-01-04' " + "and location_dim.location_name = 'loc2' "
-        + "group by fact.time_key,time_dim.day_of_week,time_dim.day " + "order by dollars_sold  desc ";
+        + "group by fact.time_key,time_dim.day_of_week,time_dim.day " + "order by fact.time_key  desc ";
 
     QueryContext context = new QueryContext(query, "SA", new LensConf(), baseConf, drivers);
     LensResultSet resultSet = driver.execute(context);
@@ -266,7 +266,7 @@ public class TestJDBCFinal {
 
       ColumnDescriptor col4 = rsMeta.getColumns().get(3);
       assertEquals(col4.getTypeName().toLowerCase(), "double");
-      assertEquals(col4.getName(), "dollars_sold".toUpperCase());
+      assertEquals(col4.getName(), "c4".toUpperCase());
 
       while (rs.hasNext()) {
         ResultRow row = rs.next();