You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@impala.apache.org by jb...@apache.org on 2016/08/26 17:28:19 UTC

[2/3] incubator-impala git commit: IMPALA-1659: Netezza compatibility functions: metadata

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 <ta...@cloudera.com>
Reviewed-by: Marcel Kornacker <ma...@cloudera.com>
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 <zi...@cloudera.com>
Authored: Wed Aug 17 18:16:48 2016 +0200
Committer: Internal Jenkins <cl...@gerrit.cloudera.org>
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(