IMPALA-1659: Netezza compatibility functions: metadata Added the SQL functions current_catalog(), current_user() and session_user() as aliases to existing ones and a new SQL function current_sid().
Change-Id: I9b5d1009bbf42acc175a942d2df484e1c64822ca Reviewed-on: http://gerrit.cloudera.org:8080/4063 Reviewed-by: Tim Armstrong <[email protected]> Reviewed-by: Marcel Kornacker <[email protected]> Tested-by: Internal Jenkins Project: http://git-wip-us.apache.org/repos/asf/incubator-impala/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-impala/commit/c23dc3a5 Tree: http://git-wip-us.apache.org/repos/asf/incubator-impala/tree/c23dc3a5 Diff: http://git-wip-us.apache.org/repos/asf/incubator-impala/diff/c23dc3a5 Branch: refs/heads/master Commit: c23dc3a53aaacfad11e6dfd825fcfa4c1ded7568 Parents: 9f2c42d Author: Zoltan Ivanfi <[email protected]> Authored: Wed Aug 17 18:16:48 2016 +0200 Committer: Internal Jenkins <[email protected]> Committed: Fri Aug 26 16:29:24 2016 +0000 ---------------------------------------------------------------------- be/src/exprs/expr-test.cc | 21 +++++++++++++++++++++ be/src/exprs/utility-functions-ir.cc | 4 ++++ be/src/exprs/utility-functions.h | 4 ++++ be/src/runtime/runtime-state.h | 1 + common/function-registry/impala_functions.py | 7 ++++--- tests/custom_cluster/test_delegation.py | 8 +++++--- 6 files changed, 39 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/c23dc3a5/be/src/exprs/expr-test.cc ---------------------------------------------------------------------- diff --git a/be/src/exprs/expr-test.cc b/be/src/exprs/expr-test.cc index 744038b..c293ff4 100644 --- a/be/src/exprs/expr-test.cc +++ b/be/src/exprs/expr-test.cc @@ -2697,8 +2697,11 @@ TEST_F(ExprTest, StringParseUrlFunction) { TEST_F(ExprTest, UtilityFunctions) { TestStringValue("current_database()", "default"); + TestStringValue("current_catalog()", "default"); TestStringValue("user()", "impala_test_user"); + TestStringValue("current_user()", "impala_test_user"); TestStringValue("effective_user()", "impala_test_user"); + TestStringValue("session_user()", "impala_test_user"); TestStringValue("version()", GetVersionString()); TestValue("sleep(100)", TYPE_BOOLEAN, true); TestIsNull("sleep(NULL)", TYPE_BOOLEAN); @@ -2773,6 +2776,24 @@ TEST_F(ExprTest, UtilityFunctions) { TestIsNull("fnv_hash(NULL)", TYPE_BIGINT); } +TEST_F(ExprTest, SessionFunctions) { + enum Session {S1, S2}; + enum Query {Q1, Q2}; + + map<Session, map<Query, string>> results; + for (Session session: {S1, S2}) { + executor_->Setup(); // Starts new session + results[session][Q1] = GetValue("current_session()", TYPE_STRING); + results[session][Q2] = GetValue("current_sid()", TYPE_STRING); + } + + // The sessions IDs from the same session must be the same. + EXPECT_EQ(results[S1][Q1], results[S1][Q2]); + EXPECT_EQ(results[S2][Q1], results[S2][Q2]); + // The sessions IDs from different sessions must be different. + EXPECT_NE(results[S1][Q1], results[S2][Q1]); +} + TEST_F(ExprTest, NonFiniteFloats) { TestValue("is_inf(0.0)", TYPE_BOOLEAN, false); TestValue("is_inf(-1/0)", TYPE_BOOLEAN, true); http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/c23dc3a5/be/src/exprs/utility-functions-ir.cc ---------------------------------------------------------------------- diff --git a/be/src/exprs/utility-functions-ir.cc b/be/src/exprs/utility-functions-ir.cc index ab22bb7..ba4a371 100644 --- a/be/src/exprs/utility-functions-ir.cc +++ b/be/src/exprs/utility-functions-ir.cc @@ -117,6 +117,10 @@ StringVal UtilityFunctions::CurrentDatabase(FunctionContext* ctx) { return (database.len > 0) ? database : StringVal::null(); } +StringVal UtilityFunctions::CurrentSession(FunctionContext* ctx) { + return AnyValUtil::FromString(ctx, PrintId(ctx->impl()->state()->session_id())); +} + template<typename T> StringVal UtilityFunctions::TypeOf(FunctionContext* ctx, const T& /*input_val*/) { FunctionContext::TypeDesc type_desc = *(ctx->GetArgType(0)); http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/c23dc3a5/be/src/exprs/utility-functions.h ---------------------------------------------------------------------- diff --git a/be/src/exprs/utility-functions.h b/be/src/exprs/utility-functions.h index 55f8dba..a8dbc7b 100644 --- a/be/src/exprs/utility-functions.h +++ b/be/src/exprs/utility-functions.h @@ -61,6 +61,10 @@ class UtilityFunctions { /// database from the parent session of this query. static StringVal CurrentDatabase(FunctionContext* ctx); + /// Implementation of the current_session() function. Returns the ID of the + /// parent session of this query. + static StringVal CurrentSession(FunctionContext* ctx); + /// Implementation of the Uuid() function. static StringVal Uuid(FunctionContext* ctx); static void UuidPrepare(FunctionContext* ctx, http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/c23dc3a5/be/src/runtime/runtime-state.h ---------------------------------------------------------------------- diff --git a/be/src/runtime/runtime-state.h b/be/src/runtime/runtime-state.h index f86fa77..b5f7882 100644 --- a/be/src/runtime/runtime-state.h +++ b/be/src/runtime/runtime-state.h @@ -113,6 +113,7 @@ class RuntimeState { const std::string& effective_user() const { return GetEffectiveUser(query_ctx().session); } + const TUniqueId& session_id() const { return query_ctx().session.session_id; } const std::string& do_as_user() const { return query_ctx().session.delegated_user; } const std::string& connected_user() const { return query_ctx().session.connected_user; http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/c23dc3a5/common/function-registry/impala_functions.py ---------------------------------------------------------------------- diff --git a/common/function-registry/impala_functions.py b/common/function-registry/impala_functions.py index 8e26f73..10aac10 100644 --- a/common/function-registry/impala_functions.py +++ b/common/function-registry/impala_functions.py @@ -546,9 +546,10 @@ visible_functions = [ '_ZN6impala16UtilityFunctions4UuidEPN10impala_udf15FunctionContextE', '_ZN6impala16UtilityFunctions11UuidPrepareEPN10impala_udf15FunctionContextENS2_18FunctionStateScopeE', '_ZN6impala16UtilityFunctions9UuidCloseEPN10impala_udf15FunctionContextENS2_18FunctionStateScopeE'], - [['current_database'], 'STRING', [], 'impala::UtilityFunctions::CurrentDatabase'], - [['user'], 'STRING', [], 'impala::UtilityFunctions::User'], - [['effective_user'], 'STRING', [], 'impala::UtilityFunctions::EffectiveUser'], + [['current_database', 'current_catalog'], 'STRING', [], 'impala::UtilityFunctions::CurrentDatabase'], + [['current_session', 'current_sid'], 'STRING', [], 'impala::UtilityFunctions::CurrentSession'], + [['user', 'session_user'], 'STRING', [], 'impala::UtilityFunctions::User'], + [['effective_user', 'current_user'], 'STRING', [], 'impala::UtilityFunctions::EffectiveUser'], [['sleep'], 'BOOLEAN', ['INT'], 'impala::UtilityFunctions::Sleep'], [['pid'], 'INT', [], 'impala::UtilityFunctions::Pid'], [['version'], 'STRING', [], 'impala::UtilityFunctions::Version'], http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/c23dc3a5/tests/custom_cluster/test_delegation.py ---------------------------------------------------------------------- diff --git a/tests/custom_cluster/test_delegation.py b/tests/custom_cluster/test_delegation.py index 1324e41..1c412d7 100644 --- a/tests/custom_cluster/test_delegation.py +++ b/tests/custom_cluster/test_delegation.py @@ -33,7 +33,8 @@ class TestDelegation(CustomClusterTestSuite, HS2TestSuite): execute_statement_req = TCLIService.TExecuteStatementReq() execute_statement_req.sessionHandle = self.session_handle execute_statement_req.confOverlay = dict() - execute_statement_req.statement = "SELECT effective_user(), user()"; + execute_statement_req.statement = \ + "SELECT effective_user(), current_user(), user(), session_user()"; execute_statement_resp = self.hs2_client.ExecuteStatement(execute_statement_req) HS2TestSuite.check_response(execute_statement_resp) @@ -42,8 +43,9 @@ class TestDelegation(CustomClusterTestSuite, HS2TestSuite): fetch_results_req.maxRows = 1 fetch_results_resp = self.hs2_client.FetchResults(fetch_results_req) HS2TestSuite.check_response(fetch_results_resp) - assert self.column_results_to_string( - fetch_results_resp.results.columns) == (1, "%s, %s\n" % (proxy_user, USER_NAME)) + assert (self.column_results_to_string(fetch_results_resp.results.columns) == + (1, "%s, %s, %s, %s\n" % (proxy_user, proxy_user, + USER_NAME, USER_NAME))) @pytest.mark.execute_serially @CustomClusterTestSuite.with_args(
