[teiid-commits] teiid SVN: r3234 - in trunk: build/kits/jboss-container and 7 other directories.

teiid-commits at lists.jboss.org teiid-commits at lists.jboss.org
Wed Jun 8 12:54:24 EDT 2011


Author: shawkins
Date: 2011-06-08 12:54:23 -0400 (Wed, 08 Jun 2011)
New Revision: 3234

Added:
   trunk/engine/src/test/java/org/teiid/query/parser/TestLimitParsing.java
Modified:
   trunk/api/src/main/java/org/teiid/language/SQLConstants.java
   trunk/build/kits/jboss-container/teiid-releasenotes.html
   trunk/documentation/reference/src/main/docbook/en-US/content/sql_support.xml
   trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/LanguageBridgeFactory.java
   trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java
   trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj
   trunk/engine/src/test/java/org/teiid/query/parser/TestParser.java
   trunk/engine/src/test/java/org/teiid/query/processor/TestProcessor.java
   trunk/engine/src/test/java/org/teiid/query/processor/relational/TestLimitNode.java
Log:
TEIID-1620 adding support for offset/fetch query clauses

Modified: trunk/api/src/main/java/org/teiid/language/SQLConstants.java
===================================================================
--- trunk/api/src/main/java/org/teiid/language/SQLConstants.java	2011-06-08 16:02:59 UTC (rev 3233)
+++ trunk/api/src/main/java/org/teiid/language/SQLConstants.java	2011-06-08 16:54:23 UTC (rev 3234)
@@ -273,6 +273,7 @@
 	    public static final String NUMERIC = "NUMERIC"; //$NON-NLS-1$
 	    public static final String OBJECT = "OBJECT"; //$NON-NLS-1$
 		public static final String OF = "OF"; //$NON-NLS-1$
+		public static final String OFFSET = "OFFSET"; //$NON-NLS-1$
 		public static final String OLD = "OLD"; //$NON-NLS-1$
 		public static final String ON = "ON"; //$NON-NLS-1$
 		public static final String ONLY = "ONLY"; //$NON-NLS-1$

Modified: trunk/build/kits/jboss-container/teiid-releasenotes.html
===================================================================
--- trunk/build/kits/jboss-container/teiid-releasenotes.html	2011-06-08 16:02:59 UTC (rev 3233)
+++ trunk/build/kits/jboss-container/teiid-releasenotes.html	2011-06-08 16:54:23 UTC (rev 3234)
@@ -30,6 +30,7 @@
 	<LI><B>MAKEIND Hint</B> - The MAKEIND hint can be used to indicate that the other side of the join should be made dependent.
     <LI><B>ODBC SSL</B> - added support for SSL encrypted ODBC connections.
 	<LI><B>Reauthentication Statement</B> - SET SESSION AUTHORIZATION can now be used to perform a reauthentication via JDBC or ODBC.
+	<LI><B>ANSI OFFSET/FETCH FIRST</B> - instead of the limit clause, a standard OFFSET and/or FETCH FIRST/NEXT clause can be used to limit results.
 </UL>
 <h2><a name="Compatibility">Compatibility Issues</a></h2>
 <ul>
@@ -38,6 +39,11 @@
   <li>Support for using the FROM clause post item hints MAKEDEP/MAKENOTDEP has been deprecated.  Use the pre item comment hint syntax instead, e.g. /*+ MAKEDEP */ tbl
 </ul>
 
+<h4>from 7.4</h4>
+<ul>
+  <li>OFFSET was added as a keyword. 
+</ul>
+
 <h4>from 7.3</h4>
 <ul>
   <li>SYS.PROPERTIES has a new column, ClobValue, to get values exceeding the max string length

Modified: trunk/documentation/reference/src/main/docbook/en-US/content/sql_support.xml
===================================================================
--- trunk/documentation/reference/src/main/docbook/en-US/content/sql_support.xml	2011-06-08 16:02:59 UTC (rev 3233)
+++ trunk/documentation/reference/src/main/docbook/en-US/content/sql_support.xml	2011-06-08 16:54:23 UTC (rev 3234)
@@ -445,7 +445,7 @@
         </listitem>
         <listitem>  
           <para>
