Repository: lens
Updated Branches:
  refs/heads/master 4d7c8e4db -> fdf04be04


LENS-908 : Add error codes for jdbc query execution exception


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

Branch: refs/heads/master
Commit: fdf04be044e727e9d86708b7b0e24b0aec9ed6a3
Parents: 4d7c8e4
Author: Sushil Mohanty <[email protected]>
Authored: Wed Dec 30 18:30:46 2015 +0530
Committer: Sushil Mohanty <[email protected]>
Committed: Wed Dec 30 18:30:46 2015 +0530

----------------------------------------------------------------------
 lens-api/src/main/resources/lens-errors.conf    |  6 ++--
 .../org/apache/lens/driver/hive/HiveDriver.java |  4 +--
 .../lens/driver/hive/LensHiveErrorCode.java     | 36 --------------------
 .../apache/lens/driver/hive/TestHiveDriver.java |  4 +--
 .../org/apache/lens/driver/jdbc/JDBCDriver.java | 25 +++++++++++++-
 .../apache/lens/driver/jdbc/TestJdbcDriver.java | 14 ++++++++
 .../server/api/error/LensDriverErrorCode.java   | 36 ++++++++++++++++++++
 .../server/query/QueryAPIErrorResponseTest.java | 24 ++++++-------
 .../lens/server/query/TestQueryService.java     |  4 +--
 9 files changed, 95 insertions(+), 58 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lens/blob/fdf04be0/lens-api/src/main/resources/lens-errors.conf
----------------------------------------------------------------------
diff --git a/lens-api/src/main/resources/lens-errors.conf 
b/lens-api/src/main/resources/lens-errors.conf
index 06960a0..c7ccea1 100644
--- a/lens-api/src/main/resources/lens-errors.conf
+++ b/lens-api/src/main/resources/lens-errors.conf
@@ -317,7 +317,7 @@ lensCubeErrorsForMetastore = [
 
 ]
 
