This is an automated email from the ASF dual-hosted git repository.
jooger pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git
The following commit(s) were added to refs/heads/main by this push:
new ca6af0ac67f IGNITE-25408 Catalog API: createTableAsync does not fetch
the created table in non-default schema (#5888)
ca6af0ac67f is described below
commit ca6af0ac67f519c1aa6b8aa46ce89a4d65ef41f2
Author: Max Zhuravkov <[email protected]>
AuthorDate: Thu May 29 10:52:51 2025 +0300
IGNITE-25408 Catalog API: createTableAsync does not fetch the created table
in non-default schema (#5888)
---
.../java/org/apache/ignite/catalog/ColumnType.java | 2 +-
.../catalog/definitions/TableDefinition.java | 64 ++++---
.../catalog/definitions/TableDefinitionTest.java | 161 +++++++++++++++++
.../ignite/internal/catalog/ItCatalogDslTest.java | 192 ++++++++++++++++++++-
.../catalog/sql/CreateFromAnnotationsImpl.java | 10 +-
.../catalog/sql/CreateFromDefinitionImpl.java | 11 +-
.../internal/catalog/sql/CreateTableImpl.java | 7 +-
.../ignite/internal/catalog/sql/DropTableImpl.java | 7 +-
.../internal/catalog/sql/IgniteCatalogSqlImpl.java | 4 +-
.../apache/ignite/internal/catalog/sql/Name.java | 71 ++++----
.../catalog/sql/TableDefinitionCollector.java | 3 +-
.../ignite/internal/catalog/sql/TableZoneId.java | 7 +-
.../catalog/sql/CreateFromAnnotationsTest.java | 4 +-
.../catalog/sql/CreateFromDefinitionTest.java | 35 +++-
.../internal/catalog/sql/CreateTableTest.java | 75 ++++----
.../ignite/internal/catalog/sql/DropTableTest.java | 18 +-
.../ignite/internal/catalog/sql/QueryPartTest.java | 22 +--
17 files changed, 545 insertions(+), 148 deletions(-)
diff --git
a/modules/api/src/main/java/org/apache/ignite/catalog/ColumnType.java
b/modules/api/src/main/java/org/apache/ignite/catalog/ColumnType.java
index aafb49d8be6..270207390aa 100644
--- a/modules/api/src/main/java/org/apache/ignite/catalog/ColumnType.java
+++ b/modules/api/src/main/java/org/apache/ignite/catalog/ColumnType.java
@@ -178,7 +178,7 @@ public class ColumnType<T> {
public static ColumnType<?> of(Class<?> type) {
ColumnType<?> columnType = TYPES.get(type);
if (columnType == null) {
- throw new UnsupportedOperationException("Class is not supported: "
+ type.getCanonicalName());
+ throw new IllegalArgumentException("Class is not supported: " +
type.getCanonicalName());
}
return columnType.copy();
}
diff --git
a/modules/api/src/main/java/org/apache/ignite/catalog/definitions/TableDefinition.java
b/modules/api/src/main/java/org/apache/ignite/catalog/definitions/TableDefinition.java
index 40e64672bed..464988f2dde 100644
---
a/modules/api/src/main/java/org/apache/ignite/catalog/definitions/TableDefinition.java
+++
b/modules/api/src/main/java/org/apache/ignite/catalog/definitions/TableDefinition.java
@@ -25,16 +25,15 @@ import java.util.stream.Collectors;
import org.apache.ignite.catalog.ColumnSorted;
import org.apache.ignite.catalog.IndexType;
import org.apache.ignite.catalog.SortOrder;
-import org.apache.ignite.catalog.annotations.Table;
+import org.apache.ignite.lang.util.IgniteNameUtils;
+import org.apache.ignite.table.QualifiedName;
import org.jetbrains.annotations.Nullable;
/**
* Definition of the {@code CREATE TABLE} statement.
*/
public class TableDefinition {
- private final String tableName;
-
- private final String schemaName;
+ private final QualifiedName qualifiedName;
private final boolean ifNotExists;
@@ -55,8 +54,7 @@ public class TableDefinition {
private final List<IndexDefinition> indexes;
private TableDefinition(
- String tableName,
- String schemaName,
+ QualifiedName qualifiedName,
boolean ifNotExists,
List<ColumnDefinition> columns,
IndexType pkType,
@@ -67,8 +65,7 @@ public class TableDefinition {
Class<?> valueClass,
List<IndexDefinition> indexes
) {
- this.tableName = tableName;
- this.schemaName = schemaName;
+ this.qualifiedName = qualifiedName;
this.ifNotExists = ifNotExists;
this.columns = columns;
this.pkType = pkType;
@@ -87,16 +84,34 @@ public class TableDefinition {
* @return Builder.
*/
public static Builder builder(String tableName) {
+ Objects.requireNonNull(tableName, "Table name must not be null.");
+ if (tableName.isBlank()) {
+ throw new IllegalArgumentException("Table name must not be
blank.");
+ }
+
return new Builder().tableName(tableName);
}
+ /**
+ * Creates a builder for the table with the specified qualified name.
+ *
+ * @param qualifiedName Qualified name.
+ * @return Builder.
+ */
+ public static Builder builder(QualifiedName qualifiedName) {
+ Objects.requireNonNull(qualifiedName, "Qualified table name must not
be null.");
+ String schemaName =
IgniteNameUtils.quoteIfNeeded(qualifiedName.schemaName());
+ String tableName =
IgniteNameUtils.quoteIfNeeded(qualifiedName.objectName());
+ return new Builder().tableName(tableName).schema(schemaName);
+ }
+
/**
* Returns table name.
*
* @return Table name.
*/
public String tableName() {
- return tableName;
+ return IgniteNameUtils.quoteIfNeeded(qualifiedName.objectName());
}
/**
@@ -105,7 +120,16 @@ public class TableDefinition {
* @return Schema name or {@code null} if not specified.
*/
public @Nullable String schemaName() {
- return schemaName;
+ return IgniteNameUtils.quoteIfNeeded(qualifiedName.schemaName());
+ }
+
+ /**
+ * Returns qualified table name.
+ *
+ * @return Qualified table name.
+ */
+ public QualifiedName qualifiedName() {
+ return qualifiedName;
}
/**
@@ -218,8 +242,7 @@ public class TableDefinition {
}
TableDefinition that = (TableDefinition) o;
return ifNotExists == that.ifNotExists
- && Objects.equals(tableName, that.tableName)
- && Objects.equals(schemaName, that.schemaName)
+ && Objects.equals(qualifiedName, that.qualifiedName)
&& Objects.equals(columns, that.columns)
&& pkType == that.pkType
&& Objects.equals(pkColumns, that.pkColumns)
@@ -233,8 +256,7 @@ public class TableDefinition {
@Override
public int hashCode() {
return Objects.hash(
- tableName,
- schemaName,
+ qualifiedName,
ifNotExists,
columns,
pkType,
@@ -251,9 +273,10 @@ public class TableDefinition {
* Builder for the table definition.
*/
public static class Builder {
+
private String tableName;
- private String schemaName = Table.DEFAULT_SCHEMA;
+ private String schemaName;
private boolean ifNotExists;
@@ -273,11 +296,13 @@ public class TableDefinition {
private final List<IndexDefinition> indexes = new ArrayList<>();
- private Builder() {}
+ private Builder() {
+
+ }
private Builder(TableDefinition definition) {
- tableName = definition.tableName;
- schemaName = definition.schemaName;
+ tableName =
IgniteNameUtils.quoteIfNeeded(definition.qualifiedName.objectName());
+ schemaName =
IgniteNameUtils.quoteIfNeeded(definition.qualifiedName.schemaName());
ifNotExists = definition.ifNotExists;
columns = definition.columns;
pkType = definition.pkType;
@@ -559,8 +584,7 @@ public class TableDefinition {
*/
public TableDefinition build() {
return new TableDefinition(
- tableName,
- schemaName,
+ QualifiedName.of(schemaName, tableName),
ifNotExists,
columns,
pkType,
diff --git
a/modules/api/src/test/java/org/apache/ignite/catalog/definitions/TableDefinitionTest.java
b/modules/api/src/test/java/org/apache/ignite/catalog/definitions/TableDefinitionTest.java
new file mode 100644
index 00000000000..6df41448f59
--- /dev/null
+++
b/modules/api/src/test/java/org/apache/ignite/catalog/definitions/TableDefinitionTest.java
@@ -0,0 +1,161 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.catalog.definitions;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+import java.util.stream.Stream;
+import org.apache.ignite.lang.util.IgniteNameUtils;
+import org.apache.ignite.table.QualifiedName;
+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;
+
+/**
+ * Tests for {@link TableDefinition}.
+ */
+public class TableDefinitionTest {
+
+ @Test
+ public void tableNameMustBeNotNull() {
+ var err = assertThrows(NullPointerException.class, () ->
TableDefinition.builder((String) null));
+ assertEquals("Table name must not be null.", err.getMessage());
+ }
+
+ @Test
+ public void qualifiedNameMustBeNotNull() {
+ var err = assertThrows(NullPointerException.class, () ->
TableDefinition.builder((QualifiedName) null));
+ assertEquals("Qualified table name must not be null.",
err.getMessage());
+ }
+
+ @ParameterizedTest
+ @MethodSource("schemaAndTable")
+ public void testFromTableNameThenSetSchema(String schema, String table,
QualifiedName expected) {
+ TableDefinition def = TableDefinition.builder(table)
+ .schema(schema)
+ .build();
+
+ QualifiedName qualifiedName = def.qualifiedName();
+ assertEquals(expected, qualifiedName);
+
assertEquals(IgniteNameUtils.quoteIfNeeded(qualifiedName.schemaName()),
def.schemaName());
+
assertEquals(IgniteNameUtils.quoteIfNeeded(qualifiedName.objectName()),
def.tableName());
+
+ TableDefinition def2 = def.toBuilder().schema(schema).build();
+ assertEquals(def.qualifiedName(), def2.qualifiedName());
+ assertEquals(def.schemaName(), def2.schemaName());
+ assertEquals(def.tableName(), def2.tableName());
+
+ TableDefinition def3 =
TableDefinition.builder(def.qualifiedName()).build();
+ assertEquals(def.qualifiedName(), def3.qualifiedName());
+ assertEquals(def.schemaName(), def3.schemaName());
+ assertEquals(def.tableName(), def3.tableName());
+ }
+
+ @ParameterizedTest
+ @MethodSource("schemaAndTable")
+ public void testFromQualifiedNameThenSchema(String schema, String table,
QualifiedName expected) {
+ QualifiedName initialName = QualifiedName.of("ABC", table);
+ TableDefinition def = TableDefinition.builder(initialName)
+ .schema(schema)
+ .build();
+
+ QualifiedName qualifiedName = def.qualifiedName();
+ assertEquals(expected, qualifiedName);
+
assertEquals(IgniteNameUtils.quoteIfNeeded(qualifiedName.schemaName()),
def.schemaName());
+
assertEquals(IgniteNameUtils.quoteIfNeeded(qualifiedName.objectName()),
def.tableName());
+
+ TableDefinition def2 = def.toBuilder().schema(schema).build();
+ assertEquals(def.qualifiedName(), def2.qualifiedName());
+ assertEquals(def.schemaName(), def2.schemaName());
+ assertEquals(def.tableName(), def2.tableName());
+
+ TableDefinition def3 =
TableDefinition.builder(def.qualifiedName()).build();
+ assertEquals(def.qualifiedName(), def3.qualifiedName());
+ assertEquals(def.schemaName(), def3.schemaName());
+ assertEquals(def.tableName(), def3.tableName());
+ }
+
+ private static Stream<Arguments> schemaAndTable() {
+ return Stream.of(
+ Arguments.of("s", "a", QualifiedName.of("S", "A")),
+ Arguments.of("\"a Schema\"", "a", QualifiedName.of("\"a
Schema\"", "A")),
+ Arguments.of("\"a Schema\"", "\"a table\"",
QualifiedName.of("\"a Schema\"", "\"a table\"")),
+ Arguments.of("\"aSchema\"", "\"aTable\"",
QualifiedName.of("\"aSchema\"", "\"aTable\"")),
+ Arguments.of("\"a Schema\"", "\"atable\"",
QualifiedName.of("\"a Schema\"", "\"atable\"")),
+
+ Arguments.of("\"aSchema\"", "\"aTable \"\"X\"\" \"",
QualifiedName.of("\"aSchema\"", "\"aTable \"\"X\"\" \"")),
+ Arguments.of("\"aSchema\"", "\"\"\"atable\"\"\"",
QualifiedName.of("\"aSchema\"", "\"\"\"atable\"\"\"")),
+ Arguments.of("\"aSchema\"", "\"\"\"aTable\"\"\"",
QualifiedName.of("\"aSchema\"", "\"\"\"aTable\"\"\"")),
+ Arguments.of("\"aSchema\"", "\"\"\"ATABLE\"\"\"",
QualifiedName.of("\"aSchema\"", "\"\"\"ATABLE\"\"\""))
+ );
+ }
+
+ @ParameterizedTest
+ @MethodSource("overwriteSchemaArgs")
+ public void testFromTableNamePreservesTableNameWithSchemaChanges(String
tableName, QualifiedName expected) {
+ {
+ TableDefinition def = TableDefinition.builder(tableName)
+ .schema("A")
+ .schema("B")
+ .build();
+ assertEquals(expected, def.qualifiedName(), "overwrite once");
+ }
+ {
+ TableDefinition def = TableDefinition.builder(tableName)
+ .schema("X")
+ .schema("A")
+ .schema("B")
+ .build();
+ assertEquals(expected, def.qualifiedName(), "overwrite twice");
+ }
+ }
+
+ @ParameterizedTest
+ @MethodSource("overwriteSchemaArgs")
+ public void fromQualifiedNamePreservesTableNameWithSchemaChanges(String
tableName, QualifiedName expected) {
+ QualifiedName initialName = QualifiedName.of("S", tableName);
+ {
+ TableDefinition def = TableDefinition.builder(initialName)
+ .schema("A")
+ .schema("B")
+ .build();
+ assertEquals(expected, def.qualifiedName(), "overwrite once");
+ }
+ {
+ TableDefinition def = TableDefinition.builder(initialName)
+ .schema("X")
+ .schema("A")
+ .schema("B")
+ .build();
+ assertEquals(expected, def.qualifiedName(), "overwrite twice");
+ }
+ }
+
+ private static Stream<Arguments> overwriteSchemaArgs() {
+ return Stream.of(
+ Arguments.of("A", QualifiedName.of("B", "A")),
+ Arguments.of("Abc", QualifiedName.of("B", "ABC")),
+ Arguments.of("\"Abc\"", QualifiedName.of("B", "\"Abc\"")),
+ Arguments.of("\"abc\"", QualifiedName.of("B", "\"abc\"")),
+ Arguments.of("\"Abc \"\"0\"\" \"", QualifiedName.of("B",
"\"Abc \"\"0\"\" \"")),
+ Arguments.of("\"abc \"\"0\"\" \"", QualifiedName.of("B",
"\"abc \"\"0\"\" \""))
+ );
+ }
+}
diff --git
a/modules/catalog-dsl/src/integrationTest/java/org/apache/ignite/internal/catalog/ItCatalogDslTest.java
b/modules/catalog-dsl/src/integrationTest/java/org/apache/ignite/internal/catalog/ItCatalogDslTest.java
index 56043a1a278..2e6484993f3 100644
---
a/modules/catalog-dsl/src/integrationTest/java/org/apache/ignite/internal/catalog/ItCatalogDslTest.java
+++
b/modules/catalog-dsl/src/integrationTest/java/org/apache/ignite/internal/catalog/ItCatalogDslTest.java
@@ -46,6 +46,7 @@ import org.apache.ignite.catalog.ColumnType;
import org.apache.ignite.catalog.IgniteCatalog;
import org.apache.ignite.catalog.IndexType;
import org.apache.ignite.catalog.SortOrder;
+import org.apache.ignite.catalog.annotations.Id;
import org.apache.ignite.catalog.definitions.ColumnDefinition;
import org.apache.ignite.catalog.definitions.IndexDefinition;
import org.apache.ignite.catalog.definitions.TableDefinition;
@@ -83,9 +84,9 @@ class ItCatalogDslTest extends ClusterPerClassIntegrationTest
{
@AfterEach
void tearDown() {
- sql("DROP TABLE IF EXISTS " + POJO_KV_TABLE_NAME);
- sql("DROP TABLE IF EXISTS " + POJO_RECORD_TABLE_NAME);
- sql("DROP TABLE IF EXISTS " + EXPLICIT_QUOTES_TABLE_NAME);
+ dropAllTables();
+ dropAllSchemas();
+
sql("DROP ZONE IF EXISTS " + ZONE_NAME);
}
@@ -637,9 +638,9 @@ class ItCatalogDslTest extends
ClusterPerClassIntegrationTest {
TableDefinition table = catalog.tableDefinition(name);
assertNotNull(table);
// Table Name
- assertEquals("a b", table.tableName());
+ assertEquals("\"a b\"", table.tableName());
// Schema name
- assertEquals("Table Schema", table.schemaName());
+ assertEquals("\"Table Schema\"", table.schemaName());
// Column
List<ColumnDefinition> columns = table.columns();
@@ -662,7 +663,188 @@ class ItCatalogDslTest extends
ClusterPerClassIntegrationTest {
catalog.dropTable(table);
}
+ @Test
+ public void createDifferentSchemaFromDefinition() {
+ sql("CREATE SCHEMA s");
+
+ {
+ TableDefinition def = TableDefinition.builder(POJO_KV_TABLE_NAME)
+ .columns(column("id", INTEGER), column("fname", VARCHAR),
column("lname", VARCHAR))
+ .primaryKey("id")
+ .build();
+ Table table = catalog().createTable(def);
+ QualifiedName qualifiedName = QualifiedName.of("PUBLIC",
POJO_KV_TABLE_NAME);
+ assertEquals(qualifiedName, table.qualifiedName());
+
+ TableDefinition tableDef =
catalog().tableDefinition(def.qualifiedName());
+ assertEquals(qualifiedName, tableDef.qualifiedName());
+ assertEquals(POJO_KV_TABLE_NAME, tableDef.tableName());
+ assertEquals("PUBLIC", tableDef.schemaName());
+ }
+
+ {
+ TableDefinition def = TableDefinition.builder(POJO_KV_TABLE_NAME)
+ .schema("s")
+ .columns(column("id", INTEGER), column("fname", VARCHAR),
column("lname", VARCHAR))
+ .primaryKey("id")
+ .build();
+
+ Table table = catalog().createTable(def);
+ QualifiedName qualifiedName = QualifiedName.of("S",
POJO_KV_TABLE_NAME);
+ assertEquals(qualifiedName, table.qualifiedName());
+
+ TableDefinition tableDef =
catalog().tableDefinition(def.qualifiedName());
+ assertEquals(qualifiedName, tableDef.qualifiedName());
+ assertEquals(POJO_KV_TABLE_NAME, tableDef.tableName());
+ assertEquals("S", tableDef.schemaName());
+ }
+
+ // Quoted names
+ sql("CREATE SCHEMA \"a Schema\"");
+
+ {
+ TableDefinition def = TableDefinition.builder("A_TABLE")
+ .schema("\"a Schema\"")
+ .columns(column("id", INTEGER), column("fname", VARCHAR),
column("lname", VARCHAR))
+ .primaryKey("id")
+ .build();
+
+ Table table = catalog().createTable(def);
+ QualifiedName qualifiedName = QualifiedName.of("\"a Schema\"",
"A_TABLE");
+ assertEquals(qualifiedName, table.qualifiedName());
+
+ TableDefinition tableDef =
catalog().tableDefinition(def.qualifiedName());
+ assertEquals(qualifiedName, tableDef.qualifiedName());
+ assertEquals("A_TABLE", tableDef.tableName());
+ assertEquals("\"a Schema\"", tableDef.schemaName());
+ }
+
+ {
+ TableDefinition def = TableDefinition.builder("\"a tablE\"")
+ .schema("\"a Schema\"")
+ .columns(column("id", INTEGER), column("fname", VARCHAR),
column("lname", VARCHAR))
+ .primaryKey("id")
+ .build();
+
+ Table table = catalog().createTable(def);
+ QualifiedName qualifiedName = QualifiedName.of("\"a Schema\"",
"\"a tablE\"");
+ assertEquals(qualifiedName, table.qualifiedName());
+
+ TableDefinition tableDef =
catalog().tableDefinition(def.qualifiedName());
+ assertEquals(qualifiedName, tableDef.qualifiedName());
+ assertEquals("\"a tablE\"", tableDef.tableName());
+ assertEquals("\"a Schema\"", tableDef.schemaName());
+ }
+ }
+
+ @Test
+ public void createDifferentSchemaFromAnnotation() {
+ sql("CREATE SCHEMA s");
+
+ {
+ Table table = catalog().createTable(PojoClass1.class);
+ QualifiedName qualifiedName = QualifiedName.of("PUBLIC",
POJO_KV_TABLE_NAME);
+ assertEquals(qualifiedName, table.qualifiedName());
+
+ TableDefinition def = catalog().tableDefinition(qualifiedName);
+ assertEquals(qualifiedName, def.qualifiedName());
+ assertEquals(POJO_KV_TABLE_NAME, def.tableName());
+ assertEquals("PUBLIC", def.schemaName());
+ }
+
+ {
+ Table table = catalog().createTable(PojoClass2.class);
+ QualifiedName qualifiedName = QualifiedName.of("S",
POJO_KV_TABLE_NAME);
+ assertEquals(qualifiedName, table.qualifiedName());
+ assertEquals(qualifiedName,
catalog().tableDefinition(qualifiedName).qualifiedName());
+
+ TableDefinition def = catalog().tableDefinition(qualifiedName);
+ assertEquals(qualifiedName, def.qualifiedName());
+ assertEquals(POJO_KV_TABLE_NAME, def.tableName());
+ assertEquals("S", def.schemaName());
+ }
+
+ // Quoted names
+ sql("CREATE SCHEMA \"a Schema\"");
+
+ {
+ Table table = catalog().createTable(PojoClass3.class);
+ QualifiedName qualifiedName = QualifiedName.of("\"a Schema\"",
"A_TABLE");
+ assertEquals(qualifiedName, table.qualifiedName());
+
+ TableDefinition tableDef =
catalog().tableDefinition(qualifiedName);
+ assertEquals(qualifiedName, tableDef.qualifiedName());
+ assertEquals("A_TABLE", tableDef.tableName());
+ assertEquals("\"a Schema\"", tableDef.schemaName());
+ }
+
+ {
+ Table table = catalog().createTable(PojoClass4.class);
+ QualifiedName qualifiedName = QualifiedName.of("\"a Schema\"",
"\"a tablE\"");
+ assertEquals(qualifiedName, table.qualifiedName());
+ assertEquals(qualifiedName,
catalog().tableDefinition(qualifiedName).qualifiedName());
+
+ TableDefinition tableDef =
catalog().tableDefinition(qualifiedName);
+ assertEquals(qualifiedName, tableDef.qualifiedName());
+ assertEquals("\"a tablE\"", tableDef.tableName());
+ assertEquals("\"a Schema\"", tableDef.schemaName());
+ }
+ }
+
private static IgniteCatalog catalog() {
return CLUSTER.node(0).catalog();
}
+
+ @org.apache.ignite.catalog.annotations.Table(POJO_KV_TABLE_NAME)
+ private static class PojoClass1 {
+ @Id
+ @SuppressWarnings("unused")
+ Integer id;
+ @SuppressWarnings("unused")
+ String fname;
+ @SuppressWarnings("unused")
+ String lname;
+ }
+
+ @org.apache.ignite.catalog.annotations.Table(
+ value = POJO_KV_TABLE_NAME,
+ schemaName = "S"
+ )
+ private static class PojoClass2 {
+ @Id
+ @SuppressWarnings("unused")
+ Integer id;
+ @SuppressWarnings("unused")
+ String fname;
+ @SuppressWarnings("unused")
+ String lname;
+ }
+
+ @org.apache.ignite.catalog.annotations.Table(
+ value = "a_table",
+ schemaName = "\"a Schema\""
+ )
+ private static class PojoClass3 {
+ @Id
+ @SuppressWarnings("unused")
+ Integer id;
+ @SuppressWarnings("unused")
+ String fname;
+ @SuppressWarnings("unused")
+ String lname;
+ }
+
+ @org.apache.ignite.catalog.annotations.Table(
+ value = "\"a tablE\"",
+ schemaName = "\"a Schema\""
+ )
+ private static class PojoClass4 {
+ @Id
+ @SuppressWarnings("unused")
+ Integer id;
+ @SuppressWarnings("unused")
+ String fname;
+ @SuppressWarnings("unused")
+ String lname;
+ }
}
diff --git
a/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/CreateFromAnnotationsImpl.java
b/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/CreateFromAnnotationsImpl.java
index 17877abac8f..4617ea3eb2a 100644
---
a/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/CreateFromAnnotationsImpl.java
+++
b/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/CreateFromAnnotationsImpl.java
@@ -36,6 +36,7 @@ import org.apache.ignite.catalog.annotations.Index;
import org.apache.ignite.catalog.annotations.Table;
import org.apache.ignite.catalog.annotations.Zone;
import org.apache.ignite.sql.IgniteSql;
+import org.apache.ignite.table.QualifiedName;
class CreateFromAnnotationsImpl extends AbstractCatalogQuery<TableZoneId> {
private CreateZoneImpl createZone;
@@ -44,7 +45,7 @@ class CreateFromAnnotationsImpl extends
AbstractCatalogQuery<TableZoneId> {
private CreateTableImpl createTable;
- private String tableName;
+ private QualifiedName tableName;
private IndexType pkType;
@@ -98,8 +99,11 @@ class CreateFromAnnotationsImpl extends
AbstractCatalogQuery<TableZoneId> {
Table table = clazz.getAnnotation(Table.class);
if (table != null) {
String tableName = table.value().isEmpty() ? clazz.getSimpleName()
: table.value();
- createTable.name(table.schemaName(), tableName);
- this.tableName = tableName;
+ String schemaName = table.schemaName();
+ QualifiedName qualifiedName = QualifiedName.of(schemaName,
tableName);
+
+ this.tableName = qualifiedName;
+ createTable.name(qualifiedName);
processZone(table);
processTable(table);
diff --git
a/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/CreateFromDefinitionImpl.java
b/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/CreateFromDefinitionImpl.java
index adc4983ce3b..eecfa7fcf32 100644
---
a/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/CreateFromDefinitionImpl.java
+++
b/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/CreateFromDefinitionImpl.java
@@ -32,6 +32,7 @@ import org.apache.ignite.catalog.definitions.TableDefinition;
import org.apache.ignite.catalog.definitions.ZoneDefinition;
import org.apache.ignite.internal.util.StringUtils;
import org.apache.ignite.sql.IgniteSql;
+import org.apache.ignite.table.QualifiedName;
class CreateFromDefinitionImpl extends AbstractCatalogQuery<TableZoneId> {
private CreateZoneImpl createZone;
@@ -40,7 +41,7 @@ class CreateFromDefinitionImpl extends
AbstractCatalogQuery<TableZoneId> {
private CreateTableImpl createTable;
- private String tableName;
+ private QualifiedName tableName;
CreateFromDefinitionImpl(IgniteSql sql) {
super(sql);
@@ -96,9 +97,11 @@ class CreateFromDefinitionImpl extends
AbstractCatalogQuery<TableZoneId> {
CreateFromDefinitionImpl from(TableDefinition def) {
createTable = new CreateTableImpl(sql);
- String tableName = def.tableName();
- this.tableName = tableName;
- createTable.name(def.schemaName(), tableName);
+
+ QualifiedName qualifiedName = def.qualifiedName();
+ this.tableName = qualifiedName;
+ createTable.name(qualifiedName);
+
if (def.ifNotExists()) {
createTable.ifNotExists();
}
diff --git
a/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/CreateTableImpl.java
b/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/CreateTableImpl.java
index 826ce3e7aca..87cb8f4d91e 100644
---
a/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/CreateTableImpl.java
+++
b/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/CreateTableImpl.java
@@ -29,6 +29,7 @@ import org.apache.ignite.catalog.ColumnType;
import org.apache.ignite.catalog.IndexType;
import org.apache.ignite.catalog.SortOrder;
import org.apache.ignite.sql.IgniteSql;
+import org.apache.ignite.table.QualifiedName;
class CreateTableImpl extends AbstractCatalogQuery<Name> {
private Name tableName;
@@ -59,10 +60,10 @@ class CreateTableImpl extends AbstractCatalogQuery<Name> {
return tableName;
}
- CreateTableImpl name(String... names) {
- Objects.requireNonNull(names, "Table name must not be null.");
+ CreateTableImpl name(QualifiedName name) {
+ Objects.requireNonNull(name, "Table name must not be null.");
- this.tableName = Name.compound(names);
+ this.tableName = Name.qualified(name);
return this;
}
diff --git
a/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/DropTableImpl.java
b/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/DropTableImpl.java
index 8dae6e86adf..c924df8fccf 100644
---
a/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/DropTableImpl.java
+++
b/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/DropTableImpl.java
@@ -19,6 +19,7 @@ package org.apache.ignite.internal.catalog.sql;
import java.util.Objects;
import org.apache.ignite.sql.IgniteSql;
+import org.apache.ignite.table.QualifiedName;
class DropTableImpl extends AbstractCatalogQuery<Name> {
private Name tableName;
@@ -34,10 +35,10 @@ class DropTableImpl extends AbstractCatalogQuery<Name> {
return tableName;
}
- DropTableImpl name(String... names) {
- Objects.requireNonNull(names, "Table name must not be null");
+ DropTableImpl name(QualifiedName name) {
+ Objects.requireNonNull(name, "Table name must not be null");
- this.tableName = Name.compound(names);
+ this.tableName = Name.qualified(name);
return this;
}
diff --git
a/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/IgniteCatalogSqlImpl.java
b/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/IgniteCatalogSqlImpl.java
index d8fb4b6cde5..368b3a5027d 100644
---
a/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/IgniteCatalogSqlImpl.java
+++
b/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/IgniteCatalogSqlImpl.java
@@ -156,7 +156,7 @@ public class IgniteCatalogSqlImpl implements IgniteCatalog {
@Override
public CompletableFuture<Void> dropTableAsync(TableDefinition definition) {
return new DropTableImpl(sql)
- .name(definition.schemaName(), definition.tableName())
+ .name(definition.qualifiedName())
.ifExists()
.executeAsync()
.thenApply(unused -> null);
@@ -165,7 +165,7 @@ public class IgniteCatalogSqlImpl implements IgniteCatalog {
@Override
public CompletableFuture<Void> dropTableAsync(QualifiedName name) {
return new DropTableImpl(sql)
- .name(name.schemaName(), name.objectName())
+ .name(name)
.ifExists()
.executeAsync()
.thenApply(unused -> null);
diff --git
a/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/Name.java
b/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/Name.java
index f14e34ba6ec..6ea46f9cc54 100644
---
a/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/Name.java
+++
b/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/Name.java
@@ -17,10 +17,9 @@
package org.apache.ignite.internal.catalog.sql;
-import java.util.ArrayList;
-import java.util.Arrays;
import java.util.List;
import org.apache.ignite.lang.util.IgniteNameUtils;
+import org.apache.ignite.table.QualifiedName;
/**
* SQL identifier.
@@ -28,6 +27,8 @@ import org.apache.ignite.lang.util.IgniteNameUtils;
class Name extends QueryPart {
private final List<String> names;
+ private final QualifiedName qualifiedName;
+
/**
* Creates a simple name.
*
@@ -39,35 +40,18 @@ class Name extends QueryPart {
}
/**
- * Creates a compound name (e.g. {@code my_schema.my_table} or {@code
my_table}). Accepts both simple and compound names.
+ * Creates a name from a qualified name.
*
- * @param names Array of names.
+ * @param qualifiedName Qualified name.
* @return Name.
*/
- static Name compound(String... names) {
- List<String> parts = new ArrayList<>(2);
-
- if (names.length == 0) {
- throw new IllegalArgumentException("Names can not be empty");
- } else if (names.length == 1) {
- return new Name(Arrays.asList(names));
- } else {
- boolean canSkipEmpty = true;
- for (String part : names) {
- if (part == null || part.isEmpty()) {
- if (canSkipEmpty) {
- canSkipEmpty = false;
- continue;
- }
- } else {
- // Do not allow non-leading elements to be empty
- canSkipEmpty = false;
- }
- parts.add(part);
- }
+ static Name qualified(QualifiedName qualifiedName) {
+ return new Name(qualifiedName);
+ }
- return new Name(parts);
- }
+ private Name(QualifiedName qualifiedName) {
+ this.qualifiedName = qualifiedName;
+ this.names = null;
}
private Name(List<String> names) {
@@ -76,27 +60,34 @@ class Name extends QueryPart {
throw new IllegalArgumentException("Name parts can not be null
or empty: " + names);
}
}
+ this.qualifiedName = null;
this.names = names;
}
@Override
protected void accept(QueryContext ctx) {
- String separator = "";
- for (String name : names) {
- // If a name is quoted, we must preserve case sensitivity -> write
it as is
- // If a name UPPER(name) is a valid normalized id, then this is a
case insensitive name, write it in uppercase for consistency.
- // Otherwise we must quote it.
- if (name.startsWith("\"")) {
- ctx.sql(separator).sql(name);
- } else {
- String upperCase = name.toUpperCase();
- if (IgniteNameUtils.isValidNormalizedIdentifier(upperCase)) {
- ctx.sql(separator).sql(upperCase);
+ if (qualifiedName != null) {
+ ctx.sql(qualifiedName.toCanonicalForm());
+ } else {
+ assert names != null : "Names must be specified";
+
+ String separator = "";
+ for (String name : names) {
+ // If a name is quoted, we must preserve case sensitivity ->
write it as is
+ // If a name UPPER(name) is a valid normalized id, then this
is a case insensitive name,
+ // write it in uppercase for consistency. Otherwise we must
quote it.
+ if (name.startsWith("\"")) {
+ ctx.sql(separator).sql(name);
} else {
-
ctx.sql(separator).sql(IgniteNameUtils.quoteIfNeeded(name));
+ String upperCase = name.toUpperCase();
+ if
(IgniteNameUtils.isValidNormalizedIdentifier(upperCase)) {
+ ctx.sql(separator).sql(upperCase);
+ } else {
+
ctx.sql(separator).sql(IgniteNameUtils.quoteIfNeeded(name));
+ }
}
+ separator = ".";
}
- separator = ".";
}
}
}
diff --git
a/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/TableDefinitionCollector.java
b/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/TableDefinitionCollector.java
index 78bbc900c39..78cc03c75e3 100644
---
a/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/TableDefinitionCollector.java
+++
b/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/TableDefinitionCollector.java
@@ -109,8 +109,7 @@ class TableDefinitionCollector {
List<String> colocationColumnList = new
ArrayList<>(colocationColumns.values());
- Builder builder =
TableDefinition.builder(tableName.objectName())
- .schema(tableName.schemaName())
+ Builder builder = TableDefinition.builder(tableName)
.zone(zoneName)
.columns(columns)
.colocateBy(colocationColumnList);
diff --git
a/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/TableZoneId.java
b/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/TableZoneId.java
index d4154b20fe6..886224f1def 100644
---
a/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/TableZoneId.java
+++
b/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/TableZoneId.java
@@ -17,23 +17,24 @@
package org.apache.ignite.internal.catalog.sql;
+import org.apache.ignite.table.QualifiedName;
import org.jetbrains.annotations.Nullable;
/**
* Composite class for table and zone names.
*/
public class TableZoneId {
- private final String tableName;
+ private final QualifiedName tableName;
@Nullable
private final String zoneName;
- public TableZoneId(String tableName, @Nullable String zoneName) {
+ public TableZoneId(QualifiedName tableName, @Nullable String zoneName) {
this.tableName = tableName;
this.zoneName = zoneName;
}
- public String tableName() {
+ public QualifiedName tableName() {
return tableName;
}
diff --git
a/modules/catalog-dsl/src/test/java/org/apache/ignite/internal/catalog/sql/CreateFromAnnotationsTest.java
b/modules/catalog-dsl/src/test/java/org/apache/ignite/internal/catalog/sql/CreateFromAnnotationsTest.java
index 7d84b905478..0fef6f87728 100644
---
a/modules/catalog-dsl/src/test/java/org/apache/ignite/internal/catalog/sql/CreateFromAnnotationsTest.java
+++
b/modules/catalog-dsl/src/test/java/org/apache/ignite/internal/catalog/sql/CreateFromAnnotationsTest.java
@@ -370,8 +370,8 @@ class CreateFromAnnotationsTest {
@SuppressWarnings("unused")
@Table(
- value = "pojo test",
- schemaName = "sche ma",
+ value = "\"pojo test\"",
+ schemaName = "\"sche ma\"",
zone = @Zone(
value = "zone test",
partitions = 1,
diff --git
a/modules/catalog-dsl/src/test/java/org/apache/ignite/internal/catalog/sql/CreateFromDefinitionTest.java
b/modules/catalog-dsl/src/test/java/org/apache/ignite/internal/catalog/sql/CreateFromDefinitionTest.java
index e2023d4ed5c..ba7c013fdc6 100644
---
a/modules/catalog-dsl/src/test/java/org/apache/ignite/internal/catalog/sql/CreateFromDefinitionTest.java
+++
b/modules/catalog-dsl/src/test/java/org/apache/ignite/internal/catalog/sql/CreateFromDefinitionTest.java
@@ -135,9 +135,9 @@ class CreateFromDefinitionTest {
@Test
void createFromTableBuilderQuoteNames() {
- TableDefinition table = TableDefinition.builder("builder test")
+ TableDefinition table = TableDefinition.builder("\"builder test\"")
.ifNotExists()
- .schema("sche ma")
+ .schema("\"sche ma\"")
.colocateBy("id", "id str")
.zone("zone test")
.columns(
@@ -240,6 +240,37 @@ class CreateFromDefinitionTest {
);
}
+ @Test
+ void createFromDefinitionDifferentCase() {
+ String tableName = "Table";
+ String quoted = String.format("\"%s\"", tableName);
+
+ {
+ TableDefinition definition = TableDefinition.builder(quoted)
+ .columns(column("id", INTEGER), column("col1", VARCHAR),
column("col2", VARCHAR))
+ .primaryKey("id")
+ .build();
+
+ assertThat(
+ createTable(definition),
+ is("CREATE TABLE PUBLIC.\"Table\" (ID INT, COL1 VARCHAR,
COL2 VARCHAR, PRIMARY KEY (ID));")
+ );
+ }
+
+ {
+ TableDefinition definition = TableDefinition.builder(quoted)
+ .schema("\"Nice\"")
+ .columns(column("id", INTEGER), column("col1", VARCHAR),
column("col2", VARCHAR))
+ .primaryKey("id")
+ .build();
+
+ assertThat(
+ createTable(definition),
+ is("CREATE TABLE \"Nice\".\"Table\" (ID INT, COL1 VARCHAR,
COL2 VARCHAR, PRIMARY KEY (ID));")
+ );
+ }
+ }
+
@SuppressWarnings("unused")
private static class PojoKey {
@Id
diff --git
a/modules/catalog-dsl/src/test/java/org/apache/ignite/internal/catalog/sql/CreateTableTest.java
b/modules/catalog-dsl/src/test/java/org/apache/ignite/internal/catalog/sql/CreateTableTest.java
index f4ff333f7e4..c3769a3514a 100644
---
a/modules/catalog-dsl/src/test/java/org/apache/ignite/internal/catalog/sql/CreateTableTest.java
+++
b/modules/catalog-dsl/src/test/java/org/apache/ignite/internal/catalog/sql/CreateTableTest.java
@@ -27,104 +27,105 @@ import java.util.List;
import org.apache.ignite.catalog.ColumnSorted;
import org.apache.ignite.catalog.IndexType;
import org.apache.ignite.catalog.SortOrder;
+import org.apache.ignite.table.QualifiedName;
import org.junit.jupiter.api.Test;
class CreateTableTest {
@Test
void ifNotExists() {
- Query query1 =
createTable().ifNotExists().name("table1").addColumn("col1", INTEGER);
+ Query query1 =
createTable().ifNotExists().name(QualifiedName.parse("table1")).addColumn("col1",
INTEGER);
String sql = query1.toString();
- assertThat(sql, is("CREATE TABLE IF NOT EXISTS TABLE1 (COL1 INT);"));
+ assertThat(sql, is("CREATE TABLE IF NOT EXISTS PUBLIC.TABLE1 (COL1
INT);"));
}
@Test
void names() {
- Query query1 = createTable().name("", "table1").addColumn("col1",
INTEGER);
+ Query query1 =
createTable().name(QualifiedName.parse("table1")).addColumn("col1", INTEGER);
String sql = query1.toString();
- assertThat(sql, is("CREATE TABLE TABLE1 (COL1 INT);"));
+ assertThat(sql, is("CREATE TABLE PUBLIC.TABLE1 (COL1 INT);"));
- Query query2 = createTable().name(null, "table1").addColumn("col1",
INTEGER);
+ Query query2 =
createTable().name(QualifiedName.parse("public.table1")).addColumn("col1",
INTEGER);
sql = query2.toString();
- assertThat(sql, is("CREATE TABLE TABLE1 (COL1 INT);"));
+ assertThat(sql, is("CREATE TABLE PUBLIC.TABLE1 (COL1 INT);"));
- Query query3 = createTable().name("public",
"table1").addColumn("col1", INTEGER);
+ Query query3 = createTable().name(QualifiedName.parse("PUBLIC.\"Tabl
e\"")).addColumn("col1", INTEGER);
sql = query3.toString();
- assertThat(sql, is("CREATE TABLE PUBLIC.TABLE1 (COL1 INT);"));
+ assertThat(sql, is("CREATE TABLE PUBLIC.\"Tabl e\" (COL1 INT);"));
- Query query4 = createTable().name("public", "Tabl
e").addColumn("col1", INTEGER);
+ Query query4 = createTable().name(QualifiedName.parse("\"PUB
lic\".\"Tabl e\"")).addColumn("col1", INTEGER);
sql = query4.toString();
- assertThat(sql, is("CREATE TABLE PUBLIC.\"Tabl e\" (COL1 INT);"));
+ assertThat(sql, is("CREATE TABLE \"PUB lic\".\"Tabl e\" (COL1 INT);"));
- Query query5 = createTable().name("PUB lic", "Tabl
e").addColumn("col1", INTEGER);
+ Query query5 = createTable().name(QualifiedName.parse("\"PUB
lic\".\"MyTable\"")).addColumn("col1", INTEGER);
sql = query5.toString();
- assertThat(sql, is("CREATE TABLE \"PUB lic\".\"Tabl e\" (COL1 INT);"));
+ assertThat(sql, is("CREATE TABLE \"PUB lic\".\"MyTable\" (COL1
INT);"));
}
@Test
void columns() {
- Query query3 = createTable().name("table1")
+ Query query3 = createTable().name(QualifiedName.fromSimple("table1"))
.addColumn("col", INTEGER);
String sql = query3.toString();
- assertThat(sql, is("CREATE TABLE TABLE1 (COL INT);"));
+ assertThat(sql, is("CREATE TABLE PUBLIC.TABLE1 (COL INT);"));
- Query query2 = createTable().name("table1")
+ Query query2 = createTable().name(QualifiedName.fromSimple("table1"))
.addColumn("col1", INTEGER)
.addColumn("col2", INTEGER);
sql = query2.toString();
- assertThat(sql, is("CREATE TABLE TABLE1 (COL1 INT, COL2 INT);"));
+ assertThat(sql, is("CREATE TABLE PUBLIC.TABLE1 (COL1 INT, COL2
INT);"));
}
@Test
void primaryKey() {
- Query query5 = createTable().name("table1")
+ Query query5 = createTable().name(QualifiedName.fromSimple("table1"))
.addColumn("col", INTEGER)
.primaryKey(List.of("col"));
String sql = query5.toString();
- assertThat(sql, is("CREATE TABLE TABLE1 (COL INT, PRIMARY KEY
(COL));"));
+ assertThat(sql, is("CREATE TABLE PUBLIC.TABLE1 (COL INT, PRIMARY KEY
(COL));"));
- Query query4 = createTable().name("table1")
+ Query query4 = createTable().name(QualifiedName.fromSimple("table1"))
.addColumn("col1", INTEGER)
.addColumn("col2", INTEGER)
.primaryKey(List.of("col1", "col2"));
sql = query4.toString();
- assertThat(sql, is("CREATE TABLE TABLE1 (COL1 INT, COL2 INT, PRIMARY
KEY (COL1, COL2));"));
+ assertThat(sql, is("CREATE TABLE PUBLIC.TABLE1 (COL1 INT, COL2 INT,
PRIMARY KEY (COL1, COL2));"));
- Query query3 = createTable().name("table1")
+ Query query3 = createTable().name(QualifiedName.fromSimple("table1"))
.addColumn("col1", INTEGER)
.primaryKey(IndexType.SORTED,
List.of(ColumnSorted.column("col1", SortOrder.ASC_NULLS_FIRST)));
sql = query3.toString();
- assertThat(sql, is("CREATE TABLE TABLE1 (COL1 INT, PRIMARY KEY USING
SORTED (COL1 ASC NULLS FIRST));"));
+ assertThat(sql, is("CREATE TABLE PUBLIC.TABLE1 (COL1 INT, PRIMARY KEY
USING SORTED (COL1 ASC NULLS FIRST));"));
}
@Test
void colocateBy() {
- Query query5 = createTable().name("table1").addColumn("col1", INTEGER)
+ Query query5 =
createTable().name(QualifiedName.fromSimple("table1")).addColumn("col1",
INTEGER)
.colocateBy("col1");
String sql = query5.toString();
- assertThat(sql, is("CREATE TABLE TABLE1 (COL1 INT) COLOCATE BY
(COL1);"));
+ assertThat(sql, is("CREATE TABLE PUBLIC.TABLE1 (COL1 INT) COLOCATE BY
(COL1);"));
- Query query4 = createTable().name("table1").addColumn("col1", INTEGER)
+ Query query4 =
createTable().name(QualifiedName.fromSimple("table1")).addColumn("col1",
INTEGER)
.colocateBy("col1", "col2");
sql = query4.toString();
- assertThat(sql, is("CREATE TABLE TABLE1 (COL1 INT) COLOCATE BY (COL1,
COL2);"));
+ assertThat(sql, is("CREATE TABLE PUBLIC.TABLE1 (COL1 INT) COLOCATE BY
(COL1, COL2);"));
- Query query3 = createTable().name("table1").addColumn("col1", INTEGER)
+ Query query3 =
createTable().name(QualifiedName.fromSimple("table1")).addColumn("col1",
INTEGER)
.colocateBy("col1", "col2");
sql = query3.toString();
- assertThat(sql, is("CREATE TABLE TABLE1 (COL1 INT) COLOCATE BY (COL1,
COL2);"));
+ assertThat(sql, is("CREATE TABLE PUBLIC.TABLE1 (COL1 INT) COLOCATE BY
(COL1, COL2);"));
}
@Test
void withOptions() {
- Query query1 = createTable().name("table1").addColumn("col1", INTEGER)
+ Query query1 =
createTable().name(QualifiedName.fromSimple("table1")).addColumn("col1",
INTEGER)
.zone("zone1");
String sql = query1.toString(); // zone param is lowercase
- assertThat(sql, is("CREATE TABLE TABLE1 (COL1 INT) ZONE ZONE1;")); //
zone result is uppercase
+ assertThat(sql, is("CREATE TABLE PUBLIC.TABLE1 (COL1 INT) ZONE
ZONE1;")); // zone result is uppercase
}
@Test
void index() {
- Query query3 = createTable().name("table1").addColumn("col1", INTEGER)
+ Query query3 =
createTable().name(QualifiedName.fromSimple("table1")).addColumn("col1",
INTEGER)
.addIndex("ix_test1", IndexType.SORTED,
List.of(
ColumnSorted.column("col1"),
@@ -132,17 +133,17 @@ class CreateTableTest {
)
);
String sql = query3.toString();
- assertThat(sql, endsWith("CREATE INDEX IF NOT EXISTS IX_TEST1 ON
TABLE1 USING SORTED (COL1, COL2_UPPER DESC NULLS LAST);"));
+ assertThat(sql, endsWith("CREATE INDEX IF NOT EXISTS IX_TEST1 ON
PUBLIC.TABLE1 USING SORTED (COL1, COL2_UPPER DESC NULLS LAST);"));
- Query query2 = createTable().name("table1").addColumn("col1", INTEGER)
+ Query query2 =
createTable().name(QualifiedName.fromSimple("table1")).addColumn("col1",
INTEGER)
.addIndex("ix_test1", IndexType.HASH,
List.of(ColumnSorted.column("col1")));
sql = query2.toString();
- assertThat(sql, endsWith("CREATE INDEX IF NOT EXISTS IX_TEST1 ON
TABLE1 USING HASH (COL1);"));
+ assertThat(sql, endsWith("CREATE INDEX IF NOT EXISTS IX_TEST1 ON
PUBLIC.TABLE1 USING HASH (COL1);"));
- Query query4 = createTable().name("table1").addColumn("col1", INTEGER)
+ Query query4 =
createTable().name(QualifiedName.fromSimple("table1")).addColumn("col1",
INTEGER)
.addIndex("ix_test1", IndexType.HASH,
List.of(ColumnSorted.column("col1", SortOrder.DEFAULT)));
sql = query4.toString();
- assertThat(sql, endsWith("CREATE INDEX IF NOT EXISTS IX_TEST1 ON
TABLE1 USING HASH (COL1);"));
+ assertThat(sql, endsWith("CREATE INDEX IF NOT EXISTS IX_TEST1 ON
PUBLIC.TABLE1 USING HASH (COL1);"));
SortOrder[] invalidSortOrders = {
SortOrder.DESC,
@@ -158,7 +159,7 @@ class CreateTableTest {
for (SortOrder order : invalidSortOrders) {
assertThrows(
IllegalArgumentException.class,
- () -> createTable().name("table1").addColumn("col1",
INTEGER)
+ () ->
createTable().name(QualifiedName.fromSimple("table1")).addColumn("col1",
INTEGER)
.addIndex("ix_test1", IndexType.HASH,
List.of(ColumnSorted.column("col1", order))),
"Index columns must not define a sort order in hash
indexes."
);
diff --git
a/modules/catalog-dsl/src/test/java/org/apache/ignite/internal/catalog/sql/DropTableTest.java
b/modules/catalog-dsl/src/test/java/org/apache/ignite/internal/catalog/sql/DropTableTest.java
index afea81d4420..951f0d523e4 100644
---
a/modules/catalog-dsl/src/test/java/org/apache/ignite/internal/catalog/sql/DropTableTest.java
+++
b/modules/catalog-dsl/src/test/java/org/apache/ignite/internal/catalog/sql/DropTableTest.java
@@ -20,22 +20,26 @@ package org.apache.ignite.internal.catalog.sql;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
+import org.apache.ignite.table.QualifiedName;
import org.junit.jupiter.api.Test;
class DropTableTest {
@Test
void testDropTable() {
- Query query1 = dropTable().name("table1");
+ Query query1 = dropTable().name(QualifiedName.parse("table1"));
String sql = query1.toString();
- assertThat(sql, is("DROP TABLE TABLE1;"));
+ assertThat(sql, is("DROP TABLE PUBLIC.TABLE1;"));
- Query query2 = dropTable().ifExists().name("table1");
- sql = query2.toString();
- assertThat(sql, is("DROP TABLE IF EXISTS TABLE1;"));
+ Query query2 =
dropTable().ifExists().name(QualifiedName.parse("table1"));
+ assertThat(query2.toString(), is("DROP TABLE IF EXISTS
PUBLIC.TABLE1;"));
- Query query3 = dropTable().ifExists().name("a b");
+ Query query3 = dropTable().ifExists().name(QualifiedName.parse("\"a
b\""));
sql = query3.toString();
- assertThat(sql, is("DROP TABLE IF EXISTS \"a b\";"));
+ assertThat(sql, is("DROP TABLE IF EXISTS PUBLIC.\"a b\";"));
+
+ Query query4 = dropTable().name(QualifiedName.parse("\"MyTable\""));
+ sql = query4.toString();
+ assertThat(sql, is("DROP TABLE PUBLIC.\"MyTable\";"));
}
private static DropTableImpl dropTable() {
diff --git
a/modules/catalog-dsl/src/test/java/org/apache/ignite/internal/catalog/sql/QueryPartTest.java
b/modules/catalog-dsl/src/test/java/org/apache/ignite/internal/catalog/sql/QueryPartTest.java
index 9f74da0517f..e76733987fd 100644
---
a/modules/catalog-dsl/src/test/java/org/apache/ignite/internal/catalog/sql/QueryPartTest.java
+++
b/modules/catalog-dsl/src/test/java/org/apache/ignite/internal/catalog/sql/QueryPartTest.java
@@ -41,13 +41,13 @@ import static
org.apache.ignite.internal.catalog.sql.ColumnTypeImpl.wrap;
import static
org.apache.ignite.internal.catalog.sql.IndexColumnImpl.parseColumn;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
-import static org.junit.jupiter.api.Assertions.assertThrows;
import java.math.BigDecimal;
import java.util.List;
import org.apache.ignite.catalog.ColumnType;
import org.apache.ignite.catalog.IndexType;
import org.apache.ignite.catalog.SortOrder;
+import org.apache.ignite.table.QualifiedName;
import org.junit.jupiter.api.Test;
class QueryPartTest {
@@ -78,19 +78,13 @@ class QueryPartTest {
}
@Test
- void compoundNamePart() {
- assertThat(sql(Name.compound("a")), is("A"));
- assertThat(sql(Name.compound("A")), is("A"));
- assertThat(sql(Name.compound(null, "a")), is("A"));
- assertThat(sql(Name.compound("", "a")), is("A"));
- assertThat(sql(Name.compound("a", "b", "c")), is("A.B.C"));
- assertThat(sql(Name.compound("a", "aB Cd")), is("A.\"aB Cd\""));
-
- assertThrows(IllegalArgumentException.class, () -> Name.compound("",
"", "a"));
- assertThrows(IllegalArgumentException.class, () -> Name.compound("a",
""));
- assertThrows(IllegalArgumentException.class, () -> Name.compound("a",
"", "b"));
- assertThrows(IllegalArgumentException.class, () -> Name.compound("a",
null));
- assertThrows(IllegalArgumentException.class, () -> Name.compound("a",
null, "b"));
+ void qualifiedNamePart() {
+ assertThat(sql(Name.qualified(QualifiedName.fromSimple("a"))),
is("PUBLIC.A"));
+ assertThat(sql(Name.qualified(QualifiedName.parse("a.b"))), is("A.B"));
+ assertThat(sql(Name.qualified(QualifiedName.parse("\"Ab\""))),
is("PUBLIC.\"Ab\""));
+ assertThat(sql(Name.qualified(QualifiedName.parse("\"a b\""))),
is("PUBLIC.\"a b\""));
+ assertThat(sql(Name.qualified(QualifiedName.parse("\"a b\".\"c
d\""))), is("\"a b\".\"c d\""));
+ assertThat(sql(Name.qualified(QualifiedName.of("\"a b\"", "\"c
d\""))), is("\"a b\".\"c d\""));
}
@Test