Author: prasadm
Date: Mon Dec 16 19:52:06 2013
New Revision: 1551329

URL: http://svn.apache.org/r1551329
Log:
HIVE-1466: Add NULL DEFINED AS to ROW FORMAT specification (Prasad Mujumdar 
reviewed by Xuefu Zhang)

Added:
    hive/trunk/ql/src/test/queries/clientpositive/nullformat.q
    hive/trunk/ql/src/test/queries/clientpositive/nullformatCTAS.q
    hive/trunk/ql/src/test/queries/clientpositive/nullformatdir.q
    hive/trunk/ql/src/test/results/clientpositive/nullformat.q.out
    hive/trunk/ql/src/test/results/clientpositive/nullformatCTAS.q.out
    hive/trunk/ql/src/test/results/clientpositive/nullformatdir.q.out
Modified:
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java
    
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveLexer.g
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/IdentifiersParser.g
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/plan/CreateTableDesc.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/plan/PlanUtils.java

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java?rev=1551329&r1=1551328&r2=1551329&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java 
(original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java Mon Dec 
16 19:52:06 2013
@@ -2071,6 +2071,11 @@ public class DDLTask extends Task<DDLWor
                 escapeHiveCommand(StringEscapeUtils.escapeJava(delims.get(
                 serdeConstants.LINE_DELIM))) + "' \n";
           }
+          if (delims.containsKey(serdeConstants.SERIALIZATION_NULL_FORMAT)) {
+            tbl_row_format += "  NULL DEFINED AS '" +
+                escapeHiveCommand(StringEscapeUtils.escapeJava(delims.get(
+                serdeConstants.SERIALIZATION_NULL_FORMAT))) + "' \n";
+          }
         }
         else {
           tbl_row_format += " SERDE \n  '" +
@@ -3684,7 +3689,9 @@ public class DDLTask extends Task<DDLWor
     if (crtTbl.getLineDelim() != null) {
       tbl.setSerdeParam(serdeConstants.LINE_DELIM, crtTbl.getLineDelim());
     }
-
+    if (crtTbl.getNullFormat() != null) {
+      tbl.setSerdeParam(serdeConstants.SERIALIZATION_NULL_FORMAT, 
crtTbl.getNullFormat());
+    }
     if (crtTbl.getSerdeProps() != null) {
       Iterator<Entry<String, String>> iter = crtTbl.getSerdeProps().entrySet()
         .iterator();

Modified: 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java?rev=1551329&r1=1551328&r2=1551329&view=diff
==============================================================================
--- 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java
 (original)
+++ 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java
 Mon Dec 16 19:52:06 2013
@@ -143,6 +143,7 @@ public abstract class BaseSemanticAnalyz
     String collItemDelim = null;
     String mapKeyDelim = null;
     String lineDelim = null;
+    String nullFormat = null;
 
     protected void analyzeRowFormat(AnalyzeCreateCommonVars shared, ASTNode 
child) throws SemanticException {
       child = (ASTNode) child.getChild(0);
@@ -175,6 +176,10 @@ public abstract class BaseSemanticAnalyz
                 ErrorMsg.LINES_TERMINATED_BY_NON_NEWLINE.getMsg()));
           }
           break;