-            <link linkend="limit_clause">[LIMIT [offset,] limit]</link>
+            <link linkend="limit_clause">[(LIMIT ...) | ([OFFSET ...] [FETCH ...])]</link>
           </para>
         </listitem>
         <listitem>  
@@ -1032,13 +1032,27 @@
     <section id="limit_clause">
       <title>LIMIT Clause</title>
       <para>
-      The LIMIT clause specifies a limit on the number of records returned from the SELECT command. An optional offset (the number of rows to skip) can be specified. 
+      The LIMIT clause specifies a limit on the number of records returned from the SELECT command. An optional offset (the number of rows to skip) can be specified.  The LIMIT clause can also be specfied using the SQL 2008 OFFSET/FETCH FIRST clauses.  
+      If an ORDER BY is also specified, it will be applied before the OFFSET/LIMIT are applied.  If an ORDER BY is not specified there is generally no guarantee what subset of rows will be returned.
       </para>
       <para>
         Usage:
         <synopsis label="Usage">LIMIT [offset,] limit</synopsis>
+        <synopsis label="Usage">[OFFSET offset ROW|ROWS] [FETCH FIRST|NEXT [limit] ROW|ROWS ONLY</synopsis>
       </para>
       <itemizedlist>
+        <para>Syntax Rules:
+        </para>
+        <listitem>
+          <para>The limit/offset expressions must be a non-negative integer or a parameter reference (?).  An offset of 0 is ignored.  A limit of 0 will return no rows.
+          </para>
+        </listitem>
+        <listitem>
+          <para>The terms FIRST/NEXT are interchangable as well as ROW/ROWS.
+          </para>
+        </listitem>
+      </itemizedlist>
+      <itemizedlist>
         <para>Examples:
         </para>
         <listitem>
@@ -1047,6 +1061,15 @@
         <listitem>
           <para>LIMIT 500, 100 - skips 500 records and returns the next 100 records (rows 501-600)</para>
         </listitem>
+        <listitem>
+          <para>OFFSET 500 ROWS - skips 500 records</para>
+        </listitem>
+        <listitem>
+          <para>OFFSET 500 ROWS FETCH NEXT 100 ROWS ONLY - skips 500 records and returns the next 100 records (rows 501-600)</para>
+        </listitem>
+        <listitem>
+          <para>FETCH FIRST ROW ONLY - returns only the first record</para>
+        </listitem>
       </itemizedlist>
     </section>
     <section id="into_clause">

Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/LanguageBridgeFactory.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/LanguageBridgeFactory.java	2011-06-08 16:02:59 UTC (rev 3233)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/LanguageBridgeFactory.java	2011-06-08 16:54:23 UTC (rev 3234)
@@ -762,7 +762,10 @@
             rowOffset = ((Integer)c1.getValue()).intValue();
         }
         Literal c2 = (Literal)translate(limit.getRowLimit());
-        int rowLimit = ((Integer)c2.getValue()).intValue();
+        int rowLimit = Integer.MAX_VALUE;
+        if (c2 != null) {
+        	rowLimit = ((Integer)c2.getValue()).intValue();
+        }
         return new org.teiid.language.Limit(rowOffset, rowLimit);
     }
 }

Modified: trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java	2011-06-08 16:02:59 UTC (rev 3233)
+++ trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java	2011-06-08 16:54:23 UTC (rev 3234)
@@ -1706,6 +1706,14 @@
     }
 
     public void visit( Limit obj ) {
+    	if (obj.getRowLimit() == null) {
+    		append(OFFSET);
+    		append(SPACE);
+            visitNode(obj.getOffset());
+            append(SPACE);
+            append(ROWS);
+    		return;
+    	}
         append(LIMIT);
         if (obj.getOffset() != null) {
             append(SPACE);

Modified: trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj
===================================================================
--- trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj	2011-06-08 16:02:59 UTC (rev 3233)
+++ trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj	2011-06-08 16:54:23 UTC (rev 3234)
@@ -213,6 +213,7 @@
 |   <NOT: "not">
 |   <NULL: "null">
 |   <OF: "of">
+|   <OFFSET: "offset">
 |   <OLD: "old">
 |   <ON: "on">
 |   <ONLY: "only">
@@ -3157,41 +3158,63 @@
     }
 }
 
