Files
impala/testdata/workloads/functional-query/queries/QueryTest/set.test
Philip Zeyliger 387bde0639 IMPALA-5589: change "set" in impala-shell to show empty string for unset query options
When converting TQueryOptions to a map<string,string>, we now convert
unset options to the empty string. Within TQueryOptions we have optional
options (like mt_dop or compression_codec) with no default specified. In
this case, the user was seeing 0 for numeric types and the first enum
option for enumeration types (e.g., "NONE" in the compression case).
This was confusing as the implementation handles this "null" case
differently (e.g., using SNAPPY as the default codec in the case
reported in the JIRA).

When running "set" in impala-shell, the difference is as
follows:

    -        BUFFER_POOL_LIMIT: [0]
    +        BUFFER_POOL_LIMIT: []
    -        COMPRESSION_CODEC: [NONE]
    +        COMPRESSION_CODEC: []
    -        MT_DOP: [0]
    +        MT_DOP: []
    -        RESERVATION_REQUEST_TIMEOUT: [0]
    +        RESERVATION_REQUEST_TIMEOUT: []
    -        SEQ_COMPRESSION_MODE: [0]
    +        SEQ_COMPRESSION_MODE: []
    -        V_CPU_CORES: [0]
    +        V_CPU_CORES: []

Obviously, the empty string is a valid value for a string-typed option, where
it will be impossible to tell the difference between "unset" and "set to empty
string." Today, there are two string-typed options: debug_string defaults to ""
and request_pool has no default. An alternative would have been to use
a special token like "_unset" or to introduce a new field in the beeswax
Thrift ConfigVariable struct. I think the empty string approach
is clearest.

The other users of this state, which I believe are HiveServer2's OpenSession()
call and HiveServer2's response to a "SET" query are affected. They
benefit from the same fix, and a new test has been added to test_hs2.py.

I did a mild refactoring in the HS2 tests to write a helper method
for the very common pattern of excecuting a query.

Testing:
* Manual testing with impala-shell
* Modified impala-shell tests to check this explicitly for one case.
* Modified HS2 test to check this as well as the SET k=v statement,
  which looked otherwise untested.

Change-Id: I86bc06a58d67b099da911293202dae9e844c439b
Reviewed-on: http://gerrit.cloudera.org:8080/7886
Reviewed-by: Matthew Jacobs <mj@cloudera.com>
Tested-by: Impala Public Jenkins
2017-09-06 19:43:57 +00:00

294 lines
6.6 KiB
Plaintext

