diff --git hplsql/src/main/antlr4/org/apache/hive/hplsql/Hplsql.g4 hplsql/src/main/antlr4/org/apache/hive/hplsql/Hplsql.g4 index 70312b2..4104d13 100644 --- hplsql/src/main/antlr4/org/apache/hive/hplsql/Hplsql.g4 +++ hplsql/src/main/antlr4/org/apache/hive/hplsql/Hplsql.g4 @@ -98,7 +98,8 @@ expr_stmt : // Standalone expression ; assignment_stmt : // Assignment statement - T_SET? assignment_stmt_item (T_COMMA assignment_stmt_item)* + T_SET set_session_option + | T_SET? assignment_stmt_item (T_COMMA assignment_stmt_item)* ; assignment_stmt_item : @@ -145,9 +146,9 @@ declare_block : // Declaration block declare_stmt_item : - declare_var_item + declare_cursor_item + | declare_var_item | declare_condition_item - | declare_cursor_item | declare_handler_item | declare_temporary_table_item ; @@ -254,6 +255,7 @@ dtype : // Data types | T_RESULT_SET_LOCATOR T_VARYING | T_SMALLINT | T_STRING + | T_SYS_REFCURSOR | T_TIMESTAMP | T_VARCHAR | T_VARCHAR2 @@ -391,7 +393,7 @@ map_object_stmt : ; open_stmt : // OPEN cursor statement - T_OPEN L_ID (T_FOR (expr | select_stmt))? + T_OPEN L_ID (T_FOR (select_stmt | expr))? ; fetch_stmt : // FETCH cursor statement @@ -460,6 +462,14 @@ rollback_stmt : // ROLLBACK statement T_ROLLBACK T_WORK? ; +set_session_option : + set_current_schema_option + ; + +set_current_schema_option : + ((T_CURRENT? T_SCHEMA) | T_CURRENT_SCHEMA) T_EQUAL? expr + ; + signal_stmt : // SIGNAL statement T_SIGNAL ident ; @@ -675,6 +685,7 @@ bool_expr : // Boolean condition bool_expr_atom : bool_expr_unary | bool_expr_binary + | expr ; bool_expr_unary : @@ -722,6 +733,7 @@ expr : | T_OPEN_P expr T_CLOSE_P | expr_concat | expr_case + | expr_cursor_attribute | expr_agg_window_func | expr_spec_func | expr_func @@ -777,6 +789,10 @@ expr_case_searched : T_CASE (T_WHEN bool_expr T_THEN expr)+ (T_ELSE expr)? T_END ; +expr_cursor_attribute : + ident '%' (T_ISOPEN | T_FOUND | T_NOTFOUND) + ; + expr_agg_window_func : T_AVG T_OPEN_P expr_func_all_distinct? expr T_CLOSE_P expr_func_over_clause? | T_COUNT T_OPEN_P ((expr_func_all_distinct? expr) | '*') T_CLOSE_P expr_func_over_clause? @@ -937,6 +953,7 @@ non_reserved_words : // Tokens that are not reserved words | T_CS | T_CURRENT | T_CURRENT_DATE + | T_CURRENT_SCHEMA | T_CURRENT_TIMESTAMP | T_CURRENT_USER | T_CURSOR @@ -1007,6 +1024,7 @@ non_reserved_words : // Tokens that are not reserved words | T_INVOKER | T_ITEMS | T_IS + | T_ISOPEN | T_JOIN | T_KEY | T_KEYS @@ -1033,7 +1051,8 @@ non_reserved_words : // Tokens that are not reserved words | T_MICROSECONDS | T_MIN | T_MULTISET - | T_NOT + | T_NOT + | T_NOTFOUND // T_NULL reserved word | T_NUMBER | T_OBJECT @@ -1072,6 +1091,7 @@ non_reserved_words : // Tokens that are not reserved words | T_ROWS | T_ROW_COUNT | T_ROW_NUMBER + | T_SCHEMA | T_SECURITY | T_SEL | T_SELECT @@ -1089,7 +1109,8 @@ non_reserved_words : // Tokens that are not reserved words | T_STRING | T_SUBSTRING | T_SUM - | T_SYSDATE + | T_SYSDATE + | T_SYS_REFCURSOR | T_TABLE | T_TEMPORARY | T_TERMINATED @@ -1160,6 +1181,7 @@ T_CREATE : C R E A T E ; T_CREATOR : C R E A T O R ; T_CS : C S; T_CURRENT : C U R R E N T ; +T_CURRENT_SCHEMA : C U R R E N T '_' S C H E M A ; T_CURSOR : C U R S O R ; T_DATE : D A T E ; T_DAY : D A Y ; @@ -1225,6 +1247,7 @@ T_INTERSECT : I N T E R S E C T ; T_INTO : I N T O ; T_INVOKER : I N V O K E R ; T_IS : I S ; +T_ISOPEN : I S O P E N ; T_ITEMS : I T E M S ; T_JOIN : J O I N ; T_KEY : K E Y ; @@ -1250,6 +1273,7 @@ T_MICROSECONDS : M I C R O S E C O N D S; T_MIN : M I N ; T_MULTISET : M U L T I S E T ; T_NOT : N O T ; +T_NOTFOUND : N O T F O U N D ; T_NULL : N U L L ; T_NUMBER : N U M B E R ; T_OBJECT : O B J E C T ; @@ -1286,6 +1310,7 @@ T_ROW_COUNT : R O W '_' C O U N T ; T_RR : R R; T_RS : R S ; T_TRIM : T R I M ; +T_SCHEMA : S C H E M A ; T_SECURITY : S E C U R I T Y ; T_SEL : S E L ; T_SELECT : S E L E C T ; @@ -1302,6 +1327,7 @@ T_STEP : S T E P ; T_STRING : S T R I N G ; T_SUBSTRING : S U B S T R I N G ; T_SUM : S U M ; +T_SYS_REFCURSOR : S Y S '_' R E F C U R S O R ; T_TABLE : T A B L E ; T_TEMPORARY : T E M P O R A R Y ; T_TERMINATED : T E R M I N A T E D ; diff --git hplsql/src/main/java/org/apache/hive/hplsql/Conn.java hplsql/src/main/java/org/apache/hive/hplsql/Conn.java index ac4b521..c8cc910 100644 --- hplsql/src/main/java/org/apache/hive/hplsql/Conn.java +++ hplsql/src/main/java/org/apache/hive/hplsql/Conn.java @@ -57,6 +57,7 @@ public Query executeQuery(Query query, String connName) { Connection conn = getConnection(connName); runPreSql(connName, conn); Statement stmt = conn.createStatement(); + exec.info(null, "Starting query"); timer.start(); ResultSet rs = stmt.executeQuery(query.sql); timer.stop(); @@ -84,10 +85,15 @@ public Query executeSql(String sql, String connName) { runPreSql(connName, conn); Statement stmt = conn.createStatement(); ResultSet rs = null; + exec.info(null, "Starting SQL statement"); + timer.start(); if (stmt.execute(sql)) { rs = stmt.getResultSet(); } query.set(conn, stmt, rs); + if (info) { + exec.info(null, "SQL statement executed successfully (" + timer.format() + ")"); + } } catch (Exception e) { query.setError(e); } diff --git hplsql/src/main/java/org/apache/hive/hplsql/Exec.java hplsql/src/main/java/org/apache/hive/hplsql/Exec.java index b35344f..e143136 100644 --- hplsql/src/main/java/org/apache/hive/hplsql/Exec.java +++ hplsql/src/main/java/org/apache/hive/hplsql/Exec.java @@ -232,7 +232,7 @@ public void stackPush(StringBuilder val) { /** * Push a boolean value to the stack */ - public void stackPush(boolean val) { + public void stackPush(Boolean val) { exec.stack.push(new Var(val)); } @@ -832,7 +832,7 @@ void printExceptions() { while (!signals.empty()) { Signal sig = signals.pop(); if (sig.type == Signal.Type.SQLEXCEPTION) { - System.err.println("Unhandled exception in PL/HQL"); + System.err.println("Unhandled exception in HPL/SQL"); } if (sig.exception != null) { sig.exception.printStackTrace(); @@ -1320,6 +1320,15 @@ public Integer visitBool_expr_unary(HplsqlParser.Bool_expr_unaryContext ctx) { } return 0; } + + /** + * Cursor attribute %ISOPEN, %FOUND and %NOTFOUND + */ + @Override + public Integer visitExpr_cursor_attribute(HplsqlParser.Expr_cursor_attributeContext ctx) { + exec.expr.execCursorAttribute(ctx); + return 0; + } /** * Function call @@ -1498,6 +1507,14 @@ public Integer visitReturn_stmt(HplsqlParser.Return_stmtContext ctx) { return exec.stmt.return_(ctx); } + /** + * SET session options + */ + @Override + public Integer visitSet_current_schema_option(HplsqlParser.Set_current_schema_optionContext ctx) { + return exec.stmt.setCurrentSchema(ctx); + } + /** * MAP OBJECT statement */ diff --git hplsql/src/main/java/org/apache/hive/hplsql/Expression.java hplsql/src/main/java/org/apache/hive/hplsql/Expression.java index f8b01e1..772c98a 100644 --- hplsql/src/main/java/org/apache/hive/hplsql/Expression.java +++ hplsql/src/main/java/org/apache/hive/hplsql/Expression.java @@ -268,6 +268,34 @@ public void multiInClauseSql(HplsqlParser.Bool_expr_multi_inContext ctx, StringB } /** + * Cursor attribute %ISOPEN, %FOUND and %NOTFOUND + */ + public void execCursorAttribute(HplsqlParser.Expr_cursor_attributeContext ctx) { + String name = ctx.ident().getText(); + Var val = new Var(Var.Type.BOOL); + Var cursor = exec.findCursor(name); + if (cursor != null) { + Query query = (Query)cursor.value; + if (query != null) { + if (ctx.T_ISOPEN() != null) { + val.setValue(query.isOpen()); + } + else if (ctx.T_FOUND() != null) { + val.setValue(query.isFound()); + } + else if (ctx.T_NOTFOUND() != null) { + val.setValue(query.isNotFound()); + } + } + exec.stackPush(val); + } + else { + trace(ctx, "Cursor not found: " + name); + exec.signal(Signal.Type.SQLEXCEPTION); + } + } + + /** * Addition operator */ public void operatorAdd(HplsqlParser.ExprContext ctx) { diff --git hplsql/src/main/java/org/apache/hive/hplsql/Query.java hplsql/src/main/java/org/apache/hive/hplsql/Query.java index eaaaa67..08cd6a7 100644 --- hplsql/src/main/java/org/apache/hive/hplsql/Query.java +++ hplsql/src/main/java/org/apache/hive/hplsql/Query.java @@ -34,6 +34,9 @@ Statement stmt; ResultSet rs; Exception exception; + + public enum State { OPEN, FETCHED_OK, FETCHED_NODATA, CLOSE }; + State state = State.CLOSE; boolean withReturn = false; @@ -51,6 +54,21 @@ public void set(Connection conn, Statement stmt, ResultSet rs) { this.conn = conn; this.stmt = stmt; this.rs = rs; + if (rs != null) { + state = State.OPEN; + } + } + + /** + * Set the fetch status + */ + public void setFetch(boolean ok) { + if (ok == true) { + state = State.FETCHED_OK; + } + else { + state = State.FETCHED_NODATA; + } } /** @@ -66,6 +84,42 @@ public int getRowCount() { } /** + * Check if the cursor is open + */ + public boolean isOpen() { + if (rs != null) { + return true; + } + return false; + } + + /** + * Check if the cursor was fetched and a row was returned + */ + public Boolean isFound() { + if (state == State.OPEN || state == State.CLOSE) { + return null; + } + if (state == State.FETCHED_OK) { + return Boolean.valueOf(true); + } + return Boolean.valueOf(false); + } + + /** + * Check if the cursor was fetched and no row was returned + */ + public Boolean isNotFound() { + if (state == State.OPEN || state == State.CLOSE) { + return null; + } + if (state == State.FETCHED_NODATA) { + return Boolean.valueOf(true); + } + return Boolean.valueOf(false); + } + + /** * Close statement results */ public void closeStatement() { @@ -78,6 +132,7 @@ public void closeStatement() { stmt.close(); stmt = null; } + state = State.CLOSE; } catch (SQLException e) { e.printStackTrace(); } diff --git hplsql/src/main/java/org/apache/hive/hplsql/Stmt.java hplsql/src/main/java/org/apache/hive/hplsql/Stmt.java index bfb76cd..9a5e970 100644 --- hplsql/src/main/java/org/apache/hive/hplsql/Stmt.java +++ hplsql/src/main/java/org/apache/hive/hplsql/Stmt.java @@ -280,18 +280,24 @@ public Integer open(HplsqlParser.Open_stmtContext ctx) { Var var = null; String cursor = ctx.L_ID().toString(); String sql = null; - // Dynamic SQL - if (ctx.T_FOR() != null) { - sql = evalPop(ctx.expr()).toString(); - if (trace) { - trace(ctx, cursor + ": " + sql); + if (ctx.T_FOR() != null) { // SELECT statement or dynamic SQL + if (ctx.expr() != null) { + sql = evalPop(ctx.expr()).toString(); + } + else { + sql = evalPop(ctx.select_stmt()).toString(); } query = new Query(sql); - var = new Var(cursor, Type.CURSOR, query); - exec.addVariable(var); + var = exec.findCursor(cursor); // Can be a ref cursor variable + if (var == null) { + var = new Var(cursor, Type.CURSOR, query); + exec.addVariable(var); + } + else { + var.setValue(query); + } } - // Declared cursor - else { + else { // Declared cursor var = exec.findVariable(cursor); if (var != null && var.type == Type.CURSOR) { query = (Query)var.value; @@ -303,13 +309,12 @@ else if (query.sqlSelect != null) { sql = evalPop(query.sqlSelect).toString(); query.setSql(sql); } - if (trace) { - trace(ctx, cursor + ": " + sql); - } } } - // Open cursor now if (query != null) { + if (trace) { + trace(ctx, cursor + ": " + sql); + } exec.executeQuery(ctx, query, exec.conf.defaultConnection); if (query.error()) { exec.signal(query); @@ -343,7 +348,13 @@ public Integer fetch(HplsqlParser.Fetch_stmtContext ctx) { exec.setSqlCode(-1); exec.signal(Signal.Type.SQLEXCEPTION); return 1; - } + } + else if (cursor.value == null) { + trace(ctx, "Cursor not open: " + name); + exec.setSqlCode(-1); + exec.signal(Signal.Type.SQLEXCEPTION); + return 1; + } else if (exec.getOffline()) { exec.setSqlCode(100); exec.signal(Signal.Type.NOTFOUND); @@ -360,6 +371,7 @@ else if (exec.getOffline()) { if(rs != null && rsm != null) { int cols = ctx.L_ID().size() - 1; if(rs.next()) { + query.setFetch(true); for(int i=1; i <= cols; i++) { Var var = exec.findVariable(ctx.L_ID(i).getText()); if(var != null) { @@ -377,6 +389,7 @@ else if(trace) { exec.setSqlSuccess(); } else { + query.setFetch(false); exec.setSqlCode(100); } } @@ -639,12 +652,13 @@ public Integer getDiagnosticsRowCount(HplsqlParser.Get_diag_stmt_rowcount_itemCo * USE statement */ public Integer use(HplsqlParser.Use_stmtContext ctx) { + trace(ctx, "USE"); + return use(ctx, ctx.T_USE().toString() + " " + evalPop(ctx.expr()).toString()); + } + + public Integer use(ParserRuleContext ctx, String sql) { if(trace) { - trace(ctx, "USE"); - } - String sql = ctx.T_USE().toString() + " " + evalPop(ctx.expr()).toString(); - if(trace) { - trace(ctx, "Query: " + sql); + trace(ctx, "SQL statement: " + sql); } Query query = exec.executeSql(ctx, sql, exec.conf.defaultConnection); if(query.error()) { @@ -959,6 +973,14 @@ public Integer print(HplsqlParser.Print_stmtContext ctx) { return 0; } + /** + * SET current schema + */ + public Integer setCurrentSchema(HplsqlParser.Set_current_schema_optionContext ctx) { + trace(ctx, "SET CURRENT SCHEMA"); + return use(ctx, "USE " + evalPop(ctx.expr()).toString()); + } + /** * SIGNAL statement */ diff --git hplsql/src/main/java/org/apache/hive/hplsql/Var.java hplsql/src/main/java/org/apache/hive/hplsql/Var.java index 87b42f9..7e4ae52 100644 --- hplsql/src/main/java/org/apache/hive/hplsql/Var.java +++ hplsql/src/main/java/org/apache/hive/hplsql/Var.java @@ -32,7 +32,7 @@ public class Var { // Data types - public enum Type {BOOL, CURSOR, DATE, DEC, FILE, IDENT, BIGINT, INTERVAL, RS_LOCATOR, STRING, STRINGLIST, TIMESTAMP, NULL}; + public enum Type {BOOL, CURSOR, DATE, DECIMAL, FILE, IDENT, BIGINT, INTERVAL, RS_LOCATOR, STRING, STRINGLIST, TIMESTAMP, NULL}; public static Var Empty = new Var(); public static Var Null = new Var(Type.NULL); @@ -61,7 +61,7 @@ public Var(Long value) { } public Var(BigDecimal value) { - this.type = Type.DEC; + this.type = Type.DECIMAL; this.value = value; } @@ -194,6 +194,13 @@ public Var setValue(Long val) { return this; } + public Var setValue(Boolean val) { + if (type == Type.BOOL) { + value = val; + } + return this; + } + public void setValue(Object value) { this.value = value; } @@ -209,6 +216,9 @@ public Var setValue(ResultSet rs, ResultSetMetaData rsm, int idx) throws SQLExce else if (type == java.sql.Types.INTEGER || type == java.sql.Types.BIGINT) { cast(new Var(new Long(rs.getLong(idx)))); } + else if (type == java.sql.Types.DECIMAL || type == java.sql.Types.NUMERIC) { + cast(new Var(rs.getBigDecimal(idx))); + } return this; } @@ -239,12 +249,18 @@ else if (type.equalsIgnoreCase("INT") || type.equalsIgnoreCase("INTEGER")) { else if (type.equalsIgnoreCase("CHAR") || type.equalsIgnoreCase("VARCHAR") || type.equalsIgnoreCase("STRING")) { return Type.STRING; } + else if (type.equalsIgnoreCase("DEC") || type.equalsIgnoreCase("DECIMAL") || type.equalsIgnoreCase("NUMERIC")) { + return Type.DECIMAL; + } else if (type.equalsIgnoreCase("DATE")) { return Type.DATE; } else if (type.equalsIgnoreCase("TIMESTAMP")) { return Type.TIMESTAMP; } + else if (type.equalsIgnoreCase("SYS_REFCURSOR")) { + return Type.CURSOR; + } else if (type.equalsIgnoreCase("UTL_FILE.FILE_TYPE")) { return Type.FILE; } diff --git hplsql/src/test/queries/db/cursor_attributes.sql hplsql/src/test/queries/db/cursor_attributes.sql new file mode 100644 index 0000000..9b1e9db --- /dev/null +++ hplsql/src/test/queries/db/cursor_attributes.sql @@ -0,0 +1,60 @@ +DECLARE + CURSOR c1 IS SELECT 'A' FROM src LIMIT 1; + v1 VARCHAR(30); +BEGIN + IF c1%ISOPEN THEN + DBMS_OUTPUT.PUT_LINE('%ISOPEN failed'); + ELSE + DBMS_OUTPUT.PUT_LINE('%ISOPEN correct'); + END IF; + + OPEN c1; + + IF c1%ISOPEN THEN + DBMS_OUTPUT.PUT_LINE('%ISOPEN correct'); + ELSE + DBMS_OUTPUT.PUT_LINE('%ISOPEN failed'); + END IF; + + IF c1%FOUND IS NULL THEN + DBMS_OUTPUT.PUT_LINE('%FOUND correct'); + ELSE + DBMS_OUTPUT.PUT_LINE('%FOUND failed'); + END IF; + + IF c1%NOTFOUND IS NULL THEN + DBMS_OUTPUT.PUT_LINE('%NOTFOUND correct'); + ELSE + DBMS_OUTPUT.PUT_LINE('%NOTFOUND failed'); + END IF; + + FETCH c1 INTO v1; + + IF c1%FOUND THEN + DBMS_OUTPUT.PUT_LINE('%FOUND correct'); + ELSE + DBMS_OUTPUT.PUT_LINE('%FOUND failed'); + END IF; + + IF c1%NOTFOUND THEN + DBMS_OUTPUT.PUT_LINE('%NOTFOUND failed'); + ELSE + DBMS_OUTPUT.PUT_LINE('%NOTFOUND correct'); + END IF; + + FETCH c1 INTO v1; + + IF c1%FOUND THEN + DBMS_OUTPUT.PUT_LINE('%FOUND failed'); + ELSE + DBMS_OUTPUT.PUT_LINE('%FOUND correct'); + END IF; + + IF c1%NOTFOUND THEN + DBMS_OUTPUT.PUT_LINE('%NOTFOUND correct'); + ELSE + DBMS_OUTPUT.PUT_LINE('%NOTFOUND failed'); + END IF; + + CLOSE c1; +END; \ No newline at end of file diff --git hplsql/src/test/queries/db/select_into.sql hplsql/src/test/queries/db/select_into.sql new file mode 100644 index 0000000..3995ba2 --- /dev/null +++ hplsql/src/test/queries/db/select_into.sql @@ -0,0 +1,17 @@ +DECLARE v_int INT; +DECLARE v_dec DECIMAL(18,2); +DECLARE v_dec0 DECIMAL(18,0); + +SELECT TOP 1 + CAST(1 AS INT), + CAST(1.1 AS DECIMAL(18,2)), + CAST(1.1 AS DECIMAL(18,0)) +INTO + v_int, + v_dec, + v_dec0 +FROM src ; + +PRINT 'INT: ' || v_int; +PRINT 'DECIMAL: ' || v_dec; +PRINT 'DECIMAL0: ' || v_dec0; \ No newline at end of file diff --git hplsql/src/test/queries/db/set_current_schema.sql hplsql/src/test/queries/db/set_current_schema.sql new file mode 100644 index 0000000..059ef22 --- /dev/null +++ hplsql/src/test/queries/db/set_current_schema.sql @@ -0,0 +1,6 @@ +SET CURRENT SCHEMA = default; +SET CURRENT_SCHEMA = default; +SET SCHEMA = default; +SET SCHEMA default; +SET SCHEMA = 'default'; +SET SCHEMA 'def' || 'ault'; \ No newline at end of file diff --git hplsql/src/test/queries/db/sys_refcursor.sql hplsql/src/test/queries/db/sys_refcursor.sql new file mode 100644 index 0000000..eeb98ed --- /dev/null +++ hplsql/src/test/queries/db/sys_refcursor.sql @@ -0,0 +1,65 @@ +CREATE PROCEDURE spResultSet1 (cur OUT SYS_REFCURSOR) +BEGIN + OPEN cur FOR SELECT 'A' FROM src LIMIT 1; +END; + +DECLARE + c1 SYS_REFCURSOR; + v1 VARCHAR(30); +BEGIN + IF c1%ISOPEN THEN + DBMS_OUTPUT.PUT_LINE('%ISOPEN failed'); + ELSE + DBMS_OUTPUT.PUT_LINE('%ISOPEN correct'); + END IF; + + CALL spResultSet1(c1); + + IF c1%ISOPEN THEN + DBMS_OUTPUT.PUT_LINE('%ISOPEN correct'); + ELSE + DBMS_OUTPUT.PUT_LINE('%ISOPEN failed'); + END IF; + + IF c1%FOUND IS NULL THEN + DBMS_OUTPUT.PUT_LINE('%FOUND correct'); + ELSE + DBMS_OUTPUT.PUT_LINE('%FOUND failed'); + END IF; + + IF c1%NOTFOUND IS NULL THEN + DBMS_OUTPUT.PUT_LINE('%NOTFOUND correct'); + ELSE + DBMS_OUTPUT.PUT_LINE('%NOTFOUND failed'); + END IF; + + FETCH c1 INTO v1; + + IF c1%FOUND THEN + DBMS_OUTPUT.PUT_LINE('%FOUND correct'); + ELSE + DBMS_OUTPUT.PUT_LINE('%FOUND failed'); + END IF; + + IF c1%NOTFOUND THEN + DBMS_OUTPUT.PUT_LINE('%NOTFOUND failed'); + ELSE + DBMS_OUTPUT.PUT_LINE('%NOTFOUND correct'); + END IF; + + FETCH c1 INTO v1; + + IF c1%FOUND THEN + DBMS_OUTPUT.PUT_LINE('%FOUND failed'); + ELSE + DBMS_OUTPUT.PUT_LINE('%FOUND correct'); + END IF; + + IF c1%NOTFOUND THEN + DBMS_OUTPUT.PUT_LINE('%NOTFOUND correct'); + ELSE + DBMS_OUTPUT.PUT_LINE('%NOTFOUND failed'); + END IF; + + CLOSE c1; +END; \ No newline at end of file diff --git hplsql/src/test/queries/db/use.sql hplsql/src/test/queries/db/use.sql new file mode 100644 index 0000000..dab0615 --- /dev/null +++ hplsql/src/test/queries/db/use.sql @@ -0,0 +1,2 @@ +USE default; +USE SUBSTR('default', 1, 7); \ No newline at end of file diff --git hplsql/src/test/results/db/cursor_attributes.out.txt hplsql/src/test/results/db/cursor_attributes.out.txt new file mode 100644 index 0000000..fbc8eef --- /dev/null +++ hplsql/src/test/results/db/cursor_attributes.out.txt @@ -0,0 +1,33 @@ +Ln:2 DECLARE CURSOR c1 +Ln:3 DECLARE v1 VARCHAR +Ln:5 IF +Ln:5 ELSE executed +%ISOPEN correct +Ln:11 OPEN +Ln:11 c1: SELECT 'A' FROM src LIMIT 1 +Ln:13 IF +Ln:13 IF TRUE executed +%ISOPEN correct +Ln:19 IF +Ln:19 IF TRUE executed +%FOUND correct +Ln:25 IF +Ln:25 IF TRUE executed +%NOTFOUND correct +Ln:31 FETCH +Ln:31 COLUMN: _c0, string +Ln:31 SET v1 = A +Ln:33 IF +Ln:33 IF TRUE executed +%FOUND correct +Ln:39 IF +Ln:39 ELSE executed +%NOTFOUND correct +Ln:45 FETCH +Ln:47 IF +Ln:47 ELSE executed +%FOUND correct +Ln:53 IF +Ln:53 IF TRUE executed +%NOTFOUND correct +Ln:59 CLOSE \ No newline at end of file diff --git hplsql/src/test/results/db/select_into.out.txt hplsql/src/test/results/db/select_into.out.txt new file mode 100644 index 0000000..80d067e --- /dev/null +++ hplsql/src/test/results/db/select_into.out.txt @@ -0,0 +1,19 @@ +Ln:1 DECLARE v_int INT +Ln:2 DECLARE v_dec DECIMAL +Ln:3 DECLARE v_dec0 DECIMAL +Ln:5 SELECT +Ln:5 SELECT CAST(1 AS INT), CAST(1.1 AS DECIMAL(18,2)), CAST(1.1 AS DECIMAL(18,0)) FROM src LIMIT 1 +Ln:5 SELECT completed successfully +Ln:5 SELECT INTO statement executed +Ln:5 COLUMN: _c0, int +Ln:5 SET v_int = 1 +Ln:5 COLUMN: _c1, decimal +Ln:5 SET v_dec = 1.1 +Ln:5 COLUMN: _c2, decimal +Ln:5 SET v_dec0 = 1 +Ln:15 PRINT +INT: 1 +Ln:16 PRINT +DECIMAL: 1.1 +Ln:17 PRINT +DECIMAL0: 1 \ No newline at end of file diff --git hplsql/src/test/results/db/set_current_schema.out.txt hplsql/src/test/results/db/set_current_schema.out.txt new file mode 100644 index 0000000..6ef8572 --- /dev/null +++ hplsql/src/test/results/db/set_current_schema.out.txt @@ -0,0 +1,12 @@ +Ln:1 SET CURRENT SCHEMA +Ln:1 SQL statement: USE default +Ln:2 SET CURRENT SCHEMA +Ln:2 SQL statement: USE default +Ln:3 SET CURRENT SCHEMA +Ln:3 SQL statement: USE default +Ln:4 SET CURRENT SCHEMA +Ln:4 SQL statement: USE default +Ln:5 SET CURRENT SCHEMA +Ln:5 SQL statement: USE default +Ln:6 SET CURRENT SCHEMA +Ln:6 SQL statement: USE default \ No newline at end of file diff --git hplsql/src/test/results/db/sys_refcursor.out.txt hplsql/src/test/results/db/sys_refcursor.out.txt new file mode 100644 index 0000000..08239cf --- /dev/null +++ hplsql/src/test/results/db/sys_refcursor.out.txt @@ -0,0 +1,36 @@ +Ln:1 CREATE PROCEDURE spResultSet1 +Ln:7 DECLARE c1 SYS_REFCURSOR +Ln:8 DECLARE v1 VARCHAR +Ln:10 IF +Ln:10 ELSE executed +%ISOPEN correct +Ln:16 EXEC PROCEDURE spResultSet1 +Ln:16 SET PARAM cur = null +Ln:3 OPEN +Ln:3 cur: SELECT 'A' FROM src LIMIT 1 +Ln:18 IF +Ln:18 IF TRUE executed +%ISOPEN correct +Ln:24 IF +Ln:24 IF TRUE executed +%FOUND correct +Ln:30 IF +Ln:30 IF TRUE executed +%NOTFOUND correct +Ln:36 FETCH +Ln:36 COLUMN: _c0, string +Ln:36 SET v1 = A +Ln:38 IF +Ln:38 IF TRUE executed +%FOUND correct +Ln:44 IF +Ln:44 ELSE executed +%NOTFOUND correct +Ln:50 FETCH +Ln:52 IF +Ln:52 ELSE executed +%FOUND correct +Ln:58 IF +Ln:58 IF TRUE executed +%NOTFOUND correct +Ln:64 CLOSE \ No newline at end of file diff --git hplsql/src/test/results/db/use.out.txt hplsql/src/test/results/db/use.out.txt new file mode 100644 index 0000000..4a478f7 --- /dev/null +++ hplsql/src/test/results/db/use.out.txt @@ -0,0 +1,4 @@ +Ln:1 USE +Ln:1 SQL statement: USE default +Ln:2 USE +Ln:2 SQL statement: USE default \ No newline at end of file