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; }