+Expression intParam(ParseInfo info) :
+{
+   Integer val = null;
+}
+{
+   (val = intVal() | <QMARK>)
+   {
+     if (val == null) {
+       return new Reference(info.referenceCount++);
+     } 
+     return new Constant(val, DataTypeManager.DefaultDataClasses.INTEGER);
+   }
+}
+
 /** 
  * <p>Parse an LIMIT clause.</p>
  * @return Parsed LIMIT
-  * @throws ParseException if parsing failed
+ * @throws ParseException if parsing failed
  */
 Limit limit(ParseInfo info) :
 {
-	Token val = null;
-	Token rowLimit = null;
-	Token ref = null;
-	Expression expr1 = null;
-	Expression expr2 = null;
+	Expression limit = null;
+	Expression offset = null;
 }
 {
-	<LIMIT>
-	(val=<INTEGERVAL> | <QMARK>)
-	[<COMMA> (rowLimit=<INTEGERVAL> | ref=<QMARK>)]
+    ((<LIMIT> offset = intParam(info)
+	[<COMMA> limit = intParam(info)])
 	{
-	    if (val == null) {
-	        expr1 = new Reference(info.referenceCount++);
-	    } else {
-	        expr1 = new Constant(Integer.valueOf(val.image), DataTypeManager.DefaultDataClasses.INTEGER);
-	    }
-		if (rowLimit == null && ref == null) {
-		    return new Limit(null, expr1);
-		}
-		if (rowLimit == null) {
-		    expr2 = new Reference(info.referenceCount++);
-		} else {
-	        expr2 = new Constant(Integer.valueOf(rowLimit.image), DataTypeManager.DefaultDataClasses.INTEGER);
-		}
-		return new Limit(expr1, expr2);
+	  if (limit == null) {
+	    limit = offset;
+	    offset = null;
+	  }
 	}
+	|
+	(<OFFSET> offset = intParam(info) (<ROW>|<ROWS>) 
+    [limit = fetchLimit(info)])
+    |
+    (limit = fetchLimit(info)))
+	{
+		return new Limit(offset, limit);
+	}
 }
 
