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

vpyatkov 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 75d93a2482 IGNITE-23449 Add support of the new flag HA in zone 
description (#4667)
75d93a2482 is described below

commit 75d93a2482463c5461cb095790348791399038ab
Author: Cyrill <[email protected]>
AuthorDate: Thu Nov 7 09:34:02 2024 +0300

    IGNITE-23449 Add support of the new flag HA in zone description (#4667)
---
 .../apache/ignite/catalog/annotations/Zone.java    |   7 ++
 .../ignite/catalog/definitions/ZoneDefinition.java |  35 +++++-
 .../ignite/internal/catalog/ItCatalogDslTest.java  |   3 +
 .../internal/matcher/ZoneDefinitionMatcher.java    |  18 +++-
 .../catalog/sql/CreateFromAnnotationsImpl.java     |   4 +
 .../catalog/sql/CreateFromDefinitionImpl.java      |   4 +
 .../internal/catalog/sql/CreateZoneImpl.java       |  15 +++
 .../internal/catalog/sql/IgniteCatalogSqlImpl.java |   7 +-
 .../apache/ignite/internal/catalog/sql/Option.java |   4 +
 .../catalog/sql/CreateFromAnnotationsTest.java     |  49 ++++++++-
 .../catalog/sql/CreateFromDefinitionTest.java      |  22 +++-
 .../catalog/CatalogParamsValidationUtils.java      |  13 +++
 .../catalog/commands/AlterZoneCommand.java         |   3 +-
 .../internal/catalog/commands/CatalogUtils.java    |   3 +
 .../catalog/commands/CreateZoneCommand.java        |  26 ++++-
 .../catalog/commands/CreateZoneCommandBuilder.java |   9 ++
 .../catalog/commands/RenameZoneCommand.java        |   3 +-
 .../catalog/descriptors/CatalogZoneDescriptor.java |  27 ++++-
 .../catalog/descriptors/ConsistencyMode.java       |  66 ++++++++++++
 .../systemviews/ZonesSystemViewProvider.java       |   1 +
 .../commands/AbstractCommandValidationTest.java    |  13 ++-
 .../commands/CreateZoneCommandValidationTest.java  |  10 ++
 .../descriptors/CatalogZoneDescriptorTest.java     |   4 +-
 .../storage/CatalogEntrySerializationTest.java     |   4 +-
 .../ignite/client/handler/FakeCatalogService.java  |  14 ++-
 .../internal/sql/engine/ItZonesSystemViewTest.java | 118 +++++++++++++++++++--
 .../prepare/ddl/DdlSqlToCommandConverter.java      |  22 +++-
 .../sql/engine/prepare/ddl/ZoneOptionEnum.java     |   5 +-
 .../DistributionZoneSqlToCommandConverterTest.java |  57 ++++++++++
 .../sql/DistributionZoneSqlDdlParserTest.java      |   7 +-
 30 files changed, 537 insertions(+), 36 deletions(-)

diff --git 
a/modules/api/src/main/java/org/apache/ignite/catalog/annotations/Zone.java 
b/modules/api/src/main/java/org/apache/ignite/catalog/annotations/Zone.java
index ce0d9db8c7..db2ad910ba 100644
--- a/modules/api/src/main/java/org/apache/ignite/catalog/annotations/Zone.java
+++ b/modules/api/src/main/java/org/apache/ignite/catalog/annotations/Zone.java
@@ -90,4 +90,11 @@ public @interface Zone {
      * @return Nodes filter.
      */
     String filter() default "";
+
+    /**
+     * Consistency mode.
+     *
+     * @return Consistency mode.
+     */
+    String consistencyMode() default "";
 }
diff --git 
a/modules/api/src/main/java/org/apache/ignite/catalog/definitions/ZoneDefinition.java
 
b/modules/api/src/main/java/org/apache/ignite/catalog/definitions/ZoneDefinition.java
index 605f4c2918..5259f1f539 100644
--- 
a/modules/api/src/main/java/org/apache/ignite/catalog/definitions/ZoneDefinition.java
+++ 
b/modules/api/src/main/java/org/apache/ignite/catalog/definitions/ZoneDefinition.java
@@ -43,6 +43,8 @@ public class ZoneDefinition {
 
     private final String storageProfiles;
 
+    private final String consistencyMode;
+
     private ZoneDefinition(
             String zoneName,
             boolean ifNotExists,
@@ -53,7 +55,8 @@ public class ZoneDefinition {
             Integer dataNodesAutoAdjustScaleUp,
             Integer dataNodesAutoAdjustScaleDown,
             String filter,
-            String storageProfiles
+            String storageProfiles,
+            String consistencyMode
     ) {
         this.zoneName = zoneName;
         this.ifNotExists = ifNotExists;
@@ -65,6 +68,7 @@ public class ZoneDefinition {
         this.dataNodesAutoAdjustScaleDown = dataNodesAutoAdjustScaleDown;
         this.filter = filter;
         this.storageProfiles = storageProfiles;
+        this.consistencyMode = consistencyMode;
     }
 
     /**
@@ -167,6 +171,15 @@ public class ZoneDefinition {
         return storageProfiles;
     }
 
+    /**
+     * Returns consistency mode.
+     *
+     * @return Consistency mode.
+     */
+    public String consistencyMode() {
+        return consistencyMode;
+    }
+
     /**
      * Returns new builder using this definition.
      *
@@ -189,6 +202,7 @@ public class ZoneDefinition {
                 + ", dataNodesAutoAdjustScaleDown=" + 
dataNodesAutoAdjustScaleDown
                 + ", filter='" + filter + '\''
                 + ", storageProfiles='" + storageProfiles + '\''
+                + ", consistencyMode='" + consistencyMode + '\''
                 + '}';
     }
 
@@ -216,6 +230,8 @@ public class ZoneDefinition {
 
         private String storageProfiles;
 
+        private String consistencyMode;
+
         private Builder() {}
 
         private Builder(ZoneDefinition definition) {
@@ -229,6 +245,7 @@ public class ZoneDefinition {
             dataNodesAutoAdjustScaleDown = 
definition.dataNodesAutoAdjustScaleDown;
             filter = definition.filter;
             storageProfiles = definition.storageProfiles;
+            consistencyMode = definition.consistencyMode;
         }
 
         /**
@@ -370,6 +387,19 @@ public class ZoneDefinition {
             return this;
         }
 
+        /**
+         * Sets consistency mode.
+         *
+         * @param consistencyMode Consistency mode.
+         * @return This builder instance.
+         */
+        public Builder consistencyMode(String consistencyMode) {
+            Objects.requireNonNull(consistencyMode, "Consistency mode must not 
be null.");
+
+            this.consistencyMode = consistencyMode;
+            return this;
+        }
+
         /**
          * Builds the zone definition.
          *
@@ -386,7 +416,8 @@ public class ZoneDefinition {
                     dataNodesAutoAdjustScaleUp,
                     dataNodesAutoAdjustScaleDown,
                     filter,
-                    storageProfiles
+                    storageProfiles,
+                    consistencyMode
             );
         }
     }
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 fd00e0546b..5dad3db755 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
@@ -40,6 +40,7 @@ import org.apache.ignite.catalog.definitions.ColumnDefinition;
 import org.apache.ignite.catalog.definitions.TableDefinition;
 import org.apache.ignite.catalog.definitions.ZoneDefinition;
 import org.apache.ignite.internal.ClusterPerClassIntegrationTest;
+import org.apache.ignite.internal.catalog.descriptors.ConsistencyMode;
 import org.apache.ignite.internal.matcher.TableDefinitionMatcher;
 import org.apache.ignite.internal.matcher.ZoneDefinitionMatcher;
 import org.apache.ignite.sql.SqlException;
@@ -300,6 +301,7 @@ class ItCatalogDslTest extends 
ClusterPerClassIntegrationTest {
                 .dataNodesAutoAdjustScaleUp(1)
                 .filter("$..*")
                 .distributionAlgorithm("distributionAlgorithm")
+                .consistencyMode(ConsistencyMode.HIGH_AVAILABILITY.name())
                 .build();
 
         assertThat(catalog().createZoneAsync(zoneDefinition), 
willCompleteSuccessfully());
@@ -314,6 +316,7 @@ class ItCatalogDslTest extends 
ClusterPerClassIntegrationTest {
                         
.withDataNodesAutoAdjustScaleDown(zoneDefinition.dataNodesAutoAdjustScaleDown())
                         
.withDataNodesAutoAdjustScaleUp(zoneDefinition.dataNodesAutoAdjustScaleUp())
                         .withFilter(zoneDefinition.filter())
+                        .withConsistencyMode(zoneDefinition.consistencyMode())
         // TODO: https://issues.apache.org/jira/browse/IGNITE-22162
         // .withDistributionAlgorithm(zoneDefinition.distributionAlgorithm())
         );
diff --git 
a/modules/catalog-dsl/src/integrationTest/java/org/apache/ignite/internal/matcher/ZoneDefinitionMatcher.java
 
b/modules/catalog-dsl/src/integrationTest/java/org/apache/ignite/internal/matcher/ZoneDefinitionMatcher.java
index d8003438a6..eae4488314 100644
--- 
a/modules/catalog-dsl/src/integrationTest/java/org/apache/ignite/internal/matcher/ZoneDefinitionMatcher.java
+++ 
b/modules/catalog-dsl/src/integrationTest/java/org/apache/ignite/internal/matcher/ZoneDefinitionMatcher.java
@@ -49,6 +49,8 @@ public class ZoneDefinitionMatcher extends 
TypeSafeMatcher<ZoneDefinition> {
 
     private Matcher<String> storageProfiles = AnythingMatcher.anything();
 
+    private Matcher<String> consistencyMode = AnythingMatcher.anything();
+
     public ZoneDefinitionMatcher withZoneNameMatcher(Matcher<String> 
zoneNameMatcher) {
         this.zoneNameMatcher = zoneNameMatcher;
         return this;
@@ -141,6 +143,15 @@ public class ZoneDefinitionMatcher extends 
TypeSafeMatcher<ZoneDefinition> {
         return withStorageProfilesMatcher(equalTo(storageProfiles));
     }
 
+    public ZoneDefinitionMatcher withConsistencyModeMatcher(Matcher<String> 
consistenyMode) {
+        this.consistencyMode = consistenyMode;
+        return this;
+    }
+
+    public ZoneDefinitionMatcher withConsistencyMode(String consistencyMode) {
+        return withConsistencyModeMatcher(equalTo(consistencyMode));
+    }
+
     public static ZoneDefinitionMatcher isZoneDefinition() {
         return new ZoneDefinitionMatcher();
     }
@@ -157,7 +168,8 @@ public class ZoneDefinitionMatcher extends 
TypeSafeMatcher<ZoneDefinition> {
                 && 
dataNodesAutoAdjustScaleUpMatcher.matches(zoneDefinition.dataNodesAutoAdjustScaleUp())
                 && 
dataNodesAutoAdjustScaleDownMatcher.matches(zoneDefinition.dataNodesAutoAdjustScaleDown())
                 && filterMatcher.matches(zoneDefinition.filter())
-                && storageProfiles.matches(zoneDefinition.storageProfiles());
+                && storageProfiles.matches(zoneDefinition.storageProfiles())
+                && consistencyMode.matches(zoneDefinition.consistencyMode());
     }
 
     @Override
@@ -181,6 +193,8 @@ public class ZoneDefinitionMatcher extends 
TypeSafeMatcher<ZoneDefinition> {
                 .appendText(System.lineSeparator())
                 .appendText("filter ").appendDescriptionOf(filterMatcher)
                 .appendText(System.lineSeparator())
-                .appendText("storage profiles 
").appendDescriptionOf(storageProfiles);
+                .appendText("storage profiles 
").appendDescriptionOf(storageProfiles)
+                .appendText(System.lineSeparator())
+                .appendText("consistency mode 
").appendDescriptionOf(consistencyMode);
     }
 }
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 460f979e79..744e3fafae 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
@@ -143,6 +143,10 @@ class CreateFromAnnotationsImpl extends 
AbstractCatalogQuery<TableZoneId> {
             if (!zone.filter().isEmpty()) {
                 createZone.filter(zone.filter());
             }
+
+            if (!zone.consistencyMode().isEmpty()) {
+                createZone.consistencyMode(zone.consistencyMode());
+            }
         }
     }
 
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 7fb190cbdb..381d806265 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
@@ -84,6 +84,10 @@ class CreateFromDefinitionImpl extends 
AbstractCatalogQuery<TableZoneId> {
         if (!StringUtils.nullOrBlank(def.filter())) {
             createZone.filter(def.filter());
         }
+
+        if (!StringUtils.nullOrBlank(def.consistencyMode())) {
+            createZone.consistencyMode(def.consistencyMode());
+        }
         return this;
     }
 
diff --git 
a/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/CreateZoneImpl.java
 
b/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/CreateZoneImpl.java
index 1a35774b4b..dfdb07921e 100644
--- 
a/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/CreateZoneImpl.java
+++ 
b/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/CreateZoneImpl.java
@@ -116,6 +116,21 @@ class CreateZoneImpl extends AbstractCatalogQuery<Name> {
         return this;
     }
 
+    CreateZoneImpl consistencyMode(String consistencyMode) {
+        Objects.requireNonNull(consistencyMode, "Consistency mode must not be 
null");
+
+        if (!isValidConsistencyMode(consistencyMode)) {
+            throw new IllegalArgumentException("Invalid consistency mode: " + 
consistencyMode);
+        }
+
+        withOptions.add(Option.consistencyMode(consistencyMode));
+        return this;
+    }
+
+    private static boolean isValidConsistencyMode(String consistencyMode) {
+        return "HIGH_AVAILABILITY".equals(consistencyMode) || 
"STRONG_CONSISTENCY".equals(consistencyMode);
+    }
+
     @Override
     protected void accept(QueryContext ctx) {
         ctx.sql("CREATE ZONE ");
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 c749203cbc..717a908d4c 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
@@ -123,7 +123,8 @@ public class IgniteCatalogSqlImpl implements IgniteCatalog {
                 "REPLICAS",
                 "DATA_NODES_AUTO_ADJUST_SCALE_UP",
                 "DATA_NODES_AUTO_ADJUST_SCALE_DOWN",
-                "DATA_NODES_FILTER"
+                "DATA_NODES_FILTER",
+                "CONSISTENCY_MODE"
         );
         return new SelectFromView<>(sql, zoneViewColumns, "ZONES", 
name(zoneName), row -> toZoneDefinitionBuilder(zoneName, row))
                 .executeAsync()
@@ -217,13 +218,15 @@ public class IgniteCatalogSqlImpl implements 
IgniteCatalog {
         int dataNodesAutoAdjustScaleUp = 
row.intValue("DATA_NODES_AUTO_ADJUST_SCALE_UP");
         int dataNodesAutoAdjustScaleDown = 
row.intValue("DATA_NODES_AUTO_ADJUST_SCALE_DOWN");
         String filter = row.stringValue("DATA_NODES_FILTER");
+        String consistencyMode = row.stringValue("CONSISTENCY_MODE");
 
         return ZoneDefinition.builder(zoneName)
                 .partitions(partitions)
                 .replicas(replicas)
                 .dataNodesAutoAdjustScaleUp(dataNodesAutoAdjustScaleUp)
                 .dataNodesAutoAdjustScaleDown(dataNodesAutoAdjustScaleDown)
-                .filter(filter);
+                .filter(filter)
+                .consistencyMode(consistencyMode);
     }
 
     private static <R> R join(CompletableFuture<R> future) {
diff --git 
a/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/Option.java
 
b/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/Option.java
index 5f1b8ae955..14836cc32c 100644
--- 
a/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/Option.java
+++ 
b/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/Option.java
@@ -59,6 +59,10 @@ class Option extends QueryPart {
         return new Option("STORAGE_PROFILES", storageProfiles);
     }
 
+    public static Option consistencyMode(String consistencyMode) {
+        return new Option("CONSISTENCY_MODE", consistencyMode);
+    }
+
     public static Option name(String name) {
         return new Option("NAME", name);
     }
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 e72376cf8e..9368ec9204 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
@@ -75,6 +75,7 @@ class CreateFromAnnotationsTest {
                 .dataNodesAutoAdjustScaleUp(3)
                 .filter("filter")
                 .storageProfiles("default")
+                .consistencyMode("HIGH_AVAILABILITY")
                 .build();
         Query query2 = new CreateFromDefinitionImpl(null).from(zoneDefinition);
         String sqlZoneFromDefinition = query2.toString();
@@ -104,7 +105,7 @@ class CreateFromAnnotationsTest {
                 is("CREATE ZONE IF NOT EXISTS zone_test WITH 
STORAGE_PROFILES='default', PARTITIONS=1, REPLICAS=3,"
                         + " DISTRIBUTION_ALGORITHM='partitionDistribution',"
                         + " DATA_NODES_AUTO_ADJUST=1, 
DATA_NODES_AUTO_ADJUST_SCALE_UP=3, DATA_NODES_AUTO_ADJUST_SCALE_DOWN=2,"
-                        + " DATA_NODES_FILTER='filter';"
+                        + " DATA_NODES_FILTER='filter', 
CONSISTENCY_MODE='HIGH_AVAILABILITY';"
                         + System.lineSeparator()
                         + "CREATE TABLE IF NOT EXISTS PUBLIC.pojo_value_test 
(id int, f_name varchar, l_name varchar, str varchar,"
                         + " PRIMARY KEY (id)) COLOCATE BY (id, id_str) ZONE 
ZONE_TEST;"
@@ -122,7 +123,7 @@ class CreateFromAnnotationsTest {
                 is("CREATE ZONE IF NOT EXISTS zone_test WITH 
STORAGE_PROFILES='default', PARTITIONS=1, REPLICAS=3,"
                         + " DISTRIBUTION_ALGORITHM='partitionDistribution',"
                         + " DATA_NODES_AUTO_ADJUST=1, 
DATA_NODES_AUTO_ADJUST_SCALE_UP=3, DATA_NODES_AUTO_ADJUST_SCALE_DOWN=2,"
-                        + " DATA_NODES_FILTER='filter';"
+                        + " DATA_NODES_FILTER='filter', 
CONSISTENCY_MODE='HIGH_AVAILABILITY';"
                         + System.lineSeparator()
                         + "CREATE TABLE IF NOT EXISTS PUBLIC.pojo_value_test 
(id int, id_str varchar(20), f_name varchar, l_name varchar,"
                         + " str varchar, PRIMARY KEY (id, id_str)) COLOCATE BY 
(id, id_str) ZONE ZONE_TEST;"
@@ -139,7 +140,7 @@ class CreateFromAnnotationsTest {
                 is("CREATE ZONE IF NOT EXISTS zone_test WITH 
STORAGE_PROFILES='default', PARTITIONS=1, REPLICAS=3,"
                         + " DISTRIBUTION_ALGORITHM='partitionDistribution',"
                         + " DATA_NODES_AUTO_ADJUST=1, 
DATA_NODES_AUTO_ADJUST_SCALE_UP=3, DATA_NODES_AUTO_ADJUST_SCALE_DOWN=2,"
-                        + " DATA_NODES_FILTER='filter';"
+                        + " DATA_NODES_FILTER='filter', 
CONSISTENCY_MODE='STRONG_CONSISTENCY';"
                         + System.lineSeparator()
                         + "CREATE TABLE IF NOT EXISTS PUBLIC.pojo_test"
                         + " (id int, id_str varchar(20), f_name varchar(20) 
not null default 'a',"
@@ -150,6 +151,11 @@ class CreateFromAnnotationsTest {
         );
     }
 
+    @Test
+    void createFromKeyValueClassesInvalid() {
+        assertThrows(IllegalArgumentException.class, () -> 
createTable().processKeyValueClasses(Integer.class, PojoValueInvalid.class));
+    }
+
     @Test
     void nameGeneration() {
         CreateFromAnnotationsImpl query = 
createTable().processRecordClass(NameGeneration.class);
@@ -216,7 +222,8 @@ class CreateFromAnnotationsTest {
                     dataNodesAutoAdjustScaleDown = 2,
                     dataNodesAutoAdjustScaleUp = 3,
                     filter = "filter",
-                    storageProfiles = "default"
+                    storageProfiles = "default",
+                    consistencyMode = "HIGH_AVAILABILITY"
             ),
             colocateBy = {@ColumnRef("id"), @ColumnRef("id_str")},
             indexes = @Index(value = "ix_pojo", columns = {
@@ -246,7 +253,8 @@ class CreateFromAnnotationsTest {
                     dataNodesAutoAdjustScaleDown = 2,
                     dataNodesAutoAdjustScaleUp = 3,
                     filter = "filter",
-                    storageProfiles = "default"
+                    storageProfiles = "default",
+                    consistencyMode = "STRONG_CONSISTENCY"
             ),
             colocateBy = {@ColumnRef("id"), @ColumnRef("id_str")},
             indexes = @Index(value = "ix_pojo", columns = {
@@ -271,6 +279,37 @@ class CreateFromAnnotationsTest {
         String str;
     }
 
+    @SuppressWarnings("unused")
+    @Table(
+            value = "pojo_invalid_test",
+            zone = @Zone(
+                    value = "zone_test",
+                    partitions = 1,
+                    replicas = 3,
+                    distributionAlgorithm = "partitionDistribution",
+                    dataNodesAutoAdjust = 1,
+                    dataNodesAutoAdjustScaleDown = 2,
+                    dataNodesAutoAdjustScaleUp = 3,
+                    filter = "filter",
+                    storageProfiles = "default",
+                    consistencyMode = "MY_CONSISTENCY"
+            ),
+            colocateBy = {@ColumnRef("id"), @ColumnRef("id_str")},
+            indexes = @Index(value = "ix_pojo", columns = {
+                    @ColumnRef("f_name"),
+                    @ColumnRef(value = "l_name", sort = SortOrder.DESC),
+            })
+    )
+    private static class PojoValueInvalid {
+        @Column("f_name")
+        String firstName;
+
+        @Column("l_name")
+        String lastName;
+
+        String str;
+    }
+
     @Table(indexes = @Index(columns = {@ColumnRef("col1"), 
@ColumnRef("col2")}))
     private static class NameGeneration {
         Integer col1;
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 4643619f89..23635f610e 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
@@ -33,6 +33,7 @@ import org.apache.ignite.catalog.annotations.Id;
 import org.apache.ignite.catalog.definitions.TableDefinition;
 import org.apache.ignite.catalog.definitions.ZoneDefinition;
 import org.apache.ignite.internal.catalog.sql.CreateFromAnnotationsTest.Pojo;
+import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
 @SuppressWarnings("ThrowableNotThrown")
@@ -56,6 +57,7 @@ class CreateFromDefinitionTest {
                 .dataNodesAutoAdjustScaleUp(3)
                 .filter("filter")
                 .storageProfiles("default")
+                .consistencyMode("HIGH_AVAILABILITY")
                 .build();
 
         assertThat(
@@ -63,10 +65,28 @@ class CreateFromDefinitionTest {
                 is("CREATE ZONE IF NOT EXISTS zone_test WITH 
STORAGE_PROFILES='default', PARTITIONS=3, REPLICAS=3,"
                         + " DISTRIBUTION_ALGORITHM='partitionDistribution',"
                         + " DATA_NODES_AUTO_ADJUST=1, 
DATA_NODES_AUTO_ADJUST_SCALE_UP=3, DATA_NODES_AUTO_ADJUST_SCALE_DOWN=2,"
-                        + " DATA_NODES_FILTER='filter';")
+                        + " DATA_NODES_FILTER='filter', 
CONSISTENCY_MODE='HIGH_AVAILABILITY';")
         );
     }
 
+    @Test
+    void testDefinitionInvalidConsistencyMode() {
+        ZoneDefinition zoneDefinition = ZoneDefinition.builder("zone_test")
+                .ifNotExists()
+                .partitions(1)
+                .replicas(3)
+                .distributionAlgorithm("partitionDistribution")
+                .dataNodesAutoAdjust(1)
+                .dataNodesAutoAdjustScaleDown(2)
+                .dataNodesAutoAdjustScaleUp(3)
+                .filter("filter")
+                .storageProfiles("default")
+                .consistencyMode("MY_CONSISTENCY")
+                .build();
+
+        Assertions.assertThrows(IllegalArgumentException.class, () -> new 
CreateFromDefinitionImpl(null).from(zoneDefinition));
+    }
+
     @Test
     void invalidTableDefinition() {
         assertThrows(IllegalArgumentException.class,
diff --git 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogParamsValidationUtils.java
 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogParamsValidationUtils.java
index 8d2061fca8..12292227f6 100644
--- 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogParamsValidationUtils.java
+++ 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogParamsValidationUtils.java
@@ -29,6 +29,7 @@ import 
org.apache.ignite.internal.catalog.commands.StorageProfileParams;
 import org.apache.ignite.internal.catalog.descriptors.CatalogSchemaDescriptor;
 import 
org.apache.ignite.internal.catalog.descriptors.CatalogStorageProfileDescriptor;
 import org.apache.ignite.internal.catalog.descriptors.CatalogZoneDescriptor;
+import org.apache.ignite.internal.catalog.descriptors.ConsistencyMode;
 import org.apache.ignite.internal.util.StringUtils;
 import org.jetbrains.annotations.Nullable;
 
@@ -120,6 +121,18 @@ public class CatalogParamsValidationUtils {
         }
     }
 
+    /**
+     * Validates that given consistency mode is has only the expected values.
+     *
+     * @param consistencyMode Consistency mode to validate.
+     */
+    public static void validateConsistencyMode(@Nullable ConsistencyMode 
consistencyMode) {
+        if (consistencyMode != null
+                && !(consistencyMode == ConsistencyMode.HIGH_AVAILABILITY || 
consistencyMode == ConsistencyMode.STRONG_CONSISTENCY)) {
+            throw new CatalogValidationException("Consistency mode is not 
supported: [mode={}]", consistencyMode);
+        }
+    }
+
     /**
      * Validates that given partitions number is null, meaning that altering 
of a partitions number is forbidden.
      *
diff --git 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AlterZoneCommand.java
 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AlterZoneCommand.java
index 31b88c1f28..872c6ac088 100644
--- 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AlterZoneCommand.java
+++ 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AlterZoneCommand.java
@@ -139,7 +139,8 @@ public class AlterZoneCommand extends AbstractZoneCommand {
                 Objects.requireNonNullElse(scaleUp, 
previous.dataNodesAutoAdjustScaleUp()),
                 Objects.requireNonNullElse(scaleDown, 
previous.dataNodesAutoAdjustScaleDown()),
                 Objects.requireNonNullElse(filter, previous.filter()),
-                storageProfiles
+                storageProfiles,
+                previous.consistencyMode()
         );
     }
 
diff --git 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CatalogUtils.java
 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CatalogUtils.java
index d398425439..3db8bc06ab 100644
--- 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CatalogUtils.java
+++ 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CatalogUtils.java
@@ -45,6 +45,7 @@ import 
org.apache.ignite.internal.catalog.descriptors.CatalogStorageProfilesDesc
 import 
org.apache.ignite.internal.catalog.descriptors.CatalogTableColumnDescriptor;
 import org.apache.ignite.internal.catalog.descriptors.CatalogTableDescriptor;
 import org.apache.ignite.internal.catalog.descriptors.CatalogZoneDescriptor;
+import org.apache.ignite.internal.catalog.descriptors.ConsistencyMode;
 import org.apache.ignite.internal.hlc.HybridTimestamp;
 import org.apache.ignite.internal.type.NativeTypes;
 import org.apache.ignite.sql.ColumnType;
@@ -120,6 +121,8 @@ public class CatalogUtils {
      */
     public static final int DEFAULT_VARLEN_LENGTH = 2 << 15;
 
+    public static final ConsistencyMode DEFAULT_CONSISTENCY_MODE = 
ConsistencyMode.STRONG_CONSISTENCY;
+
     private static final Map<ColumnType, Set<ColumnType>> 
ALTER_COLUMN_TYPE_TRANSITIONS = new EnumMap<>(ColumnType.class);
 
     /**
diff --git 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CreateZoneCommand.java
 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CreateZoneCommand.java
index 9b21663526..6e96b05550 100644
--- 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CreateZoneCommand.java
+++ 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CreateZoneCommand.java
@@ -17,6 +17,7 @@
 
 package org.apache.ignite.internal.catalog.commands;
 
+import static 
org.apache.ignite.internal.catalog.CatalogParamsValidationUtils.validateConsistencyMode;
 import static 
org.apache.ignite.internal.catalog.CatalogParamsValidationUtils.validateField;
 import static 
org.apache.ignite.internal.catalog.CatalogParamsValidationUtils.validateStorageProfiles;
 import static 
org.apache.ignite.internal.catalog.CatalogParamsValidationUtils.validateZoneDataNodesAutoAdjustParametersCompatibility;
@@ -28,6 +29,7 @@ import static 
org.apache.ignite.internal.catalog.commands.CatalogUtils.IMMEDIATE
 import static 
org.apache.ignite.internal.catalog.commands.CatalogUtils.INFINITE_TIMER_VALUE;
 import static 
org.apache.ignite.internal.catalog.commands.CatalogUtils.MAX_PARTITION_COUNT;
 import static 
org.apache.ignite.internal.catalog.commands.CatalogUtils.fromParams;
+import static 
org.apache.ignite.internal.catalog.descriptors.ConsistencyMode.STRONG_CONSISTENCY;
 import static org.apache.ignite.internal.lang.IgniteStringFormatter.format;
 
 import java.util.List;
@@ -37,6 +39,7 @@ import org.apache.ignite.internal.catalog.CatalogCommand;
 import org.apache.ignite.internal.catalog.CatalogValidationException;
 import 
org.apache.ignite.internal.catalog.DistributionZoneExistsValidationException;
 import org.apache.ignite.internal.catalog.descriptors.CatalogZoneDescriptor;
+import org.apache.ignite.internal.catalog.descriptors.ConsistencyMode;
 import org.apache.ignite.internal.catalog.storage.NewZoneEntry;
 import org.apache.ignite.internal.catalog.storage.ObjectIdGenUpdateEntry;
 import org.apache.ignite.internal.catalog.storage.UpdateEntry;
@@ -67,6 +70,8 @@ public class CreateZoneCommand extends AbstractZoneCommand {
 
     private final List<StorageProfileParams> storageProfileParams;
 
+    private final @Nullable ConsistencyMode consistencyMode;
+
     /**
      * Constructor.
      *
@@ -90,7 +95,8 @@ public class CreateZoneCommand extends AbstractZoneCommand {
             @Nullable Integer dataNodesAutoAdjustScaleUp,
             @Nullable Integer dataNodesAutoAdjustScaleDown,
             @Nullable String filter,
-            List<StorageProfileParams> storageProfileParams
+            List<StorageProfileParams> storageProfileParams,
+            @Nullable ConsistencyMode consistencyMode
     ) throws CatalogValidationException {
         super(zoneName);
         this.ifNotExists = ifNotExists;
@@ -101,6 +107,7 @@ public class CreateZoneCommand extends AbstractZoneCommand {
         this.dataNodesAutoAdjustScaleDown = dataNodesAutoAdjustScaleDown;
         this.filter = filter;
         this.storageProfileParams = storageProfileParams;
+        this.consistencyMode = consistencyMode;
 
         validate();
     }
@@ -136,7 +143,8 @@ public class CreateZoneCommand extends AbstractZoneCommand {
                 ),
                 Objects.requireNonNullElse(dataNodesAutoAdjustScaleDown, 
INFINITE_TIMER_VALUE),
                 Objects.requireNonNullElse(filter, DEFAULT_FILTER),
-                fromParams(storageProfileParams)
+                fromParams(storageProfileParams),
+                Objects.requireNonNullElse(consistencyMode, STRONG_CONSISTENCY)
         );
 
         return zone;
@@ -157,6 +165,8 @@ public class CreateZoneCommand extends AbstractZoneCommand {
 
         validateZoneFilter(filter);
 
+        validateConsistencyMode(consistencyMode);
+
         validateStorageProfiles(storageProfileParams);
     }
 
@@ -180,6 +190,8 @@ public class CreateZoneCommand extends AbstractZoneCommand {
 
         private @Nullable String filter;
 
+        private @Nullable ConsistencyMode consistencyMode;
+
         private List<StorageProfileParams> storageProfileParams;
 
         @Override
@@ -245,6 +257,13 @@ public class CreateZoneCommand extends AbstractZoneCommand 
{
             return this;
         }
 
+        @Override
+        public CreateZoneCommandBuilder consistencyModeParams(@Nullable 
ConsistencyMode params) {
+            this.consistencyMode = params;
+
+            return this;
+        }
+
         @Override
         public CatalogCommand build() {
             return new CreateZoneCommand(
@@ -256,7 +275,8 @@ public class CreateZoneCommand extends AbstractZoneCommand {
                     dataNodesAutoAdjustScaleUp,
                     dataNodesAutoAdjustScaleDown,
                     filter,
-                    storageProfileParams
+                    storageProfileParams,
+                    consistencyMode
             );
         }
     }
diff --git 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CreateZoneCommandBuilder.java
 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CreateZoneCommandBuilder.java
index 84770586ff..21c9d088ce 100644
--- 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CreateZoneCommandBuilder.java
+++ 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CreateZoneCommandBuilder.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.internal.catalog.commands;
 
 import java.util.List;
+import org.apache.ignite.internal.catalog.descriptors.ConsistencyMode;
 import org.jetbrains.annotations.Nullable;
 
 /**
@@ -85,4 +86,12 @@ public interface CreateZoneCommandBuilder extends 
AbstractZoneCommandBuilder<Cre
      * @return This instance.
      */
     CreateZoneCommandBuilder storageProfilesParams(List<StorageProfileParams> 
params);
+
+    /**
+     * Sets consistency mode.
+     *
+     * @param params Optional consistency mode params.
+     * @return This instance.
+     */
+    CreateZoneCommandBuilder consistencyModeParams(@Nullable ConsistencyMode 
params);
 }
diff --git 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/RenameZoneCommand.java
 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/RenameZoneCommand.java
index 89e0d89cdf..c6c2748d1d 100644
--- 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/RenameZoneCommand.java
+++ 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/RenameZoneCommand.java
@@ -81,7 +81,8 @@ public class RenameZoneCommand extends AbstractZoneCommand {
                 zone.dataNodesAutoAdjustScaleUp(),
                 zone.dataNodesAutoAdjustScaleDown(),
                 zone.filter(),
-                zone.storageProfiles()
+                zone.storageProfiles(),
+                zone.consistencyMode()
         );
 
         return List.of(new AlterZoneEntry(descriptor));
diff --git 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/descriptors/CatalogZoneDescriptor.java
 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/descriptors/CatalogZoneDescriptor.java
index 29b0f3246d..6af1345473 100644
--- 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/descriptors/CatalogZoneDescriptor.java
+++ 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/descriptors/CatalogZoneDescriptor.java
@@ -52,6 +52,11 @@ public class CatalogZoneDescriptor extends 
CatalogObjectDescriptor {
     /** Storage profiles descriptor. */
     private final CatalogStorageProfilesDescriptor storageProfiles;
 
+    /**
+     * Specifies the consistency mode of the zone, determining how the system 
balances data consistency and availability.
+     */
+    private final ConsistencyMode consistencyMode;
+
     /**
      * Constructs a distribution zone descriptor.
      *
@@ -64,6 +69,7 @@ public class CatalogZoneDescriptor extends 
CatalogObjectDescriptor {
      * @param dataNodesAutoAdjustScaleDown Data nodes auto adjust scale down 
timeout.
      * @param filter Nodes filter.
      * @param storageProfiles Storage profiles descriptor.
+     * @param consistencyMode Consistency mode of the zone.
      */
     public CatalogZoneDescriptor(
             int id,
@@ -74,10 +80,11 @@ public class CatalogZoneDescriptor extends 
CatalogObjectDescriptor {
             int dataNodesAutoAdjustScaleUp,
             int dataNodesAutoAdjustScaleDown,
             String filter,
-            CatalogStorageProfilesDescriptor storageProfiles
+            CatalogStorageProfilesDescriptor storageProfiles,
+            ConsistencyMode consistencyMode
     ) {
         this(id, name, partitions, replicas, dataNodesAutoAdjust, 
dataNodesAutoAdjustScaleUp, dataNodesAutoAdjustScaleDown,
-                filter, storageProfiles, INITIAL_CAUSALITY_TOKEN);
+                filter, storageProfiles, INITIAL_CAUSALITY_TOKEN, 
consistencyMode);
     }
 
     /**
@@ -103,7 +110,8 @@ public class CatalogZoneDescriptor extends 
CatalogObjectDescriptor {
             int dataNodesAutoAdjustScaleDown,
             String filter,
             CatalogStorageProfilesDescriptor storageProfiles,
-            long causalityToken
+            long causalityToken,
+            ConsistencyMode consistencyMode
     ) {
         super(id, Type.ZONE, name, causalityToken);
 
@@ -114,6 +122,7 @@ public class CatalogZoneDescriptor extends 
CatalogObjectDescriptor {
         this.dataNodesAutoAdjustScaleDown = dataNodesAutoAdjustScaleDown;
         this.filter = filter;
         this.storageProfiles = storageProfiles;
+        this.consistencyMode = consistencyMode;
     }
 
     /**
@@ -164,6 +173,13 @@ public class CatalogZoneDescriptor extends 
CatalogObjectDescriptor {
         return filter;
     }
 
+    /**
+     * Specifies the consistency mode of the zone, determining how the system 
balances data consistency and availability.
+     */
+    public ConsistencyMode consistencyMode() {
+        return consistencyMode;
+    }
+
     /**
      * Returns the storage profiles descriptor.
      */
@@ -194,6 +210,7 @@ public class CatalogZoneDescriptor extends 
CatalogObjectDescriptor {
             int dataNodesAutoAdjustScaleUp = input.readInt();
             int dataNodesAutoAdjustScaleDown = input.readInt();
             String filter = input.readUTF();
+            ConsistencyMode consistencyMode = 
ConsistencyMode.forId(input.readByte());
 
             return new CatalogZoneDescriptor(
                     id,
@@ -205,7 +222,8 @@ public class CatalogZoneDescriptor extends 
CatalogObjectDescriptor {
                     dataNodesAutoAdjustScaleDown,
                     filter,
                     catalogStorageProfilesDescriptor,
-                    updateToken
+                    updateToken,
+                    consistencyMode
             );
         }
 
@@ -223,6 +241,7 @@ public class CatalogZoneDescriptor extends 
CatalogObjectDescriptor {
             output.writeInt(descriptor.dataNodesAutoAdjustScaleUp());
             output.writeInt(descriptor.dataNodesAutoAdjustScaleDown());
             output.writeUTF(descriptor.filter());
+            output.writeByte(descriptor.consistencyMode().id());
         }
     }
 }
diff --git 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/descriptors/ConsistencyMode.java
 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/descriptors/ConsistencyMode.java
new file mode 100644
index 0000000000..0404294ebf
--- /dev/null
+++ 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/descriptors/ConsistencyMode.java
@@ -0,0 +1,66 @@
+/*
+ * 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.internal.catalog.descriptors;
+
+/**
+ * Specifies the consistency mode of the zone, determining how the system 
balances data consistency and availability.
+ */
+public enum ConsistencyMode {
+    /**
+     * Ensures strong consistency by requiring a majority of nodes for 
operations. Partitions become unavailable if the majority of assigned
+     * nodes are lost.
+     */
+    STRONG_CONSISTENCY(0),
+
+    /**
+     * Prioritizes availability over strict consistency, allowing partitions 
to remain available for read-write operations even when the
+     * majority of assigned nodes are offline. The system reconfigures the 
RAFT group to include only the available nodes without changing
+     * the assignments.
+     */
+    HIGH_AVAILABILITY(1);
+
+    private static final ConsistencyMode[] VALS = new 
ConsistencyMode[values().length];
+
+    private final int id;
+
+    ConsistencyMode(int id) {
+        this.id = id;
+    }
+
+    public int id() {
+        return id;
+    }
+
+
+    static {
+        for (ConsistencyMode mode : values()) {
+            assert VALS[mode.id] == null : "Found duplicate id " + mode.id;
+
+            VALS[mode.id()] = mode;
+        }
+    }
+
+    /** Returns index status by identifier. */
+    static ConsistencyMode forId(int id) {
+        if (id >= 0 && id < VALS.length) {
+            return VALS[id];
+        }
+
+        throw new IllegalArgumentException("Incorrect consistency mode 
identifier: " + id);
+    }
+}
diff --git 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/systemviews/ZonesSystemViewProvider.java
 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/systemviews/ZonesSystemViewProvider.java
index c5579f2f47..5433fffd06 100644
--- 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/systemviews/ZonesSystemViewProvider.java
+++ 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/systemviews/ZonesSystemViewProvider.java
@@ -58,6 +58,7 @@ public final class ZonesSystemViewProvider implements 
CatalogSystemViewProvider
                 .addColumn("DATA_NODES_AUTO_ADJUST_SCALE_DOWN", INT32, wrapper 
-> wrapper.zone.dataNodesAutoAdjustScaleDown())
                 .addColumn("DATA_NODES_FILTER", STRING, wrapper -> 
wrapper.zone.filter())
                 .addColumn("IS_DEFAULT_ZONE", BOOLEAN, wrapper -> 
wrapper.isDefault)
+                .addColumn("CONSISTENCY_MODE", STRING, wrapper -> 
wrapper.zone.consistencyMode().name())
                 .dataProvider(SubscriptionUtils.fromIterable(() -> {
                             Catalog catalog = catalogSupplier.get();
                             CatalogZoneDescriptor defaultZone = 
catalog.defaultZone();
diff --git 
a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/commands/AbstractCommandValidationTest.java
 
b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/commands/AbstractCommandValidationTest.java
index 46208e131c..50ea51d5c1 100644
--- 
a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/commands/AbstractCommandValidationTest.java
+++ 
b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/commands/AbstractCommandValidationTest.java
@@ -45,6 +45,7 @@ import 
org.apache.ignite.internal.catalog.descriptors.CatalogSystemViewDescripto
 import 
org.apache.ignite.internal.catalog.descriptors.CatalogTableColumnDescriptor;
 import org.apache.ignite.internal.catalog.descriptors.CatalogTableDescriptor;
 import org.apache.ignite.internal.catalog.descriptors.CatalogZoneDescriptor;
+import org.apache.ignite.internal.catalog.descriptors.ConsistencyMode;
 import org.apache.ignite.internal.catalog.storage.UpdateEntry;
 import org.apache.ignite.internal.testframework.BaseIgniteAbstractTest;
 import org.junit.jupiter.params.provider.Arguments;
@@ -63,8 +64,16 @@ abstract class AbstractCommandValidationTest extends 
BaseIgniteAbstractTest {
             .build();
 
     private static final CatalogZoneDescriptor DEFAULT_ZONE = new 
CatalogZoneDescriptor(
-            0, ZONE_NAME, 1, -1, -1, -1, -1, "",
-            
fromParams(List.of(StorageProfileParams.builder().storageProfile(DEFAULT_STORAGE_PROFILE).build()))
+            0,
+            ZONE_NAME,
+            1,
+            -1,
+            -1,
+            -1,
+            -1,
+            "",
+            
fromParams(List.of(StorageProfileParams.builder().storageProfile(DEFAULT_STORAGE_PROFILE).build())),
+            ConsistencyMode.STRONG_CONSISTENCY
     );
 
     static Stream<Arguments> nullAndBlankStrings() {
diff --git 
a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/commands/CreateZoneCommandValidationTest.java
 
b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/commands/CreateZoneCommandValidationTest.java
index 8f18f9d44c..777e5b8408 100644
--- 
a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/commands/CreateZoneCommandValidationTest.java
+++ 
b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/commands/CreateZoneCommandValidationTest.java
@@ -31,6 +31,7 @@ import java.util.List;
 import org.apache.ignite.internal.catalog.Catalog;
 import org.apache.ignite.internal.catalog.CatalogCommand;
 import org.apache.ignite.internal.catalog.CatalogValidationException;
+import org.apache.ignite.internal.catalog.descriptors.ConsistencyMode;
 import org.jetbrains.annotations.Nullable;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.params.ParameterizedTest;
@@ -249,6 +250,15 @@ public class CreateZoneCommandValidationTest extends 
AbstractCommandValidationTe
                 
List.of(StorageProfileParams.builder().storageProfile("lru_rocks").build())).build();
     }
 
+    @Test
+    void zoneConsistencyMode() {
+        // Let's check the success case.
+        
createZoneBuilder(ZONE_NAME).consistencyModeParams(ConsistencyMode.STRONG_CONSISTENCY).build();
+        
createZoneBuilder(ZONE_NAME).consistencyModeParams(ConsistencyMode.HIGH_AVAILABILITY).build();
+        // STRONG_CONSISTENCY is used in this case.
+        createZoneBuilder(ZONE_NAME).consistencyModeParams(null).build();
+    }
+
     @Test
     void exceptionIsThrownIfZoneAlreadyExist() {
         CreateZoneCommandBuilder builder = CreateZoneCommand.builder();
diff --git 
a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/descriptors/CatalogZoneDescriptorTest.java
 
b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/descriptors/CatalogZoneDescriptorTest.java
index e8a9cb3de1..c185fdc1c7 100644
--- 
a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/descriptors/CatalogZoneDescriptorTest.java
+++ 
b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/descriptors/CatalogZoneDescriptorTest.java
@@ -39,7 +39,8 @@ class CatalogZoneDescriptorTest {
                 5,
                 6,
                 "the-filter",
-                
fromParams(List.of(StorageProfileParams.builder().storageProfile(DEFAULT_STORAGE_PROFILE).build()))
+                
fromParams(List.of(StorageProfileParams.builder().storageProfile(DEFAULT_STORAGE_PROFILE).build())),
+                ConsistencyMode.STRONG_CONSISTENCY
         );
 
         String toString = descriptor.toString();
@@ -54,5 +55,6 @@ class CatalogZoneDescriptorTest {
         assertThat(toString, containsString("dataNodesAutoAdjustScaleDown=6"));
         assertThat(toString, containsString("filter=the-filter"));
         assertThat(toString, 
containsString("storageProfiles=CatalogStorageProfilesDescriptor ["));
+        assertThat(toString, 
containsString("consistencyMode=STRONG_CONSISTENCY"));
     }
 }
diff --git 
a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/storage/CatalogEntrySerializationTest.java
 
b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/storage/CatalogEntrySerializationTest.java
index 87ae97584d..0a54dfed3e 100644
--- 
a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/storage/CatalogEntrySerializationTest.java
+++ 
b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/storage/CatalogEntrySerializationTest.java
@@ -54,6 +54,7 @@ import 
org.apache.ignite.internal.catalog.descriptors.CatalogSystemViewDescripto
 import 
org.apache.ignite.internal.catalog.descriptors.CatalogTableColumnDescriptor;
 import org.apache.ignite.internal.catalog.descriptors.CatalogTableDescriptor;
 import org.apache.ignite.internal.catalog.descriptors.CatalogZoneDescriptor;
+import org.apache.ignite.internal.catalog.descriptors.ConsistencyMode;
 import 
org.apache.ignite.internal.catalog.storage.serialization.MarshallableEntryType;
 import 
org.apache.ignite.internal.catalog.storage.serialization.UpdateLogMarshallerImpl;
 import org.apache.ignite.internal.testframework.BaseIgniteAbstractTest;
@@ -424,7 +425,8 @@ public class CatalogEntrySerializationTest extends 
BaseIgniteAbstractTest {
                 2,
                 3,
                 DEFAULT_FILTER,
-                profiles
+                profiles,
+                ConsistencyMode.STRONG_CONSISTENCY
         );
     }
 
diff --git 
a/modules/client-handler/src/testFixtures/java/org/apache/ignite/client/handler/FakeCatalogService.java
 
b/modules/client-handler/src/testFixtures/java/org/apache/ignite/client/handler/FakeCatalogService.java
index 6e9722f695..03182e0ce2 100644
--- 
a/modules/client-handler/src/testFixtures/java/org/apache/ignite/client/handler/FakeCatalogService.java
+++ 
b/modules/client-handler/src/testFixtures/java/org/apache/ignite/client/handler/FakeCatalogService.java
@@ -31,6 +31,7 @@ import 
org.apache.ignite.internal.catalog.descriptors.CatalogSchemaDescriptor;
 import 
org.apache.ignite.internal.catalog.descriptors.CatalogTableColumnDescriptor;
 import org.apache.ignite.internal.catalog.descriptors.CatalogTableDescriptor;
 import org.apache.ignite.internal.catalog.descriptors.CatalogZoneDescriptor;
+import org.apache.ignite.internal.catalog.descriptors.ConsistencyMode;
 import org.apache.ignite.internal.catalog.events.CatalogEvent;
 import org.apache.ignite.internal.catalog.events.CatalogEventParameters;
 import org.apache.ignite.internal.event.EventListener;
@@ -118,7 +119,18 @@ public class FakeCatalogService implements CatalogService {
 
     @Override
     public CatalogZoneDescriptor zone(int zoneId, long timestamp) {
-        return new CatalogZoneDescriptor(zoneId, "zone", partitions, 0, 0, 0, 
0, "", fromParams(Collections.emptyList()));
+        return new CatalogZoneDescriptor(
+                zoneId,
+                "zone",
+                partitions,
+                0,
+                0,
+                0,
+                0,
+                "",
+                fromParams(Collections.emptyList()),
+                ConsistencyMode.STRONG_CONSISTENCY
+        );
     }
 
     @Override
diff --git 
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItZonesSystemViewTest.java
 
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItZonesSystemViewTest.java
index 5930bedc9b..cff2bb5e1c 100644
--- 
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItZonesSystemViewTest.java
+++ 
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItZonesSystemViewTest.java
@@ -19,18 +19,22 @@ package org.apache.ignite.internal.sql.engine;
 
 import static org.apache.ignite.internal.TestWrappers.unwrapIgniteImpl;
 import static 
org.apache.ignite.internal.catalog.CatalogService.DEFAULT_STORAGE_PROFILE;
+import static 
org.apache.ignite.internal.catalog.commands.CatalogUtils.DEFAULT_CONSISTENCY_MODE;
 import static 
org.apache.ignite.internal.catalog.commands.CatalogUtils.DEFAULT_FILTER;
 import static 
org.apache.ignite.internal.catalog.commands.CatalogUtils.DEFAULT_PARTITION_COUNT;
 import static 
org.apache.ignite.internal.catalog.commands.CatalogUtils.DEFAULT_REPLICA_COUNT;
 import static 
org.apache.ignite.internal.catalog.commands.CatalogUtils.IMMEDIATE_TIMER_VALUE;
 import static 
org.apache.ignite.internal.catalog.commands.CatalogUtils.INFINITE_TIMER_VALUE;
+import static 
org.apache.ignite.internal.testframework.IgniteTestUtils.assertThrows;
 
 import java.util.Objects;
 import org.apache.ignite.internal.app.IgniteImpl;
 import org.apache.ignite.internal.catalog.Catalog;
 import org.apache.ignite.internal.catalog.CatalogManager;
+import org.apache.ignite.internal.catalog.descriptors.ConsistencyMode;
 import org.apache.ignite.internal.sql.BaseSqlIntegrationTest;
 import org.apache.ignite.internal.testframework.IgniteTestUtils;
+import org.apache.ignite.sql.SqlException;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
 
@@ -62,7 +66,8 @@ public class ItZonesSystemViewTest extends 
BaseSqlIntegrationTest {
                 IMMEDIATE_TIMER_VALUE,
                 INFINITE_TIMER_VALUE,
                 DEFAULT_FILTER,
-                true
+                true,
+                DEFAULT_CONSISTENCY_MODE.name()
         ).check();
     }
 
@@ -77,7 +82,8 @@ public class ItZonesSystemViewTest extends 
BaseSqlIntegrationTest {
                 3,
                 4,
                 DEFAULT_FILTER,
-                false
+                false,
+                DEFAULT_CONSISTENCY_MODE.name()
         ).check();
 
         sql("DROP ZONE " + ZONE_NAME);
@@ -94,7 +100,8 @@ public class ItZonesSystemViewTest extends 
BaseSqlIntegrationTest {
                 3,
                 4,
                 DEFAULT_FILTER,
-                false
+                false,
+                DEFAULT_CONSISTENCY_MODE.name()
         ).check();
 
         sql("ALTER ZONE " + ZONE_NAME + " SET REPLICAS = 100");
@@ -106,7 +113,8 @@ public class ItZonesSystemViewTest extends 
BaseSqlIntegrationTest {
                 3,
                 4,
                 DEFAULT_FILTER,
-                false
+                false,
+                DEFAULT_CONSISTENCY_MODE.name()
         ).check();
 
         sql("DROP ZONE " + ZONE_NAME);
@@ -123,7 +131,8 @@ public class ItZonesSystemViewTest extends 
BaseSqlIntegrationTest {
                 3,
                 4,
                 DEFAULT_FILTER,
-                false
+                false,
+                DEFAULT_CONSISTENCY_MODE.name()
         ).check();
 
         sql("ALTER ZONE " + ZONE_NAME + " RENAME TO " + ALTER_ZONE_NAME);
@@ -135,7 +144,8 @@ public class ItZonesSystemViewTest extends 
BaseSqlIntegrationTest {
                 3,
                 4,
                 DEFAULT_FILTER,
-                false
+                false,
+                DEFAULT_CONSISTENCY_MODE.name()
         ).check();
 
         assertQuery("SELECT COUNT(*) FROM SYSTEM.ZONES").returns(2L).check();
@@ -156,6 +166,71 @@ public class ItZonesSystemViewTest extends 
BaseSqlIntegrationTest {
         assertQuery("SELECT COUNT(*) FROM SYSTEM.ZONES").returns(1L).check();
     }
 
+    @Test
+    public void systemViewCustomConsistencyMode() {
+        sql(createZoneSql(ZONE_NAME, 1, 2, 3, 4, DEFAULT_FILTER, 
ConsistencyMode.HIGH_AVAILABILITY));
+
+        assertQuery(selectFromZonesSystemView(ZONE_NAME)).returns(
+                ZONE_NAME,
+                1,
+                2,
+                3,
+                4,
+                DEFAULT_FILTER,
+                false,
+                ConsistencyMode.HIGH_AVAILABILITY.name()
+        ).check();
+
+        sql("ALTER ZONE " + ZONE_NAME + " SET REPLICAS = 100");
+
+        assertQuery(selectFromZonesSystemView(ZONE_NAME)).returns(
+                ZONE_NAME,
+                1,
+                100,
+                3,
+                4,
+                DEFAULT_FILTER,
+                false,
+                ConsistencyMode.HIGH_AVAILABILITY.name()
+        ).check();
+
+        sql("DROP ZONE " + ZONE_NAME);
+    }
+
+    @Test
+    public void systemViewAlterConsistencyMode() {
+        sql(createZoneSql(ZONE_NAME, 1, 2, 3, 4, DEFAULT_FILTER));
+
+        assertQuery(selectFromZonesSystemView(ZONE_NAME)).returns(
+                ZONE_NAME,
+                1,
+                2,
+                3,
+                4,
+                DEFAULT_FILTER,
+                false,
+                DEFAULT_CONSISTENCY_MODE.name()
+        ).check();
+
+        assertThrows(
+                SqlException.class,
+                () -> sql("ALTER ZONE " + ZONE_NAME + " SET CONSISTENCY_MODE = 
'HIGH_AVAILABILITY'"),
+                "CONSISTENCY_MODE");
+
+        assertQuery(selectFromZonesSystemView(ZONE_NAME)).returns(
+                ZONE_NAME,
+                1,
+                2,
+                3,
+                4,
+                DEFAULT_FILTER,
+                false,
+                DEFAULT_CONSISTENCY_MODE.name()
+        ).check();
+
+        sql("DROP ZONE " + ZONE_NAME);
+    }
+
     private static String createZoneSql(String zoneName, int partitions, int 
replicas, int scaleUp, int scaleDown, String filter) {
         String sqlFormat = "CREATE ZONE \"%s\" WITH "
                 + "\"PARTITIONS\" = %d, "
@@ -168,6 +243,37 @@ public class ItZonesSystemViewTest extends 
BaseSqlIntegrationTest {
         return String.format(sqlFormat, zoneName, partitions, replicas, 
scaleUp, scaleDown, filter, DEFAULT_STORAGE_PROFILE);
     }
 
+    private static String createZoneSql(
+            String zoneName,
+            int partitions,
+            int replicas,
+            int scaleUp,
+            int scaleDown,
+            String filter,
+            ConsistencyMode consistencyMode
+    ) {
+        String sqlFormat = "CREATE ZONE \"%s\" WITH "
+                + "\"PARTITIONS\" = %d, "
+                + "\"REPLICAS\" = %d, "
+                + "\"DATA_NODES_AUTO_ADJUST_SCALE_UP\" = %d, "
+                + "\"DATA_NODES_AUTO_ADJUST_SCALE_DOWN\" = %d,"
+                + "\"DATA_NODES_FILTER\" = '%s',"
+                + "\"STORAGE_PROFILES\" = '%s',"
+                + "\"CONSISTENCY_MODE\" = '%s'";
+
+        return String.format(
+                sqlFormat,
+                zoneName,
+                partitions,
+                replicas,
+                scaleUp,
+                scaleDown,
+                filter,
+                DEFAULT_STORAGE_PROFILE,
+                consistencyMode
+        );
+    }
+
     private static String selectFromZonesSystemView(String zoneName) {
         String sqlFormat = "SELECT * FROM SYSTEM.ZONES WHERE NAME = '%s'";
 
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/ddl/DdlSqlToCommandConverter.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/ddl/DdlSqlToCommandConverter.java
index 31e9676f43..f6db68d67b 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/ddl/DdlSqlToCommandConverter.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/ddl/DdlSqlToCommandConverter.java
@@ -23,6 +23,7 @@ import static 
org.apache.ignite.internal.catalog.commands.CatalogUtils.DEFAULT_L
 import static 
org.apache.ignite.internal.catalog.commands.CatalogUtils.defaultLength;
 import static 
org.apache.ignite.internal.distributionzones.DistributionZonesUtil.parseStorageProfiles;
 import static org.apache.ignite.internal.lang.IgniteStringFormatter.format;
+import static 
org.apache.ignite.internal.sql.engine.prepare.ddl.ZoneOptionEnum.CONSISTENCY_MODE;
 import static 
org.apache.ignite.internal.sql.engine.prepare.ddl.ZoneOptionEnum.DATA_NODES_AUTO_ADJUST;
 import static 
org.apache.ignite.internal.sql.engine.prepare.ddl.ZoneOptionEnum.DATA_NODES_AUTO_ADJUST_SCALE_DOWN;
 import static 
org.apache.ignite.internal.sql.engine.prepare.ddl.ZoneOptionEnum.DATA_NODES_AUTO_ADJUST_SCALE_UP;
@@ -46,6 +47,7 @@ import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.time.Period;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.EnumMap;
 import java.util.EnumSet;
 import java.util.HashSet;
@@ -108,6 +110,7 @@ import 
org.apache.ignite.internal.catalog.commands.TableHashPrimaryKey;
 import org.apache.ignite.internal.catalog.commands.TablePrimaryKey;
 import org.apache.ignite.internal.catalog.commands.TableSortedPrimaryKey;
 import org.apache.ignite.internal.catalog.descriptors.CatalogColumnCollation;
+import org.apache.ignite.internal.catalog.descriptors.ConsistencyMode;
 import org.apache.ignite.internal.sql.engine.prepare.IgnitePlanner;
 import org.apache.ignite.internal.sql.engine.prepare.IgniteSqlValidator;
 import org.apache.ignite.internal.sql.engine.prepare.PlanningContext;
@@ -172,7 +175,9 @@ public class DdlSqlToCommandConverter {
                 DATA_NODES_AUTO_ADJUST_SCALE_DOWN,
                 new DdlOptionInfo<>(Integer.class, this::checkPositiveNumber, 
CreateZoneCommandBuilder::dataNodesAutoAdjustScaleDown),
                 STORAGE_PROFILES, new DdlOptionInfo<>(String.class, 
this::checkEmptyString,
-                        (builder, params) -> 
builder.storageProfilesParams(parseStorageProfiles(params)))
+                        (builder, params) -> 
builder.storageProfilesParams(parseStorageProfiles(params))),
+                CONSISTENCY_MODE, new DdlOptionInfo<>(String.class, 
this::checkEmptyString,
+                        (builder, params) -> 
builder.consistencyModeParams(parseConsistencyMode(params)))
         ));
 
         // ALTER ZONE options.
@@ -189,6 +194,21 @@ public class DdlSqlToCommandConverter {
         ));
     }
 
+    /**
+     * Parse string representation of consistency mode.
+     *
+     * @param consistencyMode String representation of consistency mode.
+     * @return Consistency mode
+     */
+    public static ConsistencyMode parseConsistencyMode(String consistencyMode) 
{
+        try {
+            return ConsistencyMode.valueOf(consistencyMode);
+        } catch (IllegalArgumentException e) {
+            throw new SqlException(STMT_VALIDATION_ERR, "Failed to parse 
consistency mode: " + consistencyMode
+                    + ". Valid values are: " + 
Arrays.toString(ConsistencyMode.values()));
+        }
+    }
+
     /**
      * Converts a given ddl AST to a catalog command.
      *
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/ddl/ZoneOptionEnum.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/ddl/ZoneOptionEnum.java
index f3135c07d3..4c6cc37746 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/ddl/ZoneOptionEnum.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/ddl/ZoneOptionEnum.java
@@ -43,5 +43,8 @@ public enum ZoneOptionEnum {
     DATA_NODES_AUTO_ADJUST_SCALE_DOWN,
 
     /** Storage profiles. */
-    STORAGE_PROFILES
+    STORAGE_PROFILES,
+
+    /** Consistency mode. */
+    CONSISTENCY_MODE
 }
diff --git 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/prepare/ddl/DistributionZoneSqlToCommandConverterTest.java
 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/prepare/ddl/DistributionZoneSqlToCommandConverterTest.java
index 2b66e7cb0f..9a48095d3b 100644
--- 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/prepare/ddl/DistributionZoneSqlToCommandConverterTest.java
+++ 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/prepare/ddl/DistributionZoneSqlToCommandConverterTest.java
@@ -42,12 +42,14 @@ import 
org.apache.ignite.internal.catalog.commands.DropZoneCommand;
 import org.apache.ignite.internal.catalog.commands.RenameZoneCommand;
 import 
org.apache.ignite.internal.catalog.descriptors.CatalogStorageProfileDescriptor;
 import org.apache.ignite.internal.catalog.descriptors.CatalogZoneDescriptor;
+import org.apache.ignite.internal.catalog.descriptors.ConsistencyMode;
 import org.apache.ignite.internal.catalog.storage.AlterZoneEntry;
 import org.apache.ignite.internal.catalog.storage.DropZoneEntry;
 import org.apache.ignite.internal.catalog.storage.NewZoneEntry;
 import org.apache.ignite.internal.catalog.storage.SetDefaultZoneEntry;
 import org.apache.ignite.lang.ErrorGroups.Sql;
 import org.apache.ignite.lang.IgniteException;
+import org.apache.ignite.sql.SqlException;
 import org.hamcrest.Matchers;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.params.ParameterizedTest;
@@ -82,6 +84,61 @@ public class DistributionZoneSqlToCommandConverterTest 
extends AbstractDdlSqlToC
         assertThat(newZoneEntry.descriptor().name(), equalTo("TEST"));
     }
 
+    @Test
+    public void testCreateZoneWithConsistencyModeNotSet() throws 
SqlParseException {
+        SqlNode node = parse("CREATE ZONE test0 WITH STORAGE_PROFILES='" + 
DEFAULT_STORAGE_PROFILE + "'");
+
+        assertThat(node, instanceOf(SqlDdl.class));
+
+        CatalogCommand cmd = converter.convert((SqlDdl) node, createContext());
+
+        CatalogZoneDescriptor desc = invokeAndGetFirstEntry(cmd, 
NewZoneEntry.class).descriptor();
+
+        assertThat(desc.consistencyMode(), 
equalTo(ConsistencyMode.STRONG_CONSISTENCY));
+    }
+
+    @Test
+    public void testCreateZoneWithConsistencyModeStrongConsistency() throws 
SqlParseException {
+        SqlNode node = parse("CREATE ZONE test0 WITH STORAGE_PROFILES='" + 
DEFAULT_STORAGE_PROFILE + "',"
+                + " CONSISTENCY_MODE='" + 
ConsistencyMode.STRONG_CONSISTENCY.name() + "'");
+
+        assertThat(node, instanceOf(SqlDdl.class));
+
+        CatalogCommand cmd = converter.convert((SqlDdl) node, createContext());
+
+        CatalogZoneDescriptor desc = invokeAndGetFirstEntry(cmd, 
NewZoneEntry.class).descriptor();
+
+        assertThat(desc.consistencyMode(), 
equalTo(ConsistencyMode.STRONG_CONSISTENCY));
+    }
+
+    @Test
+    public void testCreateZoneWithConsistencyModeHighAvailability() throws 
SqlParseException {
+        SqlNode node = parse("CREATE ZONE test0 WITH STORAGE_PROFILES='" + 
DEFAULT_STORAGE_PROFILE + "',"
+                + " CONSISTENCY_MODE='" + 
ConsistencyMode.HIGH_AVAILABILITY.name() + "'");
+
+        assertThat(node, instanceOf(SqlDdl.class));
+
+        CatalogCommand cmd = converter.convert((SqlDdl) node, createContext());
+
+        CatalogZoneDescriptor desc = invokeAndGetFirstEntry(cmd, 
NewZoneEntry.class).descriptor();
+
+        assertThat(desc.consistencyMode(), 
equalTo(ConsistencyMode.HIGH_AVAILABILITY));
+    }
+
+    @Test
+    public void testCreateZoneWithConsistencyModeInvalid() throws 
SqlParseException {
+        SqlNode node = parse("CREATE ZONE test0 WITH STORAGE_PROFILES='" + 
DEFAULT_STORAGE_PROFILE + "',"
+                + " CONSISTENCY_MODE='" + "MY_CUSTOM_MODE" + "'");
+
+        assertThat(node, instanceOf(SqlDdl.class));
+
+        assertThrows(
+                SqlException.class,
+                () -> converter.convert((SqlDdl) node, createContext()),
+                "Failed to parse consistency mode: MY_CUSTOM_MODE. Valid 
values are: [STRONG_CONSISTENCY, HIGH_AVAILABILITY]"
+        );
+    }
+
     @Test
     public void testCreateZoneWithOptions() throws SqlParseException {
         // Check non-conflicting options.
diff --git 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/sql/DistributionZoneSqlDdlParserTest.java
 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/sql/DistributionZoneSqlDdlParserTest.java
index 125b81fd63..8654739d99 100644
--- 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/sql/DistributionZoneSqlDdlParserTest.java
+++ 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/sql/DistributionZoneSqlDdlParserTest.java
@@ -96,7 +96,8 @@ public class DistributionZoneSqlDdlParserTest extends 
AbstractParserTest {
                         + "distribution_algorithm='test_Distribution', "
                         + "data_nodes_auto_adjust=1, "
                         + "data_nodes_auto_adjust_scale_up=2, "
-                        + "data_nodes_auto_adjust_scale_down=3"
+                        + "data_nodes_auto_adjust_scale_down=3,"
+                        + "consistency_mode='HIGH_AVAILABILITY'"
         );
 
         assertNotNull(createZone.createOptionList());
@@ -108,6 +109,7 @@ public class DistributionZoneSqlDdlParserTest extends 
AbstractParserTest {
         assertThatZoneOptionPresent(optList, 
ZoneOptionEnum.DISTRIBUTION_ALGORITHM, "test_Distribution");
         assertThatZoneOptionPresent(optList, ZoneOptionEnum.DATA_NODES_FILTER, 
"(\"US\" || \"EU\") && \"SSD\"");
         assertThatZoneOptionPresent(optList, 
ZoneOptionEnum.DATA_NODES_AUTO_ADJUST, 1);
+        assertThatZoneOptionPresent(optList, ZoneOptionEnum.CONSISTENCY_MODE, 
"HIGH_AVAILABILITY");
 
         expectUnparsed(createZone, "CREATE ZONE \"TEST_ZONE\" WITH "
                 + "\"REPLICAS\" = 2, "
@@ -116,7 +118,8 @@ public class DistributionZoneSqlDdlParserTest extends 
AbstractParserTest {
                 + "\"DISTRIBUTION_ALGORITHM\" = 'test_Distribution', "
                 + "\"DATA_NODES_AUTO_ADJUST\" = 1, "
                 + "\"DATA_NODES_AUTO_ADJUST_SCALE_UP\" = 2, "
-                + "\"DATA_NODES_AUTO_ADJUST_SCALE_DOWN\" = 3");
+                + "\"DATA_NODES_AUTO_ADJUST_SCALE_DOWN\" = 3, "
+                + "\"CONSISTENCY_MODE\" = 'HIGH_AVAILABILITY'");
     }
 
     /**

Reply via email to