You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@metamodel.apache.org by ka...@apache.org on 2019/02/26 06:21:02 UTC

[metamodel] branch master updated (2dd1ddc -> d6143ab)

This is an automated email from the ASF dual-hosted git repository.

kaspersor pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/metamodel.git.


    from 2dd1ddc  Corrections as per review by @LosD
     add 904b8f6  Call ResultSet.close() method when after getting result from  resultSet, otherwise it will cause memory overflow.(for example use impala  jdbc)
     add 60de228  Empty commit to trigger rebuild
     add cc2b322  Call ResultSet.close() method when after getting result from  resultSet, otherwise it will cause memory overflow.(for example use impala  jdbc)
     add a69f2d5  Call ResultSet.close() method when after getting result from  resultSet, otherwise it will cause memory overflow.(for example use impala  jdbc)
     add a861564  Empty commit to trigger rebuild
     add 414f577  Call ResultSet.close() method when after getting result from  resultSet, otherwise it will cause memory overflow.(for example use impala  jdbc)
     add 1b4857a  Call ResultSet.close() method when after getting result from  resultSet, otherwise it will cause memory overflow.(for example use impala  jdbc)
     new 2d682c2  Merge remote-tracking branch 'upstream/master'
     new 6ee4578  the result of column.getNativeType() may be null
     new 71a02aa  add pagination function to the Hive sql. 1.Version 1 only support row_number() ; 2.Version 2 support limit offset ,ref https://issues.apache.org/jira/browse/HIVE-11531
     new 0258e29  fix code style
     new 16a955f  thanks for your advise,I modify the code and add Rewriter for different Hive sersion.
     new cb28d7c  thanks for your advise,I modify the code.
     new b815ba0  Empty commit to trigger rebuild
     new 489d3a0  update license info
     new 4ad37b7  I change the code style,thanks for review.
     new e2d8d94  Empty commit to trigger rebuild
     new d6143ab  Merge remote-tracking branch 'q977734161/master'

The 11 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../org/apache/metamodel/jdbc/JdbcDataContext.java | 23 +++++-
 .../metamodel/jdbc/dialects/DB2QueryRewriter.java  | 30 +-------
 ...eQueryRewriter.java => Hive2QueryRewriter.java} | 19 +++--
 .../metamodel/jdbc/dialects/HiveQueryRewriter.java | 27 ++++++-
 .../jdbc/dialects/RowNumberQueryRewriter.java      | 66 ++++++++++++++++
 .../metamodel/dialects/HiveQueryRewriterTest.java  | 88 ++++++++++++++++++++++
 6 files changed, 216 insertions(+), 37 deletions(-)
 copy jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/{HiveQueryRewriter.java => Hive2QueryRewriter.java} (78%)
 create mode 100644 jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/RowNumberQueryRewriter.java
 create mode 100644 jdbc/src/test/java/org/apache/metamodel/dialects/HiveQueryRewriterTest.java


[metamodel] 04/11: fix code style

Posted by ka...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

kaspersor pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/metamodel.git

commit 0258e2979c9b13d1dbb9283074268f2f5f2615c6
Author: 李小保 <li...@mininglamp.com>
AuthorDate: Tue Jan 29 16:22:57 2019 +0800

    fix code style
---
 .../metamodel/jdbc/dialects/HiveQueryRewriter.java       | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/HiveQueryRewriter.java b/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/HiveQueryRewriter.java