====
---- QUERY
set
---- RESULTS: VERIFY_IS_SUBSET
'ABORT_ON_DEFAULT_LIMIT_EXCEEDED','0'
'ABORT_ON_ERROR','0'
'ALLOW_UNSUPPORTED_FORMATS','0'
'BATCH_SIZE','0'
'DEBUG_ACTION',''
'DEFAULT_ORDER_BY_LIMIT','-1'
'DISABLE_CACHED_READS','0'
'DISABLE_CODEGEN','0'
'DISABLE_OUTERMOST_TOPN','0'
'EXPLAIN_LEVEL','1'
'HBASE_CACHE_BLOCKS','0'
'HBASE_CACHING','0'
'MAX_ERRORS','100'
'MAX_IO_BUFFERS','0'
'MAX_SCAN_RANGE_LENGTH','0'
'MEM_LIMIT','0'
'NUM_NODES','0'
'NUM_SCANNER_THREADS','0'
'COMPRESSION_CODEC',''
'PARQUET_FILE_SIZE','0'
'REQUEST_POOL',''
'RESERVATION_REQUEST_TIMEOUT',''
'RM_INITIAL_MEM','0'
'SYNC_DDL','0'
'V_CPU_CORES',''
---- TYPES
STRING, STRING
====
---- QUERY
set explain_level=3;
set;
---- RESULTS: VERIFY_IS_SUBSET
'ABORT_ON_DEFAULT_LIMIT_EXCEEDED','0'
'ABORT_ON_ERROR','0'
'ALLOW_UNSUPPORTED_FORMATS','0'
'BATCH_SIZE','0'
'DEBUG_ACTION',''
'DEFAULT_ORDER_BY_LIMIT','-1'
'DISABLE_CACHED_READS','0'
'DISABLE_CODEGEN','0'
'DISABLE_OUTERMOST_TOPN','0'
'EXPLAIN_LEVEL','3'
'HBASE_CACHE_BLOCKS','0'
'HBASE_CACHING','0'
'MAX_ERRORS','100'
'MAX_IO_BUFFERS','0'
'MAX_SCAN_RANGE_LENGTH','0'
'MEM_LIMIT','0'
'NUM_NODES','0'
'NUM_SCANNER_THREADS','0'
'COMPRESSION_CODEC',''
'PARQUET_FILE_SIZE','0'
'REQUEST_POOL',''
'RESERVATION_REQUEST_TIMEOUT',''
'RM_INITIAL_MEM','0'
'SYNC_DDL','0'
'V_CPU_CORES',''
---- TYPES
STRING, STRING
====
---- QUERY
set explain_level='0';
set;
---- RESULTS: VERIFY_IS_SUBSET
'ABORT_ON_DEFAULT_LIMIT_EXCEEDED','0'
'ABORT_ON_ERROR','0'
'ALLOW_UNSUPPORTED_FORMATS','0'
'BATCH_SIZE','0'
'DEBUG_ACTION',''
'DEFAULT_ORDER_BY_LIMIT','-1'
'DISABLE_CACHED_READS','0'
'DISABLE_CODEGEN','0'
'DISABLE_OUTERMOST_TOPN','0'
'EXPLAIN_LEVEL','0'
'HBASE_CACHE_BLOCKS','0'
'HBASE_CACHING','0'
'MAX_ERRORS','100'
'MAX_IO_BUFFERS','0'
'MAX_SCAN_RANGE_LENGTH','0'
'MEM_LIMIT','0'
'NUM_NODES','0'
'NUM_SCANNER_THREADS','0'
'COMPRESSION_CODEC',''
'PARQUET_FILE_SIZE','0'
'REQUEST_POOL',''
'RESERVATION_REQUEST_TIMEOUT',''
'RM_INITIAL_MEM','0'
'SYNC_DDL','0'
'V_CPU_CORES',''
---- TYPES
STRING, STRING
====
---- QUERY
# IMPALA-1906: Test that SET changes PARQUET_FILE_SIZE only if it's less than 2GB.
set parquet_file_size='1.5g';
set;
---- RESULTS: VERIFY_IS_SUBSET
'ABORT_ON_DEFAULT_LIMIT_EXCEEDED','0'
'ABORT_ON_ERROR','0'
'ALLOW_UNSUPPORTED_FORMATS','0'
'BATCH_SIZE','0'
'DEBUG_ACTION',''
'DEFAULT_ORDER_BY_LIMIT','-1'
'DISABLE_CACHED_READS','0'
'DISABLE_CODEGEN','0'
'DISABLE_OUTERMOST_TOPN','0'
'EXPLAIN_LEVEL','1'
'HBASE_CACHE_BLOCKS','0'
'HBASE_CACHING','0'
'MAX_ERRORS','100'
'MAX_IO_BUFFERS','0'
'MAX_SCAN_RANGE_LENGTH','0'
'MEM_LIMIT','0'
'NUM_NODES','0'
'NUM_SCANNER_THREADS','0'
'COMPRESSION_CODEC',''
'PARQUET_FILE_SIZE','1610612736'
'REQUEST_POOL',''
'RESERVATION_REQUEST_TIMEOUT',''
'RM_INITIAL_MEM','0'
'SYNC_DDL','0'
'V_CPU_CORES',''
---- TYPES
STRING, STRING
====
---- QUERY
set parquet_file_size='2g'
---- CATCH
The PARQUET_FILE_SIZE query option must be less than 2GB.
====
---- QUERY
set foo=bar
---- CATCH
Invalid query option: foo
====
---- QUERY
set parquet_compression_codec=bar
---- CATCH
Invalid compression codec: bar
====
---- QUERY
# Test that SET actually does change the mem_limit.
# First, show mem_limit is not hit.
select 1
---- RESULTS
1
====
---- QUERY
# Set mem_limit really small so that queries will fail.
set mem_limit=1;
select count(string_col) from functional.alltypestiny
---- CATCH
Memory limit exceeded
====
---- QUERY
# Set mem_limit back to unlimited and query should succeed again.
set mem_limit=0;
select count(string_col) from functional.alltypestiny
---- RESULTS
8
---- TYPES
BIGINT
====
---- QUERY
# IMPALA-3334: 'optimize_partition_key_scans' is a boolean query option
set explain_level=0;
set optimize_partition_key_scans=true;
explain select min(month), max(year), ndv(day) from functional.alltypesagg;
---- RESULTS: VERIFY_IS_SUBSET
'01:AGGREGATE [FINALIZE]'
'00:UNION'
' constant-operands=11'
====
---- QUERY
set explain_level=0;
set optimize_partition_key_scans=1;
explain select min(month), max(year), ndv(day) from functional.alltypesagg;
---- RESULTS: VERIFY_IS_SUBSET
'01:AGGREGATE [FINALIZE]'
'00:UNION'
' constant-operands=11'
====
---- QUERY
set explain_level=0;
set optimize_partition_key_scans=false;
explain select min(month), max(year), ndv(day) from functional.alltypesagg;
---- RESULTS: VERIFY_IS_SUBSET
'03:AGGREGATE [FINALIZE]'
'02:EXCHANGE [UNPARTITIONED]'
'01:AGGREGATE'
'00:SCAN HDFS [functional.alltypesagg]'
====
---- QUERY
set explain_level=0;
set optimize_partition_key_scans=0;
explain select min(month), max(year), ndv(day) from functional.alltypesagg;
---- RESULTS: VERIFY_IS_SUBSET
'03:AGGREGATE [FINALIZE]'
'02:EXCHANGE [UNPARTITIONED]'
'01:AGGREGATE'
'00:SCAN HDFS [functional.alltypesagg]'
====
---- QUERY
set explain_level=0;
set disable_streaming_preaggregations=false;
explain select count(distinct double_col) from functional.alltypesagg;
---- RESULTS: VERIFY_IS_SUBSET
'06:AGGREGATE [FINALIZE]'
'05:EXCHANGE [UNPARTITIONED]'
'02:AGGREGATE'
'04:AGGREGATE'
'03:EXCHANGE [HASH(double_col)]'
'01:AGGREGATE [STREAMING]'
'00:SCAN HDFS [functional.alltypesagg]'
====
---- QUERY
set explain_level=0;
set disable_streaming_preaggregations=0;
explain select count(distinct double_col) from functional.alltypesagg;
---- RESULTS: VERIFY_IS_SUBSET
'06:AGGREGATE [FINALIZE]'
'05:EXCHANGE [UNPARTITIONED]'
'02:AGGREGATE'
'04:AGGREGATE'
'03:EXCHANGE [HASH(double_col)]'
'01:AGGREGATE [STREAMING]'
'00:SCAN HDFS [functional.alltypesagg]'
====
---- QUERY
set explain_level=0;
set disable_streaming_preaggregations=true;
explain select count(distinct double_col) from functional.alltypesagg;
---- RESULTS: VERIFY_IS_SUBSET
'06:AGGREGATE [FINALIZE]'
'05:EXCHANGE [UNPARTITIONED]'
'02:AGGREGATE'
'04:AGGREGATE'
'03:EXCHANGE [HASH(double_col)]'
'01:AGGREGATE'
'00:SCAN HDFS [functional.alltypesagg]'
====
---- QUERY
set explain_level=0;
set disable_streaming_preaggregations=1;
explain select count(distinct double_col) from functional.alltypesagg;
---- RESULTS: VERIFY_IS_SUBSET
'06:AGGREGATE [FINALIZE]'
'05:EXCHANGE [UNPARTITIONED]'
'02:AGGREGATE'
'04:AGGREGATE'
'03:EXCHANGE [HASH(double_col)]'
'01:AGGREGATE'
'00:SCAN HDFS [functional.alltypesagg]'
====
---- QUERY
# IMPALA-5591: This shouldn't throw an error.
set scratch_limit=-1;
====
---- QUERY
# Power of two max_row_size.
set max_row_size=8m;
set;
---- RESULTS: VERIFY_IS_SUBSET
'MAX_ROW_SIZE','8388608'
---- TYPES
STRING,STRING
====
---- QUERY
# Non power of two max_row_size.
set max_row_size=12345;
set;
---- RESULTS: VERIFY_IS_SUBSET
'MAX_ROW_SIZE','12345'
---- TYPES
STRING,STRING
====
---- QUERY
set max_row_size=8m;
====
---- QUERY
set max_row_size=-1;
---- CATCH
Max row size must be a positive number of bytes: -1
====
---- QUERY
set max_row_size=0;
---- CATCH
Max row size must be a positive number of bytes: 0
====