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

Reply via email to