From 6befb56443f7520a9a36169af74befcd09c001cf Mon Sep 17 00:00:00 2001 From: Sergey Nuyanzin Date: Thu, 25 Jun 2026 17:18:14 +0200 Subject: [PATCH 1/5] [FLINK-39999][table] Make Flink Sql calls unparsable as it is required by Calcite 1.42.0 --- .../sql/parser/SqlPartitionSpecProperty.java | 13 +- .../apache/flink/sql/parser/SqlProperty.java | 10 +- .../flink/sql/parser/ddl/SqlAddJar.java | 11 +- .../sql/parser/ddl/SqlAddPartitions.java | 42 +++++- .../sql/parser/ddl/SqlAlterDatabase.java | 11 +- .../sql/parser/ddl/SqlAlterFunction.java | 31 ++++- .../flink/sql/parser/ddl/SqlCompilePlan.java | 16 ++- .../sql/parser/ddl/SqlCreateDatabase.java | 21 ++- .../sql/parser/ddl/SqlCreateFunction.java | 35 ++++- .../flink/sql/parser/ddl/SqlDistribution.java | 26 +++- .../flink/sql/parser/ddl/SqlDropDatabase.java | 25 +++- .../flink/sql/parser/ddl/SqlDropFunction.java | 27 +++- .../sql/parser/ddl/SqlDropPartitions.java | 35 ++++- .../flink/sql/parser/ddl/SqlRemoveJar.java | 10 +- .../sql/parser/ddl/SqlReplaceTableAs.java | 46 ++++++- .../apache/flink/sql/parser/ddl/SqlReset.java | 9 +- .../apache/flink/sql/parser/ddl/SqlSet.java | 13 +- .../flink/sql/parser/ddl/SqlStopJob.java | 19 ++- .../flink/sql/parser/ddl/SqlTableColumn.java | 65 ++++++++- .../flink/sql/parser/ddl/SqlTableOption.java | 9 +- .../flink/sql/parser/ddl/SqlUseDatabase.java | 9 +- .../flink/sql/parser/ddl/SqlUseModules.java | 14 +- .../flink/sql/parser/ddl/SqlWatermark.java | 9 +- .../parser/ddl/catalog/SqlAlterCatalog.java | 10 +- .../ddl/catalog/SqlAlterCatalogComment.java | 20 +++ .../ddl/catalog/SqlAlterCatalogOptions.java | 20 +++ .../ddl/catalog/SqlAlterCatalogReset.java | 20 +++ .../parser/ddl/catalog/SqlCreateCatalog.java | 21 ++- .../parser/ddl/catalog/SqlDropCatalog.java | 21 ++- .../sql/parser/ddl/catalog/SqlUseCatalog.java | 9 +- .../connection/SqlAlterConnectionRename.java | 28 +++- .../connection/SqlAlterConnectionReset.java | 28 +++- .../ddl/connection/SqlAlterConnectionSet.java | 28 +++- .../ddl/connection/SqlCreateConnection.java | 25 +++- .../ddl/connection/SqlDropConnection.java | 27 +++- .../ddl/constraint/SqlTableConstraint.java | 21 ++- .../SqlAlterMaterializedTableAsQuery.java | 20 +++ ...SqlAlterMaterializedTableDistribution.java | 37 +++++ ...lterMaterializedTableDropDistribution.java | 21 +++ .../SqlAlterMaterializedTableFreshness.java | 20 +++ .../SqlAlterMaterializedTableOptions.java | 20 +++ .../SqlAlterMaterializedTableRefresh.java | 20 +++ .../SqlAlterMaterializedTableRefreshMode.java | 22 ++- .../SqlAlterMaterializedTableReset.java | 20 +++ .../SqlAlterMaterializedTableResume.java | 20 +++ .../SqlAlterMaterializedTableSchema.java | 126 ++++++++++++++++++ .../SqlAlterMaterializedTableSuspend.java | 20 +++ .../SqlCreateMaterializedTable.java | 59 +++++++- .../SqlCreateOrAlterMaterializedTable.java | 44 +++++- .../SqlDropMaterializedTable.java | 15 ++- .../ddl/materializedtable/SqlStartMode.java | 10 ++ .../parser/ddl/model/SqlAlterModelRename.java | 26 +++- .../parser/ddl/model/SqlAlterModelReset.java | 26 +++- .../parser/ddl/model/SqlAlterModelSet.java | 26 +++- .../sql/parser/ddl/model/SqlCreateModel.java | 26 +++- .../parser/ddl/model/SqlCreateModelAs.java | 25 +++- .../sql/parser/ddl/model/SqlDropModel.java | 24 +++- .../ddl/position/SqlTableColumnPosition.java | 12 +- .../sql/parser/ddl/resource/SqlResource.java | 9 +- .../parser/ddl/table/SqlAlterTableAdd.java | 31 +++++ .../ddl/table/SqlAlterTableDistribution.java | 35 +++++ .../parser/ddl/table/SqlAlterTableDrop.java | 100 +++++++++++++- .../table/SqlAlterTableDropDistribution.java | 25 +++- .../parser/ddl/table/SqlAlterTableModify.java | 31 +++++ .../ddl/table/SqlAlterTableOptions.java | 30 ++++- .../parser/ddl/table/SqlAlterTableRename.java | 28 +++- .../ddl/table/SqlAlterTableRenameColumn.java | 29 +++- .../parser/ddl/table/SqlAlterTableReset.java | 28 +++- .../parser/ddl/table/SqlAlterTableSchema.java | 4 +- .../sql/parser/ddl/table/SqlAnalyzeTable.java | 20 ++- .../sql/parser/ddl/table/SqlCreateTable.java | 32 ++++- .../parser/ddl/table/SqlCreateTableAs.java | 33 ++++- .../parser/ddl/table/SqlCreateTableLike.java | 34 ++++- .../sql/parser/ddl/table/SqlDropTable.java | 25 +++- .../sql/parser/ddl/table/SqlTableLike.java | 34 ++++- .../sql/parser/ddl/view/SqlAlterViewAs.java | 21 +++ .../ddl/view/SqlAlterViewProperties.java | 20 +++ .../parser/ddl/view/SqlAlterViewRename.java | 21 +++ .../sql/parser/ddl/view/SqlCreateView.java | 23 +++- .../sql/parser/ddl/view/SqlDropView.java | 25 +++- .../flink/sql/parser/dml/RichSqlInsert.java | 39 ++++++ .../sql/parser/dml/SqlBeginStatementSet.java | 9 +- .../parser/dml/SqlCompileAndExecutePlan.java | 12 +- .../sql/parser/dml/SqlEndStatementSet.java | 10 +- .../flink/sql/parser/dml/SqlExecute.java | 9 +- .../flink/sql/parser/dml/SqlExecutePlan.java | 11 +- .../flink/sql/parser/dml/SqlStatementSet.java | 13 +- .../sql/parser/dml/SqlTruncateTable.java | 9 +- .../sql/parser/dql/SqlDescribeCatalog.java | 15 ++- .../sql/parser/dql/SqlDescribeDatabase.java | 15 ++- .../flink/sql/parser/dql/SqlDescribeJob.java | 9 +- .../flink/sql/parser/dql/SqlLoadModule.java | 10 +- .../parser/dql/SqlRichDescribeConnection.java | 16 ++- .../parser/dql/SqlRichDescribeFunction.java | 16 ++- .../sql/parser/dql/SqlRichDescribeModel.java | 16 ++- .../sql/parser/dql/SqlRichDescribeTable.java | 16 ++- .../flink/sql/parser/dql/SqlRichExplain.java | 24 +++- .../flink/sql/parser/dql/SqlShowCall.java | 32 ++++- .../flink/sql/parser/dql/SqlShowCatalogs.java | 15 ++- .../flink/sql/parser/dql/SqlShowColumns.java | 16 ++- .../sql/parser/dql/SqlShowConnections.java | 15 ++- .../sql/parser/dql/SqlShowCreateCatalog.java | 10 +- .../parser/dql/SqlShowCreateConnection.java | 10 +- .../dql/SqlShowCreateMaterializedTable.java | 20 ++- .../sql/parser/dql/SqlShowCreateModel.java | 10 +- .../sql/parser/dql/SqlShowCreateTable.java | 10 +- .../sql/parser/dql/SqlShowCreateView.java | 10 +- .../sql/parser/dql/SqlShowCurrentCatalog.java | 9 +- .../parser/dql/SqlShowCurrentDatabase.java | 9 +- .../sql/parser/dql/SqlShowDatabases.java | 21 ++- .../sql/parser/dql/SqlShowFunctions.java | 28 +++- .../flink/sql/parser/dql/SqlShowJars.java | 9 +- .../flink/sql/parser/dql/SqlShowJobs.java | 9 +- .../flink/sql/parser/dql/SqlShowModels.java | 15 ++- .../flink/sql/parser/dql/SqlShowModules.java | 11 +- .../sql/parser/dql/SqlShowPartitions.java | 10 +- .../sql/parser/dql/SqlShowProcedures.java | 17 ++- .../flink/sql/parser/dql/SqlShowTables.java | 48 ++++++- .../flink/sql/parser/dql/SqlUnloadModule.java | 9 +- 119 files changed, 2504 insertions(+), 149 deletions(-) diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/SqlPartitionSpecProperty.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/SqlPartitionSpecProperty.java index 2609edcdf479d..37d898d921564 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/SqlPartitionSpecProperty.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/SqlPartitionSpecProperty.java @@ -20,6 +20,7 @@ import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; @@ -41,7 +42,17 @@ public class SqlPartitionSpecProperty extends SqlCall { /** Use this operator only if you don't have a better one. */ - protected static final SqlOperator OPERATOR = new SqlSpecialOperator("Pair", SqlKind.OTHER); + protected static final SqlOperator OPERATOR = + new SqlSpecialOperator("Pair", SqlKind.OTHER) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlPartitionSpecProperty( + (SqlIdentifier) operands[0], + operands.length > 1 ? operands[1] : null, + pos); + } + }; private final SqlIdentifier key; private final @Nullable SqlNode value; diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/SqlProperty.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/SqlProperty.java index ec2661a58188e..6ee010ff7f694 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/SqlProperty.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/SqlProperty.java @@ -20,6 +20,7 @@ import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; @@ -38,7 +39,14 @@ public class SqlProperty extends SqlCall { /** Use this operator only if you don't have a better one. */ - protected static final SqlOperator OPERATOR = new SqlSpecialOperator("Property", SqlKind.OTHER); + protected static final SqlOperator OPERATOR = + new SqlSpecialOperator("Property", SqlKind.OTHER) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlProperty((SqlIdentifier) operands[0], operands[1], pos); + } + }; private final SqlIdentifier key; private final SqlNode value; diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlAddJar.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlAddJar.java index 96a93a6351725..df77e4efcb2e7 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlAddJar.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlAddJar.java @@ -19,8 +19,10 @@ package org.apache.flink.sql.parser.ddl; import org.apache.calcite.sql.SqlAlter; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlCharStringLiteral; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; @@ -34,7 +36,14 @@ /** Add Jar command to add jar into the classloader. */ public class SqlAddJar extends SqlAlter { - public static final SqlOperator OPERATOR = new SqlSpecialOperator("ADD JAR", SqlKind.OTHER_DDL); + public static final SqlOperator OPERATOR = + new SqlSpecialOperator("ADD JAR", SqlKind.OTHER_DDL) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlAddJar(pos, (SqlCharStringLiteral) operands[0]); + } + }; private final SqlCharStringLiteral jarPath; diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlAddPartitions.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlAddPartitions.java index 33c532660e10c..eaa3190649e52 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlAddPartitions.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlAddPartitions.java @@ -21,9 +21,14 @@ import org.apache.flink.sql.parser.SqlParseUtils; import org.apache.flink.sql.parser.ddl.table.SqlAlterTable; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; +import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNodeList; +import org.apache.calcite.sql.SqlOperator; +import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; @@ -36,6 +41,28 @@ /** ALTER TABLE DDL to add partitions to a table. */ public class SqlAddPartitions extends SqlAlterTable { + private static final SqlSpecialOperator ADD_PARTITION_OPERATOR = + new SqlSpecialOperator("ALTER TABLE ADD PARTITION", SqlKind.ALTER_TABLE) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + List partSpecs = new ArrayList<>(); + for (SqlNode spec : (SqlNodeList) operands[2]) { + partSpecs.add((SqlNodeList) spec); + } + List partProps = new ArrayList<>(); + for (SqlNode prop : (SqlNodeList) operands[3]) { + partProps.add((SqlNodeList) prop); + } + return new SqlAddPartitions( + pos, + (SqlIdentifier) operands[0], + ((SqlLiteral) operands[1]).booleanValue(), + partSpecs, + partProps); + } + }; + private final boolean ifPartitionNotExists; private final List partSpecs; private final List partProps; @@ -68,14 +95,19 @@ public List getPartProps() { return partProps; } + @Override + public SqlOperator getOperator() { + return ADD_PARTITION_OPERATOR; + } + @Nonnull @Override public List getOperandList() { - List operands = new ArrayList<>(); - operands.add(tableIdentifier); - operands.addAll(partSpecs); - operands.addAll(partProps); - return operands; + return List.of( + tableIdentifier, + SqlLiteral.createBoolean(ifPartitionNotExists, SqlParserPos.ZERO), + new SqlNodeList(partSpecs, SqlParserPos.ZERO), + new SqlNodeList(partProps, SqlParserPos.ZERO)); } @Override diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlAlterDatabase.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlAlterDatabase.java index 52f80be6a236a..7759dc50a1d4b 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlAlterDatabase.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlAlterDatabase.java @@ -21,8 +21,10 @@ import org.apache.flink.sql.parser.SqlParseUtils; import org.apache.flink.sql.parser.SqlUnparseUtils; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNodeList; import org.apache.calcite.sql.SqlOperator; @@ -40,7 +42,14 @@ public class SqlAlterDatabase extends SqlAlterObject { public static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("ALTER DATABASE", SqlKind.OTHER_DDL); + new SqlSpecialOperator("ALTER DATABASE", SqlKind.OTHER_DDL) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlAlterDatabase( + pos, (SqlIdentifier) operands[0], (SqlNodeList) operands[1]); + } + }; private final SqlNodeList propertyList; diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlAlterFunction.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlAlterFunction.java index e90309fc1751c..d241c9d9e2ee9 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlAlterFunction.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlAlterFunction.java @@ -20,9 +20,11 @@ import org.apache.flink.sql.parser.SqlUnparseUtils; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlCharStringLiteral; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; @@ -39,7 +41,24 @@ public class SqlAlterFunction extends SqlAlterObject { public static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("ALTER FUNCTION", SqlKind.OTHER_DDL); + new SqlSpecialOperator("ALTER FUNCTION", SqlKind.OTHER_DDL) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + String language = + operands[2] instanceof SqlCharStringLiteral + ? ((SqlCharStringLiteral) operands[2]).getValueAs(String.class) + : null; + return new SqlAlterFunction( + pos, + (SqlIdentifier) operands[0], + (SqlCharStringLiteral) operands[1], + language, + ((SqlLiteral) operands[3]).booleanValue(), + ((SqlLiteral) operands[4]).booleanValue(), + ((SqlLiteral) operands[5]).booleanValue()); + } + }; private final SqlCharStringLiteral functionClassName; @@ -79,7 +98,15 @@ public void unparseAlterOperation(SqlWriter writer, int leftPrec, int rightPrec) @Nonnull @Override public List getOperandList() { - return ImmutableNullableList.of(name, functionClassName); + return ImmutableNullableList.of( + name, + functionClassName, + functionLanguage == null + ? SqlLiteral.createNull(SqlParserPos.ZERO) + : SqlLiteral.createCharString(functionLanguage, SqlParserPos.ZERO), + SqlLiteral.createBoolean(ifExists, SqlParserPos.ZERO), + SqlLiteral.createBoolean(isTemporary, SqlParserPos.ZERO), + SqlLiteral.createBoolean(isSystemFunction, SqlParserPos.ZERO)); } public String getFunctionLanguage() { diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlCompilePlan.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlCompilePlan.java index 63229ebb55a9e..ed35c9dc0c028 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlCompilePlan.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlCompilePlan.java @@ -25,6 +25,7 @@ import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; @@ -33,7 +34,6 @@ import javax.annotation.Nonnull; -import java.util.Collections; import java.util.List; /** @@ -44,7 +44,17 @@ public class SqlCompilePlan extends SqlCall { public static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("COMPILE PLAN", SqlKind.OTHER); + new SqlSpecialOperator("COMPILE PLAN", SqlKind.OTHER) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlCompilePlan( + pos, + operands[1], + ((SqlLiteral) operands[2]).booleanValue(), + operands[0]); + } + }; private final SqlNode planFile; private final boolean ifNotExists; @@ -75,7 +85,7 @@ public SqlOperator getOperator() { @Nonnull @Override public List getOperandList() { - return Collections.singletonList(operand); + return List.of(operand, planFile, SqlLiteral.createBoolean(ifNotExists, SqlParserPos.ZERO)); } @Override diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlCreateDatabase.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlCreateDatabase.java index 2561af938edde..aeb63805f0731 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlCreateDatabase.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlCreateDatabase.java @@ -18,9 +18,11 @@ package org.apache.flink.sql.parser.ddl; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlCharStringLiteral; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNodeList; import org.apache.calcite.sql.SqlSpecialOperator; @@ -35,7 +37,18 @@ public class SqlCreateDatabase extends SqlCreateObject { public static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("CREATE DATABASE", SqlKind.OTHER_DDL); + new SqlSpecialOperator("CREATE DATABASE", SqlKind.OTHER_DDL) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlCreateDatabase( + pos, + (SqlIdentifier) operands[0], + (SqlNodeList) operands[1], + (SqlCharStringLiteral) operands[2], + ((SqlLiteral) operands[3]).booleanValue()); + } + }; public SqlCreateDatabase( SqlParserPos pos, @@ -49,7 +62,11 @@ public SqlCreateDatabase( @Override public List getOperandList() { - return ImmutableNullableList.of(name, properties, comment); + return ImmutableNullableList.of( + name, + properties, + comment, + SqlLiteral.createBoolean(isIfNotExists(), SqlParserPos.ZERO)); } @Override diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlCreateFunction.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlCreateFunction.java index 825d1e52587a5..ca0204fe93c88 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlCreateFunction.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlCreateFunction.java @@ -20,9 +20,11 @@ import org.apache.flink.sql.parser.SqlUnparseUtils; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlCharStringLiteral; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNodeList; import org.apache.calcite.sql.SqlSpecialOperator; @@ -40,7 +42,26 @@ public class SqlCreateFunction extends SqlCreateObject { private static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("CREATE FUNCTION", SqlKind.CREATE_FUNCTION); + new SqlSpecialOperator("CREATE FUNCTION", SqlKind.CREATE_FUNCTION) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + String language = + operands[4] instanceof SqlCharStringLiteral + ? ((SqlCharStringLiteral) operands[4]).getValueAs(String.class) + : null; + return new SqlCreateFunction( + pos, + (SqlIdentifier) operands[0], + (SqlCharStringLiteral) operands[1], + language, + ((SqlLiteral) operands[5]).booleanValue(), + ((SqlLiteral) operands[6]).booleanValue(), + ((SqlLiteral) operands[7]).booleanValue(), + (SqlNodeList) operands[2], + (SqlNodeList) operands[3]); + } + }; private final SqlCharStringLiteral functionClassName; private final String functionLanguage; @@ -76,7 +97,17 @@ public SqlCreateFunction( @Nonnull @Override public List getOperandList() { - return ImmutableNullableList.of(name, functionClassName, resourceInfos); + return ImmutableNullableList.of( + name, + functionClassName, + resourceInfos, + properties, + functionLanguage == null + ? SqlLiteral.createNull(SqlParserPos.ZERO) + : SqlLiteral.createCharString(functionLanguage, SqlParserPos.ZERO), + SqlLiteral.createBoolean(isIfNotExists(), SqlParserPos.ZERO), + SqlLiteral.createBoolean(isTemporary(), SqlParserPos.ZERO), + SqlLiteral.createBoolean(isSystemFunction, SqlParserPos.ZERO)); } public boolean isSystemFunction() { diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlDistribution.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlDistribution.java index db9707e65fb64..51573752e0d0f 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlDistribution.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlDistribution.java @@ -20,8 +20,11 @@ import org.apache.flink.sql.parser.SqlUnparseUtils; +import org.apache.calcite.sql.SqlCall; +import org.apache.calcite.sql.SqlCharStringLiteral; import org.apache.calcite.sql.SqlDdl; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNodeList; import org.apache.calcite.sql.SqlNumericLiteral; @@ -42,7 +45,21 @@ public class SqlDistribution extends SqlDdl { private static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("DISTRIBUTED BY", SqlKind.OTHER); + new SqlSpecialOperator("DISTRIBUTED BY", SqlKind.OTHER) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + String distributionKind = + operands[2] instanceof SqlCharStringLiteral + ? ((SqlCharStringLiteral) operands[2]).getValueAs(String.class) + : null; + return new SqlDistribution( + pos, + distributionKind, + (SqlNodeList) operands[1], + (SqlNumericLiteral) operands[0]); + } + }; private final String distributionKind; private final SqlNodeList bucketColumns; @@ -61,7 +78,12 @@ public SqlDistribution( @Override public List getOperandList() { - return ImmutableNullableList.of(bucketCount, bucketColumns); + return ImmutableNullableList.of( + bucketCount, + bucketColumns, + distributionKind == null + ? SqlLiteral.createNull(SqlParserPos.ZERO) + : SqlLiteral.createCharString(distributionKind, SqlParserPos.ZERO)); } @Override diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlDropDatabase.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlDropDatabase.java index 4a6bab12af4a7..a69d064cb43d2 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlDropDatabase.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlDropDatabase.java @@ -18,17 +18,32 @@ package org.apache.flink.sql.parser.ddl; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; +import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; +import java.util.List; + /** DROP DATABASE DDL sql call. */ public class SqlDropDatabase extends SqlDropObject { private static final SqlOperator OPERATOR = - new SqlSpecialOperator("DROP DATABASE", SqlKind.OTHER_DDL); + new SqlSpecialOperator("DROP DATABASE", SqlKind.OTHER_DDL) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlDropDatabase( + pos, + (SqlIdentifier) operands[0], + ((SqlLiteral) operands[1]).booleanValue(), + ((SqlLiteral) operands[2]).booleanValue()); + } + }; private final boolean isCascade; @@ -42,6 +57,14 @@ public boolean isCascade() { return isCascade; } + @Override + public List getOperandList() { + return List.of( + name, + SqlLiteral.createBoolean(ifExists, SqlParserPos.ZERO), + SqlLiteral.createBoolean(isCascade, SqlParserPos.ZERO)); + } + @Override public void unparse(SqlWriter writer, int leftPrec, int rightPrec) { writer.keyword("DROP"); diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlDropFunction.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlDropFunction.java index 5eeec63520707..4a649bf31b207 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlDropFunction.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlDropFunction.java @@ -18,17 +18,33 @@ package org.apache.flink.sql.parser.ddl; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; +import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; +import java.util.List; + /** DROP FUNCTION DDL sql call. */ public class SqlDropFunction extends SqlDropObject { private static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("DROP FUNCTION", SqlKind.DROP_FUNCTION); + new SqlSpecialOperator("DROP FUNCTION", SqlKind.DROP_FUNCTION) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlDropFunction( + pos, + (SqlIdentifier) operands[0], + ((SqlLiteral) operands[1]).booleanValue(), + ((SqlLiteral) operands[2]).booleanValue(), + ((SqlLiteral) operands[3]).booleanValue()); + } + }; private final boolean isTemporary; @@ -61,6 +77,15 @@ public void unparse(SqlWriter writer, int leftPrec, int rightPrec) { name.unparse(writer, leftPrec, rightPrec); } + @Override + public List getOperandList() { + return List.of( + name, + SqlLiteral.createBoolean(ifExists, SqlParserPos.ZERO), + SqlLiteral.createBoolean(isTemporary, SqlParserPos.ZERO), + SqlLiteral.createBoolean(isSystemFunction, SqlParserPos.ZERO)); + } + public boolean isTemporary() { return isTemporary; } diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlDropPartitions.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlDropPartitions.java index d538989b6a939..637be0a1284de 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlDropPartitions.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlDropPartitions.java @@ -21,9 +21,14 @@ import org.apache.flink.sql.parser.SqlParseUtils; import org.apache.flink.sql.parser.ddl.table.SqlAlterTable; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; +import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNodeList; +import org.apache.calcite.sql.SqlOperator; +import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; @@ -36,6 +41,23 @@ /** ALTER TABLE DDL to drop partitions of a table. */ public class SqlDropPartitions extends SqlAlterTable { + private static final SqlSpecialOperator DROP_PARTITION_OPERATOR = + new SqlSpecialOperator("ALTER TABLE DROP PARTITION", SqlKind.ALTER_TABLE) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + List partSpecs = new ArrayList<>(); + for (SqlNode spec : (SqlNodeList) operands[2]) { + partSpecs.add((SqlNodeList) spec); + } + return new SqlDropPartitions( + pos, + (SqlIdentifier) operands[0], + ((SqlLiteral) operands[1]).booleanValue(), + partSpecs); + } + }; + private final boolean ifExists; private final List partSpecs; @@ -81,13 +103,18 @@ public void unparseAlterOperation(SqlWriter writer, int leftPrec, int rightPrec) writer.endList(frame); } + @Override + public SqlOperator getOperator() { + return DROP_PARTITION_OPERATOR; + } + @Nonnull @Override public List getOperandList() { - List operands = new ArrayList<>(); - operands.add(tableIdentifier); - operands.addAll(partSpecs); - return operands; + return List.of( + tableIdentifier, + SqlLiteral.createBoolean(ifExists, SqlParserPos.ZERO), + new SqlNodeList(partSpecs, SqlParserPos.ZERO)); } /** Alter table add partition context. */ diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlRemoveJar.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlRemoveJar.java index 1fb36e51c76f0..fd7a212985d3b 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlRemoveJar.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlRemoveJar.java @@ -19,8 +19,10 @@ package org.apache.flink.sql.parser.ddl; import org.apache.calcite.sql.SqlAlter; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlCharStringLiteral; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; @@ -35,7 +37,13 @@ public class SqlRemoveJar extends SqlAlter { public static final SqlOperator OPERATOR = - new SqlSpecialOperator("REMOVE JAR", SqlKind.OTHER_DDL); + new SqlSpecialOperator("REMOVE JAR", SqlKind.OTHER_DDL) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlRemoveJar(pos, (SqlCharStringLiteral) operands[0]); + } + }; private final SqlCharStringLiteral jarPath; diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlReplaceTableAs.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlReplaceTableAs.java index db3cf838119ba..2de970cae90ee 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlReplaceTableAs.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlReplaceTableAs.java @@ -25,9 +25,11 @@ import org.apache.flink.sql.parser.ddl.table.SqlCreateTable; import org.apache.flink.sql.parser.error.SqlValidateException; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlCharStringLiteral; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNodeList; import org.apache.calcite.sql.SqlSpecialOperator; @@ -38,6 +40,7 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; +import java.util.ArrayList; import java.util.List; /** @@ -73,10 +76,44 @@ public class SqlReplaceTableAs extends SqlCreateTable implements ExtendedSqlNode { public static final SqlSpecialOperator REPLACE_OPERATOR = - new SqlSpecialOperator("REPLACE TABLE AS", SqlKind.OTHER_DDL); + new SqlSpecialOperator("REPLACE TABLE AS", SqlKind.OTHER_DDL) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return createReplaceCall(pos, operands, false); + } + }; public static final SqlSpecialOperator CREATE_OR_REPLACE_OPERATOR = - new SqlSpecialOperator("CREATE OR REPLACE TABLE AS", SqlKind.OTHER_DDL); + new SqlSpecialOperator("CREATE OR REPLACE TABLE AS", SqlKind.OTHER_DDL) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return createReplaceCall(pos, operands, true); + } + }; + + private static SqlReplaceTableAs createReplaceCall( + SqlParserPos pos, SqlNode[] operands, boolean isCreateOrReplace) { + List constraints = new ArrayList<>(); + for (SqlNode c : (SqlNodeList) operands[2]) { + constraints.add((SqlTableConstraint) c); + } + return new SqlReplaceTableAs( + pos, + (SqlIdentifier) operands[0], + (SqlNodeList) operands[1], + constraints, + (SqlNodeList) operands[3], + (SqlDistribution) operands[8], + (SqlNodeList) operands[4], + (SqlWatermark) operands[5], + (SqlCharStringLiteral) operands[6], + operands[7], + false, + false, + isCreateOrReplace); + } private final boolean isCreateOrReplace; @@ -124,9 +161,10 @@ public SqlReplaceTableAs( new SqlNodeList(getTableConstraints(), SqlParserPos.ZERO), properties, partitionKeyList, - getWatermark().get(), + getWatermark().orElse(null), comment, - asQuery); + asQuery, + getDistribution()); } @Override diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlReset.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlReset.java index a63bfddb927dd..f49798e11fb55 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlReset.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlReset.java @@ -23,6 +23,7 @@ import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; @@ -40,7 +41,13 @@ public class SqlReset extends SqlCall { public static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("RESET", SqlKind.OTHER); + new SqlSpecialOperator("RESET", SqlKind.OTHER) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlReset(pos, operands.length > 0 ? operands[0] : null); + } + }; @Nullable private final SqlNode key; diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlSet.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlSet.java index 30abe0ce85772..1786bcb17e62b 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlSet.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlSet.java @@ -23,6 +23,7 @@ import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; @@ -40,7 +41,17 @@ @Internal public class SqlSet extends SqlCall { - public static final SqlSpecialOperator OPERATOR = new SqlSpecialOperator("SET", SqlKind.OTHER); + public static final SqlSpecialOperator OPERATOR = + new SqlSpecialOperator("SET", SqlKind.OTHER) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + if (operands.length == 0 || operands[0] == null) { + return new SqlSet(pos); + } + return new SqlSet(pos, operands[0], operands[1]); + } + }; @Nullable private final SqlNode key; @Nullable private final SqlNode value; diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlStopJob.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlStopJob.java index a50a03d8154c1..09960453634e4 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlStopJob.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlStopJob.java @@ -21,6 +21,7 @@ import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlCharStringLiteral; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; @@ -30,14 +31,23 @@ import javax.annotation.Nonnull; -import java.util.Collections; import java.util.List; /** The command to stop a flink job. */ public class SqlStopJob extends SqlCall { public static final SqlOperator OPERATOR = - new SqlSpecialOperator("STOP JOB", SqlKind.OTHER_DDL); + new SqlSpecialOperator("STOP JOB", SqlKind.OTHER_DDL) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlStopJob( + pos, + (SqlCharStringLiteral) operands[0], + ((SqlLiteral) operands[1]).booleanValue(), + ((SqlLiteral) operands[2]).booleanValue()); + } + }; private final SqlCharStringLiteral jobId; @@ -78,7 +88,10 @@ public SqlOperator getOperator() { @Nonnull @Override public List getOperandList() { - return Collections.singletonList(jobId); + return List.of( + jobId, + SqlLiteral.createBoolean(isWithSavepoint, SqlParserPos.ZERO), + SqlLiteral.createBoolean(isWithDrain, SqlParserPos.ZERO)); } public String getId() { diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlTableColumn.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlTableColumn.java index b0fc21a99df45..88658bcaa2a43 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlTableColumn.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlTableColumn.java @@ -26,6 +26,7 @@ import org.apache.calcite.sql.SqlDataTypeSpec; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; @@ -88,6 +89,20 @@ public String getComment() { /** A regular, physical column. */ public static class SqlRegularColumn extends SqlTableColumn { + private static final SqlSpecialOperator REGULAR_OPERATOR = + new SqlSpecialOperator("COLUMN_DECL", SqlKind.COLUMN_DECL) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlRegularColumn( + pos, + (SqlIdentifier) operands[0], + (SqlCharStringLiteral) operands[3], + (SqlDataTypeSpec) operands[1], + (SqlTableConstraint) operands[2]); + } + }; + private SqlDataTypeSpec type; private final @Nullable SqlTableConstraint constraint; @@ -127,6 +142,11 @@ protected void unparseColumn(SqlWriter writer, int leftPrec, int rightPrec) { } } + @Override + public @Nonnull SqlOperator getOperator() { + return REGULAR_OPERATOR; + } + @Override public @Nonnull List getOperandList() { return ImmutableNullableList.of(name, type, constraint, comment); @@ -136,6 +156,21 @@ protected void unparseColumn(SqlWriter writer, int leftPrec, int rightPrec) { /** A column derived from metadata. */ public static class SqlMetadataColumn extends SqlTableColumn { + private static final SqlSpecialOperator METADATA_OPERATOR = + new SqlSpecialOperator("COLUMN_DECL", SqlKind.COLUMN_DECL) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlMetadataColumn( + pos, + (SqlIdentifier) operands[0], + (SqlCharStringLiteral) operands[2], + (SqlDataTypeSpec) operands[1], + operands[3], + ((SqlLiteral) operands[4]).booleanValue()); + } + }; + private final SqlDataTypeSpec type; private final @Nullable SqlNode metadataAlias; @@ -184,15 +219,38 @@ protected void unparseColumn(SqlWriter writer, int leftPrec, int rightPrec) { } } + @Override + public @Nonnull SqlOperator getOperator() { + return METADATA_OPERATOR; + } + @Override public @Nonnull List getOperandList() { - return ImmutableNullableList.of(name, type, comment); + return ImmutableNullableList.of( + name, + type, + comment, + metadataAlias, + SqlLiteral.createBoolean(isVirtual, SqlParserPos.ZERO)); } } /** A column derived from an expression. */ public static class SqlComputedColumn extends SqlTableColumn { + private static final SqlSpecialOperator COMPUTED_OPERATOR = + new SqlSpecialOperator("COLUMN_DECL", SqlKind.COLUMN_DECL) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlComputedColumn( + pos, + (SqlIdentifier) operands[0], + (SqlCharStringLiteral) operands[2], + operands[1]); + } + }; + private final SqlNode expr; public SqlComputedColumn( @@ -214,6 +272,11 @@ protected void unparseColumn(SqlWriter writer, int leftPrec, int rightPrec) { expr.unparse(writer, leftPrec, rightPrec); } + @Override + public @Nonnull SqlOperator getOperator() { + return COMPUTED_OPERATOR; + } + @Override public @Nonnull List getOperandList() { return ImmutableNullableList.of(name, expr, comment); diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlTableOption.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlTableOption.java index ce5b5c5d2d941..0ad604b17d425 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlTableOption.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlTableOption.java @@ -21,6 +21,7 @@ import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; @@ -36,7 +37,13 @@ public class SqlTableOption extends SqlCall { /** Use this operator only if you don't have a better one. */ protected static final SqlOperator OPERATOR = - new SqlSpecialOperator("TableOption", SqlKind.OTHER); + new SqlSpecialOperator("TableOption", SqlKind.OTHER) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlTableOption(operands[0], operands[1], pos); + } + }; private final SqlNode key; private final SqlNode value; diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlUseDatabase.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlUseDatabase.java index cb68fca9d92e6..ac83b6e78e844 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlUseDatabase.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlUseDatabase.java @@ -21,6 +21,7 @@ import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; @@ -34,7 +35,13 @@ public class SqlUseDatabase extends SqlCall { public static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("USE DATABASE", SqlKind.OTHER_DDL); + new SqlSpecialOperator("USE DATABASE", SqlKind.OTHER_DDL) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlUseDatabase(pos, (SqlIdentifier) operands[0]); + } + }; private final SqlIdentifier databaseName; public SqlUseDatabase(SqlParserPos pos, SqlIdentifier databaseName) { diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlUseModules.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlUseModules.java index 5036624a40802..52eb112523bc9 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlUseModules.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlUseModules.java @@ -21,6 +21,7 @@ import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; @@ -28,6 +29,7 @@ import org.apache.calcite.sql.parser.SqlParserPos; import org.apache.calcite.util.ImmutableNullableList; +import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @@ -36,7 +38,17 @@ /** USE MODULES sql call. */ public class SqlUseModules extends SqlCall { public static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("USE MODULES", SqlKind.OTHER); + new SqlSpecialOperator("USE MODULES", SqlKind.OTHER) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + List moduleNames = new ArrayList<>(operands.length); + for (SqlNode operand : operands) { + moduleNames.add((SqlIdentifier) operand); + } + return new SqlUseModules(pos, moduleNames); + } + }; private final List moduleNames; diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlWatermark.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlWatermark.java index 7aa48f06f8158..41fef12cb72e5 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlWatermark.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/SqlWatermark.java @@ -21,6 +21,7 @@ import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; @@ -39,7 +40,13 @@ public class SqlWatermark extends SqlCall { private static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("WATERMARK", SqlKind.OTHER); + new SqlSpecialOperator("WATERMARK", SqlKind.OTHER) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlWatermark(pos, (SqlIdentifier) operands[0], operands[1]); + } + }; private final SqlIdentifier eventTimeColumnName; private final SqlNode watermarkStrategy; diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/catalog/SqlAlterCatalog.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/catalog/SqlAlterCatalog.java index 229432edda394..96ada5f8b0caf 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/catalog/SqlAlterCatalog.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/catalog/SqlAlterCatalog.java @@ -20,8 +20,10 @@ import org.apache.flink.sql.parser.ddl.SqlAlterObject; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; @@ -34,7 +36,13 @@ public class SqlAlterCatalog extends SqlAlterObject { private static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("ALTER CATALOG", SqlKind.OTHER_DDL); + new SqlSpecialOperator("ALTER CATALOG", SqlKind.OTHER_DDL) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlAlterCatalog(pos, (SqlIdentifier) operands[0]); + } + }; public SqlAlterCatalog(SqlParserPos position, SqlIdentifier catalogName) { super(OPERATOR, position, "CATALOG", catalogName); diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/catalog/SqlAlterCatalogComment.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/catalog/SqlAlterCatalogComment.java index c7c8104eda6ea..1d81f36f2f1bf 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/catalog/SqlAlterCatalogComment.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/catalog/SqlAlterCatalogComment.java @@ -21,9 +21,14 @@ import org.apache.flink.sql.parser.SqlParseUtils; import org.apache.flink.sql.parser.SqlUnparseUtils; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlCharStringLiteral; import org.apache.calcite.sql.SqlIdentifier; +import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; +import org.apache.calcite.sql.SqlOperator; +import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; import org.apache.calcite.util.ImmutableNullableList; @@ -35,6 +40,16 @@ /** ALTER CATALOG catalog_name COMMENT 'comment'. */ public class SqlAlterCatalogComment extends SqlAlterCatalog { + private static final SqlSpecialOperator COMMENT_OPERATOR = + new SqlSpecialOperator("ALTER CATALOG COMMENT", SqlKind.OTHER_DDL) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlAlterCatalogComment( + pos, (SqlIdentifier) operands[0], (SqlCharStringLiteral) operands[1]); + } + }; + private final SqlCharStringLiteral comment; public SqlAlterCatalogComment( @@ -43,6 +58,11 @@ public SqlAlterCatalogComment( this.comment = requireNonNull(comment, "comment cannot be null"); } + @Override + public SqlOperator getOperator() { + return COMMENT_OPERATOR; + } + @Override public List getOperandList() { return ImmutableNullableList.of(name, comment); diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/catalog/SqlAlterCatalogOptions.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/catalog/SqlAlterCatalogOptions.java index ce7d14ae37471..67cb207ad4ca8 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/catalog/SqlAlterCatalogOptions.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/catalog/SqlAlterCatalogOptions.java @@ -21,9 +21,14 @@ import org.apache.flink.sql.parser.SqlParseUtils; import org.apache.flink.sql.parser.SqlUnparseUtils; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; +import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNodeList; +import org.apache.calcite.sql.SqlOperator; +import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; import org.apache.calcite.util.ImmutableNullableList; @@ -36,6 +41,16 @@ /** ALTER CATALOG catalog_name SET (key1=val1, ...). */ public class SqlAlterCatalogOptions extends SqlAlterCatalog { + private static final SqlSpecialOperator OPTIONS_OPERATOR = + new SqlSpecialOperator("ALTER CATALOG OPTIONS", SqlKind.OTHER_DDL) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlAlterCatalogOptions( + pos, (SqlIdentifier) operands[0], (SqlNodeList) operands[1]); + } + }; + private final SqlNodeList propertyList; public SqlAlterCatalogOptions( @@ -44,6 +59,11 @@ public SqlAlterCatalogOptions( this.propertyList = requireNonNull(propertyList, "propertyList cannot be null"); } + @Override + public SqlOperator getOperator() { + return OPTIONS_OPERATOR; + } + @Override public List getOperandList() { return ImmutableNullableList.of(name, propertyList); diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/catalog/SqlAlterCatalogReset.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/catalog/SqlAlterCatalogReset.java index 77420e1ea0bdd..2270ef94f838f 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/catalog/SqlAlterCatalogReset.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/catalog/SqlAlterCatalogReset.java @@ -21,9 +21,14 @@ import org.apache.flink.sql.parser.SqlParseUtils; import org.apache.flink.sql.parser.SqlUnparseUtils; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; +import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNodeList; +import org.apache.calcite.sql.SqlOperator; +import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; import org.apache.calcite.util.ImmutableNullableList; @@ -37,6 +42,16 @@ /** ALTER CATALOG catalog_name RESET (key1, ...). */ public class SqlAlterCatalogReset extends SqlAlterCatalog { + private static final SqlSpecialOperator RESET_OPERATOR = + new SqlSpecialOperator("ALTER CATALOG RESET", SqlKind.OTHER_DDL) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlAlterCatalogReset( + pos, (SqlIdentifier) operands[0], (SqlNodeList) operands[1]); + } + }; + private final SqlNodeList propertyKeyList; public SqlAlterCatalogReset( @@ -45,6 +60,11 @@ public SqlAlterCatalogReset( this.propertyKeyList = requireNonNull(propertyKeyList, "propertyKeyList cannot be null"); } + @Override + public SqlOperator getOperator() { + return RESET_OPERATOR; + } + @Override public List getOperandList() { return ImmutableNullableList.of(name, propertyKeyList); diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/catalog/SqlCreateCatalog.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/catalog/SqlCreateCatalog.java index 43e5e172f8640..cb3b16bfd6d88 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/catalog/SqlCreateCatalog.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/catalog/SqlCreateCatalog.java @@ -20,9 +20,11 @@ import org.apache.flink.sql.parser.ddl.SqlCreateObject; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlCharStringLiteral; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNodeList; import org.apache.calcite.sql.SqlSpecialOperator; @@ -39,7 +41,18 @@ public class SqlCreateCatalog extends SqlCreateObject { private static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("CREATE CATALOG", SqlKind.OTHER_DDL); + new SqlSpecialOperator("CREATE CATALOG", SqlKind.OTHER_DDL) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlCreateCatalog( + pos, + (SqlIdentifier) operands[0], + (SqlNodeList) operands[1], + (SqlCharStringLiteral) operands[2], + ((SqlLiteral) operands[3]).booleanValue()); + } + }; public SqlCreateCatalog( SqlParserPos position, @@ -58,7 +71,11 @@ protected String getScope() { @Override public List getOperandList() { - return ImmutableNullableList.of(name, properties, comment); + return ImmutableNullableList.of( + name, + properties, + comment, + SqlLiteral.createBoolean(isIfNotExists(), SqlParserPos.ZERO)); } public String catalogName() { diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/catalog/SqlDropCatalog.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/catalog/SqlDropCatalog.java index d2121d63019a8..80cbbe9eaa68e 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/catalog/SqlDropCatalog.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/catalog/SqlDropCatalog.java @@ -20,18 +20,32 @@ import org.apache.flink.sql.parser.ddl.SqlDropObject; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; +import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; +import java.util.List; + /** DROP CATALOG DDL sql call. */ public class SqlDropCatalog extends SqlDropObject { private static final SqlOperator OPERATOR = - new SqlSpecialOperator("DROP CATALOG", SqlKind.OTHER_DDL); + new SqlSpecialOperator("DROP CATALOG", SqlKind.OTHER_DDL) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlDropCatalog( + pos, + (SqlIdentifier) operands[0], + ((SqlLiteral) operands[1]).booleanValue()); + } + }; public SqlDropCatalog(SqlParserPos pos, SqlIdentifier catalogName, boolean ifExists) { super(OPERATOR, pos, catalogName, ifExists); @@ -50,4 +64,9 @@ public void unparse(SqlWriter writer, int leftPrec, int rightPrec) { public String catalogName() { return name.getSimple(); } + + @Override + public List getOperandList() { + return List.of(name, SqlLiteral.createBoolean(ifExists, SqlParserPos.ZERO)); + } } diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/catalog/SqlUseCatalog.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/catalog/SqlUseCatalog.java index 46650207a2240..903e8e7e0e4f4 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/catalog/SqlUseCatalog.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/catalog/SqlUseCatalog.java @@ -21,6 +21,7 @@ import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; @@ -34,7 +35,13 @@ public class SqlUseCatalog extends SqlCall { public static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("USE CATALOG", SqlKind.OTHER_DDL); + new SqlSpecialOperator("USE CATALOG", SqlKind.OTHER_DDL) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlUseCatalog(pos, (SqlIdentifier) operands[0]); + } + }; private final SqlIdentifier catalogName; public SqlUseCatalog(SqlParserPos pos, SqlIdentifier catalogName) { diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/connection/SqlAlterConnectionRename.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/connection/SqlAlterConnectionRename.java index 0b98bf51c2911..24a77c38a2d03 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/connection/SqlAlterConnectionRename.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/connection/SqlAlterConnectionRename.java @@ -18,8 +18,13 @@ package org.apache.flink.sql.parser.ddl.connection; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; +import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; +import org.apache.calcite.sql.SqlOperator; +import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; @@ -33,6 +38,19 @@ */ public class SqlAlterConnectionRename extends SqlAlterConnection { + private static final SqlSpecialOperator RENAME_OPERATOR = + new SqlSpecialOperator("ALTER CONNECTION RENAME", SqlKind.OTHER_DDL) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlAlterConnectionRename( + pos, + (SqlIdentifier) operands[0], + (SqlIdentifier) operands[1], + ((SqlLiteral) operands[2]).booleanValue()); + } + }; + private final SqlIdentifier newConnectionName; public SqlAlterConnectionRename( @@ -49,9 +67,17 @@ public SqlIdentifier getNewConnectionName() { return newConnectionName; } + @Override + public SqlOperator getOperator() { + return RENAME_OPERATOR; + } + @Override public List getOperandList() { - return List.of(name, newConnectionName); + return List.of( + name, + newConnectionName, + SqlLiteral.createBoolean(ifConnectionExists, SqlParserPos.ZERO)); } @Override diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/connection/SqlAlterConnectionReset.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/connection/SqlAlterConnectionReset.java index f0cb7c454f55d..d158a29e6cd57 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/connection/SqlAlterConnectionReset.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/connection/SqlAlterConnectionReset.java @@ -21,9 +21,14 @@ import org.apache.flink.sql.parser.SqlParseUtils; import org.apache.flink.sql.parser.SqlUnparseUtils; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; +import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNodeList; +import org.apache.calcite.sql.SqlOperator; +import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; @@ -37,6 +42,19 @@ * 'key2']...). */ public class SqlAlterConnectionReset extends SqlAlterConnection { + private static final SqlSpecialOperator RESET_OPERATOR = + new SqlSpecialOperator("ALTER CONNECTION RESET", SqlKind.OTHER_DDL) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlAlterConnectionReset( + pos, + (SqlIdentifier) operands[0], + ((SqlLiteral) operands[2]).booleanValue(), + (SqlNodeList) operands[1]); + } + }; + private final SqlNodeList optionKeyList; public SqlAlterConnectionReset( @@ -48,9 +66,17 @@ public SqlAlterConnectionReset( this.optionKeyList = requireNonNull(optionKeyList, "optionKeyList should not be null"); } + @Override + public SqlOperator getOperator() { + return RESET_OPERATOR; + } + @Override public List getOperandList() { - return List.of(name, optionKeyList); + return List.of( + name, + optionKeyList, + SqlLiteral.createBoolean(ifConnectionExists, SqlParserPos.ZERO)); } public Set getResetKeys() { diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/connection/SqlAlterConnectionSet.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/connection/SqlAlterConnectionSet.java index 795a98460bada..750bf7bbb87ac 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/connection/SqlAlterConnectionSet.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/connection/SqlAlterConnectionSet.java @@ -21,9 +21,14 @@ import org.apache.flink.sql.parser.SqlParseUtils; import org.apache.flink.sql.parser.SqlUnparseUtils; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; +import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNodeList; +import org.apache.calcite.sql.SqlOperator; +import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; @@ -38,6 +43,19 @@ */ public class SqlAlterConnectionSet extends SqlAlterConnection { + private static final SqlSpecialOperator SET_OPERATOR = + new SqlSpecialOperator("ALTER CONNECTION SET", SqlKind.OTHER_DDL) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlAlterConnectionSet( + pos, + (SqlIdentifier) operands[0], + ((SqlLiteral) operands[2]).booleanValue(), + (SqlNodeList) operands[1]); + } + }; + private final SqlNodeList connectionOptionList; public SqlAlterConnectionSet( @@ -54,9 +72,17 @@ public Map getProperties() { return SqlParseUtils.extractMap(connectionOptionList); } + @Override + public SqlOperator getOperator() { + return SET_OPERATOR; + } + @Override public List getOperandList() { - return List.of(name, connectionOptionList); + return List.of( + name, + connectionOptionList, + SqlLiteral.createBoolean(ifConnectionExists, SqlParserPos.ZERO)); } @Override diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/connection/SqlCreateConnection.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/connection/SqlCreateConnection.java index 3ae76a4663a5f..5671bf19a65ca 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/connection/SqlCreateConnection.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/connection/SqlCreateConnection.java @@ -23,9 +23,11 @@ import org.apache.flink.sql.parser.ddl.SqlCreateObject; import org.apache.flink.sql.parser.error.SqlValidateException; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlCharStringLiteral; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNodeList; import org.apache.calcite.sql.SqlSpecialOperator; @@ -45,7 +47,20 @@ public class SqlCreateConnection extends SqlCreateObject implements ExtendedSqlNode { private static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("CREATE CONNECTION", SqlKind.OTHER_DDL); + new SqlSpecialOperator("CREATE CONNECTION", SqlKind.OTHER_DDL) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlCreateConnection( + pos, + (SqlIdentifier) operands[0], + (SqlCharStringLiteral) operands[1], + (SqlNodeList) operands[2], + ((SqlLiteral) operands[3]).booleanValue(), + ((SqlLiteral) operands[4]).booleanValue(), + ((SqlLiteral) operands[5]).booleanValue()); + } + }; private final boolean isSystem; @@ -71,7 +86,13 @@ public SqlCreateConnection( @Override public @Nonnull List getOperandList() { - return ImmutableNullableList.of(name, comment, properties); + return ImmutableNullableList.of( + name, + comment, + properties, + SqlLiteral.createBoolean(isTemporary(), SqlParserPos.ZERO), + SqlLiteral.createBoolean(isSystem, SqlParserPos.ZERO), + SqlLiteral.createBoolean(isIfNotExists(), SqlParserPos.ZERO)); } public boolean isSystem() { diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/connection/SqlDropConnection.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/connection/SqlDropConnection.java index d948f5f2b09a2..2e2480f7e8884 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/connection/SqlDropConnection.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/connection/SqlDropConnection.java @@ -20,20 +20,36 @@ import org.apache.flink.sql.parser.ddl.SqlDropObject; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; +import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; +import java.util.List; + /** * {@link org.apache.calcite.sql.SqlNode} to describe the DROP CONNECTION [IF EXISTS] * [[catalogName.] dataBasesName].connectionName syntax. */ public class SqlDropConnection extends SqlDropObject { private static final SqlOperator OPERATOR = - new SqlSpecialOperator("DROP CONNECTION", SqlKind.OTHER_DDL); + new SqlSpecialOperator("DROP CONNECTION", SqlKind.OTHER_DDL) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlDropConnection( + pos, + (SqlIdentifier) operands[0], + ((SqlLiteral) operands[1]).booleanValue(), + ((SqlLiteral) operands[2]).booleanValue(), + ((SqlLiteral) operands[3]).booleanValue()); + } + }; private final boolean isTemporary; private final boolean isSystemConnection; @@ -57,6 +73,15 @@ public boolean isSystemConnection() { return isSystemConnection; } + @Override + public List getOperandList() { + return List.of( + name, + SqlLiteral.createBoolean(ifExists, SqlParserPos.ZERO), + SqlLiteral.createBoolean(isTemporary, SqlParserPos.ZERO), + SqlLiteral.createBoolean(isSystemConnection, SqlParserPos.ZERO)); + } + @Override public void unparse(SqlWriter writer, int leftPrec, int rightPrec) { writer.keyword("DROP"); diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/constraint/SqlTableConstraint.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/constraint/SqlTableConstraint.java index b8e7aab12fcc2..d807fbc02781a 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/constraint/SqlTableConstraint.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/constraint/SqlTableConstraint.java @@ -59,7 +59,19 @@ public class SqlTableConstraint extends SqlCall { /** Use this operator only if you don't have a better one. */ private static final SqlOperator OPERATOR = - new SqlSpecialOperator("SqlTableConstraint", SqlKind.OTHER); + new SqlSpecialOperator("SqlTableConstraint", SqlKind.OTHER) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlTableConstraint( + (SqlIdentifier) operands[0], + (SqlLiteral) operands[1], + (SqlNodeList) operands[2], + (SqlLiteral) operands[3], + ((SqlLiteral) operands[4]).booleanValue(), + pos); + } + }; private final SqlIdentifier constraintName; private final SqlLiteral uniqueSpec; @@ -143,7 +155,12 @@ public String[] getColumnNames() { @Override public List getOperandList() { - return ImmutableNullableList.of(constraintName, uniqueSpec, columns, enforcement); + return ImmutableNullableList.of( + constraintName, + uniqueSpec, + columns, + enforcement, + SqlLiteral.createBoolean(isTableConstraint, SqlParserPos.ZERO)); } @Override diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlAlterMaterializedTableAsQuery.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlAlterMaterializedTableAsQuery.java index cc57ec30796f6..ea6d6e2ab405c 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlAlterMaterializedTableAsQuery.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlAlterMaterializedTableAsQuery.java @@ -20,8 +20,13 @@ import org.apache.flink.sql.parser.SqlUnparseUtils; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; +import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; +import org.apache.calcite.sql.SqlOperator; +import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; import org.apache.calcite.util.ImmutableNullableList; @@ -34,6 +39,16 @@ */ public class SqlAlterMaterializedTableAsQuery extends SqlAlterMaterializedTable { + private static final SqlSpecialOperator AS_QUERY_OPERATOR = + new SqlSpecialOperator("ALTER MATERIALIZED TABLE AS", SqlKind.ALTER_TABLE) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlAlterMaterializedTableAsQuery( + pos, (SqlIdentifier) operands[0], operands[1], SqlParserPos.ZERO); + } + }; + private final SqlNode asQuery; private final SqlParserPos asQueryKeywordPos; @@ -57,6 +72,11 @@ public SqlParserPos getAsQueryKeywordPos() { return asQueryKeywordPos; } + @Override + public SqlOperator getOperator() { + return AS_QUERY_OPERATOR; + } + @Override public List getOperandList() { return ImmutableNullableList.of(name, asQuery); diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlAlterMaterializedTableDistribution.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlAlterMaterializedTableDistribution.java index d0515a85d4f2a..a852c0e01a60d 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlAlterMaterializedTableDistribution.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlAlterMaterializedTableDistribution.java @@ -20,8 +20,13 @@ import org.apache.flink.sql.parser.ddl.SqlDistribution; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; +import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; +import org.apache.calcite.sql.SqlOperator; +import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; import org.apache.calcite.util.ImmutableNullableList; @@ -63,11 +68,27 @@ public Optional getDistribution() { public static class SqlAlterMaterializedTableAddDistribution extends SqlAlterMaterializedTableDistribution { + private static final SqlSpecialOperator ADD_DISTRIBUTION_OPERATOR = + new SqlSpecialOperator( + "ALTER MATERIALIZED TABLE ADD DISTRIBUTION", SqlKind.ALTER_TABLE) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlAlterMaterializedTableAddDistribution( + pos, (SqlIdentifier) operands[0], (SqlDistribution) operands[1]); + } + }; + public SqlAlterMaterializedTableAddDistribution( SqlParserPos pos, SqlIdentifier tableName, SqlDistribution distribution) { super(pos, tableName, distribution); } + @Override + public SqlOperator getOperator() { + return ADD_DISTRIBUTION_OPERATOR; + } + @Override protected String getAlterOperation() { return "ADD"; @@ -77,11 +98,27 @@ protected String getAlterOperation() { public static class SqlAlterMaterializedTableModifyDistribution extends SqlAlterMaterializedTableDistribution { + private static final SqlSpecialOperator MODIFY_DISTRIBUTION_OPERATOR = + new SqlSpecialOperator( + "ALTER MATERIALIZED TABLE MODIFY DISTRIBUTION", SqlKind.ALTER_TABLE) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlAlterMaterializedTableModifyDistribution( + pos, (SqlIdentifier) operands[0], (SqlDistribution) operands[1]); + } + }; + public SqlAlterMaterializedTableModifyDistribution( SqlParserPos pos, SqlIdentifier tableName, SqlDistribution distribution) { super(pos, tableName, distribution); } + @Override + public SqlOperator getOperator() { + return MODIFY_DISTRIBUTION_OPERATOR; + } + @Override protected String getAlterOperation() { return "MODIFY"; diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlAlterMaterializedTableDropDistribution.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlAlterMaterializedTableDropDistribution.java index 994b97abf9e15..d5a8268059651 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlAlterMaterializedTableDropDistribution.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlAlterMaterializedTableDropDistribution.java @@ -18,8 +18,13 @@ package org.apache.flink.sql.parser.ddl.materializedtable; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; +import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; +import org.apache.calcite.sql.SqlOperator; +import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; @@ -31,10 +36,26 @@ */ public class SqlAlterMaterializedTableDropDistribution extends SqlAlterMaterializedTable { + private static final SqlSpecialOperator DROP_DISTRIBUTION_OPERATOR = + new SqlSpecialOperator( + "ALTER MATERIALIZED TABLE DROP DISTRIBUTION", SqlKind.ALTER_TABLE) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlAlterMaterializedTableDropDistribution( + pos, (SqlIdentifier) operands[0]); + } + }; + public SqlAlterMaterializedTableDropDistribution(SqlParserPos pos, SqlIdentifier tableName) { super(pos, tableName); } + @Override + public SqlOperator getOperator() { + return DROP_DISTRIBUTION_OPERATOR; + } + @Override public List getOperandList() { return List.of(name); diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlAlterMaterializedTableFreshness.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlAlterMaterializedTableFreshness.java index 809c102844fe4..c81ae5f1fed8b 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlAlterMaterializedTableFreshness.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlAlterMaterializedTableFreshness.java @@ -20,9 +20,14 @@ import org.apache.flink.sql.parser.SqlUnparseUtils; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlIntervalLiteral; +import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; +import org.apache.calcite.sql.SqlOperator; +import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; import org.apache.calcite.util.ImmutableNullableList; @@ -35,6 +40,16 @@ */ public class SqlAlterMaterializedTableFreshness extends SqlAlterMaterializedTable { + private static final SqlSpecialOperator FRESHNESS_OPERATOR = + new SqlSpecialOperator("ALTER MATERIALIZED TABLE SET FRESHNESS", SqlKind.ALTER_TABLE) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlAlterMaterializedTableFreshness( + pos, (SqlIdentifier) operands[0], (SqlIntervalLiteral) operands[1]); + } + }; + private final SqlIntervalLiteral freshness; public SqlAlterMaterializedTableFreshness( @@ -48,6 +63,11 @@ public List getOperandList() { return ImmutableNullableList.of(name, freshness); } + @Override + public SqlOperator getOperator() { + return FRESHNESS_OPERATOR; + } + public SqlIntervalLiteral getFreshness() { return freshness; } diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlAlterMaterializedTableOptions.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlAlterMaterializedTableOptions.java index eea02b030bb57..254ac65decd54 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlAlterMaterializedTableOptions.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlAlterMaterializedTableOptions.java @@ -20,9 +20,14 @@ import org.apache.flink.sql.parser.SqlUnparseUtils; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; +import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNodeList; +import org.apache.calcite.sql.SqlOperator; +import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; import org.apache.calcite.util.ImmutableNullableList; @@ -35,6 +40,16 @@ */ public class SqlAlterMaterializedTableOptions extends SqlAlterMaterializedTable { + private static final SqlSpecialOperator OPTIONS_OPERATOR = + new SqlSpecialOperator("ALTER MATERIALIZED TABLE SET", SqlKind.ALTER_TABLE) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlAlterMaterializedTableOptions( + pos, (SqlIdentifier) operands[0], (SqlNodeList) operands[1]); + } + }; + private final SqlNodeList propertyList; public SqlAlterMaterializedTableOptions( @@ -52,6 +67,11 @@ public List getOperandList() { return ImmutableNullableList.of(name, propertyList); } + @Override + public SqlOperator getOperator() { + return OPTIONS_OPERATOR; + } + @Override public void unparseAlterOperation(SqlWriter writer, int leftPrec, int rightPrec) { super.unparseAlterOperation(writer, leftPrec, rightPrec); diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlAlterMaterializedTableRefresh.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlAlterMaterializedTableRefresh.java index 69a25535b1575..8794273c4ccf6 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlAlterMaterializedTableRefresh.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlAlterMaterializedTableRefresh.java @@ -18,9 +18,14 @@ package org.apache.flink.sql.parser.ddl.materializedtable; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; +import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNodeList; +import org.apache.calcite.sql.SqlOperator; +import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; import org.apache.calcite.util.ImmutableNullableList; @@ -33,6 +38,16 @@ */ public class SqlAlterMaterializedTableRefresh extends SqlAlterMaterializedTable { + private static final SqlSpecialOperator REFRESH_OPERATOR = + new SqlSpecialOperator("ALTER MATERIALIZED TABLE REFRESH", SqlKind.ALTER_TABLE) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlAlterMaterializedTableRefresh( + pos, (SqlIdentifier) operands[0], (SqlNodeList) operands[1]); + } + }; + private final SqlNodeList partitionSpec; public SqlAlterMaterializedTableRefresh( @@ -46,6 +61,11 @@ public List getOperandList() { return ImmutableNullableList.of(name, partitionSpec); } + @Override + public SqlOperator getOperator() { + return REFRESH_OPERATOR; + } + @Override public void unparseAlterOperation(SqlWriter writer, int leftPrec, int rightPrec) { super.unparseAlterOperation(writer, leftPrec, rightPrec); diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlAlterMaterializedTableRefreshMode.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlAlterMaterializedTableRefreshMode.java index b21c658857f1a..043bad7df04bd 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlAlterMaterializedTableRefreshMode.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlAlterMaterializedTableRefreshMode.java @@ -18,9 +18,13 @@ package org.apache.flink.sql.parser.ddl.materializedtable; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; +import org.apache.calcite.sql.SqlKind; import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; +import org.apache.calcite.sql.SqlOperator; +import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; import org.apache.calcite.util.ImmutableNullableList; @@ -35,6 +39,17 @@ */ public class SqlAlterMaterializedTableRefreshMode extends SqlAlterMaterializedTable { + private static final SqlSpecialOperator REFRESH_MODE_OPERATOR = + new SqlSpecialOperator( + "ALTER MATERIALIZED TABLE SET REFRESH_MODE", SqlKind.ALTER_TABLE) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlAlterMaterializedTableRefreshMode( + pos, (SqlIdentifier) operands[0], (SqlLiteral) operands[1]); + } + }; + private final SqlLiteral sqlRefreshMode; public SqlAlterMaterializedTableRefreshMode( @@ -43,9 +58,14 @@ public SqlAlterMaterializedTableRefreshMode( this.sqlRefreshMode = requireNonNull(sqlRefreshMode, "refreshMode should not be null"); } + @Override + public SqlOperator getOperator() { + return REFRESH_MODE_OPERATOR; + } + @Override public List getOperandList() { - return ImmutableNullableList.of(name); + return ImmutableNullableList.of(name, sqlRefreshMode); } @Override diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlAlterMaterializedTableReset.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlAlterMaterializedTableReset.java index 567703dea397b..0c09c24b0a7df 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlAlterMaterializedTableReset.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlAlterMaterializedTableReset.java @@ -20,9 +20,14 @@ import org.apache.flink.sql.parser.SqlUnparseUtils; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; +import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNodeList; +import org.apache.calcite.sql.SqlOperator; +import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; import org.apache.calcite.util.ImmutableNullableList; @@ -35,6 +40,16 @@ */ public class SqlAlterMaterializedTableReset extends SqlAlterMaterializedTable { + private static final SqlSpecialOperator RESET_OPERATOR = + new SqlSpecialOperator("ALTER MATERIALIZED TABLE RESET", SqlKind.ALTER_TABLE) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlAlterMaterializedTableReset( + pos, (SqlIdentifier) operands[0], (SqlNodeList) operands[1]); + } + }; + private final SqlNodeList propertyKeyList; public SqlAlterMaterializedTableReset( @@ -52,6 +67,11 @@ public List getOperandList() { return ImmutableNullableList.of(name, propertyKeyList); } + @Override + public SqlOperator getOperator() { + return RESET_OPERATOR; + } + @Override public void unparseAlterOperation(SqlWriter writer, int leftPrec, int rightPrec) { super.unparseAlterOperation(writer, leftPrec, rightPrec); diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlAlterMaterializedTableResume.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlAlterMaterializedTableResume.java index 3d736bfe74f8f..cb2468bbec8fa 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlAlterMaterializedTableResume.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlAlterMaterializedTableResume.java @@ -21,9 +21,14 @@ import org.apache.flink.sql.parser.SqlParseUtils; import org.apache.flink.sql.parser.SqlUnparseUtils; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; +import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNodeList; +import org.apache.calcite.sql.SqlOperator; +import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; import org.apache.calcite.util.ImmutableNullableList; @@ -38,6 +43,16 @@ */ public class SqlAlterMaterializedTableResume extends SqlAlterMaterializedTable { + private static final SqlSpecialOperator RESUME_OPERATOR = + new SqlSpecialOperator("ALTER MATERIALIZED TABLE RESUME", SqlKind.ALTER_TABLE) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlAlterMaterializedTableResume( + pos, (SqlIdentifier) operands[0], (SqlNodeList) operands[1]); + } + }; + private final SqlNodeList propertyList; public SqlAlterMaterializedTableResume( @@ -56,6 +71,11 @@ public List getOperandList() { return ImmutableNullableList.of(name, propertyList); } + @Override + public SqlOperator getOperator() { + return RESUME_OPERATOR; + } + @Override public void unparseAlterOperation(SqlWriter writer, int leftPrec, int rightPrec) { super.unparseAlterOperation(writer, leftPrec, rightPrec); diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlAlterMaterializedTableSchema.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlAlterMaterializedTableSchema.java index 51285718806f3..a9216983d3f5b 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlAlterMaterializedTableSchema.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlAlterMaterializedTableSchema.java @@ -26,9 +26,14 @@ import org.apache.flink.sql.parser.ddl.position.SqlTableColumnPosition; import org.apache.flink.sql.parser.error.SqlValidateException; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; +import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNodeList; +import org.apache.calcite.sql.SqlOperator; +import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; import org.apache.calcite.util.ImmutableNullableList; @@ -36,6 +41,7 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; +import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; @@ -140,6 +146,29 @@ public SqlAlterMaterializedTableAddSchema( super(pos, materializedTableName, columnList, constraints, sqlWatermark); } + private static final SqlSpecialOperator ADD_SCHEMA_OPERATOR = + new SqlSpecialOperator("ALTER MATERIALIZED TABLE ADD", SqlKind.ALTER_TABLE) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + List constraints = new ArrayList<>(); + for (SqlNode c : (SqlNodeList) operands[2]) { + constraints.add((SqlTableConstraint) c); + } + return new SqlAlterMaterializedTableAddSchema( + pos, + (SqlIdentifier) operands[0], + (SqlNodeList) operands[1], + constraints, + (SqlWatermark) operands[3]); + } + }; + + @Override + public SqlOperator getOperator() { + return ADD_SCHEMA_OPERATOR; + } + @Override protected String getAlterOperation() { return "ADD"; @@ -176,6 +205,29 @@ public SqlAlterMaterializedTableModifySchema( super(pos, materializedTableName, columnList, constraints, sqlWatermark); } + private static final SqlSpecialOperator MODIFY_SCHEMA_OPERATOR = + new SqlSpecialOperator("ALTER MATERIALIZED TABLE MODIFY", SqlKind.ALTER_TABLE) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + List constraints = new ArrayList<>(); + for (SqlNode c : (SqlNodeList) operands[2]) { + constraints.add((SqlTableConstraint) c); + } + return new SqlAlterMaterializedTableModifySchema( + pos, + (SqlIdentifier) operands[0], + (SqlNodeList) operands[1], + constraints, + (SqlWatermark) operands[3]); + } + }; + + @Override + public SqlOperator getOperator() { + return MODIFY_SCHEMA_OPERATOR; + } + @Override protected String getAlterOperation() { return "MODIFY"; @@ -215,6 +267,22 @@ public SqlAlterMaterializedTableDropWatermark( super(pos, materializedTableName); } + private static final SqlSpecialOperator DROP_WATERMARK_OPERATOR = + new SqlSpecialOperator( + "ALTER MATERIALIZED TABLE DROP WATERMARK", SqlKind.ALTER_TABLE) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlAlterMaterializedTableDropWatermark( + pos, (SqlIdentifier) operands[0]); + } + }; + + @Override + public SqlOperator getOperator() { + return DROP_WATERMARK_OPERATOR; + } + @Override public List getOperandList() { return List.of(name); @@ -236,6 +304,27 @@ public SqlAlterMaterializedTableDropPrimaryKey( super(pos, materializedTableName); } + private static final SqlSpecialOperator DROP_PRIMARY_KEY_OPERATOR = + new SqlSpecialOperator( + "ALTER MATERIALIZED TABLE DROP PRIMARY KEY", SqlKind.ALTER_TABLE) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlAlterMaterializedTableDropPrimaryKey( + pos, (SqlIdentifier) operands[0]); + } + }; + + @Override + public SqlOperator getOperator() { + return DROP_PRIMARY_KEY_OPERATOR; + } + + @Override + public List getOperandList() { + return List.of(name); + } + @Override public void unparseDropOperation(SqlWriter writer, int leftPrec, int rightPrec) { writer.keyword("PRIMARY KEY"); @@ -256,6 +345,27 @@ public SqlAlterMaterializedTableDropConstraint( this.constraintName = constraintName; } + private static final SqlSpecialOperator DROP_CONSTRAINT_OPERATOR = + new SqlSpecialOperator( + "ALTER MATERIALIZED TABLE DROP CONSTRAINT", SqlKind.ALTER_TABLE) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlAlterMaterializedTableDropConstraint( + pos, (SqlIdentifier) operands[0], (SqlIdentifier) operands[1]); + } + }; + + @Override + public SqlOperator getOperator() { + return DROP_CONSTRAINT_OPERATOR; + } + + @Override + public List getOperandList() { + return List.of(name, constraintName); + } + public SqlIdentifier getConstraintName() { return constraintName; } @@ -295,6 +405,22 @@ public SqlNodeList getColumnList() { return columnList; } + private static final SqlSpecialOperator DROP_COLUMN_OPERATOR = + new SqlSpecialOperator( + "ALTER MATERIALIZED TABLE DROP COLUMN", SqlKind.ALTER_TABLE) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlAlterMaterializedTableDropColumn( + pos, (SqlIdentifier) operands[0], (SqlNodeList) operands[1]); + } + }; + + @Override + public SqlOperator getOperator() { + return DROP_COLUMN_OPERATOR; + } + @Override public List getOperandList() { return List.of(name, columnList); diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlAlterMaterializedTableSuspend.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlAlterMaterializedTableSuspend.java index 43630c48e6337..56f821457f5f2 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlAlterMaterializedTableSuspend.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlAlterMaterializedTableSuspend.java @@ -18,8 +18,13 @@ package org.apache.flink.sql.parser.ddl.materializedtable; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; +import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; +import org.apache.calcite.sql.SqlOperator; +import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; import org.apache.calcite.util.ImmutableNullableList; @@ -30,10 +35,25 @@ * SqlNode to describe ALTER MATERIALIZED TABLE [catalog_name.][db_name.]table_name SUSPEND clause. */ public class SqlAlterMaterializedTableSuspend extends SqlAlterMaterializedTable { + + private static final SqlSpecialOperator SUSPEND_OPERATOR = + new SqlSpecialOperator("ALTER MATERIALIZED TABLE SUSPEND", SqlKind.ALTER_TABLE) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlAlterMaterializedTableSuspend(pos, (SqlIdentifier) operands[0]); + } + }; + public SqlAlterMaterializedTableSuspend(SqlParserPos pos, SqlIdentifier tableName) { super(pos, tableName); } + @Override + public SqlOperator getOperator() { + return SUSPEND_OPERATOR; + } + @Override public List getOperandList() { return ImmutableNullableList.of(name); diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlCreateMaterializedTable.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlCreateMaterializedTable.java index f1ee603f60ee1..d9524582f792a 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlCreateMaterializedTable.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlCreateMaterializedTable.java @@ -29,19 +29,23 @@ import org.apache.flink.sql.parser.ddl.constraint.SqlTableConstraint; import org.apache.flink.sql.parser.error.SqlValidateException; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlCharStringLiteral; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlIntervalLiteral; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNodeList; import org.apache.calcite.sql.SqlSpecialOperator; +import org.apache.calcite.sql.SqlTimestampLiteral; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; import org.apache.calcite.util.ImmutableNullableList; import javax.annotation.Nullable; +import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -51,7 +55,49 @@ public class SqlCreateMaterializedTable extends SqlCreateObject implements ExtendedSqlNode { public static final SqlSpecialOperator CREATE_OPERATOR = - new SqlSpecialOperator("CREATE MATERIALIZED TABLE", SqlKind.CREATE_TABLE); + new SqlSpecialOperator("CREATE MATERIALIZED TABLE", SqlKind.CREATE_TABLE) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return buildCreateCall(CREATE_OPERATOR, pos, operands); + } + }; + + static SqlCreateMaterializedTable buildCreateCall( + SqlSpecialOperator operator, SqlParserPos pos, SqlNode[] operands) { + List constraints = new ArrayList<>(); + for (SqlNode c : (SqlNodeList) operands[2]) { + constraints.add((SqlTableConstraint) c); + } + SqlRefreshMode refreshMode = + operands[10] == null + ? null + : ((SqlLiteral) operands[10]).getValueAs(SqlRefreshMode.class); + SqlStartMode startMode = + operands[11] == null + ? null + : new SqlStartMode( + ((SqlLiteral) operands[11]) + .getValueAs(SqlStartMode.SqlStartModeKind.class), + (SqlIntervalLiteral) operands[12], + (SqlTimestampLiteral) operands[13]); + return new SqlCreateMaterializedTable( + operator, + pos, + (SqlIdentifier) operands[0], + (SqlNodeList) operands[1], + constraints, + (SqlWatermark) operands[3], + (SqlCharStringLiteral) operands[4], + (SqlDistribution) operands[9], + (SqlNodeList) operands[5], + (SqlNodeList) operands[6], + (SqlIntervalLiteral) operands[7], + refreshMode, + startMode, + operands[8], + SqlParserPos.ZERO); + } private final SqlNodeList columnList; @@ -115,7 +161,16 @@ public List getOperandList() { partitionKeyList, properties, freshness, - asQuery); + asQuery, + distribution, + refreshMode == null + ? null + : SqlLiteral.createSymbol(refreshMode, SqlParserPos.ZERO), + startMode == null + ? null + : SqlLiteral.createSymbol(startMode.getKind(), SqlParserPos.ZERO), + startMode == null ? null : startMode.getIntervalLiteral(), + startMode == null ? null : startMode.getTimestampLiteral()); } public SqlNodeList getColumnList() { diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlCreateOrAlterMaterializedTable.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlCreateOrAlterMaterializedTable.java index 6d13aa108ea41..64839a8982a5a 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlCreateOrAlterMaterializedTable.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlCreateOrAlterMaterializedTable.java @@ -23,25 +23,67 @@ import org.apache.flink.sql.parser.ddl.SqlWatermark; import org.apache.flink.sql.parser.ddl.constraint.SqlTableConstraint; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlCharStringLiteral; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlIntervalLiteral; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNodeList; import org.apache.calcite.sql.SqlSpecialOperator; +import org.apache.calcite.sql.SqlTimestampLiteral; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; import javax.annotation.Nullable; +import java.util.ArrayList; import java.util.List; /** CREATE [OR ALTER] MATERIALIZED TABLE DDL sql call. */ public class SqlCreateOrAlterMaterializedTable extends SqlCreateMaterializedTable { public static final SqlSpecialOperator CREATE_OR_ALTER_OPERATOR = - new SqlSpecialOperator("CREATE OR ALTER MATERIALIZED TABLE", SqlKind.OTHER_DDL); + new SqlSpecialOperator("CREATE OR ALTER MATERIALIZED TABLE", SqlKind.OTHER_DDL) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + List constraints = new ArrayList<>(); + for (SqlNode c : (SqlNodeList) operands[2]) { + constraints.add((SqlTableConstraint) c); + } + SqlRefreshMode refreshMode = + operands[10] == null + ? null + : ((SqlLiteral) operands[10]).getValueAs(SqlRefreshMode.class); + SqlStartMode startMode = + operands[11] == null + ? null + : new SqlStartMode( + ((SqlLiteral) operands[11]) + .getValueAs( + SqlStartMode.SqlStartModeKind.class), + (SqlIntervalLiteral) operands[12], + (SqlTimestampLiteral) operands[13]); + return new SqlCreateOrAlterMaterializedTable( + pos, + (SqlIdentifier) operands[0], + (SqlNodeList) operands[1], + constraints, + (SqlWatermark) operands[3], + (SqlCharStringLiteral) operands[4], + (SqlDistribution) operands[9], + (SqlNodeList) operands[5], + (SqlNodeList) operands[6], + (SqlIntervalLiteral) operands[7], + refreshMode, + startMode, + operands[8], + true, + SqlParserPos.ZERO); + } + }; public SqlCreateOrAlterMaterializedTable( SqlParserPos pos, diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlDropMaterializedTable.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlDropMaterializedTable.java index 91b4d7bddbee5..a7b3f613d2f47 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlDropMaterializedTable.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlDropMaterializedTable.java @@ -20,8 +20,10 @@ import org.apache.flink.sql.parser.ddl.SqlDropObject; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; @@ -34,7 +36,16 @@ public class SqlDropMaterializedTable extends SqlDropObject { private static final SqlOperator OPERATOR = - new SqlSpecialOperator("DROP MATERIALIZED TABLE", SqlKind.DROP_TABLE); + new SqlSpecialOperator("DROP MATERIALIZED TABLE", SqlKind.DROP_TABLE) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlDropMaterializedTable( + pos, + (SqlIdentifier) operands[0], + ((SqlLiteral) operands[1]).booleanValue()); + } + }; public SqlDropMaterializedTable( SqlParserPos pos, SqlIdentifier tableIdentifier, boolean ifExists) { @@ -43,7 +54,7 @@ public SqlDropMaterializedTable( @Override public List getOperandList() { - return List.of(name); + return List.of(name, SqlLiteral.createBoolean(ifExists, SqlParserPos.ZERO)); } @Override diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlStartMode.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlStartMode.java index a8507b940b97d..a3131863fd855 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlStartMode.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/materializedtable/SqlStartMode.java @@ -82,6 +82,16 @@ public boolean isCreateOrAlterOption() { } } + /** Reconstruction constructor used by deep-copy ({@code createCall}). */ + public SqlStartMode( + SqlStartModeKind kind, + @Nullable SqlIntervalLiteral intervalLiteral, + @Nullable SqlTimestampLiteral timestampLiteral) { + this.kind = kind; + this.intervalLiteral = intervalLiteral; + this.timestampLiteral = timestampLiteral; + } + public SqlStartMode(SqlLiteral kind, @Nullable SqlLiteral literal, SqlParserPos pos) { this.kind = SqlParseUtils.extractEnum(kind, SqlStartModeKind.class); if (literal == null) { diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/model/SqlAlterModelRename.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/model/SqlAlterModelRename.java index e5bbbd75ef27b..64776d74491ec 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/model/SqlAlterModelRename.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/model/SqlAlterModelRename.java @@ -18,8 +18,13 @@ package org.apache.flink.sql.parser.ddl.model; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; +import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; +import org.apache.calcite.sql.SqlOperator; +import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; @@ -30,6 +35,19 @@ /** ALTER MODEL [IF EXISTS] [[catalogName.] dataBasesName.]modelName RENAME TO newModelName. */ public class SqlAlterModelRename extends SqlAlterModel { + private static final SqlSpecialOperator RENAME_OPERATOR = + new SqlSpecialOperator("ALTER MODEL RENAME", SqlKind.OTHER_DDL) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlAlterModelRename( + pos, + (SqlIdentifier) operands[0], + (SqlIdentifier) operands[1], + ((SqlLiteral) operands[2]).booleanValue()); + } + }; + private final SqlIdentifier newModelName; public SqlAlterModelRename( @@ -49,9 +67,15 @@ public String[] fullNewModelName() { return newModelName.names.toArray(new String[0]); } + @Override + public SqlOperator getOperator() { + return RENAME_OPERATOR; + } + @Override public List getOperandList() { - return List.of(name, newModelName); + return List.of( + name, newModelName, SqlLiteral.createBoolean(ifModelExists, SqlParserPos.ZERO)); } @Override diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/model/SqlAlterModelReset.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/model/SqlAlterModelReset.java index 1a293bb4b6bc6..4dd76a84470cd 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/model/SqlAlterModelReset.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/model/SqlAlterModelReset.java @@ -21,9 +21,14 @@ import org.apache.flink.sql.parser.SqlParseUtils; import org.apache.flink.sql.parser.SqlUnparseUtils; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; +import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNodeList; +import org.apache.calcite.sql.SqlOperator; +import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; @@ -36,6 +41,19 @@ * ALTER MODEL [IF EXISTS] [[catalogName.] dataBasesName.]modelName RESET ( 'key1' [, 'key2']...). */ public class SqlAlterModelReset extends SqlAlterModel { + private static final SqlSpecialOperator RESET_OPERATOR = + new SqlSpecialOperator("ALTER MODEL RESET", SqlKind.OTHER_DDL) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlAlterModelReset( + pos, + (SqlIdentifier) operands[0], + ((SqlLiteral) operands[2]).booleanValue(), + (SqlNodeList) operands[1]); + } + }; + private final SqlNodeList optionKeyList; public SqlAlterModelReset( @@ -47,9 +65,15 @@ public SqlAlterModelReset( this.optionKeyList = requireNonNull(optionKeyList, "optionKeyList should not be null"); } + @Override + public SqlOperator getOperator() { + return RESET_OPERATOR; + } + @Override public List getOperandList() { - return List.of(name, optionKeyList); + return List.of( + name, optionKeyList, SqlLiteral.createBoolean(ifModelExists, SqlParserPos.ZERO)); } public Set getResetKeys() { diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/model/SqlAlterModelSet.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/model/SqlAlterModelSet.java index f11e683935dda..37fc2e98daf9f 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/model/SqlAlterModelSet.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/model/SqlAlterModelSet.java @@ -21,9 +21,14 @@ import org.apache.flink.sql.parser.SqlParseUtils; import org.apache.flink.sql.parser.SqlUnparseUtils; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; +import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNodeList; +import org.apache.calcite.sql.SqlOperator; +import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; @@ -38,6 +43,19 @@ */ public class SqlAlterModelSet extends SqlAlterModel { + private static final SqlSpecialOperator SET_OPERATOR = + new SqlSpecialOperator("ALTER MODEL SET", SqlKind.OTHER_DDL) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlAlterModelSet( + pos, + (SqlIdentifier) operands[0], + ((SqlLiteral) operands[2]).booleanValue(), + (SqlNodeList) operands[1]); + } + }; + private final SqlNodeList modelOptionList; public SqlAlterModelSet( @@ -54,9 +72,15 @@ public Map getProperties() { return SqlParseUtils.extractMap(modelOptionList); } + @Override + public SqlOperator getOperator() { + return SET_OPERATOR; + } + @Override public List getOperandList() { - return List.of(name, modelOptionList); + return List.of( + name, modelOptionList, SqlLiteral.createBoolean(ifModelExists, SqlParserPos.ZERO)); } @Override diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/model/SqlCreateModel.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/model/SqlCreateModel.java index a7bedb56ab0c6..de898fbedfdec 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/model/SqlCreateModel.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/model/SqlCreateModel.java @@ -23,9 +23,11 @@ import org.apache.flink.sql.parser.ddl.SqlCreateObject; import org.apache.flink.sql.parser.error.SqlValidateException; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlCharStringLiteral; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNodeList; import org.apache.calcite.sql.SqlSpecialOperator; @@ -46,7 +48,21 @@ public class SqlCreateModel extends SqlCreateObject implements ExtendedSqlNode { private static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("CREATE MODEL", SqlKind.OTHER_DDL); + new SqlSpecialOperator("CREATE MODEL", SqlKind.OTHER_DDL) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlCreateModel( + pos, + (SqlIdentifier) operands[0], + (SqlCharStringLiteral) operands[1], + (SqlNodeList) operands[2], + (SqlNodeList) operands[3], + (SqlNodeList) operands[4], + ((SqlLiteral) operands[5]).booleanValue(), + ((SqlLiteral) operands[6]).booleanValue()); + } + }; private final SqlNodeList inputColumnList; private final SqlNodeList outputColumnList; @@ -69,7 +85,13 @@ public SqlCreateModel( @Override public @Nonnull List getOperandList() { return ImmutableNullableList.of( - name, comment, inputColumnList, outputColumnList, properties); + name, + comment, + inputColumnList, + outputColumnList, + properties, + SqlLiteral.createBoolean(isTemporary(), SqlParserPos.ZERO), + SqlLiteral.createBoolean(isIfNotExists(), SqlParserPos.ZERO)); } public SqlNodeList getInputColumnList() { diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/model/SqlCreateModelAs.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/model/SqlCreateModelAs.java index fa3cc4bf24e78..2b17f4693868d 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/model/SqlCreateModelAs.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/model/SqlCreateModelAs.java @@ -21,11 +21,14 @@ import org.apache.flink.sql.parser.SqlUnparseUtils; import org.apache.flink.sql.parser.error.SqlValidateException; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlCharStringLiteral; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNodeList; +import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; @@ -51,7 +54,22 @@ public class SqlCreateModelAs extends SqlCreateModel { private static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("CREATE MODEL AS", SqlKind.OTHER_DDL); + new SqlSpecialOperator("CREATE MODEL AS", SqlKind.OTHER_DDL) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlCreateModelAs( + pos, + (SqlIdentifier) operands[0], + (SqlCharStringLiteral) operands[1], + (SqlNodeList) operands[2], + (SqlNodeList) operands[3], + (SqlNodeList) operands[4], + operands[7], + ((SqlLiteral) operands[5]).booleanValue(), + ((SqlLiteral) operands[6]).booleanValue()); + } + }; private final SqlNode asQuery; @@ -105,6 +123,11 @@ public SqlNode getAsQuery() { return asQuery; } + @Override + public SqlOperator getOperator() { + return OPERATOR; + } + @Override public void unparse(SqlWriter writer, int leftPrec, int rightPrec) { super.unparse(writer, leftPrec, rightPrec); diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/model/SqlDropModel.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/model/SqlDropModel.java index 69e65da9223bb..501413fa79919 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/model/SqlDropModel.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/model/SqlDropModel.java @@ -20,21 +20,35 @@ import org.apache.flink.sql.parser.ddl.SqlDropObject; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; +import java.util.List; + /** * {@link SqlNode} to describe the DROP MODEL [IF EXISTS] [[catalogName.] dataBasesName].modelName * syntax. */ public class SqlDropModel extends SqlDropObject { private static final SqlOperator OPERATOR = - new SqlSpecialOperator("DROP MODEL", SqlKind.OTHER_DDL); + new SqlSpecialOperator("DROP MODEL", SqlKind.OTHER_DDL) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlDropModel( + pos, + (SqlIdentifier) operands[0], + ((SqlLiteral) operands[1]).booleanValue(), + ((SqlLiteral) operands[2]).booleanValue()); + } + }; private final boolean isTemporary; @@ -48,6 +62,14 @@ public boolean isTemporary() { return isTemporary; } + @Override + public List getOperandList() { + return List.of( + name, + SqlLiteral.createBoolean(ifExists, SqlParserPos.ZERO), + SqlLiteral.createBoolean(isTemporary, SqlParserPos.ZERO)); + } + @Override public void unparse(SqlWriter writer, int leftPrec, int rightPrec) { writer.keyword("DROP"); diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/position/SqlTableColumnPosition.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/position/SqlTableColumnPosition.java index 119ea3e69886a..e5f31f7d79bb8 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/position/SqlTableColumnPosition.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/position/SqlTableColumnPosition.java @@ -40,7 +40,17 @@ public class SqlTableColumnPosition extends SqlCall { private static final SqlOperator OPERATOR = - new SqlSpecialOperator("SqlTableColumnPosition", SqlKind.OTHER); + new SqlSpecialOperator("SqlTableColumnPosition", SqlKind.OTHER) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlTableColumnPosition( + pos, + (SqlTableColumn) operands[0], + (SqlLiteral) operands[1], + (SqlIdentifier) operands[2]); + } + }; private final SqlTableColumn column; @Nullable private final SqlLiteral positionSpec; diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/resource/SqlResource.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/resource/SqlResource.java index 77cf4f52af893..f40ae277722a6 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/resource/SqlResource.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/resource/SqlResource.java @@ -37,7 +37,14 @@ public class SqlResource extends SqlCall { private static final SqlOperator OPERATOR = - new SqlSpecialOperator("SqlResource", SqlKind.OTHER); + new SqlSpecialOperator("SqlResource", SqlKind.OTHER) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlResource( + pos, (SqlLiteral) operands[0], (SqlCharStringLiteral) operands[1]); + } + }; private final SqlLiteral resourceType; private final SqlCharStringLiteral resourcePath; diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlAlterTableAdd.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlAlterTableAdd.java index 7c4aaad93c8bf..b3b0aea485bc7 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlAlterTableAdd.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlAlterTableAdd.java @@ -21,12 +21,19 @@ import org.apache.flink.sql.parser.ddl.SqlWatermark; import org.apache.flink.sql.parser.ddl.constraint.SqlTableConstraint; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; +import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; +import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNodeList; +import org.apache.calcite.sql.SqlOperator; +import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.parser.SqlParserPos; import javax.annotation.Nullable; +import java.util.ArrayList; import java.util.List; /** @@ -50,6 +57,25 @@ */ public class SqlAlterTableAdd extends SqlAlterTableSchema { + private static final SqlSpecialOperator ADD_OPERATOR = + new SqlSpecialOperator("ALTER TABLE ADD", SqlKind.ALTER_TABLE) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + List constraints = new ArrayList<>(); + for (SqlNode c : (SqlNodeList) operands[2]) { + constraints.add((SqlTableConstraint) c); + } + return new SqlAlterTableAdd( + pos, + (SqlIdentifier) operands[0], + (SqlNodeList) operands[1], + constraints, + (SqlWatermark) operands[3], + ((SqlLiteral) operands[4]).booleanValue()); + } + }; + public SqlAlterTableAdd( SqlParserPos pos, SqlIdentifier tableName, @@ -60,6 +86,11 @@ public SqlAlterTableAdd( super(pos, tableName, addedColumns, constraint, sqlWatermark, ifTableExists); } + @Override + public SqlOperator getOperator() { + return ADD_OPERATOR; + } + @Override protected String getAlterOperation() { return "ADD"; diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlAlterTableDistribution.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlAlterTableDistribution.java index 633a1ad78e902..184e1cc8c039f 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlAlterTableDistribution.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlAlterTableDistribution.java @@ -20,8 +20,13 @@ import org.apache.flink.sql.parser.ddl.SqlDistribution; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; +import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; +import org.apache.calcite.sql.SqlOperator; +import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; @@ -68,11 +73,26 @@ public void unparseAlterOperation(SqlWriter writer, int leftPrec, int rightPrec) public static class SqlAlterTableAddDistribution extends SqlAlterTableDistribution { + private static final SqlSpecialOperator ADD_DISTRIBUTION_OPERATOR = + new SqlSpecialOperator("ALTER TABLE ADD DISTRIBUTION", SqlKind.ALTER_TABLE) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlAlterTableAddDistribution( + pos, (SqlIdentifier) operands[0], (SqlDistribution) operands[1]); + } + }; + public SqlAlterTableAddDistribution( SqlParserPos pos, SqlIdentifier tableName, SqlDistribution distribution) { super(pos, tableName, distribution); } + @Override + public SqlOperator getOperator() { + return ADD_DISTRIBUTION_OPERATOR; + } + @Override protected String getAlterOperation() { return "ADD"; @@ -81,11 +101,26 @@ protected String getAlterOperation() { public static class SqlAlterTableModifyDistribution extends SqlAlterTableDistribution { + private static final SqlSpecialOperator MODIFY_DISTRIBUTION_OPERATOR = + new SqlSpecialOperator("ALTER TABLE MODIFY DISTRIBUTION", SqlKind.ALTER_TABLE) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlAlterTableModifyDistribution( + pos, (SqlIdentifier) operands[0], (SqlDistribution) operands[1]); + } + }; + public SqlAlterTableModifyDistribution( SqlParserPos pos, SqlIdentifier tableName, SqlDistribution distribution) { super(pos, tableName, distribution); } + @Override + public SqlOperator getOperator() { + return MODIFY_DISTRIBUTION_OPERATOR; + } + @Override protected String getAlterOperation() { return "MODIFY"; diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlAlterTableDrop.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlAlterTableDrop.java index c2681f4cd64f3..cf8b881819663 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlAlterTableDrop.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlAlterTableDrop.java @@ -22,9 +22,14 @@ import org.apache.flink.sql.parser.ddl.SqlWatermark; import org.apache.flink.sql.parser.ddl.constraint.SqlTableConstraint; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; +import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNodeList; +import org.apache.calcite.sql.SqlOperator; +import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; @@ -91,11 +96,34 @@ public void unparseAlterOperation(SqlWriter writer, int leftPrec, int rightPrec) /** ALTER TABLE [IF EXISTS ][catalog_name.][db_name.]table_name DROP PRIMARY KEY. */ public static class SqlAlterTableDropPrimaryKey extends SqlAlterTableDrop { + private static final SqlSpecialOperator DROP_PRIMARY_KEY_OPERATOR = + new SqlSpecialOperator("ALTER TABLE DROP PRIMARY KEY", SqlKind.ALTER_TABLE) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlAlterTableDropPrimaryKey( + pos, + (SqlIdentifier) operands[0], + ((SqlLiteral) operands[1]).booleanValue()); + } + }; + public SqlAlterTableDropPrimaryKey( SqlParserPos pos, SqlIdentifier tableName, boolean ifTableExists) { super(pos, tableName, ifTableExists); } + @Override + public SqlOperator getOperator() { + return DROP_PRIMARY_KEY_OPERATOR; + } + + @Override + public List getOperandList() { + return List.of( + tableIdentifier, SqlLiteral.createBoolean(ifTableExists, SqlParserPos.ZERO)); + } + @Override protected void unparseDropOperation(SqlWriter writer, int leftPrec, int rightPrec) { writer.keyword("PRIMARY KEY"); @@ -108,6 +136,19 @@ protected void unparseDropOperation(SqlWriter writer, int leftPrec, int rightPre public static class SqlAlterTableDropConstraint extends SqlAlterTableDrop { private final SqlIdentifier constraintName; + private static final SqlSpecialOperator DROP_CONSTRAINT_OPERATOR = + new SqlSpecialOperator("ALTER TABLE DROP CONSTRAINT", SqlKind.ALTER_TABLE) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlAlterTableDropConstraint( + pos, + (SqlIdentifier) operands[0], + (SqlIdentifier) operands[1], + ((SqlLiteral) operands[2]).booleanValue()); + } + }; + public SqlAlterTableDropConstraint( SqlParserPos pos, SqlIdentifier tableName, @@ -117,6 +158,19 @@ public SqlAlterTableDropConstraint( this.constraintName = constraintName; } + @Override + public SqlOperator getOperator() { + return DROP_CONSTRAINT_OPERATOR; + } + + @Override + public List getOperandList() { + return List.of( + tableIdentifier, + constraintName, + SqlLiteral.createBoolean(ifTableExists, SqlParserPos.ZERO)); + } + public SqlIdentifier getConstraintName() { return constraintName; } @@ -131,11 +185,34 @@ protected void unparseDropOperation(SqlWriter writer, int leftPrec, int rightPre /** ALTER TABLE [IF EXISTS ][catalog_name.][db_name.]table_name DROP WATERMARK. */ public static class SqlAlterTableDropWatermark extends SqlAlterTableDrop { + private static final SqlSpecialOperator DROP_WATERMARK_OPERATOR = + new SqlSpecialOperator("ALTER TABLE DROP WATERMARK", SqlKind.ALTER_TABLE) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlAlterTableDropWatermark( + pos, + (SqlIdentifier) operands[0], + ((SqlLiteral) operands[1]).booleanValue()); + } + }; + public SqlAlterTableDropWatermark( SqlParserPos pos, SqlIdentifier tableName, boolean ifTableExists) { super(pos, tableName, ifTableExists); } + @Override + public SqlOperator getOperator() { + return DROP_WATERMARK_OPERATOR; + } + + @Override + public List getOperandList() { + return List.of( + tableIdentifier, SqlLiteral.createBoolean(ifTableExists, SqlParserPos.ZERO)); + } + @Override protected void unparseDropOperation(SqlWriter writer, int leftPrec, int rightPrec) { writer.keyword("WATERMARK"); @@ -157,6 +234,19 @@ protected void unparseDropOperation(SqlWriter writer, int leftPrec, int rightPre */ public static class SqlAlterTableDropColumn extends SqlAlterTableDrop { + private static final SqlSpecialOperator DROP_COLUMN_OPERATOR = + new SqlSpecialOperator("ALTER TABLE DROP COLUMN", SqlKind.ALTER_TABLE) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlAlterTableDropColumn( + pos, + (SqlIdentifier) operands[0], + (SqlNodeList) operands[1], + ((SqlLiteral) operands[2]).booleanValue()); + } + }; + private final SqlNodeList columnList; public SqlAlterTableDropColumn( @@ -168,9 +258,17 @@ public SqlAlterTableDropColumn( this.columnList = columnList; } + @Override + public SqlOperator getOperator() { + return DROP_COLUMN_OPERATOR; + } + @Override public List getOperandList() { - return List.of(tableIdentifier, columnList); + return List.of( + tableIdentifier, + columnList, + SqlLiteral.createBoolean(ifTableExists, SqlParserPos.ZERO)); } public SqlNodeList getColumnList() { diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlAlterTableDropDistribution.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlAlterTableDropDistribution.java index 636012d23f7ad..059ae6f942cb8 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlAlterTableDropDistribution.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlAlterTableDropDistribution.java @@ -18,12 +18,16 @@ package org.apache.flink.sql.parser.ddl.table; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; +import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; +import org.apache.calcite.sql.SqlOperator; +import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; -import java.util.Collections; import java.util.List; /** @@ -38,14 +42,31 @@ */ public class SqlAlterTableDropDistribution extends SqlAlterTable { + private static final SqlSpecialOperator DROP_DISTRIBUTION_OPERATOR = + new SqlSpecialOperator("ALTER TABLE DROP DISTRIBUTION", SqlKind.ALTER_TABLE) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlAlterTableDropDistribution( + pos, + (SqlIdentifier) operands[0], + ((SqlLiteral) operands[1]).booleanValue()); + } + }; + public SqlAlterTableDropDistribution( SqlParserPos pos, SqlIdentifier tableName, boolean ifTableExists) { super(pos, tableName, ifTableExists); } + @Override + public SqlOperator getOperator() { + return DROP_DISTRIBUTION_OPERATOR; + } + @Override public List getOperandList() { - return Collections.emptyList(); + return List.of(tableIdentifier, SqlLiteral.createBoolean(ifTableExists, SqlParserPos.ZERO)); } @Override diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlAlterTableModify.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlAlterTableModify.java index fe8d41f0895c3..af3564a8b8a9e 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlAlterTableModify.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlAlterTableModify.java @@ -21,12 +21,19 @@ import org.apache.flink.sql.parser.ddl.SqlWatermark; import org.apache.flink.sql.parser.ddl.constraint.SqlTableConstraint; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; +import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; +import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNodeList; +import org.apache.calcite.sql.SqlOperator; +import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.parser.SqlParserPos; import javax.annotation.Nullable; +import java.util.ArrayList; import java.util.List; /** @@ -50,6 +57,25 @@ */ public class SqlAlterTableModify extends SqlAlterTableSchema { + private static final SqlSpecialOperator MODIFY_OPERATOR = + new SqlSpecialOperator("ALTER TABLE MODIFY", SqlKind.ALTER_TABLE) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + List constraints = new ArrayList<>(); + for (SqlNode c : (SqlNodeList) operands[2]) { + constraints.add((SqlTableConstraint) c); + } + return new SqlAlterTableModify( + pos, + (SqlIdentifier) operands[0], + (SqlNodeList) operands[1], + constraints, + (SqlWatermark) operands[3], + ((SqlLiteral) operands[4]).booleanValue()); + } + }; + public SqlAlterTableModify( SqlParserPos pos, SqlIdentifier tableName, @@ -60,6 +86,11 @@ public SqlAlterTableModify( super(pos, tableName, modifiedColumns, constraints, watermark, ifTableExists); } + @Override + public SqlOperator getOperator() { + return MODIFY_OPERATOR; + } + @Override protected String getAlterOperation() { return "MODIFY"; diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlAlterTableOptions.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlAlterTableOptions.java index 3ad27e19c2e24..2d64cfdebe74a 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlAlterTableOptions.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlAlterTableOptions.java @@ -21,9 +21,14 @@ import org.apache.flink.sql.parser.SqlParseUtils; import org.apache.flink.sql.parser.SqlUnparseUtils; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; +import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNodeList; +import org.apache.calcite.sql.SqlOperator; +import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; import org.apache.calcite.util.ImmutableNullableList; @@ -39,6 +44,20 @@ */ public class SqlAlterTableOptions extends SqlAlterTable { + private static final SqlSpecialOperator OPTIONS_OPERATOR = + new SqlSpecialOperator("ALTER TABLE OPTIONS", SqlKind.ALTER_TABLE) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlAlterTableOptions( + pos, + (SqlIdentifier) operands[0], + (SqlNodeList) operands[2], + (SqlNodeList) operands[1], + ((SqlLiteral) operands[3]).booleanValue()); + } + }; + private final SqlNodeList propertyList; public SqlAlterTableOptions( @@ -67,9 +86,18 @@ public SqlAlterTableOptions( this.propertyList = requireNonNull(propertyList, "propertyList should not be null"); } + @Override + public SqlOperator getOperator() { + return OPTIONS_OPERATOR; + } + @Override public List getOperandList() { - return ImmutableNullableList.of(tableIdentifier, propertyList); + return ImmutableNullableList.of( + tableIdentifier, + propertyList, + partitionSpec, + SqlLiteral.createBoolean(ifTableExists, SqlParserPos.ZERO)); } public Map getProperties() { diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlAlterTableRename.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlAlterTableRename.java index 8f4afdb1aa6ee..4f512fe532fc8 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlAlterTableRename.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlAlterTableRename.java @@ -18,8 +18,13 @@ package org.apache.flink.sql.parser.ddl.table; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; +import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; +import org.apache.calcite.sql.SqlOperator; +import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; import org.apache.calcite.util.ImmutableNullableList; @@ -34,6 +39,19 @@ */ public class SqlAlterTableRename extends SqlAlterTable { + private static final SqlSpecialOperator RENAME_OPERATOR = + new SqlSpecialOperator("ALTER TABLE RENAME", SqlKind.ALTER_TABLE) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlAlterTableRename( + pos, + (SqlIdentifier) operands[0], + (SqlIdentifier) operands[1], + ((SqlLiteral) operands[2]).booleanValue()); + } + }; + private final SqlIdentifier newTableIdentifier; public SqlAlterTableRename( @@ -50,9 +68,17 @@ public SqlAlterTableRename( this(pos, tableName, newTableName, false); } + @Override + public SqlOperator getOperator() { + return RENAME_OPERATOR; + } + @Override public List getOperandList() { - return ImmutableNullableList.of(tableIdentifier, newTableIdentifier); + return ImmutableNullableList.of( + tableIdentifier, + newTableIdentifier, + SqlLiteral.createBoolean(ifTableExists, SqlParserPos.ZERO)); } @Override diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlAlterTableRenameColumn.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlAlterTableRenameColumn.java index e1cc27200e480..ec9601de3da0f 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlAlterTableRenameColumn.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlAlterTableRenameColumn.java @@ -18,8 +18,13 @@ package org.apache.flink.sql.parser.ddl.table; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; +import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; +import org.apache.calcite.sql.SqlOperator; +import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; import org.apache.calcite.util.ImmutableNullableList; @@ -32,6 +37,20 @@ */ public class SqlAlterTableRenameColumn extends SqlAlterTable { + private static final SqlSpecialOperator RENAME_COLUMN_OPERATOR = + new SqlSpecialOperator("ALTER TABLE RENAME COLUMN", SqlKind.ALTER_TABLE) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlAlterTableRenameColumn( + pos, + (SqlIdentifier) operands[0], + (SqlIdentifier) operands[1], + (SqlIdentifier) operands[2], + ((SqlLiteral) operands[3]).booleanValue()); + } + }; + private final SqlIdentifier originColumnIdentifier; private final SqlIdentifier newColumnIdentifier; @@ -46,10 +65,18 @@ public SqlAlterTableRenameColumn( this.newColumnIdentifier = newColumnIdentifier; } + @Override + public SqlOperator getOperator() { + return RENAME_COLUMN_OPERATOR; + } + @Override public List getOperandList() { return ImmutableNullableList.of( - tableIdentifier, originColumnIdentifier, newColumnIdentifier); + tableIdentifier, + originColumnIdentifier, + newColumnIdentifier, + SqlLiteral.createBoolean(ifTableExists, SqlParserPos.ZERO)); } public SqlIdentifier getOldColumnIdentifier() { diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlAlterTableReset.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlAlterTableReset.java index d2eca82bd4149..3181d2888657c 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlAlterTableReset.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlAlterTableReset.java @@ -21,9 +21,14 @@ import org.apache.flink.sql.parser.SqlParseUtils; import org.apache.flink.sql.parser.SqlUnparseUtils; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; +import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNodeList; +import org.apache.calcite.sql.SqlOperator; +import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; import org.apache.calcite.util.ImmutableNullableList; @@ -35,6 +40,19 @@ /** ALTER TABLE [IF EXISTS] [[catalogName.] dataBasesName].tableName RESET ( 'key1' [, 'key2']*). */ public class SqlAlterTableReset extends SqlAlterTable { + private static final SqlSpecialOperator RESET_OPERATOR = + new SqlSpecialOperator("ALTER TABLE RESET", SqlKind.ALTER_TABLE) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlAlterTableReset( + pos, + (SqlIdentifier) operands[0], + (SqlNodeList) operands[1], + ((SqlLiteral) operands[2]).booleanValue()); + } + }; + private final SqlNodeList propertyKeyList; public SqlAlterTableReset( @@ -47,9 +65,17 @@ public SqlAlterTableReset( requireNonNull(propertyKeyList, "propertyKeyList should not be null"); } + @Override + public SqlOperator getOperator() { + return RESET_OPERATOR; + } + @Override public List getOperandList() { - return ImmutableNullableList.of(tableIdentifier, propertyKeyList); + return ImmutableNullableList.of( + tableIdentifier, + propertyKeyList, + SqlLiteral.createBoolean(ifTableExists, SqlParserPos.ZERO)); } public SqlNodeList getPropertyKeyList() { diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlAlterTableSchema.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlAlterTableSchema.java index ef4d6978be30b..b8b1a069a492c 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlAlterTableSchema.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlAlterTableSchema.java @@ -27,6 +27,7 @@ import org.apache.flink.sql.parser.error.SqlValidateException; import org.apache.calcite.sql.SqlIdentifier; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNodeList; import org.apache.calcite.sql.SqlWriter; @@ -67,7 +68,8 @@ public List getOperandList() { getTableName(), columnList, new SqlNodeList(constraints, SqlParserPos.ZERO), - watermark); + watermark, + SqlLiteral.createBoolean(ifTableExists, SqlParserPos.ZERO)); } @Override diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlAnalyzeTable.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlAnalyzeTable.java index 280f594be9e17..e8c2cff0933e8 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlAnalyzeTable.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlAnalyzeTable.java @@ -24,6 +24,7 @@ import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNodeList; import org.apache.calcite.sql.SqlOperator; @@ -42,7 +43,18 @@ /** ANALYZE TABLE to compute the statistics for a given table. */ public class SqlAnalyzeTable extends SqlCall { public static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("ANALYZE TABLE", SqlKind.OTHER_DDL); + new SqlSpecialOperator("ANALYZE TABLE", SqlKind.OTHER_DDL) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlAnalyzeTable( + pos, + (SqlIdentifier) operands[0], + (SqlNodeList) operands[1], + (SqlNodeList) operands[2], + ((SqlLiteral) operands[3]).booleanValue()); + } + }; private final SqlIdentifier tableName; private final SqlNodeList partitions; @@ -97,7 +109,11 @@ public SqlOperator getOperator() { @Nonnull @Override public List getOperandList() { - return ImmutableNullableList.of(tableName, partitions, columns); + return ImmutableNullableList.of( + tableName, + partitions, + columns, + SqlLiteral.createBoolean(allColumns, SqlParserPos.ZERO)); } public void unparse(SqlWriter writer, int leftPrec, int rightPrec) { diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlCreateTable.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlCreateTable.java index 1da49e5132403..8ebebfd578cb2 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlCreateTable.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlCreateTable.java @@ -30,9 +30,11 @@ import org.apache.flink.sql.parser.ddl.constraint.SqlTableConstraint; import org.apache.flink.sql.parser.error.SqlValidateException; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlCharStringLiteral; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNodeList; import org.apache.calcite.sql.SqlSpecialOperator; @@ -45,6 +47,7 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; +import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -54,7 +57,29 @@ public class SqlCreateTable extends SqlCreateObject implements ExtendedSqlNode { private static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("CREATE TABLE", SqlKind.CREATE_TABLE); + new SqlSpecialOperator("CREATE TABLE", SqlKind.CREATE_TABLE) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + List constraints = new ArrayList<>(); + for (SqlNode c : (SqlNodeList) operands[2]) { + constraints.add((SqlTableConstraint) c); + } + return new SqlCreateTable( + pos, + (SqlIdentifier) operands[0], + (SqlNodeList) operands[1], + constraints, + (SqlNodeList) operands[3], + (SqlDistribution) operands[8], + (SqlNodeList) operands[4], + (SqlWatermark) operands[5], + (SqlCharStringLiteral) operands[6], + (SqlIdentifier) operands[7], + ((SqlLiteral) operands[9]).booleanValue(), + ((SqlLiteral) operands[10]).booleanValue()); + } + }; private final SqlNodeList columnList; @@ -135,7 +160,10 @@ protected SqlCreateTable( partitionKeyList, watermark, comment, - connection); + connection, + distribution, + SqlLiteral.createBoolean(isTemporary(), SqlParserPos.ZERO), + SqlLiteral.createBoolean(isIfNotExists(), SqlParserPos.ZERO)); } public SqlNodeList getColumnList() { diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlCreateTableAs.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlCreateTableAs.java index 631d37ea71729..145e0103821bf 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlCreateTableAs.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlCreateTableAs.java @@ -24,11 +24,14 @@ import org.apache.flink.sql.parser.ddl.constraint.SqlTableConstraint; import org.apache.flink.sql.parser.error.SqlValidateException; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlCharStringLiteral; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNodeList; +import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; @@ -37,6 +40,7 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; +import java.util.ArrayList; import java.util.List; import static java.util.Objects.requireNonNull; @@ -71,7 +75,29 @@ public class SqlCreateTableAs extends SqlCreateTable { private static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("CREATE TABLE AS", SqlKind.CREATE_TABLE); + new SqlSpecialOperator("CREATE TABLE AS", SqlKind.CREATE_TABLE) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + List constraints = new ArrayList<>(); + for (SqlNode c : (SqlNodeList) operands[2]) { + constraints.add((SqlTableConstraint) c); + } + return new SqlCreateTableAs( + pos, + (SqlIdentifier) operands[0], + (SqlNodeList) operands[1], + constraints, + (SqlNodeList) operands[3], + (SqlDistribution) operands[8], + (SqlNodeList) operands[4], + (SqlWatermark) operands[5], + (SqlCharStringLiteral) operands[6], + operands[11], + ((SqlLiteral) operands[9]).booleanValue(), + ((SqlLiteral) operands[10]).booleanValue()); + } + }; private final SqlNode asQuery; @@ -132,6 +158,11 @@ public SqlNode getAsQuery() { return asQuery; } + @Override + public SqlOperator getOperator() { + return OPERATOR; + } + public boolean isSchemaWithColumnsIdentifiersOnly() { // CREATE AS SELECT supports passing only column identifiers in the column list. If // the first column in the list is an identifier, then we assume the rest of the diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlCreateTableLike.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlCreateTableLike.java index b36b5ee983ec6..5975aea44a41f 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlCreateTableLike.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlCreateTableLike.java @@ -23,11 +23,14 @@ import org.apache.flink.sql.parser.ddl.constraint.SqlTableConstraint; import org.apache.flink.sql.parser.error.SqlValidateException; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlCharStringLiteral; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNodeList; +import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; @@ -36,6 +39,7 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; +import java.util.ArrayList; import java.util.List; import static java.util.Objects.requireNonNull; @@ -72,7 +76,30 @@ public class SqlCreateTableLike extends SqlCreateTable { private static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("CREATE TABLE LIKE", SqlKind.CREATE_TABLE); + new SqlSpecialOperator("CREATE TABLE LIKE", SqlKind.CREATE_TABLE) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + List constraints = new ArrayList<>(); + for (SqlNode c : (SqlNodeList) operands[2]) { + constraints.add((SqlTableConstraint) c); + } + return new SqlCreateTableLike( + pos, + (SqlIdentifier) operands[0], + (SqlNodeList) operands[1], + constraints, + (SqlNodeList) operands[3], + (SqlDistribution) operands[8], + (SqlNodeList) operands[4], + (SqlWatermark) operands[5], + (SqlCharStringLiteral) operands[6], + (SqlIdentifier) operands[7], + (SqlTableLike) operands[11], + ((SqlLiteral) operands[9]).booleanValue(), + ((SqlLiteral) operands[10]).booleanValue()); + } + }; private final SqlTableLike tableLike; @@ -127,6 +154,11 @@ public SqlTableLike getTableLike() { return tableLike; } + @Override + public SqlOperator getOperator() { + return OPERATOR; + } + @Override public void unparse(SqlWriter writer, int leftPrec, int rightPrec) { super.unparse(writer, leftPrec, rightPrec); diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlDropTable.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlDropTable.java index da47b32bf2a78..a3d75d7776b63 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlDropTable.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlDropTable.java @@ -20,17 +20,32 @@ import org.apache.flink.sql.parser.ddl.SqlDropObject; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; +import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; +import java.util.List; + /** DROP TABLE DDL sql call. */ public class SqlDropTable extends SqlDropObject { private static final SqlOperator OPERATOR = - new SqlSpecialOperator("DROP TABLE", SqlKind.DROP_TABLE); + new SqlSpecialOperator("DROP TABLE", SqlKind.DROP_TABLE) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlDropTable( + pos, + (SqlIdentifier) operands[0], + ((SqlLiteral) operands[1]).booleanValue(), + ((SqlLiteral) operands[2]).booleanValue()); + } + }; private final boolean isTemporary; @@ -44,6 +59,14 @@ public boolean isTemporary() { return this.isTemporary; } + @Override + public List getOperandList() { + return List.of( + name, + SqlLiteral.createBoolean(ifExists, SqlParserPos.ZERO), + SqlLiteral.createBoolean(isTemporary, SqlParserPos.ZERO)); + } + @Override public void unparse(SqlWriter writer, int leftPrec, int rightPrec) { writer.keyword("DROP"); diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlTableLike.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlTableLike.java index da6e9f249eff4..0001dde1cf668 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlTableLike.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/table/SqlTableLike.java @@ -22,9 +22,12 @@ import org.apache.flink.sql.parser.error.SqlValidateException; import org.apache.calcite.sql.SqlCall; +import org.apache.calcite.sql.SqlCharStringLiteral; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; +import org.apache.calcite.sql.SqlNodeList; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; @@ -32,6 +35,7 @@ import javax.annotation.Nonnull; +import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -160,7 +164,24 @@ public enum FeatureOption { private final List options; private static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("LIKE TABLE", SqlKind.OTHER); + new SqlSpecialOperator("LIKE TABLE", SqlKind.OTHER) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + List options = new ArrayList<>(); + for (SqlNode optionNode : (SqlNodeList) operands[1]) { + String[] parts = + ((SqlCharStringLiteral) optionNode) + .getValueAs(String.class) + .split(" "); + options.add( + new SqlTableLikeOption( + MergingStrategy.valueOf(parts[0]), + FeatureOption.valueOf(parts[1]))); + } + return new SqlTableLike(pos, (SqlIdentifier) operands[0], options); + } + }; public SqlTableLike( SqlParserPos pos, SqlIdentifier sourceTable, List options) { @@ -178,7 +199,16 @@ public SqlOperator getOperator() { @Nonnull @Override public List getOperandList() { - return singletonList(sourceTable); + SqlNodeList optionNodes = new SqlNodeList(SqlParserPos.ZERO); + for (SqlTableLikeOption option : options) { + optionNodes.add( + SqlLiteral.createCharString( + option.getMergingStrategy().name() + + " " + + option.getFeatureOption().name(), + SqlParserPos.ZERO)); + } + return List.of(sourceTable, optionNodes); } public SqlIdentifier getSourceTable() { diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/view/SqlAlterViewAs.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/view/SqlAlterViewAs.java index ba74abead096c..22bbbaab946cc 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/view/SqlAlterViewAs.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/view/SqlAlterViewAs.java @@ -20,8 +20,13 @@ import org.apache.flink.sql.parser.SqlUnparseUtils; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; +import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; +import org.apache.calcite.sql.SqlOperator; +import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; import org.apache.calcite.util.ImmutableNullableList; @@ -33,6 +38,16 @@ /** ALTER DDL to change a view's query. */ public class SqlAlterViewAs extends SqlAlterView { + private static final SqlSpecialOperator AS_OPERATOR = + new SqlSpecialOperator("ALTER VIEW AS", SqlKind.ALTER_VIEW) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlAlterViewAs( + pos, (SqlIdentifier) operands[0], operands[1], SqlParserPos.ZERO); + } + }; + private final SqlNode newQuery; private final SqlParserPos asQueryKeywordPos; @@ -47,6 +62,12 @@ public SqlAlterViewAs( this.asQueryKeywordPos = asQueryKeywordPos; } + @Nonnull + @Override + public SqlOperator getOperator() { + return AS_OPERATOR; + } + @Nonnull @Override public List getOperandList() { diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/view/SqlAlterViewProperties.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/view/SqlAlterViewProperties.java index b05e7bacc37f2..cc051919f367b 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/view/SqlAlterViewProperties.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/view/SqlAlterViewProperties.java @@ -21,9 +21,14 @@ import org.apache.flink.sql.parser.SqlParseUtils; import org.apache.flink.sql.parser.SqlUnparseUtils; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; +import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNodeList; +import org.apache.calcite.sql.SqlOperator; +import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; import org.apache.calcite.util.ImmutableNullableList; @@ -36,6 +41,16 @@ /** ALTER DDL to change properties of a view. */ public class SqlAlterViewProperties extends SqlAlterView { + private static final SqlSpecialOperator PROPERTIES_OPERATOR = + new SqlSpecialOperator("ALTER VIEW SET", SqlKind.ALTER_VIEW) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlAlterViewProperties( + pos, (SqlIdentifier) operands[0], (SqlNodeList) operands[1]); + } + }; + private final SqlNodeList propertyList; public SqlAlterViewProperties( @@ -44,6 +59,11 @@ public SqlAlterViewProperties( this.propertyList = requireNonNull(propertyList, "propertyList should not be null"); } + @Override + public SqlOperator getOperator() { + return PROPERTIES_OPERATOR; + } + @Override public List getOperandList() { return ImmutableNullableList.of(name, propertyList); diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/view/SqlAlterViewRename.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/view/SqlAlterViewRename.java index 63cfedafd3a83..3bd0d5b6b8e4f 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/view/SqlAlterViewRename.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/view/SqlAlterViewRename.java @@ -18,8 +18,13 @@ package org.apache.flink.sql.parser.ddl.view; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; +import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; +import org.apache.calcite.sql.SqlOperator; +import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; import org.apache.calcite.util.ImmutableNullableList; @@ -31,6 +36,16 @@ /** ALTER DDL to rename a view. */ public class SqlAlterViewRename extends SqlAlterView { + private static final SqlSpecialOperator RENAME_OPERATOR = + new SqlSpecialOperator("ALTER VIEW RENAME", SqlKind.ALTER_VIEW) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlAlterViewRename( + pos, (SqlIdentifier) operands[0], (SqlIdentifier) operands[1]); + } + }; + private final SqlIdentifier newViewIdentifier; public SqlAlterViewRename( @@ -39,6 +54,12 @@ public SqlAlterViewRename( this.newViewIdentifier = newViewIdentifier; } + @Nonnull + @Override + public SqlOperator getOperator() { + return RENAME_OPERATOR; + } + @Nonnull @Override public List getOperandList() { diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/view/SqlCreateView.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/view/SqlCreateView.java index fc4c754fb59c0..b739d15f9b1c8 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/view/SqlCreateView.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/view/SqlCreateView.java @@ -21,6 +21,7 @@ import org.apache.flink.sql.parser.SqlUnparseUtils; import org.apache.flink.sql.parser.ddl.SqlCreateObject; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlCharStringLiteral; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; @@ -39,7 +40,23 @@ /** CREATE VIEW DDL sql call. */ public class SqlCreateView extends SqlCreateObject { private static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("CREATE_VIEW", SqlKind.CREATE_VIEW); + new SqlSpecialOperator("CREATE_VIEW", SqlKind.CREATE_VIEW) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlCreateView( + pos, + (SqlIdentifier) operands[0], + (SqlNodeList) operands[1], + operands[2], + ((SqlLiteral) operands[3]).booleanValue(), + ((SqlLiteral) operands[4]).booleanValue(), + ((SqlLiteral) operands[5]).booleanValue(), + (SqlCharStringLiteral) operands[6], + (SqlNodeList) operands[7], + SqlParserPos.ZERO); + } + }; private final SqlNodeList fieldList; private final SqlNode query; @@ -69,6 +86,10 @@ public List getOperandList() { ops.add(fieldList); ops.add(query); ops.add(SqlLiteral.createBoolean(getReplace(), SqlParserPos.ZERO)); + ops.add(SqlLiteral.createBoolean(isTemporary(), SqlParserPos.ZERO)); + ops.add(SqlLiteral.createBoolean(isIfNotExists(), SqlParserPos.ZERO)); + ops.add(comment); + ops.add(properties); return ops; } diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/view/SqlDropView.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/view/SqlDropView.java index 839e94b8cdad8..99bbac3fdc60e 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/view/SqlDropView.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/ddl/view/SqlDropView.java @@ -20,17 +20,32 @@ import org.apache.flink.sql.parser.ddl.SqlDropObject; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; +import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; +import java.util.List; + /** DROP VIEW DDL sql call. */ public class SqlDropView extends SqlDropObject { private static final SqlOperator OPERATOR = - new SqlSpecialOperator("DROP VIEW", SqlKind.DROP_VIEW); + new SqlSpecialOperator("DROP VIEW", SqlKind.DROP_VIEW) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlDropView( + pos, + (SqlIdentifier) operands[0], + ((SqlLiteral) operands[1]).booleanValue(), + ((SqlLiteral) operands[2]).booleanValue()); + } + }; private final boolean isTemporary; @@ -55,4 +70,12 @@ public void unparse(SqlWriter writer, int leftPrec, int rightPrec) { public boolean isTemporary() { return isTemporary; } + + @Override + public List getOperandList() { + return List.of( + name, + SqlLiteral.createBoolean(ifExists, SqlParserPos.ZERO), + SqlLiteral.createBoolean(isTemporary, SqlParserPos.ZERO)); + } } diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dml/RichSqlInsert.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dml/RichSqlInsert.java index df758e2af5d4d..c52d322497919 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dml/RichSqlInsert.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dml/RichSqlInsert.java @@ -21,23 +21,46 @@ import org.apache.flink.sql.parser.SqlParseUtils; import org.apache.flink.sql.parser.SqlProperty; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlInsert; import org.apache.calcite.sql.SqlInsertKeyword; +import org.apache.calcite.sql.SqlKind; import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNodeList; +import org.apache.calcite.sql.SqlOperator; +import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlTableRef; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; import javax.annotation.Nullable; +import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Optional; /** A {@link SqlInsert} that have some extension functions like partition, overwrite. * */ public class RichSqlInsert extends SqlInsert { + + public static final SqlSpecialOperator OPERATOR = + new SqlSpecialOperator("INSERT", SqlKind.INSERT) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new RichSqlInsert( + pos, + (SqlNodeList) operands[0], + (SqlNodeList) operands[4], + operands[1], + operands[2], + (SqlNodeList) operands[3], + (SqlNodeList) operands[5], + (SqlLiteral) operands[6]); + } + }; + private final SqlNodeList staticPartitions; private final SqlNodeList extendedKeywords; @@ -93,6 +116,22 @@ public RichSqlInsert( } } + @Override + public SqlOperator getOperator() { + return OPERATOR; + } + + @Override + public List getOperandList() { + // SqlInsert exposes [keywords, targetTable, source, columnList]; append the + // Flink-specific operands so that a deep copy can faithfully rebuild this node. + List operands = new ArrayList<>(super.getOperandList()); + operands.add(extendedKeywords); + operands.add(staticPartitions); + operands.add(conflictAction); + return operands; + } + /** * @return the list of partition key-value pairs, returns empty if there is no partition * specifications. diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dml/SqlBeginStatementSet.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dml/SqlBeginStatementSet.java index d3c157048df2b..495198626fbac 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dml/SqlBeginStatementSet.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dml/SqlBeginStatementSet.java @@ -20,6 +20,7 @@ import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; @@ -33,7 +34,13 @@ public class SqlBeginStatementSet extends SqlCall { public static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("BEGIN STATEMENT SET", SqlKind.OTHER); + new SqlSpecialOperator("BEGIN STATEMENT SET", SqlKind.OTHER) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlBeginStatementSet(pos); + } + }; public SqlBeginStatementSet(SqlParserPos pos) { super(pos); diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dml/SqlCompileAndExecutePlan.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dml/SqlCompileAndExecutePlan.java index a3410c983d58c..32e4d90bebcc1 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dml/SqlCompileAndExecutePlan.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dml/SqlCompileAndExecutePlan.java @@ -23,6 +23,7 @@ import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; @@ -31,7 +32,6 @@ import javax.annotation.Nonnull; -import java.util.Collections; import java.util.List; /** @@ -42,7 +42,13 @@ public class SqlCompileAndExecutePlan extends SqlCall { public static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("COMPILE AND EXECUTE PLAN", SqlKind.OTHER); + new SqlSpecialOperator("COMPILE AND EXECUTE PLAN", SqlKind.OTHER) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlCompileAndExecutePlan(pos, operands[1], operands[0]); + } + }; private final SqlNode planFile; private SqlNode operand; @@ -67,7 +73,7 @@ public SqlOperator getOperator() { @Nonnull @Override public List getOperandList() { - return Collections.singletonList(operand); + return List.of(operand, planFile); } @Override diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dml/SqlEndStatementSet.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dml/SqlEndStatementSet.java index e6904d69ccd80..1025dd860e4e0 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dml/SqlEndStatementSet.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dml/SqlEndStatementSet.java @@ -20,6 +20,7 @@ import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; @@ -32,7 +33,14 @@ /** END. */ public class SqlEndStatementSet extends SqlCall { - public static final SqlSpecialOperator OPERATOR = new SqlSpecialOperator("END", SqlKind.OTHER); + public static final SqlSpecialOperator OPERATOR = + new SqlSpecialOperator("END", SqlKind.OTHER) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlEndStatementSet(pos); + } + }; public SqlEndStatementSet(SqlParserPos pos) { super(pos); diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dml/SqlExecute.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dml/SqlExecute.java index 61a83c1800450..d5f58987d7971 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dml/SqlExecute.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dml/SqlExecute.java @@ -20,6 +20,7 @@ import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSelect; @@ -51,7 +52,13 @@ public class SqlExecute extends SqlCall { public static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("Execute", SqlKind.OTHER); + new SqlSpecialOperator("Execute", SqlKind.OTHER) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlExecute(operands[0], pos); + } + }; private SqlNode statement; diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dml/SqlExecutePlan.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dml/SqlExecutePlan.java index 91a73f9e5ccc0..725e9ed13b986 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dml/SqlExecutePlan.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dml/SqlExecutePlan.java @@ -23,6 +23,7 @@ import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; @@ -39,7 +40,13 @@ public class SqlExecutePlan extends SqlCall { public static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("EXECUTE PLAN", SqlKind.OTHER); + new SqlSpecialOperator("EXECUTE PLAN", SqlKind.OTHER) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlExecutePlan(pos, operands[0]); + } + }; private final SqlNode planFile; @@ -61,7 +68,7 @@ public SqlOperator getOperator() { @Nonnull @Override public List getOperandList() { - return Collections.emptyList(); + return Collections.singletonList(planFile); } @Override diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dml/SqlStatementSet.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dml/SqlStatementSet.java index f56c341097026..1f3ff2475017e 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dml/SqlStatementSet.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dml/SqlStatementSet.java @@ -20,6 +20,7 @@ import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; @@ -41,7 +42,17 @@ public class SqlStatementSet extends SqlCall { public static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("Statement Set", SqlKind.OTHER); + new SqlSpecialOperator("Statement Set", SqlKind.OTHER) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + List inserts = new ArrayList<>(operands.length); + for (SqlNode operand : operands) { + inserts.add((RichSqlInsert) operand); + } + return new SqlStatementSet(inserts, pos); + } + }; private final ArrayList inserts = new ArrayList<>(); diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dml/SqlTruncateTable.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dml/SqlTruncateTable.java index 6084f6cc1b6cc..dc66ba230592a 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dml/SqlTruncateTable.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dml/SqlTruncateTable.java @@ -21,6 +21,7 @@ import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; @@ -42,7 +43,13 @@ public class SqlTruncateTable extends SqlCall { private final SqlIdentifier tableNameIdentifier; public static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("TRUNCATE TABLE", SqlKind.OTHER); + new SqlSpecialOperator("TRUNCATE TABLE", SqlKind.OTHER) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlTruncateTable(pos, (SqlIdentifier) operands[0]); + } + }; public SqlTruncateTable(SqlParserPos pos, SqlIdentifier tableNameIdentifier) { super(pos); diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlDescribeCatalog.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlDescribeCatalog.java index df41e391b8082..afddfcd42d42a 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlDescribeCatalog.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlDescribeCatalog.java @@ -21,20 +21,29 @@ import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; -import java.util.Collections; import java.util.List; /** DESCRIBE CATALOG sql call. */ public class SqlDescribeCatalog extends SqlCall { public static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("DESCRIBE CATALOG", SqlKind.OTHER_DDL); + new SqlSpecialOperator("DESCRIBE CATALOG", SqlKind.OTHER_DDL) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlDescribeCatalog( + pos, + (SqlIdentifier) operands[0], + ((SqlLiteral) operands[1]).booleanValue()); + } + }; private final SqlIdentifier catalogName; private final boolean isExtended; @@ -51,7 +60,7 @@ public SqlOperator getOperator() { @Override public List getOperandList() { - return Collections.singletonList(catalogName); + return List.of(catalogName, SqlLiteral.createBoolean(isExtended, SqlParserPos.ZERO)); } public String getCatalogName() { diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlDescribeDatabase.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlDescribeDatabase.java index 2ea96151a0a29..dcedad932a938 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlDescribeDatabase.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlDescribeDatabase.java @@ -21,20 +21,29 @@ import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; -import java.util.Collections; import java.util.List; /** DESCRIBE DATABASE [ EXTENDED] [ databaseName.] dataBasesName sql call. */ public class SqlDescribeDatabase extends SqlCall { public static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("DESCRIBE DATABASE", SqlKind.OTHER); + new SqlSpecialOperator("DESCRIBE DATABASE", SqlKind.OTHER) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlDescribeDatabase( + pos, + (SqlIdentifier) operands[0], + ((SqlLiteral) operands[1]).booleanValue()); + } + }; private final SqlIdentifier databaseName; private boolean isExtended = false; @@ -51,7 +60,7 @@ public SqlOperator getOperator() { @Override public List getOperandList() { - return Collections.singletonList(databaseName); + return List.of(databaseName, SqlLiteral.createBoolean(isExtended, SqlParserPos.ZERO)); } public String getDatabaseName() { diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlDescribeJob.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlDescribeJob.java index af316fc7306b9..588d3974555ab 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlDescribeJob.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlDescribeJob.java @@ -21,6 +21,7 @@ import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlCharStringLiteral; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; @@ -35,7 +36,13 @@ public class SqlDescribeJob extends SqlCall { public static final SqlOperator OPERATOR = - new SqlSpecialOperator("DESCRIBE JOB", SqlKind.OTHER); + new SqlSpecialOperator("DESCRIBE JOB", SqlKind.OTHER) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlDescribeJob(pos, (SqlCharStringLiteral) operands[0]); + } + }; private final SqlCharStringLiteral jobId; diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlLoadModule.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlLoadModule.java index a1f38e635cd51..cca48e8c599de 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlLoadModule.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlLoadModule.java @@ -24,6 +24,7 @@ import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNodeList; import org.apache.calcite.sql.SqlOperator; @@ -40,7 +41,14 @@ /** LOAD MODULE sql call. */ public class SqlLoadModule extends SqlCall { public static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("LOAD MODULE", SqlKind.OTHER); + new SqlSpecialOperator("LOAD MODULE", SqlKind.OTHER) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlLoadModule( + pos, (SqlIdentifier) operands[0], (SqlNodeList) operands[1]); + } + }; private final SqlIdentifier moduleName; private final SqlNodeList propertyList; diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlRichDescribeConnection.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlRichDescribeConnection.java index 9fb9bb9b79cfd..b7ac1a7dde7be 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlRichDescribeConnection.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlRichDescribeConnection.java @@ -21,13 +21,13 @@ import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; -import java.util.Collections; import java.util.List; /** @@ -39,7 +39,16 @@ public class SqlRichDescribeConnection extends SqlCall { public static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("DESCRIBE CONNECTION", SqlKind.OTHER); + new SqlSpecialOperator("DESCRIBE CONNECTION", SqlKind.OTHER) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlRichDescribeConnection( + pos, + (SqlIdentifier) operands[0], + ((SqlLiteral) operands[1]).booleanValue()); + } + }; protected final SqlIdentifier connectionNameIdentifier; private final boolean isExtended; @@ -57,7 +66,8 @@ public SqlOperator getOperator() { @Override public List getOperandList() { - return Collections.singletonList(connectionNameIdentifier); + return List.of( + connectionNameIdentifier, SqlLiteral.createBoolean(isExtended, SqlParserPos.ZERO)); } public boolean isExtended() { diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlRichDescribeFunction.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlRichDescribeFunction.java index 57bce5fa7d720..1dd5009c7ba54 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlRichDescribeFunction.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlRichDescribeFunction.java @@ -21,13 +21,13 @@ import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; -import java.util.Collections; import java.util.List; /** @@ -39,7 +39,16 @@ public class SqlRichDescribeFunction extends SqlCall { public static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("DESCRIBE FUNCTION", SqlKind.OTHER); + new SqlSpecialOperator("DESCRIBE FUNCTION", SqlKind.OTHER) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlRichDescribeFunction( + pos, + (SqlIdentifier) operands[0], + ((SqlLiteral) operands[1]).booleanValue()); + } + }; protected final SqlIdentifier functionNameIdentifier; private final boolean isExtended; @@ -57,7 +66,8 @@ public SqlOperator getOperator() { @Override public List getOperandList() { - return Collections.singletonList(functionNameIdentifier); + return List.of( + functionNameIdentifier, SqlLiteral.createBoolean(isExtended, SqlParserPos.ZERO)); } public boolean isExtended() { diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlRichDescribeModel.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlRichDescribeModel.java index 6a5f5acfc5080..b993ce231b1df 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlRichDescribeModel.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlRichDescribeModel.java @@ -21,13 +21,13 @@ import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; -import java.util.Collections; import java.util.List; /** @@ -39,7 +39,16 @@ public class SqlRichDescribeModel extends SqlCall { public static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("DESCRIBE MODEL", SqlKind.OTHER); + new SqlSpecialOperator("DESCRIBE MODEL", SqlKind.OTHER) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlRichDescribeModel( + pos, + (SqlIdentifier) operands[0], + ((SqlLiteral) operands[1]).booleanValue()); + } + }; protected final SqlIdentifier modelNameIdentifier; private final boolean isExtended; @@ -57,7 +66,8 @@ public SqlOperator getOperator() { @Override public List getOperandList() { - return Collections.singletonList(modelNameIdentifier); + return List.of( + modelNameIdentifier, SqlLiteral.createBoolean(isExtended, SqlParserPos.ZERO)); } public boolean isExtended() { diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlRichDescribeTable.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlRichDescribeTable.java index c6ce0117a1329..5e1b960c677fd 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlRichDescribeTable.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlRichDescribeTable.java @@ -21,13 +21,13 @@ import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; -import java.util.Collections; import java.util.List; /** @@ -37,7 +37,16 @@ public class SqlRichDescribeTable extends SqlCall { public static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("DESCRIBE TABLE", SqlKind.DESCRIBE_TABLE); + new SqlSpecialOperator("DESCRIBE TABLE", SqlKind.DESCRIBE_TABLE) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlRichDescribeTable( + pos, + (SqlIdentifier) operands[0], + ((SqlLiteral) operands[1]).booleanValue()); + } + }; protected final SqlIdentifier tableNameIdentifier; private final boolean isExtended; @@ -55,7 +64,8 @@ public SqlOperator getOperator() { @Override public List getOperandList() { - return Collections.singletonList(tableNameIdentifier); + return List.of( + tableNameIdentifier, SqlLiteral.createBoolean(isExtended, SqlParserPos.ZERO)); } public boolean isExtended() { diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlRichExplain.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlRichExplain.java index 1567106b2e328..9a545570205be 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlRichExplain.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlRichExplain.java @@ -19,15 +19,18 @@ package org.apache.flink.sql.parser.dql; import org.apache.calcite.sql.SqlCall; +import org.apache.calcite.sql.SqlCharStringLiteral; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; +import org.apache.calcite.sql.SqlNodeList; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; -import java.util.Collections; import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; import java.util.Set; @@ -39,7 +42,18 @@ public class SqlRichExplain extends SqlCall { public static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("EXPLAIN", SqlKind.EXPLAIN); + new SqlSpecialOperator("EXPLAIN", SqlKind.EXPLAIN) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + Set explainDetails = new LinkedHashSet<>(); + for (SqlNode detail : (SqlNodeList) operands[1]) { + explainDetails.add( + ((SqlCharStringLiteral) detail).getValueAs(String.class)); + } + return new SqlRichExplain(pos, operands[0], explainDetails); + } + }; private SqlNode statement; private final Set explainDetails; @@ -65,7 +79,11 @@ public SqlOperator getOperator() { @Override public List getOperandList() { - return Collections.singletonList(statement); + SqlNodeList details = new SqlNodeList(SqlParserPos.ZERO); + for (String detail : explainDetails) { + details.add(SqlLiteral.createCharString(detail, SqlParserPos.ZERO)); + } + return List.of(statement, details); } public Set getExplainDetails() { diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowCall.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowCall.java index d769d3a82132c..d671d05707542 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowCall.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowCall.java @@ -21,10 +21,12 @@ import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlCharStringLiteral; import org.apache.calcite.sql.SqlIdentifier; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.parser.SqlParserPos; +import org.apache.calcite.util.ImmutableNullableList; import java.util.Collections; import java.util.List; @@ -59,9 +61,33 @@ public SqlShowCall( @Override public List getOperandList() { - return Objects.isNull(sqlIdentifier) - ? Collections.emptyList() - : Collections.singletonList(sqlIdentifier); + // Fixed layout so that deep-copy via operator.createCall can faithfully reconstruct the + // subclass: [identifier, preposition, likeType, likeLiteral, notLike]. + return ImmutableNullableList.of( + sqlIdentifier, + stringToOperand(preposition), + stringToOperand(likeType), + likeLiteral, + SqlLiteral.createBoolean(notLike, SqlParserPos.ZERO)); + } + + /** Encodes a nullable {@code String} field as an operand for {@link #getOperandList()}. */ + protected static SqlNode stringToOperand(String value) { + return value == null + ? SqlLiteral.createNull(SqlParserPos.ZERO) + : SqlLiteral.createCharString(value, SqlParserPos.ZERO); + } + + /** Decodes a {@code String} field previously encoded by {@link #stringToOperand(String)}. */ + protected static String operandToString(SqlNode operand) { + return operand instanceof SqlCharStringLiteral + ? ((SqlCharStringLiteral) operand).getValueAs(String.class) + : null; + } + + /** Decodes a {@code boolean} field encoded as a {@link SqlLiteral}. */ + protected static boolean operandToBoolean(SqlNode operand) { + return ((SqlLiteral) operand).booleanValue(); } @Override diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowCatalogs.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowCatalogs.java index 09270267658f8..5241a1621e964 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowCatalogs.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowCatalogs.java @@ -18,8 +18,11 @@ package org.apache.flink.sql.parser.dql; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlCharStringLiteral; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; +import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.parser.SqlParserPos; @@ -34,7 +37,17 @@ public class SqlShowCatalogs extends SqlShowCall { public static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("SHOW CATALOGS", SqlKind.OTHER); + new SqlSpecialOperator("SHOW CATALOGS", SqlKind.OTHER) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlShowCatalogs( + pos, + operandToString(operands[2]), + (SqlCharStringLiteral) operands[3], + operandToBoolean(operands[4])); + } + }; public SqlShowCatalogs( SqlParserPos pos, String likeType, SqlCharStringLiteral likeLiteral, boolean notLike) { diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowColumns.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowColumns.java index f22e802bb4fd5..8ecc2c6ba506a 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowColumns.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowColumns.java @@ -18,9 +18,12 @@ package org.apache.flink.sql.parser.dql; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlCharStringLiteral; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; +import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.parser.SqlParserPos; @@ -31,7 +34,18 @@ public class SqlShowColumns extends SqlShowCall { public static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("SHOW COLUMNS", SqlKind.OTHER); + new SqlSpecialOperator("SHOW COLUMNS", SqlKind.OTHER) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlShowColumns( + pos, + operandToString(operands[1]), + (SqlIdentifier) operands[0], + operandToBoolean(operands[4]), + (SqlCharStringLiteral) operands[3]); + } + }; public SqlShowColumns( SqlParserPos pos, diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowConnections.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowConnections.java index a0dd89f99e639..b3b1cdfb89f9c 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowConnections.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowConnections.java @@ -18,9 +18,11 @@ package org.apache.flink.sql.parser.dql; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlCharStringLiteral; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; @@ -30,7 +32,18 @@ public class SqlShowConnections extends SqlShowCall { public static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("SHOW CONNECTIONS", SqlKind.OTHER); + new SqlSpecialOperator("SHOW CONNECTIONS", SqlKind.OTHER) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlShowConnections( + pos, + operandToString(operands[1]), + (SqlIdentifier) operands[0], + operandToBoolean(operands[4]), + (SqlCharStringLiteral) operands[3]); + } + }; public SqlShowConnections( SqlParserPos pos, diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowCreateCatalog.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowCreateCatalog.java index 93d85cca39dae..94e5d4cdc0f87 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowCreateCatalog.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowCreateCatalog.java @@ -18,8 +18,10 @@ package org.apache.flink.sql.parser.dql; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; @@ -33,7 +35,13 @@ public class SqlShowCreateCatalog extends SqlShowCreate { public static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("SHOW CREATE CATALOG", SqlKind.OTHER_DDL); + new SqlSpecialOperator("SHOW CREATE CATALOG", SqlKind.OTHER_DDL) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlShowCreateCatalog(pos, (SqlIdentifier) operands[0]); + } + }; public SqlShowCreateCatalog(SqlParserPos pos, SqlIdentifier catalogName) { super(pos, catalogName); diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowCreateConnection.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowCreateConnection.java index 0434bbb6dc109..5122ae14080de 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowCreateConnection.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowCreateConnection.java @@ -18,8 +18,10 @@ package org.apache.flink.sql.parser.dql; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; @@ -33,7 +35,13 @@ public class SqlShowCreateConnection extends SqlShowCreate { public static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("SHOW CREATE CONNECTION", SqlKind.OTHER_DDL); + new SqlSpecialOperator("SHOW CREATE CONNECTION", SqlKind.OTHER_DDL) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlShowCreateConnection(pos, (SqlIdentifier) operands[0]); + } + }; public SqlShowCreateConnection(SqlParserPos pos, SqlIdentifier connectionName) { super(pos, connectionName); diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowCreateMaterializedTable.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowCreateMaterializedTable.java index 929d2fb238c89..47412c6e2747e 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowCreateMaterializedTable.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowCreateMaterializedTable.java @@ -18,8 +18,10 @@ package org.apache.flink.sql.parser.dql; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; @@ -32,10 +34,24 @@ /** SHOW CREATE [OR ALTER ]MATERIALIZED TABLE sql call. */ public class SqlShowCreateMaterializedTable extends SqlShowCreate { private static final SqlSpecialOperator SHOW_CREATE_OPERATOR = - new SqlSpecialOperator("SHOW CREATE MATERIALIZED TABLE", SqlKind.OTHER_DDL); + new SqlSpecialOperator("SHOW CREATE MATERIALIZED TABLE", SqlKind.OTHER_DDL) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlShowCreateMaterializedTable( + pos, (SqlIdentifier) operands[0], false); + } + }; private static final SqlSpecialOperator SHOW_CREATE_OR_ALTER_OPERATOR = - new SqlSpecialOperator("SHOW CREATE OR ALTER MATERIALIZED TABLE", SqlKind.OTHER_DDL); + new SqlSpecialOperator("SHOW CREATE OR ALTER MATERIALIZED TABLE", SqlKind.OTHER_DDL) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlShowCreateMaterializedTable( + pos, (SqlIdentifier) operands[0], true); + } + }; private final boolean createOrAlter; diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowCreateModel.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowCreateModel.java index 54b58b651e6c9..a41e1ffed69f7 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowCreateModel.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowCreateModel.java @@ -18,8 +18,10 @@ package org.apache.flink.sql.parser.dql; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; @@ -33,7 +35,13 @@ public class SqlShowCreateModel extends SqlShowCreate { public static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("SHOW CREATE MODEL", SqlKind.OTHER_DDL); + new SqlSpecialOperator("SHOW CREATE MODEL", SqlKind.OTHER_DDL) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlShowCreateModel(pos, (SqlIdentifier) operands[0]); + } + }; public SqlShowCreateModel(SqlParserPos pos, SqlIdentifier modelName) { super(pos, modelName); diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowCreateTable.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowCreateTable.java index 8cc63db6a5bbd..abbb3d505eadb 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowCreateTable.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowCreateTable.java @@ -18,8 +18,10 @@ package org.apache.flink.sql.parser.dql; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; @@ -33,7 +35,13 @@ public class SqlShowCreateTable extends SqlShowCreate { public static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("SHOW CREATE TABLE", SqlKind.OTHER_DDL); + new SqlSpecialOperator("SHOW CREATE TABLE", SqlKind.OTHER_DDL) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlShowCreateTable(pos, (SqlIdentifier) operands[0]); + } + }; public SqlShowCreateTable(SqlParserPos pos, SqlIdentifier tableName) { super(pos, tableName); diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowCreateView.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowCreateView.java index d2a79a93062b2..36f3ff5deba57 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowCreateView.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowCreateView.java @@ -18,8 +18,10 @@ package org.apache.flink.sql.parser.dql; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; @@ -33,7 +35,13 @@ public class SqlShowCreateView extends SqlShowCreate { public static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("SHOW CREATE VIEW", SqlKind.OTHER_DDL); + new SqlSpecialOperator("SHOW CREATE VIEW", SqlKind.OTHER_DDL) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlShowCreateView(pos, (SqlIdentifier) operands[0]); + } + }; public SqlShowCreateView(SqlParserPos pos, SqlIdentifier viewName) { super(pos, viewName); diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowCurrentCatalog.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowCurrentCatalog.java index 75f60568d51b1..ad6c68af128f4 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowCurrentCatalog.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowCurrentCatalog.java @@ -20,6 +20,7 @@ import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; @@ -33,7 +34,13 @@ public class SqlShowCurrentCatalog extends SqlCall { public static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("SHOW CURRENT CATALOG", SqlKind.OTHER); + new SqlSpecialOperator("SHOW CURRENT CATALOG", SqlKind.OTHER) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlShowCurrentCatalog(pos); + } + }; public SqlShowCurrentCatalog(SqlParserPos pos) { super(pos); diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowCurrentDatabase.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowCurrentDatabase.java index a423b87d779a4..22a9cde4ad2e4 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowCurrentDatabase.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowCurrentDatabase.java @@ -20,6 +20,7 @@ import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; @@ -33,7 +34,13 @@ public class SqlShowCurrentDatabase extends SqlCall { public static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("SHOW CURRENT DATABASE", SqlKind.OTHER); + new SqlSpecialOperator("SHOW CURRENT DATABASE", SqlKind.OTHER) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlShowCurrentDatabase(pos); + } + }; public SqlShowCurrentDatabase(SqlParserPos pos) { super(pos); diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowDatabases.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowDatabases.java index aaccf448f2075..781b7d238f807 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowDatabases.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowDatabases.java @@ -20,9 +20,12 @@ import org.apache.flink.sql.parser.impl.ParseException; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlCharStringLiteral; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; +import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.parser.SqlParserPos; @@ -38,7 +41,23 @@ public class SqlShowDatabases extends SqlShowCall { public static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("SHOW DATABASES", SqlKind.OTHER); + new SqlSpecialOperator("SHOW DATABASES", SqlKind.OTHER) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + try { + return new SqlShowDatabases( + pos, + operandToString(operands[1]), + (SqlIdentifier) operands[0], + operandToString(operands[2]), + (SqlCharStringLiteral) operands[3], + operandToBoolean(operands[4])); + } catch (ParseException e) { + throw new RuntimeException(e); + } + } + }; public SqlShowDatabases( SqlParserPos pos, diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowFunctions.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowFunctions.java index 8a3b9f0100f90..26d2be55b6fff 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowFunctions.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowFunctions.java @@ -18,13 +18,19 @@ package org.apache.flink.sql.parser.dql; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlCharStringLiteral; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; +import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.parser.SqlParserPos; +import java.util.ArrayList; +import java.util.List; + /** * Show Functions sql call. The full syntax for show functions is as followings: * @@ -36,7 +42,20 @@ public class SqlShowFunctions extends SqlShowCall { public static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("SHOW FUNCTIONS", SqlKind.OTHER); + new SqlSpecialOperator("SHOW FUNCTIONS", SqlKind.OTHER) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlShowFunctions( + pos, + operandToBoolean(operands[5]), + operandToString(operands[1]), + (SqlIdentifier) operands[0], + operandToString(operands[2]), + (SqlCharStringLiteral) operands[3], + operandToBoolean(operands[4])); + } + }; private final boolean requireUser; @@ -61,6 +80,13 @@ public boolean requireUser() { return requireUser; } + @Override + public List getOperandList() { + List operands = new ArrayList<>(super.getOperandList()); + operands.add(SqlLiteral.createBoolean(requireUser, SqlParserPos.ZERO)); + return operands; + } + @Override String getOperationName() { return requireUser ? "SHOW USER FUNCTIONS" : "SHOW FUNCTIONS"; diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowJars.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowJars.java index 8aac3d0ae25a2..39c0734c57f5f 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowJars.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowJars.java @@ -20,6 +20,7 @@ import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; @@ -33,7 +34,13 @@ public class SqlShowJars extends SqlCall { public static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("SHOW JARS", SqlKind.OTHER); + new SqlSpecialOperator("SHOW JARS", SqlKind.OTHER) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlShowJars(pos); + } + }; public SqlShowJars(SqlParserPos pos) { super(pos); diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowJobs.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowJobs.java index 5294564fb3a92..56f5c8137d83b 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowJobs.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowJobs.java @@ -20,6 +20,7 @@ import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; @@ -33,7 +34,13 @@ public class SqlShowJobs extends SqlCall { public static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("SHOW JOBS", SqlKind.OTHER); + new SqlSpecialOperator("SHOW JOBS", SqlKind.OTHER) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlShowJobs(pos); + } + }; public SqlShowJobs(SqlParserPos pos) { super(pos); diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowModels.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowModels.java index e9e61342b4b61..143cc67f62cb1 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowModels.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowModels.java @@ -18,9 +18,11 @@ package org.apache.flink.sql.parser.dql; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlCharStringLiteral; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; @@ -30,7 +32,18 @@ public class SqlShowModels extends SqlShowCall { public static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("SHOW MODELS", SqlKind.OTHER); + new SqlSpecialOperator("SHOW MODELS", SqlKind.OTHER) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlShowModels( + pos, + operandToString(operands[1]), + (SqlIdentifier) operands[0], + operandToBoolean(operands[4]), + (SqlCharStringLiteral) operands[3]); + } + }; public SqlShowModels( SqlParserPos pos, diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowModules.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowModules.java index f1176189990c4..56375cbac9bb8 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowModules.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowModules.java @@ -20,6 +20,7 @@ import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; @@ -31,7 +32,13 @@ /** SHOW [FULL] MODULES sql call. */ public class SqlShowModules extends SqlCall { public static final SqlOperator OPERATOR = - new SqlSpecialOperator("SHOW MODULES", SqlKind.OTHER); + new SqlSpecialOperator("SHOW MODULES", SqlKind.OTHER) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlShowModules(pos, ((SqlLiteral) operands[0]).booleanValue()); + } + }; private final boolean requireFull; public SqlShowModules(SqlParserPos pos, boolean requireFull) { @@ -46,7 +53,7 @@ public SqlOperator getOperator() { @Override public List getOperandList() { - return List.of(); + return List.of(SqlLiteral.createBoolean(requireFull, SqlParserPos.ZERO)); } @Override diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowPartitions.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowPartitions.java index 9223b6d89d7b7..ac4ebc2f7bb29 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowPartitions.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowPartitions.java @@ -23,6 +23,7 @@ import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNodeList; import org.apache.calcite.sql.SqlOperator; @@ -42,7 +43,14 @@ public class SqlShowPartitions extends SqlCall { public static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("SHOW PARTITIONS", SqlKind.OTHER); + new SqlSpecialOperator("SHOW PARTITIONS", SqlKind.OTHER) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlShowPartitions( + pos, (SqlIdentifier) operands[0], (SqlNodeList) operands[1]); + } + }; private final SqlIdentifier tableIdentifier; @Nullable private final SqlNodeList partitionSpec; diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowProcedures.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowProcedures.java index cbc04fd6669fc..b093089c73944 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowProcedures.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowProcedures.java @@ -18,9 +18,12 @@ package org.apache.flink.sql.parser.dql; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlCharStringLiteral; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; +import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.parser.SqlParserPos; @@ -38,7 +41,19 @@ public class SqlShowProcedures extends SqlShowCall { public static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("SHOW PROCEDURES", SqlKind.OTHER); + new SqlSpecialOperator("SHOW PROCEDURES", SqlKind.OTHER) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlShowProcedures( + pos, + operandToString(operands[1]), + (SqlIdentifier) operands[0], + operandToBoolean(operands[4]), + operandToString(operands[2]), + (SqlCharStringLiteral) operands[3]); + } + }; public SqlShowProcedures( SqlParserPos pos, diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowTables.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowTables.java index 626e21f93487d..56f8d86b90f31 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowTables.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowTables.java @@ -18,9 +18,12 @@ package org.apache.flink.sql.parser.dql; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlCharStringLiteral; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; +import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.parser.SqlParserPos; @@ -69,14 +72,53 @@ public SqlTableKind getTableKind() { return kind; } + private static SqlCall createCallForKind( + SqlOperator operator, SqlParserPos pos, SqlNode... operands) { + SqlTableKind tableKind = SqlTableKind.TABLE; + for (SqlTableKind candidate : SqlTableKind.values()) { + if (candidate.getOperator() == operator) { + tableKind = candidate; + break; + } + } + return new SqlShowTables( + pos, + tableKind, + operandToString(operands[1]), + (SqlIdentifier) operands[0], + operandToBoolean(operands[4]), + (SqlCharStringLiteral) operands[3]); + } + /** * The kind of table. Keep in sync with {@link * org.apache.flink.table.catalog.CatalogBaseTable.TableKind}. */ public enum SqlTableKind { - MATERIALIZED_TABLE(new SqlSpecialOperator("SHOW MATERIALIZED TABLES", SqlKind.OTHER)), - TABLE(new SqlSpecialOperator("SHOW TABLES", SqlKind.OTHER)), - VIEW(new SqlSpecialOperator("SHOW VIEWS", SqlKind.OTHER)); + MATERIALIZED_TABLE( + new SqlSpecialOperator("SHOW MATERIALIZED TABLES", SqlKind.OTHER) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return createCallForKind(this, pos, operands); + } + }), + TABLE( + new SqlSpecialOperator("SHOW TABLES", SqlKind.OTHER) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return createCallForKind(this, pos, operands); + } + }), + VIEW( + new SqlSpecialOperator("SHOW VIEWS", SqlKind.OTHER) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return createCallForKind(this, pos, operands); + } + }); private final SqlSpecialOperator operator; diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlUnloadModule.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlUnloadModule.java index a5fe601c91d90..f59a00b599d78 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlUnloadModule.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlUnloadModule.java @@ -21,6 +21,7 @@ import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSpecialOperator; @@ -34,7 +35,13 @@ public class SqlUnloadModule extends SqlCall { public static final SqlSpecialOperator OPERATOR = - new SqlSpecialOperator("UNLOAD MODULE", SqlKind.OTHER); + new SqlSpecialOperator("UNLOAD MODULE", SqlKind.OTHER) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return new SqlUnloadModule(pos, (SqlIdentifier) operands[0]); + } + }; private final SqlIdentifier moduleName; From eb3191c0a224b889565ad3018ee405234fe2e0e8 Mon Sep 17 00:00:00 2001 From: Sergey Nuyanzin Date: Fri, 26 Jun 2026 12:15:20 +0200 Subject: [PATCH 2/5] [FLINK-39999][table] Add temporary DeepCopyUnparsingTesterImpl before Calcite 1.42.0 upgrade --- .../parser/DeepCopyUnparsingTesterImpl.java | 155 ++++++++++++++++++ .../sql/parser/FlinkSqlUnParserTest.java | 4 +- ...aterializedTableStatementUnParserTest.java | 5 +- 3 files changed, 161 insertions(+), 3 deletions(-) create mode 100644 flink-table/flink-sql-parser/src/test/java/org/apache/flink/sql/parser/DeepCopyUnparsingTesterImpl.java diff --git a/flink-table/flink-sql-parser/src/test/java/org/apache/flink/sql/parser/DeepCopyUnparsingTesterImpl.java b/flink-table/flink-sql-parser/src/test/java/org/apache/flink/sql/parser/DeepCopyUnparsingTesterImpl.java new file mode 100644 index 0000000000000..8cd89fc834a35 --- /dev/null +++ b/flink-table/flink-sql-parser/src/test/java/org/apache/flink/sql/parser/DeepCopyUnparsingTesterImpl.java @@ -0,0 +1,155 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.flink.sql.parser; + +import org.apache.calcite.sql.SqlCall; +import org.apache.calcite.sql.SqlDialect; +import org.apache.calcite.sql.SqlNode; +import org.apache.calcite.sql.SqlNodeList; +import org.apache.calcite.sql.SqlWriterConfig; +import org.apache.calcite.sql.dialect.AnsiSqlDialect; +import org.apache.calcite.sql.parser.SqlParser; +import org.apache.calcite.sql.parser.SqlParserTest; +import org.apache.calcite.sql.parser.StringAndPos; +import org.apache.calcite.sql.test.SqlTestFactory; +import org.apache.calcite.sql.util.SqlShuttle; +import org.apache.calcite.util.Util; + +import java.util.List; +import java.util.function.Consumer; +import java.util.function.UnaryOperator; +import java.util.stream.Collectors; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Unparsing tester that, on top of the regular parse/unparse round-trips performed by {@link + * SqlParserTest.UnparsingTesterImpl}, also makes a deep copy of every parsed {@link SqlNode} and + * asserts that the copy unparses to the same SQL as the original. + * + *

The class should be dropped after upgrading to Calcite 1.42.0 since similar logic is there. + * More details are at CALCITE-7301. + */ +class DeepCopyUnparsingTesterImpl extends SqlParserTest.UnparsingTesterImpl { + + private static final String FLINK_PARSER_PACKAGE = "org.apache.flink.sql.parser"; + + /** Whether {@code node} or any node in its subtree is a Flink parser node. */ + private static boolean containsFlinkNode(SqlNode node) { + if (isFlinkNode(node)) { + return true; + } + final boolean[] found = {false}; + node.accept( + new SqlShuttle() { + @Override + public SqlNode visit(final SqlCall call) { + if (isFlinkNode(call)) { + found[0] = true; + } + // Default traversal copies nothing (alwaysCopy=false), so it never + // invokes createCall and is safe even for unfixed core operators. + return super.visit(call); + } + }); + return found[0]; + } + + private static boolean isFlinkNode(SqlNode node) { + return node.getClass().getName().startsWith(FLINK_PARSER_PACKAGE); + } + + private static SqlNode deepCopy(SqlNode sqlNode) { + return sqlNode.accept( + new SqlShuttle() { + @Override + public SqlNode visit(final SqlCall call) { + // Handler always creates a new copy of 'call'. + CallCopyingArgHandler argHandler = new CallCopyingArgHandler(call, true); + call.getOperator().acceptCall(this, call, false, argHandler); + return argHandler.result(); + } + }); + } + + private static UnaryOperator simple() { + return c -> + c.withSelectListItemsOnSeparateLines(false) + .withUpdateSetListNewline(false) + .withIndentation(0) + .withFromFolding(SqlWriterConfig.LineFolding.TALL); + } + + private static SqlWriterConfig simpleWithParens(SqlWriterConfig c) { + return simple().apply(c).withAlwaysUseParentheses(true); + } + + private static String toSqlString( + SqlNodeList sqlNodeList, UnaryOperator transform) { + return sqlNodeList.stream() + .map(node -> node.toSqlString(transform).getSql()) + .collect(Collectors.joining(";")); + } + + @Override + public void checkList( + SqlTestFactory factory, + StringAndPos sap, + SqlDialect dialect, + UnaryOperator converter, + List expected) { + super.checkList(factory, sap, dialect, converter, expected); + + final SqlNodeList sqlNodeList = parseStmtsAndHandleEx(factory, sap.sql); + if (!containsFlinkNode(sqlNodeList)) { + return; + } + final String sql1 = toSqlString(sqlNodeList, simple()); + + // Make a deep copy of the SqlNodeList, unparse it. + final SqlNodeList sqlNodeList3 = (SqlNodeList) deepCopy(sqlNodeList); + final String sql4 = toSqlString(sqlNodeList3, simple()); + // Should be the same as we started with. + assertThat(sql4).isEqualTo(sql1); + } + + @Override + public void check( + SqlTestFactory factory, + StringAndPos sap, + SqlDialect dialect, + UnaryOperator converter, + String expected, + Consumer parserChecker) { + super.check(factory, sap, dialect, converter, expected, parserChecker); + + final SqlNode sqlNode = parseStmtAndHandleEx(factory, sap.sql, parserChecker); + if (!containsFlinkNode(sqlNode)) { + return; + } + final SqlDialect dialect2 = Util.first(dialect, AnsiSqlDialect.DEFAULT); + final UnaryOperator writerTransform = + c -> simpleWithParens(c).withDialect(dialect2); + + // Make a deep copy of the original SqlNode, unparse it. + final SqlNode sqlNode5 = deepCopy(sqlNode); + final String actual5 = sqlNode5.toSqlString(writerTransform).getSql(); + assertThat(converter.apply(actual5)).isEqualTo(expected); + } +} diff --git a/flink-table/flink-sql-parser/src/test/java/org/apache/flink/sql/parser/FlinkSqlUnParserTest.java b/flink-table/flink-sql-parser/src/test/java/org/apache/flink/sql/parser/FlinkSqlUnParserTest.java index cced9d2e44055..2fa10002701f8 100644 --- a/flink-table/flink-sql-parser/src/test/java/org/apache/flink/sql/parser/FlinkSqlUnParserTest.java +++ b/flink-table/flink-sql-parser/src/test/java/org/apache/flink/sql/parser/FlinkSqlUnParserTest.java @@ -39,7 +39,9 @@ public FlinkSqlUnParserTest() {} public SqlParserFixture fixture() { return super.fixture() - .withTester(new UnparsingTesterImpl()) + // Replace back with UnparsingTesterImpl after upgrading Calcite to 1.42.0 + // since after that the logic is embedded into Calcite + .withTester(new DeepCopyUnparsingTesterImpl()) .withConfig(c -> c.withParserFactory(FlinkSqlParserImpl.FACTORY)); } } diff --git a/flink-table/flink-sql-parser/src/test/java/org/apache/flink/sql/parser/MaterializedTableStatementUnParserTest.java b/flink-table/flink-sql-parser/src/test/java/org/apache/flink/sql/parser/MaterializedTableStatementUnParserTest.java index 2baa999c8681f..92aaab23546ad 100644 --- a/flink-table/flink-sql-parser/src/test/java/org/apache/flink/sql/parser/MaterializedTableStatementUnParserTest.java +++ b/flink-table/flink-sql-parser/src/test/java/org/apache/flink/sql/parser/MaterializedTableStatementUnParserTest.java @@ -21,7 +21,6 @@ import org.apache.flink.sql.parser.impl.FlinkSqlParserImpl; import org.apache.calcite.sql.parser.SqlParserFixture; -import org.apache.calcite.sql.parser.SqlParserTest; import org.junit.jupiter.api.parallel.Execution; import static org.junit.jupiter.api.parallel.ExecutionMode.CONCURRENT; @@ -40,7 +39,9 @@ public MaterializedTableStatementUnParserTest() {} public SqlParserFixture fixture() { return super.fixture() - .withTester(new SqlParserTest.UnparsingTesterImpl()) + // Replace back with UnparsingTesterImpl after upgrading Calcite to 1.42.0 + // since after that the logic is embedded into Calcite + .withTester(new DeepCopyUnparsingTesterImpl()) .withConfig(c -> c.withParserFactory(FlinkSqlParserImpl.FACTORY)); } } From 2ddbd24625d7180624538fe2d06bf4c7ff41d998 Mon Sep 17 00:00:00 2001 From: Sergey Nuyanzin Date: Fri, 26 Jun 2026 14:50:54 +0200 Subject: [PATCH 3/5] Add test with to string --- .../flink/sql/parser/FlinkSqlParserImplTest.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/flink-table/flink-sql-parser/src/test/java/org/apache/flink/sql/parser/FlinkSqlParserImplTest.java b/flink-table/flink-sql-parser/src/test/java/org/apache/flink/sql/parser/FlinkSqlParserImplTest.java index b5ea58c8ea2d2..8b7b674f5515f 100644 --- a/flink-table/flink-sql-parser/src/test/java/org/apache/flink/sql/parser/FlinkSqlParserImplTest.java +++ b/flink-table/flink-sql-parser/src/test/java/org/apache/flink/sql/parser/FlinkSqlParserImplTest.java @@ -38,6 +38,7 @@ import java.util.List; import java.util.Locale; +import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.parallel.ExecutionMode.CONCURRENT; @@ -2452,6 +2453,18 @@ void testCreateViewWithFieldNames() { sql(sql).ok(expected); } + @Test + void testCreateViewWithFieldNamesWithToString() throws SqlParseException { + final String sql = "create view v(col1, col2) as select col3, col4 from tbl"; + final String expected = + "CREATE VIEW `V` (`COL1`, `COL2`)\n" + + "AS\n" + + "SELECT `COL3`, `COL4`\n" + + "FROM `TBL`"; + final SqlNode node = sql(sql).parser().parseQuery(); + assertThat(node).hasToString(expected); + } + @Test void testCreateViewWithInvalidName() { final String sql = "create view v(^*^) COMMENT 'this is a view' as select col1 from tbl"; From 205b58b9493da35c7ff97af7804dd10c06272d13 Mon Sep 17 00:00:00 2001 From: Sergey Nuyanzin Date: Fri, 26 Jun 2026 14:53:56 +0200 Subject: [PATCH 4/5] add instance of check --- .../org/apache/flink/sql/parser/FlinkSqlParserImplTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/flink-table/flink-sql-parser/src/test/java/org/apache/flink/sql/parser/FlinkSqlParserImplTest.java b/flink-table/flink-sql-parser/src/test/java/org/apache/flink/sql/parser/FlinkSqlParserImplTest.java index 8b7b674f5515f..764bfce65d47e 100644 --- a/flink-table/flink-sql-parser/src/test/java/org/apache/flink/sql/parser/FlinkSqlParserImplTest.java +++ b/flink-table/flink-sql-parser/src/test/java/org/apache/flink/sql/parser/FlinkSqlParserImplTest.java @@ -18,6 +18,7 @@ package org.apache.flink.sql.parser; +import org.apache.flink.sql.parser.ddl.view.SqlCreateView; import org.apache.flink.sql.parser.error.SqlValidateException; import org.apache.flink.sql.parser.impl.FlinkSqlParserImpl; @@ -2462,7 +2463,7 @@ void testCreateViewWithFieldNamesWithToString() throws SqlParseException { + "SELECT `COL3`, `COL4`\n" + "FROM `TBL`"; final SqlNode node = sql(sql).parser().parseQuery(); - assertThat(node).hasToString(expected); + assertThat(node).isInstanceOf(SqlCreateView.class).hasToString(expected); } @Test From 90787f44b46c99336beb457a223c2eb8b729d195 Mon Sep 17 00:00:00 2001 From: Sergey Nuyanzin Date: Fri, 26 Jun 2026 15:30:06 +0200 Subject: [PATCH 5/5] Address feedback --- .../flink/sql/parser/dql/SqlShowTables.java | 37 +++++++------------ .../parser/DeepCopyUnparsingTesterImpl.java | 8 ++-- .../sql/parser/FlinkSqlUnParserTest.java | 2 - ...aterializedTableStatementUnParserTest.java | 2 - 4 files changed, 17 insertions(+), 32 deletions(-) diff --git a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowTables.java b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowTables.java index 56f8d86b90f31..be9ab2404224d 100644 --- a/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowTables.java +++ b/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowTables.java @@ -95,30 +95,9 @@ private static SqlCall createCallForKind( * org.apache.flink.table.catalog.CatalogBaseTable.TableKind}. */ public enum SqlTableKind { - MATERIALIZED_TABLE( - new SqlSpecialOperator("SHOW MATERIALIZED TABLES", SqlKind.OTHER) { - @Override - public SqlCall createCall( - SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { - return createCallForKind(this, pos, operands); - } - }), - TABLE( - new SqlSpecialOperator("SHOW TABLES", SqlKind.OTHER) { - @Override - public SqlCall createCall( - SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { - return createCallForKind(this, pos, operands); - } - }), - VIEW( - new SqlSpecialOperator("SHOW VIEWS", SqlKind.OTHER) { - @Override - public SqlCall createCall( - SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { - return createCallForKind(this, pos, operands); - } - }); + MATERIALIZED_TABLE(getSpecialOperator("SHOW MATERIALIZED TABLES")), + TABLE(getSpecialOperator("SHOW TABLES")), + VIEW(getSpecialOperator("SHOW VIEWS")); private final SqlSpecialOperator operator; @@ -129,5 +108,15 @@ public SqlCall createCall( public SqlSpecialOperator getOperator() { return operator; } + + private static SqlSpecialOperator getSpecialOperator(final String name) { + return new SqlSpecialOperator(name, SqlKind.OTHER) { + @Override + public SqlCall createCall( + SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { + return createCallForKind(this, pos, operands); + } + }; + } } } diff --git a/flink-table/flink-sql-parser/src/test/java/org/apache/flink/sql/parser/DeepCopyUnparsingTesterImpl.java b/flink-table/flink-sql-parser/src/test/java/org/apache/flink/sql/parser/DeepCopyUnparsingTesterImpl.java index 8cd89fc834a35..dff1b460998cc 100644 --- a/flink-table/flink-sql-parser/src/test/java/org/apache/flink/sql/parser/DeepCopyUnparsingTesterImpl.java +++ b/flink-table/flink-sql-parser/src/test/java/org/apache/flink/sql/parser/DeepCopyUnparsingTesterImpl.java @@ -120,13 +120,13 @@ public void checkList( if (!containsFlinkNode(sqlNodeList)) { return; } - final String sql1 = toSqlString(sqlNodeList, simple()); + final String sql = toSqlString(sqlNodeList, simple()); // Make a deep copy of the SqlNodeList, unparse it. - final SqlNodeList sqlNodeList3 = (SqlNodeList) deepCopy(sqlNodeList); - final String sql4 = toSqlString(sqlNodeList3, simple()); + final SqlNodeList deepCopiedSqlNodeList = (SqlNodeList) deepCopy(sqlNodeList); + final String sqlFromDeepCopy = toSqlString(deepCopiedSqlNodeList, simple()); // Should be the same as we started with. - assertThat(sql4).isEqualTo(sql1); + assertThat(sqlFromDeepCopy).isEqualTo(sql); } @Override diff --git a/flink-table/flink-sql-parser/src/test/java/org/apache/flink/sql/parser/FlinkSqlUnParserTest.java b/flink-table/flink-sql-parser/src/test/java/org/apache/flink/sql/parser/FlinkSqlUnParserTest.java index 2fa10002701f8..d6f34d8ed6949 100644 --- a/flink-table/flink-sql-parser/src/test/java/org/apache/flink/sql/parser/FlinkSqlUnParserTest.java +++ b/flink-table/flink-sql-parser/src/test/java/org/apache/flink/sql/parser/FlinkSqlUnParserTest.java @@ -39,8 +39,6 @@ public FlinkSqlUnParserTest() {} public SqlParserFixture fixture() { return super.fixture() - // Replace back with UnparsingTesterImpl after upgrading Calcite to 1.42.0 - // since after that the logic is embedded into Calcite .withTester(new DeepCopyUnparsingTesterImpl()) .withConfig(c -> c.withParserFactory(FlinkSqlParserImpl.FACTORY)); } diff --git a/flink-table/flink-sql-parser/src/test/java/org/apache/flink/sql/parser/MaterializedTableStatementUnParserTest.java b/flink-table/flink-sql-parser/src/test/java/org/apache/flink/sql/parser/MaterializedTableStatementUnParserTest.java index 92aaab23546ad..e7dd54dba16ef 100644 --- a/flink-table/flink-sql-parser/src/test/java/org/apache/flink/sql/parser/MaterializedTableStatementUnParserTest.java +++ b/flink-table/flink-sql-parser/src/test/java/org/apache/flink/sql/parser/MaterializedTableStatementUnParserTest.java @@ -39,8 +39,6 @@ public MaterializedTableStatementUnParserTest() {} public SqlParserFixture fixture() { return super.fixture() - // Replace back with UnparsingTesterImpl after upgrading Calcite to 1.42.0 - // since after that the logic is embedded into Calcite .withTester(new DeepCopyUnparsingTesterImpl()) .withConfig(c -> c.withParserFactory(FlinkSqlParserImpl.FACTORY)); }