This is an automated email from the ASF dual-hosted git repository.

amashenkov pushed a commit to branch ignite-25588
in repository https://gitbox.apache.org/repos/asf/ignite-3.git

commit a16b3b5e5d17e135514bf1b406525d85151bcb81
Author: amashenkov <[email protected]>
AuthorDate: Thu Jul 24 14:37:52 2025 +0300

    Add support for CURRENT_USER sql function.
---
 .../org/apache/ignite/jdbc/ItJdbcConnectionSelfTest.java  | 15 +++++++++++++++
 .../internal/runner/app/client/ItThinClientSqlTest.java   | 12 ++++++++++++
 .../ignite/internal/sql/engine/ItFunctionsTest.java       | 10 ++++++++++
 .../ignite/internal/sql/engine/exec/ExecutionContext.java |  6 ++++++
 .../sql/engine/sql/fun/IgniteSqlOperatorTable.java        |  5 +++++
 .../apache/ignite/internal/sql/engine/util/Commons.java   |  2 ++
 .../apache/ignite/internal/sql/docs/OperatorListTest.java |  4 +++-
 .../sql-engine/src/test/resources/docs/operator_list.txt  |  3 +++
 8 files changed, 56 insertions(+), 1 deletion(-)

diff --git 
a/modules/jdbc/src/integrationTest/java/org/apache/ignite/jdbc/ItJdbcConnectionSelfTest.java
 
b/modules/jdbc/src/integrationTest/java/org/apache/ignite/jdbc/ItJdbcConnectionSelfTest.java
index 1ab19b760fa..a007ced1a7c 100644
--- 
a/modules/jdbc/src/integrationTest/java/org/apache/ignite/jdbc/ItJdbcConnectionSelfTest.java
+++ 
b/modules/jdbc/src/integrationTest/java/org/apache/ignite/jdbc/ItJdbcConnectionSelfTest.java
@@ -50,6 +50,7 @@ import java.util.Properties;
 import java.util.ServiceLoader;
 import java.util.concurrent.Executor;
 import java.util.concurrent.Executors;
+import org.apache.ignite.internal.sql.engine.util.Commons;
 import org.apache.ignite.jdbc.util.JdbcTestUtils;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
@@ -958,4 +959,18 @@ public class ItJdbcConnectionSelfTest extends 
AbstractJdbcSelfTest {
             checkConnectionClosed(() -> conn.setNetworkTimeout(executor, 
timeout));
         }
     }
+
+    @Test
+    public void testCurrentUser() throws Exception {
+        var url = "jdbc:ignite:thin://127.0.0.1:10800";
+
+        try (Connection conn = DriverManager.getConnection(url)) {
+            try (PreparedStatement stmt = conn.prepareStatement("SELECT 
CURRENT_USER")){
+                try (ResultSet rs = stmt.executeQuery();) {
+                    assertTrue(rs.next());
+                    assertEquals(Commons.SYSTEM_USER_NAME, rs.getString(1));
+                }
+            }
+        }
+    }
 }
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientSqlTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientSqlTest.java
index 03259db3100..66625d38e44 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientSqlTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientSqlTest.java
@@ -660,6 +660,18 @@ public class ItThinClientSqlTest extends 
ItAbstractThinClientTest {
         assertEquals("ClientSqlRow [NUM=1, STR=hello]", row.toString());
     }
 
+    @Test
+    public void testCurrentUser() {
+        AsyncResultSet<SqlRow> resultSet = client().sql()
+                .executeAsync(null, "SELECT CURRENT_USER")
+                .join();
+
+        SqlRow row = resultSet.currentPage().iterator().next();
+
+        assertEquals(ColumnType.STRING, 
resultSet.metadata().columns().get(0).type());
+        assertEquals("ClientSqlRow [CURRENT_USER=SYSTEM]", row.toString());
+    }
+
     private static class Pojo {
         public int num;
 
diff --git 
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItFunctionsTest.java
 
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItFunctionsTest.java
index 4bbd9263b6d..dcdec7f643d 100644
--- 
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItFunctionsTest.java
+++ 
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItFunctionsTest.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.internal.sql.engine;
 
 import static org.apache.ignite.internal.lang.IgniteStringFormatter.format;
+import static 
org.apache.ignite.internal.sql.engine.util.Commons.SYSTEM_USER_NAME;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.instanceOf;
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -39,6 +40,7 @@ import org.apache.ignite.internal.sql.BaseSqlIntegrationTest;
 import org.apache.ignite.internal.sql.engine.util.MetadataMatcher;
 import org.apache.ignite.internal.util.ArrayUtils;
 import org.apache.ignite.sql.ColumnType;
+import org.junit.jupiter.api.Test;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.Arguments;
 import org.junit.jupiter.params.provider.MethodSource;
@@ -249,6 +251,14 @@ public class ItFunctionsTest extends 
BaseSqlIntegrationTest {
         );
     }
 