index 3f28aac..48d3eb8 100644
--- a/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/HiveQueryRewriter.java
+++ b/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/HiveQueryRewriter.java
@@ -46,7 +46,7 @@ public class HiveQueryRewriter extends DefaultQueryRewriter {
 
     @Override
     public final boolean isFirstRowSupported(final Query query) {
-        switch (majorVersion){
+        switch (majorVersion) {
             case 2:
             case 3:
                 return true;
@@ -57,7 +57,7 @@ public class HiveQueryRewriter extends DefaultQueryRewriter {
 
     @Override
     public final boolean isMaxRowsSupported() {
-        switch (majorVersion){
+        switch (majorVersion) {
             case 2:
             case 3:
                 return true;
@@ -74,7 +74,7 @@ public class HiveQueryRewriter extends DefaultQueryRewriter {
      */
     @Override
     public String rewriteQuery(Query query) {
-        switch (majorVersion){
+        switch (majorVersion) {
             case 2:
             case 3:
                 return rewriteQueryForHive2(query);
@@ -84,13 +84,13 @@ public class HiveQueryRewriter extends DefaultQueryRewriter {
 
     }
 
-    private String rewriteQueryForHive1(Query query){
+    private String rewriteQueryForHive1(Query query) {
 
         Integer maxRows = query.getMaxRows();
         Integer firstRow = query.getFirstRow();
 
-        if(firstRow != null && firstRow > 1){
-            if(query.getOrderByClause().getItemCount() == 0){
+        if(firstRow != null && firstRow > 1) {
+            if(query.getOrderByClause().getItemCount() == 0) {
                 throw new MetaModelException("OFFSET requires an ORDER BY clause");
             }
         }
@@ -136,11 +136,11 @@ public class HiveQueryRewriter extends DefaultQueryRewriter {
 
     }
 
-    private String rewriteQueryForHive2(Query query){
+    private String rewriteQueryForHive2(Query query) {
         Integer maxRows = query.getMaxRows();
         Integer firstRow = query.getFirstRow();
 
-        if(firstRow != null && firstRow > 1){
+        if(firstRow != null && firstRow > 1) {
             if(query.getOrderByClause().getItemCount() == 0){
                 throw new MetaModelException("OFFSET requires an ORDER BY clause");
             }


[metamodel] 01/11: Merge remote-tracking branch 'upstream/master'

Posted by ka...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

kaspersor pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/metamodel.git

commit 2d682c2bd025776f623a7c4c6cbd0298e2b894fa
Merge: 1b4857a ed5ca25
Author: 李小保 <li...@mininglamp.com>
AuthorDate: Wed Jan 23 15:29:53 2019 +0800

    Merge remote-tracking branch 'upstream/master'
    
    # Conflicts:
    #	jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcDataContext.java

 CHANGES.md                                                        | 4 ++++
 jdbc/pom.xml                                                      | 2 +-
 jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcDataContext.java | 4 ++--
 3 files changed, 7 insertions(+), 3 deletions(-)


[metamodel] 09/11: I change the code style,thanks for review.

Posted by ka...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

kaspersor pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/metamodel.git

commit 4ad37b77e3eb3fbe8b072c534aee16c94466f0cc
Author: 李小保 <li...@mininglamp.com>
AuthorDate: Mon Feb 25 08:57:20 2019 +0800

    I change the code style,thanks for review.
---
 .../java/org/apache/metamodel/jdbc/dialects/HiveQueryRewriter.java   | 3 ---
 .../org/apache/metamodel/jdbc/dialects/RowNumberQueryRewriter.java   | 2 --
 .../java/org/apache/metamodel/dialects/HiveQueryRewriterTest.java    | 5 +++--
 3 files changed, 3 insertions(+), 7 deletions(-)

diff --git a/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/HiveQueryRewriter.java b/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/HiveQueryRewriter.java
index f134656..4eed234 100644
--- a/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/HiveQueryRewriter.java
+++ b/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/HiveQueryRewriter.java
@@ -55,9 +55,6 @@ public class HiveQueryRewriter extends RowNumberQueryRewriter {
 
     }
 
-
-
-
     @Override
     public String rewriteColumnType(ColumnType columnType, Integer columnSize) {
         if (columnType == ColumnType.INTEGER) {
diff --git a/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/RowNumberQueryRewriter.java b/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/RowNumberQueryRewriter.java
index 9788d03..aad2c07 100644
--- a/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/RowNumberQueryRewriter.java
+++ b/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/RowNumberQueryRewriter.java
@@ -49,7 +49,6 @@ public class RowNumberQueryRewriter extends DefaultQueryRewriter {
             outerQuery.select(new SelectItem(selectItem, subQuerySelectItem));
         }
 
-
         final String rewrittenOrderByClause = rewriteOrderByClause(innerQuery, innerQuery.getOrderByClause());
         final String rowOver = "ROW_NUMBER() OVER(" + rewrittenOrderByClause + ")";
         innerQuery.select(new SelectItem(rowOver, "metamodel_row_number"));
@@ -64,5 +63,4 @@ public class RowNumberQueryRewriter extends DefaultQueryRewriter {
         return baseQueryString + " WHERE metamodel_row_number BETWEEN " + firstRow + " AND "
                 + (firstRow - 1 + maxRows);
     }
-
 }
diff --git a/jdbc/src/test/java/org/apache/metamodel/dialects/HiveQueryRewriterTest.java b/jdbc/src/test/java/org/apache/metamodel/dialects/HiveQueryRewriterTest.java
index c4bc753..2098350 100644
--- a/jdbc/src/test/java/org/apache/metamodel/dialects/HiveQueryRewriterTest.java
+++ b/jdbc/src/test/java/org/apache/metamodel/dialects/HiveQueryRewriterTest.java
@@ -45,7 +45,6 @@ import org.junit.Assert;
 
 public class HiveQueryRewriterTest extends TestCase {
 
-
     @Override
     protected void setUp() throws Exception {
         super.setUp();
@@ -65,6 +64,7 @@ public class HiveQueryRewriterTest extends TestCase {
         Query q = new Query().from(new MutableTable("5_t_kk_kkxx")).select(col1).select(col2)
                 .where(col1, OperatorType.EQUALS_TO, "5207281832").orderBy(col1).setFirstRow(5).setMaxRows(9);
         String sql = qr.rewriteQuery(q);
+
         assertEquals(sql,"SELECT metamodel_subquery.kkbh, metamodel_subquery.kkmc FROM (SELECT kkbh, kkmc, ROW_NUMBER() OVER( ORDER BY kkbh ASC) AS metamodel_row_number FROM 5_t_kk_kkxx WHERE kkbh = '5207281832') metamodel_subquery WHERE metamodel_row_number BETWEEN 5 AND 13");
     }
 
@@ -82,6 +82,7 @@ public class HiveQueryRewriterTest extends TestCase {
         Query q = new Query().from(new MutableTable("5_t_kk_kkxx")).select(col1).select(col2)
                 .where(col1, OperatorType.EQUALS_TO, "5207281832").orderBy(col1).setFirstRow(5).setMaxRows(9);
         String sql = qr.rewriteQuery(q);
+
         assertEquals(sql,"SELECT kkbh, kkmc FROM 5_t_kk_kkxx WHERE kkbh = '5207281832' ORDER BY kkbh ASC LIMIT 9 OFFSET 4");
     }
-}
\ No newline at end of file
+}


[metamodel] 07/11: Empty commit to trigger rebuild

Posted by ka...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

kaspersor pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/metamodel.git

commit b815ba0e69e720e4599df260d285c06c6353fafb
Author: 李小保 <li...@mininglamp.com>
AuthorDate: Mon Feb 18 09:54:42 2019 +0800

    Empty commit to trigger rebuild


[metamodel] 02/11: the result of column.getNativeType() may be null

Posted by ka...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

kaspersor pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/metamodel.git

commit 6ee457836cbfa88b018fb1faaf0cadb4d0994c99
Author: 李小保 <li...@mininglamp.com>
AuthorDate: Wed Jan 23 15:33:13 2019 +0800

    the result of column.getNativeType() may be null
---
 .../jdbc/dialects/PostgresqlQueryRewriter.java     | 26 ++++++++++++----------
 1 file changed, 14 insertions(+), 12 deletions(-)

diff --git a/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/PostgresqlQueryRewriter.java b/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/PostgresqlQueryRewriter.java
index 7fe03cb..9289702 100644
--- a/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/PostgresqlQueryRewriter.java
+++ b/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/PostgresqlQueryRewriter.java
@@ -106,18 +106,20 @@ public class PostgresqlQueryRewriter extends LimitOffsetQueryRewriter {
 
     @Override
     public Object getResultSetValue(ResultSet resultSet, int columnIndex, Column column) throws SQLException {
-        switch (column.getNativeType()) {
-        case "json":
-        case "jsonb":
-            assert column.getType() == ColumnType.MAP;
-            final String stringValue = resultSet.getString(columnIndex);
-            if (stringValue == null) {
-                return null;
-            }
-            try {
-                return jsonObjectMapper.readValue(stringValue, Map.class);
-            } catch (Exception e) {
-                throw new IllegalArgumentException("Unable to read string as JSON: " + stringValue);
+        if (column.getNativeType() != null) {
+            switch (column.getNativeType()) {
+            case "json":
+            case "jsonb":
+                assert column.getType() == ColumnType.MAP;
+                final String stringValue = resultSet.getString(columnIndex);
+                if (stringValue == null) {
+                    return null;
+                }
+                try {
+                    return jsonObjectMapper.readValue(stringValue, Map.class);
+                } catch (Exception e) {
+                    throw new IllegalArgumentException("Unable to read string as JSON: " + stringValue);
+                }
             }
         }
         return super.getResultSetValue(resultSet, columnIndex, column);


[metamodel] 10/11: Empty commit to trigger rebuild

Posted by ka...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

kaspersor pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/metamodel.git

commit e2d8d94a0c082bb9a0a9c01ceb3c378bd68da372
Author: 李小保 <li...@mininglamp.com>
AuthorDate: Mon Feb 25 09:28:28 2019 +0800

    Empty commit to trigger rebuild


[metamodel] 11/11: Merge remote-tracking branch 'q977734161/master'

Posted by ka...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

kaspersor pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/metamodel.git

commit d6143abce42398efce70b0bf35f8e854e9820c72
Merge: 2dd1ddc e2d8d94
Author: Kasper Sørensen <i....@gmail.com>
AuthorDate: Mon Feb 25 22:19:59 2019 -0800

    Merge remote-tracking branch 'q977734161/master'

 .../org/apache/metamodel/jdbc/JdbcDataContext.java | 23 +++++-
 .../metamodel/jdbc/dialects/DB2QueryRewriter.java  | 30 +-------
 ...eQueryRewriter.java => Hive2QueryRewriter.java} | 19 +++--
 .../metamodel/jdbc/dialects/HiveQueryRewriter.java | 27 ++++++-
 .../jdbc/dialects/RowNumberQueryRewriter.java      | 66 ++++++++++++++++
 .../metamodel/dialects/HiveQueryRewriterTest.java  | 88 ++++++++++++++++++++++
 6 files changed, 216 insertions(+), 37 deletions(-)



[metamodel] 03/11: add pagination function to the Hive sql. 1.Version 1 only support row_number() ; 2.Version 2 support limit offset ,ref https://issues.apache.org/jira/browse/HIVE-11531

Posted by ka...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

kaspersor pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/metamodel.git

commit 71a02aa9bbfb7ed80a257ea6afa779e86fcc5135
Author: 李小保 <li...@mininglamp.com>
AuthorDate: Tue Jan 29 14:58:00 2019 +0800

    add pagination function to the Hive sql.
    1.Version 1 only support row_number() ;
    2.Version 2 support limit offset ,ref https://issues.apache.org/jira/browse/HIVE-11531
---
 .../metamodel/jdbc/dialects/HiveQueryRewriter.java | 136 +++++++++++++++++++++
 .../metamodel/dialects/HiveQueryRewriterTest.java  |  85 +++++++++++++
 2 files changed, 221 insertions(+)

diff --git a/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/HiveQueryRewriter.java b/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/HiveQueryRewriter.java
index 6944ab8..3f28aac 100644
--- a/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/HiveQueryRewriter.java
+++ b/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/HiveQueryRewriter.java
@@ -18,7 +18,12 @@
  */
 package org.apache.metamodel.jdbc.dialects;
 
+import java.util.List;
+import org.apache.metamodel.MetaModelException;
 import org.apache.metamodel.jdbc.JdbcDataContext;
+import org.apache.metamodel.query.FromItem;
+import org.apache.metamodel.query.Query;
+import org.apache.metamodel.query.SelectItem;
 import org.apache.metamodel.schema.ColumnType;
 
 /**
@@ -26,8 +31,139 @@ import org.apache.metamodel.schema.ColumnType;
  */
 public class HiveQueryRewriter extends DefaultQueryRewriter {
 
+    private int majorVersion;
+
     public HiveQueryRewriter(JdbcDataContext dataContext) {
         super(dataContext);
+        String version = dataContext.getDatabaseVersion();
+        String[] parts = version.split("\\.");
+        if(parts.length < 2) {
+            throw new RuntimeException("Illegal Hive Version: " + version + " (expected A.B.* format)");
+        } else {
+            majorVersion = Integer.valueOf(parts[0]);
+        }
+    }
+
+    @Override
+    public final boolean isFirstRowSupported(final Query query) {
+        switch (majorVersion){
+            case 2:
+            case 3:
+                return true;
+            default:
+                return super.isFirstRowSupported(query);
+        }
+    }
+
+    @Override
+    public final boolean isMaxRowsSupported() {
+        switch (majorVersion){
+            case 2:
+            case 3:
+                return true;
+            default:
+                return super.isMaxRowsSupported();
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * If the Max rows and/or First row property of the query is set, then we
+     * will use the database's LIMIT and OFFSET functions.
+     */
+    @Override
+    public String rewriteQuery(Query query) {
+        switch (majorVersion){
+            case 2:
+            case 3:
+                return rewriteQueryForHive2(query);
+            default:
+                return rewriteQueryForHive1(query);
+        }
+
+    }
+
+    private String rewriteQueryForHive1(Query query){
+
+        Integer maxRows = query.getMaxRows();
+        Integer firstRow = query.getFirstRow();
+
+        if(firstRow != null && firstRow > 1){
+            if(query.getOrderByClause().getItemCount() == 0){
+                throw new MetaModelException("OFFSET requires an ORDER BY clause");
+            }
+        }
+
+
+        if (maxRows == null && (firstRow == null || firstRow.intValue() == 1)) {
+            return super.rewriteQuery(query);
+        }
+
+        if ((firstRow == null || firstRow.intValue() == 1) && maxRows != null && maxRows > 0) {
+            // We prefer to use the "LIMIT n" approach, if
+            // firstRow is not specified.
+            return super.rewriteQuery(query) + " LIMIT " + maxRows;
+        }
+
+        final Query innerQuery = query.clone();
+        innerQuery.setFirstRow(null);
+        innerQuery.setMaxRows(null);
+
+        final Query outerQuery = new Query();
+        final FromItem subQuerySelectItem = new FromItem(innerQuery).setAlias("metamodel_subquery");
+        outerQuery.from(subQuerySelectItem);
+
+        final List<SelectItem> innerSelectItems = innerQuery.getSelectClause().getItems();
+        for (SelectItem selectItem : innerSelectItems) {
+            outerQuery.select(new SelectItem(selectItem, subQuerySelectItem));
+        }
+
+
+        final String rewrittenOrderByClause = rewriteOrderByClause(innerQuery, innerQuery.getOrderByClause());
+        final String rowOver = "ROW_NUMBER() " + "OVER(" + rewrittenOrderByClause + ")";
+        innerQuery.select(new SelectItem(rowOver, "metamodel_row_number"));
+        innerQuery.getOrderByClause().removeItems();
+
+        final String baseQueryString = rewriteQuery(outerQuery);
+
+        if (maxRows == null) {
+            return baseQueryString + " WHERE metamodel_row_number > " + (firstRow - 1);
+        }
+
+        return baseQueryString + " WHERE metamodel_row_number BETWEEN " + firstRow + " AND "
+                + (firstRow - 1 + maxRows);
+
+    }
+
+    private String rewriteQueryForHive2(Query query){
+        Integer maxRows = query.getMaxRows();
+        Integer firstRow = query.getFirstRow();
+
+        if(firstRow != null && firstRow > 1){
+            if(query.getOrderByClause().getItemCount() == 0){
+                throw new MetaModelException("OFFSET requires an ORDER BY clause");
+            }
+        }
+
+        String queryString = super.rewriteQuery(query);
+
+        if (maxRows != null || firstRow != null) {
+
+            if (maxRows == null) {
+                maxRows = Integer.MAX_VALUE;
+            }
+            queryString = queryString + " LIMIT " + maxRows;
+
+            if (firstRow != null && firstRow > 1) {
+                // offset is 0-based
+                int offset = firstRow - 1;
+                queryString = queryString + " OFFSET " + offset;
+            }
+        }
+
+        return queryString;
+
     }
 
     @Override
diff --git a/jdbc/src/test/java/org/apache/metamodel/dialects/HiveQueryRewriterTest.java b/jdbc/src/test/java/org/apache/metamodel/dialects/HiveQueryRewriterTest.java
new file mode 100644
index 0000000..423b120
--- /dev/null
+++ b/jdbc/src/test/java/org/apache/metamodel/dialects/HiveQueryRewriterTest.java
@@ -0,0 +1,85 @@
+/**
+ * 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.
+ */
+package org.apache.metamodel.dialects;
+
+import static org.apache.metamodel.jdbc.JdbcDataContext.DATABASE_PRODUCT_HIVE;
+import static org.apache.metamodel.jdbc.JdbcDataContext.DATABASE_PRODUCT_SQLSERVER;
+
+import junit.framework.TestCase;
+import org.apache.metamodel.jdbc.JdbcDataContext;
+import org.apache.metamodel.jdbc.dialects.HiveQueryRewriter;
+import org.apache.metamodel.jdbc.dialects.MysqlQueryRewriter;
+import org.apache.metamodel.jdbc.dialects.SQLServerQueryRewriter;
+import org.apache.metamodel.query.FilterItem;
+import org.apache.metamodel.query.FromItem;
+import org.apache.metamodel.query.OperatorType;
+import org.apache.metamodel.query.Query;
+import org.apache.metamodel.query.SelectItem;
+import org.apache.metamodel.schema.ColumnType;
+import org.apache.metamodel.schema.MutableColumn;
+import org.apache.metamodel.schema.MutableSchema;
+import org.apache.metamodel.schema.MutableTable;
+import org.apache.metamodel.util.TimeComparator;
+import org.easymock.EasyMock;
+import org.junit.Assert;
+
+public class HiveQueryRewriterTest extends TestCase {
+
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+
+    }
+
+    public void testHive1SqlWithPagination() {
+        final JdbcDataContext mockContext = EasyMock.createMock(JdbcDataContext.class);
+        EasyMock.expect(mockContext.getDatabaseProductName()).andReturn(DATABASE_PRODUCT_HIVE).anyTimes();
+        EasyMock.expect(mockContext.getDatabaseVersion()).andReturn("1.1.1.1").anyTimes();
+        EasyMock.expect(mockContext.getIdentifierQuoteString()).andReturn("quoteString").anyTimes();
+
+        EasyMock.replay(mockContext);
+        HiveQueryRewriter qr = new HiveQueryRewriter(mockContext);
+
+        MutableColumn col1 = new MutableColumn("kkbh");
+        MutableColumn col2 = new MutableColumn("kkmc");
+        Query q = new Query().from(new MutableTable("5_t_kk_kkxx")).select(col1).select(col2)
+                .where(col1, OperatorType.EQUALS_TO, "5207281832").orderBy(col1).setFirstRow(5).setMaxRows(9);
+        String sql = qr.rewriteQuery(q);
+        assertEquals(sql,"SELECT metamodel_subquery.kkbh, metamodel_subquery.kkmc FROM (SELECT kkbh, kkmc, ROW_NUMBER() OVER( ORDER BY kkbh ASC) AS metamodel_row_number FROM 5_t_kk_kkxx WHERE kkbh = '5207281832') metamodel_subquery WHERE metamodel_row_number BETWEEN 5 AND 13");
+    }
+
+    public void testHive2SqlWithPagination() {
+        final JdbcDataContext mockContext = EasyMock.createMock(JdbcDataContext.class);
+        EasyMock.expect(mockContext.getDatabaseProductName()).andReturn(DATABASE_PRODUCT_HIVE).anyTimes();
+        EasyMock.expect(mockContext.getDatabaseVersion()).andReturn("2.1.1.1").anyTimes();
+        EasyMock.expect(mockContext.getIdentifierQuoteString()).andReturn("quoteString").anyTimes();
+
+        EasyMock.replay(mockContext);
+        HiveQueryRewriter qr = new HiveQueryRewriter(mockContext);
+
+        MutableColumn col1 = new MutableColumn("kkbh");
+        MutableColumn col2 = new MutableColumn("kkmc");
+        Query q = new Query().from(new MutableTable("5_t_kk_kkxx")).select(col1).select(col2)
+                .where(col1, OperatorType.EQUALS_TO, "5207281832").orderBy(col1).setFirstRow(5).setMaxRows(9);
+        String sql = qr.rewriteQuery(q);
+        assertEquals(sql,"SELECT kkbh, kkmc FROM 5_t_kk_kkxx WHERE kkbh = '5207281832' ORDER BY kkbh ASC LIMIT 9 OFFSET 4");
+    }
+}
\ No newline at end of file


[metamodel] 08/11: update license info

Posted by ka...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

kaspersor pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/metamodel.git

commit 489d3a02464e04e92a3bc42909a58eaa8822e491
Author: 李小保 <li...@mininglamp.com>
AuthorDate: Thu Feb 21 08:04:07 2019 +0800

    update license info
---
 .../jdbc/dialects/RowNumberQueryRewriter.java      | 22 ++++++++++++++++++++--
 1 file changed, 20 insertions(+), 2 deletions(-)

diff --git a/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/RowNumberQueryRewriter.java b/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/RowNumberQueryRewriter.java
index 6544c09..9788d03 100644
--- a/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/RowNumberQueryRewriter.java
+++ b/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/RowNumberQueryRewriter.java
@@ -1,3 +1,21 @@
+/**
+ * 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.
+ */
 package org.apache.metamodel.jdbc.dialects;
 
 import java.util.List;
@@ -7,8 +25,8 @@ import org.apache.metamodel.query.Query;
 import org.apache.metamodel.query.SelectItem;
 
 /**
- * @author lixiaobao
- * @create 2019-02-01 12:01 AM
+ * Query rewriter for databases that support RowNumber keywords for max
+ * rows and first row properties.
  **/
 
 public class RowNumberQueryRewriter extends DefaultQueryRewriter {


[metamodel] 06/11: thanks for your advise,I modify the code.

Posted by ka...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

kaspersor pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/metamodel.git

commit cb28d7ce5ea98b10e900af5d72a742426b2ea0ce
Author: 李小保 <li...@mininglamp.com>
AuthorDate: Fri Feb 1 00:39:30 2019 +0800

    thanks for your advise,I modify the code.
---
 .../org/apache/metamodel/jdbc/JdbcDataContext.java | 32 +++++++-------
 .../metamodel/jdbc/dialects/DB2QueryRewriter.java  | 30 +------------
 .../jdbc/dialects/Hive2QueryRewriter.java          | 12 +++---
 .../metamodel/jdbc/dialects/HiveQueryRewriter.java | 38 ++--------------
 .../jdbc/dialects/RowNumberQueryRewriter.java      | 50 ++++++++++++++++++++++
 5 files changed, 77 insertions(+), 85 deletions(-)

diff --git a/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcDataContext.java b/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcDataContext.java
index 2f01f04..4329179 100644
--- a/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcDataContext.java
+++ b/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcDataContext.java
@@ -232,27 +232,27 @@ public class JdbcDataContext extends AbstractDataContext implements UpdateableDa
         } else if (DATABASE_PRODUCT_H2.equals(_databaseProductName)) {
             setQueryRewriter(new H2QueryRewriter(this));
         } else if (DATABASE_PRODUCT_HIVE.equals(_databaseProductName)) {
-            int majorVersion = 0;
+            int majorVersion = -1;
             String[] parts = databaseVersion.split("\\.");
-            if(parts.length < 2) {
+            if (parts.length < 2) {
                 logger.warn("Illegal Hive Version: " + databaseVersion + " (expected A.B.* format)");
-                parts[0] = "0";
             } else {
-                majorVersion = Integer.valueOf(parts[0]);
+                try {
+                    majorVersion = Integer.valueOf(parts[0]);
+                } catch (NumberFormatException ne) {
+                    logger.warn("Illegal Hive Major Version: " + databaseVersion + " (can not get major version)");
+                }
             }
-            switch (majorVersion){
-                case 1:
-                    setQueryRewriter(new HiveQueryRewriter(this));
-                    break;
-                case 2:
-                case 3:
-                    setQueryRewriter(new Hive2QueryRewriter(this));
-                    break;
-                default:
-                    setQueryRewriter(new HiveQueryRewriter(this));
-                    break;
+            if (majorVersion == -1) {
+                logger.warn("Illegal Hive Major Version :" + majorVersion + " can not decide which QueryRewrite to use, use DefaultQueryRewriter");
+                setQueryRewriter(new DefaultQueryRewriter(this));
+            } else if (majorVersion == 0 || majorVersion == 1) {
+                //version 0 or 1 use HiveQueryRewriter
+                setQueryRewriter(new HiveQueryRewriter(this));
+            } else if (majorVersion >= 2) {
+                //from version 2 support limit offset
+                setQueryRewriter(new Hive2QueryRewriter(this));
             }
-
         } else if (DATABASE_PRODUCT_SQLITE.equals(_databaseProductName)) {
             setQueryRewriter(new SQLiteQueryRewriter(this));
         } else {
diff --git a/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/DB2QueryRewriter.java b/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/DB2QueryRewriter.java
index 601bfd8..8f21692 100644
--- a/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/DB2QueryRewriter.java
+++ b/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/DB2QueryRewriter.java
@@ -34,7 +34,7 @@ import org.apache.metamodel.util.TimeComparator;
 /**
  * Query rewriter for IBM DB2
  */
-public class DB2QueryRewriter extends DefaultQueryRewriter {
+public class DB2QueryRewriter extends RowNumberQueryRewriter {
 
     public DB2QueryRewriter(JdbcDataContext dataContext) {
         super(dataContext);
@@ -86,33 +86,7 @@ public class DB2QueryRewriter extends DefaultQueryRewriter {
             // ROW_NUMBER() AS metamodel_row_number
             // FROM [remainder of regular query])
             // WHERE metamodel_row_number BETWEEN [firstRow] and [maxRows];
-
-            final Query innerQuery = query.clone();
-            innerQuery.setFirstRow(null);
-            innerQuery.setMaxRows(null);
-
-            final Query outerQuery = new Query();
-            final FromItem subQuerySelectItem = new FromItem(innerQuery).setAlias("metamodel_subquery");
-            outerQuery.from(subQuerySelectItem);
-
-            final List<SelectItem> innerSelectItems = innerQuery.getSelectClause().getItems();
-            for (SelectItem selectItem : innerSelectItems) {
-                outerQuery.select(new SelectItem(selectItem, subQuerySelectItem));
-            }
-
-            final String rewrittenOrderByClause = rewriteOrderByClause(innerQuery, innerQuery.getOrderByClause());
-            final String rowOver = "ROW_NUMBER() " + "OVER(" + rewrittenOrderByClause + ")";
-            innerQuery.select(new SelectItem(rowOver, "metamodel_row_number"));
-            innerQuery.getOrderByClause().removeItems();
-
-            final String baseQueryString = rewriteQuery(outerQuery);
-
-            if (maxRows == null) {
-                return baseQueryString + " WHERE metamodel_row_number > " + (firstRow - 1);
-            }
-
-            return baseQueryString + " WHERE metamodel_row_number BETWEEN " + firstRow + " AND "
-                    + (firstRow - 1 + maxRows);
+            return getRowNumberSql(query, maxRows, firstRow);
         }
     }
 
diff --git a/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/Hive2QueryRewriter.java b/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/Hive2QueryRewriter.java
index ec449bf..7db9de5 100644
--- a/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/Hive2QueryRewriter.java
+++ b/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/Hive2QueryRewriter.java
@@ -31,8 +31,6 @@ import org.apache.metamodel.schema.ColumnType;
  */
 public class Hive2QueryRewriter extends LimitOffsetQueryRewriter {
 
-    private int majorVersion;
-
     public Hive2QueryRewriter(JdbcDataContext dataContext) {
         super(dataContext);
     }
@@ -43,7 +41,7 @@ public class Hive2QueryRewriter extends LimitOffsetQueryRewriter {
             return "INT";
         }
 
-        if(columnType == ColumnType.STRING) {
+        if (columnType == ColumnType.STRING) {
             return "STRING";
         }
 
@@ -60,8 +58,8 @@ public class Hive2QueryRewriter extends LimitOffsetQueryRewriter {
         return false;
     }
     
-	@Override
-	public boolean isPrimaryKeySupported() {
-		return false;
-	}
+    @Override
+    public boolean isPrimaryKeySupported() {
+        return false;
+    }
 }
diff --git a/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/HiveQueryRewriter.java b/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/HiveQueryRewriter.java
index b187b77..f134656 100644
--- a/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/HiveQueryRewriter.java
+++ b/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/HiveQueryRewriter.java
@@ -29,7 +29,7 @@ import org.apache.metamodel.schema.ColumnType;
 /**
  * Query rewriter for Apache Hive
  */
-public class HiveQueryRewriter extends DefaultQueryRewriter {
+public class HiveQueryRewriter extends RowNumberQueryRewriter {
 
     public HiveQueryRewriter(JdbcDataContext dataContext) {
         super(dataContext);
@@ -41,12 +41,6 @@ public class HiveQueryRewriter extends DefaultQueryRewriter {
         Integer maxRows = query.getMaxRows();
         Integer firstRow = query.getFirstRow();
 
-        if(firstRow != null && firstRow > 1) {
-            if(query.getOrderByClause().getItemCount() == 0) {
-                throw new MetaModelException("OFFSET requires an ORDER BY clause");
-            }
-        }
-
         if (maxRows == null && (firstRow == null || firstRow.intValue() == 1)) {
             return super.rewriteQuery(query);
         }
@@ -55,37 +49,13 @@ public class HiveQueryRewriter extends DefaultQueryRewriter {
             // We prefer to use the "LIMIT n" approach, if
             // firstRow is not specified.
             return super.rewriteQuery(query) + " LIMIT " + maxRows;
+        } else {
+            return getRowNumberSql(query, maxRows, firstRow);
         }
 
-        final Query innerQuery = query.clone();
-        innerQuery.setFirstRow(null);
-        innerQuery.setMaxRows(null);
-
-        final Query outerQuery = new Query();
-        final FromItem subQuerySelectItem = new FromItem(innerQuery).setAlias("metamodel_subquery");
-        outerQuery.from(subQuerySelectItem);
-
-        final List<SelectItem> innerSelectItems = innerQuery.getSelectClause().getItems();
-        for (SelectItem selectItem : innerSelectItems) {
-            outerQuery.select(new SelectItem(selectItem, subQuerySelectItem));
-        }
-
-
-        final String rewrittenOrderByClause = rewriteOrderByClause(innerQuery, innerQuery.getOrderByClause());
-        final String rowOver = "ROW_NUMBER() " + "OVER(" + rewrittenOrderByClause + ")";
-        innerQuery.select(new SelectItem(rowOver, "metamodel_row_number"));
-        innerQuery.getOrderByClause().removeItems();
-
-        final String baseQueryString = rewriteQuery(outerQuery);
-
-        if (maxRows == null) {
-            return baseQueryString + " WHERE metamodel_row_number > " + (firstRow - 1);
-        }
+    }
 
-        return baseQueryString + " WHERE metamodel_row_number BETWEEN " + firstRow + " AND "
-                + (firstRow - 1 + maxRows);
 
-    }
 
 
     @Override
diff --git a/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/RowNumberQueryRewriter.java b/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/RowNumberQueryRewriter.java
new file mode 100644
index 0000000..6544c09
--- /dev/null
+++ b/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/RowNumberQueryRewriter.java
@@ -0,0 +1,50 @@
+package org.apache.metamodel.jdbc.dialects;
+
+import java.util.List;
+import org.apache.metamodel.jdbc.JdbcDataContext;
+import org.apache.metamodel.query.FromItem;
+import org.apache.metamodel.query.Query;
+import org.apache.metamodel.query.SelectItem;
+
+/**
+ * @author lixiaobao
+ * @create 2019-02-01 12:01 AM
+ **/
+
+public class RowNumberQueryRewriter extends DefaultQueryRewriter {
+
+    public RowNumberQueryRewriter(JdbcDataContext dataContext) {
+        super(dataContext);
+    }
+
+    protected String getRowNumberSql(Query query, Integer maxRows, Integer firstRow) {
+        final Query innerQuery = query.clone();
+        innerQuery.setFirstRow(null);
+        innerQuery.setMaxRows(null);
+
+        final Query outerQuery = new Query();
+        final FromItem subQuerySelectItem = new FromItem(innerQuery).setAlias("metamodel_subquery");
+        outerQuery.from(subQuerySelectItem);
+
+        final List<SelectItem> innerSelectItems = innerQuery.getSelectClause().getItems();
+        for (SelectItem selectItem : innerSelectItems) {
+            outerQuery.select(new SelectItem(selectItem, subQuerySelectItem));
+        }
+
+
+        final String rewrittenOrderByClause = rewriteOrderByClause(innerQuery, innerQuery.getOrderByClause());
+        final String rowOver = "ROW_NUMBER() OVER(" + rewrittenOrderByClause + ")";
+        innerQuery.select(new SelectItem(rowOver, "metamodel_row_number"));
+        innerQuery.getOrderByClause().removeItems();
+
+        final String baseQueryString = rewriteQuery(outerQuery);
+
+        if (maxRows == null) {
+            return baseQueryString + " WHERE metamodel_row_number > " + (firstRow - 1);
+        }
+
+        return baseQueryString + " WHERE metamodel_row_number BETWEEN " + firstRow + " AND "
+                + (firstRow - 1 + maxRows);
+    }
+
+}


[metamodel] 05/11: thanks for your advise, I modify the code and add Rewriter for different Hive sersion.

Posted by ka...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

kaspersor pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/metamodel.git

commit 16a955f84f605baba914e87f7a60331d908f76fa
Author: 李小保 <li...@mininglamp.com>
AuthorDate: Wed Jan 30 09:54:46 2019 +0800

    thanks for your advise,I modify the code and add Rewriter for different Hive sersion.
---
 .../org/apache/metamodel/jdbc/JdbcDataContext.java | 23 ++++++-
 .../jdbc/dialects/Hive2QueryRewriter.java          | 67 +++++++++++++++++++
 .../metamodel/jdbc/dialects/HiveQueryRewriter.java | 78 ----------------------
 .../metamodel/dialects/HiveQueryRewriterTest.java  |  8 ++-
 4 files changed, 94 insertions(+), 82 deletions(-)

diff --git a/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcDataContext.java b/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcDataContext.java
index 1668438..2f01f04 100644
--- a/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcDataContext.java
+++ b/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcDataContext.java
@@ -48,6 +48,7 @@ import org.apache.metamodel.jdbc.JdbcUtils.JdbcActionType;
 import org.apache.metamodel.jdbc.dialects.DB2QueryRewriter;
 import org.apache.metamodel.jdbc.dialects.DefaultQueryRewriter;
 import org.apache.metamodel.jdbc.dialects.H2QueryRewriter;
+import org.apache.metamodel.jdbc.dialects.Hive2QueryRewriter;
 import org.apache.metamodel.jdbc.dialects.HiveQueryRewriter;
 import org.apache.metamodel.jdbc.dialects.HsqldbQueryRewriter;
 import org.apache.metamodel.jdbc.dialects.IQueryRewriter;
@@ -231,7 +232,27 @@ public class JdbcDataContext extends AbstractDataContext implements UpdateableDa
         } else if (DATABASE_PRODUCT_H2.equals(_databaseProductName)) {
             setQueryRewriter(new H2QueryRewriter(this));
         } else if (DATABASE_PRODUCT_HIVE.equals(_databaseProductName)) {
-            setQueryRewriter(new HiveQueryRewriter(this));
+            int majorVersion = 0;
+            String[] parts = databaseVersion.split("\\.");
+            if(parts.length < 2) {
+                logger.warn("Illegal Hive Version: " + databaseVersion + " (expected A.B.* format)");
+                parts[0] = "0";
+            } else {
+                majorVersion = Integer.valueOf(parts[0]);
+            }
+            switch (majorVersion){
+                case 1:
+                    setQueryRewriter(new HiveQueryRewriter(this));
+                    break;
+                case 2:
+                case 3:
+                    setQueryRewriter(new Hive2QueryRewriter(this));
+                    break;
+                default:
+                    setQueryRewriter(new HiveQueryRewriter(this));
+                    break;
+            }
+
         } else if (DATABASE_PRODUCT_SQLITE.equals(_databaseProductName)) {
             setQueryRewriter(new SQLiteQueryRewriter(this));
         } else {
diff --git a/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/Hive2QueryRewriter.java b/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/Hive2QueryRewriter.java
new file mode 100644
index 0000000..ec449bf
--- /dev/null
+++ b/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/Hive2QueryRewriter.java
@@ -0,0 +1,67 @@
+/**
+ * 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.
+ */
+package org.apache.metamodel.jdbc.dialects;
+
+import java.util.List;
+import org.apache.metamodel.MetaModelException;
+import org.apache.metamodel.jdbc.JdbcDataContext;
+import org.apache.metamodel.query.FromItem;
+import org.apache.metamodel.query.Query;
+import org.apache.metamodel.query.SelectItem;
+import org.apache.metamodel.schema.ColumnType;
+
+/**
+ * Query rewriter for Apache Hive
+ */
+public class Hive2QueryRewriter extends LimitOffsetQueryRewriter {
+
+    private int majorVersion;
+
+    public Hive2QueryRewriter(JdbcDataContext dataContext) {
+        super(dataContext);
+    }
+
+    @Override
+    public String rewriteColumnType(ColumnType columnType, Integer columnSize) {
+        if (columnType == ColumnType.INTEGER) {
+            return "INT";
+        }
+
+        if(columnType == ColumnType.STRING) {
+            return "STRING";
+        }
+
+        // Hive does not support VARCHAR without a width, nor VARCHAR(MAX).
+        // Returning max allowable column size instead.
+        if (columnType == ColumnType.VARCHAR && columnSize == null) {
+            return super.rewriteColumnType(columnType, 65535);
+        }
+        return super.rewriteColumnType(columnType, columnSize);
+    }
+    
+    @Override
+    public boolean isTransactional() {
+        return false;
+    }
+    
+	@Override
+	public boolean isPrimaryKeySupported() {
+		return false;
+	}
+}
diff --git a/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/HiveQueryRewriter.java b/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/HiveQueryRewriter.java
index 48d3eb8..b187b77 100644
--- a/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/HiveQueryRewriter.java
+++ b/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/HiveQueryRewriter.java
@@ -31,60 +31,12 @@ import org.apache.metamodel.schema.ColumnType;
  */
 public class HiveQueryRewriter extends DefaultQueryRewriter {
 
-    private int majorVersion;
-
     public HiveQueryRewriter(JdbcDataContext dataContext) {
         super(dataContext);
-        String version = dataContext.getDatabaseVersion();
-        String[] parts = version.split("\\.");
-        if(parts.length < 2) {
-            throw new RuntimeException("Illegal Hive Version: " + version + " (expected A.B.* format)");
-        } else {
-            majorVersion = Integer.valueOf(parts[0]);
-        }
-    }
-
-    @Override
-    public final boolean isFirstRowSupported(final Query query) {
-        switch (majorVersion) {
-            case 2:
-            case 3:
-                return true;
-            default:
-                return super.isFirstRowSupported(query);
-        }
-    }
-
-    @Override
-    public final boolean isMaxRowsSupported() {
-        switch (majorVersion) {
-            case 2:
-            case 3:
-                return true;
-            default:
-                return super.isMaxRowsSupported();
-        }
     }
 
-    /**
-     * {@inheritDoc}
-     *
-     * If the Max rows and/or First row property of the query is set, then we
-     * will use the database's LIMIT and OFFSET functions.
-     */
     @Override
     public String rewriteQuery(Query query) {
-        switch (majorVersion) {
-            case 2:
-            case 3:
-                return rewriteQueryForHive2(query);
-            default:
-                return rewriteQueryForHive1(query);
-        }
-
-    }
-
-    private String rewriteQueryForHive1(Query query) {
 
         Integer maxRows = query.getMaxRows();
         Integer firstRow = query.getFirstRow();
@@ -95,7 +47,6 @@ public class HiveQueryRewriter extends DefaultQueryRewriter {
             }
         }
 
-
         if (maxRows == null && (firstRow == null || firstRow.intValue() == 1)) {
             return super.rewriteQuery(query);
         }
@@ -136,35 +87,6 @@ public class HiveQueryRewriter extends DefaultQueryRewriter {
 
     }
 
-    private String rewriteQueryForHive2(Query query) {
-        Integer maxRows = query.getMaxRows();
-        Integer firstRow = query.getFirstRow();
-
-        if(firstRow != null && firstRow > 1) {
-            if(query.getOrderByClause().getItemCount() == 0){
-                throw new MetaModelException("OFFSET requires an ORDER BY clause");
-            }
-        }
-
-        String queryString = super.rewriteQuery(query);
-
-        if (maxRows != null || firstRow != null) {
-
-            if (maxRows == null) {
-                maxRows = Integer.MAX_VALUE;
-            }
-            queryString = queryString + " LIMIT " + maxRows;
-
-            if (firstRow != null && firstRow > 1) {
-                // offset is 0-based
-                int offset = firstRow - 1;
-                queryString = queryString + " OFFSET " + offset;
-            }
-        }
-
-        return queryString;
-
-    }
 
     @Override
     public String rewriteColumnType(ColumnType columnType, Integer columnSize) {
diff --git a/jdbc/src/test/java/org/apache/metamodel/dialects/HiveQueryRewriterTest.java b/jdbc/src/test/java/org/apache/metamodel/dialects/HiveQueryRewriterTest.java
index 423b120..c4bc753 100644
--- a/jdbc/src/test/java/org/apache/metamodel/dialects/HiveQueryRewriterTest.java
+++ b/jdbc/src/test/java/org/apache/metamodel/dialects/HiveQueryRewriterTest.java
@@ -21,8 +21,12 @@ package org.apache.metamodel.dialects;
 import static org.apache.metamodel.jdbc.JdbcDataContext.DATABASE_PRODUCT_HIVE;
 import static org.apache.metamodel.jdbc.JdbcDataContext.DATABASE_PRODUCT_SQLSERVER;
 
+import java.sql.Connection;
+import java.sql.Driver;
+import java.sql.DriverManager;
 import junit.framework.TestCase;
 import org.apache.metamodel.jdbc.JdbcDataContext;
+import org.apache.metamodel.jdbc.dialects.Hive2QueryRewriter;
 import org.apache.metamodel.jdbc.dialects.HiveQueryRewriter;
 import org.apache.metamodel.jdbc.dialects.MysqlQueryRewriter;
 import org.apache.metamodel.jdbc.dialects.SQLServerQueryRewriter;
@@ -45,8 +49,6 @@ public class HiveQueryRewriterTest extends TestCase {
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-
-
     }
 
     public void testHive1SqlWithPagination() {
@@ -73,7 +75,7 @@ public class HiveQueryRewriterTest extends TestCase {
         EasyMock.expect(mockContext.getIdentifierQuoteString()).andReturn("quoteString").anyTimes();
 
         EasyMock.replay(mockContext);
-        HiveQueryRewriter qr = new HiveQueryRewriter(mockContext);
+        Hive2QueryRewriter qr = new Hive2QueryRewriter(mockContext);
 
         MutableColumn col1 = new MutableColumn("kkbh");
         MutableColumn col2 = new MutableColumn("kkmc");