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

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

commit b5cfe21abeea31591e63ae5977c83cb31421cfb4
Author: amashenkov <[email protected]>
AuthorDate: Mon Dec 15 18:22:49 2025 +0300

    minor
---
 .../handler/requests/sql/ClientSqlCommon.java      | 21 +++++----
 .../ignite/internal/sql/ColumnMetadataImpl.java    | 15 ++++--
 .../ignite/internal/sql/ResultSetMetadataImpl.java |  2 +-
 .../org/apache/ignite/internal/sql/SqlCommon.java  |  8 ++++
 .../jdbc/JdbcResultSetMetadataSelfTest.java        | 12 ++---
 .../runner/app/client/ItThinClientSqlTest.java     |  4 +-
 .../ignite/internal/sql/engine/ItMetadataTest.java | 55 +++++++++++-----------
 7 files changed, 69 insertions(+), 48 deletions(-)

diff --git 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/sql/ClientSqlCommon.java
 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/sql/ClientSqlCommon.java
index 90978d1ef93..7c842d51b96 100644
--- 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/sql/ClientSqlCommon.java
+++ 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/sql/ClientSqlCommon.java
@@ -17,6 +17,8 @@
 
 package org.apache.ignite.client.handler.requests.sql;
 
+import static org.apache.ignite.lang.util.IgniteNameUtils.parseIdentifier;
+
 import java.util.Collection;
 import java.util.EnumSet;
 import java.util.HashMap;
@@ -37,6 +39,7 @@ import 
org.apache.ignite.internal.client.proto.ClientMessagePacker;
 import org.apache.ignite.internal.client.sql.QueryModifier;
 import org.apache.ignite.internal.lang.IgniteInternalCheckedException;
 import org.apache.ignite.internal.lang.IgniteInternalException;
+import org.apache.ignite.internal.sql.SqlCommon;
 import org.apache.ignite.internal.sql.api.AsyncResultSetImpl;
 import org.apache.ignite.internal.sql.engine.AsyncSqlCursor;
 import org.apache.ignite.internal.sql.engine.InternalSqlRow;