+Expression fetchLimit(ParseInfo info) :
+{
+    Expression limit = null;
+}
+{
+    <FETCH> nonReserved("FIRST", "NEXT") [limit = intParam(info)] (<ROW>|<ROWS>) <ONLY>
+    {
+      if (limit == null) {
+        return new Constant(1, DataTypeManager.DefaultDataClasses.INTEGER); 
+      }
+      return limit;
+    }
+}
+
 /** 
  * <p>Parse an OPTION clause.</p>
  * @return Parsed OPTION clause

Added: trunk/engine/src/test/java/org/teiid/query/parser/TestLimitParsing.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/parser/TestLimitParsing.java	                        (rev 0)
+++ trunk/engine/src/test/java/org/teiid/query/parser/TestLimitParsing.java	2011-06-08 16:54:23 UTC (rev 3234)
@@ -0,0 +1,145 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA.
+ */
+
+package org.teiid.query.parser;
+
+import static org.teiid.query.parser.TestParser.*;
+
+import java.util.Arrays;
+
+import org.junit.Test;
+import org.teiid.query.sql.lang.From;
+import org.teiid.query.sql.lang.Limit;
+import org.teiid.query.sql.lang.Query;
+import org.teiid.query.sql.lang.Select;
+import org.teiid.query.sql.lang.SetQuery;
+import org.teiid.query.sql.lang.UnaryFromClause;
+import org.teiid.query.sql.lang.SetQuery.Operation;
+import org.teiid.query.sql.symbol.AllSymbol;
+import org.teiid.query.sql.symbol.Constant;
+import org.teiid.query.sql.symbol.GroupSymbol;
+import org.teiid.query.sql.symbol.Reference;
+
+public class TestLimitParsing {
+	
+    @Test public void testLimit() {
+        Query query = new Query();
+        Select select = new Select(Arrays.asList(new AllSymbol()));
+        From from = new From(Arrays.asList(new UnaryFromClause(new GroupSymbol("a")))); //$NON-NLS-1$
+        query.setSelect(select);
+        query.setFrom(from);
+        query.setLimit(new Limit(null, new Constant(new Integer(100))));
+        helpTest("Select * from a limit 100", "SELECT * FROM a LIMIT 100", query); //$NON-NLS-1$ //$NON-NLS-2$
+    }
+    
+    @Test public void testLimitWithOffset() {
+        Query query = new Query();
+        Select select = new Select(Arrays.asList(new AllSymbol()));
+        From from = new From(Arrays.asList(new UnaryFromClause(new GroupSymbol("a")))); //$NON-NLS-1$
+        query.setSelect(select);
+        query.setFrom(from);
+        query.setLimit(new Limit(new Constant(new Integer(50)), new Constant(new Integer(100))));
+        helpTest("Select * from a limit 50,100", "SELECT * FROM a LIMIT 50, 100", query); //$NON-NLS-1$ //$NON-NLS-2$
+    }
+    
+    @Test public void testLimitWithReferences1() {
+        Query query = new Query();
+        Select select = new Select(Arrays.asList(new AllSymbol()));
+        From from = new From(Arrays.asList(new UnaryFromClause(new GroupSymbol("a")))); //$NON-NLS-1$
+        query.setSelect(select);
+        query.setFrom(from);
+        query.setLimit(new Limit(new Reference(0), new Constant(new Integer(100))));
+        helpTest("Select * from a limit ?,100", "SELECT * FROM a LIMIT ?, 100", query); //$NON-NLS-1$ //$NON-NLS-2$
+    }
+    
+    @Test public void testLimitWithReferences2() {
+        Query query = new Query();
+        Select select = new Select(Arrays.asList(new AllSymbol()));
+        From from = new From(Arrays.asList(new UnaryFromClause(new GroupSymbol("a")))); //$NON-NLS-1$
+        query.setSelect(select);
+        query.setFrom(from);
+        query.setLimit(new Limit(new Constant(new Integer(50)), new Reference(0)));
+        helpTest("Select * from a limit 50,?", "SELECT * FROM a LIMIT 50, ?", query); //$NON-NLS-1$ //$NON-NLS-2$
+    }
+    
+    @Test public void testLimitWithReferences3() {
+        Query query = new Query();
+        Select select = new Select(Arrays.asList(new AllSymbol()));
+        From from = new From(Arrays.asList(new UnaryFromClause(new GroupSymbol("a")))); //$NON-NLS-1$
+        query.setSelect(select);
+        query.setFrom(from);
+        query.setLimit(new Limit(new Reference(0), new Reference(1)));
+        helpTest("Select * from a limit ?,?", "SELECT * FROM a LIMIT ?, ?", query); //$NON-NLS-1$ //$NON-NLS-2$
+    }
+    
+    @Test public void testSetQueryLimit() {
+        Query query = new Query();
+        Select select = new Select(Arrays.asList(new AllSymbol()));
+        From from = new From(Arrays.asList(new UnaryFromClause(new GroupSymbol("a")))); //$NON-NLS-1$
+        query.setSelect(select);
+        query.setFrom(from);
+        SetQuery setQuery = new SetQuery(Operation.UNION, true, query, query);
+        setQuery.setLimit(new Limit(new Reference(0), new Reference(1)));
+        helpTest("Select * from a union all Select * from a limit ?,?", "SELECT * FROM a UNION ALL SELECT * FROM a LIMIT ?, ?", setQuery); //$NON-NLS-1$ //$NON-NLS-2$
+    }
+    
+    @Test public void testOffset() {
+        Query query = new Query();
+        Select select = new Select(Arrays.asList(new AllSymbol()));
+        From from = new From(Arrays.asList(new UnaryFromClause(new GroupSymbol("a")))); //$NON-NLS-1$
+        query.setSelect(select);
+        query.setFrom(from);
+        query.setLimit(new Limit(new Reference(0), null));
+        helpTest("Select * from a offset ? rows", "SELECT * FROM a OFFSET ? ROWS", query); //$NON-NLS-1$ //$NON-NLS-2$
+    }
+    
+    @Test public void testFetchFirst() {
+        Query query = new Query();
+        Select select = new Select(Arrays.asList(new AllSymbol()));
+        From from = new From(Arrays.asList(new UnaryFromClause(new GroupSymbol("a")))); //$NON-NLS-1$
+        query.setSelect(select);
+        query.setFrom(from);
+        query.setLimit(new Limit(null, new Constant(2)));
+        helpTest("Select * from a fetch first 2 rows only", "SELECT * FROM a LIMIT 2", query); //$NON-NLS-1$ //$NON-NLS-2$
+    }
+    
+    @Test public void testFetchFirstRow() {
+        Query query = new Query();
+        Select select = new Select(Arrays.asList(new AllSymbol()));
+        From from = new From(Arrays.asList(new UnaryFromClause(new GroupSymbol("a")))); //$NON-NLS-1$
+        query.setSelect(select);
+        query.setFrom(from);
+        query.setLimit(new Limit(null, new Constant(1)));
+        helpTest("Select * from a fetch first row only", "SELECT * FROM a LIMIT 1", query); //$NON-NLS-1$ //$NON-NLS-2$
+    }
+    
+    @Test public void testOffsetFetch() {
+        Query query = new Query();
+        Select select = new Select(Arrays.asList(new AllSymbol()));
+        From from = new From(Arrays.asList(new UnaryFromClause(new GroupSymbol("a")))); //$NON-NLS-1$
+        query.setSelect(select);
+        query.setFrom(from);
+        query.setLimit(new Limit(new Constant(2), new Constant(5)));
+        helpTest("Select * from a offset 2 rows fetch first 5 rows only", "SELECT * FROM a LIMIT 2, 5", query); //$NON-NLS-1$ //$NON-NLS-2$
+    }
+
+}


