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();
