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