@@ -188,7 +191,7 @@ class ClientSqlCommon {
             int fieldsNum = origin == null ? 6 : 9;
             out.packInt(fieldsNum);
 
-            out.packString(col.name());
+            out.packString(SqlCommon.normalizedColumnName(col));
             out.packBoolean(col.nullable());
             out.packInt(col.type().id());
             out.packInt(col.scale());
@@ -204,23 +207,25 @@ class ClientSqlCommon {
             if (col.name().equals(origin.columnName())) {
                 out.packNil();
             } else {
-                out.packString(origin.columnName());
+                out.packString(parseIdentifier(origin.columnName()));
             }
 
-            Integer schemaIdx = schemas.get(origin.schemaName());
+            String schemaName = parseIdentifier(origin.schemaName());
+            Integer schemaIdx = schemas.get(schemaName);
 
             if (schemaIdx == null) {
-                schemas.put(origin.schemaName(), i);
-                out.packString(origin.schemaName());
+                schemas.put(schemaName, i);
+                out.packString(schemaName);
             } else {
                 out.packInt(schemaIdx);
             }
 
-            Integer tableIdx = tables.get(origin.tableName());
+            String tableName = parseIdentifier(origin.tableName());
+            Integer tableIdx = tables.get(tableName);
 
             if (tableIdx == null) {
-                tables.put(origin.tableName(), i);
-                out.packString(origin.tableName());
+                tables.put(tableName, i);
+                out.packString(tableName);
             } else {
                 out.packInt(tableIdx);
             }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/sql/ColumnMetadataImpl.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/sql/ColumnMetadataImpl.java
index 2498bb6d427..c4192e50f04 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/sql/ColumnMetadataImpl.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/sql/ColumnMetadataImpl.java
@@ -17,6 +17,8 @@
 
 package org.apache.ignite.internal.sql;
 
+import static org.apache.ignite.lang.util.IgniteNameUtils.quoteIfNeeded;
+
 import java.util.List;
 import org.apache.ignite.internal.tostring.S;
 import org.apache.ignite.sql.ColumnMetadata;
@@ -85,7 +87,7 @@ public class ColumnMetadataImpl implements ColumnMetadata {
     /** {@inheritDoc} */
     @Override
     public String name() {
-        return name;
+        return name.isEmpty() ? name : quoteIfNeeded(name);
     }
 
     /** {@inheritDoc} */
@@ -124,6 +126,11 @@ public class ColumnMetadataImpl implements ColumnMetadata {
         return origin;
     }
 
+    /** Returns normalized name. */
+    String normalizedName() {
+        return name;
+    }
+
     /** {@inheritDoc} */
     @Override
     public String toString() {
@@ -155,19 +162,19 @@ public class ColumnMetadataImpl implements ColumnMetadata 
{
         /** {@inheritDoc} */
         @Override
         public String schemaName() {
-            return schemaName;
+            return quoteIfNeeded(schemaName);
         }
 
         /** {@inheritDoc} */
         @Override
         public String tableName() {
-            return tableName;
+            return quoteIfNeeded(tableName);
         }
 
         /** {@inheritDoc} */
         @Override
         public String columnName() {
-            return columnName;
+            return columnName != null ? quoteIfNeeded(columnName) : null;
         }
 
         /** {@inheritDoc} */
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/sql/ResultSetMetadataImpl.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/sql/ResultSetMetadataImpl.java
index cb222d3e374..a9c79613869 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/sql/ResultSetMetadataImpl.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/sql/ResultSetMetadataImpl.java
@@ -52,7 +52,7 @@ public class ResultSetMetadataImpl implements 
ResultSetMetadata {
         for (int i = 0; i < columns.size(); i++) {
             ColumnMetadata column = columns.get(i);
 
-            columnsIndices.put(column.name(), i);
+            columnsIndices.put(SqlCommon.normalizedColumnName(column), i);
         }
     }
 
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/sql/SqlCommon.java 
b/modules/core/src/main/java/org/apache/ignite/internal/sql/SqlCommon.java
index 2d398d15741..39abaf3e693 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/sql/SqlCommon.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/sql/SqlCommon.java
@@ -17,8 +17,11 @@
 
 package org.apache.ignite.internal.sql;
 
+import static org.apache.ignite.lang.util.IgniteNameUtils.parseIdentifier;
+
 import java.time.ZoneId;
 import org.apache.ignite.lang.util.IgniteNameUtils;
+import org.apache.ignite.sql.ColumnMetadata;
 import org.apache.ignite.table.QualifiedName;
 
 /**
@@ -32,4 +35,9 @@ public final class SqlCommon {
     public static final int DEFAULT_PAGE_SIZE = 1024;
     /** Default time-zone ID. */
     public static final ZoneId DEFAULT_TIME_ZONE_ID = ZoneId.of("UTC");
+
+    /** Return normalized column name. */
+    public static String normalizedColumnName(ColumnMetadata col) {
+        return col instanceof ColumnMetadataImpl ? ((ColumnMetadataImpl) 
col).normalizedName() : parseIdentifier(col.name());
+    }
 }
diff --git 
a/modules/jdbc/src/test/java/org/apache/ignite/internal/jdbc/JdbcResultSetMetadataSelfTest.java
 
b/modules/jdbc/src/test/java/org/apache/ignite/internal/jdbc/JdbcResultSetMetadataSelfTest.java
index 8ff8496b510..e493854964c 100644
--- 
a/modules/jdbc/src/test/java/org/apache/ignite/internal/jdbc/JdbcResultSetMetadataSelfTest.java
+++ 
b/modules/jdbc/src/test/java/org/apache/ignite/internal/jdbc/JdbcResultSetMetadataSelfTest.java
@@ -112,8 +112,8 @@ public class JdbcResultSetMetadataSelfTest {
         ));
 
         assertEquals("LABEL1", md.getColumnLabel(1));
-        assertEquals("label2", md.getColumnLabel(2));
-        assertEquals("Label3", md.getColumnLabel(3));
+        assertEquals("\"label2\"", md.getColumnLabel(2));
+        assertEquals("\"Label3\"", md.getColumnLabel(3));
     }
 
     @Test
@@ -125,8 +125,8 @@ public class JdbcResultSetMetadataSelfTest {
         ));
 
         assertEquals("COLUMN1", md.getColumnName(1));
-        assertEquals("Column2", md.getColumnName(2));
-        assertEquals("Column", md.getColumnName(3));
+        assertEquals("\"Column2\"", md.getColumnName(2));
+        assertEquals("\"Column\"", md.getColumnName(3));
     }
 
     @Test
