Files
impala/testdata/workloads/functional-query/queries/QueryTest/alloc-fail-init.test
Michael Ho e01ab4f1b2 IMPALA-2620: FunctionContext::Allocate() and friends should check for memory limits.
FunctionContext::Allocate(), FunctionContextImpl::AllocateLocal()
and FunctionContext::Reallocate() allocate memory without taking
memory limits into account. The problem is that these functions
invoke FreePool::Allocate() which may call MemPool::Allocate()
that doesn't check against the memory limits. This patch fixes
the problem by making these FunctionContext functions check for
memory limits and set an error in the FunctionContext object if
memory limits are exceeded.

An alternative would be for these functions to call
MemPool::TryAllocate() instead and return NULL if memory limits
are exceeded. However, this may break some existing external
UDAs which don't check for allocation failures, leading to
unexpected crashes of Impala. Therefore, we stick with this
ad hoc approach until the UDF/UDA interfaces are updated in
the future releases.

Callers of these FunctionContext functions are also updated to
handle potential failed allocations instead of operating on
NULL pointers. The query status will be polled at various
locations and terminate the query.

This patch also fixes MemPool to handle the case in which malloc
may return NULL. It propagates the failure to the callers instead
of continuing to run with NULL pointers. In addition, errors during
aggregate functions' initialization are now properly propagated.

Change-Id: Icefda795cd685e5d0d8a518cbadd37f02ea5e733
Reviewed-on: http://gerrit.cloudera.org:8080/1445
Reviewed-by: Michael Ho <kwho@cloudera.com>
Tested-by: Internal Jenkins
2015-12-19 04:45:55 +00:00

97 lines
2.7 KiB
Plaintext

====
---- QUERY
select ndv(string_col) from functional.alltypes
---- CATCH
FunctionContext::Allocate() failed to allocate 1024 bytes.
====
---- QUERY
select min(string_col) from functional.alltypes
---- CATCH
FunctionContext::Allocate() failed to allocate 1 bytes.
====
---- QUERY
select max(string_col) from functional.alltypes
---- CATCH
FunctionContext::Allocate() failed to allocate 1 bytes.
====
---- QUERY
select avg(d1) from functional.decimal_tbl
---- CATCH
FunctionContext::Allocate() failed to allocate 48 bytes.
====
---- QUERY
select avg(double_col) from functional.alltypes
---- CATCH
FunctionContext::Allocate() failed to allocate 16 bytes.
====
---- QUERY
select avg(timestamp_col) from functional.alltypes
---- CATCH
FunctionContext::Allocate() failed to allocate 16 bytes.
====
---- QUERY
select sample(timestamp_col) from functional.alltypes
---- CATCH
FunctionContext::Allocate() failed to allocate 480232 bytes.
====
---- QUERY
select distinctpc(int_col) from functional.alltypes
---- CATCH
FunctionContext::Allocate() failed to allocate 256 bytes.
====
---- QUERY
select distinctpcsa(string_col) from functional.alltypes
---- CATCH
FunctionContext::Allocate() failed to allocate 256 bytes.
====
---- QUERY
select group_concat(string_col) from functional.alltypes
---- CATCH
FunctionContext::Allocate() failed to allocate 4 bytes.
====
---- QUERY
select rank() over (partition by month order by year) from functional.alltypes
---- CATCH
FunctionContext::Allocate() failed to allocate 16 bytes.
====
---- QUERY
select extract(year from timestamp_col) from functional.alltypes limit 10
---- CATCH
FunctionContextImpl::AllocateLocal() failed to allocate 4 bytes.
====
---- QUERY
select trunc(timestamp_col, 'YEAR') from functional.alltypes limit 10
---- CATCH
FunctionContextImpl::AllocateLocal() failed to allocate 4 bytes.
====
---- QUERY
select first_value(string_col) over (partition by month order by year) from functional.alltypes
---- CATCH
FunctionContext::Allocate() failed to allocate 1 bytes.
====
---- QUERY
select last_value(string_col) over (partition by month order by year) from functional.alltypes
---- CATCH
FunctionContext::Allocate() failed to allocate 1 bytes.
====
---- QUERY
select rand() from functional.alltypes;
---- CATCH
FunctionContext::Allocate() failed to allocate 4 bytes.
====
---- QUERY
select case when min(int_col) = 0 then 0 end from functional.alltypes
---- CATCH
FunctionContext::Allocate() failed to allocate 16 bytes.
====
---- QUERY
select cast(string_col as char(120)) from functional.alltypes
---- CATCH
FunctionContextImpl::AllocateLocal() failed to allocate 120 bytes.
====
---- QUERY
select appx_median(int_col) from functional.alltypes
---- CATCH
FunctionContext::Allocate() failed to allocate 320232 bytes.
====