HIVE-12994: Implement support for NULLS FIRST/NULLS LAST (Jesus Camacho 
Rodriguez, reviewed by Ashutosh Chauhan)


Project: http://git-wip-us.apache.org/repos/asf/hive/repo
Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/9350b693
Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/9350b693
Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/9350b693

Branch: refs/heads/master
Commit: 9350b69341d509d4fc6d6e2f82bf3d6123ee11f3
Parents: 01fd684
Author: Jesus Camacho Rodriguez <[email protected]>
Authored: Wed Feb 24 14:19:41 2016 +0100
Committer: Jesus Camacho Rodriguez <[email protected]>
Committed: Wed Mar 2 11:59:05 2016 +0100

----------------------------------------------------------------------
 data/files/over4_null                           |   5 +
 .../test/resources/testconfiguration.properties |   1 +
 metastore/if/hive_metastore.thrift              |   5 +-
 .../upgrade/derby/034-HIVE-12994.derby.sql      |   2 +
 .../upgrade/derby/hive-schema-2.1.0.derby.sql   |   2 +-
 .../derby/upgrade-2.0.0-to-2.1.0.derby.sql      |   1 +
 .../upgrade/mssql/019-HIVE-12994.mssql.sql      |   2 +
 .../upgrade/mssql/hive-schema-2.1.0.mssql.sql   |   1 +
 .../mssql/upgrade-2.0.0-to-2.1.0.mssql.sql      |   1 +
 .../upgrade/mysql/034-HIVE-12994.mysql.sql      |   2 +
 .../upgrade/mysql/hive-schema-2.1.0.mysql.sql   |   1 +
 .../mysql/upgrade-2.0.0-to-2.1.0.mysql.sql      |   1 +
 .../upgrade/oracle/034-HIVE-12994.oracle.sql    |   2 +
 .../upgrade/oracle/hive-schema-2.1.0.oracle.sql |   1 +
 .../oracle/upgrade-2.0.0-to-2.1.0.oracle.sql    |   1 +
 .../postgres/033-HIVE-12994.postgres.sql        |   2 +
 .../postgres/hive-schema-2.1.0.postgres.sql     |   1 +
 .../upgrade-2.0.0-to-2.1.0.postgres.sql         |   1 +
 .../apache/hadoop/hive/metastore/Metastore.java |  22 +-
 .../metastore/hbase/HbaseMetastoreProto.java    | 175 +++--
 .../gen/thrift/gen-cpp/hive_metastore_types.cpp |  20 +
 .../gen/thrift/gen-cpp/hive_metastore_types.h   |  10 +-
 .../apache/hadoop/hive/metastore/api/Order.java | 106 ++-
 .../src/gen/thrift/gen-php/metastore/Types.php  |  23 +
 .../gen/thrift/gen-py/hive_metastore/ttypes.py  |  15 +-
 .../gen/thrift/gen-rb/hive_metastore_types.rb   |   4 +-
 .../hive/metastore/MetaStoreDirectSql.java      |   6 +-
 .../hadoop/hive/metastore/ObjectStore.java      |   5 +-
 .../hadoop/hive/metastore/hbase/HBaseUtils.java |   2 +-
 .../hadoop/hive/metastore/model/MOrder.java     |  22 +-
 .../metastore/hbase/hbase_metastore_proto.proto |   1 +
 .../hive/metastore/hbase/TestHBaseStore.java    |  31 +-
 .../hbase/TestHBaseStoreBitVector.java          |  36 +-
 .../hbase/TestSharedStorageDescriptor.java      |  18 +-
 .../org/apache/hadoop/hive/ql/exec/DDLTask.java |   5 +
 .../hadoop/hive/ql/exec/MapJoinOperator.java    |   2 +
 .../apache/hadoop/hive/ql/exec/MoveTask.java    |   4 +-
 .../persistence/HybridHashTableContainer.java   |  22 +-
 .../persistence/MapJoinBytesTableContainer.java |  36 +-
 .../hive/ql/exec/persistence/MapJoinKey.java    |  12 +-
 .../ql/exec/tez/DynamicPartitionPruner.java     |   2 +-
 .../VectorReduceSinkCommonOperator.java         |  66 +-
 .../apache/hadoop/hive/ql/metadata/Hive.java    |   2 +-
 .../hive/ql/optimizer/AbstractSMBJoinProc.java  |   3 +-
 .../BucketingSortingReduceSinkOptimizer.java    |  85 ++-
 .../ql/optimizer/ReduceSinkMapJoinProc.java     |  15 +-
 .../optimizer/SortedDynPartitionOptimizer.java  |  97 ++-
 .../ql/optimizer/calcite/RelOptHiveTable.java   |  10 +-
 .../calcite/rules/HiveRelFieldTrimmer.java      |   4 +-
 .../calcite/translator/ASTConverter.java        |  49 +-
 .../calcite/translator/ExprNodeConverter.java   |  12 +
 .../calcite/translator/HiveOpConverter.java     |  39 +-
 .../correlation/ReduceSinkDeDuplication.java    |  20 +-
 .../optimizer/physical/BucketingSortingCtx.java |  15 +-
 .../physical/BucketingSortingOpProcFactory.java |  16 +-
 .../spark/SparkReduceSinkMapJoinProc.java       |  23 +-
 .../hive/ql/parse/BaseSemanticAnalyzer.java     |  22 +-
 .../hadoop/hive/ql/parse/CalcitePlanner.java    |  32 +-
 .../org/apache/hadoop/hive/ql/parse/HiveLexer.g |   2 +
 .../apache/hadoop/hive/ql/parse/HiveParser.g    |  48 +-
 .../hadoop/hive/ql/parse/IdentifiersParser.g    |   4 +-
 .../hadoop/hive/ql/parse/PTFInvocationSpec.java |  25 +-
 .../hadoop/hive/ql/parse/PTFTranslator.java     |   1 +
 .../hadoop/hive/ql/parse/SemanticAnalyzer.java  |  89 ++-
 .../hive/ql/parse/TypeCheckProcFactory.java     |   2 +
 .../apache/hadoop/hive/ql/plan/PlanUtils.java   |  35 +-
 .../hadoop/hive/ql/plan/ReduceSinkDesc.java     |  23 +-
 .../hive/ql/plan/ptf/OrderExpressionDef.java    |  13 +-
 .../plan/ptf/PartitionedTableFunctionDef.java   |  12 +-
 .../hive/ql/udf/ptf/WindowingTableFunction.java |  69 +-
 .../hive/ql/txn/compactor/TestWorker.java       |   4 +-
 ql/src/test/queries/clientpositive/keyword_3.q  |   8 +
 ql/src/test/queries/clientpositive/order_null.q |  29 +
 .../clientpositive/windowing_order_null.q       |  35 +
 ...lter_numbuckets_partitioned_table2_h23.q.out |  20 +-
 ...alter_numbuckets_partitioned_table_h23.q.out |   4 +-
 .../alter_partition_clusterby_sortby.q.out      |   4 +-
 .../alter_partition_coltype.q.out               |   3 +
 .../clientpositive/alter_table_not_sorted.q.out |   2 +-
 .../clientpositive/authorization_index.q.out    |   2 +-
 .../auto_join_reordering_values.q.out           |   8 +
 .../clientpositive/auto_sortmerge_join_1.q.out  |   5 +
 .../clientpositive/auto_sortmerge_join_11.q.out |   4 +
 .../clientpositive/auto_sortmerge_join_12.q.out |   1 +
 .../clientpositive/auto_sortmerge_join_2.q.out  |   4 +
 .../clientpositive/auto_sortmerge_join_3.q.out  |   5 +
 .../clientpositive/auto_sortmerge_join_4.q.out  |   5 +
 .../clientpositive/auto_sortmerge_join_5.q.out  |   5 +
 .../clientpositive/auto_sortmerge_join_7.q.out  |   5 +
 .../clientpositive/auto_sortmerge_join_8.q.out  |   5 +
 .../test/results/clientpositive/bucket1.q.out   |   1 +
 .../test/results/clientpositive/bucket2.q.out   |   1 +
 .../test/results/clientpositive/bucket3.q.out   |   1 +
 .../test/results/clientpositive/bucket4.q.out   |   1 +
 .../test/results/clientpositive/bucket5.q.out   |   4 +-
 .../results/clientpositive/bucket_many.q.out    |   1 +
 .../clientpositive/bucket_map_join_1.q.out      |   1 +
 .../clientpositive/bucket_map_join_2.q.out      |   1 +
 .../clientpositive/bucketcontext_1.q.out        |   2 +
 .../clientpositive/bucketcontext_2.q.out        |   2 +
 .../clientpositive/bucketcontext_3.q.out        |   2 +
 .../clientpositive/bucketcontext_4.q.out        |   2 +
 .../clientpositive/bucketcontext_5.q.out        |   2 +
 .../clientpositive/bucketcontext_6.q.out        |   2 +
 .../clientpositive/bucketcontext_7.q.out        |   2 +
 .../clientpositive/bucketcontext_8.q.out        |   2 +
 .../clientpositive/bucketmapjoin10.q.out        |   1 +
 .../clientpositive/bucketmapjoin11.q.out        |   2 +
 .../clientpositive/bucketmapjoin12.q.out        |   2 +
 .../clientpositive/bucketmapjoin13.q.out        |   4 +
 .../results/clientpositive/bucketmapjoin7.q.out |  19 +-
 .../results/clientpositive/bucketmapjoin8.q.out |   2 +
 .../results/clientpositive/bucketmapjoin9.q.out |   2 +
 .../cbo_rp_outer_join_ppr.q.java1.7.out         |   4 +
 .../clientpositive/columnstats_partlvl.q.out    |   2 +
 .../clientpositive/columnstats_tbllvl.q.out     |   2 +
 .../test/results/clientpositive/combine2.q.out  |   1 +
 .../constantPropagateForSubQuery.q.out          |   2 +
 .../clientpositive/correlationoptimizer12.q.out |   4 +-
 ql/src/test/results/clientpositive/ctas.q.out   |  12 +-
 .../results/clientpositive/ctas_colname.q.out   |   4 +-
 .../disable_merge_for_bucketing.q.out           |   1 +
 .../display_colstats_tbllvl.q.out               |   1 +
 .../dynpart_sort_opt_vectorization.q.out        |  12 +-
 .../dynpart_sort_optimization.q.out             |  12 +-
 .../encryption_join_unencrypted_tbl.q.out       |   2 +
 ...on_join_with_different_encryption_keys.q.out |   2 +
 .../clientpositive/explain_logical.q.out        |   9 +-
 .../clientpositive/filter_join_breaktask.q.out  |   4 +
 .../clientpositive/fouter_join_ppr.q.out        |   8 +
 .../groupby_grouping_window.q.out               |   2 +-
 .../clientpositive/groupby_map_ppr.q.out        |   1 +
 .../groupby_map_ppr_multi_distinct.q.out        |   1 +
 .../results/clientpositive/groupby_ppr.q.out    |   1 +
 .../groupby_ppr_multi_distinct.q.out            |   1 +
 .../clientpositive/groupby_resolution.q.out     |   2 +-
 .../clientpositive/groupby_sort_1_23.q.out      |  11 +
 .../results/clientpositive/groupby_sort_6.q.out |   3 +
 .../clientpositive/groupby_sort_skew_1_23.q.out |  18 +
 .../clientpositive/index_skewtable.q.out        |   2 +-
 .../clientpositive/infer_bucket_sort.q.out      |  42 +-
 .../infer_bucket_sort_bucketed_table.q.out      |   2 +-
 .../infer_bucket_sort_convert_join.q.out        |   2 +-
 .../infer_bucket_sort_dyn_part.q.out            |   4 +-
 .../infer_bucket_sort_grouping_operators.q.out  |  12 +-
 .../infer_bucket_sort_map_operators.q.out       |   4 +-
 .../infer_bucket_sort_merge.q.out               |   2 +-
 .../infer_bucket_sort_multi_insert.q.out        |  10 +-
 .../infer_bucket_sort_reducers_power_two.q.out  |  12 +-
 .../test/results/clientpositive/input23.q.out   |   2 +
 .../results/clientpositive/input_part7.q.out    |  38 +-
 ql/src/test/results/clientpositive/join17.q.out |   2 +
 ql/src/test/results/clientpositive/join35.q.out |   2 +
 ql/src/test/results/clientpositive/join9.q.out  |   2 +
 .../clientpositive/join_filters_overlap.q.out   |  17 +
 .../test/results/clientpositive/keyword_3.q.out |  32 +
 .../test/results/clientpositive/lineage2.q.out  |   2 +-
 .../test/results/clientpositive/lineage3.q.out  |  10 +-
 .../list_bucket_query_multiskew_3.q.out         |   1 +
 .../list_bucket_query_oneskew_2.q.out           |   2 +
 .../llap/tez_join_result_complex.q.out          |   2 +
 .../clientpositive/louter_join_ppr.q.out        |   8 +
 ql/src/test/results/clientpositive/merge3.q.out |   1 +
 .../results/clientpositive/metadataonly1.q.out  |  12 +
 .../clientpositive/optimize_nullscan.q.out      |  14 +
 .../results/clientpositive/orc_analyze.q.out    |  16 +-
 .../results/clientpositive/order_null.q.out     | 222 ++++++
 .../clientpositive/outer_join_ppr.q.java1.7.out |   4 +
 .../partition_coltype_literals.q.out            |   4 +-
 ql/src/test/results/clientpositive/pcr.q.out    | 204 +++--
 ql/src/test/results/clientpositive/pcs.q.out    |  49 +-
 .../results/clientpositive/perf/query12.q.out   |   2 +-
 .../results/clientpositive/perf/query20.q.out   |   2 +-
 .../results/clientpositive/perf/query51.q.out   |   6 +-
 .../results/clientpositive/perf/query67.q.out   |   2 +-
 .../results/clientpositive/perf/query70.q.out   |   4 +-
 .../results/clientpositive/perf/query89.q.out   |   2 +-
 .../results/clientpositive/perf/query98.q.out   |   2 +-
 .../results/clientpositive/pointlookup2.q.out   | 100 ++-
 .../results/clientpositive/pointlookup3.q.out   |  96 ++-
 .../results/clientpositive/pointlookup4.q.out   |  42 +-
 .../clientpositive/ppd_join_filter.q.out        |  12 +
 .../results/clientpositive/ppd_union_view.q.out |   4 +
 ql/src/test/results/clientpositive/ppd_vc.q.out |  18 +-
 .../results/clientpositive/ppd_windowing1.q.out |  66 +-
 ql/src/test/results/clientpositive/ptf.q.out    | 144 ++--
 .../results/clientpositive/ptf_matchpath.q.out  |   6 +-
 .../results/clientpositive/ptf_streaming.q.out  |  96 +--
 .../results/clientpositive/ptfgroupbyjoin.q.out |   2 +-
 .../test/results/clientpositive/push_or.q.out   |  11 +-
 .../results/clientpositive/quotedid_basic.q.out |   4 +-
 .../clientpositive/reduce_deduplicate.q.out     |   2 +
 .../results/clientpositive/regexp_extract.q.out |   2 +
 .../clientpositive/router_join_ppr.q.out        |   8 +
 .../test/results/clientpositive/sample10.q.out  |   7 +-
 .../test/results/clientpositive/sample6.q.out   |  77 +-
 .../test/results/clientpositive/sample8.q.out   |   2 +
 .../test/results/clientpositive/semijoin2.q.out |   4 +-
 .../test/results/clientpositive/semijoin4.q.out |   2 +-
 .../show_create_table_alter.q.out               |  10 +-
 .../results/clientpositive/smb_mapjoin_11.q.out |   1 +
 .../results/clientpositive/smb_mapjoin_13.q.out |  20 +-
 .../results/clientpositive/smb_mapjoin_15.q.out |  40 +-
 .../clientpositive/sort_merge_join_desc_5.q.out |   1 +
 .../clientpositive/sort_merge_join_desc_6.q.out |   1 +
 .../clientpositive/sort_merge_join_desc_7.q.out |   1 +
 .../spark/auto_join_reordering_values.q.out     |   8 +
 .../spark/auto_sortmerge_join_1.q.out           |   3 +
 .../spark/auto_sortmerge_join_12.q.out          |   1 +
 .../spark/auto_sortmerge_join_2.q.out           |   2 +
 .../spark/auto_sortmerge_join_3.q.out           |   3 +
 .../spark/auto_sortmerge_join_4.q.out           |   3 +
 .../spark/auto_sortmerge_join_5.q.out           |   3 +
 .../spark/auto_sortmerge_join_7.q.out           |   3 +
 .../spark/auto_sortmerge_join_8.q.out           |   3 +
 .../results/clientpositive/spark/bucket2.q.out  |   1 +
 .../results/clientpositive/spark/bucket3.q.out  |   1 +
 .../results/clientpositive/spark/bucket4.q.out  |   1 +
 .../results/clientpositive/spark/bucket5.q.out  |   4 +-
 .../spark/bucket_map_join_1.q.out               |   1 +
 .../spark/bucket_map_join_2.q.out               |   1 +
 .../clientpositive/spark/bucketmapjoin10.q.out  |   1 +
 .../clientpositive/spark/bucketmapjoin11.q.out  |   2 +
 .../clientpositive/spark/bucketmapjoin12.q.out  |   2 +
 .../clientpositive/spark/bucketmapjoin13.q.out  |   4 +
 .../clientpositive/spark/bucketmapjoin7.q.out   |  19 +-
 .../clientpositive/spark/bucketmapjoin8.q.out   |   2 +
 .../clientpositive/spark/bucketmapjoin9.q.out   |   2 +
 .../results/clientpositive/spark/ctas.q.out     |  12 +-
 .../spark/disable_merge_for_bucketing.q.out     |   1 +
 .../spark/filter_join_breaktask.q.out           |   4 +
 .../clientpositive/spark/groupby_map_ppr.q.out  |   1 +
 .../spark/groupby_map_ppr_multi_distinct.q.out  |   1 +
 .../clientpositive/spark/groupby_ppr.q.out      |   1 +
 .../spark/groupby_ppr_multi_distinct.q.out      |   1 +
 .../spark/groupby_resolution.q.out              |   2 +-
 .../spark/groupby_sort_1_23.q.out               |  11 +
 .../spark/groupby_sort_skew_1_23.q.out          |  18 +
 .../infer_bucket_sort_bucketed_table.q.out      |   2 +-
 .../results/clientpositive/spark/join17.q.out   |   2 +
 .../results/clientpositive/spark/join34.q.out   |   3 +
 .../results/clientpositive/spark/join35.q.out   |   5 +
 .../results/clientpositive/spark/join9.q.out    |   2 +
 .../spark/join_filters_overlap.q.out            |  17 +
 .../clientpositive/spark/louter_join_ppr.q.out  |   8 +
 .../spark/optimize_nullscan.q.out               |  14 +
 .../spark/outer_join_ppr.q.java1.7.out          |   4 +
 .../test/results/clientpositive/spark/pcr.q.out | 204 +++--
 .../clientpositive/spark/ppd_join_filter.q.out  |  12 +
 .../test/results/clientpositive/spark/ptf.q.out | 146 ++--
 .../clientpositive/spark/ptf_matchpath.q.out    |   6 +-
 .../clientpositive/spark/ptf_streaming.q.out    |  96 +--
 .../spark/reduce_deduplicate.q.out              |   2 +
 .../clientpositive/spark/router_join_ppr.q.out  |   8 +
 .../results/clientpositive/spark/sample10.q.out |   7 +-
 .../results/clientpositive/spark/sample6.q.out  |  77 +-
 .../results/clientpositive/spark/sample8.q.out  |   2 +
 .../clientpositive/spark/smb_mapjoin_11.q.out   |   1 +
 .../clientpositive/spark/smb_mapjoin_12.q.out   |   2 +
 .../clientpositive/spark/smb_mapjoin_13.q.out   |  20 +-
 .../clientpositive/spark/smb_mapjoin_15.q.out   |  40 +-
 .../clientpositive/spark/subquery_in.q.out      |   4 +-
 .../clientpositive/spark/transform_ppr1.q.out   |   1 +
 .../clientpositive/spark/transform_ppr2.q.out   |   1 +
 .../results/clientpositive/spark/union24.q.out  |   6 +
 .../clientpositive/spark/union_ppr.q.out        |  38 +-
 .../spark/union_remove_6_subq.q.out             |   2 +-
 .../clientpositive/spark/vectorized_ptf.q.out   | 747 +++++++++++--------
 .../results/clientpositive/subquery_in.q.out    |   4 +-
 .../clientpositive/subquery_in_having.q.out     |   2 +-
 .../results/clientpositive/subquery_notin.q.out |  12 +-
 .../subquery_unqualcolumnrefs.q.out             |   8 +-
 .../temp_table_display_colstats_tbllvl.q.out    |   1 +
 .../tez/auto_sortmerge_join_1.q.out             |   6 +
 .../tez/auto_sortmerge_join_11.q.out            |   9 +
 .../tez/auto_sortmerge_join_12.q.out            |   4 +
 .../tez/auto_sortmerge_join_2.q.out             |   4 +
 .../tez/auto_sortmerge_join_3.q.out             |   6 +
 .../tez/auto_sortmerge_join_4.q.out             |   6 +
 .../tez/auto_sortmerge_join_5.q.out             |   4 +
 .../tez/auto_sortmerge_join_7.q.out             |   6 +
 .../tez/auto_sortmerge_join_8.q.out             |   6 +
 .../results/clientpositive/tez/bucket2.q.out    |   1 +
 .../results/clientpositive/tez/bucket3.q.out    |   1 +
 .../results/clientpositive/tez/bucket4.q.out    |   1 +
 .../test/results/clientpositive/tez/ctas.q.out  |  12 +-
 .../tez/disable_merge_for_bucketing.q.out       |   1 +
 .../tez/dynpart_sort_opt_vectorization.q.out    |  12 +-
 .../tez/dynpart_sort_optimization.q.out         |  12 +-
 .../clientpositive/tez/explainuser_1.q.out      |  94 +--
 .../tez/filter_join_breaktask.q.out             |   4 +
 .../clientpositive/tez/mapjoin_mapjoin.q.out    |   2 +
 .../clientpositive/tez/metadataonly1.q.out      |  12 +
 .../clientpositive/tez/optimize_nullscan.q.out  |  14 +
 .../clientpositive/tez/orc_analyze.q.out        |  16 +-
 .../results/clientpositive/tez/order_null.q.out | 222 ++++++
 .../test/results/clientpositive/tez/ptf.q.out   | 144 ++--
 .../clientpositive/tez/ptf_matchpath.q.out      |   6 +-
 .../clientpositive/tez/ptf_streaming.q.out      |  96 +--
 .../clientpositive/tez/subquery_in.q.out        |   4 +-
 .../tez/tez_join_result_complex.q.out           |   2 +
 .../clientpositive/tez/transform_ppr1.q.out     |   1 +
 .../clientpositive/tez/transform_ppr2.q.out     |   1 +
 .../clientpositive/tez/unionDistinct_1.q.out    |  21 +
 .../clientpositive/tez/vectorized_ptf.q.out     | 745 +++++++++++-------
 .../clientpositive/tez/windowing_gby.q.out      |   2 +-
 .../results/clientpositive/transform_ppr1.q.out |   1 +
 .../results/clientpositive/transform_ppr2.q.out |   1 +
 .../results/clientpositive/udf_explode.q.out    |   2 +
 .../results/clientpositive/udtf_explode.q.out   |   4 +
 .../test/results/clientpositive/union22.q.out   |   2 +
 .../test/results/clientpositive/union24.q.out   |   6 +
 .../clientpositive/unionDistinct_1.q.out        |  20 +
 .../test/results/clientpositive/union_ppr.q.out |  38 +-
 .../clientpositive/union_remove_6_subq.q.out    |   2 +-
 .../results/clientpositive/vectorized_ptf.q.out | 745 +++++++++++-------
 .../clientpositive/windowing_order_null.q.out   | 183 +++++
 .../clientpositive/windowing_streaming.q.out    |   6 +-
 serde/if/serde.thrift                           |   1 +
 .../src/gen/thrift/gen-cpp/serde_constants.cpp  |   2 +
 serde/src/gen/thrift/gen-cpp/serde_constants.h  |   1 +
 .../hadoop/hive/serde/serdeConstants.java       |   2 +
 .../org/apache/hadoop/hive/serde/Types.php      |   5 +
 .../org_apache_hadoop_hive_serde/constants.py   |   1 +
 serde/src/gen/thrift/gen-rb/serde_constants.rb  |   2 +
 .../binarysortable/BinarySortableSerDe.java     | 110 ++-
 .../BinarySortableSerDeWithEndPrefix.java       |   2 +-
 .../fast/BinarySortableSerializeWrite.java      | 130 +++-
 .../binarysortable/TestBinarySortableFast.java  |  30 +-
 .../binarysortable/TestBinarySortableSerDe.java |  18 +-
 330 files changed, 5399 insertions(+), 2340 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/data/files/over4_null
