# Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. from __future__ import absolute_import from tests.common.impala_test_suite import ImpalaTestSuite import pytest class TestQueryExecTimeLimit(ImpalaTestSuite): """Tests the exec_time_limit_s query option.""" @classmethod def get_workload(cls): return 'tpch' def test_exec_time_limit_enforced(self): """Test that queries exceeding exec_time_limit_s are properly cancelled.""" exec_options = dict() exec_options['exec_time_limit_s'] = "1" query = "SELECT COUNT(*) FROM tpch.lineitem L1, tpch.lineitem L2" try: self.execute_query(query, exec_options) assert False, "Query was expected to time out but succeeded." except Exception as e: assert "expired due to execution time limit" in str(e), ( "Unexpected exception: {}".format(e) ) @pytest.mark.execute_serially def test_exec_time_limit_long_plan(self): """Test that queries with a long planning time completing within exec_time_limit_s succeed. Run this test serially to avoid impact from other concurrent tests.""" exec_options = dict() exec_options['exec_time_limit_s'] = "2" # Set debug action to wait in the plan phase for 10s. exec_options['debug_action'] = "plan_create:SLEEP@10000" query = "SELECT * FROM tpch.lineitem limit 1" result = self.execute_query(query, exec_options) assert result.success, "Query failed unexpectedly within exec_time_limit_s." def test_exec_time_limit_not_exceeded(self): """Test that queries completing within exec_time_limit_s succeed.""" exec_options = dict() exec_options['exec_time_limit_s'] = "60" query = "SELECT COUNT(*) FROM tpch.lineitem" result = self.execute_query(query, exec_options) assert result.success, "Query failed unexpectedly within exec_time_limit_s." def test_exec_time_limit_zero(self): """Test that setting exec_time_limit_s to 0 disables the limit.""" exec_options = dict() exec_options['exec_time_limit_s'] = "0" query = "SELECT COUNT(*) FROM tpch.lineitem" result = self.execute_query(query, exec_options) assert result.success, "Query with exec_time_limit_s=0 failed unexpectedly."