You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by du...@apache.org on 2026/10/28 01:25:24 UTC

(shardingsphere) branch master updated: Improve ClickHouse SQL parsing support (#40377)

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

strongduanmu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new 2a79c2672d9 Improve ClickHouse SQL parsing support (#40377)
2a79c2672d9 is described below

commit 2a79c2672d9c3bcaf7295a0fec5d051a01e6e67f
Author: ZhangCheng <ch...@apache.org>
AuthorDate: Wed Oct 28 09:25:15 2026 +0800

    Improve ClickHouse SQL parsing support (#40377)
    
    * Support ClickHouse types, table functions and expressions
    
    * Support ClickHouse CREATE TABLE and DROP TABLE parsing
    
    * Support ClickHouse INSERT headers and INSERT SELECT parsing
    
    * Fix ClickHouse parser formatting violations
---
 .../src/main/antlr4/imports/clickhouse/BaseRule.g4 |  18 +-
 .../clickhouse/DDLStatement.g4}                    |  36 ++-
 .../main/antlr4/imports/clickhouse/DMLStatement.g4 |  20 +-
 .../sql/parser/autogen/ClickHouseStatement.g4      |   4 +-
 .../statement/ClickHouseStatementVisitor.java      |  69 ++++-
 .../type/ClickHouseDDLStatementVisitor.java        |  48 ++++
 .../type/ClickHouseDMLStatementVisitor.java        | 106 +++++--
 .../segment/definition/ColumnDefinitionAssert.java |   3 +
 .../CreateTableOptionDefinitionAssert.java         |   4 +
 .../asserts/segment/generic/DataTypeAssert.java    |  10 +
 .../standard/type/CreateTableStatementAssert.java  |   5 +
 .../standard/type/DropTableStatementAssert.java    |   7 +
 .../impl/definition/ExpectedColumnDefinition.java  |   3 +
 .../ExpectedCreateTableOptionDefinition.java       |  10 +
 .../segment/impl/generic/ExpectedDataType.java     |   6 +
 .../table/CreateTableStatementTestCase.java        |   3 +
 .../standard/table/DropTableStatementTestCase.java |   3 +
 .../src/main/resources/case/ddl/create-table.xml   | 157 ++++++++++
 .../src/main/resources/case/ddl/drop-table.xml     |   9 +
 .../src/main/resources/case/dml/clickhouse.xml     | 317 +++++++++++++++++++++
 .../resources/sql/supported/ddl/create-table.xml   |  19 ++
 .../resources/sql/supported/ddl/drop-table.xml     |   3 +
 .../resources/sql/supported/dml/clickhouse.xml     |  23 ++
 23 files changed, 834 insertions(+), 49 deletions(-)

diff --git a/parser/sql/engine/dialect/clickhouse/src/main/antlr4/imports/clickhouse/BaseRule.g4 b/parser/sql/engine/dialect/clickhouse/src/main/antlr4/imports/clickhouse/BaseRule.g4
index c7ae98d9f88..2123c6e6989 100644
--- a/parser/sql/engine/dialect/clickhouse/src/main/antlr4/imports/clickhouse/BaseRule.g4
+++ b/parser/sql/engine/dialect/clickhouse/src/main/antlr4/imports/clickhouse/BaseRule.g4
@@ -17,7 +17,7 @@
 
 grammar BaseRule;
 
-import Symbol, Keyword, ClickHouseKeyword, Literals;
+import Symbol, Keyword, ClickHouseKeyword, Literals, Comments;
 
 parameterMarker
     : QUESTION_
@@ -211,6 +211,11 @@ simpleExpr
     | LBE_ identifier expr RBE_
     | caseExpression
     | intervalExpression
+    | arrayExpression
+    ;
+
+arrayExpression
+    : LBT_ (expr (COMMA_ expr)*)? RBT_
     ;
 
 functionCall
@@ -218,7 +223,7 @@ functionCall
     ;
 
 aggregationFunction
-    : aggregationFunctionName LP_ distinct? (expr (COMMA_ expr)* | ASTERISK_)? RP_
+    : aggregationFunctionName LP_ distinct? (expr (COMMA_ expr)* | ASTERISK_)? RP_ overClause?
     ;
 
 aggregationFunctionName
@@ -254,7 +259,11 @@ trimFunction
     ;
 
 regularFunction
-    : regularFunctionName LP_ (expr (COMMA_ expr)* | ASTERISK_)? RP_
+    : regularFunctionName LP_ (expr (COMMA_ expr)* | ASTERISK_)? RP_ overClause?
+    ;
+
+overClause
+    : OVER LP_ (PARTITION BY expr (COMMA_ expr)*)? orderByClause? RP_
     ;
 
 regularFunctionName
@@ -305,6 +314,8 @@ orderByItem
 dataType
     : dataTypeName dataTypeLength? characterSet? collateClause?
     | dataTypeName LP_ STRING_ (COMMA_ STRING_)* RP_ characterSet? collateClause?
+    | dataTypeName LP_ NUMBER_ COMMA_ STRING_ RP_
+    | dataTypeName LP_ dataType (COMMA_ dataType)* RP_
     ;
 
 dataTypeName
@@ -318,6 +329,7 @@ dataTypeName
     | INT64 
     | FLOAT32 
     | FLOAT64
+    | DECIMAL
     | STRING 
     | FIXED_STRING
     | DATE 
diff --git a/parser/sql/engine/dialect/clickhouse/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/ClickHouseStatement.g4 b/parser/sql/engine/dialect/clickhouse/src/main/antlr4/imports/clickhouse/DDLStatement.g4
similarity index 60%
copy from parser/sql/engine/dialect/clickhouse/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/ClickHouseStatement.g4
copy to parser/sql/engine/dialect/clickhouse/src/main/antlr4/imports/clickhouse/DDLStatement.g4
index 12be523f458..3197e75a179 100644
--- a/parser/sql/engine/dialect/clickhouse/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/ClickHouseStatement.g4
+++ b/parser/sql/engine/dialect/clickhouse/src/main/antlr4/imports/clickhouse/DDLStatement.g4
@@ -15,14 +15,34 @@
  * limitations under the License.
  */
 
-grammar ClickHouseStatement;
+grammar DDLStatement;
 
-import DMLStatement;
+import BaseRule;
 
-execute
-    : (select
-    | insert
-    | update
-    | delete
-    ) SEMI_? EOF
+createTable
+    : CREATE TEMPORARY? TABLE ifNotExists? tableName LP_ columnDefinition (COMMA_ columnDefinition)* RP_ tableEngineClause? (ORDER BY expr)?
+    ;
+
+ifNotExists
+    : IF NOT EXISTS
+    ;
+
+columnDefinition
+    : columnName dataType (NOT? NULL)?
+    ;
+
+tableEngineClause
+    : ENGINE EQ_? tableEngine
+    ;
+
+tableEngine
+    : identifier (LP_ (expr (COMMA_ expr)*)? RP_)?
+    ;
+
+dropTable
+    : DROP TEMPORARY? TABLE ifExists? tableName SYNC?
+    ;
+
+ifExists
+    : IF EXISTS
     ;
diff --git a/parser/sql/engine/dialect/clickhouse/src/main/antlr4/imports/clickhouse/DMLStatement.g4 b/parser/sql/engine/dialect/clickhouse/src/main/antlr4/imports/clickhouse/DMLStatement.g4
index 48500a57f70..07503c3b664 100644
--- a/parser/sql/engine/dialect/clickhouse/src/main/antlr4/imports/clickhouse/DMLStatement.g4
+++ b/parser/sql/engine/dialect/clickhouse/src/main/antlr4/imports/clickhouse/DMLStatement.g4
@@ -24,11 +24,15 @@ insert
     ;
 
 insertValuesClause
-    : columnNames? (VALUES ) assignmentValues (COMMA_ assignmentValues)*
+    : insertColumnNames? (VALUES (assignmentValues (COMMA_ assignmentValues)*)? | FORMAT identifier)?
     ;
 
 insertSelectClause
-    : columnNames? select
+    : insertColumnNames? select
+    ;
+
+insertColumnNames
+    : LP_ columnName (COMMA_ columnName)* RP_
     ;
 
 assignmentValues
@@ -65,7 +69,15 @@ singleTableClause
     ;
 
 select
-    : combineClause
+    : withClause? combineClause
+    ;
+
+withClause
+    : WITH withConstant (COMMA_ withConstant)*
+    ;
+
+withConstant
+    : (numberLiterals | stringLiterals | booleanLiterals | nullValueLiterals | parameterMarker) AS identifier
     ;
 
 combineClause
@@ -121,7 +133,7 @@ tableReference
     ;
 
 tableFactor
-    : tableName (AS? alias)? | subquery AS? alias columnNames? | LP_ tableReferences RP_
+    : regularFunction (AS? alias)? | tableName (AS? alias)? | subquery AS? alias columnNames? | LP_ tableReferences RP_
     ;
 
 joinedTable
diff --git a/parser/sql/engine/dialect/clickhouse/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/ClickHouseStatement.g4 b/parser/sql/engine/dialect/clickhouse/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/ClickHouseStatement.g4
index 12be523f458..5c3ddc129e0 100644
--- a/parser/sql/engine/dialect/clickhouse/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/ClickHouseStatement.g4
+++ b/parser/sql/engine/dialect/clickhouse/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/ClickHouseStatement.g4
@@ -17,12 +17,14 @@
 
 grammar ClickHouseStatement;
 
-import DMLStatement;
+import DMLStatement, DDLStatement;
 
 execute
     : (select
     | insert
     | update
     | delete
+    | createTable
+    | dropTable
     ) SEMI_? EOF
     ;
diff --git a/parser/sql/engine/dialect/clickhouse/src/main/java/org/apache/shardingsphere/sql/parser/engine/clickhouse/visitor/statement/ClickHouseStatementVisitor.java b/parser/sql/engine/dialect/clickhouse/src/main/java/org/apache/shardingsphere/sql/parser/engine/clickhouse/visitor/statement/ClickHouseStatementVisitor.java
index e70da7ae9d0..5a5b58e8a29 100644
--- a/parser/sql/engine/dialect/clickhouse/src/main/java/org/apache/shardingsphere/sql/parser/engine/clickhouse/visitor/statement/ClickHouseStatementVisitor.java
+++ b/parser/sql/engine/dialect/clickhouse/src/main/java/org/apache/shardingsphere/sql/parser/engine/clickhouse/visitor/statement/ClickHouseStatementVisitor.java
@@ -23,8 +23,10 @@ import lombok.RequiredArgsConstructor;
 import org.antlr.v4.runtime.ParserRuleContext;
 import org.antlr.v4.runtime.Token;
 import org.antlr.v4.runtime.misc.Interval;
+import org.antlr.v4.runtime.tree.ParseTree;
 import org.antlr.v4.runtime.tree.TerminalNode;
 import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
+import org.apache.shardingsphere.infra.annotation.HighFrequencyInvocation;
 import org.apache.shardingsphere.sql.parser.api.ASTNode;
 import org.apache.shardingsphere.sql.parser.autogen.ClickHouseStatementBaseVisitor;
 import org.apache.shardingsphere.sql.parser.autogen.ClickHouseStatementParser;
@@ -57,6 +59,7 @@ import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.DataT
 import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.DataTypeSegment;
 import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.OwnerSegment;
 import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.ParameterMarkerSegment;
+import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.WindowItemSegment;
 import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.TableNameSegment;
 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.dml.SelectStatement;
@@ -71,6 +74,7 @@ import org.apache.shardingsphere.sql.parser.statement.core.value.literal.impl.Ot
 import org.apache.shardingsphere.sql.parser.statement.core.value.literal.impl.StringLiteralValue;
 import org.apache.shardingsphere.sql.parser.statement.core.value.parametermarker.ParameterMarkerValue;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.LinkedList;
@@ -375,6 +379,9 @@ public abstract class ClickHouseStatementVisitor extends ClickHouseStatementBase
         if (null != ctx.functionCall()) {
             return visit(ctx.functionCall());
         }
+        if (null != ctx.arrayExpression()) {
+            return visit(ctx.arrayExpression());
+        }
         if (null != ctx.columnName()) {
             return visit(ctx.columnName());
         }
@@ -403,11 +410,16 @@ public abstract class ClickHouseStatementVisitor extends ClickHouseStatementBase
     }
     
     @Override
+    @HighFrequencyInvocation
     public final ASTNode visitAggregationFunction(final ClickHouseStatementParser.AggregationFunctionContext ctx) {
         String aggregationType = ctx.aggregationFunctionName().getText();
-        return AggregationType.isAggregationType(aggregationType)
+        ASTNode result = AggregationType.isAggregationType(aggregationType)
                 ? createAggregationSegment(ctx, aggregationType)
                 : new ExpressionProjectionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), getOriginalText(ctx));