----------------------------------------------------------------------
diff --git a/data/files/over4_null b/data/files/over4_null
new file mode 100644
index 0000000..7f79531
--- /dev/null
+++ b/data/files/over4_null
@@ -0,0 +1,5 @@
+124|336|65534|\N|\N|0.01|true|\N|2013-03-01 09:11:58.703302|45.40|^Ayard duty^B
+19|442|65534|\N|\N|\N|true|calvin miller|2013-03-01 
09:11:58.703217|29.62|^Ahistory^B
+35|387|65536|\N|\N|0.02|false|\N|2013-03-01 09:11:58.70307|27.32|^Ahistory^B
+111|372|\N|\N|\N|0.01|false|\N|2013-03-01 09:11:58.703310|23.91|^Atopology^B
+54|317|\N|\N|\N|\N|false|alice ichabod|2013-03-01 
09:11:58.703103|90.21|^Ageology^B

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/itests/src/test/resources/testconfiguration.properties
----------------------------------------------------------------------
diff --git a/itests/src/test/resources/testconfiguration.properties 
b/itests/src/test/resources/testconfiguration.properties
index 68dbd0c..f991d49 100644
--- a/itests/src/test/resources/testconfiguration.properties
+++ b/itests/src/test/resources/testconfiguration.properties
@@ -160,6 +160,7 @@ minitez.query.files.shared=acid_globallimit.q,\
   metadata_only_queries.q,\
   metadata_only_queries_with_filters.q,\
   nonmr_fetch_threshold.q,\
