You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by ga...@apache.org on 2015/08/05 01:24:08 UTC
hive git commit: HIVE-11354 HPL/SQL extending compatibility with
Transact-SQL (Dmitry Tolpeko via gates)
Repository: hive
Updated Branches:
refs/heads/master 46739a6a2 -> 9adc385f7
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/master
Commit: 9adc385f73a51c79b2b7bc31fc87c47bf625fd1c
Parents: 46739a6
Author: Alan Gates <ga...@hortonworks.com>
Authored: Tue Aug 4 16:22:50 2015 -0700
Committer: Alan Gates <ga...@hortonworks.com>
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