+        if (null != ctx.overClause() && result instanceof AggregationProjectionSegment) {
+            ((AggregationProjectionSegment) result).setWindow((WindowItemSegment) visit(ctx.overClause()));
+        }
+        return result;
     }
     
     private ASTNode createAggregationSegment(final ClickHouseStatementParser.AggregationFunctionContext ctx, final String aggregationType) {
@@ -423,12 +435,21 @@ public abstract class ClickHouseStatementVisitor extends ClickHouseStatementBase
         return result;
     }
     
-    private Collection<ExpressionSegment> getExpressions(final ClickHouseStatementParser.AggregationFunctionContext ctx) {
-        return null == ctx.expr() ? Collections.emptyList() : ctx.expr().stream().map(each -> (ExpressionSegment) visit(each)).collect(Collectors.toList());
+    private String getDistinctExpression(final ClickHouseStatementParser.AggregationFunctionContext ctx) {
+        StringBuilder result = new StringBuilder();
+        ParseTree end = ctx.RP_();
+        for (int i = 3; i < ctx.getChildCount() && ctx.getChild(i) != end; i++) {
+            result.append(ctx.getChild(i).getText());
+        }
+        return result.toString();
     }
     
-    private String getDistinctExpression(final ClickHouseStatementParser.AggregationFunctionContext ctx) {
-        return IntStream.range(3, ctx.getChildCount() - 1).mapToObj(i -> ctx.getChild(i).getText()).collect(Collectors.joining());
+    private Collection<ExpressionSegment> getExpressions(final ClickHouseStatementParser.AggregationFunctionContext ctx) {
+        Collection<ExpressionSegment> result = new ArrayList<>(ctx.expr().size());
+        for (ClickHouseStatementParser.ExprContext each : ctx.expr()) {
+            result.add((ExpressionSegment) visit(each));
+        }
+        return result;
     }
     
     @Override
@@ -439,6 +460,7 @@ public abstract class ClickHouseStatementVisitor extends ClickHouseStatementBase
     }
     
     @Override
+    @HighFrequencyInvocation
     public final ASTNode visitCastFunction(final ClickHouseStatementParser.CastFunctionContext ctx) {
         FunctionSegment result = new FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), ctx.CAST().getText(), getOriginalText(ctx));
         ASTNode exprSegment = visit(ctx.expr());
@@ -446,15 +468,48 @@ public abstract class ClickHouseStatementVisitor extends ClickHouseStatementBase
             result.getParameters().add((ColumnSegment) exprSegment);
         } else if (exprSegment instanceof LiteralExpressionSegment) {
             result.getParameters().add((LiteralExpressionSegment) exprSegment);
+        } else if (exprSegment instanceof ListExpression) {
+            result.getParameters().add((ListExpression) exprSegment);
         }
         result.getParameters().add((DataTypeSegment) visit(ctx.dataType()));
         return result;
     }
     
     @Override
+    @HighFrequencyInvocation
     public final ASTNode visitRegularFunction(final ClickHouseStatementParser.RegularFunctionContext ctx) {
         FunctionSegment result = new FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), ctx.regularFunctionName().getText(), getOriginalText(ctx));
-        result.getParameters().addAll(ctx.expr().stream().map(each -> (ExpressionSegment) visit(each)).collect(Collectors.toList()));
+        for (ClickHouseStatementParser.ExprContext each : ctx.expr()) {
+            result.getParameters().add((ExpressionSegment) visit(each));
+        }
+        if (null != ctx.overClause()) {
+            result.setWindow((WindowItemSegment) visit(ctx.overClause()));
+        }
+        return result;
+    }
+    
+    @Override
+    @HighFrequencyInvocation
+    public final ASTNode visitOverClause(final ClickHouseStatementParser.OverClauseContext ctx) {
+        WindowItemSegment result = new WindowItemSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex());
+        Collection<ExpressionSegment> partitions = new ArrayList<>(ctx.expr().size());
+        for (ClickHouseStatementParser.ExprContext each : ctx.expr()) {
+            partitions.add((ExpressionSegment) visit(each));
+        }
+        result.setPartitionListSegments(partitions);
+        if (null != ctx.orderByClause()) {
+            result.setOrderBySegment((OrderBySegment) visit(ctx.orderByClause()));
+        }
+        return result;
+    }
+    
+    @Override
+    @HighFrequencyInvocation
+    public final ASTNode visitArrayExpression(final ClickHouseStatementParser.ArrayExpressionContext ctx) {
+        ListExpression result = new ListExpression(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex());
+        for (ClickHouseStatementParser.ExprContext each : ctx.expr()) {
+            result.getItems().add((ExpressionSegment) visit(each));
+        }
         return result;
     }
     