+    @Test
+    public void testCurrentUser() {
+        assertQuery("SELECT CURRENT_USER")
+                .returns(SYSTEM_USER_NAME)
+                .columnMetadata(new MetadataMatcher().type(ColumnType.STRING))
+                .check();
+    }
+
     /** Numeric type parser. */
     public static final class ParseNum {
 
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ExecutionContext.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ExecutionContext.java
index 76454b00d8d..94e85214ee7 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ExecutionContext.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ExecutionContext.java
@@ -106,6 +106,8 @@ public class ExecutionContext<RowT> implements DataContext {
 
     private final ZoneId timeZoneId;
 
+    private final String currentUser;
+
     private SharedState sharedState = new SharedState();
 
     /**
@@ -152,6 +154,7 @@ public class ExecutionContext<RowT> implements DataContext {
         this.txAttributes = txAttributes;
         this.timeZoneId = timeZoneId;
         this.inBufSize = inBufSize < 0 ? Commons.IN_BUFFER_SIZE : inBufSize;
+        this.currentUser = Commons.SYSTEM_USER_NAME;
 
         assert this.inBufSize > 0 : this.inBufSize;
 
@@ -298,6 +301,9 @@ public class ExecutionContext<RowT> implements DataContext {
         if (Variable.TIME_ZONE.camelName.equals(name)) {
             return TimeZone.getTimeZone(timeZoneId);
         }
+        if (Variable.USER.camelName.equals(name)) {
+            return currentUser;
+        }
 
         if (name.startsWith("?")) {
             return getParameter(name);
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/sql/fun/IgniteSqlOperatorTable.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/sql/fun/IgniteSqlOperatorTable.java
index 20ab9013a17..ff30f6de511 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/sql/fun/IgniteSqlOperatorTable.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/sql/fun/IgniteSqlOperatorTable.java
@@ -30,11 +30,13 @@ import org.apache.calcite.sql.SqlKind;
 import org.apache.calcite.sql.SqlOperator;
 import org.apache.calcite.sql.SqlOperatorBinding;
 import org.apache.calcite.sql.fun.SqlAbstractTimeFunction;
+import org.apache.calcite.sql.fun.SqlBaseContextVariable;
 import org.apache.calcite.sql.fun.SqlInternalOperators;
 import org.apache.calcite.sql.fun.SqlLibraryOperators;
 import org.apache.calcite.sql.fun.SqlMinMaxAggFunction;
 import org.apache.calcite.sql.fun.SqlMonotonicBinaryOperator;
 import org.apache.calcite.sql.fun.SqlStdOperatorTable;
+import org.apache.calcite.sql.fun.SqlStringContextVariable;
 import org.apache.calcite.sql.fun.SqlSubstringFunction;
 import org.apache.calcite.sql.type.InferTypes;
 import org.apache.calcite.sql.type.OperandTypes;
@@ -761,6 +763,9 @@ public class IgniteSqlOperatorTable extends 
ReflectiveSqlOperatorTable {
         definedOperatorsBuilder.add(SqlStdOperatorTable.LOCALTIME);
         definedOperatorsBuilder.add(SqlStdOperatorTable.LOCALTIMESTAMP);
 
+        // Context variable functions
+        definedOperatorsBuilder.add(SqlStdOperatorTable.CURRENT_USER);
+
         // Ignite specific operators
         definedOperatorsBuilder.add(LENGTH);
         definedOperatorsBuilder.add(SYSTEM_RANGE);
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/Commons.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/Commons.java
index b276a5432e5..a4da39d4c5f 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/Commons.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/Commons.java
@@ -123,6 +123,8 @@ public final class Commons {
     // Old name for partition column. Kept for backward compatibility.
     public static final String PART_COL_NAME_LEGACY = "__part";
 
+    public static final String SYSTEM_USER_NAME = "SYSTEM";
+
     public static final int IN_BUFFER_SIZE = 512;
 
     public static final int IO_BATCH_SIZE = 256;
diff --git 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/docs/OperatorListTest.java
 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/docs/OperatorListTest.java
index 75b7454082a..42e88c8e9bf 100644
--- 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/docs/OperatorListTest.java
+++ 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/docs/OperatorListTest.java
@@ -336,8 +336,10 @@ public class OperatorListTest extends 
BaseIgniteAbstractTest {
         ops.internal(SqlStdOperatorTable.NULLS_LAST);
         ops.internal(SqlStdOperatorTable.DESC);
 
-        // Ignite
+        // Context variable functions.
+        ops.add(SqlStdOperatorTable.CURRENT_USER);
 
+        // Ignite
         ops.add(IgniteSqlOperatorTable.TYPEOF);
         ops.add(IgniteSqlOperatorTable.RAND_UUID);
         ops.add(IgniteSqlOperatorTable.SYSTEM_RANGE);
diff --git a/modules/sql-engine/src/test/resources/docs/operator_list.txt 
b/modules/sql-engine/src/test/resources/docs/operator_list.txt
index 51c3c417a58..51aac5d03d1 100644
--- a/modules/sql-engine/src/test/resources/docs/operator_list.txt
+++ b/modules/sql-engine/src/test/resources/docs/operator_list.txt
@@ -446,6 +446,9 @@ EXISTS <any>
 <any> DESC
 #cd2aa6863ed54bd03d844b08664115655e7ae2e4
 
+CURRENT_USER
+#3cfbde57fbba1435023dc75472eedaec6555d525
+
 TYPEOF(<any>)
 #85771dfef877b07351286b9f792f2ae2cd4a234d
 

Reply via email to