Property changes on: trunk/engine/src/test/java/org/teiid/query/parser/TestLimitParsing.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain

Modified: trunk/engine/src/test/java/org/teiid/query/parser/TestParser.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/parser/TestParser.java	2011-06-08 16:02:59 UTC (rev 3233)
+++ trunk/engine/src/test/java/org/teiid/query/parser/TestParser.java	2011-06-08 16:54:23 UTC (rev 3234)
@@ -61,7 +61,6 @@
 import org.teiid.query.sql.lang.IsNullCriteria;
 import org.teiid.query.sql.lang.JoinPredicate;
 import org.teiid.query.sql.lang.JoinType;
-import org.teiid.query.sql.lang.Limit;
 import org.teiid.query.sql.lang.MatchCriteria;
 import org.teiid.query.sql.lang.NotCriteria;
 import org.teiid.query.sql.lang.OrderBy;
@@ -6434,56 +6433,6 @@
         }        
     }
     
-    @Test public void testLimit() {
-        Query query = new Query();
-        Select select = new Select(Arrays.asList(new AllSymbol()));
-        From from = new From(Arrays.asList(new UnaryFromClause(new GroupSymbol("a")))); //$NON-NLS-1$
-        query.setSelect(select);
-        query.setFrom(from);
-        query.setLimit(new Limit(null, new Constant(new Integer(100))));
-        helpTest("Select * from a limit 100", "SELECT * FROM a LIMIT 100", query); //$NON-NLS-1$ //$NON-NLS-2$
-    }
-    
-    @Test public void testLimitWithOffset() {
-        Query query = new Query();
-        Select select = new Select(Arrays.asList(new AllSymbol()));
-        From from = new From(Arrays.asList(new UnaryFromClause(new GroupSymbol("a")))); //$NON-NLS-1$
-        query.setSelect(select);
-        query.setFrom(from);
-        query.setLimit(new Limit(new Constant(new Integer(50)), new Constant(new Integer(100))));
-        helpTest("Select * from a limit 50,100", "SELECT * FROM a LIMIT 50, 100", query); //$NON-NLS-1$ //$NON-NLS-2$
-    }
-    
-    @Test public void testLimitWithReferences1() {
-        Query query = new Query();
-        Select select = new Select(Arrays.asList(new AllSymbol()));
-        From from = new From(Arrays.asList(new UnaryFromClause(new GroupSymbol("a")))); //$NON-NLS-1$
-        query.setSelect(select);
-        query.setFrom(from);
-        query.setLimit(new Limit(new Reference(0), new Constant(new Integer(100))));
-        helpTest("Select * from a limit ?,100", "SELECT * FROM a LIMIT ?, 100", query); //$NON-NLS-1$ //$NON-NLS-2$
-    }
-    
-    @Test public void testLimitWithReferences2() {
-        Query query = new Query();
-        Select select = new Select(Arrays.asList(new AllSymbol()));
-        From from = new From(Arrays.asList(new UnaryFromClause(new GroupSymbol("a")))); //$NON-NLS-1$
-        query.setSelect(select);
-        query.setFrom(from);
-        query.setLimit(new Limit(new Constant(new Integer(50)), new Reference(0)));
-        helpTest("Select * from a limit 50,?", "SELECT * FROM a LIMIT 50, ?", query); //$NON-NLS-1$ //$NON-NLS-2$
-    }
-    
-    @Test public void testLimitWithReferences3() {
-        Query query = new Query();
-        Select select = new Select(Arrays.asList(new AllSymbol()));
-        From from = new From(Arrays.asList(new UnaryFromClause(new GroupSymbol("a")))); //$NON-NLS-1$
-        query.setSelect(select);
-        query.setFrom(from);
-        query.setLimit(new Limit(new Reference(0), new Reference(1)));
-        helpTest("Select * from a limit ?,?", "SELECT * FROM a LIMIT ?, ?", query); //$NON-NLS-1$ //$NON-NLS-2$
-    }
-    
     @Test public void testEmptyOuterJoinCriteria() {
         helpException("select a from b left outer join c on ()"); //$NON-NLS-1$
     }