@@ -139,7 +139,7 @@ public class JdbcResultSetMetadataSelfTest {
 
         assertNull(md.getSchemaName(1));
         assertEquals("S", md.getSchemaName(2));
-        assertEquals("Schema", md.getSchemaName(3));
+        assertEquals("\"Schema\"", md.getSchemaName(3));
     }
 
     @Test
@@ -152,7 +152,7 @@ public class JdbcResultSetMetadataSelfTest {
 
         assertNull(md.getTableName(1));
         assertEquals("T", md.getTableName(2));
-        assertEquals("Table", md.getTableName(3));
+        assertEquals("\"Table\"", md.getTableName(3));
     }
 
     @Test
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 e2db70b5314..2bcad12d5e0 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
@@ -246,7 +246,7 @@ public class ItThinClientSqlTest extends 
ItAbstractThinClientTest {
         assertEquals(3, columns.size());
         assertEquals("MYVALUE", columns.get(0).name());
         assertEquals("ID", columns.get(1).name());
-        assertEquals("ID + 1", columns.get(2).name());
+        assertEquals("\"ID + 1\"", columns.get(2).name());
 
         var rows = new ArrayList<SqlRow>();
         selectRes.currentPage().forEach(rows::add);
@@ -328,7 +328,7 @@ public class ItThinClientSqlTest extends 
ItAbstractThinClientTest {
         assertEquals("TESTEXECUTEDDLDML", columns.get(1).origin().tableName());
         assertFalse(columns.get(1).nullable());
 
-        assertEquals("ID + 1", columns.get(2).name());
+        assertEquals("\"ID + 1\"", columns.get(2).name());
         assertNull(columns.get(2).origin());
 
         var rows = new ArrayList<SqlRow>();
diff --git 
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItMetadataTest.java
 
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItMetadataTest.java
index 9326f6d4a4d..b31dc55e55d 100644
--- 
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItMetadataTest.java
+++ 
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItMetadataTest.java
@@ -52,7 +52,7 @@ public class ItMetadataTest extends BaseSqlIntegrationTest {
     @Test
     public void trimColumnNames() {
         String var300 = "'" + generate(() -> 
"X").limit(300).collect(joining()) + "'";
-        String var256 = var300.substring(0, Math.min(var300.length(), 
MAX_LENGTH_OF_ALIASES));
+        String var256 = "\"" + var300.substring(0, Math.min(var300.length(), 
MAX_LENGTH_OF_ALIASES)) + "\"";
 
         assertQuery("select " + var300 + " from 
person").columnNames(var256).check();
     }
@@ -60,35 +60,36 @@ public class ItMetadataTest extends BaseSqlIntegrationTest {
     @Test
     public void columnNames() {
         assertQuery("select (select count(*) from person), (select avg(salary) 
from person) from person")
-                .columnNames("EXPR$0", "EXPR$1").check();
+                .columnNames("\"EXPR$0\"", "\"EXPR$1\"").check();
         assertQuery("select (select count(*) from person) as subquery from 
person")
                 .columnNames("SUBQUERY").check();
 
         assertQuery("select salary*2, salary*2 as \"SaLaRy\", salary/2, 
salary+2, salary-2, mod(salary, 2)  from person")
-                .columnNames("SALARY * 2", "SaLaRy", "SALARY / 2", "SALARY + 
2", "SALARY - 2", "MOD(SALARY, 2)").check();
+                .columnNames("\"SALARY * 2\"", "\"SaLaRy\"", "\"SALARY / 2\"", 
"\"SALARY + 2\"", "\"SALARY - 2\"", "\"MOD(SALARY, 2)\"")
+                .check();
         assertQuery("select salary*2 as first, salary/2 as LAst from 
person").columnNames("FIRST", "LAST").check();
 
         assertQuery("select trim(name) tr_name from 
person").columnNames("TR_NAME").check();
-        assertQuery("select trim(name) from person").columnNames("TRIM(BOTH ' 
' FROM NAME)").check();
+        assertQuery("select trim(name) from person").columnNames("\"TRIM(BOTH 
' ' FROM NAME)\"").check();
         assertQuery("select ceil(salary), floor(salary), position('text' IN 
name) from person")
-                .columnNames("CEIL(SALARY)", "FLOOR(SALARY)", "POSITION('text' 
IN NAME)").check();
+                .columnNames("\"CEIL(SALARY)\"", "\"FLOOR(SALARY)\"", 
"\"POSITION('text' IN NAME)\"").check();
 
-        assertQuery("select count(*) from 
person").columnNames("COUNT(*)").check();
-        assertQuery("select count(name) from 
person").columnNames("COUNT(NAME)").check();
-        assertQuery("select max(salary) from 
person").columnNames("MAX(SALARY)").check();
-        assertQuery("select min(salary) from 
person").columnNames("MIN(SALARY)").check();
-        assertQuery("select aVg(salary) from 
person").columnNames("AVG(SALARY)").check();
-        assertQuery("select sum(salary) from 
person").columnNames("SUM(SALARY)").check();
+        assertQuery("select count(*) from 
person").columnNames("\"COUNT(*)\"").check();
+        assertQuery("select count(name) from 
person").columnNames("\"COUNT(NAME)\"").check();
+        assertQuery("select max(salary) from 
person").columnNames("\"MAX(SALARY)\"").check();
+        assertQuery("select min(salary) from 
person").columnNames("\"MIN(SALARY)\"").check();
+        assertQuery("select aVg(salary) from 
person").columnNames("\"AVG(SALARY)\"").check();
+        assertQuery("select sum(salary) from 
person").columnNames("\"SUM(SALARY)\"").check();
 
-        assertQuery("select typeOf(salary) from 
person").columnNames("TYPEOF(SALARY)").check();
-        assertQuery("select typeOf(null) from 
person").columnNames("TYPEOF(NULL)").check();
+        assertQuery("select typeOf(salary) from 
person").columnNames("\"TYPEOF(SALARY)\"").check();
+        assertQuery("select typeOf(null) from 
person").columnNames("\"TYPEOF(NULL)\"").check();
 
-        assertQuery("select salary, count(name) from person group by 
salary").columnNames("SALARY", "COUNT(NAME)").check();
+        assertQuery("select salary, count(name) from person group by 
salary").columnNames("SALARY", "\"COUNT(NAME)\"").check();
 
-        assertQuery("select 1, -1, 'some string' from 
person").columnNames("1", "-1", "'some string'").check();
+        assertQuery("select 1, -1, 'some string' from 
person").columnNames("\"1\"", "\"-1\"", "\"'some string'\"").check();
 
         // id, name, salary
-        assertQuery("SELECT SUM(sal) FROM person as p (i, n, 
sal)").columnNames("SUM(SAL)").check();
+        assertQuery("SELECT SUM(sal) FROM person as p (i, n, 
sal)").columnNames("\"SUM(SAL)\"").check();
     }
 
     @Test
@@ -106,8 +107,8 @@ public class ItMetadataTest extends BaseSqlIntegrationTest {
                         new 
MetadataMatcher().name("TID").type(ColumnType.INT8),
                         new 
MetadataMatcher().name("SID").type(ColumnType.INT16),
                         new 
MetadataMatcher().name("VID").type(ColumnType.STRING),
-                        new MetadataMatcher().name("ID :: INTERVAL 
INTERVAL_HOUR").type(ColumnType.DURATION),
-                        new MetadataMatcher().name("ID :: INTERVAL 
INTERVAL_YEAR").type(ColumnType.PERIOD)
+                        new MetadataMatcher().name("\"ID :: INTERVAL 
INTERVAL_HOUR\"").type(ColumnType.DURATION),
+                        new MetadataMatcher().name("\"ID :: INTERVAL 
INTERVAL_YEAR\"").type(ColumnType.PERIOD)
                 ).check();
     }
 
@@ -117,23 +118,23 @@ public class ItMetadataTest extends 
BaseSqlIntegrationTest {
         sql("CREATE TABLE column_order1 (double_c DOUBLE, long_c BIGINT 
PRIMARY KEY, string_c VARCHAR)");
 
         assertQuery("select *, double_c, double_c * 2 from column_order")
-                .columnNames("DOUBLE_C", "LONG_C", "STRING_C", "INT_C", 
"DOUBLE_C", "DOUBLE_C * 2")
+                .columnNames("DOUBLE_C", "LONG_C", "STRING_C", "INT_C", 
"DOUBLE_C", "\"DOUBLE_C * 2\"")
                 .check();
 
         assertQuery("select *, double_c as J, double_c * 2, double_c as J2 
from column_order")
-                .columnNames("DOUBLE_C", "LONG_C", "STRING_C", "INT_C", "J", 
"DOUBLE_C * 2", "J2")
+                .columnNames("DOUBLE_C", "LONG_C", "STRING_C", "INT_C", "J", 
"\"DOUBLE_C * 2\"", "J2")
                 .check();
 
         assertQuery("select double_c * 2, * from column_order")
-                .columnNames("DOUBLE_C * 2", "DOUBLE_C", "LONG_C", "STRING_C", 
"INT_C")
+                .columnNames("\"DOUBLE_C * 2\"", "DOUBLE_C", "LONG_C", 
"STRING_C", "INT_C")
                 .check();
 
         assertQuery("select *, *, double_c * 2 from column_order")
-                .columnNames("DOUBLE_C", "LONG_C", "STRING_C", "INT_C", 
"DOUBLE_C0", "LONG_C0", "STRING_C0", "INT_C0", "DOUBLE_C * 2")
+                .columnNames("DOUBLE_C", "LONG_C", "STRING_C", "INT_C", 
"DOUBLE_C0", "LONG_C0", "STRING_C0", "INT_C0", "\"DOUBLE_C * 2\"")
                 .check();
 
         assertQuery("select *, double_c * 2, double_c * 2, * from 
column_order")
-                .columnNames("DOUBLE_C", "LONG_C", "STRING_C", "INT_C", 
"DOUBLE_C * 2", "DOUBLE_C * 2", "DOUBLE_C0", "LONG_C0",
+                .columnNames("DOUBLE_C", "LONG_C", "STRING_C", "INT_C", 
"\"DOUBLE_C * 2\"", "\"DOUBLE_C * 2\"", "DOUBLE_C0", "LONG_C0",
                         "STRING_C0", "INT_C0").check();
 
         assertQuery("select * from column_order")
@@ -141,12 +142,12 @@ public class ItMetadataTest extends 
BaseSqlIntegrationTest {
                 .check();
 
         assertQuery("select a.*, a.double_c * 2, b.*  from column_order a, 
column_order1 b where a.double_c = b.double_c")
-                .columnNames("DOUBLE_C", "LONG_C", "STRING_C", "INT_C", 
"A.DOUBLE_C * 2", "DOUBLE_C0", "LONG_C0", "STRING_C0")
+                .columnNames("DOUBLE_C", "LONG_C", "STRING_C", "INT_C", 
"\"A.DOUBLE_C * 2\"", "DOUBLE_C0", "LONG_C0", "STRING_C0")
                 .check();
 
         assertQuery("select a.*, a.double_c * 2, a.double_c * 2 as J, b.*  
from column_order a, column_order1 b "
                 + "where a.double_c = b.double_c")
-                .columnNames("DOUBLE_C", "LONG_C", "STRING_C", "INT_C", 
"A.DOUBLE_C * 2", "J", "DOUBLE_C0", "LONG_C0", "STRING_C0")
+                .columnNames("DOUBLE_C", "LONG_C", "STRING_C", "INT_C", 
"\"A.DOUBLE_C * 2\"", "J", "DOUBLE_C0", "LONG_C0", "STRING_C0")
                 .check();
     }
 
@@ -265,9 +266,9 @@ public class ItMetadataTest extends BaseSqlIntegrationTest {
 
         assertQuery("select * from sens")
                 .columnMetadata(
-                        new MetadataMatcher().name("Col1"),
+                        new MetadataMatcher().name("\"Col1\""),
                         new MetadataMatcher().name("COL2"),
-                        new MetadataMatcher().name("Col3.a"),
+                        new MetadataMatcher().name("\"Col3.a\""),
                         new MetadataMatcher().name("COL4"))
                 .check();
 

Reply via email to