This is an automated email from the ASF dual-hosted git repository.
krisztiankasa pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hive.git
The following commit(s) were added to refs/heads/master by this push:
new 1b0e9d9758a HIVE-28215: Signalling CONDITION HANDLER is not working in
HPLSQL. (Dayakar M, reviewed by Krisztian Kasa)
1b0e9d9758a is described below
commit 1b0e9d9758a0f28c4baf7b1895bf96bf11252f73
Author: Dayakar M <[email protected]>
AuthorDate: Mon May 6 20:28:49 2024 +0530
HIVE-28215: Signalling CONDITION HANDLER is not working in HPLSQL. (Dayakar
M, reviewed by Krisztian Kasa)
---
.../src/main/java/org/apache/hive/hplsql/Exec.java | 10 ++++++-
.../apache/hive/beeline/TestHplSqlViaBeeLine.java | 35 ++++++++++++++++++++++
2 files changed, 44 insertions(+), 1 deletion(-)
diff --git a/hplsql/src/main/java/org/apache/hive/hplsql/Exec.java
b/hplsql/src/main/java/org/apache/hive/hplsql/Exec.java
index 40e188d3735..7386f9a58a5 100644
--- a/hplsql/src/main/java/org/apache/hive/hplsql/Exec.java
+++ b/hplsql/src/main/java/org/apache/hive/hplsql/Exec.java
@@ -1028,9 +1028,13 @@ public class Exec extends HplsqlBaseVisitor<Integer>
implements Closeable {
* Output information about unhandled exceptions
*/
public void printExceptions() {
+ List<Signal> userDefinedSignals = new ArrayList<>();
while (!signals.empty()) {
Signal sig = signals.pop();
- if (sig.type == Signal.Type.VALIDATION) {
+ // if signal type is user defined then don't handle here
+ if (sig.type == Signal.Type.USERDEFINED) {
+ userDefinedSignals.add(sig);
+ } else if (sig.type == Signal.Type.VALIDATION) {
error(((HplValidationException)sig.exception).getCtx(),
sig.exception.getMessage());
} else if (sig.type == Signal.Type.SQLEXCEPTION) {
console.printError("Unhandled exception in HPL/SQL");
@@ -1044,6 +1048,10 @@ public class Exec extends HplsqlBaseVisitor<Integer>
implements Closeable {
trace(null, "Signal: " + sig.type);
}
}
+ // if there are any user defined signals then push them back to signals
stack to handle them later.
+ for (int i = userDefinedSignals.size() - 1; i >= 0; i--) {
+ exec.signals.push(userDefinedSignals.get(i));
+ }
}
/**
diff --git
a/itests/hive-unit/src/test/java/org/apache/hive/beeline/TestHplSqlViaBeeLine.java
b/itests/hive-unit/src/test/java/org/apache/hive/beeline/TestHplSqlViaBeeLine.java
index 87e9e56901b..c4f2d7729b3 100644
---
a/itests/hive-unit/src/test/java/org/apache/hive/beeline/TestHplSqlViaBeeLine.java
+++
b/itests/hive-unit/src/test/java/org/apache/hive/beeline/TestHplSqlViaBeeLine.java
@@ -1007,6 +1007,41 @@ public class TestHplSqlViaBeeLine {
testScriptFile(SCRIPT_TEXT, args, "sys.tbls");
}
+ @Test
+ public void testHplSqlContinueConditionHandler() throws Throwable {
+ String SCRIPT_TEXT =
+ "DROP TABLE IF EXISTS result;\n" +
+ "CREATE TABLE result (s string);\n" +
+ "CREATE PROCEDURE p1()\n" +
+ "BEGIN\n" +
+ " INSERT INTO result VALUES('Continue CONDITION Handler
invoked.');\n" +
+ "END;\n" +
+ "DECLARE cnt_condition CONDITION;\n" +
+ "DECLARE CONTINUE HANDLER FOR cnt_condition\n" +
+ " p1();\n" +
+ "IF 1 <> 2 THEN\n" +
+ " SIGNAL cnt_condition;\n" +
+ "END IF;\n" +
+ "SELECT * FROM result;";
+ testScriptFile(SCRIPT_TEXT, args(), "Continue CONDITION Handler invoked.");
+ }
+
+ @Test
+ public void testHplSqlExitConditionHandler() throws Throwable {
+ String SCRIPT_TEXT =
+ "CREATE PROCEDURE p1()\n" +
+ "BEGIN\n" +
+ " PRINT('Exit CONDITION Handler invoked.');\n" +
+ "END;\n" +
+ "DECLARE cnt_condition CONDITION;\n" +
+ "DECLARE EXIT HANDLER FOR cnt_condition\n" +
+ " p1();\n" +
+ "IF 1 <> 2 THEN\n" +
+ " SIGNAL cnt_condition;\n" +
+ "END IF;";
+ testScriptFile(SCRIPT_TEXT, args(), "Exit CONDITION Handler invoked.",
OutStream.ERR);
+ }
+
private static List<String> args() {
return Arrays.asList("-d", BeeLine.BEELINE_DEFAULT_JDBC_DRIVER,
"-u", miniHS2.getBaseJdbcURL() + ";mode=hplsql", "-n", userName);