HIVE-11354 HPL/SQL extending compatibility with Transact-SQL (Dmitry Tolpeko via gates)
Project: http://git-wip-us.apache.org/repos/asf/hive/repo Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/9adc385f Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/9adc385f Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/9adc385f Branch: refs/heads/llap Commit: 9adc385f73a51c79b2b7bc31fc87c47bf625fd1c Parents: 46739a6 Author: Alan Gates <[email protected]> Authored: Tue Aug 4 16:22:50 2015 -0700 Committer: Alan Gates <[email protected]> Committed: Tue Aug 4 16:22:50 2015 -0700 ---------------------------------------------------------------------- .../antlr4/org/apache/hive/hplsql/Hplsql.g4 | 126 ++++++++++++++++--- .../java/org/apache/hive/hplsql/Converter.java | 41 ++++-- .../main/java/org/apache/hive/hplsql/Exec.java | 42 +++++-- .../java/org/apache/hive/hplsql/Expression.java | 45 +++++-- .../main/java/org/apache/hive/hplsql/Meta.java | 98 +++++++++++++++ .../java/org/apache/hive/hplsql/Select.java | 47 +++++-- .../java/org/apache/hive/hplsql/Signal.java | 2 +- .../main/java/org/apache/hive/hplsql/Stmt.java | 41 ++++-- .../main/java/org/apache/hive/hplsql/Var.java | 23 +++- .../apache/hive/hplsql/functions/Function.java | 49 ++++++-- .../hive/hplsql/functions/FunctionDatetime.java | 14 +-- .../hive/hplsql/functions/FunctionMisc.java | 22 ++-- .../hive/hplsql/functions/FunctionOra.java | 31 +++-- .../hive/hplsql/functions/FunctionString.java | 46 +++---- .../org/apache/hive/hplsql/TestHplsqlLocal.java | 5 + .../apache/hive/hplsql/TestHplsqlOffline.java | 76 +++++++++++ .../test/queries/db/create_procedure_mssql.sql | 52 ++++++++ hplsql/src/test/queries/db/map_object.sql | 9 ++ .../queries/local/exception_divide_by_zero.sql | 11 ++ .../test/queries/offline/create_table_mssql.sql | 43 +++++++ .../test/queries/offline/create_table_ora.sql | 4 + .../results/db/create_procedure_mssql.out.txt | 45 +++++++ hplsql/src/test/results/db/map_object.out.txt | 17 +++ .../test/results/local/create_function.out.txt | 4 +- hplsql/src/test/results/local/declare.out.txt | 4 +- .../local/exception_divide_by_zero.out.txt | 8 ++ .../results/offline/create_table_mssql.out.txt | 24 ++++ .../results/offline/create_table_ora.out.txt | 4 + 28 files changed, 785 insertions(+), 148 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hive/blob/9adc385f/hplsql/src/main/antlr4/org/apache/hive/hplsql/Hplsql.g4 ---------------------------------------------------------------------- diff --git a/hplsql/src/main/antlr4/org/apache/hive/hplsql/Hplsql.g4 b/hplsql/src/main/antlr4/org/apache/hive/hplsql/Hplsql.g4 index 4104d13..6027206 100644 --- a/hplsql/src/main/antlr4/org/apache/hive/hplsql/Hplsql.g4 +++ b/hplsql/src/main/antlr4/org/apache/hive/hplsql/Hplsql.g4 @@ -20,16 +20,21 @@ grammar Hplsql; program : block ; -block : (begin_end_block | stmt)+ ; // Multiple consecutive blocks/statements +block : ((begin_end_block | stmt) T_GO?)+ ; // Multiple consecutive blocks/statements begin_end_block : declare_block? T_BEGIN block exception_block? T_END ; single_block_stmt : // Single BEGIN END block (but nested blocks are possible) or single statement - T_BEGIN block T_END + T_BEGIN block T_END | stmt T_SEMICOLON? ; + +proc_block : + T_BEGIN block T_END + | stmt+ T_GO? + ; stmt : assignment_stmt @@ -82,7 +87,7 @@ stmt : semicolon_stmt : T_SEMICOLON - | '@' | '#' | '/' + | '@' | '#' | '/' ; exception_block : // Exception block @@ -94,7 +99,7 @@ exception_block_item : ; expr_stmt : // Standalone expression - expr + {!_input.LT(1).getText().equalsIgnoreCase("GO")}? expr ; assignment_stmt : // Assignment statement @@ -133,7 +138,7 @@ break_stmt : ; call_stmt : - T_CALL ident expr_func_params? + T_CALL ident (T_OPEN_P expr_func_params T_CLOSE_P | expr_func_params)? ; declare_stmt : // Declaration statement @@ -182,7 +187,7 @@ declare_temporary_table_item : // DECLARE TEMPORARY TABLE statement ; create_table_stmt : - T_CREATE T_TABLE (T_IF T_NOT T_EXISTS)? ident T_OPEN_P create_table_columns T_CLOSE_P create_table_options? + T_CREATE T_TABLE (T_IF T_NOT T_EXISTS)? table_name T_OPEN_P create_table_columns T_CLOSE_P create_table_options? ; create_local_temp_table_stmt : @@ -194,18 +199,23 @@ create_table_columns : ; create_table_columns_item : - ident dtype dtype_len? dtype_attr* create_table_column_inline_cons? - | T_CONSTRAINT ident create_table_column_cons + column_name dtype dtype_len? dtype_attr* create_table_column_inline_cons* + | (T_CONSTRAINT ident)? create_table_column_cons + ; + +column_name : + ident ; create_table_column_inline_cons : dtype_default | T_NOT? T_NULL | T_PRIMARY T_KEY + | T_IDENTITY T_OPEN_P L_INT (T_COMMA L_INT)* T_CLOSE_P ; create_table_column_cons : - T_PRIMARY T_KEY T_OPEN_P ident (T_COMMA ident)* T_CLOSE_P + T_PRIMARY T_KEY T_CLUSTERED? T_OPEN_P ident (T_ASC | T_DESC)? (T_COMMA ident (T_ASC | T_DESC)?)* T_CLOSE_P index_storage_clause? ; create_table_options : @@ -216,6 +226,7 @@ create_table_options_item : T_ON T_COMMIT (T_DELETE | T_PRESERVE) T_ROWS | create_table_options_db2_item | create_table_options_hive_item + | create_table_options_mssql_item ; create_table_options_db2_item : @@ -242,28 +253,40 @@ create_table_hive_row_format_fields : | T_NULL T_DEFINED T_AS expr ; +create_table_options_mssql_item : + T_ON ident + | T_TEXTIMAGE_ON ident + ; + dtype : // Data types T_CHAR | T_BIGINT + | T_BIT | T_DATE + | T_DATETIME | T_DEC | T_DECIMAL | T_FLOAT | T_INT | T_INTEGER + | T_NCHAR + | T_NVARCHAR | T_NUMBER + | T_NUMERIC | T_RESULT_SET_LOCATOR T_VARYING | T_SMALLINT + | T_SMALLDATETIME | T_STRING | T_SYS_REFCURSOR | T_TIMESTAMP + | T_TINYINT | T_VARCHAR | T_VARCHAR2 | L_ID // User-defined data type ; dtype_len : // Data type length or size specification - T_OPEN_P L_INT (T_COMMA L_INT)? T_CLOSE_P + T_OPEN_P (L_INT | T_MAX) (T_COMMA L_INT)? T_CLOSE_P ; dtype_attr : @@ -285,11 +308,12 @@ create_function_return : ; create_procedure_stmt : - (T_ALTER | T_CREATE (T_OR T_REPLACE)? | T_REPLACE) (T_PROCEDURE | T_PROC) ident create_routine_params? create_routine_options? (T_AS | T_IS)? label? single_block_stmt (ident T_SEMICOLON)? + (T_ALTER | T_CREATE (T_OR T_REPLACE)? | T_REPLACE) (T_PROCEDURE | T_PROC) ident create_routine_params? create_routine_options? (T_AS | T_IS)? label? proc_block (ident T_SEMICOLON)? ; create_routine_params : - T_OPEN_P (create_routine_param_item (T_COMMA create_routine_param_item)*)? T_CLOSE_P + T_OPEN_P T_CLOSE_P + | T_OPEN_P? create_routine_param_item (T_COMMA create_routine_param_item)* T_CLOSE_P? ; create_routine_param_item : @@ -311,7 +335,7 @@ drop_stmt : // DROP statement ; exec_stmt : // EXEC, EXECUTE IMMEDIATE statement - (T_EXEC | T_EXECUTE) T_IMMEDIATE? expr (T_INTO L_ID (T_COMMA L_ID)*)? using_clause? + (T_EXEC | T_EXECUTE) T_IMMEDIATE? expr (T_OPEN_P expr_func_params T_CLOSE_P | expr_func_params)? (T_INTO L_ID (T_COMMA L_ID)*)? using_clause? ; if_stmt : // IF statement @@ -445,6 +469,14 @@ create_index_col : ident (T_ASC | T_DESC)? ; +index_storage_clause : + index_mssql_storage_clause + ; + +index_mssql_storage_clause : + T_WITH T_OPEN_P ident T_EQUAL ident (T_COMMA ident T_EQUAL ident)* T_CLOSE_P create_table_options_mssql_item* + ; + print_stmt : // PRINT statement T_PRINT expr | T_PRINT T_OPEN_P expr T_CLOSE_P @@ -464,12 +496,22 @@ rollback_stmt : // ROLLBACK statement set_session_option : set_current_schema_option + | set_mssql_session_option ; set_current_schema_option : ((T_CURRENT? T_SCHEMA) | T_CURRENT_SCHEMA) T_EQUAL? expr ; +set_mssql_session_option : + ( T_ANSI_NULLS + | T_ANSI_PADDING + | T_NOCOUNT + | T_QUOTED_IDENTIFIER + | T_XACT_ABORT ) + (T_ON | T_OFF) + ; + signal_stmt : // SIGNAL statement T_SIGNAL ident ; @@ -552,7 +594,7 @@ select_list_limit : ; select_list_item : - (expr select_list_alias? | select_list_asterisk) + ((ident T_EQUAL)? expr select_list_alias? | select_list_asterisk) ; select_list_alias : @@ -606,7 +648,9 @@ from_table_values_row: ; from_alias_clause : - {!_input.LT(1).getText().equalsIgnoreCase("GROUP") && + {!_input.LT(1).getText().equalsIgnoreCase("EXEC") && + !_input.LT(1).getText().equalsIgnoreCase("EXECUTE") && + !_input.LT(1).getText().equalsIgnoreCase("GROUP") && !_input.LT(1).getText().equalsIgnoreCase("ORDER") && !_input.LT(1).getText().equalsIgnoreCase("LIMIT")}? T_AS? ident (T_OPEN_P L_ID (T_COMMA L_ID)* T_CLOSE_P)? @@ -797,6 +841,7 @@ 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? | T_COUNT_BIG T_OPEN_P ((expr_func_all_distinct? expr) | '*') T_CLOSE_P expr_func_over_clause? + | T_CUME_DIST T_OPEN_P T_CLOSE_P expr_func_over_clause | T_DENSE_RANK T_OPEN_P T_CLOSE_P expr_func_over_clause | T_FIRST_VALUE T_OPEN_P expr T_CLOSE_P expr_func_over_clause | T_LAG T_OPEN_P expr (T_COMMA expr (T_COMMA expr)?)? T_CLOSE_P expr_func_over_clause @@ -846,12 +891,16 @@ expr_spec_func : ; expr_func : - ident expr_func_params + ident T_OPEN_P expr_func_params? T_CLOSE_P ; expr_func_params : - T_OPEN_P (expr (T_COMMA expr)*)? T_CLOSE_P + func_param (T_COMMA func_param)* ; + +func_param : + (ident T_EQUAL T_GREATER?)? expr + ; hive : T_HIVE hive_item* @@ -919,6 +968,8 @@ non_reserved_words : // Tokens that are not reserved words | T_ALLOCATE | T_ALTER | T_AND + | T_ANSI_NULLS + | T_ANSI_PADDING | T_AS | T_ASC | T_ASSOCIATE @@ -928,6 +979,7 @@ non_reserved_words : // Tokens that are not reserved words | T_BEGIN | T_BETWEEN | T_BIGINT + | T_BIT | T_BREAK | T_BY | T_CALL @@ -939,6 +991,7 @@ non_reserved_words : // Tokens that are not reserved words | T_CHARACTER | T_CLIENT | T_CLOSE + | T_CLUSTERED | T_COLLECTION | T_COPY | T_COMMIT @@ -951,13 +1004,15 @@ non_reserved_words : // Tokens that are not reserved words | T_CREATE | T_CREATOR | T_CS + | T_CUME_DIST | T_CURRENT | T_CURRENT_DATE | T_CURRENT_SCHEMA | T_CURRENT_TIMESTAMP | T_CURRENT_USER | T_CURSOR - | T_DATE + | T_DATE + | T_DATETIME | T_DAY | T_DAYS | T_DEC @@ -1001,13 +1056,15 @@ non_reserved_words : // Tokens that are not reserved words | T_FUNCTION | T_GET | T_GLOBAL + | T_GO | T_GRANT | T_GROUP | T_HANDLER | T_HASH | T_HAVING | T_HIVE - | T_HOST + | T_HOST + | T_IDENTITY | T_IF | T_IGNORE | T_IMMEDIATE @@ -1051,11 +1108,16 @@ non_reserved_words : // Tokens that are not reserved words | T_MICROSECONDS | T_MIN | T_MULTISET + | T_NCHAR + | T_NVARCHAR + | T_NOCOUNT | T_NOT | T_NOTFOUND // T_NULL reserved word + | T_NUMERIC | T_NUMBER - | T_OBJECT + | T_OBJECT + | T_OFF | T_ON | T_ONLY | T_OPEN @@ -1073,6 +1135,7 @@ non_reserved_words : // Tokens that are not reserved words | T_PRINT | T_PROC | T_PROCEDURE + | T_QUOTED_IDENTIFIER | T_RANK | T_REGEXP | T_RR @@ -1098,6 +1161,7 @@ non_reserved_words : // Tokens that are not reserved words | T_SET | T_SETS | T_SIGNAL + | T_SMALLDATETIME | T_SMALLINT | T_SQL | T_SQLEXCEPTION @@ -1114,6 +1178,7 @@ non_reserved_words : // Tokens that are not reserved words | T_TABLE | T_TEMPORARY | T_TERMINATED + | T_TEXTIMAGE_ON | T_THEN | T_TIMESTAMP | T_TITLE @@ -1141,6 +1206,7 @@ non_reserved_words : // Tokens that are not reserved words | T_WITH | T_WITHOUT | T_WORK + | T_XACT_ABORT ; // Lexer rules @@ -1148,6 +1214,8 @@ T_ALL : A L L ; T_ALLOCATE : A L L O C A T E ; T_ALTER : A L T E R ; T_AND : A N D ; +T_ANSI_NULLS : A N S I '_' N U L L S ; +T_ANSI_PADDING : A N S I '_' P A D D I N G ; T_AS : A S ; T_ASC : A S C ; T_ASSOCIATE : A S S O C I A T E ; @@ -1157,6 +1225,7 @@ T_BATCHSIZE : B A T C H S I Z E ; T_BEGIN : B E G I N ; T_BETWEEN : B E T W E E N ; T_BIGINT : B I G I N T ; +T_BIT : B I T ; T_BREAK : B R E A K ; T_BY : B Y ; T_CALL : C A L L ; @@ -1168,6 +1237,7 @@ T_CHAR : C H A R ; T_CHARACTER : C H A R A C T E R ; T_CLIENT : C L I E N T ; T_CLOSE : C L O S E ; +T_CLUSTERED : C L U S T E R E D; T_COLLECTION : C O L L E C T I O N ; T_COPY : C O P Y ; T_COMMIT : C O M M I T ; @@ -1184,6 +1254,7 @@ 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_DATETIME : D A T E T I M E ; T_DAY : D A Y ; T_DAYS : D A Y S ; T_DEC : D E C ; @@ -1225,6 +1296,7 @@ T_FULL : F U L L ; T_FUNCTION : F U N C T I O N ; T_GET : G E T ; T_GLOBAL : G L O B A L ; +T_GO : G O ; T_GRANT : G R A N T ; T_GROUP : G R O U P ; T_HANDLER : H A N D L E R ; @@ -1232,6 +1304,7 @@ T_HASH : H A S H ; T_HAVING : H A V I N G ; T_HIVE : H I V E ; T_HOST : H O S T ; +T_IDENTITY : I D E N T I T Y ; T_IF : I F ; T_IGNORE : I G N O R E ; T_IMMEDIATE : I M M E D I A T E ; @@ -1272,11 +1345,16 @@ T_MICROSECOND : M I C R O S E C O N D ; 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_NCHAR : N C H A R ; +T_NVARCHAR : N V A R C H A R ; +T_NOCOUNT : N O C O U N T ; T_NOT : N O T ; T_NOTFOUND : N O T F O U N D ; T_NULL : N U L L ; +T_NUMERIC : N U M E R I C ; T_NUMBER : N U M B E R ; T_OBJECT : O B J E C T ; +T_OFF : O F F ; T_ON : O N ; T_ONLY : O N L Y ; T_OPEN : O P E N ; @@ -1293,6 +1371,7 @@ T_PRIMARY : P R I M A R Y ; T_PRINT : P R I N T ; T_PROC : P R O C ; T_PROCEDURE : P R O C E D U R E; +T_QUOTED_IDENTIFIER : Q U O T E D '_' I D E N T I F I E R ; T_REGEXP : R E G E X P ; T_REPLACE : R E P L A C E ; T_RESIGNAL : R E S I G N A L ; @@ -1317,6 +1396,7 @@ T_SELECT : S E L E C T ; T_SET : S E T ; T_SETS : S E T S; T_SIGNAL : S I G N A L ; +T_SMALLDATETIME : S M A L L D A T E T I M E ; T_SMALLINT : S M A L L I N T ; T_SQL : S Q L ; T_SQLEXCEPTION : S Q L E X C E P T I O N ; @@ -1331,8 +1411,10 @@ 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 ; +T_TEXTIMAGE_ON : T E X T I M A G E '_' O N ; T_THEN : T H E N ; T_TIMESTAMP : T I M E S T A M P ; +T_TINYINT : T I N Y I N T ; T_TITLE : T I T L E ; T_TO : T O ; T_TOP : T O P ; @@ -1355,9 +1437,11 @@ T_WHILE : W H I L E ; T_WITH : W I T H ; T_WITHOUT : W I T H O U T ; T_WORK : W O R K ; +T_XACT_ABORT : X A C T '_' A B O R T ; // Functions with specific syntax T_ACTIVITY_COUNT : A C T I V I T Y '_' C O U N T ; +T_CUME_DIST : C U M E '_' D I S T ; T_CURRENT_DATE : C U R R E N T '_' D A T E ; T_CURRENT_TIMESTAMP : C U R R E N T '_' T I M E S T A M P ; T_CURRENT_USER : C U R R E N T '_' U S E R ; @@ -1397,8 +1481,10 @@ T_LESSEQUAL : '<=' ; T_MUL : '*' ; T_OPEN_B : '{' ; T_OPEN_P : '(' ; +T_OPEN_SB : '[' ; T_CLOSE_B : '}' ; T_CLOSE_P : ')' ; +T_CLOSE_SB : ']' ; T_SEMICOLON : ';' ; T_SUB : '-' ; http://git-wip-us.apache.org/repos/asf/hive/blob/9adc385f/hplsql/src/main/java/org/apache/hive/hplsql/Converter.java ---------------------------------------------------------------------- diff --git a/hplsql/src/main/java/org/apache/hive/hplsql/Converter.java b/hplsql/src/main/java/org/apache/hive/hplsql/Converter.java index 46f98a9..9d8c77f 100644 --- a/hplsql/src/main/java/org/apache/hive/hplsql/Converter.java +++ b/hplsql/src/main/java/org/apache/hive/hplsql/Converter.java @@ -35,22 +35,41 @@ public class Converter { * Convert a data type */ String dataType(HplsqlParser.DtypeContext type, HplsqlParser.Dtype_lenContext len) { - String d = null; - if (type.T_VARCHAR2() != null) { - d = "STRING"; + String t = exec.getText(type); + boolean enclosed = false; + if (t.charAt(0) == '[') { + t = t.substring(1, t.length() - 1); + enclosed = true; } - else if (type.T_NUMBER() != null) { - d = "DECIMAL"; + if (t.equalsIgnoreCase("BIT")) { + t = "TINYINT"; + } + else if (t.equalsIgnoreCase("DATETIME") || t.equalsIgnoreCase("SMALLDATETIME")) { + t = "TIMESTAMP"; + } + else if ((t.equalsIgnoreCase("VARCHAR") || t.equalsIgnoreCase("NVARCHAR")) && len.T_MAX() != null) { + t = "STRING"; + } + else if (t.equalsIgnoreCase("VARCHAR2") || t.equalsIgnoreCase("NCHAR") || t.equalsIgnoreCase("NVARCHAR")) { + t = "STRING"; + } + else if (t.equalsIgnoreCase("NUMBER") || t.equalsIgnoreCase("NUMERIC")) { + t = "DECIMAL"; if (len != null) { - d += exec.getText(len); + t += exec.getText(len); } } - if (d != null) { - return d; - } else if (len != null) { - return exec.getText(type, type.getStart(), len.getStop()); + if (!enclosed) { + return exec.getText(type, type.getStart(), len.getStop()); + } + else { + return t + exec.getText(len, len.getStart(), len.getStop()); + } + } + else if (!enclosed) { + return exec.getText(type, type.getStart(), type.getStop()); } - return exec.getText(type, type.getStart(), type.getStop()); + return t; } } http://git-wip-us.apache.org/repos/asf/hive/blob/9adc385f/hplsql/src/main/java/org/apache/hive/hplsql/Exec.java ---------------------------------------------------------------------- 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 e143136..73f470c 100644 --- a/hplsql/src/main/java/org/apache/hive/hplsql/Exec.java +++ b/hplsql/src/main/java/org/apache/hive/hplsql/Exec.java @@ -83,6 +83,7 @@ public class Exec extends HplsqlBaseVisitor<Integer> { Expression expr; Function function; Converter converter; + Meta meta; Select select; Stmt stmt; Conn conn; @@ -482,7 +483,7 @@ public class Exec extends HplsqlBaseVisitor<Integer> { return query; } setSqlNoData(); - trace(ctx, "Not executed - offline mode set"); + info(ctx, "Not executed - offline mode set"); return query; } @@ -500,7 +501,7 @@ public class Exec extends HplsqlBaseVisitor<Integer> { exec.rowCount = query.getRowCount(); return query; } - trace(ctx, "Not executed - offline mode set"); + info(ctx, "Not executed - offline mode set"); return new Query(""); } @@ -671,14 +672,15 @@ public class Exec extends HplsqlBaseVisitor<Integer> { } conf = new Conf(); conf.init(); - conn = new Conn(this); + conn = new Conn(this); + meta = new Meta(); initOptions(); expr = new Expression(this); select = new Select(this); stmt = new Stmt(this); converter = new Converter(this); - + function = new Function(this); new FunctionDatetime(this).register(function); new FunctionMisc(this).register(function); @@ -948,15 +950,26 @@ public class Exec extends HplsqlBaseVisitor<Integer> { public Integer visitSelect_options_item(HplsqlParser.Select_options_itemContext ctx) { return exec.select.option(ctx); } - + + /** + * Column name + */ + @Override + public Integer visitColumn_name(HplsqlParser.Column_nameContext ctx) { + stackPush(meta.normalizeIdentifierPart(ctx.getText())); + return 0; + } + /** * Table name */ @Override public Integer visitTable_name(HplsqlParser.Table_nameContext ctx) { - String name = ctx.getText().toUpperCase(); - String actualName = exec.managedTables.get(name); - String conn = exec.objectConnMap.get(name); + String name = ctx.getText(); + String nameUp = name.toUpperCase(); + String nameNorm = meta.normalizeIdentifier(name); + String actualName = exec.managedTables.get(nameUp); + String conn = exec.objectConnMap.get(nameUp); if (conn == null) { conn = conf.defaultConnection; } @@ -965,12 +978,12 @@ public class Exec extends HplsqlBaseVisitor<Integer> { stackPush(actualName); return 0; } - actualName = exec.objectMap.get(name); + actualName = exec.objectMap.get(nameUp); if (actualName != null) { stackPush(actualName); return 0; } - stackPush(ctx.getText()); + stackPush(nameNorm); return 0; } @@ -1163,6 +1176,11 @@ public class Exec extends HplsqlBaseVisitor<Integer> { return exec.stmt.createTableHiveOptions(ctx); } + @Override + public Integer visitCreate_table_options_mssql_item(HplsqlParser.Create_table_options_mssql_itemContext ctx) { + return 0; + } + /** * CREATE LOCAL TEMPORARY | VOLATILE TABLE statement */ @@ -2047,6 +2065,10 @@ public class Exec extends HplsqlBaseVisitor<Integer> { return exec.conf; } + public Meta getMeta() { + return exec.meta; + } + public boolean getTrace() { return exec.trace; } http://git-wip-us.apache.org/repos/asf/hive/blob/9adc385f/hplsql/src/main/java/org/apache/hive/hplsql/Expression.java ---------------------------------------------------------------------- diff --git a/hplsql/src/main/java/org/apache/hive/hplsql/Expression.java b/hplsql/src/main/java/org/apache/hive/hplsql/Expression.java index 772c98a..f811626 100644 --- a/hplsql/src/main/java/org/apache/hive/hplsql/Expression.java +++ b/hplsql/src/main/java/org/apache/hive/hplsql/Expression.java @@ -42,17 +42,25 @@ public class Expression { * Evaluate an expression */ public void exec(HplsqlParser.ExprContext ctx) { - if (ctx.T_ADD() != null) { - operatorAdd(ctx); - } - else if (ctx.T_SUB() != null) { - operatorSub(ctx); - } - else if (ctx.interval_item() != null) { - createInterval(ctx); + try { + if (ctx.T_ADD() != null) { + operatorAdd(ctx); + } + else if (ctx.T_SUB() != null) { + operatorSub(ctx); + } + else if (ctx.T_DIV() != null) { + operatorDiv(ctx); + } + else if (ctx.interval_item() != null) { + createInterval(ctx); + } + else { + visitChildren(ctx); + } } - else { - visitChildren(ctx); + catch (Exception e) { + exec.signal(e); } } @@ -345,6 +353,23 @@ public class Expression { } /** + * Division operator + */ + public void operatorDiv(HplsqlParser.ExprContext ctx) { + Var v1 = evalPop(ctx.expr(0)); + Var v2 = evalPop(ctx.expr(1)); + if (v1.value == null || v2.value == null) { + evalNull(); + } + else if (v1.type == Type.BIGINT && v2.type == Type.BIGINT) { + exec.stackPush(new Var((Long)v1.value / (Long)v2.value)); + } + else { + exec.signal(Signal.Type.UNSUPPORTED_OPERATION, "Unsupported data types in division operator"); + } + } + + /** * Add or subtract the specified number of days from DATE */ public Var changeDateByInt(Date d, Long i, boolean add) { http://git-wip-us.apache.org/repos/asf/hive/blob/9adc385f/hplsql/src/main/java/org/apache/hive/hplsql/Meta.java ---------------------------------------------------------------------- diff --git a/hplsql/src/main/java/org/apache/hive/hplsql/Meta.java b/hplsql/src/main/java/org/apache/hive/hplsql/Meta.java new file mode 100644 index 0000000..97d0fd2 --- /dev/null +++ b/hplsql/src/main/java/org/apache/hive/hplsql/Meta.java @@ -0,0 +1,98 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hive.hplsql; + +import java.util.ArrayList; + +/** + * Metadata + */ +public class Meta { + /** + * Normalize identifier name (convert "" [] to `` i.e.) + */ + public String normalizeIdentifier(String name) { + ArrayList<String> parts = splitIdentifier(name); + if (parts != null) { + StringBuilder norm = new StringBuilder(); + for (int i = 0; i < parts.size(); i++) { + norm.append(normalizeIdentifierPart(parts.get(i))); + if (i + 1 < parts.size()) { + norm.append("."); + } + } + return norm.toString(); + } + return normalizeIdentifierPart(name); + } + + /** + * Normalize identifier (single part) + */ + public String normalizeIdentifierPart(String name) { + char start = name.charAt(0); + char end = name.charAt(name.length() - 1); + if ((start == '[' && end == ']') || (start == '"' && end == '"')) { + return '`' + name.substring(1, name.length() - 1) + '`'; + } + return name; + } + + /** + * Split identifier to parts (schema, table, colum name etc.) + * @return null if identifier contains single part + */ + public ArrayList<String> splitIdentifier(String name) { + ArrayList<String> parts = null; + int start = 0; + for (int i = 0; i < name.length(); i++) { + char c = name.charAt(i); + char del = '\0'; + if (c == '`' || c == '"') { + del = c; + } + else if (c == '[') { + del = ']'; + } + if (del != '\0') { + for (int j = i + 1; i < name.length(); j++) { + i++; + if (name.charAt(j) == del) { + break; + } + } + continue; + } + if (c == '.') { + if (parts == null) { + parts = new ArrayList<String>(); + } + parts.add(name.substring(start, i)); + start = i + 1; + } + } + if (parts != null) { + parts.add(name.substring(start)); + } + return parts; + } +} + + + http://git-wip-us.apache.org/repos/asf/hive/blob/9adc385f/hplsql/src/main/java/org/apache/hive/hplsql/Select.java ---------------------------------------------------------------------- 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 e0f4098..32ca74a 100644 --- a/hplsql/src/main/java/org/apache/hive/hplsql/Select.java +++ b/hplsql/src/main/java/org/apache/hive/hplsql/Select.java @@ -21,6 +21,7 @@ package org.apache.hive.hplsql; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; +import java.util.List; import java.util.Stack; import org.antlr.v4.runtime.ParserRuleContext; @@ -83,13 +84,13 @@ public class Select { if (rs != null) { rm = rs.getMetaData(); } - HplsqlParser.Into_clauseContext into = getIntoClause(ctx); - if (into != null) { + int into_cnt = getIntoCount(ctx); + if (into_cnt > 0) { trace(ctx, "SELECT INTO statement executed"); - int cols = into.ident().size(); if (rs.next()) { - for (int i = 1; i <= cols; i++) { - Var var = exec.findVariable(into.ident(i-1).getText()); + for (int i = 1; i <= into_cnt; i++) { + String into_name = getIntoVariable(ctx, i - 1); + Var var = exec.findVariable(into_name); if (var != null) { var.setValue(rs, rm, i); if (trace) { @@ -97,8 +98,8 @@ public class Select { trace(ctx, "SET " + var.getName() + " = " + var.toString()); } } - else if(trace) { - trace(ctx, "Variable not found: " + into.ident(i-1).getText()); + else { + trace(ctx, "Variable not found: " + into_name); } } exec.incRowCount(); @@ -233,7 +234,7 @@ public class Select { int cnt = ctx.select_list_item().size(); for (int i = 0; i < cnt; i++) { if (ctx.select_list_item(i).select_list_asterisk() == null) { - sql.append(evalPop(ctx.select_list_item(i))); + sql.append(evalPop(ctx.select_list_item(i).expr())); if (ctx.select_list_item(i).select_list_alias() != null) { sql.append(" " + exec.getText(ctx.select_list_item(i).select_list_alias())); } @@ -353,6 +354,36 @@ public class Select { return null; } + /** + * Get number of elements in INTO or var=col assignment clause + */ + int getIntoCount(HplsqlParser.Select_stmtContext ctx) { + HplsqlParser.Into_clauseContext into = getIntoClause(ctx); + if (into != null) { + return into.ident().size(); + } + List<HplsqlParser.Select_list_itemContext> sl = ctx.fullselect_stmt().fullselect_stmt_item(0).subselect_stmt().select_list().select_list_item(); + if (sl.get(0).T_EQUAL() != null) { + return sl.size(); + } + return 0; + } + + /** + * Get variable name assigned in INTO or var=col clause by index + */ + String getIntoVariable(HplsqlParser.Select_stmtContext ctx, int idx) { + HplsqlParser.Into_clauseContext into = getIntoClause(ctx); + if (into != null) { + return into.ident(idx).getText(); + } + HplsqlParser.Select_list_itemContext sl = ctx.fullselect_stmt().fullselect_stmt_item(0).subselect_stmt().select_list().select_list_item(idx); + if (sl != null) { + return sl.ident().getText(); + } + return null; + } + /** * SELECT statement options - LIMIT n, WITH UR i.e */ http://git-wip-us.apache.org/repos/asf/hive/blob/9adc385f/hplsql/src/main/java/org/apache/hive/hplsql/Signal.java ---------------------------------------------------------------------- diff --git a/hplsql/src/main/java/org/apache/hive/hplsql/Signal.java b/hplsql/src/main/java/org/apache/hive/hplsql/Signal.java index 6330ae3..2c8cfc1 100644 --- a/hplsql/src/main/java/org/apache/hive/hplsql/Signal.java +++ b/hplsql/src/main/java/org/apache/hive/hplsql/Signal.java @@ -22,7 +22,7 @@ package org.apache.hive.hplsql; * Signals and exceptions */ public class Signal { - public enum Type { LEAVE_LOOP, LEAVE_ROUTINE, SQLEXCEPTION, NOTFOUND, USERDEFINED }; + public enum Type { LEAVE_LOOP, LEAVE_ROUTINE, SQLEXCEPTION, NOTFOUND, UNSUPPORTED_OPERATION, USERDEFINED }; Type type; String value = ""; Exception exception = null; http://git-wip-us.apache.org/repos/asf/hive/blob/9adc385f/hplsql/src/main/java/org/apache/hive/hplsql/Stmt.java ---------------------------------------------------------------------- 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 9a5e970..77c3c4f 100644 --- a/hplsql/src/main/java/org/apache/hive/hplsql/Stmt.java +++ b/hplsql/src/main/java/org/apache/hive/hplsql/Stmt.java @@ -37,6 +37,7 @@ public class Stmt { Exec exec = null; Stack<Var> stack = null; Conf conf; + Meta meta; boolean trace = false; @@ -44,6 +45,7 @@ public class Stmt { exec = e; stack = exec.getStack(); conf = exec.getConf(); + meta = exec.getMeta(); trace = exec.getTrace(); } @@ -128,7 +130,8 @@ public class Stmt { public Integer createTable(HplsqlParser.Create_table_stmtContext ctx) { trace(ctx, "CREATE TABLE"); StringBuilder sql = new StringBuilder(); - sql.append(exec.getText(ctx, ctx.T_CREATE().getSymbol(), ctx.T_OPEN_P().getSymbol())); + sql.append(exec.getText(ctx, ctx.T_CREATE().getSymbol(), ctx.T_TABLE().getSymbol())); + sql.append(" " + evalPop(ctx.table_name()) + " ("); int cnt = ctx.create_table_columns().create_table_columns_item().size(); int cols = 0; for (int i = 0; i < cnt; i++) { @@ -139,14 +142,17 @@ public class Stmt { if (cols > 0) { sql.append(",\n"); } - sql.append(col.ident().getText()); + sql.append(evalPop(col.column_name())); sql.append(" "); sql.append(exec.evalPop(col.dtype(), col.dtype_len())); cols++; } sql.append("\n)"); if (ctx.create_table_options() != null) { - sql.append(" " + evalPop(ctx.create_table_options()).toString()); + String opt = evalPop(ctx.create_table_options()).toString(); + if (opt != null) { + sql.append(" " + opt); + } } trace(ctx, sql.toString()); Query query = exec.executeSql(ctx, sql.toString(), exec.conf.defaultConnection); @@ -653,7 +659,7 @@ public class Stmt { */ public Integer use(HplsqlParser.Use_stmtContext ctx) { trace(ctx, "USE"); - return use(ctx, ctx.T_USE().toString() + " " + evalPop(ctx.expr()).toString()); + return use(ctx, ctx.T_USE().toString() + " " + meta.normalizeIdentifierPart(evalPop(ctx.expr()).toString())); } public Integer use(ParserRuleContext ctx, String sql) { @@ -791,24 +797,25 @@ public class Stmt { } /** - * EXEC, EXECUTE and EXECUTE IMMEDIATE statement to execute dynamic SQL + * EXEC, EXECUTE and EXECUTE IMMEDIATE statement to execute dynamic SQL or stored procedure */ public Integer exec(HplsqlParser.Exec_stmtContext ctx) { - if(trace) { - trace(ctx, "EXECUTE"); + if (execProc(ctx)) { + return 0; } + trace(ctx, "EXECUTE"); Var vsql = evalPop(ctx.expr()); String sql = vsql.toString(); - if(trace) { - trace(ctx, "Query: " + sql); + if (trace) { + trace(ctx, "SQL statement: " + sql); } Query query = exec.executeSql(ctx, sql, exec.conf.defaultConnection); - if(query.error()) { + if (query.error()) { exec.signal(query); return 1; } ResultSet rs = query.getResultSet(); - if(rs != null) { + if (rs != null) { try { ResultSetMetaData rsm = rs.getMetaData(); // Assign to variables @@ -852,6 +859,16 @@ public class Stmt { exec.closeQuery(query, exec.conf.defaultConnection); return 0; } + + /** + * EXEC to execute a stored procedure + */ + public Boolean execProc(HplsqlParser.Exec_stmtContext ctx) { + if (exec.function.execProc(ctx.expr_func_params(), evalPop(ctx.expr()).toString())) { + return true; + } + return false; + } /** * EXIT statement (leave the specified loop with a condition) @@ -978,7 +995,7 @@ public class Stmt { */ public Integer setCurrentSchema(HplsqlParser.Set_current_schema_optionContext ctx) { trace(ctx, "SET CURRENT SCHEMA"); - return use(ctx, "USE " + evalPop(ctx.expr()).toString()); + return use(ctx, "USE " + meta.normalizeIdentifierPart(evalPop(ctx.expr()).toString())); } /** http://git-wip-us.apache.org/repos/asf/hive/blob/9adc385f/hplsql/src/main/java/org/apache/hive/hplsql/Var.java ---------------------------------------------------------------------- diff --git a/hplsql/src/main/java/org/apache/hive/hplsql/Var.java b/hplsql/src/main/java/org/apache/hive/hplsql/Var.java index 7e4ae52..95eb526 100644 --- a/hplsql/src/main/java/org/apache/hive/hplsql/Var.java +++ b/hplsql/src/main/java/org/apache/hive/hplsql/Var.java @@ -152,6 +152,11 @@ public class Var { else if (type == Type.STRING) { cast(val.toString()); } + else if (type == Type.DECIMAL) { + if (val.type == Type.BIGINT) { + value = BigDecimal.valueOf(val.longValue()); + } + } else if (type == Type.DATE) { value = Utils.toDate(val.toString()); } @@ -213,7 +218,8 @@ public class Var { if (type == java.sql.Types.CHAR || type == java.sql.Types.VARCHAR) { cast(new Var(rs.getString(idx))); } - else if (type == java.sql.Types.INTEGER || type == java.sql.Types.BIGINT) { + else if (type == java.sql.Types.INTEGER || type == java.sql.Types.BIGINT || + type == java.sql.Types.SMALLINT || type == java.sql.Types.TINYINT) { cast(new Var(new Long(rs.getLong(idx)))); } else if (type == java.sql.Types.DECIMAL || type == java.sql.Types.NUMERIC) { @@ -242,8 +248,9 @@ public class Var { public static Type defineType(String type) { if (type == null) { return Type.NULL; - } - else if (type.equalsIgnoreCase("INT") || type.equalsIgnoreCase("INTEGER")) { + } + else if (type.equalsIgnoreCase("INT") || type.equalsIgnoreCase("INTEGER") || type.equalsIgnoreCase("BIGINT") || + type.equalsIgnoreCase("SMALLINT") || type.equalsIgnoreCase("TINYINT")) { return Type.BIGINT; } else if (type.equalsIgnoreCase("CHAR") || type.equalsIgnoreCase("VARCHAR") || type.equalsIgnoreCase("STRING")) { @@ -371,6 +378,16 @@ public class Var { } /** + * Return a long integer value + */ + public long longValue() { + if (type == Type.BIGINT) { + return ((Long)value).longValue(); + } + return -1; + } + + /** * Return true/false for BOOL type */ public boolean isTrue() { http://git-wip-us.apache.org/repos/asf/hive/blob/9adc385f/hplsql/src/main/java/org/apache/hive/hplsql/functions/Function.java ---------------------------------------------------------------------- diff --git a/hplsql/src/main/java/org/apache/hive/hplsql/functions/Function.java b/hplsql/src/main/java/org/apache/hive/hplsql/functions/Function.java index 394598b..ab0814d 100644 --- a/hplsql/src/main/java/org/apache/hive/hplsql/functions/Function.java +++ b/hplsql/src/main/java/org/apache/hive/hplsql/functions/Function.java @@ -104,11 +104,13 @@ public class Function { StringBuilder sql = new StringBuilder(); sql.append(name); sql.append("("); - int cnt = ctx.expr().size(); - for (int i = 0; i < cnt; i++) { - sql.append(evalPop(ctx.expr(i))); - if (i + 1 < cnt) { - sql.append(", "); + if (ctx != null) { + int cnt = ctx.func_param().size(); + for (int i = 0; i < cnt; i++) { + sql.append(evalPop(ctx.func_param(i).expr())); + if (i + 1 < cnt) { + sql.append(", "); + } } } sql.append(")"); @@ -152,7 +154,7 @@ public class Function { sql.append("hplsql('"); sql.append(name); sql.append("("); - int cnt = ctx.expr().size(); + int cnt = ctx.func_param().size(); for (int i = 0; i < cnt; i++) { sql.append(":" + (i + 1)); if (i + 1 < cnt) { @@ -164,7 +166,7 @@ public class Function { sql.append(", "); } for (int i = 0; i < cnt; i++) { - sql.append(evalPop(ctx.expr(i))); + sql.append(evalPop(ctx.func_param(i).expr())); if (i + 1 < cnt) { sql.append(", "); } @@ -192,7 +194,7 @@ public class Function { if (procCtx.create_routine_params() != null) { setCallParameters(procCtx.create_routine_params()); } - visit(procCtx.single_block_stmt()); + visit(procCtx.proc_block()); exec.callStackPop(); exec.leaveScope(); return true; @@ -216,7 +218,7 @@ public class Function { if (procCtx.create_routine_params() != null) { setCallParameters(ctx, procCtx.create_routine_params(), out); } - visit(procCtx.single_block_stmt()); + visit(procCtx.proc_block()); exec.callStackPop(); exec.leaveScope(); for (Map.Entry<String, Var> i : out.entrySet()) { // Set OUT parameters @@ -231,14 +233,17 @@ public class Function { void setCallParameters(HplsqlParser.Expr_func_paramsContext actual, HplsqlParser.Create_routine_paramsContext formal, HashMap<String, Var> out) { - int actualCnt = actual.expr().size(); + if (actual == null || actual.func_param() == null) { + return; + } + int actualCnt = actual.func_param().size(); int formalCnt = formal.create_routine_param_item().size(); for (int i = 0; i < actualCnt; i++) { if (i >= formalCnt) { break; } - HplsqlParser.ExprContext a = actual.expr(i); - HplsqlParser.Create_routine_param_itemContext p = formal.create_routine_param_item(i); + HplsqlParser.ExprContext a = actual.func_param(i).expr(); + HplsqlParser.Create_routine_param_itemContext p = getCallParameter(actual, formal, i); String name = p.ident().getText(); String type = p.dtype().getText(); String len = null; @@ -300,6 +305,26 @@ public class Function { } /** + * Get call parameter definition by name (if specified) or position + */ + HplsqlParser.Create_routine_param_itemContext getCallParameter(HplsqlParser.Expr_func_paramsContext actual, + HplsqlParser.Create_routine_paramsContext formal, int pos) { + String named = null; + int out_pos = pos; + if (actual.func_param(pos).ident() != null) { + named = actual.func_param(pos).ident().getText(); + int cnt = formal.create_routine_param_item().size(); + for (int i = 0; i < cnt; i++) { + if (named.equalsIgnoreCase(formal.create_routine_param_item(i).ident().getText())) { + out_pos = i; + break; + } + } + } + return formal.create_routine_param_item(out_pos); + } + + /** * Add a user-defined function */ public void addUserFunction(HplsqlParser.Create_function_stmtContext ctx) { http://git-wip-us.apache.org/repos/asf/hive/blob/9adc385f/hplsql/src/main/java/org/apache/hive/hplsql/functions/FunctionDatetime.java ---------------------------------------------------------------------- diff --git a/hplsql/src/main/java/org/apache/hive/hplsql/functions/FunctionDatetime.java b/hplsql/src/main/java/org/apache/hive/hplsql/functions/FunctionDatetime.java index 926eeeb..4b29c59 100644 --- a/hplsql/src/main/java/org/apache/hive/hplsql/functions/FunctionDatetime.java +++ b/hplsql/src/main/java/org/apache/hive/hplsql/functions/FunctionDatetime.java @@ -106,12 +106,12 @@ public class FunctionDatetime extends Function { * DATE function */ void date(HplsqlParser.Expr_func_paramsContext ctx) { - if (ctx.expr().size() != 1) { + if (ctx.func_param().size() != 1) { evalNull(); return; } Var var = new Var(Var.Type.DATE); - var.cast(evalPop(ctx.expr(0))); + var.cast(evalPop(ctx.func_param(0).expr())); evalVar(var); } @@ -119,12 +119,12 @@ public class FunctionDatetime extends Function { * TIMESTAMP_ISO function */ void timestampIso(HplsqlParser.Expr_func_paramsContext ctx) { - if (ctx.expr().size() != 1) { + if (ctx.func_param().size() != 1) { evalNull(); return; } Var var = new Var(Var.Type.TIMESTAMP); - var.cast(evalPop(ctx.expr(0))); + var.cast(evalPop(ctx.func_param(0).expr())); evalVar(var); } @@ -132,12 +132,12 @@ public class FunctionDatetime extends Function { * TO_TIMESTAMP function */ void toTimestamp(HplsqlParser.Expr_func_paramsContext ctx) { - if (ctx.expr().size() != 2) { + if (ctx.func_param().size() != 2) { evalNull(); return; } - String value = evalPop(ctx.expr(0)).toString(); - String sqlFormat = evalPop(ctx.expr(1)).toString(); + String value = evalPop(ctx.func_param(0).expr()).toString(); + String sqlFormat = evalPop(ctx.func_param(1).expr()).toString(); String format = Utils.convertSqlDatetimeFormat(sqlFormat); try { long timeInMs = new SimpleDateFormat(format).parse(value).getTime(); http://git-wip-us.apache.org/repos/asf/hive/blob/9adc385f/hplsql/src/main/java/org/apache/hive/hplsql/functions/FunctionMisc.java ---------------------------------------------------------------------- diff --git a/hplsql/src/main/java/org/apache/hive/hplsql/functions/FunctionMisc.java b/hplsql/src/main/java/org/apache/hive/hplsql/functions/FunctionMisc.java index 8d2456c..e022024 100644 --- a/hplsql/src/main/java/org/apache/hive/hplsql/functions/FunctionMisc.java +++ b/hplsql/src/main/java/org/apache/hive/hplsql/functions/FunctionMisc.java @@ -132,23 +132,23 @@ public class FunctionMisc extends Function { * DECODE function */ void decode(HplsqlParser.Expr_func_paramsContext ctx) { - int cnt = ctx.expr().size(); + int cnt = ctx.func_param().size(); if (cnt < 3) { evalNull(); return; } - Var value = evalPop(ctx.expr(0)); + Var value = evalPop(ctx.func_param(0).expr()); int i = 1; while (i + 1 < cnt) { - Var when = evalPop(ctx.expr(i)); + Var when = evalPop(ctx.func_param(i).expr()); if ((value.isNull() && when.isNull()) || value.equals(when)) { - eval(ctx.expr(i + 1)); + eval(ctx.func_param(i + 1).expr()); return; } i += 2; } if (i < cnt) { // ELSE expression - eval(ctx.expr(i)); + eval(ctx.func_param(i).expr()); } else { evalNull(); @@ -159,8 +159,8 @@ public class FunctionMisc extends Function { * NVL function - Return first non-NULL expression */ void nvl(HplsqlParser.Expr_func_paramsContext ctx) { - for (int i=0; i < ctx.expr().size(); i++) { - Var v = evalPop(ctx.expr(i)); + for (int i=0; i < ctx.func_param().size(); i++) { + Var v = evalPop(ctx.func_param(i).expr()); if (v.type != Var.Type.NULL) { exec.stackPush(v); return; @@ -173,12 +173,12 @@ public class FunctionMisc extends Function { * NVL2 function - If expr1 is not NULL return expr2, otherwise expr3 */ void nvl2(HplsqlParser.Expr_func_paramsContext ctx) { - if (ctx.expr().size() == 3) { - if (!evalPop(ctx.expr(0)).isNull()) { - eval(ctx.expr(1)); + if (ctx.func_param().size() == 3) { + if (!evalPop(ctx.func_param(0).expr()).isNull()) { + eval(ctx.func_param(1).expr()); } else { - eval(ctx.expr(2)); + eval(ctx.func_param(2).expr()); } } else { http://git-wip-us.apache.org/repos/asf/hive/blob/9adc385f/hplsql/src/main/java/org/apache/hive/hplsql/functions/FunctionOra.java ---------------------------------------------------------------------- diff --git a/hplsql/src/main/java/org/apache/hive/hplsql/functions/FunctionOra.java b/hplsql/src/main/java/org/apache/hive/hplsql/functions/FunctionOra.java index fec891a..405bfab 100644 --- a/hplsql/src/main/java/org/apache/hive/hplsql/functions/FunctionOra.java +++ b/hplsql/src/main/java/org/apache/hive/hplsql/functions/FunctionOra.java @@ -51,8 +51,8 @@ public class FunctionOra extends Function { * Print a text message */ void execDbmsOutputPutLine(HplsqlParser.Expr_func_paramsContext ctx) { - if (ctx.expr().size() > 0) { - visit(ctx.expr(0)); + if (ctx.func_param().size() > 0) { + visit(ctx.func_param(0).expr()); System.out.println(exec.stackPop().toString()); } } @@ -65,18 +65,18 @@ public class FunctionOra extends Function { String name = ""; boolean write = true; boolean overwrite = false; - int cnt = ctx.expr().size(); + int cnt = ctx.func_param().size(); // Directory if (cnt > 0) { - dir = evalPop(ctx.expr(0)).toString(); + dir = evalPop(ctx.func_param(0).expr()).toString(); } // File name if (cnt > 1) { - name = evalPop(ctx.expr(1)).toString(); + name = evalPop(ctx.func_param(1).expr()).toString(); } // Mode if (cnt >= 2) { - String mode = evalPop(ctx.expr(2)).toString(); + String mode = evalPop(ctx.func_param(2).expr()).toString(); if (mode.equalsIgnoreCase("r")) { write = false; } @@ -99,19 +99,18 @@ public class FunctionOra extends Function { * Read a text line from an open file */ void execUtlFileGetLine(HplsqlParser.Expr_func_paramsContext ctx) { - int cnt = ctx.expr().size(); + int cnt = ctx.func_param().size(); Var file = null; Var str = null; - StringBuilder out = new StringBuilder(); - + StringBuilder out = new StringBuilder(); // File handle if(cnt > 0) { - visit(ctx.expr(0)); + visit(ctx.func_param(0).expr()); file = exec.stackPop(); } // String variable if(cnt > 1) { - visit(ctx.expr(1)); + visit(ctx.func_param(1).expr()); str = exec.stackPop(); } @@ -168,18 +167,18 @@ public class FunctionOra extends Function { * Write a string to file */ void execUtlFilePut(HplsqlParser.Expr_func_paramsContext ctx, boolean newline) { - int cnt = ctx.expr().size(); + int cnt = ctx.func_param().size(); Var file = null; String str = ""; // File handle if(cnt > 0) { - visit(ctx.expr(0)); + visit(ctx.func_param(0).expr()); file = exec.stackPop(); } // Text string if(cnt > 1) { - visit(ctx.expr(1)); + visit(ctx.func_param(1).expr()); str = exec.stackPop().toString(); } @@ -205,12 +204,12 @@ public class FunctionOra extends Function { * Execute UTL_FILE.FCLOSE function */ void execUtlFileFclose(HplsqlParser.Expr_func_paramsContext ctx) { - int cnt = ctx.expr().size(); + int cnt = ctx.func_param().size(); Var file = null; // File handle if(cnt > 0) { - visit(ctx.expr(0)); + visit(ctx.func_param(0).expr()); file = exec.stackPop(); } http://git-wip-us.apache.org/repos/asf/hive/blob/9adc385f/hplsql/src/main/java/org/apache/hive/hplsql/functions/FunctionString.java ---------------------------------------------------------------------- diff --git a/hplsql/src/main/java/org/apache/hive/hplsql/functions/FunctionString.java b/hplsql/src/main/java/org/apache/hive/hplsql/functions/FunctionString.java index 610ff60..731443f 100644 --- a/hplsql/src/main/java/org/apache/hive/hplsql/functions/FunctionString.java +++ b/hplsql/src/main/java/org/apache/hive/hplsql/functions/FunctionString.java @@ -50,10 +50,10 @@ public class FunctionString extends Function { */ void concat(HplsqlParser.Expr_func_paramsContext ctx) { StringBuilder val = new StringBuilder(); - int cnt = ctx.expr().size(); + int cnt = ctx.func_param().size(); boolean nulls = true; for (int i = 0; i < cnt; i++) { - Var c = evalPop(ctx.expr(i)); + Var c = evalPop(ctx.func_param(i).expr()); if (!c.isNull()) { val.append(c.toString()); nulls = false; @@ -71,12 +71,12 @@ public class FunctionString extends Function { * CHAR function */ void char_(HplsqlParser.Expr_func_paramsContext ctx) { - int cnt = ctx.expr().size(); + int cnt = ctx.func_param().size(); if (cnt != 1) { evalNull(); return; } - String str = evalPop(ctx.expr(0)).toString(); + String str = evalPop(ctx.func_param(0).expr()).toString(); evalString(str); } @@ -84,12 +84,12 @@ public class FunctionString extends Function { * INSTR function */ void instr(HplsqlParser.Expr_func_paramsContext ctx) { - int cnt = ctx.expr().size(); + int cnt = ctx.func_param().size(); if (cnt < 2) { evalNull(); return; } - String str = evalPop(ctx.expr(0)).toString(); + String str = evalPop(ctx.func_param(0).expr()).toString(); if (str == null) { evalNull(); return; @@ -98,18 +98,18 @@ public class FunctionString extends Function { evalInt(new Long(0)); return; } - String substr = evalPop(ctx.expr(1)).toString(); + String substr = evalPop(ctx.func_param(1).expr()).toString(); int pos = 1; int occur = 1; int idx = 0; if (cnt >= 3) { - pos = evalPop(ctx.expr(2)).intValue(); + pos = evalPop(ctx.func_param(2).expr()).intValue(); if (pos == 0) { pos = 1; } } if (cnt >= 4) { - occur = evalPop(ctx.expr(3)).intValue(); + occur = evalPop(ctx.func_param(3).expr()).intValue(); if (occur < 0) { occur = 1; } @@ -145,11 +145,11 @@ public class FunctionString extends Function { * LEN function (excluding trailing spaces) */ void len(HplsqlParser.Expr_func_paramsContext ctx) { - if (ctx.expr().size() != 1) { + if (ctx.func_param().size() != 1) { evalNull(); return; } - int len = evalPop(ctx.expr(0)).toString().trim().length(); + int len = evalPop(ctx.func_param(0).expr()).toString().trim().length(); evalInt(new Long(len)); } @@ -157,11 +157,11 @@ public class FunctionString extends Function { * LENGTH function */ void length(HplsqlParser.Expr_func_paramsContext ctx) { - if (ctx.expr().size() != 1) { + if (ctx.func_param().size() != 1) { evalNull(); return; } - int len = evalPop(ctx.expr(0)).toString().length(); + int len = evalPop(ctx.func_param(0).expr()).toString().length(); evalInt(new Long(len)); } @@ -169,11 +169,11 @@ public class FunctionString extends Function { * LOWER function */ void lower(HplsqlParser.Expr_func_paramsContext ctx) { - if (ctx.expr().size() != 1) { + if (ctx.func_param().size() != 1) { evalNull(); return; } - String str = evalPop(ctx.expr(0)).toString().toLowerCase(); + String str = evalPop(ctx.func_param(0).expr()).toString().toLowerCase(); evalString(str); } @@ -181,19 +181,19 @@ public class FunctionString extends Function { * SUBSTR and SUBSTRING function */ void substr(HplsqlParser.Expr_func_paramsContext ctx) { - int cnt = ctx.expr().size(); + int cnt = ctx.func_param().size(); if (cnt < 2) { evalNull(); return; } - String str = evalPop(ctx.expr(0)).toString(); - int start = evalPop(ctx.expr(1)).intValue(); + String str = evalPop(ctx.func_param(0).expr()).toString(); + int start = evalPop(ctx.func_param(1).expr()).intValue(); int len = -1; if (start == 0) { start = 1; } if (cnt > 2) { - len = evalPop(ctx.expr(2)).intValue(); + len = evalPop(ctx.func_param(2).expr()).intValue(); } substr(str, start, len); } @@ -253,12 +253,12 @@ public class FunctionString extends Function { * TO_CHAR function */ void toChar(HplsqlParser.Expr_func_paramsContext ctx) { - int cnt = ctx.expr().size(); + int cnt = ctx.func_param().size(); if (cnt != 1) { evalNull(); return; } - String str = evalPop(ctx.expr(0)).toString(); + String str = evalPop(ctx.func_param(0).expr()).toString(); evalString(str); } @@ -266,11 +266,11 @@ public class FunctionString extends Function { * UPPER function */ void upper(HplsqlParser.Expr_func_paramsContext ctx) { - if (ctx.expr().size() != 1) { + if (ctx.func_param().size() != 1) { evalNull(); return; } - String str = evalPop(ctx.expr(0)).toString().toUpperCase(); + String str = evalPop(ctx.func_param(0).expr()).toString().toUpperCase(); evalString(str); } } http://git-wip-us.apache.org/repos/asf/hive/blob/9adc385f/hplsql/src/test/java/org/apache/hive/hplsql/TestHplsqlLocal.java ---------------------------------------------------------------------- diff --git a/hplsql/src/test/java/org/apache/hive/hplsql/TestHplsqlLocal.java b/hplsql/src/test/java/org/apache/hive/hplsql/TestHplsqlLocal.java index 5ec91d9..4a08a18 100644 --- a/hplsql/src/test/java/org/apache/hive/hplsql/TestHplsqlLocal.java +++ b/hplsql/src/test/java/org/apache/hive/hplsql/TestHplsqlLocal.java @@ -132,6 +132,11 @@ public class TestHplsqlLocal { public void testException() throws Exception { run("exception"); } + + @Test + public void testExceptionDivideByZero() throws Exception { + run("exception_divide_by_zero"); + } @Test public void testExit() throws Exception { http://git-wip-us.apache.org/repos/asf/hive/blob/9adc385f/hplsql/src/test/java/org/apache/hive/hplsql/TestHplsqlOffline.java ---------------------------------------------------------------------- diff --git a/hplsql/src/test/java/org/apache/hive/hplsql/TestHplsqlOffline.java b/hplsql/src/test/java/org/apache/hive/hplsql/TestHplsqlOffline.java new file mode 100644 index 0000000..0063cac --- /dev/null +++ b/hplsql/src/test/java/org/apache/hive/hplsql/TestHplsqlOffline.java @@ -0,0 +1,76 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hive.hplsql; + +import java.io.BufferedReader; +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.io.StringReader; +import org.apache.commons.io.FileUtils; +import org.junit.Assert; +import org.junit.Test; + +/** + * Unit tests for HPL/SQL that generate SQL but do not run them (Hive connection no required) + */ +public class TestHplsqlOffline { + + private final ByteArrayOutputStream out = new ByteArrayOutputStream(); + + @Test + public void testCreateTableMssql() throws Exception { + run("create_table_mssql"); + } + + @Test + public void testCreateTableOra() throws Exception { + run("create_table_ora"); + } + + /** + * Run a test file + */ + void run(String testFile) throws Exception { + System.setOut(new PrintStream(out)); + Exec exec = new Exec(); + String[] args = { "-f", "src/test/queries/offline/" + testFile + ".sql", "-trace", "-offline" }; + exec.run(args); + String s = getTestOutput(out.toString()).trim(); + FileUtils.writeStringToFile(new java.io.File("target/tmp/log/" + testFile + ".out.txt"), s); + String t = FileUtils.readFileToString(new java.io.File("src/test/results/offline/" + testFile + ".out.txt"), "utf-8").trim(); + System.setOut(null); + Assert.assertEquals(s, t); + } + + /** + * Get test output + */ + String getTestOutput(String s) throws Exception { + StringBuilder sb = new StringBuilder(); + BufferedReader reader = new BufferedReader(new StringReader(s)); + String line = null; + while ((line = reader.readLine()) != null) { + if (!line.startsWith("log4j:")) { + sb.append(line); + sb.append("\n"); + } + } + return sb.toString(); + } +} http://git-wip-us.apache.org/repos/asf/hive/blob/9adc385f/hplsql/src/test/queries/db/create_procedure_mssql.sql ---------------------------------------------------------------------- diff --git a/hplsql/src/test/queries/db/create_procedure_mssql.sql b/hplsql/src/test/queries/db/create_procedure_mssql.sql new file mode 100644 index 0000000..5997a5a --- /dev/null +++ b/hplsql/src/test/queries/db/create_procedure_mssql.sql @@ -0,0 +1,52 @@ +USE [default] +GO +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO +ALTER PROCEDURE [spTest1] + @lim INT, + @lim2 INT +AS + SET NOCOUNT ON + SET XACT_ABORT ON + + DECLARE @cnt int + SET @cnt = 0 + SELECT @cnt = COUNT(*) from [default].[src] LIMIT @lim2 + IF @cnt <= 0 + SELECT 'Failed' FROM [src] LIMIT 1 + ELSE + BEGIN + SELECT 'Correct' FROM default.[src] LIMIT 1 + END +GO + +ALTER PROCEDURE spTest2 + @lim INT, + @lim2 TINYINT, + @lim3 SMALLINT +AS +BEGIN + DECLARE @cnt int + SET @cnt = 0 + SELECT @cnt = COUNT(*) from src LIMIT @lim + IF @cnt <= 0 + SELECT 'Failed' FROM src LIMIT 1 + ELSE + BEGIN + SELECT 'Correct' FROM src LIMIT 1 + END +END + +ALTER PROCEDURE spTest3 +AS + SELECT 'Correct' FROM src LIMIT 1 +GO + +EXEC [spTest1] @lim2 = 3 +GO +EXECUTE spTest2 3 +GO +EXECUTE spTest3 +GO \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hive/blob/9adc385f/hplsql/src/test/queries/db/map_object.sql ---------------------------------------------------------------------- diff --git a/hplsql/src/test/queries/db/map_object.sql b/hplsql/src/test/queries/db/map_object.sql new file mode 100644 index 0000000..ed27f7c --- /dev/null +++ b/hplsql/src/test/queries/db/map_object.sql @@ -0,0 +1,9 @@ +MAP OBJECT s TO default.src; +MAP OBJECT log TO src AT hive2conn; + +DECLARE cnt INT DEFAULT 3; +SELECT count(*) INTO cnt FROM s t1 WHERE 1=0; +PRINT cnt; +SET cnt = 5; + +SELECT count(*) FROM log WHERE 1=0; \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hive/blob/9adc385f/hplsql/src/test/queries/local/exception_divide_by_zero.sql ---------------------------------------------------------------------- diff --git a/hplsql/src/test/queries/local/exception_divide_by_zero.sql b/hplsql/src/test/queries/local/exception_divide_by_zero.sql new file mode 100644 index 0000000..f766007 --- /dev/null +++ b/hplsql/src/test/queries/local/exception_divide_by_zero.sql @@ -0,0 +1,11 @@ +DECLARE + booknum int; + total int; + percent int; +BEGIN + SET booknum = 10; + SET total = 0; + SET percent = booknum / total; +EXCEPTION WHEN OTHERS THEN + DBMS_OUTPUT.PUT_LINE('Correct'); +END; \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hive/blob/9adc385f/hplsql/src/test/queries/offline/create_table_mssql.sql ---------------------------------------------------------------------- diff --git a/hplsql/src/test/queries/offline/create_table_mssql.sql b/hplsql/src/test/queries/offline/create_table_mssql.sql new file mode 100644 index 0000000..0494ca9 --- /dev/null +++ b/hplsql/src/test/queries/offline/create_table_mssql.sql @@ -0,0 +1,43 @@ +CREATE TABLE mssql_t1 ( + d1 DATETIME, + nc1 NCHAR(10), + n1 NUMERIC(3,0), + n2 NUMERIC(3), + n3 NUMERIC, + v1 VARCHAR(MAX), + nv1 NVARCHAR(10), + nv2 NVARCHAR(MAX) +); + +CREATE TABLE [mssql_t2]( + [i1] [INT] IDENTITY(1,1) NOT NULL, + [v1] [VARCHAR](350) NULL, + [v2] [VARCHAR](max) NULL, + [b1] [BIT] NULL, + [d1] [DATETIME] NULL, + CONSTRAINT [PK_i1] PRIMARY KEY CLUSTERED ([i1] ASC) + WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]; + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + +SET ANSI_PADDING ON +GO + +CREATE TABLE [default].[mssql_t3]( + [v1] [VARCHAR](50) NOT NULL, + [s2] [SMALLINT] NULL, + [sd1] [SMALLDATETIME] NULL, + [i1] [INT] NULL, + [v2] [VARCHAR](100) NULL, + CONSTRAINT [PK_v1] PRIMARY KEY CLUSTERED ([v1] ASC) + WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY] +GO + +SET ANSI_PADDING OFF +GO \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hive/blob/9adc385f/hplsql/src/test/queries/offline/create_table_ora.sql ---------------------------------------------------------------------- diff --git a/hplsql/src/test/queries/offline/create_table_ora.sql b/hplsql/src/test/queries/offline/create_table_ora.sql new file mode 100644 index 0000000..c47c75c --- /dev/null +++ b/hplsql/src/test/queries/offline/create_table_ora.sql @@ -0,0 +1,4 @@ +CREATE TABLE ora_t1 ( + n1 NUMBER(3,0), + v1 VARCHAR2(10) +); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hive/blob/9adc385f/hplsql/src/test/results/db/create_procedure_mssql.out.txt ---------------------------------------------------------------------- diff --git a/hplsql/src/test/results/db/create_procedure_mssql.out.txt b/hplsql/src/test/results/db/create_procedure_mssql.out.txt new file mode 100644 index 0000000..187e5bb --- /dev/null +++ b/hplsql/src/test/results/db/create_procedure_mssql.out.txt @@ -0,0 +1,45 @@ +Ln:1 USE +Ln:1 SQL statement: USE `default` +Ln:7 CREATE PROCEDURE [spTest1] +Ln:25 CREATE PROCEDURE spTest2 +Ln:42 CREATE PROCEDURE spTest3 +Ln:47 EXEC PROCEDURE [spTest1] +Ln:47 SET PARAM @lim2 = 3 +Ln:14 DECLARE @cnt int +Ln:15 SET @cnt = 0 +Ln:16 SELECT +Ln:16 SELECT COUNT(*) from `default`.`src` LIMIT 3 +Ln:16 SELECT completed successfully +Ln:16 SELECT INTO statement executed +Ln:16 COLUMN: _c0, bigint +Ln:16 SET @cnt = 500 +Ln:17 IF +Ln:17 ELSE executed +Ln:21 SELECT +Ln:21 SELECT 'Correct' FROM default.`src` LIMIT 1 +Ln:21 SELECT completed successfully +Ln:21 Standalone SELECT executed: 1 columns in the result set +Correct +Ln:49 EXEC PROCEDURE spTest2 +Ln:49 SET PARAM @lim = 3 +Ln:31 DECLARE @cnt int +Ln:32 SET @cnt = 0 +Ln:33 SELECT +Ln:33 SELECT COUNT(*) from src LIMIT 3 +Ln:33 SELECT completed successfully +Ln:33 SELECT INTO statement executed +Ln:33 COLUMN: _c0, bigint +Ln:33 SET @cnt = 500 +Ln:34 IF +Ln:34 ELSE executed +Ln:38 SELECT +Ln:38 SELECT 'Correct' FROM src LIMIT 1 +Ln:38 SELECT completed successfully +Ln:38 Standalone SELECT executed: 1 columns in the result set +Correct +Ln:52 EXEC PROCEDURE spTest3 +Ln:44 SELECT +Ln:44 SELECT 'Correct' FROM src LIMIT 1 +Ln:44 SELECT completed successfully +Ln:44 Standalone SELECT executed: 1 columns in the result set +Correct \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hive/blob/9adc385f/hplsql/src/test/results/db/map_object.out.txt ---------------------------------------------------------------------- diff --git a/hplsql/src/test/results/db/map_object.out.txt b/hplsql/src/test/results/db/map_object.out.txt new file mode 100644 index 0000000..5136620 --- /dev/null +++ b/hplsql/src/test/results/db/map_object.out.txt @@ -0,0 +1,17 @@ +Ln:1 MAP OBJECT s AS default.src +Ln:2 MAP OBJECT log AS src AT hive2conn +Ln:4 DECLARE cnt INT = 3 +Ln:5 SELECT +Ln:5 SELECT count(*) FROM default.src t1 WHERE 1 = 0 +Ln:5 SELECT completed successfully +Ln:5 SELECT INTO statement executed +Ln:5 COLUMN: _c0, bigint +Ln:5 SET cnt = 0 +Ln:6 PRINT +0 +Ln:7 SET cnt = 5 +Ln:9 SELECT +Ln:9 SELECT count(*) FROM src WHERE 1 = 0 +Ln:9 SELECT completed successfully +Ln:9 Standalone SELECT executed: 1 columns in the result set +0 \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hive/blob/9adc385f/hplsql/src/test/results/local/create_function.out.txt ---------------------------------------------------------------------- diff --git a/hplsql/src/test/results/local/create_function.out.txt b/hplsql/src/test/results/local/create_function.out.txt index b996ab4..8e14687 100644 --- a/hplsql/src/test/results/local/create_function.out.txt +++ b/hplsql/src/test/results/local/create_function.out.txt @@ -1,9 +1,9 @@ Ln:1 CREATE FUNCTION hello Ln:10 PRINT -Ln:10 EXEC FUNCTION hello +EXEC FUNCTION hello Ln:4 PRINT Start Ln:5 RETURN Hello, world! Ln:11 PRINT -End of script +End of script \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hive/blob/9adc385f/hplsql/src/test/results/local/declare.out.txt ---------------------------------------------------------------------- diff --git a/hplsql/src/test/results/local/declare.out.txt b/hplsql/src/test/results/local/declare.out.txt index 2b7794e..f9e4179 100644 --- a/hplsql/src/test/results/local/declare.out.txt +++ b/hplsql/src/test/results/local/declare.out.txt @@ -1,6 +1,6 @@ Ln:2 DECLARE code CHAR Ln:3 DECLARE status INT = 1 -Ln:4 DECLARE count SMALLINT = NULL +Ln:4 DECLARE count SMALLINT = 0 Ln:5 DECLARE limit INT = 100 Ln:6 DECLARE f UTL_FILE.FILE_TYPE Ln:8 SET status = 2 @@ -10,4 +10,4 @@ Ln:12 DECLARE status2 INT = 1 Ln:13 DECLARE count SMALLINT Ln:13 DECLARE limit INT = 100 Ln:15 DECLARE dt DATE = 2015-05-13 -Ln:16 DECLARE ts TIMESTAMP = 2015-05-13 11:10:01 +Ln:16 DECLARE ts TIMESTAMP = 2015-05-13 11:10:01 \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hive/blob/9adc385f/hplsql/src/test/results/local/exception_divide_by_zero.out.txt ---------------------------------------------------------------------- diff --git a/hplsql/src/test/results/local/exception_divide_by_zero.out.txt b/hplsql/src/test/results/local/exception_divide_by_zero.out.txt new file mode 100644 index 0000000..ffbd13d --- /dev/null +++ b/hplsql/src/test/results/local/exception_divide_by_zero.out.txt @@ -0,0 +1,8 @@ +Ln:2 DECLARE booknum int +Ln:3 DECLARE total int +Ln:4 DECLARE percent int +Ln:6 SET booknum = 10 +Ln:7 SET total = 0 +Ln:8 SET percent = NULL +Ln:9 EXCEPTION HANDLER +Correct \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hive/blob/9adc385f/hplsql/src/test/results/offline/create_table_mssql.out.txt ---------------------------------------------------------------------- diff --git a/hplsql/src/test/results/offline/create_table_mssql.out.txt b/hplsql/src/test/results/offline/create_table_mssql.out.txt new file mode 100644 index 0000000..43b0aa7 --- /dev/null +++ b/hplsql/src/test/results/offline/create_table_mssql.out.txt @@ -0,0 +1,24 @@ +Ln:1 CREATE TABLE +Ln:1 CREATE TABLE mssql_t1 (d1 TIMESTAMP, +nc1 STRING, +n1 DECIMAL(3,0), +n2 DECIMAL(3), +n3 DECIMAL, +v1 STRING, +nv1 STRING, +nv2 STRING +) +Ln:12 CREATE TABLE +Ln:12 CREATE TABLE `mssql_t2` (`i1` INT, +`v1` VARCHAR(350), +`v2` STRING, +`b1` TINYINT, +`d1` TIMESTAMP +) +Ln:31 CREATE TABLE +Ln:31 CREATE TABLE `default`.`mssql_t3` (`v1` VARCHAR(50), +`s2` SMALLINT, +`sd1` TIMESTAMP, +`i1` INT, +`v2` VARCHAR(100) +) \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hive/blob/9adc385f/hplsql/src/test/results/offline/create_table_ora.out.txt ---------------------------------------------------------------------- diff --git a/hplsql/src/test/results/offline/create_table_ora.out.txt b/hplsql/src/test/results/offline/create_table_ora.out.txt new file mode 100644 index 0000000..33af104 --- /dev/null +++ b/hplsql/src/test/results/offline/create_table_ora.out.txt @@ -0,0 +1,4 @@ +Ln:1 CREATE TABLE +Ln:1 CREATE TABLE ora_t1 (n1 DECIMAL(3,0), +v1 STRING +) \ No newline at end of file