+  order_null.q,\
   optimize_nullscan.q,\
   orc_analyze.q,\
   orc_merge1.q,\

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/metastore/if/hive_metastore.thrift
----------------------------------------------------------------------
diff --git a/metastore/if/hive_metastore.thrift 
b/metastore/if/hive_metastore.thrift
index e8f0a68..a4fb612 100755
--- a/metastore/if/hive_metastore.thrift
+++ b/metastore/if/hive_metastore.thrift
@@ -226,8 +226,9 @@ struct SerDeInfo {
 
 // sort order of a column (column name along with asc(1)/desc(0))
 struct Order {
-  1: string col,  // sort column name
-  2: i32    order // asc(1) or desc(0)
+  1: string col,      // sort column name
+  2: i32    order,    // asc(1) or desc(0)
+  3: i32    nullOrder // nulls first(0) or nulls last(1)
 }
 
 // this object holds all the information about skewed table

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/metastore/scripts/upgrade/derby/034-HIVE-12994.derby.sql
----------------------------------------------------------------------
diff --git a/metastore/scripts/upgrade/derby/034-HIVE-12994.derby.sql 
b/metastore/scripts/upgrade/derby/034-HIVE-12994.derby.sql
new file mode 100644
index 0000000..a8b48bf
--- /dev/null
+++ b/metastore/scripts/upgrade/derby/034-HIVE-12994.derby.sql
@@ -0,0 +1,2 @@
+ALTER TABLE "APP".SORT_COLS ADD "NULL_ORDER" INTEGER NOT NULL DEFAULT 0;
+UPDATE "APP".SORT_COLS SET "NULL_ORDER" = 1 WHERE "ORDER" = 0;

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/metastore/scripts/upgrade/derby/hive-schema-2.1.0.derby.sql
----------------------------------------------------------------------
diff --git a/metastore/scripts/upgrade/derby/hive-schema-2.1.0.derby.sql 
b/metastore/scripts/upgrade/derby/hive-schema-2.1.0.derby.sql
index 42f4eb6..00c49ae 100644
--- a/metastore/scripts/upgrade/derby/hive-schema-2.1.0.derby.sql
+++ b/metastore/scripts/upgrade/derby/hive-schema-2.1.0.derby.sql
@@ -28,7 +28,7 @@ CREATE TABLE "APP"."SERDE_PARAMS" ("SERDE_ID" BIGINT NOT 
NULL, "PARAM_KEY" VARCH
 
 CREATE TABLE "APP"."COLUMNS_V2" ("CD_ID" BIGINT NOT NULL, "COMMENT" 
VARCHAR(4000), "COLUMN_NAME" VARCHAR(1000) NOT NULL, "TYPE_NAME" VARCHAR(4000), 
"INTEGER_IDX" INTEGER NOT NULL);
 
-CREATE TABLE "APP"."SORT_COLS" ("SD_ID" BIGINT NOT NULL, "COLUMN_NAME" 
VARCHAR(1000), "ORDER" INTEGER NOT NULL, "INTEGER_IDX" INTEGER NOT NULL);
+CREATE TABLE "APP"."SORT_COLS" ("SD_ID" BIGINT NOT NULL, "COLUMN_NAME" 
VARCHAR(1000), "ORDER" INTEGER NOT NULL, "NULL_ORDER" INTEGER NOT NULL, 
"INTEGER_IDX" INTEGER NOT NULL);
 
 CREATE TABLE "APP"."CDS" ("CD_ID" BIGINT NOT NULL);
 

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/metastore/scripts/upgrade/derby/upgrade-2.0.0-to-2.1.0.derby.sql
----------------------------------------------------------------------
diff --git a/metastore/scripts/upgrade/derby/upgrade-2.0.0-to-2.1.0.derby.sql 
b/metastore/scripts/upgrade/derby/upgrade-2.0.0-to-2.1.0.derby.sql
index a0bac3c..13aeabb 100644
--- a/metastore/scripts/upgrade/derby/upgrade-2.0.0-to-2.1.0.derby.sql
+++ b/metastore/scripts/upgrade/derby/upgrade-2.0.0-to-2.1.0.derby.sql
@@ -1,4 +1,5 @@
 -- Upgrade MetaStore schema from 2.0.0 to 2.1.0
 RUN '033-HIVE-12892.derby.sql';
+RUN '034-HIVE-12994.derby.sql';
 
 UPDATE "APP".VERSION SET SCHEMA_VERSION='2.1.0', VERSION_COMMENT='Hive release 
version 2.1.0' where VER_ID=1;

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/metastore/scripts/upgrade/mssql/019-HIVE-12994.mssql.sql
----------------------------------------------------------------------
diff --git a/metastore/scripts/upgrade/mssql/019-HIVE-12994.mssql.sql 
b/metastore/scripts/upgrade/mssql/019-HIVE-12994.mssql.sql
new file mode 100644
index 0000000..51e2c43
--- /dev/null
+++ b/metastore/scripts/upgrade/mssql/019-HIVE-12994.mssql.sql
@@ -0,0 +1,2 @@
+ALTER TABLE SORT_COLS ADD "NULL_ORDER" int NOT NULL DEFAULT 0;
+UPDATE SORT_COLS SET "NULL_ORDER" = 1 WHERE "ORDER" = 0;

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/metastore/scripts/upgrade/mssql/hive-schema-2.1.0.mssql.sql
----------------------------------------------------------------------
diff --git a/metastore/scripts/upgrade/mssql/hive-schema-2.1.0.mssql.sql 
b/metastore/scripts/upgrade/mssql/hive-schema-2.1.0.mssql.sql
index cf5a662..c98c7ef 100644
--- a/metastore/scripts/upgrade/mssql/hive-schema-2.1.0.mssql.sql
+++ b/metastore/scripts/upgrade/mssql/hive-schema-2.1.0.mssql.sql
@@ -411,6 +411,7 @@ CREATE TABLE SORT_COLS
     SD_ID bigint NOT NULL,
     "COLUMN_NAME" nvarchar(1000) NULL,
     "ORDER" int NOT NULL,
+    "NULL_ORDER" int NOT NULL,
     INTEGER_IDX int NOT NULL
 );
 

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/metastore/scripts/upgrade/mssql/upgrade-2.0.0-to-2.1.0.mssql.sql
----------------------------------------------------------------------
diff --git a/metastore/scripts/upgrade/mssql/upgrade-2.0.0-to-2.1.0.mssql.sql 
b/metastore/scripts/upgrade/mssql/upgrade-2.0.0-to-2.1.0.mssql.sql
index f25daf2..3b4a2a3 100644
--- a/metastore/scripts/upgrade/mssql/upgrade-2.0.0-to-2.1.0.mssql.sql
+++ b/metastore/scripts/upgrade/mssql/upgrade-2.0.0-to-2.1.0.mssql.sql
@@ -1,6 +1,7 @@
 SELECT 'Upgrading MetaStore schema from 2.0.0 to 2.1.0' AS MESSAGE;
 
 :r 018-HIVE-12892.mssql.sql;
+:r 019-HIVE-12994.mssql.sql;
 
 UPDATE VERSION SET SCHEMA_VERSION='2.1.0', VERSION_COMMENT='Hive release 
version 2.1.0' where VER_ID=1;
 SELECT 'Finished upgrading MetaStore schema from 2.0.0 to 2.1.0' AS MESSAGE;

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/metastore/scripts/upgrade/mysql/034-HIVE-12994.mysql.sql
----------------------------------------------------------------------
diff --git a/metastore/scripts/upgrade/mysql/034-HIVE-12994.mysql.sql 
b/metastore/scripts/upgrade/mysql/034-HIVE-12994.mysql.sql
new file mode 100644
index 0000000..ff4cf37
--- /dev/null
+++ b/metastore/scripts/upgrade/mysql/034-HIVE-12994.mysql.sql
@@ -0,0 +1,2 @@
+ALTER TABLE `SORT_COLS` ADD `NULL_ORDER` INTEGER NOT NULL DEFAULT 0;
+UPDATE `SORT_COLS` SET `NULL_ORDER` = 1 WHERE `ORDER` = 0;

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/metastore/scripts/upgrade/mysql/hive-schema-2.1.0.mysql.sql
----------------------------------------------------------------------
diff --git a/metastore/scripts/upgrade/mysql/hive-schema-2.1.0.mysql.sql 
b/metastore/scripts/upgrade/mysql/hive-schema-2.1.0.mysql.sql
index 6fd3209..1369349 100644
--- a/metastore/scripts/upgrade/mysql/hive-schema-2.1.0.mysql.sql
+++ b/metastore/scripts/upgrade/mysql/hive-schema-2.1.0.mysql.sql
@@ -546,6 +546,7 @@ CREATE TABLE IF NOT EXISTS `SORT_COLS` (
   `SD_ID` bigint(20) NOT NULL,
   `COLUMN_NAME` varchar(1000) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT 
NULL,
   `ORDER` int(11) NOT NULL,
+  `NULL_ORDER` int(11) NOT NULL,
   `INTEGER_IDX` int(11) NOT NULL,
   PRIMARY KEY (`SD_ID`,`INTEGER_IDX`),
   KEY `SORT_COLS_N49` (`SD_ID`),

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/metastore/scripts/upgrade/mysql/upgrade-2.0.0-to-2.1.0.mysql.sql
----------------------------------------------------------------------
diff --git a/metastore/scripts/upgrade/mysql/upgrade-2.0.0-to-2.1.0.mysql.sql 
b/metastore/scripts/upgrade/mysql/upgrade-2.0.0-to-2.1.0.mysql.sql
index e790636..09bb8b8 100644
--- a/metastore/scripts/upgrade/mysql/upgrade-2.0.0-to-2.1.0.mysql.sql
+++ b/metastore/scripts/upgrade/mysql/upgrade-2.0.0-to-2.1.0.mysql.sql
@@ -1,6 +1,7 @@
 SELECT 'Upgrading MetaStore schema from 2.0.0 to 2.1.0' AS ' ';
 
 SOURCE 033-HIVE-12892.mysql.sql;
+SOURCE 034-HIVE-12994.mysql.sql;
 
 UPDATE VERSION SET SCHEMA_VERSION='2.1.0', VERSION_COMMENT='Hive release 
version 2.1.0' where VER_ID=1;
 SELECT 'Finished upgrading MetaStore schema from 2.0.0 to 2.1.0' AS ' ';

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/metastore/scripts/upgrade/oracle/034-HIVE-12994.oracle.sql
----------------------------------------------------------------------
diff --git a/metastore/scripts/upgrade/oracle/034-HIVE-12994.oracle.sql 
b/metastore/scripts/upgrade/oracle/034-HIVE-12994.oracle.sql
new file mode 100644
index 0000000..0b57ef8
--- /dev/null
+++ b/metastore/scripts/upgrade/oracle/034-HIVE-12994.oracle.sql
@@ -0,0 +1,2 @@
+ALTER TABLE SORT_COLS ADD "NULL_ORDER" NUMBER (10) NOT NULL DEFAULT 0;
+UPDATE SORT_COLS SET "NULL_ORDER" = 1 WHERE "ORDER" = 0;

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/metastore/scripts/upgrade/oracle/hive-schema-2.1.0.oracle.sql
----------------------------------------------------------------------
diff --git a/metastore/scripts/upgrade/oracle/hive-schema-2.1.0.oracle.sql 
b/metastore/scripts/upgrade/oracle/hive-schema-2.1.0.oracle.sql
index 774f6be..198f0bd 100644
--- a/metastore/scripts/upgrade/oracle/hive-schema-2.1.0.oracle.sql
+++ b/metastore/scripts/upgrade/oracle/hive-schema-2.1.0.oracle.sql
@@ -274,6 +274,7 @@ CREATE TABLE SORT_COLS
     SD_ID NUMBER NOT NULL,
     "COLUMN_NAME" VARCHAR2(1000) NULL,
     "ORDER" NUMBER (10) NOT NULL,
+    "NULL_ORDER" NUMBER (10) NOT NULL,
     INTEGER_IDX NUMBER(10) NOT NULL
 );
 

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/metastore/scripts/upgrade/oracle/upgrade-2.0.0-to-2.1.0.oracle.sql
----------------------------------------------------------------------
diff --git a/metastore/scripts/upgrade/oracle/upgrade-2.0.0-to-2.1.0.oracle.sql 
b/metastore/scripts/upgrade/oracle/upgrade-2.0.0-to-2.1.0.oracle.sql
index 8368d08..a729baa 100644
--- a/metastore/scripts/upgrade/oracle/upgrade-2.0.0-to-2.1.0.oracle.sql
+++ b/metastore/scripts/upgrade/oracle/upgrade-2.0.0-to-2.1.0.oracle.sql
@@ -1,6 +1,7 @@
 SELECT 'Upgrading MetaStore schema from 2.0.0 to 2.1.0' AS Status from dual;
 
 @033-HIVE-12892.oracle.sql;
[email protected];
 
 UPDATE VERSION SET SCHEMA_VERSION='2.1.0', VERSION_COMMENT='Hive release 
version 2.1.0' where VER_ID=1;
 SELECT 'Finished upgrading MetaStore schema from 2.0.0 to 2.1.0' AS Status 
from dual;

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/metastore/scripts/upgrade/postgres/033-HIVE-12994.postgres.sql
----------------------------------------------------------------------
diff --git a/metastore/scripts/upgrade/postgres/033-HIVE-12994.postgres.sql 
b/metastore/scripts/upgrade/postgres/033-HIVE-12994.postgres.sql
new file mode 100644
index 0000000..0894fed
--- /dev/null
+++ b/metastore/scripts/upgrade/postgres/033-HIVE-12994.postgres.sql
@@ -0,0 +1,2 @@
+ALTER TABLE SORT_COLS ADD COLUMN "NULL_ORDER" bigint NOT NULL DEFAULT 0;
+UPDATE SORT_COLS SET "NULL_ORDER" = 1 WHERE "ORDER" = 0;

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/metastore/scripts/upgrade/postgres/hive-schema-2.1.0.postgres.sql
----------------------------------------------------------------------
diff --git a/metastore/scripts/upgrade/postgres/hive-schema-2.1.0.postgres.sql 
b/metastore/scripts/upgrade/postgres/hive-schema-2.1.0.postgres.sql
index 7463a37..48d16de 100644
--- a/metastore/scripts/upgrade/postgres/hive-schema-2.1.0.postgres.sql
+++ b/metastore/scripts/upgrade/postgres/hive-schema-2.1.0.postgres.sql
@@ -342,6 +342,7 @@ CREATE TABLE "SORT_COLS" (
     "SD_ID" bigint NOT NULL,
     "COLUMN_NAME" character varying(1000) DEFAULT NULL::character varying,
     "ORDER" bigint NOT NULL,
+    "NULL_ORDER" bigint NOT NULL,
     "INTEGER_IDX" bigint NOT NULL
 );
 

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/metastore/scripts/upgrade/postgres/upgrade-2.0.0-to-2.1.0.postgres.sql
----------------------------------------------------------------------
diff --git 
a/metastore/scripts/upgrade/postgres/upgrade-2.0.0-to-2.1.0.postgres.sql 
b/metastore/scripts/upgrade/postgres/upgrade-2.0.0-to-2.1.0.postgres.sql
index 6172407..30d070d 100644
--- a/metastore/scripts/upgrade/postgres/upgrade-2.0.0-to-2.1.0.postgres.sql
+++ b/metastore/scripts/upgrade/postgres/upgrade-2.0.0-to-2.1.0.postgres.sql
@@ -1,6 +1,7 @@
 SELECT 'Upgrading MetaStore schema from 2.0.0 to 2.1.0';
 
 \i 032-HIVE-12892.postgres.sql;
+\i 033-HIVE-12994.postgres.sql;
 
 UPDATE "VERSION" SET "SCHEMA_VERSION"='2.1.0', "VERSION_COMMENT"='Hive release 
version 2.1.0' where "VER_ID"=1;
 SELECT 'Finished upgrading MetaStore schema from 2.0.0 to 2.1.0';

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/metastore/src/gen/protobuf/gen-java/org/apache/hadoop/hive/metastore/Metastore.java
----------------------------------------------------------------------
diff --git 
a/metastore/src/gen/protobuf/gen-java/org/apache/hadoop/hive/metastore/Metastore.java
 
b/metastore/src/gen/protobuf/gen-java/org/apache/hadoop/hive/metastore/Metastore.java
index 416ae9d..ca928b9 100644
--- 
a/metastore/src/gen/protobuf/gen-java/org/apache/hadoop/hive/metastore/Metastore.java
+++ 
b/metastore/src/gen/protobuf/gen-java/org/apache/hadoop/hive/metastore/Metastore.java
@@ -447,15 +447,15 @@ public final class Metastore {
 
       public final boolean isInitialized() {
         if (!hasOffset()) {
-
+          
           return false;
         }
         if (!hasLength()) {
-
+          
           return false;
         }
         if (!hasIndex()) {
-
+          
           return false;
         }
         return true;
@@ -597,7 +597,7 @@ public final class Metastore {
     /**
      * <code>repeated .org.apache.hadoop.hive.metastore.SplitInfo infos = 
1;</code>
      */
-    java.util.List<org.apache.hadoop.hive.metastore.Metastore.SplitInfo>
+    java.util.List<org.apache.hadoop.hive.metastore.Metastore.SplitInfo> 
         getInfosList();
     /**
      * <code>repeated .org.apache.hadoop.hive.metastore.SplitInfo infos = 
1;</code>
@@ -610,7 +610,7 @@ public final class Metastore {
     /**
      * <code>repeated .org.apache.hadoop.hive.metastore.SplitInfo infos = 
1;</code>
      */
-    java.util.List<? extends 
org.apache.hadoop.hive.metastore.Metastore.SplitInfoOrBuilder>
+    java.util.List<? extends 
org.apache.hadoop.hive.metastore.Metastore.SplitInfoOrBuilder> 
         getInfosOrBuilderList();
     /**
      * <code>repeated .org.apache.hadoop.hive.metastore.SplitInfo infos = 
1;</code>
@@ -731,7 +731,7 @@ public final class Metastore {
     /**
      * <code>repeated .org.apache.hadoop.hive.metastore.SplitInfo infos = 
1;</code>
      */
-    public java.util.List<? extends 
org.apache.hadoop.hive.metastore.Metastore.SplitInfoOrBuilder>
+    public java.util.List<? extends 
org.apache.hadoop.hive.metastore.Metastore.SplitInfoOrBuilder> 
         getInfosOrBuilderList() {
       return infos_;
     }
@@ -984,7 +984,7 @@ public final class Metastore {
               infosBuilder_ = null;
               infos_ = other.infos_;
               bitField0_ = (bitField0_ & ~0x00000001);
-              infosBuilder_ =
+              infosBuilder_ = 
                 com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
                    getInfosFieldBuilder() : null;
             } else {
@@ -999,7 +999,7 @@ public final class Metastore {
       public final boolean isInitialized() {
         for (int i = 0; i < getInfosCount(); i++) {
           if (!getInfos(i).isInitialized()) {
-
+            
             return false;
           }
         }
@@ -1220,7 +1220,7 @@ public final class Metastore {
       /**
        * <code>repeated .org.apache.hadoop.hive.metastore.SplitInfo infos = 
1;</code>
        */
-      public java.util.List<? extends 
org.apache.hadoop.hive.metastore.Metastore.SplitInfoOrBuilder>
+      public java.util.List<? extends 
org.apache.hadoop.hive.metastore.Metastore.SplitInfoOrBuilder> 
            getInfosOrBuilderList() {
         if (infosBuilder_ != null) {
           return infosBuilder_.getMessageOrBuilderList();
@@ -1246,12 +1246,12 @@ public final class Metastore {
       /**
        * <code>repeated .org.apache.hadoop.hive.metastore.SplitInfo infos = 
1;</code>
        */
-      public 
java.util.List<org.apache.hadoop.hive.metastore.Metastore.SplitInfo.Builder>
+      public 
java.util.List<org.apache.hadoop.hive.metastore.Metastore.SplitInfo.Builder> 
            getInfosBuilderList() {
         return getInfosFieldBuilder().getBuilderList();
       }
       private com.google.protobuf.RepeatedFieldBuilder<
-          org.apache.hadoop.hive.metastore.Metastore.SplitInfo, 
org.apache.hadoop.hive.metastore.Metastore.SplitInfo.Builder, 
org.apache.hadoop.hive.metastore.Metastore.SplitInfoOrBuilder>
+          org.apache.hadoop.hive.metastore.Metastore.SplitInfo, 
org.apache.hadoop.hive.metastore.Metastore.SplitInfo.Builder, 
org.apache.hadoop.hive.metastore.Metastore.SplitInfoOrBuilder> 
           getInfosFieldBuilder() {
         if (infosBuilder_ == null) {
           infosBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/metastore/src/gen/protobuf/gen-java/org/apache/hadoop/hive/metastore/hbase/HbaseMetastoreProto.java
----------------------------------------------------------------------
diff --git 
a/metastore/src/gen/protobuf/gen-java/org/apache/hadoop/hive/metastore/hbase/HbaseMetastoreProto.java
 
b/metastore/src/gen/protobuf/gen-java/org/apache/hadoop/hive/metastore/hbase/HbaseMetastoreProto.java
index 3b2d7b5..3057fff 100644
--- 
a/metastore/src/gen/protobuf/gen-java/org/apache/hadoop/hive/metastore/hbase/HbaseMetastoreProto.java
+++ 
b/metastore/src/gen/protobuf/gen-java/org/apache/hadoop/hive/metastore/hbase/HbaseMetastoreProto.java
@@ -22582,6 +22582,16 @@ public final class HbaseMetastoreProto {
        * <code>optional sint32 order = 2 [default = 1];</code>
        */
       int getOrder();
+
+      // optional sint32 nullOrder = 3 [default = 0];
+      /**
+       * <code>optional sint32 nullOrder = 3 [default = 0];</code>
+       */
+      boolean hasNullOrder();
+      /**
+       * <code>optional sint32 nullOrder = 3 [default = 0];</code>
+       */
+      int getNullOrder();
     }
     /**
      * Protobuf type {@code 
org.apache.hadoop.hive.metastore.hbase.StorageDescriptor.Order}
@@ -22644,6 +22654,11 @@ public final class HbaseMetastoreProto {
                 order_ = input.readSInt32();
                 break;
               }
+              case 24: {
+                bitField0_ |= 0x00000004;
+                nullOrder_ = input.readSInt32();
+                break;
+              }
             }
           }
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
@@ -22743,9 +22758,26 @@ public final class HbaseMetastoreProto {
         return order_;
       }
 
+      // optional sint32 nullOrder = 3 [default = 0];
+      public static final int NULLORDER_FIELD_NUMBER = 3;
+      private int nullOrder_;
+      /**
+       * <code>optional sint32 nullOrder = 3 [default = 0];</code>
+       */
+      public boolean hasNullOrder() {
+        return ((bitField0_ & 0x00000004) == 0x00000004);
+      }
+      /**
+       * <code>optional sint32 nullOrder = 3 [default = 0];</code>
+       */
+      public int getNullOrder() {
+        return nullOrder_;
+      }
+
       private void initFields() {
         columnName_ = "";
         order_ = 1;
+        nullOrder_ = 0;
       }
       private byte memoizedIsInitialized = -1;
       public final boolean isInitialized() {
@@ -22769,6 +22801,9 @@ public final class HbaseMetastoreProto {
         if (((bitField0_ & 0x00000002) == 0x00000002)) {
           output.writeSInt32(2, order_);
         }
+        if (((bitField0_ & 0x00000004) == 0x00000004)) {
+          output.writeSInt32(3, nullOrder_);
+        }
         getUnknownFields().writeTo(output);
       }
 
@@ -22786,6 +22821,10 @@ public final class HbaseMetastoreProto {
           size += com.google.protobuf.CodedOutputStream
             .computeSInt32Size(2, order_);
         }
+        if (((bitField0_ & 0x00000004) == 0x00000004)) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeSInt32Size(3, nullOrder_);
+        }
         size += getUnknownFields().getSerializedSize();
         memoizedSerializedSize = size;
         return size;
@@ -22906,6 +22945,8 @@ public final class HbaseMetastoreProto {
           bitField0_ = (bitField0_ & ~0x00000001);
           order_ = 1;
           bitField0_ = (bitField0_ & ~0x00000002);
+          nullOrder_ = 0;
+          bitField0_ = (bitField0_ & ~0x00000004);
           return this;
         }
 
@@ -22942,6 +22983,10 @@ public final class HbaseMetastoreProto {
             to_bitField0_ |= 0x00000002;
           }
           result.order_ = order_;
+          if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
+            to_bitField0_ |= 0x00000004;
+          }
+          result.nullOrder_ = nullOrder_;
           result.bitField0_ = to_bitField0_;
           onBuilt();
           return result;
@@ -22966,6 +23011,9 @@ public final class HbaseMetastoreProto {
           if (other.hasOrder()) {
             setOrder(other.getOrder());
           }
+          if (other.hasNullOrder()) {
+            setNullOrder(other.getNullOrder());
+          }
           this.mergeUnknownFields(other.getUnknownFields());
           return this;
         }
@@ -23104,6 +23152,39 @@ public final class HbaseMetastoreProto {
           return this;
         }
 
+        // optional sint32 nullOrder = 3 [default = 0];
+        private int nullOrder_ ;
+        /**
+         * <code>optional sint32 nullOrder = 3 [default = 0];</code>
+         */
+        public boolean hasNullOrder() {
+          return ((bitField0_ & 0x00000004) == 0x00000004);
+        }
+        /**
+         * <code>optional sint32 nullOrder = 3 [default = 0];</code>
+         */
+        public int getNullOrder() {
+          return nullOrder_;
+        }
+        /**
+         * <code>optional sint32 nullOrder = 3 [default = 0];</code>
+         */
+        public Builder setNullOrder(int value) {
+          bitField0_ |= 0x00000004;
+          nullOrder_ = value;
+          onChanged();
+          return this;
+        }
+        /**
+         * <code>optional sint32 nullOrder = 3 [default = 0];</code>
+         */
+        public Builder clearNullOrder() {
+          bitField0_ = (bitField0_ & ~0x00000004);
+          nullOrder_ = 0;
+          onChanged();
+          return this;
+        }
+
         // 
@@protoc_insertion_point(builder_scope:org.apache.hadoop.hive.metastore.hbase.StorageDescriptor.Order)
       }
 
@@ -34747,7 +34828,7 @@ public final class HbaseMetastoreProto {
       "ant_info\030\001 \003(\01325.org.apache.hadoop.hive." +
       "metastore.hbase.RoleGrantInfo\"\030\n\010RoleLis",
       "t\022\014\n\004role\030\001 
\003(\t\"/\n\004Role\022\023\n\013create_time\030\001" +
-      " \001(\003\022\022\n\nowner_name\030\002 
\001(\t\"\254\010\n\021StorageDesc" +
+      " \001(\003\022\022\n\nowner_name\030\002 
\001(\t\"\302\010\n\021StorageDesc" +
       "riptor\022A\n\004cols\030\001 \003(\01323.org.apache.hadoop" +
       ".hive.metastore.hbase.FieldSchema\022\024\n\014inp" +
       "ut_format\030\002 \001(\t\022\025\n\routput_format\030\003 
\001(\t\022\025" +
@@ -34760,51 +34841,51 @@ public final class HbaseMetastoreProto {
       "skewed_info\030\t \001(\0132D.org.apache.hadoop.hi" +
       "ve.metastore.hbase.StorageDescriptor.Ske" +
       "wedInfo\022!\n\031stored_as_sub_directories\030\n \001" +
-      "(\010\032.\n\005Order\022\023\n\013column_name\030\001 
\002(\t\022\020\n\005orde" +
-      "r\030\002 \001(\021:\0011\032|\n\tSerDeInfo\022\014\n\004name\030\001 
\001(\t\022\031\n" +
-      "\021serialization_lib\030\002 \001(\t\022F\n\nparameters\030\003" +
-      " \001(\01322.org.apache.hadoop.hive.metastore." +
-      "hbase.Parameters\032\214\003\n\nSkewedInfo\022\030\n\020skewe" +
-      "d_col_names\030\001 \003(\t\022r\n\021skewed_col_values\030\002",
-      " \003(\0132W.org.apache.hadoop.hive.metastore." +
-      "hbase.StorageDescriptor.SkewedInfo.Skewe" +
-      "dColValueList\022\206\001\n\036skewed_col_value_locat" +
-      "ion_maps\030\003 \003(\0132^.org.apache.hadoop.hive." +
-      "metastore.hbase.StorageDescriptor.Skewed" +
-      "Info.SkewedColValueLocationMap\032.\n\022Skewed" +
-      "ColValueList\022\030\n\020skewed_col_value\030\001 \003(\t\0327" +
-      "\n\031SkewedColValueLocationMap\022\013\n\003key\030\001 \003(\t" +
-      "\022\r\n\005value\030\002 
\002(\t\"\220\004\n\005Table\022\r\n\005owner\030\001 \001(\t" +
-      "\022\023\n\013create_time\030\002 
\001(\003\022\030\n\020last_access_tim",
-      "e\030\003 \001(\003\022\021\n\tretention\030\004 
\001(\003\022\020\n\010location\030\005" +
-      " \001(\t\022I\n\rsd_parameters\030\006 \001(\01322.org.apache" +
-      ".hadoop.hive.metastore.hbase.Parameters\022" +
-      "\017\n\007sd_hash\030\007 \002(\014\022K\n\016partition_keys\030\010 
\003(\013" +
-      "23.org.apache.hadoop.hive.metastore.hbas" +
-      "e.FieldSchema\022F\n\nparameters\030\t \001(\01322.org." +
-      "apache.hadoop.hive.metastore.hbase.Param" +
-      "eters\022\032\n\022view_original_text\030\n \001(\t\022\032\n\022vie" +
-      "w_expanded_text\030\013 \001(\t\022\022\n\ntable_type\030\014 \001(" +
-      "\t\022Q\n\nprivileges\030\r \001(\0132=.org.apache.hadoo",
-      "p.hive.metastore.hbase.PrincipalPrivileg" +
-      "eSet\022\024\n\014is_temporary\030\016 
\001(\010\"\353\004\n\026Partition" +
-      "KeyComparator\022\r\n\005names\030\001 \002(\t\022\r\n\005types\030\002 
" +
-      "\002(\t\022S\n\002op\030\003 \003(\0132G.org.apache.hadoop.hive" +
-      ".metastore.hbase.PartitionKeyComparator." +
-      "Operator\022S\n\005range\030\004 \003(\0132D.org.apache.had" +
-      "oop.hive.metastore.hbase.PartitionKeyCom" +
-      "parator.Range\032(\n\004Mark\022\r\n\005value\030\001 
\002(\t\022\021\n\t" +
-      "inclusive\030\002 
\002(\010\032\272\001\n\005Range\022\013\n\003key\030\001 \002(\t\022R" +
-      "\n\005start\030\002 \001(\0132C.org.apache.hadoop.hive.m",
-      "etastore.hbase.PartitionKeyComparator.Ma" +
-      "rk\022P\n\003end\030\003 \001(\0132C.org.apache.hadoop.hive" +
-      ".metastore.hbase.PartitionKeyComparator." +
-      "Mark\032\241\001\n\010Operator\022Z\n\004type\030\001 
\002(\0162L.org.ap" +
-      "ache.hadoop.hive.metastore.hbase.Partiti" +
-      "onKeyComparator.Operator.Type\022\013\n\003key\030\002 \002" +
-      "(\t\022\013\n\003val\030\003 
\002(\t\"\037\n\004Type\022\010\n\004LIKE\020\000\022\r\n\tNOT" +
-      
"EQUALS\020\001*#\n\rPrincipalType\022\010\n\004USER\020\000\022\010\n\004R" +
-      "OLE\020\001"
+      "(\010\032D\n\005Order\022\023\n\013column_name\030\001 
\002(\t\022\020\n\005orde" +
+      "r\030\002 \001(\021:\0011\022\024\n\tnullOrder\030\003 
\001(\021:\0010\032|\n\tSerD" +
+      "eInfo\022\014\n\004name\030\001 \001(\t\022\031\n\021serialization_lib" 
+
+      "\030\002 \001(\t\022F\n\nparameters\030\003 \001(\01322.org.apache." +
+      "hadoop.hive.metastore.hbase.Parameters\032\214" +
+      "\003\n\nSkewedInfo\022\030\n\020skewed_col_names\030\001 \003(\t\022",
+      "r\n\021skewed_col_values\030\002 \003(\0132W.org.apache." +
+      "hadoop.hive.metastore.hbase.StorageDescr" +
+      "iptor.SkewedInfo.SkewedColValueList\022\206\001\n\036" +
+      "skewed_col_value_location_maps\030\003 \003(\0132^.o" +
+      "rg.apache.hadoop.hive.metastore.hbase.St" +
+      "orageDescriptor.SkewedInfo.SkewedColValu" +
+      "eLocationMap\032.\n\022SkewedColValueList\022\030\n\020sk" +
+      "ewed_col_value\030\001 \003(\t\0327\n\031SkewedColValueLo" +
+      "cationMap\022\013\n\003key\030\001 \003(\t\022\r\n\005value\030\002 
\002(\t\"\220\004" +
+      "\n\005Table\022\r\n\005owner\030\001 
\001(\t\022\023\n\013create_time\030\002 ",
+      "\001(\003\022\030\n\020last_access_time\030\003 
\001(\003\022\021\n\tretenti" +
+      "on\030\004 \001(\003\022\020\n\010location\030\005 
\001(\t\022I\n\rsd_paramet" +
+      "ers\030\006 \001(\01322.org.apache.hadoop.hive.metas" +
+      "tore.hbase.Parameters\022\017\n\007sd_hash\030\007 \002(\014\022K" +
+      "\n\016partition_keys\030\010 \003(\01323.org.apache.hado" +
+      "op.hive.metastore.hbase.FieldSchema\022F\n\np" +
+      "arameters\030\t \001(\01322.org.apache.hadoop.hive" +
+      ".metastore.hbase.Parameters\022\032\n\022view_orig" +
+      "inal_text\030\n \001(\t\022\032\n\022view_expanded_text\030\013 " +
+      "\001(\t\022\022\n\ntable_type\030\014 \001(\t\022Q\n\nprivileges\030\r 
",
+      "\001(\0132=.org.apache.hadoop.hive.metastore.h" +
+      "base.PrincipalPrivilegeSet\022\024\n\014is_tempora" +
+      "ry\030\016 
\001(\010\"\353\004\n\026PartitionKeyComparator\022\r\n\005n" +
+      "ames\030\001 \002(\t\022\r\n\005types\030\002 
\002(\t\022S\n\002op\030\003 \003(\0132G." +
+      "org.apache.hadoop.hive.metastore.hbase.P" +
+      "artitionKeyComparator.Operator\022S\n\005range\030" +
+      "\004 \003(\0132D.org.apache.hadoop.hive.metastore" +
+      ".hbase.PartitionKeyComparator.Range\032(\n\004M" +
+      "ark\022\r\n\005value\030\001 \002(\t\022\021\n\tinclusive\030\002 
\002(\010\032\272\001" +
+      "\n\005Range\022\013\n\003key\030\001 \002(\t\022R\n\005start\030\002 
\001(\0132C.or",
+      "g.apache.hadoop.hive.metastore.hbase.Par" +
+      "titionKeyComparator.Mark\022P\n\003end\030\003 \001(\0132C." +
+      "org.apache.hadoop.hive.metastore.hbase.P" +
+      "artitionKeyComparator.Mark\032\241\001\n\010Operator\022" +
+      "Z\n\004type\030\001 \002(\0162L.org.apache.hadoop.hive.m" +
+      "etastore.hbase.PartitionKeyComparator.Op" +
+      "erator.Type\022\013\n\003key\030\002 \002(\t\022\013\n\003val\030\003 
\002(\t\"\037\n" +
+      
"\004Type\022\010\n\004LIKE\020\000\022\r\n\tNOTEQUALS\020\001*#\n\rPrinci" +
+      "palType\022\010\n\004USER\020\000\022\010\n\004ROLE\020\001"
     };
     com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner 
assigner =
       new 
com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
@@ -34990,7 +35071,7 @@ public final class HbaseMetastoreProto {
           
internal_static_org_apache_hadoop_hive_metastore_hbase_StorageDescriptor_Order_fieldAccessorTable
 = new
             com.google.protobuf.GeneratedMessage.FieldAccessorTable(
               
internal_static_org_apache_hadoop_hive_metastore_hbase_StorageDescriptor_Order_descriptor,
-              new java.lang.String[] { "ColumnName", "Order", });
+              new java.lang.String[] { "ColumnName", "Order", "NullOrder", });
           
internal_static_org_apache_hadoop_hive_metastore_hbase_StorageDescriptor_SerDeInfo_descriptor
 =
             
internal_static_org_apache_hadoop_hive_metastore_hbase_StorageDescriptor_descriptor.getNestedTypes().get(1);
           
internal_static_org_apache_hadoop_hive_metastore_hbase_StorageDescriptor_SerDeInfo_fieldAccessorTable
 = new

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/metastore/src/gen/thrift/gen-cpp/hive_metastore_types.cpp
----------------------------------------------------------------------
diff --git a/metastore/src/gen/thrift/gen-cpp/hive_metastore_types.cpp 
b/metastore/src/gen/thrift/gen-cpp/hive_metastore_types.cpp
index 2695ffa..6534d68 100644
--- a/metastore/src/gen/thrift/gen-cpp/hive_metastore_types.cpp
+++ b/metastore/src/gen/thrift/gen-cpp/hive_metastore_types.cpp
@@ -3101,6 +3101,10 @@ void Order::__set_order(const int32_t val) {
   this->order = val;
 }
 
+void Order::__set_nullOrder(const int32_t val) {
+  this->nullOrder = val;
+}
+
 uint32_t Order::read(::apache::thrift::protocol::TProtocol* iprot) {
 
   apache::thrift::protocol::TInputRecursionTracker tracker(*iprot);
@@ -3138,6 +3142,14 @@ uint32_t 
Order::read(::apache::thrift::protocol::TProtocol* iprot) {
           xfer += iprot->skip(ftype);
         }
         break;
+      case 3:
+        if (ftype == ::apache::thrift::protocol::T_I32) {
+          xfer += iprot->readI32(this->nullOrder);
+          this->__isset.nullOrder = true;
+        } else {
+          xfer += iprot->skip(ftype);
+        }
+        break;
       default:
         xfer += iprot->skip(ftype);
         break;
@@ -3163,6 +3175,10 @@ uint32_t 
Order::write(::apache::thrift::protocol::TProtocol* oprot) const {
   xfer += oprot->writeI32(this->order);
   xfer += oprot->writeFieldEnd();
 
+  xfer += oprot->writeFieldBegin("nullOrder", 
::apache::thrift::protocol::T_I32, 3);
+  xfer += oprot->writeI32(this->nullOrder);
+  xfer += oprot->writeFieldEnd();
+
   xfer += oprot->writeFieldStop();
   xfer += oprot->writeStructEnd();
   return xfer;
@@ -3172,17 +3188,20 @@ void swap(Order &a, Order &b) {
   using ::std::swap;
   swap(a.col, b.col);
   swap(a.order, b.order);
+  swap(a.nullOrder, b.nullOrder);
   swap(a.__isset, b.__isset);
 }
 
 Order::Order(const Order& other139) {
   col = other139.col;
   order = other139.order;
+  nullOrder = other139.nullOrder;
   __isset = other139.__isset;
 }
 Order& Order::operator=(const Order& other140) {
   col = other140.col;
   order = other140.order;
+  nullOrder = other140.nullOrder;
   __isset = other140.__isset;
   return *this;
 }
@@ -3191,6 +3210,7 @@ void Order::printTo(std::ostream& out) const {
   out << "Order(";
   out << "col=" << to_string(col);
   out << ", " << "order=" << to_string(order);
+  out << ", " << "nullOrder=" << to_string(nullOrder);
   out << ")";
 }
 

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/metastore/src/gen/thrift/gen-cpp/hive_metastore_types.h
----------------------------------------------------------------------
diff --git a/metastore/src/gen/thrift/gen-cpp/hive_metastore_types.h 
b/metastore/src/gen/thrift/gen-cpp/hive_metastore_types.h
index 97c07a5..3fd2543 100644
--- a/metastore/src/gen/thrift/gen-cpp/hive_metastore_types.h
+++ b/metastore/src/gen/thrift/gen-cpp/hive_metastore_types.h
@@ -1575,9 +1575,10 @@ inline std::ostream& operator<<(std::ostream& out, const 
SerDeInfo& obj)
 }
 
 typedef struct _Order__isset {
-  _Order__isset() : col(false), order(false) {}
+  _Order__isset() : col(false), order(false), nullOrder(false) {}
   bool col :1;
   bool order :1;
+  bool nullOrder :1;
 } _Order__isset;
 
 class Order {
@@ -1585,12 +1586,13 @@ class Order {
 
   Order(const Order&);
   Order& operator=(const Order&);
-  Order() : col(), order(0) {
+  Order() : col(), order(0), nullOrder(0) {
   }
 
   virtual ~Order() throw();
   std::string col;
   int32_t order;
+  int32_t nullOrder;
 
   _Order__isset __isset;
 
@@ -1598,12 +1600,16 @@ class Order {
 
   void __set_order(const int32_t val);
 
+  void __set_nullOrder(const int32_t val);
+
   bool operator == (const Order & rhs) const
   {
     if (!(col == rhs.col))
       return false;
     if (!(order == rhs.order))
       return false;
+    if (!(nullOrder == rhs.nullOrder))
+      return false;
     return true;
   }
   bool operator != (const Order &rhs) const {

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/metastore/src/gen/thrift/gen-javabean/org/apache/hadoop/hive/metastore/api/Order.java
----------------------------------------------------------------------
diff --git 
a/metastore/src/gen/thrift/gen-javabean/org/apache/hadoop/hive/metastore/api/Order.java
 
b/metastore/src/gen/thrift/gen-javabean/org/apache/hadoop/hive/metastore/api/Order.java
index cc0e2dd..fd05de5 100644
--- 
a/metastore/src/gen/thrift/gen-javabean/org/apache/hadoop/hive/metastore/api/Order.java
+++ 
b/metastore/src/gen/thrift/gen-javabean/org/apache/hadoop/hive/metastore/api/Order.java
@@ -40,6 +40,7 @@ public class Order implements org.apache.thrift.TBase<Order, 
Order._Fields>, jav
 
   private static final org.apache.thrift.protocol.TField COL_FIELD_DESC = new 
org.apache.thrift.protocol.TField("col", 
org.apache.thrift.protocol.TType.STRING, (short)1);
   private static final org.apache.thrift.protocol.TField ORDER_FIELD_DESC = 
new org.apache.thrift.protocol.TField("order", 
org.apache.thrift.protocol.TType.I32, (short)2);
+  private static final org.apache.thrift.protocol.TField NULL_ORDER_FIELD_DESC 
= new org.apache.thrift.protocol.TField("nullOrder", 
org.apache.thrift.protocol.TType.I32, (short)3);
 
   private static final Map<Class<? extends IScheme>, SchemeFactory> schemes = 
new HashMap<Class<? extends IScheme>, SchemeFactory>();
   static {
@@ -49,11 +50,13 @@ public class Order implements 
org.apache.thrift.TBase<Order, Order._Fields>, jav
 
   private String col; // required
   private int order; // required
+  private int nullOrder; // required
 
   /** The set of fields this struct contains, along with convenience methods 
for finding and manipulating them. */
   public enum _Fields implements org.apache.thrift.TFieldIdEnum {
     COL((short)1, "col"),
-    ORDER((short)2, "order");
+    ORDER((short)2, "order"),
+    NULL_ORDER((short)3, "nullOrder");
 
     private static final Map<String, _Fields> byName = new HashMap<String, 
_Fields>();
 
@@ -72,6 +75,8 @@ public class Order implements org.apache.thrift.TBase<Order, 
Order._Fields>, jav
           return COL;
         case 2: // ORDER
           return ORDER;
+        case 3: // NULL_ORDER
+          return NULL_ORDER;
         default:
           return null;
       }
@@ -113,6 +118,7 @@ public class Order implements 
org.apache.thrift.TBase<Order, Order._Fields>, jav
 
   // isset id assignments
   private static final int __ORDER_ISSET_ID = 0;
+  private static final int __NULLORDER_ISSET_ID = 1;
   private byte __isset_bitfield = 0;
   public static final Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> 
metaDataMap;
   static {
@@ -121,6 +127,8 @@ public class Order implements 
org.apache.thrift.TBase<Order, Order._Fields>, jav
         new 
org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
     tmpMap.put(_Fields.ORDER, new 
org.apache.thrift.meta_data.FieldMetaData("order", 
org.apache.thrift.TFieldRequirementType.DEFAULT, 
         new 
org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I32)));
+    tmpMap.put(_Fields.NULL_ORDER, new 
org.apache.thrift.meta_data.FieldMetaData("nullOrder", 
org.apache.thrift.TFieldRequirementType.DEFAULT, 
+        new 
org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I32)));
     metaDataMap = Collections.unmodifiableMap(tmpMap);
     
org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(Order.class, 
metaDataMap);
   }
@@ -130,12 +138,15 @@ public class Order implements 
org.apache.thrift.TBase<Order, Order._Fields>, jav
 
   public Order(
     String col,
-    int order)
+    int order,
+    int nullOrder)
   {
     this();
     this.col = col;
     this.order = order;
     setOrderIsSet(true);
+    this.nullOrder = nullOrder;
+    setNullOrderIsSet(true);
   }
 
   /**
@@ -147,6 +158,7 @@ public class Order implements 
org.apache.thrift.TBase<Order, Order._Fields>, jav
       this.col = other.col;
     }
     this.order = other.order;
+    this.nullOrder = other.nullOrder;
   }
 
   public Order deepCopy() {
@@ -158,6 +170,8 @@ public class Order implements 
org.apache.thrift.TBase<Order, Order._Fields>, jav
     this.col = null;
     setOrderIsSet(false);
     this.order = 0;
+    setNullOrderIsSet(false);
+    this.nullOrder = 0;
   }
 
   public String getCol() {
@@ -205,6 +219,28 @@ public class Order implements 
org.apache.thrift.TBase<Order, Order._Fields>, jav
     __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, 
__ORDER_ISSET_ID, value);
   }
 
+  public int getNullOrder() {
+    return this.nullOrder;
+  }
+
+  public void setNullOrder(int nullOrder) {
+    this.nullOrder = nullOrder;
+    setNullOrderIsSet(true);
+  }
+
+  public void unsetNullOrder() {
+    __isset_bitfield = EncodingUtils.clearBit(__isset_bitfield, 
__NULLORDER_ISSET_ID);
+  }
+
+  /** Returns true if field nullOrder is set (has been assigned a value) and 
false otherwise */
+  public boolean isSetNullOrder() {
+    return EncodingUtils.testBit(__isset_bitfield, __NULLORDER_ISSET_ID);
+  }
+
+  public void setNullOrderIsSet(boolean value) {
+    __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, 
__NULLORDER_ISSET_ID, value);
+  }
+
   public void setFieldValue(_Fields field, Object value) {
     switch (field) {
     case COL:
@@ -223,6 +259,14 @@ public class Order implements 
org.apache.thrift.TBase<Order, Order._Fields>, jav
       }
       break;
 
+    case NULL_ORDER:
+      if (value == null) {
+        unsetNullOrder();
+      } else {
+        setNullOrder((Integer)value);
+      }
+      break;
+
     }
   }
 
@@ -234,6 +278,9 @@ public class Order implements 
org.apache.thrift.TBase<Order, Order._Fields>, jav
     case ORDER:
       return getOrder();
 
+    case NULL_ORDER:
+      return getNullOrder();
+
     }
     throw new IllegalStateException();
   }
@@ -249,6 +296,8 @@ public class Order implements 
org.apache.thrift.TBase<Order, Order._Fields>, jav
       return isSetCol();
     case ORDER:
       return isSetOrder();
+    case NULL_ORDER:
+      return isSetNullOrder();
     }
     throw new IllegalStateException();
   }
@@ -284,6 +333,15 @@ public class Order implements 
org.apache.thrift.TBase<Order, Order._Fields>, jav
         return false;
     }
 
+    boolean this_present_nullOrder = true;
+    boolean that_present_nullOrder = true;
+    if (this_present_nullOrder || that_present_nullOrder) {
+      if (!(this_present_nullOrder && that_present_nullOrder))
+        return false;
+      if (this.nullOrder != that.nullOrder)
+        return false;
+    }
+
     return true;
   }
 
@@ -301,6 +359,11 @@ public class Order implements 
org.apache.thrift.TBase<Order, Order._Fields>, jav
     if (present_order)
       list.add(order);
 
+    boolean present_nullOrder = true;
+    list.add(present_nullOrder);
+    if (present_nullOrder)
+      list.add(nullOrder);
+
     return list.hashCode();
   }
 
@@ -332,6 +395,16 @@ public class Order implements 
org.apache.thrift.TBase<Order, Order._Fields>, jav
         return lastComparison;
       }
     }
+    lastComparison = 
Boolean.valueOf(isSetNullOrder()).compareTo(other.isSetNullOrder());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetNullOrder()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.nullOrder, 
other.nullOrder);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
     return 0;
   }
 
@@ -363,6 +436,10 @@ public class Order implements 
org.apache.thrift.TBase<Order, Order._Fields>, jav
     sb.append("order:");
     sb.append(this.order);
     first = false;
+    if (!first) sb.append(", ");
+    sb.append("nullOrder:");
+    sb.append(this.nullOrder);
+    first = false;
     sb.append(")");
     return sb.toString();
   }
@@ -424,6 +501,14 @@ public class Order implements 
org.apache.thrift.TBase<Order, Order._Fields>, jav
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, 
schemeField.type);
             }
             break;
+          case 3: // NULL_ORDER
+            if (schemeField.type == org.apache.thrift.protocol.TType.I32) {
+              struct.nullOrder = iprot.readI32();
+              struct.setNullOrderIsSet(true);
+            } else { 
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, 
schemeField.type);
+            }
+            break;
           default:
             org.apache.thrift.protocol.TProtocolUtil.skip(iprot, 
schemeField.type);
         }
@@ -445,6 +530,9 @@ public class Order implements 
org.apache.thrift.TBase<Order, Order._Fields>, jav
       oprot.writeFieldBegin(ORDER_FIELD_DESC);
       oprot.writeI32(struct.order);
       oprot.writeFieldEnd();
+      oprot.writeFieldBegin(NULL_ORDER_FIELD_DESC);
+      oprot.writeI32(struct.nullOrder);
+      oprot.writeFieldEnd();
       oprot.writeFieldStop();
       oprot.writeStructEnd();
     }
@@ -469,19 +557,25 @@ public class Order implements 
org.apache.thrift.TBase<Order, Order._Fields>, jav
       if (struct.isSetOrder()) {
         optionals.set(1);
       }
-      oprot.writeBitSet(optionals, 2);
+      if (struct.isSetNullOrder()) {
+        optionals.set(2);
+      }
+      oprot.writeBitSet(optionals, 3);
       if (struct.isSetCol()) {
         oprot.writeString(struct.col);
       }
       if (struct.isSetOrder()) {
         oprot.writeI32(struct.order);
       }
+      if (struct.isSetNullOrder()) {
+        oprot.writeI32(struct.nullOrder);
+      }
     }
 
     @Override
     public void read(org.apache.thrift.protocol.TProtocol prot, Order struct) 
throws org.apache.thrift.TException {
       TTupleProtocol iprot = (TTupleProtocol) prot;
-      BitSet incoming = iprot.readBitSet(2);
+      BitSet incoming = iprot.readBitSet(3);
       if (incoming.get(0)) {
         struct.col = iprot.readString();
         struct.setColIsSet(true);
@@ -490,6 +584,10 @@ public class Order implements 
org.apache.thrift.TBase<Order, Order._Fields>, jav
         struct.order = iprot.readI32();
         struct.setOrderIsSet(true);
       }
+      if (incoming.get(2)) {
+        struct.nullOrder = iprot.readI32();
+        struct.setNullOrderIsSet(true);
+      }
     }
   }
 

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/metastore/src/gen/thrift/gen-php/metastore/Types.php
----------------------------------------------------------------------
diff --git a/metastore/src/gen/thrift/gen-php/metastore/Types.php 
b/metastore/src/gen/thrift/gen-php/metastore/Types.php
index 488a920..4da4707 100644
--- a/metastore/src/gen/thrift/gen-php/metastore/Types.php
+++ b/metastore/src/gen/thrift/gen-php/metastore/Types.php
@@ -3076,6 +3076,10 @@ class Order {
    * @var int
    */
   public $order = null;
+  /**
+   * @var int
+   */
+  public $nullOrder = null;
 
   public function __construct($vals=null) {
     if (!isset(self::$_TSPEC)) {
@@ -3088,6 +3092,10 @@ class Order {
           'var' => 'order',
           'type' => TType::I32,
           ),
+        3 => array(
+          'var' => 'nullOrder',
+          'type' => TType::I32,
+          ),
         );
     }
     if (is_array($vals)) {
@@ -3097,6 +3105,9 @@ class Order {
       if (isset($vals['order'])) {
         $this->order = $vals['order'];
       }
+      if (isset($vals['nullOrder'])) {
+        $this->nullOrder = $vals['nullOrder'];
+      }
     }
   }
 
@@ -3133,6 +3144,13 @@ class Order {
             $xfer += $input->skip($ftype);
           }
           break;
+        case 3:
+          if ($ftype == TType::I32) {
+            $xfer += $input->readI32($this->nullOrder);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
         default:
           $xfer += $input->skip($ftype);
           break;
@@ -3156,6 +3174,11 @@ class Order {
       $xfer += $output->writeI32($this->order);
       $xfer += $output->writeFieldEnd();
     }
+    if ($this->nullOrder !== null) {
+      $xfer += $output->writeFieldBegin('nullOrder', TType::I32, 3);
+      $xfer += $output->writeI32($this->nullOrder);
+      $xfer += $output->writeFieldEnd();
+    }
     $xfer += $output->writeFieldStop();
     $xfer += $output->writeStructEnd();
     return $xfer;

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/metastore/src/gen/thrift/gen-py/hive_metastore/ttypes.py
----------------------------------------------------------------------
diff --git a/metastore/src/gen/thrift/gen-py/hive_metastore/ttypes.py 
b/metastore/src/gen/thrift/gen-py/hive_metastore/ttypes.py
index 10eaf4a..4b20da9 100644
--- a/metastore/src/gen/thrift/gen-py/hive_metastore/ttypes.py
+++ b/metastore/src/gen/thrift/gen-py/hive_metastore/ttypes.py
@@ -2237,17 +2237,20 @@ class Order:
   Attributes:
    - col
    - order
+   - nullOrder
   """
 
   thrift_spec = (
     None, # 0
     (1, TType.STRING, 'col', None, None, ), # 1
     (2, TType.I32, 'order', None, None, ), # 2
+    (3, TType.I32, 'nullOrder', None, None, ), # 3
   )
 
-  def __init__(self, col=None, order=None,):
+  def __init__(self, col=None, order=None, nullOrder=None,):
     self.col = col
     self.order = order
+    self.nullOrder = nullOrder
 
   def read(self, iprot):
     if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and 
isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is 
not None and fastbinary is not None:
@@ -2268,6 +2271,11 @@ class Order:
           self.order = iprot.readI32()
         else:
           iprot.skip(ftype)
+      elif fid == 3:
+        if ftype == TType.I32:
+          self.nullOrder = iprot.readI32()
+        else:
+          iprot.skip(ftype)
       else:
         iprot.skip(ftype)
       iprot.readFieldEnd()
@@ -2286,6 +2294,10 @@ class Order:
       oprot.writeFieldBegin('order', TType.I32, 2)
       oprot.writeI32(self.order)
       oprot.writeFieldEnd()
+    if self.nullOrder is not None:
+      oprot.writeFieldBegin('nullOrder', TType.I32, 3)
+      oprot.writeI32(self.nullOrder)
+      oprot.writeFieldEnd()
     oprot.writeFieldStop()
     oprot.writeStructEnd()
 
@@ -2297,6 +2309,7 @@ class Order:
     value = 17
     value = (value * 31) ^ hash(self.col)
     value = (value * 31) ^ hash(self.order)
+    value = (value * 31) ^ hash(self.nullOrder)
     return value
 
   def __repr__(self):

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/metastore/src/gen/thrift/gen-rb/hive_metastore_types.rb
----------------------------------------------------------------------
diff --git a/metastore/src/gen/thrift/gen-rb/hive_metastore_types.rb 
b/metastore/src/gen/thrift/gen-rb/hive_metastore_types.rb
index 1cf40ae..556c380 100644
--- a/metastore/src/gen/thrift/gen-rb/hive_metastore_types.rb
+++ b/metastore/src/gen/thrift/gen-rb/hive_metastore_types.rb
@@ -557,10 +557,12 @@ class Order
   include ::Thrift::Struct, ::Thrift::Struct_Union
   COL = 1
   ORDER = 2
+  NULLORDER = 3
 
   FIELDS = {
     COL => {:type => ::Thrift::Types::STRING, :name => 'col'},
-    ORDER => {:type => ::Thrift::Types::I32, :name => 'order'}
+    ORDER => {:type => ::Thrift::Types::I32, :name => 'order'},
+    NULLORDER => {:type => ::Thrift::Types::I32, :name => 'nullOrder'}
   }
 
   def struct_fields; FIELDS; end

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreDirectSql.java
----------------------------------------------------------------------
diff --git 
a/metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreDirectSql.java 
b/metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreDirectSql.java
index 6da295e..3b31ee1 100644
--- 
a/metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreDirectSql.java
+++ 
b/metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreDirectSql.java
@@ -672,14 +672,16 @@ class MetaStoreDirectSql {
       t.setParameters(MetaStoreUtils.trimMapNulls(t.getParameters(), 
convertMapNullsToEmptyStrings));
     }
 
-    queryText = "select \"SD_ID\", \"COLUMN_NAME\", \"SORT_COLS\".\"ORDER\" 
from \"SORT_COLS\""
+    queryText = "select \"SD_ID\", \"COLUMN_NAME\", \"SORT_COLS\".\"ORDER\", 
\"SORT_COLS\".\"NULL_ORDER\""
+        + " from \"SORT_COLS\""
         + " where \"SD_ID\" in (" + sdIds + ") and \"INTEGER_IDX\" >= 0"
         + " order by \"SD_ID\" asc, \"INTEGER_IDX\" asc";
     loopJoinOrderedResult(sds, queryText, 0, new 
ApplyFunc<StorageDescriptor>() {
       @Override
       public void apply(StorageDescriptor t, Object[] fields) {
         if (fields[2] == null) return;
-        t.addToSortCols(new Order((String)fields[1], 
extractSqlInt(fields[2])));
+        assert fields[3] != null;
+        t.addToSortCols(new Order((String)fields[1], extractSqlInt(fields[2]), 
extractSqlInt(fields[3])));
       }});
 
     queryText = "select \"SD_ID\", \"BUCKET_COL_NAME\" from \"BUCKETING_COLS\""

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/metastore/src/java/org/apache/hadoop/hive/metastore/ObjectStore.java
----------------------------------------------------------------------
diff --git 
a/metastore/src/java/org/apache/hadoop/hive/metastore/ObjectStore.java 
b/metastore/src/java/org/apache/hadoop/hive/metastore/ObjectStore.java
index d4852b0..1d04ef2 100644
--- a/metastore/src/java/org/apache/hadoop/hive/metastore/ObjectStore.java
+++ b/metastore/src/java/org/apache/hadoop/hive/metastore/ObjectStore.java
@@ -1367,7 +1367,8 @@ public class ObjectStore implements RawStore, 
Configurable {
     if (keys != null) {
       mkeys = new ArrayList<MOrder>(keys.size());
       for (Order part : keys) {
-        mkeys.add(new 
MOrder(HiveStringUtils.normalizeIdentifier(part.getCol()), part.getOrder()));
+        mkeys.add(new 
MOrder(HiveStringUtils.normalizeIdentifier(part.getCol()), part.getOrder(),
+                part.getNullOrder()));
       }
     }
     return mkeys;
@@ -1378,7 +1379,7 @@ public class ObjectStore implements RawStore, 
Configurable {
     if (mkeys != null) {
       keys = new ArrayList<Order>(mkeys.size());
       for (MOrder part : mkeys) {
-        keys.add(new Order(part.getCol(), part.getOrder()));
+        keys.add(new Order(part.getCol(), part.getOrder(), 
part.getNullOrder()));
       }
     }
     return keys;

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/metastore/src/java/org/apache/hadoop/hive/metastore/hbase/HBaseUtils.java
----------------------------------------------------------------------
diff --git 
a/metastore/src/java/org/apache/hadoop/hive/metastore/hbase/HBaseUtils.java 
b/metastore/src/java/org/apache/hadoop/hive/metastore/hbase/HBaseUtils.java
index d6d01bd..a16997b 100644
--- a/metastore/src/java/org/apache/hadoop/hive/metastore/hbase/HBaseUtils.java
+++ b/metastore/src/java/org/apache/hadoop/hive/metastore/hbase/HBaseUtils.java
@@ -707,7 +707,7 @@ class HBaseUtils {
     sd.setBucketCols(new ArrayList<>(proto.getBucketColsList()));
     List<Order> sortCols = new ArrayList<>();
     for (HbaseMetastoreProto.StorageDescriptor.Order protoOrder : 
proto.getSortColsList()) {
-      sortCols.add(new Order(protoOrder.getColumnName(), 
protoOrder.getOrder()));
+      sortCols.add(new Order(protoOrder.getColumnName(), 
protoOrder.getOrder(), protoOrder.getNullOrder()));
     }
     sd.setSortCols(sortCols);
     if (proto.hasSkewedInfo()) {

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/metastore/src/model/org/apache/hadoop/hive/metastore/model/MOrder.java
----------------------------------------------------------------------
diff --git 
a/metastore/src/model/org/apache/hadoop/hive/metastore/model/MOrder.java 
b/metastore/src/model/org/apache/hadoop/hive/metastore/model/MOrder.java
index 1fa82a4..5370c02 100644
--- a/metastore/src/model/org/apache/hadoop/hive/metastore/model/MOrder.java
+++ b/metastore/src/model/org/apache/hadoop/hive/metastore/model/MOrder.java
@@ -21,14 +21,16 @@ package org.apache.hadoop.hive.metastore.model;
 public class MOrder {
   private String col;
   private int order;
-  
+  private int nullOrder;
+
   /**
    * @param col
    * @param order
    */
-  public MOrder(String col, int order) {
+  public MOrder(String col, int order, int nullOrder) {
     this.col = col;
     this.order = order;
+    this.nullOrder = nullOrder;
   }
 
   /**
@@ -58,5 +60,19 @@ public class MOrder {
   public void setOrder(int order) {
     this.order = order;
   }
-  
+
+  /**
+   * @return the null order
+   */
+  public int getNullOrder() {
+    return nullOrder;
+  }
+
+  /**
+   * @param nullOrder the null order to set
+   */
+  public void setNullOrder(int nullOrder) {
+    this.nullOrder = nullOrder;
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/metastore/src/protobuf/org/apache/hadoop/hive/metastore/hbase/hbase_metastore_proto.proto
----------------------------------------------------------------------
diff --git 
a/metastore/src/protobuf/org/apache/hadoop/hive/metastore/hbase/hbase_metastore_proto.proto
 
b/metastore/src/protobuf/org/apache/hadoop/hive/metastore/hbase/hbase_metastore_proto.proto
index 466fdf9..552097b 100644
--- 
a/metastore/src/protobuf/org/apache/hadoop/hive/metastore/hbase/hbase_metastore_proto.proto
+++ 
b/metastore/src/protobuf/org/apache/hadoop/hive/metastore/hbase/hbase_metastore_proto.proto
@@ -205,6 +205,7 @@ message StorageDescriptor {
   message Order {
     required string column_name = 1;
     optional sint32 order = 2 [default = 1];
+    optional sint32 nullOrder = 3 [default = 0];
   }
 
   message SerDeInfo {

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/metastore/src/test/org/apache/hadoop/hive/metastore/hbase/TestHBaseStore.java
----------------------------------------------------------------------
diff --git 
a/metastore/src/test/org/apache/hadoop/hive/metastore/hbase/TestHBaseStore.java 
b/metastore/src/test/org/apache/hadoop/hive/metastore/hbase/TestHBaseStore.java
index 29d5a64..d938a03 100644
--- 
a/metastore/src/test/org/apache/hadoop/hive/metastore/hbase/TestHBaseStore.java
+++ 
b/metastore/src/test/org/apache/hadoop/hive/metastore/hbase/TestHBaseStore.java
@@ -18,8 +18,16 @@
  */
 package org.apache.hadoop.hive.metastore.hbase;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import java.io.IOException;
+import java.security.MessageDigest;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.SortedMap;
+import java.util.TreeMap;
+
 import org.apache.hadoop.hbase.Cell;
 import org.apache.hadoop.hbase.client.HTableInterface;
 import org.apache.hadoop.hive.conf.HiveConf;
@@ -58,16 +66,8 @@ import org.junit.Test;
 import org.junit.rules.ExpectedException;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-
-import java.io.IOException;
-import java.security.MessageDigest;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.SortedMap;
-import java.util.TreeMap;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  *
@@ -402,7 +402,7 @@ public class TestHBaseStore {
     Map<String, String> params = new HashMap<String, String>();
     params.put("key", "value");
     StorageDescriptor sd = new StorageDescriptor(cols, "file:/tmp", "input", 
"output", false, 17,
-        serde, Arrays.asList("bucketcol"), Arrays.asList(new Order("sortcol", 
1)), params);
+        serde, Arrays.asList("bucketcol"), Arrays.asList(new Order("sortcol", 
1, 0)), params);
     Table table = new Table(tableName, "default", "me", startTime, startTime, 
0, sd, null,
         emptyParameters, null, null, null);
     store.createTable(table);
@@ -424,6 +424,7 @@ public class TestHBaseStore {
     Assert.assertEquals(1, t.getSd().getSortColsSize());
     Assert.assertEquals("sortcol", t.getSd().getSortCols().get(0).getCol());
     Assert.assertEquals(1, t.getSd().getSortCols().get(0).getOrder());
+    Assert.assertEquals(0, t.getSd().getSortCols().get(0).getNullOrder());
     Assert.assertEquals(1, t.getSd().getParametersSize());
     Assert.assertEquals("value", t.getSd().getParameters().get("key"));
     Assert.assertEquals("me", t.getOwner());
@@ -1273,7 +1274,7 @@ public class TestHBaseStore {
     Map<String, String> params = new HashMap<String, String>();
     params.put("key", "value");
     StorageDescriptor sd = new StorageDescriptor(cols, "file:/tmp", "input", 
"output", false, 17,
-        serde, Arrays.asList("bucketcol"), Arrays.asList(new Order("sortcol", 
1)), params);
+        serde, Arrays.asList("bucketcol"), Arrays.asList(new Order("sortcol", 
1, 0)), params);
     int currentTime = (int)(System.currentTimeMillis() / 1000);
     Table table = new Table(TBL, DB, "me", currentTime, currentTime, 0, sd, 
cols,
         emptyParameters, null, null, null);
@@ -1291,7 +1292,7 @@ public class TestHBaseStore {
     Map<String, String> params = new HashMap<String, String>();
     params.put("key", "value");
     StorageDescriptor sd = new StorageDescriptor(cols, "file:/tmp", "input", 
"output", false, 17,
-        serde, Arrays.asList("bucketcol"), Arrays.asList(new Order("sortcol", 
1)), params);
+        serde, Arrays.asList("bucketcol"), Arrays.asList(new Order("sortcol", 
1, 0)), params);
     int currentTime = (int)(System.currentTimeMillis() / 1000);
     Table table = new Table(TBL, DB, "me", currentTime, currentTime, 0, sd, 
cols,
         emptyParameters, null, null, null);

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/metastore/src/test/org/apache/hadoop/hive/metastore/hbase/TestHBaseStoreBitVector.java
----------------------------------------------------------------------
diff --git 
a/metastore/src/test/org/apache/hadoop/hive/metastore/hbase/TestHBaseStoreBitVector.java
 
b/metastore/src/test/org/apache/hadoop/hive/metastore/hbase/TestHBaseStoreBitVector.java
index b0d7662..570d023 100644
--- 
a/metastore/src/test/org/apache/hadoop/hive/metastore/hbase/TestHBaseStoreBitVector.java
+++ 
b/metastore/src/test/org/apache/hadoop/hive/metastore/hbase/TestHBaseStoreBitVector.java
@@ -18,34 +18,30 @@
  */
 package org.apache.hadoop.hive.metastore.hbase;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.SortedMap;
+import java.util.TreeMap;
+
 import org.apache.hadoop.hbase.Cell;
 import org.apache.hadoop.hbase.client.HTableInterface;
 import org.apache.hadoop.hive.conf.HiveConf;
-import org.apache.hadoop.hive.metastore.api.BinaryColumnStatsData;
-import org.apache.hadoop.hive.metastore.api.BooleanColumnStatsData;
 import org.apache.hadoop.hive.metastore.api.ColumnStatistics;
 import org.apache.hadoop.hive.metastore.api.ColumnStatisticsData;
 import org.apache.hadoop.hive.metastore.api.ColumnStatisticsDesc;
 import org.apache.hadoop.hive.metastore.api.ColumnStatisticsObj;
-import org.apache.hadoop.hive.metastore.api.Database;
 import org.apache.hadoop.hive.metastore.api.Decimal;
 import org.apache.hadoop.hive.metastore.api.DecimalColumnStatsData;
 import org.apache.hadoop.hive.metastore.api.DoubleColumnStatsData;
 import org.apache.hadoop.hive.metastore.api.FieldSchema;
-import org.apache.hadoop.hive.metastore.api.Function;
-import org.apache.hadoop.hive.metastore.api.FunctionType;
 import org.apache.hadoop.hive.metastore.api.LongColumnStatsData;
-import org.apache.hadoop.hive.metastore.api.NoSuchObjectException;
 import org.apache.hadoop.hive.metastore.api.Order;
 import org.apache.hadoop.hive.metastore.api.Partition;
-import org.apache.hadoop.hive.metastore.api.PrincipalType;
-import org.apache.hadoop.hive.metastore.api.ResourceType;
-import org.apache.hadoop.hive.metastore.api.ResourceUri;
-import org.apache.hadoop.hive.metastore.api.Role;
 import org.apache.hadoop.hive.metastore.api.SerDeInfo;
-import org.apache.hadoop.hive.metastore.api.SkewedInfo;
 import org.apache.hadoop.hive.metastore.api.StorageDescriptor;
 import org.apache.hadoop.hive.metastore.api.StringColumnStatsData;
 import org.apache.hadoop.hive.metastore.api.Table;
@@ -58,16 +54,8 @@ import org.junit.Test;
 import org.junit.rules.ExpectedException;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-
-import java.io.IOException;
-import java.security.MessageDigest;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.SortedMap;
-import java.util.TreeMap;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  *
@@ -595,7 +583,7 @@ public class TestHBaseStoreBitVector {
     Map<String, String> params = new HashMap<String, String>();
     params.put("key", "value");
     StorageDescriptor sd = new StorageDescriptor(cols, "file:/tmp", "input", 
"output", false, 17,
-        serde, Arrays.asList("bucketcol"), Arrays.asList(new Order("sortcol", 
1)), params);
+        serde, Arrays.asList("bucketcol"), Arrays.asList(new Order("sortcol", 
1, 0)), params);
     int currentTime = (int)(System.currentTimeMillis() / 1000);
     Table table = new Table(TBL, DB, "me", currentTime, currentTime, 0, sd, 
cols,
         emptyParameters, null, null, null);

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/metastore/src/test/org/apache/hadoop/hive/metastore/hbase/TestSharedStorageDescriptor.java
----------------------------------------------------------------------
diff --git 
a/metastore/src/test/org/apache/hadoop/hive/metastore/hbase/TestSharedStorageDescriptor.java
 
b/metastore/src/test/org/apache/hadoop/hive/metastore/hbase/TestSharedStorageDescriptor.java
index e0d8ce4..8e856a1 100644
--- 
a/metastore/src/test/org/apache/hadoop/hive/metastore/hbase/TestSharedStorageDescriptor.java
+++ 
b/metastore/src/test/org/apache/hadoop/hive/metastore/hbase/TestSharedStorageDescriptor.java
@@ -18,8 +18,9 @@
  */
 package org.apache.hadoop.hive.metastore.hbase;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import java.util.Iterator;
+import java.util.List;
+
 import org.apache.hadoop.hive.metastore.api.FieldSchema;
 import org.apache.hadoop.hive.metastore.api.Order;
 import org.apache.hadoop.hive.metastore.api.SerDeInfo;
@@ -27,10 +28,8 @@ import org.apache.hadoop.hive.metastore.api.SkewedInfo;
 import org.apache.hadoop.hive.metastore.api.StorageDescriptor;
 import org.junit.Assert;
 import org.junit.Test;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 
 /**
@@ -80,19 +79,22 @@ public class TestSharedStorageDescriptor {
   @Test
   public void changeOrder() {
     StorageDescriptor sd = new StorageDescriptor();
-    sd.addToSortCols(new Order("fred", 1));
+    sd.addToSortCols(new Order("fred", 1, 0));
     SharedStorageDescriptor ssd = new SharedStorageDescriptor();
     ssd.setShared(sd);
     ssd.getSortCols().get(0).setOrder(2);
+    ssd.getSortCols().get(0).setNullOrder(3);
     Assert.assertFalse(sd.getSortCols() == ssd.getSortCols());
     Assert.assertEquals(2, ssd.getSortCols().get(0).getOrder());
     Assert.assertEquals(1, sd.getSortCols().get(0).getOrder());
+    Assert.assertEquals(3, ssd.getSortCols().get(0).getNullOrder());
+    Assert.assertEquals(0, sd.getSortCols().get(0).getNullOrder());
   }
 
   @Test
   public void unsetOrder() {
     StorageDescriptor sd = new StorageDescriptor();
-    sd.addToSortCols(new Order("fred", 1));
+    sd.addToSortCols(new Order("fred", 1, 0));
     SharedStorageDescriptor ssd = new SharedStorageDescriptor();
     ssd.setShared(sd);
     ssd.unsetSortCols();

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java 
b/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java
index c51cfd6..70afe16 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java
@@ -2140,6 +2140,11 @@ public class DDLTask extends Task<DDLWork> implements 
Serializable {
             else if (sortCol.getOrder() == 
BaseSemanticAnalyzer.HIVE_COLUMN_ORDER_DESC) {
               sortKeyDesc = sortKeyDesc + "DESC";
             }
+            if (sortCol.getNullOrder() == 
BaseSemanticAnalyzer.HIVE_COLUMN_NULLS_FIRST) {
+              sortKeyDesc = sortKeyDesc + " NULLS FIRST";
+            } else if (sortCol.getNullOrder() == 
BaseSemanticAnalyzer.HIVE_COLUMN_NULLS_LAST) {
+              sortKeyDesc = sortKeyDesc + " NULLS LAST";
+            }
             sortKeys.add(sortKeyDesc);
           }
           tbl_sort_bucket += StringUtils.join(sortKeys, ", \n");

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/ql/src/java/org/apache/hadoop/hive/ql/exec/MapJoinOperator.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/MapJoinOperator.java 
b/ql/src/java/org/apache/hadoop/hive/ql/exec/MapJoinOperator.java
index 4d2447b..e79fccd 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/exec/MapJoinOperator.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/MapJoinOperator.java
@@ -653,6 +653,8 @@ public class MapJoinOperator extends 
AbstractMapJoinOperator<MapJoinDesc> implem
     spilledMapJoinTables[pos] = new 
MapJoinBytesTableContainer(restoredHashMap);
     
spilledMapJoinTables[pos].setInternalValueOi(container.getInternalValueOi());
     
spilledMapJoinTables[pos].setSortableSortOrders(container.getSortableSortOrders());
+    spilledMapJoinTables[pos].setNullMarkers(container.getNullMarkers());
+    spilledMapJoinTables[pos].setNotNullMarkers(container.getNotNullMarkers());
   }
 
   /**

Reply via email to