@@ -481,7 +536,7 @@ public abstract class ClickHouseStatementVisitor extends ClickHouseStatementBase
     @Override
     public final ASTNode visitDataType(final ClickHouseStatementParser.DataTypeContext ctx) {
         DataTypeSegment result = new DataTypeSegment();
-        result.setDataTypeName(((KeywordValue) visit(ctx.dataTypeName())).getValue());
+        result.setDataTypeName(ctx.dataType().isEmpty() && ctx.STRING_().isEmpty() ? ((KeywordValue) visit(ctx.dataTypeName())).getValue() : getOriginalText(ctx));
         result.setStartIndex(ctx.start.getStartIndex());
         result.setStopIndex(ctx.stop.getStopIndex());
         if (null != ctx.dataTypeLength()) {
diff --git a/parser/sql/engine/dialect/clickhouse/src/main/java/org/apache/shardingsphere/sql/parser/engine/clickhouse/visitor/statement/type/ClickHouseDDLStatementVisitor.java b/parser/sql/engine/dialect/clickhouse/src/main/java/org/apache/shardingsphere/sql/parser/engine/clickhouse/visitor/statement/type/ClickHouseDDLStatementVisitor.java
index cc184eee137..d2a3837021d 100644
--- a/parser/sql/engine/dialect/clickhouse/src/main/java/org/apache/shardingsphere/sql/parser/engine/clickhouse/visitor/statement/type/ClickHouseDDLStatementVisitor.java
+++ b/parser/sql/engine/dialect/clickhouse/src/main/java/org/apache/shardingsphere/sql/parser/engine/clickhouse/visitor/statement/type/ClickHouseDDLStatementVisitor.java
@@ -18,15 +18,63 @@
 package org.apache.shardingsphere.sql.parser.engine.clickhouse.visitor.statement.type;
 
 import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
+import org.apache.shardingsphere.infra.annotation.HighFrequencyInvocation;
+import org.apache.shardingsphere.sql.parser.api.ASTNode;
 import org.apache.shardingsphere.sql.parser.api.visitor.statement.type.DDLStatementVisitor;
+import org.apache.shardingsphere.sql.parser.autogen.ClickHouseStatementParser;
 import org.apache.shardingsphere.sql.parser.engine.clickhouse.visitor.statement.ClickHouseStatementVisitor;
+import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.column.ColumnDefinitionSegment;
+import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.engine.EngineSegment;
+import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.table.CreateTableOptionSegment;
+import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment;
+import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.DataTypeSegment;
+import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
+import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.table.CreateTableStatement;
+import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.table.DropTableStatement;
+import org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
 
 /**
  * DDL statement visitor for ClickHouse.
  */
+@HighFrequencyInvocation
 public final class ClickHouseDDLStatementVisitor extends ClickHouseStatementVisitor implements DDLStatementVisitor {
     
     public ClickHouseDDLStatementVisitor(final DatabaseType databaseType) {
         super(databaseType);
     }
+    
+    @Override
+    public ASTNode visitCreateTable(final ClickHouseStatementParser.CreateTableContext ctx) {
+        Collection<ColumnDefinitionSegment> columns = new ArrayList<>(ctx.columnDefinition().size());
+        for (ClickHouseStatementParser.ColumnDefinitionContext each : ctx.columnDefinition()) {
+            columns.add((ColumnDefinitionSegment) visit(each));
+        }
+        return CreateTableStatement.builder().databaseType(getDatabaseType()).table((SimpleTableSegment) visit(ctx.tableName()))
+                .ifNotExists(null != ctx.ifNotExists()).temporary(null != ctx.TEMPORARY()).columnDefinitions(columns)
+                .createTableOption(null == ctx.tableEngineClause() ? null : (CreateTableOptionSegment) visit(ctx.tableEngineClause())).build();
+    }
+    
+    @Override
+    public ASTNode visitColumnDefinition(final ClickHouseStatementParser.ColumnDefinitionContext ctx) {
+        boolean notNull = null != ctx.NOT() || null == ctx.NULL() && !"Nullable".equalsIgnoreCase(ctx.dataType().dataTypeName().getText());
+        return new ColumnDefinitionSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), (ColumnSegment) visit(ctx.columnName()),
+                (DataTypeSegment) visit(ctx.dataType()), false, notNull, getOriginalText(ctx));
+    }
+    
+    @Override
+    public ASTNode visitTableEngineClause(final ClickHouseStatementParser.TableEngineClauseContext ctx) {
+        CreateTableOptionSegment result = new CreateTableOptionSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex());
+        ClickHouseStatementParser.TableEngineContext engine = ctx.tableEngine();
+        result.setEngine(new EngineSegment(engine.start.getStartIndex(), engine.stop.getStopIndex(), ((IdentifierValue) visit(engine.identifier())).getValue()));
+        return result;
+    }
+    
+    @Override
+    public ASTNode visitDropTable(final ClickHouseStatementParser.DropTableContext ctx) {
+        return new DropTableStatement(getDatabaseType(), Collections.singletonList((SimpleTableSegment) visit(ctx.tableName())), null != ctx.ifExists(), null != ctx.TEMPORARY(), false);
+    }
 }
diff --git a/parser/sql/engine/dialect/clickhouse/src/main/java/org/apache/shardingsphere/sql/parser/engine/clickhouse/visitor/statement/type/ClickHouseDMLStatementVisitor.java b/parser/sql/engine/dialect/clickhouse/src/main/java/org/apache/shardingsphere/sql/parser/engine/clickhouse/visitor/statement/type/ClickHouseDMLStatementVisitor.java
index ffe87279c07..f1873ceec84 100644
--- a/parser/sql/engine/dialect/clickhouse/src/main/java/org/apache/shardingsphere/sql/parser/engine/clickhouse/visitor/statement/type/ClickHouseDMLStatementVisitor.java
+++ b/parser/sql/engine/dialect/clickhouse/src/main/java/org/apache/shardingsphere/sql/parser/engine/clickhouse/visitor/statement/type/ClickHouseDMLStatementVisitor.java
@@ -19,13 +19,14 @@ package org.apache.shardingsphere.sql.parser.engine.clickhouse.visitor.statement
 
 import org.antlr.v4.runtime.misc.Interval;
 import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
+import org.apache.shardingsphere.infra.annotation.HighFrequencyInvocation;
 import org.apache.shardingsphere.sql.parser.api.ASTNode;
 import org.apache.shardingsphere.sql.parser.api.visitor.statement.type.DMLStatementVisitor;
 import org.apache.shardingsphere.sql.parser.autogen.ClickHouseStatementParser;
 import org.apache.shardingsphere.sql.parser.autogen.ClickHouseStatementParser.AssignmentValuesContext;
-import org.apache.shardingsphere.sql.parser.autogen.ClickHouseStatementParser.ColumnNamesContext;
 import org.apache.shardingsphere.sql.parser.autogen.ClickHouseStatementParser.DeleteContext;
 import org.apache.shardingsphere.sql.parser.autogen.ClickHouseStatementParser.ExprContext;
+import org.apache.shardingsphere.sql.parser.autogen.ClickHouseStatementParser.InsertColumnNamesContext;
 import org.apache.shardingsphere.sql.parser.autogen.ClickHouseStatementParser.InsertContext;
 import org.apache.shardingsphere.sql.parser.autogen.ClickHouseStatementParser.InsertValuesClauseContext;
 import org.apache.shardingsphere.sql.parser.autogen.ClickHouseStatementParser.SelectClauseContext;
@@ -40,6 +41,7 @@ import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.In
 import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.BinaryOperationExpression;
 import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment;
 import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.FunctionSegment;
+import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ListExpression;
 import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.complex.CommonExpressionSegment;
 import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.simple.LiteralExpressionSegment;
 import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.simple.ParameterMarkerExpressionSegment;
@@ -59,6 +61,7 @@ import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.predicate
 import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.predicate.WhereSegment;
 import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.AliasSegment;
 import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.OwnerSegment;
+import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.FunctionTableSegment;
 import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.JoinTableSegment;
 import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SubqueryTableSegment;
@@ -70,10 +73,13 @@ import org.apache.shardingsphere.sql.parser.statement.core.statement.type.dml.Up
 import org.apache.shardingsphere.sql.parser.statement.core.value.collection.CollectionValue;
 import org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
 import org.apache.shardingsphere.sql.parser.statement.core.value.literal.impl.BooleanLiteralValue;
