mirror of
https://github.com/apache/impala.git
synced 2026-01-02 03:00:32 -05:00
When ScalarExprEvaluator::Clone() fails, the newly created evaluator was not added to the output vector. This makes it impossible for callers to close and clean up the evaluators afterwards. This change fixes this by always adding the newly created evaluator to the output vector before checking for the error status. This path is only exercised in the scanner code. Two new tests are added to exercise the failure paths. Testing done: newly added tests in udf-errors.test Change-Id: I45ffd722d0a69ad05ae3c748cf504c7f1a959a1d Reviewed-on: http://gerrit.cloudera.org:8080/8572 Reviewed-by: Tim Armstrong <tarmstrong@cloudera.com> Tested-by: Impala Public Jenkins
117 lines
3.9 KiB
Plaintext
117 lines
3.9 KiB
Plaintext
====
|
|
---- QUERY
|
|
create function if not exists hive_pi() returns double
|
|
location '$FILESYSTEM_PREFIX/test-warehouse/hive-exec.jar'
|
|
symbol='org.apache.hadoop.hive.ql.udf.UDFPI';
|
|
---- RESULTS
|
|
====
|
|
---- QUERY
|
|
create function if not exists foo() returns double
|
|
location '$FILESYSTEM_PREFIX/test-warehouse/not-a-real-file.so'
|
|
symbol='FnDoesNotExist';
|
|
---- CATCH
|
|
Could not load binary: $FILESYSTEM_PREFIX/test-warehouse/not-a-real-file.so
|
|
====
|
|
---- QUERY
|
|
create function if not exists foo() returns double
|
|
location '$FILESYSTEM_PREFIX/test-warehouse/not-a-real-file.so'
|
|
symbol='FnDoesNotExist';
|
|
---- CATCH
|
|
Could not load binary: $FILESYSTEM_PREFIX/test-warehouse/not-a-real-file.so
|
|
====
|
|
---- QUERY
|
|
# This test is run with codegen disabled. Interpretation only handles up to 20 arguments.
|
|
create function if not exists twenty_args(int, int, int, int, int, int,
|
|
int, int, int, int, int, int, int, int, int, int, int, int, int, int) returns int
|
|
location '$FILESYSTEM_PREFIX/test-warehouse/libTestUdfs.so'
|
|
symbol='TwentyArgs';
|
|
---- RESULTS
|
|
====
|
|
---- QUERY
|
|
# Verifies that interpretation can support up to 20 arguments
|
|
select twenty_args(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20);
|
|
---- TYPES
|
|
INT
|
|
---- RESULTS
|
|
210
|
|
====
|
|
---- QUERY
|
|
# This test is run with codegen disabled. Interpretation only handles up to 20 arguments.
|
|
create function if not exists twenty_one_args(int, int, int, int, int, int,
|
|
int, int, int, int, int, int, int, int, int, int, int, int, int, int, int) returns int
|
|
location '$FILESYSTEM_PREFIX/test-warehouse/libTestUdfs.so'
|
|
symbol='TwentyOneArgs';
|
|
---- RESULTS
|
|
====
|
|
---- QUERY
|
|
# Verifies that interpretation fails with more than 20 arguments.
|
|
select twenty_one_args(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21);
|
|
---- CATCH
|
|
Cannot interpret native UDF 'twenty_one_args': number of arguments is more than 20. Codegen is needed. Please set DISABLE_CODEGEN to false.
|
|
====
|
|
---- QUERY
|
|
# This test is run with codegen disabled. IR UDF will fail.
|
|
create function if not exists nine_args_ir(int, int, int, int, int, int,
|
|
int, int, int) returns int
|
|
location '$FILESYSTEM_PREFIX/test-warehouse/test-udfs.ll'
|
|
symbol='NineArgs';
|
|
---- RESULTS
|
|
====
|
|
---- QUERY
|
|
select nine_args_ir(1,2,3,4,5,6,7,8,9);
|
|
---- CATCH
|
|
Cannot interpret LLVM IR UDF 'nine_args_ir': Codegen is needed. Please set DISABLE_CODEGEN to false.
|
|
====
|
|
---- QUERY
|
|
create function if not exists bad_expr(double) returns boolean
|
|
location '$FILESYSTEM_PREFIX/test-warehouse/libTestUdfs.so'
|
|
symbol='BadExpr' prepare_fn='BadExprPrepare' close_fn='BadExprClose';
|
|
---- RESULTS
|
|
====
|
|
---- QUERY
|
|
create function if not exists bad_expr2(double) returns boolean
|
|
location '$FILESYSTEM_PREFIX/test-warehouse/libTestUdfs.so'
|
|
symbol='BadExpr' prepare_fn='BadExpr2Prepare' close_fn='BadExprClose';
|
|
---- RESULTS
|
|
====
|
|
---- QUERY
|
|
select count(t1.int_col) from functional.alltypes t1 join functional.alltypes t2
|
|
on (bad_expr(rand()) = (t2.bool_col && t1.bool_col));
|
|
---- CATCH
|
|
BadExpr prepare error
|
|
====
|
|
---- QUERY
|
|
select count(t1.int_col) from functional.alltypes t1 join functional.alltypes t2
|
|
on (bad_expr2(rand()) = (t2.bool_col && t1.bool_col));
|
|
---- CATCH
|
|
BadExpr error
|
|
====
|
|
---- QUERY
|
|
select count(int_col) from functional.alltypes where bad_expr(rand());
|
|
---- CATCH
|
|
BadExpr prepare error
|
|
====
|
|
---- QUERY
|
|
select count(int_col) from functional.alltypes where bad_expr2(rand());
|
|
---- CATCH
|
|
BadExpr2 prepare error
|
|
====
|
|
---- QUERY
|
|
use default;
|
|
drop database $DATABASE;
|
|
---- CATCH
|
|
Cannot drop non-empty database:
|
|
====
|
|
---- QUERY
|
|
use $DATABASE;
|
|
drop function hive_pi();
|
|
drop function twenty_args(int, int, int, int, int, int, int, int,
|
|
int, int, int, int, int, int, int, int, int, int, int, int);
|
|
drop function twenty_one_args(int, int, int, int, int, int, int, int,
|
|
int, int, int, int, int, int, int, int, int, int, int, int, int);
|
|
drop function nine_args_ir(int, int, int, int, int, int, int, int, int);
|
|
drop function bad_expr(double);
|
|
drop function bad_expr2(double);
|
|
---- RESULTS
|
|
====
|