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