+        case HiveParser.TOK_TABLEROWFORMATNULL:
+          nullFormat = unescapeSQLString(rowChild.getChild(0)
+                    .getText());
+          break;
         default:
           assert false;
         }

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveLexer.g
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveLexer.g?rev=1551329&r1=1551328&r2=1551329&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveLexer.g 
(original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveLexer.g Mon Dec 
16 19:52:06 2013
@@ -176,6 +176,7 @@ KW_TBLPROPERTIES: 'TBLPROPERTIES';
 KW_IDXPROPERTIES: 'IDXPROPERTIES';
 KW_VALUE_TYPE: '$VALUE$';
 KW_ELEM_TYPE: '$ELEM$';
+KW_DEFINED: 'DEFINED';
 KW_CASE: 'CASE';
 KW_WHEN: 'WHEN';
 KW_THEN: 'THEN';

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g?rev=1551329&r1=1551328&r2=1551329&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g 
(original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g Mon Dec 
16 19:52:06 2013
@@ -180,6 +180,7 @@ TOK_TABLEROWFORMATFIELD;
 TOK_TABLEROWFORMATCOLLITEMS;
 TOK_TABLEROWFORMATMAPKEYS;
 TOK_TABLEROWFORMATLINES;
+TOK_TABLEROWFORMATNULL;
 TOK_TBLORCFILE;
 TOK_TBLSEQUENCEFILE;
 TOK_TBLTEXTFILE;
@@ -442,6 +443,7 @@ import java.util.HashMap;
     xlateMap.put("KW_PROPERTIES", "TBLPROPERTIES");
     xlateMap.put("KW_VALUE_TYPE", "\$VALUE\$");
     xlateMap.put("KW_ELEM_TYPE", "\$ELEM\$");
+    xlateMap.put("KW_DEFINED", "DEFINED");
 
     // Operators
     xlateMap.put("DOT", ".");
@@ -1538,8 +1540,8 @@ rowFormatDelimited
 @init { msgs.push("serde properties specification"); }
 @after { msgs.pop(); }
     :
-      KW_ROW KW_FORMAT KW_DELIMITED tableRowFormatFieldIdentifier? 
tableRowFormatCollItemsIdentifier? tableRowFormatMapKeysIdentifier? 
tableRowFormatLinesIdentifier?
-    -> ^(TOK_SERDEPROPS tableRowFormatFieldIdentifier? 
tableRowFormatCollItemsIdentifier? tableRowFormatMapKeysIdentifier? 
tableRowFormatLinesIdentifier?)
+      KW_ROW KW_FORMAT KW_DELIMITED tableRowFormatFieldIdentifier? 
tableRowFormatCollItemsIdentifier? tableRowFormatMapKeysIdentifier? 
tableRowFormatLinesIdentifier? tableRowNullFormat?
+    -> ^(TOK_SERDEPROPS tableRowFormatFieldIdentifier? 
tableRowFormatCollItemsIdentifier? tableRowFormatMapKeysIdentifier? 
tableRowFormatLinesIdentifier? tableRowNullFormat?)
     ;
 
 tableRowFormat
@@ -1621,6 +1623,13 @@ tableRowFormatLinesIdentifier
     -> ^(TOK_TABLEROWFORMATLINES $linesIdnt)
     ;
 
+tableRowNullFormat
+@init { msgs.push("table row format's null specifier"); }
+@after { msgs.pop(); }
+    :
+      KW_NULL KW_DEFINED KW_AS nullIdnt=StringLiteral
+    -> ^(TOK_TABLEROWFORMATNULL $nullIdnt)
+    ;
 tableFileFormat
 @init { msgs.push("table file format specification"); }
 @after { msgs.pop(); }

Modified: 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/IdentifiersParser.g
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/IdentifiersParser.g?rev=1551329&r1=1551328&r2=1551329&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/IdentifiersParser.g 
(original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/IdentifiersParser.g 
Mon Dec 16 19:52:06 2013
@@ -535,5 +535,5 @@ identifier
     
 nonReserved
     :
-    KW_TRUE | KW_FALSE | KW_LIKE | KW_EXISTS | KW_ASC | KW_DESC | KW_ORDER | 
KW_GROUP | KW_BY | KW_AS | KW_INSERT | KW_OVERWRITE | KW_OUTER | KW_LEFT | 
KW_RIGHT | KW_FULL | KW_PARTITION | KW_PARTITIONS | KW_TABLE | KW_TABLES | 
KW_COLUMNS | KW_INDEX | KW_INDEXES | KW_REBUILD | KW_FUNCTIONS | KW_SHOW | 
KW_MSCK | KW_REPAIR | KW_DIRECTORY | KW_LOCAL | KW_USING | KW_CLUSTER | 
KW_DISTRIBUTE | KW_SORT | KW_UNION | KW_LOAD | KW_EXPORT | KW_IMPORT | KW_DATA 
| KW_INPATH | KW_IS | KW_NULL | KW_CREATE | KW_EXTERNAL | KW_ALTER | KW_CHANGE 
| KW_FIRST | KW_AFTER | KW_DESCRIBE | KW_DROP | KW_RENAME | KW_IGNORE | 
KW_PROTECTION | KW_TO | KW_COMMENT | KW_BOOLEAN | KW_TINYINT | KW_SMALLINT | 
KW_INT | KW_BIGINT | KW_FLOAT | KW_DOUBLE | KW_DATE | KW_DATETIME | 
KW_TIMESTAMP | KW_DECIMAL | KW_STRING | KW_ARRAY | KW_STRUCT | KW_UNIONTYPE | 
KW_PARTITIONED | KW_CLUSTERED | KW_SORTED | KW_INTO | KW_BUCKETS | KW_ROW | 
KW_ROWS | KW_FORMAT | KW_DELIMITED | KW_FIELDS | KW_TERMINATED | KW_ESCAPED | 
KW_COLLECTION | 
 KW_ITEMS | KW_KEYS | KW_KEY_TYPE | KW_LINES | KW_STORED | KW_FILEFORMAT | 
KW_SEQUENCEFILE | KW_TEXTFILE | KW_RCFILE | KW_ORCFILE | KW_INPUTFORMAT | 
KW_OUTPUTFORMAT | KW_INPUTDRIVER | KW_OUTPUTDRIVER | KW_OFFLINE | KW_ENABLE | 
KW_DISABLE | KW_READONLY | KW_NO_DROP | KW_LOCATION | KW_BUCKET | KW_OUT | 
KW_OF | KW_PERCENT | KW_ADD | KW_REPLACE | KW_RLIKE | KW_REGEXP | KW_TEMPORARY 
| KW_EXPLAIN | KW_FORMATTED | KW_PRETTY | KW_DEPENDENCY | KW_LOGICAL | KW_SERDE 
| KW_WITH | KW_DEFERRED | KW_SERDEPROPERTIES | KW_DBPROPERTIES | KW_LIMIT | 
KW_SET | KW_UNSET | KW_TBLPROPERTIES | KW_IDXPROPERTIES | KW_VALUE_TYPE | 
KW_ELEM_TYPE | KW_MAPJOIN | KW_STREAMTABLE | KW_HOLD_DDLTIME | KW_CLUSTERSTATUS 
| KW_UTC | KW_UTCTIMESTAMP | KW_LONG | KW_DELETE | KW_PLUS | KW_MINUS | 
KW_FETCH | KW_INTERSECT | KW_VIEW | KW_IN | KW_DATABASES | KW_MATERIALIZED | 
KW_SCHEMA | KW_SCHEMAS | KW_GRANT | KW_REVOKE | KW_SSL | KW_UNDO | KW_LOCK | 
KW_LOCKS | KW_UNLOCK | KW_SHARED | KW_EXCLUSIVE | KW_PROCEDURE | KW_UNSIGNED | 
KW
 _WHILE | KW_READ | KW_READS | KW_PURGE | KW_RANGE | KW_ANALYZE | KW_BEFORE | 
KW_BETWEEN | KW_BOTH | KW_BINARY | KW_CONTINUE | KW_CURSOR | KW_TRIGGER | 
KW_RECORDREADER | KW_RECORDWRITER | KW_SEMI | KW_LATERAL | KW_TOUCH | 
KW_ARCHIVE | KW_UNARCHIVE | KW_COMPUTE | KW_STATISTICS | KW_USE | KW_OPTION | 
KW_CONCATENATE | KW_SHOW_DATABASE | KW_UPDATE | KW_RESTRICT | KW_CASCADE | 
KW_SKEWED | KW_ROLLUP | KW_CUBE | KW_DIRECTORIES | KW_FOR | KW_GROUPING | 
KW_SETS | KW_TRUNCATE | KW_NOSCAN | KW_USER | KW_ROLE | KW_INNER
+    KW_TRUE | KW_FALSE | KW_LIKE | KW_EXISTS | KW_ASC | KW_DESC | KW_ORDER | 
KW_GROUP | KW_BY | KW_AS | KW_INSERT | KW_OVERWRITE | KW_OUTER | KW_LEFT | 
KW_RIGHT | KW_FULL | KW_PARTITION | KW_PARTITIONS | KW_TABLE | KW_TABLES | 
KW_COLUMNS | KW_INDEX | KW_INDEXES | KW_REBUILD | KW_FUNCTIONS | KW_SHOW | 
KW_MSCK | KW_REPAIR | KW_DIRECTORY | KW_LOCAL | KW_USING | KW_CLUSTER | 
KW_DISTRIBUTE | KW_SORT | KW_UNION | KW_LOAD | KW_EXPORT | KW_IMPORT | KW_DATA 
| KW_INPATH | KW_IS | KW_NULL | KW_CREATE | KW_EXTERNAL | KW_ALTER | KW_CHANGE 
| KW_FIRST | KW_AFTER | KW_DESCRIBE | KW_DROP | KW_RENAME | KW_IGNORE | 
KW_PROTECTION | KW_TO | KW_COMMENT | KW_BOOLEAN | KW_TINYINT | KW_SMALLINT | 
KW_INT | KW_BIGINT | KW_FLOAT | KW_DOUBLE | KW_DATE | KW_DATETIME | 
KW_TIMESTAMP | KW_DECIMAL | KW_STRING | KW_ARRAY | KW_STRUCT | KW_UNIONTYPE | 
KW_PARTITIONED | KW_CLUSTERED | KW_SORTED | KW_INTO | KW_BUCKETS | KW_ROW | 
KW_ROWS | KW_FORMAT | KW_DELIMITED | KW_FIELDS | KW_TERMINATED | KW_ESCAPED | 
KW_COLLECTION | 
 KW_ITEMS | KW_KEYS | KW_KEY_TYPE | KW_LINES | KW_STORED | KW_FILEFORMAT | 
KW_SEQUENCEFILE | KW_TEXTFILE | KW_RCFILE | KW_ORCFILE | KW_INPUTFORMAT | 
KW_OUTPUTFORMAT | KW_INPUTDRIVER | KW_OUTPUTDRIVER | KW_OFFLINE | KW_ENABLE | 
KW_DISABLE | KW_READONLY | KW_NO_DROP | KW_LOCATION | KW_BUCKET | KW_OUT | 
KW_OF | KW_PERCENT | KW_ADD | KW_REPLACE | KW_RLIKE | KW_REGEXP | KW_TEMPORARY 
| KW_EXPLAIN | KW_FORMATTED | KW_PRETTY | KW_DEPENDENCY | KW_LOGICAL | KW_SERDE 
| KW_WITH | KW_DEFERRED | KW_SERDEPROPERTIES | KW_DBPROPERTIES | KW_LIMIT | 
KW_SET | KW_UNSET | KW_TBLPROPERTIES | KW_IDXPROPERTIES | KW_VALUE_TYPE | 
KW_ELEM_TYPE | KW_MAPJOIN | KW_STREAMTABLE | KW_HOLD_DDLTIME | KW_CLUSTERSTATUS 
| KW_UTC | KW_UTCTIMESTAMP | KW_LONG | KW_DELETE | KW_PLUS | KW_MINUS | 
KW_FETCH | KW_INTERSECT | KW_VIEW | KW_IN | KW_DATABASES | KW_MATERIALIZED | 
KW_SCHEMA | KW_SCHEMAS | KW_GRANT | KW_REVOKE | KW_SSL | KW_UNDO | KW_LOCK | 
KW_LOCKS | KW_UNLOCK | KW_SHARED | KW_EXCLUSIVE | KW_PROCEDURE | KW_UNSIGNED | 
KW
 _WHILE | KW_READ | KW_READS | KW_PURGE | KW_RANGE | KW_ANALYZE | KW_BEFORE | 
KW_BETWEEN | KW_BOTH | KW_BINARY | KW_CONTINUE | KW_CURSOR | KW_TRIGGER | 
KW_RECORDREADER | KW_RECORDWRITER | KW_SEMI | KW_LATERAL | KW_TOUCH | 
KW_ARCHIVE | KW_UNARCHIVE | KW_COMPUTE | KW_STATISTICS | KW_USE | KW_OPTION | 
KW_CONCATENATE | KW_SHOW_DATABASE | KW_UPDATE | KW_RESTRICT | KW_CASCADE | 
KW_SKEWED | KW_ROLLUP | KW_CUBE | KW_DIRECTORIES | KW_FOR | KW_GROUPING | 
KW_SETS | KW_TRUNCATE | KW_NOSCAN | KW_USER | KW_ROLE | KW_INNER | KW_DEFINED
     ;

Modified: 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java?rev=1551329&r1=1551328&r2=1551329&view=diff
==============================================================================
--- 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java 
(original)
+++ 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java 
Mon Dec 16 19:52:06 2013
@@ -1297,6 +1297,7 @@ public class SemanticAnalyzer extends Ba
                   
localDirectoryDesc.setCollItemDelim(rowFormatParams.collItemDelim);
                   
localDirectoryDesc.setMapKeyDelim(rowFormatParams.mapKeyDelim);
                   
localDirectoryDesc.setFieldEscape(rowFormatParams.fieldEscape);
+                  localDirectoryDesc.setNullFormat(rowFormatParams.nullFormat);
                   localDirectoryDescIsSet=true;
                   break;
                 case HiveParser.TOK_TABLESERIALIZER:
@@ -2304,6 +2305,10 @@ public class SemanticAnalyzer extends Ba
             throw new SemanticException(generateErrorMessage(rowChild,
                 ErrorMsg.LINES_TERMINATED_BY_NON_NEWLINE.getMsg()));
           }
+        case HiveParser.TOK_TABLEROWFORMATNULL:
+          String nullFormat = 
unescapeSQLString(rowChild.getChild(0).getText());
+          
tblDesc.getProperties().setProperty(serdeConstants.SERIALIZATION_NULL_FORMAT,
+              nullFormat);
           break;
         default:
           assert false;
@@ -9567,6 +9572,7 @@ public class SemanticAnalyzer extends Ba
           storageFormat.storageHandler, shared.serdeProps, tblProps, 
ifNotExists, skewedColNames,
           skewedValues);
       crtTblDesc.setStoredAsSubDirectories(storedAsDirs);
+      crtTblDesc.setNullFormat(rowFormatParams.nullFormat);
 
       crtTblDesc.validate();
       // outputs is empty, which means this create table happens in the current
@@ -9615,6 +9621,7 @@ public class SemanticAnalyzer extends Ba
           shared.serdeProps,
           tblProps, ifNotExists, skewedColNames, skewedValues);
       crtTblDesc.setStoredAsSubDirectories(storedAsDirs);