Modified: trunk/engine/src/test/java/org/teiid/query/processor/TestProcessor.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/processor/TestProcessor.java	2011-06-08 16:02:59 UTC (rev 3233)
+++ trunk/engine/src/test/java/org/teiid/query/processor/TestProcessor.java	2011-06-08 16:54:23 UTC (rev 3234)
@@ -6740,7 +6740,28 @@
         helpProcess(plan, manager, expected);
         assertEquals("SELECT g_0.e3 AS c_0, g_0.e2 AS c_1 FROM pm1.g1 AS g_0 ORDER BY c_1", manager.getQueries().iterator().next()); //$NON-NLS-1$
     }
+    
+    @Test public void testSortWithOffset() {
+        String sql = "select e1 from (select pm1.g1.e1, pm1.g1.e2 from pm1.g1 order by pm1.g1.e1, pm1.g1.e2 offset 4 rows) x"; //$NON-NLS-1$
+        
+        QueryMetadataInterface metadata = RealMetadataFactory.example1Cached();
+        FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder();
+        BasicSourceCapabilities caps = new BasicSourceCapabilities();
+        caps.setCapabilitySupport(Capability.ROW_OFFSET, true);
+        caps.setCapabilitySupport(Capability.QUERY_ORDERBY, true);
+        capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$
+        
+        ProcessorPlan plan = helpGetPlan(helpParse(sql), metadata, capFinder);
+        
+        List[] expected = new List[] {
+                Arrays.asList(new Object[] { "a"}),
+        };
 
+        HardcodedDataManager manager = new HardcodedDataManager(RealMetadataFactory.example1Cached());
+        manager.addData("SELECT g1.e1, g1.e2 FROM g1 ORDER BY g1.e1, g1.e2 LIMIT 4, 2147483647", new List[] {Arrays.asList("a", 1)});
+        helpProcess(plan, manager, expected);
+    }
+
     @Test public void testCountWithHaving() {
         String sql = "select e1, count(*) from pm1.g1 group by e1 having count(*) > 1"; //$NON-NLS-1$
         

Modified: trunk/engine/src/test/java/org/teiid/query/processor/relational/TestLimitNode.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/processor/relational/TestLimitNode.java	2011-06-08 16:02:59 UTC (rev 3233)
+++ trunk/engine/src/test/java/org/teiid/query/processor/relational/TestLimitNode.java	2011-06-08 16:54:23 UTC (rev 3234)
@@ -239,8 +239,8 @@
         assertTrue(batch.getTerminationFlag());
     }
     
-    static List[] getRows(int rows) {
-        List[] data = new List[rows];
+    static List<?>[] getRows(int rows) {
+        List<?>[] data = new List[rows];
         for (int i = 0; i < rows; i++) {
             data[i] = Arrays.asList(new Object[] {new Integer(i+1)});
         }



More information about the teiid-commits mailing list