From 2e817d5be820cba83b78c2333abbb73e74a7f5e7 Mon Sep 17 00:00:00 2001 From: "kandy01.wang" Date: Wed, 27 Dec 2023 21:46:48 +0800 Subject: [PATCH] [KYUUBI #5918] Kyuubi BeeLine should check the relocated TTransportException MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # :mag: Description ## Issue References πŸ”— This pull request fixes #5918, when Kyuubi beeline executes incorrect SQL,it will exit with exception: ``` java.lang.NoClassDefFoundError: org/apache/thrift/transport/TTransportException ``` ## Describe Your Solution πŸ”§ 1.Supply `org.apache.thrift:libthrift` to `kyuubi-beeline` module. 2.We should override BeeLine's handleSQLException method,makes it compatible As we discussed, only `org.apache.kyuubi.shaded.thrift.transport.TTransportException` will be received by `kyuubi-beeline`,so itβ€˜s unnecessary to add libthrift dependency to `kyuubi-beeline`. ## Types of changes :bookmark: - [x] Bugfix (non-breaking change which fixes an issue) - [ ] New feature (non-breaking change which adds functionality) - [ ] Breaking change (fix or feature that would cause existing functionality to change) ## Test Plan πŸ§ͺ #### Behavior Without This Pull Request :coffin: #### Behavior With This Pull Request :tada: #### Related Unit Tests --- # Checklists ## πŸ“ Author Self Checklist - [ ] My code follows the [style guidelines](https://kyuubi.readthedocs.io/en/master/contributing/code/style.html) of this project - [ ] I have performed a self-review - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] This patch was not authored or co-authored using [Generative Tooling](https://www.apache.org/legal/generative-tooling.html) ## πŸ“ Committer Pre-Merge Checklist - [x] Pull request title is okay. - [x] No license issues. - [x] Milestone correctly set? - [ ] Test coverage is ok - [x] Assignees are selected. - [x] Minimum number of approvals - [x] No changes are requested **Be nice. Be informative.** Closes #5919 from hadoopkandy/KYUUBI-5918. Closes #5918 ee96c4436 [kandy01.wang] [KYUUBI #5918] [Bug] kyuubi beeline exit with exception : java.lang.NoClassDefFoundError: org/apache/thrift/transport/TTransportException Authored-by: kandy01.wang Signed-off-by: Cheng Pan --- .../apache/hive/beeline/KyuubiBeeLine.java | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/kyuubi-hive-beeline/src/main/java/org/apache/hive/beeline/KyuubiBeeLine.java b/kyuubi-hive-beeline/src/main/java/org/apache/hive/beeline/KyuubiBeeLine.java index c786da35f24..5aad29fd789 100644 --- a/kyuubi-hive-beeline/src/main/java/org/apache/hive/beeline/KyuubiBeeLine.java +++ b/kyuubi-hive-beeline/src/main/java/org/apache/hive/beeline/KyuubiBeeLine.java @@ -20,11 +20,14 @@ import java.io.IOException; import java.io.InputStream; import java.sql.Driver; +import java.sql.SQLException; +import java.sql.SQLWarning; import java.util.*; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.Options; import org.apache.commons.cli.ParseException; import org.apache.hive.common.util.HiveStringUtils; +import org.apache.kyuubi.shaded.thrift.transport.TTransportException; import org.apache.kyuubi.util.reflect.DynConstructors; import org.apache.kyuubi.util.reflect.DynFields; import org.apache.kyuubi.util.reflect.DynMethods; @@ -299,4 +302,56 @@ int runInit() { boolean dispatch(String line) { return super.dispatch(isPythonMode() ? line : HiveStringUtils.removeComments(line)); } + + @Override + void handleSQLException(SQLException e) { + if (e instanceof SQLWarning && !(getOpts().getShowWarnings())) { + return; + } + + if (e.getCause() instanceof TTransportException) { + switch (((TTransportException) e.getCause()).getType()) { + case TTransportException.ALREADY_OPEN: + error(loc("hs2-connection-already-open")); + break; + case TTransportException.END_OF_FILE: + error(loc("hs2-unexpected-end-of-file")); + break; + case TTransportException.NOT_OPEN: + error(loc("hs2-could-not-open-connection")); + break; + case TTransportException.TIMED_OUT: + error(loc("hs2-connection-timed-out")); + break; + case TTransportException.UNKNOWN: + error(loc("hs2-unknown-connection-problem")); + break; + default: + error(loc("hs2-unexpected-error")); + } + } + + error( + loc( + e instanceof SQLWarning ? "Warning" : "Error", + new Object[] { + e.getMessage() == null ? "" : e.getMessage().trim(), + e.getSQLState() == null ? "" : e.getSQLState().trim(), + new Integer(e.getErrorCode()) + })); + + if (getOpts().getVerbose()) { + e.printStackTrace(getErrorStream()); + } + + if (!getOpts().getShowNestedErrs()) { + return; + } + + for (SQLException nested = e.getNextException(); + nested != null && nested != e; + nested = nested.getNextException()) { + handleSQLException(nested); + } + } }