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><</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><</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 >= 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 > 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 > 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 < 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 < ?" 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>