+import org.apache.shardingsphere.sql.parser.statement.core.value.parametermarker.ParameterMarkerValue;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.LinkedList;
+import java.util.List;
 import java.util.stream.Collectors;
 
 /**
@@ -86,39 +92,57 @@ public final class ClickHouseDMLStatementVisitor extends ClickHouseStatementVisi
     }
     
     @Override
+    @HighFrequencyInvocation
     public ASTNode visitInsert(final InsertContext ctx) {
-        InsertStatement insertValuesStatement = (InsertStatement) visit(ctx.insertValuesClause());
+        InsertStatement insertClauseStatement = (InsertStatement) visit(null == ctx.insertValuesClause() ? ctx.insertSelectClause() : ctx.insertValuesClause());
         InsertStatement result = InsertStatement.builder().databaseType(getDatabaseType()).table((SimpleTableSegment) visit(ctx.tableName()))
-                .insertColumns(insertValuesStatement.getInsertColumns().orElse(null)).insertSelect(insertValuesStatement.getInsertSelect().orElse(null))
-                .setAssignment(insertValuesStatement.getSetAssignment().orElse(null)).onDuplicateKeyColumns(insertValuesStatement.getOnDuplicateKeyColumns().orElse(null))
-                .valueReference(insertValuesStatement.getValueReference().orElse(null)).returning(insertValuesStatement.getReturning().orElse(null))
-                .output(insertValuesStatement.getOutput().orElse(null)).with(insertValuesStatement.getWith().orElse(null))
-                .multiTableInsertType(insertValuesStatement.getMultiTableInsertType().orElse(null))
-                .multiTableInsertInto(insertValuesStatement.getMultiTableInsertInto().orElse(null))
-                .multiTableConditionalInto(insertValuesStatement.getMultiTableConditionalInto().orElse(null)).where(insertValuesStatement.getWhere().orElse(null))
-                .exec(insertValuesStatement.getExec().orElse(null)).withTableHint(insertValuesStatement.getWithTableHint().orElse(null))
-                .rowSetFunction(insertValuesStatement.getRowSetFunction().orElse(null)).ignore(insertValuesStatement.isIgnore()).replace(insertValuesStatement.isReplace())
-                .values(new LinkedList<>(insertValuesStatement.getValues())).derivedInsertColumns(new LinkedList<>(insertValuesStatement.getDerivedInsertColumns())).build();
-        result.addParameterMarkers(insertValuesStatement.getParameterMarkers());
-        result.getVariableNames().addAll(insertValuesStatement.getVariableNames());
-        result.getComments().addAll(insertValuesStatement.getComments());
+                .insertColumns(insertClauseStatement.getInsertColumns().orElse(null)).insertSelect(insertClauseStatement.getInsertSelect().orElse(null))
+                .setAssignment(insertClauseStatement.getSetAssignment().orElse(null)).onDuplicateKeyColumns(insertClauseStatement.getOnDuplicateKeyColumns().orElse(null))
+                .valueReference(insertClauseStatement.getValueReference().orElse(null)).returning(insertClauseStatement.getReturning().orElse(null))
+                .output(insertClauseStatement.getOutput().orElse(null)).with(insertClauseStatement.getWith().orElse(null))
+                .multiTableInsertType(insertClauseStatement.getMultiTableInsertType().orElse(null))
+                .multiTableInsertInto(insertClauseStatement.getMultiTableInsertInto().orElse(null))
+                .multiTableConditionalInto(insertClauseStatement.getMultiTableConditionalInto().orElse(null)).where(insertClauseStatement.getWhere().orElse(null))
+                .exec(insertClauseStatement.getExec().orElse(null)).withTableHint(insertClauseStatement.getWithTableHint().orElse(null))
+                .rowSetFunction(insertClauseStatement.getRowSetFunction().orElse(null)).ignore(insertClauseStatement.isIgnore()).replace(insertClauseStatement.isReplace())
+                .values(new LinkedList<>(insertClauseStatement.getValues())).derivedInsertColumns(new LinkedList<>(insertClauseStatement.getDerivedInsertColumns())).build();
+        result.addParameterMarkers(insertClauseStatement.getParameterMarkers());
+        result.getVariableNames().addAll(insertClauseStatement.getVariableNames());
+        result.getComments().addAll(insertClauseStatement.getComments());
         result.addParameterMarkers(getParameterMarkerSegments());
         return result;
     }
     
-    @SuppressWarnings("unchecked")
     @Override
+    @HighFrequencyInvocation
     public ASTNode visitInsertValuesClause(final InsertValuesClauseContext ctx) {
-        InsertColumnsSegment insertColumns;
-        if (null != ctx.columnNames()) {
-            ColumnNamesContext columnNames = ctx.columnNames();
-            CollectionValue<ColumnSegment> columnSegments = (CollectionValue<ColumnSegment>) visit(columnNames);
-            insertColumns = new InsertColumnsSegment(columnNames.start.getStartIndex(), columnNames.stop.getStopIndex(), columnSegments.getValue());
-        } else {
-            insertColumns = new InsertColumnsSegment(ctx.start.getStartIndex() - 1, ctx.start.getStartIndex() - 1, Collections.emptyList());
+        InsertColumnsSegment insertColumns = null == ctx.insertColumnNames()
+                ? new InsertColumnsSegment(ctx.start.getStartIndex() - 1, ctx.start.getStartIndex() - 1, Collections.emptyList())
+                : createInsertColumns(ctx.insertColumnNames());
+        List<InsertValuesSegment> values = new ArrayList<>(ctx.assignmentValues().size());
+        for (AssignmentValuesContext each : ctx.assignmentValues()) {
+            values.add((InsertValuesSegment) visit(each));
+        }
+        return InsertStatement.builder().databaseType(getDatabaseType()).insertColumns(insertColumns).values(values).build();
+    }
+    
+    private InsertColumnsSegment createInsertColumns(final InsertColumnNamesContext ctx) {
+        Collection<ColumnSegment> columns = new ArrayList<>(ctx.columnName().size());
+        for (ClickHouseStatementParser.ColumnNameContext each : ctx.columnName()) {
+            columns.add((ColumnSegment) visit(each));
         }
-        return InsertStatement.builder().databaseType(getDatabaseType()).insertColumns(insertColumns)
-                .values(ctx.assignmentValues().stream().map(each -> (InsertValuesSegment) visit(each)).collect(Collectors.toList())).build();
+        return new InsertColumnsSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), columns);
+    }
+    
+    @Override
+    @HighFrequencyInvocation
+    public ASTNode visitInsertSelectClause(final ClickHouseStatementParser.InsertSelectClauseContext ctx) {
+        InsertColumnsSegment insertColumns = null == ctx.insertColumnNames()
+                ? new InsertColumnsSegment(ctx.start.getStartIndex() - 1, ctx.start.getStartIndex() - 1, Collections.emptyList())
+                : createInsertColumns(ctx.insertColumnNames());
+        SelectStatement select = (SelectStatement) visit(ctx.select());
+        SubquerySegment subquery = new SubquerySegment(ctx.select().start.getStartIndex(), ctx.select().stop.getStopIndex(), select, getOriginalText(ctx.select()));
+        return InsertStatement.builder().databaseType(getDatabaseType()).insertColumns(insertColumns).insertSelect(subquery).build();
     }
     
     @Override
@@ -183,13 +207,30 @@ public final class ClickHouseDMLStatementVisitor extends ClickHouseStatementVisi
     }
     
     @Override
+    @HighFrequencyInvocation
     public ASTNode visitSelect(final ClickHouseStatementParser.SelectContext ctx) {
-        // TODO :Unsupported for withClause.
+        Collection<String> variables = null == ctx.withClause() ? Collections.emptyList() : ((CollectionValue<String>) visit(ctx.withClause())).getValue();
         SelectStatement result = (SelectStatement) visit(ctx.combineClause());
+        result.getVariableNames().addAll(variables);
         result.addParameterMarkers(getParameterMarkerSegments());
         return result;
     }
     
+    @Override
+    @HighFrequencyInvocation
+    public ASTNode visitWithClause(final ClickHouseStatementParser.WithClauseContext ctx) {
+        CollectionValue<String> result = new CollectionValue<>();
+        for (ClickHouseStatementParser.WithConstantContext each : ctx.withConstant()) {
+            if (null != each.parameterMarker()) {
+                ParameterMarkerValue marker = (ParameterMarkerValue) visit(each.parameterMarker());
+                getParameterMarkerSegments().add(new ParameterMarkerExpressionSegment(each.parameterMarker().getStart().getStartIndex(), each.parameterMarker().getStop().getStopIndex(),
+                        marker.getValue(), marker.getType()));
+            }
+            result.getValue().add(((IdentifierValue) visit(each.identifier())).getValue());
+        }
+        return result;
+    }
+    
     @Override
     public ASTNode visitCombineClause(final ClickHouseStatementParser.CombineClauseContext ctx) {
         // TODO :Unsupported for union SQL.
@@ -298,6 +339,12 @@ public final class ClickHouseDMLStatementVisitor extends ClickHouseStatementVisi
             result.setAlias(alias);
             return result;
         }
+        if (projection instanceof ListExpression) {
+            ListExpression segment = (ListExpression) projection;
+            ExpressionProjectionSegment result = new ExpressionProjectionSegment(segment.getStartIndex(), segment.getStopIndex(), getOriginalText(ctx.expr()), segment);
+            result.setAlias(alias);
+            return result;
+        }
         // FIXME :For DISTINCT()
         if (projection instanceof ColumnSegment) {
             ExpressionProjectionSegment result = new ExpressionProjectionSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), getOriginalText(ctx), (ColumnSegment) projection);
@@ -383,6 +430,13 @@ public final class ClickHouseDMLStatementVisitor extends ClickHouseStatementVisi
     
     @Override
     public ASTNode visitTableFactor(final ClickHouseStatementParser.TableFactorContext ctx) {
+        if (null != ctx.regularFunction()) {
+            FunctionTableSegment result = new FunctionTableSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), (FunctionSegment) visit(ctx.regularFunction()));
+            if (null != ctx.alias()) {
+                result.setAlias((AliasSegment) visit(ctx.alias()));
+            }
+            return result;
+        }
         if (null != ctx.subquery()) {
             SelectStatement subquery = (SelectStatement) visit(ctx.subquery());
             SubquerySegment subquerySegment = new SubquerySegment(ctx.subquery().start.getStartIndex(), ctx.subquery().stop.getStopIndex(), subquery, getOriginalText(ctx.subquery()));
diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/definition/ColumnDefinitionAssert.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/definition/ColumnDefinitionAssert.java
index f59702b6d91..662d13b24a9 100644
--- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/definition/ColumnDefinitionAssert.java
+++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/definition/ColumnDefinitionAssert.java
@@ -46,6 +46,9 @@ public final class ColumnDefinitionAssert {
      */
     public static void assertIs(final SQLCaseAssertContext assertContext, final ColumnDefinitionSegment actual, final ExpectedColumnDefinition expected) {
         assertColumnName(assertContext, actual, expected);
+        if (null != expected.getText()) {
+            assertThat(assertContext.getText("Column definition text assertion error: "), actual.getText(), is(expected.getText()));
+        }
         if (null != expected.getType()) {
             assertNotNull(actual.getDataType(), assertContext.getText("Column definition data type should exist."));
             assertThat(assertContext.getText("Column definition data type assertion error: "), actual.getDataType().getDataTypeName(), is(expected.getType()));
diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/definition/CreateTableOptionDefinitionAssert.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/definition/CreateTableOptionDefinitionAssert.java
index d374a64b932..e7a795e81ee 100644
--- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/definition/CreateTableOptionDefinitionAssert.java
+++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/definition/CreateTableOptionDefinitionAssert.java
@@ -42,6 +42,10 @@ public final class CreateTableOptionDefinitionAssert {
      * @param expected expected create table option
      */
     public static void assertIs(final SQLCaseAssertContext assertContext, final CreateTableOptionSegment actual, final ExpectedCreateTableOptionDefinition expected) {
+        if (expected.isAssertIndices()) {
+            assertThat(assertContext.getText("Create table option start index assertion error: "), actual.getStartIndex(), is(expected.getStartIndex()));
+            assertThat(assertContext.getText("Create table option stop index assertion error: "), actual.getStopIndex(), is(expected.getStopIndex()));
+        }
         if (null == expected.getEngine()) {
             assertFalse(actual.getEngine().isPresent(), assertContext.getText("Actual engine should not exist."));
         } else {
diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/generic/DataTypeAssert.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/generic/DataTypeAssert.java
index 8bc453c1444..37e42eac5b4 100644
--- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/generic/DataTypeAssert.java
+++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/generic/DataTypeAssert.java
@@ -27,6 +27,8 @@ import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.s
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
 
 /**
  *  Data type assert.
@@ -48,6 +50,14 @@ public final class DataTypeAssert {
                 actual.getStartIndex(), is(expected.getStartIndex()));
         assertThat(assertContext.getText(String.format("%s end index assertion error: ", "dataType")),
                 actual.getStopIndex(), is(expected.getStopIndex()));
+        if (Boolean.TRUE.equals(expected.getLengthPresent())) {
+            assertNotNull(actual.getDataLength(), assertContext.getText("Data type length should exist."));
+        } else if (Boolean.FALSE.equals(expected.getLengthPresent())) {
+            assertNull(actual.getDataLength(), assertContext.getText("Data type length should not exist."));
+        }
+        if (null != expected.getScale()) {
+            assertThat(assertContext.getText("Data type scale assertion error: "), actual.getDataLength().getScale().get(), is(expected.getScale()));
+        }
         if (null != expected.getDataLength()) {
             DataTypeLengthSegment actualDataLength = actual.getDataLength();
             ExpectedDataTypeLength expectedDataLength = expected.getDataLength();
diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/standard/type/CreateTableStatementAssert.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/standard/type/CreateTableStatementAssert.java
index 13411525eee..e91d9f067f1 100644
--- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/standard/type/CreateTableStatementAssert.java
+++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/standard/type/CreateTableStatementAssert.java
@@ -59,6 +59,11 @@ public final class CreateTableStatementAssert {
      * @param expected expected create table statement test case
      */
     public static void assertIs(final SQLCaseAssertContext assertContext, final CreateTableStatement actual, final CreateTableStatementTestCase expected) {
+        if (Boolean.TRUE.equals(expected.getIfNotExists())) {
+            assertTrue(actual.isIfNotExists(), assertContext.getText("Conditional table flag assertion error: "));
+        } else if (Boolean.FALSE.equals(expected.getIfNotExists())) {
+            assertFalse(actual.isIfNotExists(), assertContext.getText("Conditional table flag assertion error: "));
+        }
         if (null != expected.getTemporary()) {
             assertThat(assertContext.getText("Temporary table assertion error: "), actual.isTemporary(), is(expected.getTemporary()));
         }
diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/standard/type/DropTableStatementAssert.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/standard/type/DropTableStatementAssert.java
index 5d086c0cdc5..6e204e1eb6e 100644
--- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/standard/type/DropTableStatementAssert.java
+++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/standard/type/DropTableStatementAssert.java
@@ -26,6 +26,8 @@ import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.s
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 /**
  * Drop table statement assert.
@@ -41,6 +43,11 @@ public final class DropTableStatementAssert {
      * @param expected expected drop table statement test case
      */
     public static void assertIs(final SQLCaseAssertContext assertContext, final DropTableStatement actual, final DropTableStatementTestCase expected) {
+        if (Boolean.TRUE.equals(expected.getIfExists())) {
+            assertTrue(actual.isIfExists(), assertContext.getText("Conditional table flag assertion error: "));
+        } else if (Boolean.FALSE.equals(expected.getIfExists())) {
+            assertFalse(actual.isIfExists(), assertContext.getText("Conditional table flag assertion error: "));
+        }
         if (null != expected.getTemporary()) {
             assertThat(assertContext.getText("Temporary table assertion error: "), actual.isTemporary(), is(expected.getTemporary()));
         }
diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/definition/ExpectedColumnDefinition.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/definition/ExpectedColumnDefinition.java
index 8d8a068baa7..0634210319c 100644
--- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/definition/ExpectedColumnDefinition.java
+++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/definition/ExpectedColumnDefinition.java
@@ -37,6 +37,9 @@ import java.util.List;
 @Setter
 public final class ExpectedColumnDefinition extends AbstractExpectedSQLSegment {
     
+    @XmlAttribute
+    private String text;
+    
     @XmlAttribute
     private String type;
     
diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/definition/ExpectedCreateTableOptionDefinition.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/definition/ExpectedCreateTableOptionDefinition.java
index 11d4943ed6d..8b3f01b5150 100644
--- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/definition/ExpectedCreateTableOptionDefinition.java
+++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/definition/ExpectedCreateTableOptionDefinition.java
@@ -21,6 +21,7 @@ import lombok.Getter;
 import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.comments.ExpectedComment;
 import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.engine.ExpectedEngineClause;
 
+import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
 
 /**
@@ -29,6 +30,15 @@ import javax.xml.bind.annotation.XmlElement;
 @Getter
 public final class ExpectedCreateTableOptionDefinition {
     
+    @XmlAttribute(name = "assert-indices")
+    private boolean assertIndices;
+    
+    @XmlAttribute(name = "start-index")
+    private int startIndex;
+    
+    @XmlAttribute(name = "stop-index")
+    private int stopIndex;
+    
     @XmlElement(name = "engine")
     private ExpectedEngineClause engine;
     
diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/generic/ExpectedDataType.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/generic/ExpectedDataType.java
index 425d5c91693..107c1722e2c 100644
--- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/generic/ExpectedDataType.java
+++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/generic/ExpectedDataType.java
@@ -34,6 +34,12 @@ public final class ExpectedDataType extends ExpectedBaseSimpleExpression {
     @XmlAttribute
     private String value;
     
+    @XmlAttribute(name = "length-present")
+    private Boolean lengthPresent;
+    
+    @XmlAttribute
+    private Integer scale;
+    
     @XmlElement
     private ExpectedDataTypeLength dataLength;
 }
diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/standard/table/CreateTableStatementTestCase.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/standard/table/CreateTableStatementTestCase.java
index ab66e3b8369..27165deb990 100644
--- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/standard/table/CreateTableStatementTestCase.java
+++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/standard/table/CreateTableStatementTestCase.java
@@ -40,6 +40,9 @@ import java.util.List;
 @Setter
 public final class CreateTableStatementTestCase extends SQLParserTestCase {
     
+    @XmlAttribute(name = "if-not-exists")
+    private Boolean ifNotExists;
+    
     @XmlAttribute
     private Boolean temporary;
     
diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/standard/table/DropTableStatementTestCase.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/standard/table/DropTableStatementTestCase.java
index 6197ef28ad9..243fa2660f1 100644
--- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/standard/table/DropTableStatementTestCase.java
+++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/standard/table/DropTableStatementTestCase.java
@@ -34,6 +34,9 @@ import java.util.List;
 @Setter
 public final class DropTableStatementTestCase extends SQLParserTestCase {
     
+    @XmlAttribute(name = "if-exists")
+    private Boolean ifExists;
+    
     @XmlAttribute
     private Boolean temporary;
     
diff --git a/test/it/parser/src/main/resources/case/ddl/create-table.xml b/test/it/parser/src/main/resources/case/ddl/create-table.xml
index 9f77ec7b8bc..bf4940ad1f7 100644
--- a/test/it/parser/src/main/resources/case/ddl/create-table.xml
+++ b/test/it/parser/src/main/resources/case/ddl/create-table.xml
@@ -6163,4 +6163,161 @@
         </column-definition>
         <constraint-definition primary-key-column-count="0" start-index="23" stop-index="69" constraint-name="c" />
     </create-table>
+    <create-table sql-case-id="clickhouse_create_memory" temporary="false">
+        <table name="foo_protocol" start-index="13" stop-index="24" />
+        <column-definition type="UInt64" not-null="true" start-index="27" stop-index="35">
+            <column name="id" />
+        </column-definition>
+        <column-definition type="String" not-null="true" start-index="38" stop-index="51">
+            <column name="payload" />
+        </column-definition>
+        <column-definition type="Nullable(Int32)" not-null="false" start-index="54" stop-index="75">
+            <column name="amount" />
+        </column-definition>
+        <create-table-option start-index="78" stop-index="92">
+            <engine name="Memory" start-index="87" stop-index="92" />
+        </create-table-option>
+    </create-table>
+    <create-table sql-case-id="clickhouse_create_mergetree" temporary="false">
+        <table name="foo_protocol" start-index="27" stop-index="38" />
+        <column-definition type="UInt64" not-null="true" start-index="41" stop-index="49">
+            <column name="id" />
+        </column-definition>
+        <column-definition type="Nullable(String)" not-null="false" start-index="52" stop-index="75">
+            <column name="payload" />
+        </column-definition>
+        <create-table-option start-index="78" stop-index="97">
+            <engine name="MergeTree" start-index="87" stop-index="97" />
+        </create-table-option>
+    </create-table>
+    <create-table sql-case-id="clickhouse_create_temporary" temporary="true">
+        <table name="foo_protocol" start-index="23" stop-index="34" />
+        <column-definition type="UInt8" not-null="true" start-index="37" stop-index="44">
+            <column name="id" />
+        </column-definition>
+        <create-table-option start-index="47" stop-index="61">
+            <engine name="Memory" start-index="56" stop-index="61" />
+        </create-table-option>
+    </create-table>
+    <create-table sql-case-id="clickhouse_create_decimal" temporary="false">
+        <table name="foo_protocol" start-index="13" stop-index="24" />
+        <column-definition type="Decimal" not-null="true" start-index="27" stop-index="46">
+            <column name="value" />
+        </column-definition>
+        <create-table-option start-index="49" stop-index="63">
+            <engine name="Memory" start-index="58" stop-index="63" />
+        </create-table-option>
+    </create-table>
+    <create-table sql-case-id="clickhouse_create_datetime64_timezone" temporary="false">
+        <table name="foo_protocol" start-index="13" stop-index="24" />
+        <column-definition type="DateTime64(6, 'UTC')" not-null="true" start-index="27" stop-index="52">
+            <column name="value" />
+        </column-definition>
+        <create-table-option start-index="55" stop-index="69">
+            <engine name="Memory" start-index="64" stop-index="69" />
+        </create-table-option>
+    </create-table>
+    <create-table sql-case-id="clickhouse_create_datetime_timezone" temporary="false">
+        <table name="foo_protocol" start-index="13" stop-index="24" />
+        <column-definition type="DateTime('Asia/Shanghai')" not-null="true" start-index="27" stop-index="57">
+            <column name="value" />
+        </column-definition>
+        <create-table-option start-index="60" stop-index="74">
+            <engine name="Memory" start-index="69" stop-index="74" />
+        </create-table-option>
+    </create-table>
+    <create-table sql-case-id="clickhouse_create_if_not_exists_uint8" temporary="false" if-not-exists="true">
+        <table name="foo_protocol" start-index="27" stop-index="38" />
+        <column-definition type="UInt8" start-index="41" stop-index="48">
+            <column name="id" />
+        </column-definition>
+        <create-table-option>
+            <engine name="Memory" />
+        </create-table-option>
+    </create-table>
+    <create-table sql-case-id="clickhouse_create_temporary_default_engine" temporary="true" if-not-exists="false">
+        <table name="foo_protocol" start-index="23" stop-index="34" />
+        <column-definition type="UInt8" start-index="37" stop-index="44">
+            <column name="id" />
+        </column-definition>
+    </create-table>
+    <create-table sql-case-id="clickhouse_create_mergetree_uint8" temporary="false" if-not-exists="false">
+        <table name="foo_protocol" start-index="13" stop-index="24" />
+        <column-definition type="UInt8" start-index="27" stop-index="34">
+            <column name="id" />
+        </column-definition>
+        <create-table-option assert-indices="true" start-index="37" stop-index="56">
+            <engine name="MergeTree" />
+        </create-table-option>
+    </create-table>
+    <create-table sql-case-id="clickhouse_create_explicit_not_null">
+        <table name="foo_protocol" start-index="13" stop-index="24" />
+        <column-definition type="UInt8" start-index="27" stop-index="43" not-null="true" text="id UInt8 NOT NULL">
+            <column name="id" />
+        </column-definition>
+    </create-table>
+    <create-table sql-case-id="clickhouse_create_implicit_not_null">
+        <table name="foo_protocol" start-index="13" stop-index="24" />
+        <column-definition type="UInt8" start-index="27" stop-index="34" not-null="true" text="id UInt8">
+            <column name="id" />
+        </column-definition>
+    </create-table>
+    <create-table sql-case-id="clickhouse_create_nullable_uint8">
+        <table name="foo_protocol" start-index="13" stop-index="24" />
+        <column-definition type="Nullable(UInt8)" start-index="27" stop-index="44" not-null="false" text="id Nullable(UInt8)">
+            <column name="id" />
+        </column-definition>
+    </create-table>
+    <create-table sql-case-id="clickhouse_create_explicit_null">
+        <table name="foo_protocol" start-index="13" stop-index="24" />
+        <column-definition type="UInt8" start-index="27" stop-index="39" not-null="false" text="id UInt8 NULL">
+            <column name="id" />
+        </column-definition>
+    </create-table>
+    <create-table sql-case-id="clickhouse_create_decimal_precision">
+        <table name="foo_protocol" start-index="13" stop-index="24" />
+        <column-definition type="Decimal" start-index="27" stop-index="46">
+            <column name="value" />
+            <dataType value="Decimal" start-index="33" stop-index="46" length-present="true" scale="8">
+                <dataLength><precision>38</precision></dataLength>
+            </dataType>
+        </column-definition>
+    </create-table>
+    <create-table sql-case-id="clickhouse_create_datetime64_precision">
+        <table name="foo_protocol" start-index="13" stop-index="24" />
+        <column-definition type="DateTime64" start-index="27" stop-index="45">
+            <column name="value" />
+            <dataType value="DateTime64" start-index="33" stop-index="45" length-present="true" scale="0">
+                <dataLength><precision>6</precision></dataLength>
+            </dataType>
+        </column-definition>
+    </create-table>
+    <create-table sql-case-id="clickhouse_create_datetime64_zone">
+        <table name="foo_protocol" start-index="13" stop-index="24" />
+        <column-definition type="DateTime64(6, 'UTC')" start-index="27" stop-index="52">
+            <column name="value" />
+            <dataType value="DateTime64(6, 'UTC')" start-index="33" stop-index="52" length-present="false" />
+        </column-definition>
+    </create-table>
+    <create-table sql-case-id="clickhouse_create_datetime_zone">
+        <table name="foo_protocol" start-index="13" stop-index="24" />
+        <column-definition type="DateTime('Asia/Shanghai')" start-index="27" stop-index="57">
+            <column name="value" />
+            <dataType value="DateTime('Asia/Shanghai')" start-index="33" stop-index="57" length-present="false" />
+        </column-definition>
+    </create-table>
+    <create-table sql-case-id="clickhouse_create_nullable_decimal">
+        <table name="foo_protocol" start-index="13" stop-index="24" />
+        <column-definition type="Nullable(Decimal(38, 8))" start-index="27" stop-index="56">
+            <column name="value" />
+            <dataType value="Nullable(Decimal(38, 8))" start-index="33" stop-index="56" length-present="false" />
+        </column-definition>
+    </create-table>
+    <create-table sql-case-id="clickhouse_create_array_nullable_datetime64">
+        <table name="foo_protocol" start-index="13" stop-index="24" />
+        <column-definition type="Array(Nullable(DateTime64(6, 'UTC')))" start-index="27" stop-index="69">
+            <column name="value" />
+            <dataType value="Array(Nullable(DateTime64(6, 'UTC')))" start-index="33" stop-index="69" length-present="false" />
+        </column-definition>
+    </create-table>
 </sql-parser-test-cases>
diff --git a/test/it/parser/src/main/resources/case/ddl/drop-table.xml b/test/it/parser/src/main/resources/case/ddl/drop-table.xml
index 3ba431f9222..504820fe88b 100644
--- a/test/it/parser/src/main/resources/case/ddl/drop-table.xml
+++ b/test/it/parser/src/main/resources/case/ddl/drop-table.xml
@@ -142,4 +142,13 @@
         <table name="t_drop_a" start-index="11" stop-index="18" />
         <table name="t_drop_b" start-index="21" stop-index="28" />
     </drop-table>
+    <drop-table sql-case-id="clickhouse_drop_table" temporary="false" if-exists="false">
+        <table name="foo_protocol" start-index="11" stop-index="22" />
+    </drop-table>
+    <drop-table sql-case-id="clickhouse_drop_temporary_if_exists" temporary="true">
+        <table name="foo_protocol" start-index="31" stop-index="42" />
+    </drop-table>
+    <drop-table sql-case-id="clickhouse_drop_temporary_if_exists_sync" temporary="true" if-exists="true">
+        <table name="foo_protocol" start-index="31" stop-index="42" />
+    </drop-table>
 </sql-parser-test-cases>
diff --git a/test/it/parser/src/main/resources/case/dml/clickhouse.xml b/test/it/parser/src/main/resources/case/dml/clickhouse.xml
index 91af8a199ef..242bcffc251 100644
--- a/test/it/parser/src/main/resources/case/dml/clickhouse.xml
+++ b/test/it/parser/src/main/resources/case/dml/clickhouse.xml
@@ -1182,4 +1182,321 @@
             </expression-projection>
         </projections>
     </select>
+    <select sql-case-id="clickhouse_select_cast_nullable">
+        <projections start-index="7" stop-index="63">
+            <expression-projection text="CAST(NULL AS Nullable(Int32))" start-index="7" stop-index="35">
+                <expr>
+                    <function function-name="CAST" text="CAST(NULL AS Nullable(Int32))" start-index="7" stop-index="35">
+                        <parameter>
+                            <literal-expression value="null" start-index="12" stop-index="15" />
+                        </parameter>
+                        <parameter>
+                            <data-type value="Nullable(Int32)" start-index="20" stop-index="34" />
+                        </parameter>
+                    </function>
+                </expr>
+            </expression-projection>
+            <expression-projection text="CAST(7 AS Nullable(Int32))" start-index="38" stop-index="63">
+                <expr>
+                    <function function-name="CAST" text="CAST(7 AS Nullable(Int32))" start-index="38" stop-index="63">
+                        <parameter>
+                            <literal-expression value="7" start-index="43" stop-index="43" />
+                        </parameter>
+                        <parameter>
+                            <data-type value="Nullable(Int32)" start-index="48" stop-index="62" />
+                        </parameter>
+                    </function>
+                </expr>
+            </expression-projection>
+        </projections>
+    </select>
+    <select sql-case-id="clickhouse_select_numbers">
+        <projections start-index="7" stop-index="12">
+            <column-projection name="number" start-index="7" stop-index="12" />
+        </projections>
+        <from>
+            <function-table start-index="19" stop-index="28">
+                <table-function function-name="numbers" text="numbers(3)" start-index="19" stop-index="28" />
+            </function-table>
+        </from>
+    </select>
+    <select sql-case-id="clickhouse_select_numbers_alias">
+        <projections start-index="7" stop-index="14">
+            <column-projection name="number" start-index="7" stop-index="14">
+                <owner name="n" start-index="7" stop-index="7" />
+            </column-projection>
+        </projections>
+        <from>
+            <function-table start-index="21" stop-index="35" table-alias="n">
+                <table-function function-name="numbers" text="numbers(0)" start-index="21" stop-index="30" />
+            </function-table>
+        </from>
+    </select>
+    <insert sql-case-id="clickhouse_insert_native_values_header">
+        <table name="foo_protocol" start-index="12" stop-index="23" />
+        <columns start-index="24" stop-index="24" />
+    </insert>
+    <insert sql-case-id="clickhouse_insert_native_values_columns">
+        <table name="foo_protocol" start-index="12" stop-index="23" />
+        <columns start-index="25" stop-index="37">
+            <column name="id" start-index="26" stop-index="27" />
+            <column name="payload" start-index="30" stop-index="36" />
+        </columns>
+    </insert>
+    <insert sql-case-id="clickhouse_insert_native_format_header">
+        <table name="foo_protocol" start-index="12" stop-index="23" />
+        <columns start-index="24" stop-index="24" />
+    </insert>
+    <insert sql-case-id="clickhouse_insert_native_format_columns">
+        <table name="foo_protocol" start-index="12" stop-index="31">
+            <owner name="default" start-index="12" stop-index="18" />
+        </table>
+        <columns start-index="33" stop-index="45">
+            <column name="id" start-index="34" stop-index="35" />
+            <column name="payload" start-index="38" stop-index="44" />
+        </columns>
+    </insert>
+    <insert sql-case-id="clickhouse_insert_native_bare_header">
+        <table name="foo_protocol" start-index="12" stop-index="23" />
+        <columns start-index="23" stop-index="23" />
+    </insert>
+    <insert sql-case-id="clickhouse_insert_select_numbers">
+        <table name="foo_protocol" start-index="12" stop-index="23" />
+        <columns start-index="25" stop-index="28">
+            <column name="id" start-index="26" stop-index="27" />
+        </columns>
+        <select>
+            <projections start-index="37" stop-index="42">
+                <column-projection name="number" start-index="37" stop-index="42" />
+            </projections>
+            <from>
+                <function-table start-index="49" stop-index="58">
+                    <table-function function-name="numbers" text="numbers(2)" />
+                </function-table>
+            </from>
+        </select>
+    </insert>
+    <select sql-case-id="clickhouse_cancel_aggregate_comment">
+        <projections start-index="7" stop-index="24">
+            <aggregation-projection type="SUM" expression="sum(number % 7919)" start-index="7" stop-index="24" />
+        </projections>
+        <from>
+            <function-table start-index="31" stop-index="50">
+                <table-function function-name="numbers" text="numbers(10000000000)" />
+            </function-table>
+        </from>
+    </select>
+    <select sql-case-id="clickhouse_leading_comment">
+        <projections start-index="24" stop-index="24">
+            <expression-projection text="1" start-index="24" stop-index="24">
+                <expr>
+                    <literal-expression value="1" start-index="24" stop-index="24" />
+                </expr>
+            </expression-projection>
+        </projections>
+    </select>
+    <select sql-case-id="clickhouse_trailing_line_comment">
+        <projections start-index="7" stop-index="7">
+            <expression-projection text="1" start-index="7" stop-index="7">
+                <expr>
+                    <literal-expression value="1" start-index="7" stop-index="7" />
+                </expr>
+            </expression-projection>
+        </projections>
+    </select>
+    <select sql-case-id="clickhouse_function_argument_comment">
+        <projections start-index="7" stop-index="12">
+            <column-projection name="number" start-index="7" stop-index="12" />
+        </projections>
+        <from>
+            <function-table start-index="19" stop-index="42">
+                <table-function function-name="numbers" text="numbers(/* foo_arg */ 3)" />
+            </function-table>
+        </from>
+    </select>
+    <select sql-case-id="clickhouse_window_row_number">
+        <projections start-index="7" stop-index="73">
+            <column-projection name="number" alias="foo_value" start-index="7" stop-index="25" />
+            <expression-projection text="row_number() OVER (ORDER BY number)" alias="foo_rank" start-index="27" stop-index="73">
+                <expr>
+                    <function function-name="row_number" text="row_number() OVER (ORDER BY number)" start-index="27" stop-index="61">
+                        <window-item start-index="40" stop-index="61">
+                            <order-by start-index="46" stop-index="60">
+                                <column-item name="number" order-direction="ASC" start-index="55" stop-index="60" />
+                            </order-by>
+                        </window-item>
+                    </function>
+                </expr>
+            </expression-projection>
+        </projections>
+        <order-by start-index="91" stop-index="105">
+            <column-item name="number" order-direction="ASC" start-index="100" stop-index="105" />
+        </order-by>
+        <from>
+            <function-table start-index="80" stop-index="89">
+                <table-function function-name="numbers" text="numbers(5)" start-index="80" stop-index="89" />
+            </function-table>
+        </from>
+    </select>
+    <select sql-case-id="clickhouse_window_aggregate">
+        <projections start-index="7" stop-index="65">
+            <aggregation-projection type="SUM" expression="sum(number) OVER (PARTITION BY number ORDER BY number DESC)" start-index="7" stop-index="65">
+                <window-item start-index="19" stop-index="65">
+                    <partition-by>
+                        <column name="number" start-index="38" stop-index="43" />
+                    </partition-by>
+                    <order-by start-index="45" stop-index="64">
+                        <column-item name="number" order-direction="DESC" start-index="54" stop-index="59" />
+                    </order-by>
+                </window-item>
+            </aggregation-projection>
+        </projections>
+        <from>
+            <function-table start-index="72" stop-index="81">
+                <table-function function-name="numbers" text="numbers(3)" start-index="72" stop-index="81" />
+            </function-table>
+        </from>
+    </select>
+    <select sql-case-id="clickhouse_window_distinct">
+        <projections start-index="7" stop-index="34">
+            <aggregation-distinct-projection type="SUM" expression="sum(DISTINCT number) OVER ()" start-index="7" stop-index="34" distinct-inner-expression="number">
+                <window-item start-index="28" stop-index="34" />
+            </aggregation-distinct-projection>
+        </projections>
+        <from>
+            <function-table start-index="41" stop-index="50">
+                <table-function function-name="numbers" text="numbers(3)" start-index="41" stop-index="50" />
+            </function-table>
+        </from>
+    </select>
+    <select sql-case-id="clickhouse_array_empty_cast">
+        <projections start-index="7" stop-index="44">
+            <expression-projection text="CAST([] AS Array(UInt64))" alias="foo_empty" start-index="7" stop-index="44">
+                <expr>
+                    <function function-name="CAST" text="CAST([] AS Array(UInt64))" start-index="7" stop-index="31">
+                        <parameter>
+                            <list-expression start-index="12" stop-index="13" />
+                        </parameter>
+                        <parameter>
+                            <data-type value="Array(UInt64)" start-index="18" stop-index="30" />
+                        </parameter>
+                    </function>
+                </expr>
+            </expression-projection>
+        </projections>
+    </select>
+    <select sql-case-id="clickhouse_array_nested">
+        <projections start-index="7" stop-index="30">
+            <expression-projection text="[[1,2],[]]" alias="foo_nested" start-index="7" stop-index="30">
+                <expr>
+                    <list-expression start-index="7" stop-index="16">
+                        <items>
+                            <list-expression start-index="8" stop-index="12">
+                                <items>
+                                    <literal-expression value="1" start-index="9" stop-index="9" />
+                                </items>
+                                <items>
+                                    <literal-expression value="2" start-index="11" stop-index="11" />
+                                </items>
+                            </list-expression>
+                        </items>
+                        <items>
+                            <list-expression start-index="14" stop-index="15" />
+                        </items>
+                    </list-expression>
+                </expr>
+            </expression-projection>
+        </projections>
+    </select>
+    <select sql-case-id="clickhouse_array_parameter" parameters="7">
+        <projections start-index="7" stop-index="25">
+            <expression-projection text="[?,1]" alias="foo_values" start-index="7" stop-index="25">
+                <expr>
+                    <list-expression start-index="7" stop-index="11">
+                        <items>
+                            <parameter-marker-expression parameter-index="0" start-index="8" stop-index="8" />
+                        </items>
+                        <items>
+                            <literal-expression value="1" start-index="10" stop-index="10" />
+                        </items>
+                    </list-expression>
+                </expr>
+            </expression-projection>
+        </projections>
+    </select>
+    <select sql-case-id="clickhouse_array_unaliased">
+        <projections start-index="7" stop-index="11">
+            <expression-projection text="[1,2]" start-index="7" stop-index="11">
+                <expr>
+                    <list-expression start-index="7" stop-index="11">
+                        <items>
+                            <literal-expression value="1" start-index="8" stop-index="8" />
+                        </items>
+                        <items>
+                            <literal-expression value="2" start-index="10" stop-index="10" />
+                        </items>
+                    </list-expression>
+                </expr>
+            </expression-projection>
+        </projections>
+    </select>
+    <select sql-case-id="clickhouse_with_constant">
+        <variable-name>foo_limit</variable-name>
+        <projections start-index="27" stop-index="45">
+            <column-projection name="number" alias="foo_value" start-index="27" stop-index="45" />
+        </projections>
+        <from>
+            <function-table start-index="52" stop-index="61">
+                <table-function function-name="numbers" text="numbers(5)" start-index="52" stop-index="61" />
+            </function-table>
+        </from>
+        <where start-index="63" stop-index="86">
+            <expr>
+                <binary-operation-expression start-index="69" stop-index="86">
+                    <left>
+                        <column name="number" start-index="69" stop-index="74" />
+                    </left>
+                    <operator>&lt;</operator>
+                    <right>
+                        <column name="foo_limit" start-index="78" stop-index="86" />
+                    </right>
+                </binary-operation-expression>
+            </expr>
+        </where>
+        <order-by start-index="88" stop-index="102">
+            <column-item name="number" order-direction="ASC" start-index="97" stop-index="102" />
+        </order-by>
+    </select>
+    <select sql-case-id="clickhouse_with_parameters" parameters="2, 1">
+        <variable-name>foo_limit</variable-name>
+        <projections start-index="27" stop-index="32">
+            <column-projection name="number" start-index="27" stop-index="32" />
+        </projections>
+        <from>
+            <function-table start-index="39" stop-index="48">
+                <table-function function-name="numbers" text="numbers(3)" start-index="39" stop-index="48" />
+            </function-table>
+        </from>
+        <where start-index="50" stop-index="65">
+            <expr>
+                <binary-operation-expression start-index="56" stop-index="65">
+                    <left>
+                        <column name="number" start-index="56" stop-index="61" />
+                    </left>
+                    <operator>&lt;</operator>
+                    <right>
+                        <parameter-marker-expression parameter-index="1" start-index="65" stop-index="65" />
+                    </right>
+                </binary-operation-expression>
+            </expr>
+        </where>
+    </select>
+    <select sql-case-id="clickhouse_with_multiple_constants">
+        <variable-name>foo_text</variable-name>
+        <variable-name>foo_nullable</variable-name>
+        <projections start-index="58" stop-index="78">
+            <column-projection name="foo_text" start-index="58" stop-index="65" />
+            <column-projection name="foo_nullable" start-index="67" stop-index="78" />
+        </projections>
+    </select>
 </sql-parser-test-cases>
diff --git a/test/it/parser/src/main/resources/sql/supported/ddl/create-table.xml b/test/it/parser/src/main/resources/sql/supported/ddl/create-table.xml
index fca23f5aa89..dd6a60e4ad6 100644
--- a/test/it/parser/src/main/resources/sql/supported/ddl/create-table.xml
+++ b/test/it/parser/src/main/resources/sql/supported/ddl/create-table.xml
@@ -877,4 +877,23 @@ WHERE time_id &gt;=  TO_DATE('01-JAN-1998','dd-mon-yyyy')
     <sql-case id="create_table_check_validation_pg" value="CREATE TABLE t (a int, CONSTRAINT c CHECK (a &gt; 0) NO INHERIT NOT VALID)" db-types="PostgreSQL" />
 
     <sql-case id="create_table_check_validation_order_pg" value="CREATE TABLE t (a int, CONSTRAINT c CHECK (a &gt; 0) NOT VALID NO INHERIT)" db-types="PostgreSQL" />
+    <sql-case id="clickhouse_create_memory" value="CREATE TABLE foo_protocol (id UInt64, payload String, amount Nullable(Int32)) ENGINE = Memory" db-types="ClickHouse" />
+    <sql-case id="clickhouse_create_mergetree" value="CREATE TABLE IF NOT EXISTS foo_protocol (id UInt64, payload Nullable(String)) ENGINE = MergeTree() ORDER BY id" db-types="ClickHouse" />
+    <sql-case id="clickhouse_create_temporary" value="CREATE TEMPORARY TABLE foo_protocol (id UInt8) ENGINE = Memory" db-types="ClickHouse" />
+    <sql-case id="clickhouse_create_decimal" value="CREATE TABLE foo_protocol (value Decimal(38, 8)) ENGINE = Memory" db-types="ClickHouse" />
+    <sql-case id="clickhouse_create_datetime64_timezone" value="CREATE TABLE foo_protocol (value DateTime64(6, 'UTC')) ENGINE = Memory" db-types="ClickHouse" />
+    <sql-case id="clickhouse_create_datetime_timezone" value="CREATE TABLE foo_protocol (value DateTime('Asia/Shanghai')) ENGINE = Memory" db-types="ClickHouse" />
+    <sql-case id="clickhouse_create_if_not_exists_uint8" value="CREATE TABLE IF NOT EXISTS foo_protocol (id UInt8) ENGINE = Memory" db-types="ClickHouse" />
+    <sql-case id="clickhouse_create_temporary_default_engine" value="CREATE TEMPORARY TABLE foo_protocol (id UInt8)" db-types="ClickHouse" />
+    <sql-case id="clickhouse_create_mergetree_uint8" value="CREATE TABLE foo_protocol (id UInt8) ENGINE = MergeTree() ORDER BY id" db-types="ClickHouse" />
+    <sql-case id="clickhouse_create_explicit_not_null" value="CREATE TABLE foo_protocol (id UInt8 NOT NULL)" db-types="ClickHouse" />
+    <sql-case id="clickhouse_create_implicit_not_null" value="CREATE TABLE foo_protocol (id UInt8)" db-types="ClickHouse" />
+    <sql-case id="clickhouse_create_nullable_uint8" value="CREATE TABLE foo_protocol (id Nullable(UInt8))" db-types="ClickHouse" />
+    <sql-case id="clickhouse_create_explicit_null" value="CREATE TABLE foo_protocol (id UInt8 NULL)" db-types="ClickHouse" />
+    <sql-case id="clickhouse_create_decimal_precision" value="CREATE TABLE foo_protocol (value Decimal(38, 8))" db-types="ClickHouse" />
+    <sql-case id="clickhouse_create_datetime64_precision" value="CREATE TABLE foo_protocol (value DateTime64(6))" db-types="ClickHouse" />
+    <sql-case id="clickhouse_create_datetime64_zone" value="CREATE TABLE foo_protocol (value DateTime64(6, 'UTC'))" db-types="ClickHouse" />
+    <sql-case id="clickhouse_create_datetime_zone" value="CREATE TABLE foo_protocol (value DateTime('Asia/Shanghai'))" db-types="ClickHouse" />
+    <sql-case id="clickhouse_create_nullable_decimal" value="CREATE TABLE foo_protocol (value Nullable(Decimal(38, 8)))" db-types="ClickHouse" />
+    <sql-case id="clickhouse_create_array_nullable_datetime64" value="CREATE TABLE foo_protocol (value Array(Nullable(DateTime64(6, 'UTC'))))" db-types="ClickHouse" />
 </sql-cases>
diff --git a/test/it/parser/src/main/resources/sql/supported/ddl/drop-table.xml b/test/it/parser/src/main/resources/sql/supported/ddl/drop-table.xml
index 3f73a3684a0..e1f027d5b5c 100644
--- a/test/it/parser/src/main/resources/sql/supported/ddl/drop-table.xml
+++ b/test/it/parser/src/main/resources/sql/supported/ddl/drop-table.xml
@@ -46,4 +46,7 @@
     <sql-case id="drop_table_firebird" value="DROP TABLE t_firebird_drop" db-types="Firebird"/>
     <sql-case id="drop_table_sql92" value="DROP TABLE t_drop" db-types="SQL92" />
     <sql-case id="drop_multiple_tables_sql92" value="DROP TABLE t_drop_a, t_drop_b" db-types="SQL92" />
+    <sql-case id="clickhouse_drop_table" value="DROP TABLE foo_protocol" db-types="ClickHouse" />
+    <sql-case id="clickhouse_drop_temporary_if_exists" value="DROP TEMPORARY TABLE IF EXISTS foo_protocol" db-types="ClickHouse" />
+    <sql-case id="clickhouse_drop_temporary_if_exists_sync" value="DROP TEMPORARY TABLE IF EXISTS foo_protocol SYNC" db-types="ClickHouse" />
 </sql-cases>
diff --git a/test/it/parser/src/main/resources/sql/supported/dml/clickhouse.xml b/test/it/parser/src/main/resources/sql/supported/dml/clickhouse.xml
index 44077923988..3ba5d82f9ea 100644
--- a/test/it/parser/src/main/resources/sql/supported/dml/clickhouse.xml
+++ b/test/it/parser/src/main/resources/sql/supported/dml/clickhouse.xml
@@ -57,4 +57,27 @@
     <sql-case id="clickhouse_select_sum_distinct_expr" value="SELECT SUM(DISTINCT amount + 1) FROM t_order" db-types="ClickHouse" />
     <sql-case id="clickhouse_select_cast_literal" value="SELECT CAST(1 AS INT8) FROM t_order" db-types="ClickHouse" />
     <sql-case id="clickhouse_select_null_without_alias" value="SELECT NULL" db-types="ClickHouse" />
+    <sql-case id="clickhouse_select_cast_nullable" value="SELECT CAST(NULL AS Nullable(Int32)), CAST(7 AS Nullable(Int32))" db-types="ClickHouse" />
+    <sql-case id="clickhouse_select_numbers" value="SELECT number FROM numbers(3)" db-types="ClickHouse" />
+    <sql-case id="clickhouse_select_numbers_alias" value="SELECT n.number FROM numbers(0) AS n" db-types="ClickHouse" />
+    <sql-case id="clickhouse_insert_native_values_header" value="INSERT INTO foo_protocol VALUES" db-types="ClickHouse" />
+    <sql-case id="clickhouse_insert_native_values_columns" value="INSERT INTO foo_protocol (id, payload) VALUES" db-types="ClickHouse" />
+    <sql-case id="clickhouse_insert_native_format_header" value="INSERT INTO foo_protocol FORMAT Native" db-types="ClickHouse" />
+    <sql-case id="clickhouse_insert_native_format_columns" value="INSERT INTO default.foo_protocol (id, payload) FORMAT Native" db-types="ClickHouse" />
+    <sql-case id="clickhouse_insert_native_bare_header" value="INSERT INTO foo_protocol" db-types="ClickHouse" />
+    <sql-case id="clickhouse_insert_select_numbers" value="INSERT INTO foo_protocol (id) SELECT number FROM numbers(2)" db-types="ClickHouse" />
+    <sql-case id="clickhouse_cancel_aggregate_comment" value="SELECT sum(number % 7919) FROM numbers(10000000000) /* foo_cancel_probe */" db-types="ClickHouse" />
+    <sql-case id="clickhouse_leading_comment" value="/* foo_marker */ SELECT 1" db-types="ClickHouse" />
+    <sql-case id="clickhouse_trailing_line_comment" value="SELECT 1 -- foo_marker" db-types="ClickHouse" />
+    <sql-case id="clickhouse_function_argument_comment" value="SELECT number FROM numbers(/* foo_arg */ 3)" db-types="ClickHouse" />
+    <sql-case id="clickhouse_window_row_number" value="SELECT number AS foo_value,row_number() OVER (ORDER BY number) AS foo_rank FROM numbers(5) ORDER BY number" db-types="ClickHouse" />
+    <sql-case id="clickhouse_window_aggregate" value="SELECT sum(number) OVER (PARTITION BY number ORDER BY number DESC) FROM numbers(3)" db-types="ClickHouse" />
+    <sql-case id="clickhouse_window_distinct" value="SELECT sum(DISTINCT number) OVER () FROM numbers(3)" db-types="ClickHouse" />
+    <sql-case id="clickhouse_array_empty_cast" value="SELECT CAST([] AS Array(UInt64)) AS foo_empty" db-types="ClickHouse" />
+    <sql-case id="clickhouse_array_nested" value="SELECT [[1,2],[]] AS foo_nested" db-types="ClickHouse" />
+    <sql-case id="clickhouse_array_parameter" value="SELECT [?,1] AS foo_values" db-types="ClickHouse" case-types="PLACEHOLDER" />
+    <sql-case id="clickhouse_array_unaliased" value="SELECT [1,2]" db-types="ClickHouse" />
+    <sql-case id="clickhouse_with_constant" value="WITH 2 AS foo_limit SELECT number AS foo_value FROM numbers(5) WHERE number &lt; foo_limit ORDER BY number" db-types="ClickHouse" />
+    <sql-case id="clickhouse_with_parameters" value="WITH ? AS foo_limit SELECT number FROM numbers(3) WHERE number &lt; ?" db-types="ClickHouse" case-types="PLACEHOLDER" />
+    <sql-case id="clickhouse_with_multiple_constants" value="WITH 'foo_value' AS foo_text, NULL AS foo_nullable SELECT foo_text,foo_nullable" db-types="ClickHouse" />
 </sql-cases>