Hi, I managed to setup the H2 Dev environment (really easy, hat tip to 
Thomas) and patch the org.h2.command.dml.Select class to address the gaps I 
was talking about earlier.

Pls review the patch attached with a simple test class. It has some dead 
simple getter method fixes. If this looks good, I hope you guys can 
integrate it with the H2 Trunk.


Thanks!

-- 
You received this message because you are subscribed to the Google Groups "H2 
Database" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/h2-database?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.


Index: src/main/org/h2/command/dml/TestSelectAstFixes.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>windows-1252
===================================================================
--- src/main/org/h2/command/dml/TestSelectAstFixes.java	(revision )
+++ src/main/org/h2/command/dml/TestSelectAstFixes.java	(revision )
@@ -0,0 +1,96 @@
+package org.h2.command.dml;
+
+import org.h2.Driver;
+import org.h2.command.Parser;
+import org.h2.engine.Session;
+import org.h2.expression.Expression;
+import org.h2.expression.Subquery;
+import org.h2.jdbc.JdbcConnection;
+import org.h2.table.Table;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.List;
+
+/*
+ * Author: Ashwin Jayaprakash / Date: 4/22/13 / Time: 4:40 PM
+ */
+public class TestSelectAstFixes {
+    public static void main(String[] args) throws SQLException {
+        Driver.load();
+        Connection c = DriverManager.getConnection("jdbc:h2:mem:test");
+
+        Statement s = c.createStatement();
+
+        s.execute("create table if not exists people_crm" +
+                " (crm_id varchar(256) primary key, id varchar(256), name varchar(256), age int)");
+
+        JdbcConnection h2c = (JdbcConnection) c;
+        Session session = (Session) h2c.getSession();
+        Parser parser = new Parser(session);
+
+        testQueries(parser);
+    }
+
+    private static void testQueries(Parser parser) {
+        String q = "select distinct name, count(*), min(age), max(age)/3, upper(name)" +
+                " from people_crm" +
+                " where age < 100" +
+                " group by name" +
+                " having count(*) > 100 and name like '%'" +
+                " order by upper(name)" +
+                " limit 5 offset 1";
+        parseAndPrint(parser, q);
+
+        System.out.println("--------------");
+        q = "select * from people_crm";
+        parseAndPrint(parser, q);
+
+        System.out.println("--------------");
+        q = "select p1.age, p2.age from people_crm as p1, people_crm as p2 where p1.age < p2.age";
+        parseAndPrint(parser, q);
+
+        System.out.println("--------------");
+        q = "select age, count(*) from (select * from people_crm where name like 'abc%') as q where q.age > 10";
+        parseAndPrint(parser, q);
+    }
+
+    private static void parseAndPrint(Parser parser, String q) {
+        Subquery subquery = (Subquery) parser.parseExpression(q);
+
+        Select select = (Select) subquery.getQuery();
+
+        java.util.Set<Table> tables = select.getTables();
+        boolean distinct = select.isDistinctQuery();
+        List<Expression> projections = select.getProjections();
+        Expression where = select.getCondition();
+        List<Expression> groups = select.getGroupBy();
+        Expression having = select.getHaving();
+        List<SelectOrderBy> sorts = select.getOrderList();
+        Expression limit = select.getLimit();
+        Expression offset = select.getOffset();
+
+        System.out.println("Testing:\n" + q);
+
+        System.out.println("\nFull AST:\n" + select.getPlanSQL());
+
+        System.out.println("\nComponents:");
+        System.out.println("Tables:\n" + tables);
+        System.out.println("\nDistinct:\n" + distinct);
+        System.out.println("\nProjections:\n" + projections);
+        System.out.println("\nWhere:\n" + where);
+        System.out.println("\nGroups:\n" + groups);
+        System.out.println("\nHaving:\n" + having);
+        System.out.print("\nSorts:\n");
+        if (sorts != null) {
+            for (SelectOrderBy sort : sorts) {
+                System.out.print(sort.getSQL() + " ");
+            }
+            System.out.println();
+        }
+        System.out.println("\nLimit:\n" + limit);
+        System.out.println("\nOffset:\n" + offset);
+    }
+}
Index: src/main/org/h2/command/dml/Select.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>windows-1252
===================================================================
--- src/main/org/h2/command/dml/Select.java	(revision 4750)
+++ src/main/org/h2/command/dml/Select.java	(revision )
@@ -6,10 +6,6 @@
  */
 package org.h2.command.dml;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
 import org.h2.api.Trigger;
 import org.h2.command.CommandInterface;
 import org.h2.constant.ErrorCode;
@@ -17,28 +13,13 @@
 import org.h2.engine.Constants;
 import org.h2.engine.Database;
 import org.h2.engine.Session;
-import org.h2.expression.Comparison;
-import org.h2.expression.ConditionAndOr;
-import org.h2.expression.Expression;
-import org.h2.expression.ExpressionColumn;
-import org.h2.expression.ExpressionVisitor;
-import org.h2.expression.Parameter;
-import org.h2.expression.Wildcard;
+import org.h2.expression.*;
 import org.h2.index.Cursor;
 import org.h2.index.Index;
 import org.h2.index.IndexType;
 import org.h2.message.DbException;
-import org.h2.result.LocalResult;
-import org.h2.result.ResultInterface;
-import org.h2.result.ResultTarget;
-import org.h2.result.Row;
-import org.h2.result.SearchRow;
-import org.h2.result.SortOrder;
-import org.h2.table.Column;
-import org.h2.table.ColumnResolver;
-import org.h2.table.IndexColumn;
-import org.h2.table.Table;
-import org.h2.table.TableFilter;
+import org.h2.result.*;
+import org.h2.table.*;
 import org.h2.util.New;
 import org.h2.util.StatementBuilder;
 import org.h2.util.StringUtils;
@@ -47,6 +28,8 @@
 import org.h2.value.ValueArray;
 import org.h2.value.ValueNull;
 
+import java.util.*;
+
 /**
  * This class represents a simple SELECT statement.
  *
@@ -128,6 +111,18 @@
     }
 
     public ArrayList<Expression> getGroupBy() {
+        if (group == null && groupByExpression != null) {
+            ArrayList<Expression> list = new ArrayList<Expression>(groupByExpression.length);
+            int i = 0;
+            for (boolean isGroup : groupByExpression) {
+                if (isGroup) {
+                    list.add(expressions.get(i));
+                }
+                i++;
+            }
+            return list;
+        }
+
         return group;
     }
 
@@ -1090,10 +1085,34 @@
         this.having = having;
     }
 
+    public List<Expression> getProjections(){
+        return (visibleColumnCount < expressions.size()) ? expressions.subList(0, visibleColumnCount) : expressions;
+    }
+
+    public Expression getCondition() {
+        return condition;
+    }
+
     public Expression getHaving() {
+        if (having == null && havingIndex >= 0) {
+            return expressions.get(havingIndex);
+        }
+
         return having;
     }
 
+    public boolean isGroupQuery() {
+        return isGroupQuery;
+    }
+
+    public boolean isDistinctQuery() {
+        return distinct;
+    }
+
+    public ArrayList<SelectOrderBy> getOrderList() {
+        return orderList;
+    }
+
     public int getColumnCount() {
         return visibleColumnCount;
     }
@@ -1276,5 +1295,4 @@
     public SortOrder getSortOrder() {
         return sort;
     }
-
 }

Reply via email to