+      crtTblDesc.setNullFormat(rowFormatParams.nullFormat);
       qb.setTableDesc(crtTblDesc);
 
       SessionState.get().setCommandType(HiveOperation.CREATETABLE_AS_SELECT);

Modified: 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/plan/CreateTableDesc.java
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/plan/CreateTableDesc.java?rev=1551329&r1=1551328&r2=1551329&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/plan/CreateTableDesc.java 
(original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/plan/CreateTableDesc.java 
Mon Dec 16 19:52:06 2013
@@ -62,6 +62,7 @@ public class CreateTableDesc extends DDL
   String collItemDelim;
   String mapKeyDelim;
   String lineDelim;
+  String nullFormat;
   String comment;
   String inputFormat;
   String outputFormat;
@@ -508,4 +509,20 @@ public class CreateTableDesc extends DDL
   public void setStoredAsSubDirectories(boolean isStoredAsSubDirectories) {
     this.isStoredAsSubDirectories = isStoredAsSubDirectories;
   }
+
+  /**
+   * @return the nullFormat
+   */
+  public String getNullFormat() {
+    return nullFormat;
+  }
+
+  /**
+   * Set null format string
+   * @param nullFormat
+   */
+  public void setNullFormat(String nullFormat) {
+    this.nullFormat = nullFormat;
+  }
+
 }

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/plan/PlanUtils.java
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/plan/PlanUtils.java?rev=1551329&r1=1551328&r2=1551329&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/plan/PlanUtils.java 
(original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/plan/PlanUtils.java Mon 
Dec 16 19:52:06 2013
@@ -133,10 +133,15 @@ public final class PlanUtils {
       if (localDirectoryDesc.getSerName() != null) {
         tableDesc.getProperties().setProperty(
             serdeConstants.SERIALIZATION_LIB, localDirectoryDesc.getSerName());
-        }
+      }
       if (localDirectoryDesc.getOutputFormat() != null){
           
tableDesc.setOutputFileFormatClass(Class.forName(localDirectoryDesc.getOutputFormat()));
       }
+      if (localDirectoryDesc.getNullFormat() != null) {
+        
tableDesc.getProperties().setProperty(serdeConstants.SERIALIZATION_NULL_FORMAT,
+              localDirectoryDesc.getNullFormat());
+      }
+
     } catch (ClassNotFoundException e) {
       // mimicking behaviour in CreateTableDesc tableDesc creation
       // returning null table description for output.
@@ -323,6 +328,11 @@ public final class PlanUtils {
         properties.setProperty(serdeConstants.LINE_DELIM, 
crtTblDesc.getLineDelim());
       }
 
+      if (crtTblDesc.getNullFormat() != null) {
+        properties.setProperty(serdeConstants.SERIALIZATION_NULL_FORMAT,
+              crtTblDesc.getNullFormat());
+      }
+
       if (crtTblDesc.getTableName() != null && crtTblDesc.getDatabaseName() != 
null) {
         
properties.setProperty(org.apache.hadoop.hive.metastore.api.hive_metastoreConstants.META_TABLE_NAME,
             crtTblDesc.getDatabaseName() + "." + crtTblDesc.getTableName());

Added: hive/trunk/ql/src/test/queries/clientpositive/nullformat.q
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/test/queries/clientpositive/nullformat.q?rev=1551329&view=auto
==============================================================================
--- hive/trunk/ql/src/test/queries/clientpositive/nullformat.q (added)
+++ hive/trunk/ql/src/test/queries/clientpositive/nullformat.q Mon Dec 16 
19:52:06 2013
@@ -0,0 +1,24 @@
+-- base table with null data
+DROP TABLE IF EXISTS base_tab;
+CREATE TABLE base_tab(a STRING, b STRING, c STRING, d STRING) STORED AS 
TEXTFILE;
+LOAD DATA LOCAL INPATH '../../data/files/null.txt' INTO TABLE base_tab;
+DESCRIBE EXTENDED base_tab;
+
+-- table with non-default null format
+DROP TABLE IF EXISTS null_tab1;
+EXPLAIN CREATE TABLE null_tab1(a STRING, b STRING) ROW FORMAT DELIMITED NULL 
DEFINED AS 'fooNull';
+CREATE TABLE null_tab1(a STRING, b STRING) ROW FORMAT DELIMITED NULL DEFINED 
AS 'fooNull';
+DESCRIBE EXTENDED null_tab1;
+SHOW CREATE TABLE null_tab1;
+
+-- load null data from another table and verify that the null is stored in the 
expected format
+INSERT OVERWRITE TABLE null_tab1 SELECT a,b FROM base_tab;
+dfs -cat ${system:test.warehouse.dir}/null_tab1/*;
+SELECT * FROM null_tab1;
+-- alter the null format and verify that the old null format is no longer in 
effect
+ALTER TABLE null_tab1 SET SERDEPROPERTIES ( 'serialization.null.format'='foo');
+SELECT * FROM null_tab1;
+
+
+DROP TABLE null_tab1;
+DROP TABLE base_tab;

Added: hive/trunk/ql/src/test/queries/clientpositive/nullformatCTAS.q
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/test/queries/clientpositive/nullformatCTAS.q?rev=1551329&view=auto
==============================================================================
--- hive/trunk/ql/src/test/queries/clientpositive/nullformatCTAS.q (added)
+++ hive/trunk/ql/src/test/queries/clientpositive/nullformatCTAS.q Mon Dec 16 
19:52:06 2013
@@ -0,0 +1,24 @@
+-- base table with null data
+DROP TABLE IF EXISTS base_tab;
+CREATE TABLE base_tab(a STRING, b STRING, c STRING, d STRING) STORED AS 
TEXTFILE;
+LOAD DATA LOCAL INPATH '../../data/files/null.txt' INTO TABLE base_tab;
+DESCRIBE EXTENDED base_tab;
+
+-- table with non-default null format
+DROP TABLE IF EXISTS null_tab3;
+EXPLAIN CREATE TABLE null_tab3 ROW FORMAT DELIMITED NULL DEFINED AS 'fooNull'
+   AS SELECT a, b FROM base_tab;
+CREATE TABLE null_tab3 ROW FORMAT DELIMITED NULL DEFINED AS 'fooNull'
+   AS SELECT a, b FROM base_tab;
+DESCRIBE EXTENDED null_tab3;
+SHOW CREATE TABLE null_tab3;
+
+dfs -cat ${system:test.warehouse.dir}/null_tab3/*;
+SELECT * FROM null_tab3;
+-- alter the null format and verify that the old null format is no longer in 
effect
+ALTER TABLE null_tab3 SET SERDEPROPERTIES ( 'serialization.null.format'='foo');
+SELECT * FROM null_tab3;
+
+
+DROP TABLE null_tab3;
+DROP TABLE base_tab;

Added: hive/trunk/ql/src/test/queries/clientpositive/nullformatdir.q
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/test/queries/clientpositive/nullformatdir.q?rev=1551329&view=auto
==============================================================================
--- hive/trunk/ql/src/test/queries/clientpositive/nullformatdir.q (added)
+++ hive/trunk/ql/src/test/queries/clientpositive/nullformatdir.q Mon Dec 16 
19:52:06 2013
@@ -0,0 +1,21 @@
+-- base table with null data
+DROP TABLE IF EXISTS base_tab;
+CREATE TABLE base_tab(a STRING, b STRING, c STRING, d STRING) STORED AS 
TEXTFILE;
+LOAD DATA LOCAL INPATH '../../data/files/null.txt' INTO TABLE base_tab;
+DESCRIBE EXTENDED base_tab;
+
+dfs ${system:test.dfs.mkdir} ${system:test.tmp.dir}/hive_test/nullformat/tmp;
+dfs -rmr ${system:test.tmp.dir}/hive_test/nullformat/*;
+INSERT OVERWRITE LOCAL DIRECTORY '${system:test.tmp.dir}/hive_test/nullformat'
+   ROW FORMAT DELIMITED NULL DEFINED AS 'fooNull' SELECT a,b FROM base_tab;
+dfs -cat ${system:test.tmp.dir}/hive_test/nullformat/000000_0;
+
+-- load the exported data back into a table with same null format and verify 
null values
+DROP TABLE IF EXISTS null_tab2;
+CREATE TABLE null_tab2(a STRING, b STRING) ROW FORMAT DELIMITED NULL DEFINED 
AS 'fooNull';
+LOAD DATA LOCAL INPATH '${system:test.tmp.dir}/hive_test/nullformat/000000_0' 
INTO TABLE null_tab2;
+SELECT * FROM null_tab2;
+
+
+dfs -rmr ${system:test.tmp.dir}/hive_test/nullformat;
+DROP TABLE base_tab;

Added: hive/trunk/ql/src/test/results/clientpositive/nullformat.q.out
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientpositive/nullformat.q.out?rev=1551329&view=auto
==============================================================================
--- hive/trunk/ql/src/test/results/clientpositive/nullformat.q.out (added)
+++ hive/trunk/ql/src/test/results/clientpositive/nullformat.q.out Mon Dec 16 
19:52:06 2013
@@ -0,0 +1,181 @@
+PREHOOK: query: -- base table with null data
+DROP TABLE IF EXISTS base_tab
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: -- base table with null data
+DROP TABLE IF EXISTS base_tab
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: CREATE TABLE base_tab(a STRING, b STRING, c STRING, d STRING) 
STORED AS TEXTFILE
+PREHOOK: type: CREATETABLE
+POSTHOOK: query: CREATE TABLE base_tab(a STRING, b STRING, c STRING, d STRING) 
STORED AS TEXTFILE
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: default@base_tab
+PREHOOK: query: LOAD DATA LOCAL INPATH '../../data/files/null.txt' INTO TABLE 
base_tab
+PREHOOK: type: LOAD
+PREHOOK: Output: default@base_tab
+POSTHOOK: query: LOAD DATA LOCAL INPATH '../../data/files/null.txt' INTO TABLE 
base_tab
+POSTHOOK: type: LOAD
+POSTHOOK: Output: default@base_tab
+PREHOOK: query: DESCRIBE EXTENDED base_tab
+PREHOOK: type: DESCTABLE
+POSTHOOK: query: DESCRIBE EXTENDED base_tab
+POSTHOOK: type: DESCTABLE
+a                      string                  None                
+b                      string                  None                
+c                      string                  None                
+d                      string                  None                
+                
+#### A masked pattern was here ####
+PREHOOK: query: -- table with non-default null format
+DROP TABLE IF EXISTS null_tab1
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: -- table with non-default null format
+DROP TABLE IF EXISTS null_tab1
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: EXPLAIN CREATE TABLE null_tab1(a STRING, b STRING) ROW FORMAT 
DELIMITED NULL DEFINED AS 'fooNull'
+PREHOOK: type: CREATETABLE
+POSTHOOK: query: EXPLAIN CREATE TABLE null_tab1(a STRING, b STRING) ROW FORMAT 
DELIMITED NULL DEFINED AS 'fooNull'
+POSTHOOK: type: CREATETABLE
+ABSTRACT SYNTAX TREE:
+  (TOK_CREATETABLE (TOK_TABNAME null_tab1) TOK_LIKETABLE (TOK_TABCOLLIST 
(TOK_TABCOL a TOK_STRING) (TOK_TABCOL b TOK_STRING)) (TOK_TABLEROWFORMAT 
(TOK_SERDEPROPS (TOK_TABLEROWFORMATNULL 'fooNull'))))
+
+STAGE DEPENDENCIES:
+  Stage-0 is a root stage
+
+STAGE PLANS:
+  Stage: Stage-0
+      Create Table Operator:
+        Create Table
+          columns: a string, b string
+          if not exists: false
+          input format: org.apache.hadoop.mapred.TextInputFormat
+          # buckets: -1
+          output format: org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat
+          name: null_tab1
+          isExternal: false
+
+PREHOOK: query: CREATE TABLE null_tab1(a STRING, b STRING) ROW FORMAT 
DELIMITED NULL DEFINED AS 'fooNull'
+PREHOOK: type: CREATETABLE
+POSTHOOK: query: CREATE TABLE null_tab1(a STRING, b STRING) ROW FORMAT 
DELIMITED NULL DEFINED AS 'fooNull'
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: default@null_tab1
+PREHOOK: query: DESCRIBE EXTENDED null_tab1
+PREHOOK: type: DESCTABLE
+POSTHOOK: query: DESCRIBE EXTENDED null_tab1
+POSTHOOK: type: DESCTABLE
+a                      string                  None                
+b                      string                  None                
+                
+#### A masked pattern was here ####
+PREHOOK: query: SHOW CREATE TABLE null_tab1
+PREHOOK: type: SHOW_CREATETABLE
+PREHOOK: Input: default@null_tab1
+POSTHOOK: query: SHOW CREATE TABLE null_tab1
+POSTHOOK: type: SHOW_CREATETABLE
+POSTHOOK: Input: default@null_tab1
+CREATE  TABLE `null_tab1`(
+  `a` string, 
+  `b` string)
+ROW FORMAT DELIMITED 
+  NULL DEFINED AS 'fooNull' 
+STORED AS INPUTFORMAT 
+  'org.apache.hadoop.mapred.TextInputFormat' 
+OUTPUTFORMAT 
+  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
+LOCATION
+#### A masked pattern was here ####
+TBLPROPERTIES (
+#### A masked pattern was here ####
+PREHOOK: query: -- load null data from another table and verify that the null 
is stored in the expected format
+INSERT OVERWRITE TABLE null_tab1 SELECT a,b FROM base_tab
+PREHOOK: type: QUERY
+PREHOOK: Input: default@base_tab
+PREHOOK: Output: default@null_tab1
+POSTHOOK: query: -- load null data from another table and verify that the null 
is stored in the expected format
+INSERT OVERWRITE TABLE null_tab1 SELECT a,b FROM base_tab
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@base_tab
+POSTHOOK: Output: default@null_tab1
+POSTHOOK: Lineage: null_tab1.a SIMPLE [(base_tab)base_tab.FieldSchema(name:a, 
type:string, comment:null), ]
+POSTHOOK: Lineage: null_tab1.b SIMPLE [(base_tab)base_tab.FieldSchema(name:b, 
type:string, comment:null), ]
+1.01
+1.01
+1.01
+1.01
+1.01
+fooNull1
+fooNullfooNull
+1.0fooNull
+1.01
+1.01
+PREHOOK: query: SELECT * FROM null_tab1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@null_tab1
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT * FROM null_tab1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@null_tab1
+#### A masked pattern was here ####
+POSTHOOK: Lineage: null_tab1.a SIMPLE [(base_tab)base_tab.FieldSchema(name:a, 
type:string, comment:null), ]
+POSTHOOK: Lineage: null_tab1.b SIMPLE [(base_tab)base_tab.FieldSchema(name:b, 
type:string, comment:null), ]
+1.0    1
+1.0    1
+1.0    1
+1.0    1
+1.0    1
+NULL   1
+NULL   NULL
+1.0    NULL
+1.0    1
+1.0    1
+PREHOOK: query: -- alter the null format and verify that the old null format 
is no longer in effect
+ALTER TABLE null_tab1 SET SERDEPROPERTIES ( 'serialization.null.format'='foo')
+PREHOOK: type: ALTERTABLE_SERDEPROPERTIES
+PREHOOK: Input: default@null_tab1
+PREHOOK: Output: default@null_tab1
+POSTHOOK: query: -- alter the null format and verify that the old null format 
is no longer in effect
+ALTER TABLE null_tab1 SET SERDEPROPERTIES ( 'serialization.null.format'='foo')
+POSTHOOK: type: ALTERTABLE_SERDEPROPERTIES
+POSTHOOK: Input: default@null_tab1
+POSTHOOK: Output: default@null_tab1
+POSTHOOK: Lineage: null_tab1.a SIMPLE [(base_tab)base_tab.FieldSchema(name:a, 
type:string, comment:null), ]
+POSTHOOK: Lineage: null_tab1.b SIMPLE [(base_tab)base_tab.FieldSchema(name:b, 
type:string, comment:null), ]
+PREHOOK: query: SELECT * FROM null_tab1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@null_tab1
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT * FROM null_tab1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@null_tab1
+#### A masked pattern was here ####
+POSTHOOK: Lineage: null_tab1.a SIMPLE [(base_tab)base_tab.FieldSchema(name:a, 
type:string, comment:null), ]
+POSTHOOK: Lineage: null_tab1.b SIMPLE [(base_tab)base_tab.FieldSchema(name:b, 
type:string, comment:null), ]
+1.0    1
+1.0    1
+1.0    1
+1.0    1
+1.0    1
+fooNull        1
+fooNull        fooNull
+1.0    fooNull
+1.0    1
+1.0    1
+PREHOOK: query: DROP TABLE null_tab1
+PREHOOK: type: DROPTABLE
+PREHOOK: Input: default@null_tab1
+PREHOOK: Output: default@null_tab1
+POSTHOOK: query: DROP TABLE null_tab1
+POSTHOOK: type: DROPTABLE
+POSTHOOK: Input: default@null_tab1
+POSTHOOK: Output: default@null_tab1
+POSTHOOK: Lineage: null_tab1.a SIMPLE [(base_tab)base_tab.FieldSchema(name:a, 
type:string, comment:null), ]
+POSTHOOK: Lineage: null_tab1.b SIMPLE [(base_tab)base_tab.FieldSchema(name:b, 
type:string, comment:null), ]
+PREHOOK: query: DROP TABLE base_tab
+PREHOOK: type: DROPTABLE
+PREHOOK: Input: default@base_tab
+PREHOOK: Output: default@base_tab
+POSTHOOK: query: DROP TABLE base_tab
+POSTHOOK: type: DROPTABLE
+POSTHOOK: Input: default@base_tab
+POSTHOOK: Output: default@base_tab
+POSTHOOK: Lineage: null_tab1.a SIMPLE [(base_tab)base_tab.FieldSchema(name:a, 
type:string, comment:null), ]
+POSTHOOK: Lineage: null_tab1.b SIMPLE [(base_tab)base_tab.FieldSchema(name:b, 
type:string, comment:null), ]

Added: hive/trunk/ql/src/test/results/clientpositive/nullformatCTAS.q.out
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientpositive/nullformatCTAS.q.out?rev=1551329&view=auto
==============================================================================
--- hive/trunk/ql/src/test/results/clientpositive/nullformatCTAS.q.out (added)
+++ hive/trunk/ql/src/test/results/clientpositive/nullformatCTAS.q.out Mon Dec 
16 19:52:06 2013
@@ -0,0 +1,252 @@
+PREHOOK: query: -- base table with null data
+DROP TABLE IF EXISTS base_tab
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: -- base table with null data
+DROP TABLE IF EXISTS base_tab
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: CREATE TABLE base_tab(a STRING, b STRING, c STRING, d STRING) 
STORED AS TEXTFILE
+PREHOOK: type: CREATETABLE
+POSTHOOK: query: CREATE TABLE base_tab(a STRING, b STRING, c STRING, d STRING) 
STORED AS TEXTFILE
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: default@base_tab
+PREHOOK: query: LOAD DATA LOCAL INPATH '../../data/files/null.txt' INTO TABLE 
base_tab
+PREHOOK: type: LOAD
+PREHOOK: Output: default@base_tab
+POSTHOOK: query: LOAD DATA LOCAL INPATH '../../data/files/null.txt' INTO TABLE 
base_tab
+POSTHOOK: type: LOAD
+POSTHOOK: Output: default@base_tab
+PREHOOK: query: DESCRIBE EXTENDED base_tab
+PREHOOK: type: DESCTABLE
+POSTHOOK: query: DESCRIBE EXTENDED base_tab
+POSTHOOK: type: DESCTABLE
+a                      string                  None                
+b                      string                  None                
+c                      string                  None                
+d                      string                  None                
+                
+#### A masked pattern was here ####
+PREHOOK: query: -- table with non-default null format
+DROP TABLE IF EXISTS null_tab3
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: -- table with non-default null format
+DROP TABLE IF EXISTS null_tab3
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: EXPLAIN CREATE TABLE null_tab3 ROW FORMAT DELIMITED NULL 
DEFINED AS 'fooNull'
+   AS SELECT a, b FROM base_tab
+PREHOOK: type: CREATETABLE_AS_SELECT
+POSTHOOK: query: EXPLAIN CREATE TABLE null_tab3 ROW FORMAT DELIMITED NULL 
DEFINED AS 'fooNull'
+   AS SELECT a, b FROM base_tab
+POSTHOOK: type: CREATETABLE_AS_SELECT
+ABSTRACT SYNTAX TREE:
+  (TOK_CREATETABLE (TOK_TABNAME null_tab3) TOK_LIKETABLE (TOK_TABLEROWFORMAT 
(TOK_SERDEPROPS (TOK_TABLEROWFORMATNULL 'fooNull'))) (TOK_QUERY (TOK_FROM 
(TOK_TABREF (TOK_TABNAME base_tab))) (TOK_INSERT (TOK_DESTINATION (TOK_DIR 
TOK_TMP_FILE)) (TOK_SELECT (TOK_SELEXPR (TOK_TABLE_OR_COL a)) (TOK_SELEXPR 
(TOK_TABLE_OR_COL b))))))
+
+STAGE DEPENDENCIES:
+  Stage-1 is a root stage
+  Stage-7 depends on stages: Stage-1 , consists of Stage-4, Stage-3, Stage-5
+  Stage-4
+  Stage-0 depends on stages: Stage-4, Stage-3, Stage-6
+  Stage-8 depends on stages: Stage-0
+  Stage-2 depends on stages: Stage-8
+  Stage-3
+  Stage-5
+  Stage-6 depends on stages: Stage-5
+
+STAGE PLANS:
+  Stage: Stage-1
+    Map Reduce
+      Alias -> Map Operator Tree:
+        base_tab 
+          TableScan
+            alias: base_tab
+            Select Operator
+              expressions:
+                    expr: a
+                    type: string
+                    expr: b
+                    type: string
+              outputColumnNames: _col0, _col1
+              File Output Operator
+                compressed: false
+                GlobalTableId: 1
+                table:
+                    input format: org.apache.hadoop.mapred.TextInputFormat
+                    output format: 
org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
+                    serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
+                    name: default.null_tab3
+
+  Stage: Stage-7
+    Conditional Operator
+
+  Stage: Stage-4
+    Move Operator
+      files:
+          hdfs directory: true
+#### A masked pattern was here ####
+
+  Stage: Stage-0
+    Move Operator
+      files:
+          hdfs directory: true
+#### A masked pattern was here ####
+
+  Stage: Stage-8
+      Create Table Operator:
+        Create Table
+          columns: a string, b string
+          if not exists: false
+          input format: org.apache.hadoop.mapred.TextInputFormat
+          # buckets: -1
+          output format: org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat
+          name: null_tab3
+          isExternal: false
+
+  Stage: Stage-2
+    Stats-Aggr Operator
+
+  Stage: Stage-3
+    Map Reduce
+      Alias -> Map Operator Tree:
+#### A masked pattern was here ####
+          TableScan
+            File Output Operator
+              compressed: false
+              GlobalTableId: 0
+              table:
+                  input format: org.apache.hadoop.mapred.TextInputFormat
+                  output format: 
org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
+                  serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
+                  name: default.null_tab3
+
+  Stage: Stage-5
+    Map Reduce
+      Alias -> Map Operator Tree:
+#### A masked pattern was here ####
+          TableScan
+            File Output Operator
+              compressed: false
+              GlobalTableId: 0
+              table:
+                  input format: org.apache.hadoop.mapred.TextInputFormat
+                  output format: 
org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
+                  serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
+                  name: default.null_tab3
+
+  Stage: Stage-6
+    Move Operator
+      files:
+          hdfs directory: true
+#### A masked pattern was here ####
+
+PREHOOK: query: CREATE TABLE null_tab3 ROW FORMAT DELIMITED NULL DEFINED AS 
'fooNull'
+   AS SELECT a, b FROM base_tab
+PREHOOK: type: CREATETABLE_AS_SELECT
+PREHOOK: Input: default@base_tab
+POSTHOOK: query: CREATE TABLE null_tab3 ROW FORMAT DELIMITED NULL DEFINED AS 
'fooNull'
+   AS SELECT a, b FROM base_tab
+POSTHOOK: type: CREATETABLE_AS_SELECT
+POSTHOOK: Input: default@base_tab
+POSTHOOK: Output: default@null_tab3
+PREHOOK: query: DESCRIBE EXTENDED null_tab3
+PREHOOK: type: DESCTABLE
+POSTHOOK: query: DESCRIBE EXTENDED null_tab3
+POSTHOOK: type: DESCTABLE
+a                      string                  None                
+b                      string                  None                
+                
+#### A masked pattern was here ####
+PREHOOK: query: SHOW CREATE TABLE null_tab3
+PREHOOK: type: SHOW_CREATETABLE
+PREHOOK: Input: default@null_tab3
+POSTHOOK: query: SHOW CREATE TABLE null_tab3
+POSTHOOK: type: SHOW_CREATETABLE
+POSTHOOK: Input: default@null_tab3
+CREATE  TABLE `null_tab3`(
+  `a` string, 
+  `b` string)
+ROW FORMAT DELIMITED 
+  NULL DEFINED AS 'fooNull' 
+STORED AS INPUTFORMAT 
+  'org.apache.hadoop.mapred.TextInputFormat' 
+OUTPUTFORMAT 
+  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
+LOCATION
+#### A masked pattern was here ####
+TBLPROPERTIES (
+  'numFiles'='1', 
+  'COLUMN_STATS_ACCURATE'='true', 
+#### A masked pattern was here ####
+  'numRows'='10', 
+  'totalSize'='80', 
+  'rawDataSize'='70')
+1.01
+1.01
+1.01
+1.01
+1.01
+fooNull1
+fooNullfooNull
+1.0fooNull
+1.01
+1.01
+PREHOOK: query: SELECT * FROM null_tab3
+PREHOOK: type: QUERY
+PREHOOK: Input: default@null_tab3
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT * FROM null_tab3
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@null_tab3
+#### A masked pattern was here ####
+1.0    1
+1.0    1
+1.0    1
+1.0    1
+1.0    1
+NULL   1
+NULL   NULL
+1.0    NULL
+1.0    1
+1.0    1
+PREHOOK: query: -- alter the null format and verify that the old null format 
is no longer in effect
+ALTER TABLE null_tab3 SET SERDEPROPERTIES ( 'serialization.null.format'='foo')
+PREHOOK: type: ALTERTABLE_SERDEPROPERTIES
+PREHOOK: Input: default@null_tab3
+PREHOOK: Output: default@null_tab3
+POSTHOOK: query: -- alter the null format and verify that the old null format 
is no longer in effect
+ALTER TABLE null_tab3 SET SERDEPROPERTIES ( 'serialization.null.format'='foo')
+POSTHOOK: type: ALTERTABLE_SERDEPROPERTIES
+POSTHOOK: Input: default@null_tab3
+POSTHOOK: Output: default@null_tab3
+PREHOOK: query: SELECT * FROM null_tab3
+PREHOOK: type: QUERY
+PREHOOK: Input: default@null_tab3
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT * FROM null_tab3
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@null_tab3
+#### A masked pattern was here ####
+1.0    1
+1.0    1
+1.0    1
+1.0    1
+1.0    1
+fooNull        1
+fooNull        fooNull
+1.0    fooNull
+1.0    1
+1.0    1
+PREHOOK: query: DROP TABLE null_tab3
+PREHOOK: type: DROPTABLE
+PREHOOK: Input: default@null_tab3
+PREHOOK: Output: default@null_tab3
+POSTHOOK: query: DROP TABLE null_tab3
+POSTHOOK: type: DROPTABLE
+POSTHOOK: Input: default@null_tab3
+POSTHOOK: Output: default@null_tab3
+PREHOOK: query: DROP TABLE base_tab
+PREHOOK: type: DROPTABLE
+PREHOOK: Input: default@base_tab
+PREHOOK: Output: default@base_tab
+POSTHOOK: query: DROP TABLE base_tab
+POSTHOOK: type: DROPTABLE
+POSTHOOK: Input: default@base_tab
+POSTHOOK: Output: default@base_tab

Added: hive/trunk/ql/src/test/results/clientpositive/nullformatdir.q.out
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientpositive/nullformatdir.q.out?rev=1551329&view=auto
==============================================================================
--- hive/trunk/ql/src/test/results/clientpositive/nullformatdir.q.out (added)
+++ hive/trunk/ql/src/test/results/clientpositive/nullformatdir.q.out Mon Dec 
16 19:52:06 2013
@@ -0,0 +1,89 @@
+PREHOOK: query: -- base table with null data
+DROP TABLE IF EXISTS base_tab
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: -- base table with null data
+DROP TABLE IF EXISTS base_tab
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: CREATE TABLE base_tab(a STRING, b STRING, c STRING, d STRING) 
STORED AS TEXTFILE
+PREHOOK: type: CREATETABLE
+POSTHOOK: query: CREATE TABLE base_tab(a STRING, b STRING, c STRING, d STRING) 
STORED AS TEXTFILE
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: default@base_tab
+PREHOOK: query: LOAD DATA LOCAL INPATH '../../data/files/null.txt' INTO TABLE 
base_tab
+PREHOOK: type: LOAD
+PREHOOK: Output: default@base_tab
+POSTHOOK: query: LOAD DATA LOCAL INPATH '../../data/files/null.txt' INTO TABLE 
base_tab
+POSTHOOK: type: LOAD
+POSTHOOK: Output: default@base_tab
+PREHOOK: query: DESCRIBE EXTENDED base_tab
+PREHOOK: type: DESCTABLE
+POSTHOOK: query: DESCRIBE EXTENDED base_tab
+POSTHOOK: type: DESCTABLE
+a                      string                  None                
+b                      string                  None                
+c                      string                  None                
+d                      string                  None                
+                
+#### A masked pattern was here ####
+   ROW FORMAT DELIMITED NULL DEFINED AS 'fooNull' SELECT a,b FROM base_tab
+PREHOOK: type: QUERY
+PREHOOK: Input: default@base_tab
+#### A masked pattern was here ####
+   ROW FORMAT DELIMITED NULL DEFINED AS 'fooNull' SELECT a,b FROM base_tab
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@base_tab
+#### A masked pattern was here ####
+1.01
+1.01
+1.01
+1.01
+1.01
+fooNull1
+fooNullfooNull
+1.0fooNull
+1.01
+1.01
+PREHOOK: query: -- load the exported data back into a table with same null 
format and verify null values
+DROP TABLE IF EXISTS null_tab2
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: -- load the exported data back into a table with same null 
format and verify null values
+DROP TABLE IF EXISTS null_tab2
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: CREATE TABLE null_tab2(a STRING, b STRING) ROW FORMAT 
DELIMITED NULL DEFINED AS 'fooNull'
+PREHOOK: type: CREATETABLE
+POSTHOOK: query: CREATE TABLE null_tab2(a STRING, b STRING) ROW FORMAT 
DELIMITED NULL DEFINED AS 'fooNull'
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: default@null_tab2
+#### A masked pattern was here ####
+PREHOOK: type: LOAD
+PREHOOK: Output: default@null_tab2
+#### A masked pattern was here ####
+POSTHOOK: type: LOAD
+POSTHOOK: Output: default@null_tab2
+PREHOOK: query: SELECT * FROM null_tab2
+PREHOOK: type: QUERY
+PREHOOK: Input: default@null_tab2
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT * FROM null_tab2
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@null_tab2
+#### A masked pattern was here ####
+1.0    1
+1.0    1
+1.0    1
+1.0    1
+1.0    1
+NULL   1
+NULL   NULL
+1.0    NULL
+1.0    1
+1.0    1
+#### A masked pattern was here ####
+PREHOOK: query: DROP TABLE base_tab
+PREHOOK: type: DROPTABLE
+PREHOOK: Input: default@base_tab
+PREHOOK: Output: default@base_tab
+POSTHOOK: query: DROP TABLE base_tab
+POSTHOOK: type: DROPTABLE
+POSTHOOK: Input: default@base_tab
+POSTHOOK: Output: default@base_tab


Reply via email to