This is an automated email from the ASF dual-hosted git repository.
kasakrisz 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 24b4de68d8a HIVE-29555: [HPLSQL]Errorcode handling is not proper in
HPLSQL. (#6422)
24b4de68d8a is described below
commit 24b4de68d8aca689132b053d41c7579d17d64042
Author: Dayakar M <[email protected]>
AuthorDate: Wed Apr 29 15:57:18 2026 +0530
HIVE-29555: [HPLSQL]Errorcode handling is not proper in HPLSQL. (#6422)
Co-authored-by: mdayakar <[email protected]>
---
.../src/main/java/org/apache/hive/hplsql/Exec.java | 2 +-
.../main/java/org/apache/hive/hplsql/Select.java | 6 +--
.../src/main/java/org/apache/hive/hplsql/Stmt.java | 26 +++++----
.../apache/hive/beeline/TestHplSqlViaBeeLine.java | 61 ++++++++++++++++++++++
4 files changed, 80 insertions(+), 15 deletions(-)
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 de233e225f6..a1b2a2d3c71 100644
--- a/hplsql/src/main/java/org/apache/hive/hplsql/Exec.java
+++ b/hplsql/src/main/java/org/apache/hive/hplsql/Exec.java
@@ -768,7 +768,7 @@ public void setSqlSuccess() {
*/
public void setSqlNoData() {
setSqlCode(SqlCodes.NO_DATA_FOUND);
- setSqlState("01000");
+ setSqlState("02000");
}
public Integer run(String[] args) throws Exception {
diff --git a/hplsql/src/main/java/org/apache/hive/hplsql/Select.java
b/hplsql/src/main/java/org/apache/hive/hplsql/Select.java
index 9a5cde2a57e..108343ef497 100644
--- a/hplsql/src/main/java/org/apache/hive/hplsql/Select.java
+++ b/hplsql/src/main/java/org/apache/hive/hplsql/Select.java
@@ -125,8 +125,8 @@ public Integer select(HplsqlParser.Select_stmtContext ctx) {
exec.signal(Signal.Type.TOO_MANY_ROWS);
}
} else {
- exec.setSqlCode(SqlCodes.NO_DATA_FOUND);
- exec.signal(Signal.Type.NOTFOUND);
+ exec.setSqlNoData();
+ exec.signal(Signal.Type.NOTFOUND, null, null);
}
}
} else if (ctx.parent instanceof HplsqlParser.StmtContext) { // Print
all results for standalone SELECT statement
@@ -156,7 +156,7 @@ public Integer select(HplsqlParser.Select_stmtContext ctx) {
exec.setSqlSuccess();
} else {
evalNull();
- exec.setSqlCode(SqlCodes.NO_DATA_FOUND);
+ exec.setSqlNoData();
}
}
} catch (QueryException e) {
diff --git a/hplsql/src/main/java/org/apache/hive/hplsql/Stmt.java
b/hplsql/src/main/java/org/apache/hive/hplsql/Stmt.java
index a39a60948d2..034afbc29ce 100644
--- a/hplsql/src/main/java/org/apache/hive/hplsql/Stmt.java
+++ b/hplsql/src/main/java/org/apache/hive/hplsql/Stmt.java
@@ -81,7 +81,8 @@ public Integer
allocateCursor(HplsqlParser.Allocate_cursor_stmtContext ctx) {
exec.signal(Signal.Type.SQLEXCEPTION);
return -1;
}
- exec.addVariable(new Var(name, Type.CURSOR, cur.value));
+ exec.addVariable(new Var(name, Type.CURSOR, cur.value));
+ exec.setSqlSuccess();
return 0;
}
@@ -475,7 +476,7 @@ public Integer open(HplsqlParser.Open_stmtContext ctx) {
exec.signal(queryResult);
return 1;
} else if (!exec.getOffline()) {
- exec.setSqlCode(SqlCodes.SUCCESS);
+ exec.setSqlSuccess();
}
if (cursor.isWithReturn()) {
exec.addReturnCursor(var);
@@ -507,8 +508,8 @@ public Integer fetch(HplsqlParser.Fetch_stmtContext ctx) {
exec.signal(Signal.Type.SQLEXCEPTION);
return 1;
} else if (exec.getOffline()) {
- exec.setSqlCode(SqlCodes.NO_DATA_FOUND);
- exec.signal(Signal.Type.NOTFOUND);
+ exec.setSqlNoData();
+ exec.signal(Signal.Type.NOTFOUND, null, null);
return 0;
}
// Assign values from the row to local variables
@@ -533,6 +534,7 @@ public Integer fetch(HplsqlParser.Fetch_stmtContext ctx) {
break;
}
}
+ exec.setSqlSuccess();
} else {
if(queryResult.next()) {
cursor.setFetch(true);
@@ -555,7 +557,7 @@ public Integer fetch(HplsqlParser.Fetch_stmtContext ctx) {
exec.setSqlSuccess();
} else {
cursor.setFetch(false);
- exec.setSqlCode(SqlCodes.NO_DATA_FOUND);
+ exec.setSqlNoData();
}
}
} catch (QueryException e) {
@@ -581,7 +583,7 @@ public Integer close(HplsqlParser.Close_stmtContext ctx) {
Var var = exec.findVariable(name);
if(var != null && var.type == Type.CURSOR) {
((Cursor)var.value).close();
- exec.setSqlCode(SqlCodes.SUCCESS);
+ exec.setSqlSuccess();
} else if(trace) {
trace(ctx, "Cursor not found: " + name);
}
@@ -716,8 +718,8 @@ else if(trace) {
exec.incRowCount();
exec.setSqlSuccess();
} else {
- exec.setSqlCode(SqlCodes.NO_DATA_FOUND);
- exec.signal(Signal.Type.NOTFOUND);
+ exec.setSqlNoData();
+ exec.signal(Signal.Type.NOTFOUND, null, null);
}
}
@@ -892,7 +894,7 @@ public Integer use(ParserRuleContext ctx, String sql) {
exec.signal(query);
return 1;
}
- exec.setSqlCode(SqlCodes.SUCCESS);
+ exec.setSqlSuccess();
query.close();
return 0;
}
@@ -1061,6 +1063,7 @@ public Integer exec(HplsqlParser.Exec_stmtContext ctx) {
exec.signal(query);
return 1;
}
+ exec.setSqlSuccess();
try {
if (ctx.T_INTO() != null) {
int cols = ctx.L_ID().size();
@@ -1082,7 +1085,7 @@ else if (trace) {
trace(ctx, "Variable not found: " + ctx.L_ID(i).getText());
}
}
- exec.setSqlCode(SqlCodes.SUCCESS);
+ exec.setSqlSuccess();
}
}
// Print the results
@@ -1595,7 +1598,8 @@ public Integer return_(HplsqlParser.Return_stmtContext
ctx) {
if (ctx.expr() != null) {
eval(ctx.expr());
}
- exec.signal(Signal.Type.LEAVE_ROUTINE);
+ exec.signal(Signal.Type.LEAVE_ROUTINE, null, null);
+ exec.setSqlSuccess();
return 0;
}
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 e186790d487..73792f6f4f8 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
@@ -586,6 +586,56 @@ public void testBulkCollectFetchLoop() throws Throwable {
testScriptFile(scriptText, args(), "e1=1 e2=2 e3=3 e4=4 e5=5 e6=6");
}
+ @Test
+ public void testErrorcodeWithBulkCollectFetch() throws Throwable {
+ String scriptText =
+ "SET hplsql.onerror='seterror';\n" +
+ "DROP TABLE IF EXISTS result;\n" +
+ "CREATE TABLE result (s string);\n" +
+ "DROP TABLE IF EXISTS emp;\n" +
+ "CREATE TABLE emp (name string, age int);\n" +
+ "INSERT INTO emp VALUES('alice', 20),('bob', 30);\n" +
+ "TYPE t_rows IS TABLE OF emp%ROWTYPE INDEX BY BINARY_INTEGER;\n" +
+ "SELECT * FROM UNKNOWN; --Exception expted and errorcode is set to
-1\n" +
+ "PRINT 'First ERRORCODE: ' || errorcode\n" +
+ "DECLARE rows t_rows;\n" +
+ "DECLARE cur SYS_REFCURSOR;\n" +
+ "OPEN cur FOR SELECT * FROM emp;\n" +
+ "PRINT 'Second ERRORCODE: ' || errorcode\n" +
+ "SELECT * FROM UNKNOWN1; --Exception expted and errorcode is set
to -1\n" +
+ "PRINT 'Third ERRORCODE: ' || errorcode\n" +
+ "FETCH cur BULK COLLECT INTO rows;\n" +
+ "PRINT 'Fourth ERRORCODE: ' || errorcode\n" +
+ "CLOSE cur;\n" +
+ "INSERT INTO result VALUES(rows(1).name || ' = ' || rows(1).age ||
' ' || rows(2).name || ' = ' || rows(2).age);\n" +
+ "SELECT * FROM result;\n";
+ testScriptFile(scriptText, args(), "First ERRORCODE: -1.*Second ERRORCODE:
0.*Third ERRORCODE: -1.*Fourth ERRORCODE: 0.*alice = 20 bob = 30",
OutStream.ERR);
+ }
+
+ @Test
+ public void testErrorCodeWithAllocateCursor() throws Throwable {
+ String scriptText =
+ "SET hplsql.onerror='seterror';\n" +
+ "DROP TABLE IF EXISTS issues;\n" +
+ "CREATE TABLE issues (id int, name string);\n" +
+ "CREATE PROCEDURE spOpenIssues \n" +
+ " DYNAMIC RESULT SETS 1\n" +
+ "BEGIN\n" +
+ " DECLARE cur CURSOR WITH RETURN FOR\n" +
+ " SELECT id, name FROM issues;\n" +
+ " OPEN cur;\n" +
+ "END;\n" +
+ "DECLARE id INT;\n" +
+ "DECLARE name VARCHAR(30);\n" +
+ "CALL spOpenIssues;\n" +
+ "SELECT * FROM UNKNOWN; --Exception expted and errorcode is set to
-1\n" +
+ "PRINT 'First ERRORCODE: ' || errorcode\n" +
+ "ALLOCATE c1 CURSOR FOR PROCEDURE spOpenIssues;\n" +
+ "PRINT 'Second ERRORCODE: ' || errorcode\n" +
+ "CLOSE c1;";
+ testScriptFile(scriptText, args(), "First ERRORCODE: -1.*Second ERRORCODE:
0", OutStream.ERR);
+ }
+
@Test
public void testDecimalCast() throws Throwable {
String scriptText =
@@ -1419,6 +1469,17 @@ public void testQuit() throws Throwable {
OutStream.ERR);
}
+ @Test
+ public void testERRORCODEForExecuteStatements() throws Throwable {
+ String scriptText =
+ "SET hplsql.onerror='seterror';\n" +
+ "EXECUTE 'select * from unknown';\n" +
+ "PRINT 'First ERRORCODE: ' || errorcode\n" +
+ "EXECUTE 'select 1';\n" +
+ "PRINT 'Second ERRORCODE: ' || errorcode";
+ testScriptFile(scriptText, args(), "First ERRORCODE: -1.*Second ERRORCODE:
0", OutStream.ERR);
+ }
+
private static List<String> args() {
return Arrays.asList("-d", BeeLine.BEELINE_DEFAULT_JDBC_DRIVER,
"-u", miniHS2.getBaseJdbcURL() + ";mode=hplsql", "-n", USER_NAME);