-lensHiveErrors = [
+lensDriverErrors = [
   {
     errorCode = 4001
     httpStatusCode = ${BAD_REQUEST}
@@ -327,7 +327,7 @@ lensHiveErrors = [
   {
     errorCode = 4002
     httpStatusCode = ${INTERNAL_SERVER_ERROR}
-    errorMsg = "Hive Error : %s"
+    errorMsg = "Driver Execution Error : %s"
   }
 ]
 
@@ -364,4 +364,4 @@ lensCubeErrors = 
${lensCubeErrorsForQuery}${lensCubeErrorsForMetastore}
 # Lens server and Lens client are only aware of errors array. They are not 
aware of any other array defined in
 # error configuration files. Hence an errors array is prepared which is a 
concatenation of all other error arrays.
 
-errors = 
${lensCommonErrors}${lensServerErrors}${lensCubeErrors}${lensHiveErrors}
+errors = 
${lensCommonErrors}${lensServerErrors}${lensCubeErrors}${lensDriverErrors}

http://git-wip-us.apache.org/repos/asf/lens/blob/fdf04be0/lens-driver-hive/src/main/java/org/apache/lens/driver/hive/HiveDriver.java
----------------------------------------------------------------------
diff --git 
a/lens-driver-hive/src/main/java/org/apache/lens/driver/hive/HiveDriver.java 
b/lens-driver-hive/src/main/java/org/apache/lens/driver/hive/HiveDriver.java
index c7ef8f1..149c6ab 100644
--- a/lens-driver-hive/src/main/java/org/apache/lens/driver/hive/HiveDriver.java
+++ b/lens-driver-hive/src/main/java/org/apache/lens/driver/hive/HiveDriver.java
@@ -18,7 +18,7 @@
  */
 package org.apache.lens.driver.hive;
 
-import static org.apache.lens.driver.hive.LensHiveErrorCode.*;
+import static org.apache.lens.server.api.error.LensDriverErrorCode.*;
 import static org.apache.lens.server.api.util.LensUtil.getImplementations;
 
 import java.io.ByteArrayInputStream;
@@ -579,7 +579,7 @@ public class HiveDriver extends AbstractLensDriver {
     if (ex.getMessage().contains("SemanticException")) {
       throw new LensException(SEMANTIC_ERROR.getLensErrorInfo(), ex, 
ex.getMessage());
     }
-    throw new LensException(HIVE_ERROR.getLensErrorInfo(), ex, 
ex.getMessage());
+    throw new LensException(DRIVER_ERROR.getLensErrorInfo(), ex, 
ex.getMessage());
   }
 
   /*

http://git-wip-us.apache.org/repos/asf/lens/blob/fdf04be0/lens-driver-hive/src/main/java/org/apache/lens/driver/hive/LensHiveErrorCode.java
----------------------------------------------------------------------
diff --git 
a/lens-driver-hive/src/main/java/org/apache/lens/driver/hive/LensHiveErrorCode.java
 
b/lens-driver-hive/src/main/java/org/apache/lens/driver/hive/LensHiveErrorCode.java
deleted file mode 100644
index 3bac9e7..0000000
--- 
a/lens-driver-hive/src/main/java/org/apache/lens/driver/hive/LensHiveErrorCode.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/**
- * 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.lens.driver.hive;
-
-import org.apache.lens.server.api.LensErrorInfo;
-
-public enum LensHiveErrorCode {
-
-  SEMANTIC_ERROR(4001, 10000), HIVE_ERROR(4002, 10000);
-
-  public LensErrorInfo getLensErrorInfo() {
-    return this.errorInfo;
-  }
-
-  LensHiveErrorCode(final int code, final int weight) {
-    this.errorInfo = new LensErrorInfo(code, weight, name());
-  }
-
-  private final LensErrorInfo errorInfo;
-}

http://git-wip-us.apache.org/repos/asf/lens/blob/fdf04be0/lens-driver-hive/src/test/java/org/apache/lens/driver/hive/TestHiveDriver.java
----------------------------------------------------------------------
diff --git 
a/lens-driver-hive/src/test/java/org/apache/lens/driver/hive/TestHiveDriver.java
 
b/lens-driver-hive/src/test/java/org/apache/lens/driver/hive/TestHiveDriver.java
index 06552ea..ba3f3d5 100644
--- 
a/lens-driver-hive/src/test/java/org/apache/lens/driver/hive/TestHiveDriver.java
+++ 
b/lens-driver-hive/src/test/java/org/apache/lens/driver/hive/TestHiveDriver.java
@@ -682,8 +682,8 @@ public class TestHiveDriver {
       driver.estimate(createExplainContext("SELECT ID FROM nonexist", conf));
       fail("Should not reach here");
     } catch (LensException e) {
-      assertEquals(LensUtil.getCauseMessage(e), "Error while"
-        + " compiling statement: FAILED: SemanticException [Error 10001]: Line 
1:32 Table not found 'nonexist'");
+      assertTrue(LensUtil.getCauseMessage(e).contains("Error while"
+        + " compiling statement: FAILED: SemanticException [Error 10001]: Line 
1:32 Table not found 'nonexist'"));
     }
   }
 

http://git-wip-us.apache.org/repos/asf/lens/blob/fdf04be0/lens-driver-jdbc/src/main/java/org/apache/lens/driver/jdbc/JDBCDriver.java
----------------------------------------------------------------------
diff --git 
a/lens-driver-jdbc/src/main/java/org/apache/lens/driver/jdbc/JDBCDriver.java 
b/lens-driver-jdbc/src/main/java/org/apache/lens/driver/jdbc/JDBCDriver.java
index d3fa904..82d7513 100644
--- a/lens-driver-jdbc/src/main/java/org/apache/lens/driver/jdbc/JDBCDriver.java
+++ b/lens-driver-jdbc/src/main/java/org/apache/lens/driver/jdbc/JDBCDriver.java
@@ -43,6 +43,7 @@ import org.apache.lens.api.query.QueryPrepareHandle;
 import org.apache.lens.cube.parse.HQLParser;
 import org.apache.lens.server.api.driver.*;
 import org.apache.lens.server.api.driver.DriverQueryStatus.DriverQueryState;
+import org.apache.lens.server.api.error.LensDriverErrorCode;
 import org.apache.lens.server.api.error.LensException;
 import org.apache.lens.server.api.events.LensEventListener;
 import org.apache.lens.server.api.metrics.MethodMetricsContext;
@@ -56,6 +57,7 @@ import 
org.apache.lens.server.api.query.constraint.QueryLaunchingConstraint;
 import org.apache.lens.server.api.query.cost.FactPartitionBasedQueryCost;
 import org.apache.lens.server.api.query.cost.QueryCost;
 import org.apache.lens.server.api.query.rewrite.QueryRewriter;
+import org.apache.lens.server.api.util.LensUtil;
 import org.apache.lens.server.model.LogSegregationContext;
 import org.apache.lens.server.model.MappedDiagnosticLogSegregationContext;
 
@@ -795,7 +797,7 @@ public class JDBCDriver extends AbstractLensDriver {
         throw new LensException(stmt.getWarnings());
       }
     } catch (SQLException sql) {
-      throw new LensException(sql);
+      handleJDBCSQLException(sql);
     } finally {
       if (conn != null) {
         try {
@@ -810,6 +812,27 @@ public class JDBCDriver extends AbstractLensDriver {
     return stmt;
   }
 
+  /**
+   * Handle sql exception
+   *
+   * @param sqlex SQLException
+   * @throws LensException
+   */
+  private LensException handleJDBCSQLException(SQLException sqlex) throws 
LensException {
+    String cause = LensUtil.getCauseMessage(sqlex);
+    if (getSqlSynataxExceptions(sqlex).contains("SyntaxError")) {
+      throw new 
LensException(LensDriverErrorCode.SEMANTIC_ERROR.getLensErrorInfo(), sqlex, 
cause);
+    }
+    throw new 
LensException(LensDriverErrorCode.DRIVER_ERROR.getLensErrorInfo(), sqlex, 
cause);
+  }
+
+  private String getSqlSynataxExceptions(Throwable e) {
+    String exp = null;
+    if (e.getCause() != null) {
+      exp = e.getClass() + getSqlSynataxExceptions(e.getCause());
+    }
+    return exp;
+  }
 
   /**
    * Prepare the given query.

http://git-wip-us.apache.org/repos/asf/lens/blob/fdf04be0/lens-driver-jdbc/src/test/java/org/apache/lens/driver/jdbc/TestJdbcDriver.java
----------------------------------------------------------------------
diff --git 
a/lens-driver-jdbc/src/test/java/org/apache/lens/driver/jdbc/TestJdbcDriver.java
 
b/lens-driver-jdbc/src/test/java/org/apache/lens/driver/jdbc/TestJdbcDriver.java
index 2ad9fcb..b96cf88 100644
--- 
a/lens-driver-jdbc/src/test/java/org/apache/lens/driver/jdbc/TestJdbcDriver.java
+++ 
b/lens-driver-jdbc/src/test/java/org/apache/lens/driver/jdbc/TestJdbcDriver.java
@@ -411,6 +411,20 @@ public class TestJdbcDriver {
     }
   }
 
+  @Test
+  public void testJdbcSqlException() throws Exception {
+    final String query = "SELECT invalid_column FROM execute_test";
+    try {
+      PreparedQueryContext pContext = new PreparedQueryContext(query, "SA", 
baseConf, drivers);
+      driver.validate(pContext);
+      driver.prepare(pContext);
+    } catch (LensException e) {
+      assertEquals(e.getErrorInfo().getErrorCode(), 4001);
+      assertEquals(e.getErrorInfo().getErrorName(), "SEMANTIC_ERROR");
+      assertTrue(e.getMessage().contains("user lacks privilege or object not 
found: EXECUTE_TEST"));
+    }
+  }
+
   /**
    * Test type casting of char, varchar, nvarchar and decimal type
    *

http://git-wip-us.apache.org/repos/asf/lens/blob/fdf04be0/lens-server-api/src/main/java/org/apache/lens/server/api/error/LensDriverErrorCode.java
----------------------------------------------------------------------
diff --git 
a/lens-server-api/src/main/java/org/apache/lens/server/api/error/LensDriverErrorCode.java
 
b/lens-server-api/src/main/java/org/apache/lens/server/api/error/LensDriverErrorCode.java
new file mode 100644
index 0000000..0c6257b
--- /dev/null
+++ 
b/lens-server-api/src/main/java/org/apache/lens/server/api/error/LensDriverErrorCode.java
@@ -0,0 +1,36 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.lens.server.api.error;
+
+import org.apache.lens.server.api.LensErrorInfo;
+
+public enum LensDriverErrorCode {
+
+  SEMANTIC_ERROR(4001, 10000), DRIVER_ERROR(4002, 10000);
+
+  public LensErrorInfo getLensErrorInfo() {
+    return this.errorInfo;
+  }
+
+  LensDriverErrorCode(final int code, final int weight) {
+    this.errorInfo = new LensErrorInfo(code, weight, name());
+  }
+
+  private final LensErrorInfo errorInfo;
+}

http://git-wip-us.apache.org/repos/asf/lens/blob/fdf04be0/lens-server/src/test/java/org/apache/lens/server/query/QueryAPIErrorResponseTest.java
----------------------------------------------------------------------
diff --git 
a/lens-server/src/test/java/org/apache/lens/server/query/QueryAPIErrorResponseTest.java
 
b/lens-server/src/test/java/org/apache/lens/server/query/QueryAPIErrorResponseTest.java
index 69c3f46..6f8886c 100644
--- 
a/lens-server/src/test/java/org/apache/lens/server/query/QueryAPIErrorResponseTest.java
+++ 
b/lens-server/src/test/java/org/apache/lens/server/query/QueryAPIErrorResponseTest.java
@@ -27,12 +27,11 @@ import static 
org.apache.lens.server.common.RestAPITestUtil.*;
 import static org.apache.lens.server.common.TestDataUtils.*;
 import static org.apache.lens.server.error.LensServerErrorCode.*;
 
-import java.util.Arrays;
+import static org.testng.Assert.assertTrue;
 
 import javax.ws.rs.client.WebTarget;
 import javax.ws.rs.core.Application;
 import javax.ws.rs.core.Response;
-import javax.ws.rs.core.Response.Status;
 import javax.xml.datatype.DatatypeConfigurationException;
 
 import org.apache.lens.api.LensConf;
@@ -40,6 +39,7 @@ import org.apache.lens.api.LensSessionHandle;
 import org.apache.lens.api.jaxb.LensJAXBContextResolver;
 import org.apache.lens.api.metastore.*;
 import org.apache.lens.api.query.SupportedQuerySubmitOperations;
+import org.apache.lens.api.result.LensAPIResult;
 import org.apache.lens.api.result.LensErrorTO;
 import org.apache.lens.cube.error.ColUnAvailableInTimeRange;
 import org.apache.lens.server.LensJerseyTest;
@@ -160,21 +160,21 @@ public class QueryAPIErrorResponseTest extends 
LensJerseyTest {
     final String testQuery = "select * from non_existing_table";
     Response response = estimate(target(), Optional.of(sessionId), 
Optional.of(testQuery));
 
-    final String expectedErrMsg = "Semantic Error : Error while compiling 
statement: "
+    final String expectedErrMsg1 = "Semantic Error : Error while compiling 
statement: "
       + "FAILED: SemanticException [Error 10001]: Line 1:31 Table not found 
'non_existing_table'";
 
-    LensErrorTO childError1 = 
LensErrorTO.composedOf(INTERNAL_SERVER_ERROR.getValue(),
-      expectedErrMsg, MOCK_STACK_TRACE);
-    LensErrorTO childError2 = 
LensErrorTO.composedOf(INTERNAL_SERVER_ERROR.getValue(),
-        expectedErrMsg, MOCK_STACK_TRACE);
+    final String expectedErrMsg2 = "Semantic Error : user lacks privilege or 
object not found: NON_EXISTING_TABLE";
 
-    LensErrorTO expectedLensErrorTO = 
LensErrorTO.composedOf(INTERNAL_SERVER_ERROR.getValue(),
-        expectedErrMsg, MOCK_STACK_TRACE, Arrays.asList(childError1, 
childError2));
+    LensErrorTO expectedLensErrorTO1 = 
LensErrorTO.composedOf(INTERNAL_SERVER_ERROR.getValue(),
+            expectedErrMsg1, MOCK_STACK_TRACE);
 
-    ErrorResponseExpectedData expectedData = new 
ErrorResponseExpectedData(Status.BAD_REQUEST,
-      expectedLensErrorTO);
+    LensErrorTO expectedLensErrorTO2 = 
LensErrorTO.composedOf(INTERNAL_SERVER_ERROR.getValue(),
+            expectedErrMsg2, MOCK_STACK_TRACE);
 
-    expectedData.verify(response);
+    LensErrorTO responseLensErrorTO = 
response.readEntity(LensAPIResult.class).getLensErrorTO();
+
+    
assertTrue(expectedLensErrorTO1.getMessage().equals(responseLensErrorTO.getMessage())
+            || 
expectedLensErrorTO2.getMessage().equals(responseLensErrorTO.getMessage()));
   }
 
   @Test

http://git-wip-us.apache.org/repos/asf/lens/blob/fdf04be0/lens-server/src/test/java/org/apache/lens/server/query/TestQueryService.java
----------------------------------------------------------------------
diff --git 
a/lens-server/src/test/java/org/apache/lens/server/query/TestQueryService.java 
b/lens-server/src/test/java/org/apache/lens/server/query/TestQueryService.java
index 82afcdc..c5d75de 100644
--- 
a/lens-server/src/test/java/org/apache/lens/server/query/TestQueryService.java
+++ 
b/lens-server/src/test/java/org/apache/lens/server/query/TestQueryService.java
@@ -49,12 +49,12 @@ import org.apache.lens.api.result.LensErrorTO;
 import org.apache.lens.api.result.QueryCostTO;
 import org.apache.lens.cube.error.LensCubeErrorCode;
 import org.apache.lens.driver.hive.HiveDriver;
-import org.apache.lens.driver.hive.LensHiveErrorCode;
 import org.apache.lens.server.LensJerseyTest;
 import org.apache.lens.server.LensServerTestUtil;
 import org.apache.lens.server.LensServices;
 import org.apache.lens.server.api.LensConfConstants;
 import org.apache.lens.server.api.driver.LensDriver;
+import org.apache.lens.server.api.error.LensDriverErrorCode;
 import org.apache.lens.server.api.error.LensException;
 import org.apache.lens.server.api.metrics.LensMetricsRegistry;
 import org.apache.lens.server.api.metrics.MetricsService;
@@ -460,7 +460,7 @@ public class TestQueryService extends LensJerseyTest {
     List<LensErrorTO> childErrors = result.getLensErrorTO().getChildErrors();
     boolean hiveSemanticErrorExists=false;
     for (LensErrorTO error : childErrors) {
-      if (error.getCode() == 
LensHiveErrorCode.SEMANTIC_ERROR.getLensErrorInfo().getErrorCode()) {
+      if (error.getCode() == 
LensDriverErrorCode.SEMANTIC_ERROR.getLensErrorInfo().getErrorCode()) {
         hiveSemanticErrorExists = true;
         break;
       }

Reply via email to