From 003783058c3f43613358cc1e4d210170c96036fa Mon Sep 17 00:00:00 2001 From: snuyanzin Date: Wed, 21 Aug 2024 13:45:19 +0200 Subject: [PATCH] [FLINK-36126] Qualification of current catalog and current database should happen during execution, not parsing --- .../flink/sql/parser/dql/SqlShowCall.java | 1 + .../operations/AbstractShowOperation.java | 22 ++++++++-- .../operations/ShowColumnsOperation.java | 1 + .../operations/ShowDatabasesOperation.java | 11 +++-- .../operations/ShowFunctionsOperation.java | 16 +++++-- .../operations/ShowProceduresOperation.java | 29 +++++++++---- .../table/operations/ShowTablesOperation.java | 29 ++++++++----- .../table/operations/ShowViewsOperation.java | 29 ++++++++----- .../converters/AbstractSqlShowConverter.java | 30 ++++--------- .../converters/SqlShowDatabasesConverter.java | 3 +- .../converters/SqlShowFunctionsConverter.java | 21 ++++----- .../converters/SqlShowProcedureConverter.java | 14 +++--- .../converters/SqlShowTablesConverter.java | 14 +++--- .../converters/SqlShowViewsConverter.java | 14 +++--- .../SqlShowToOperationConverterTest.java | 43 +++++++++++++++++++ 15 files changed, 182 insertions(+), 95 deletions(-) create mode 100644 flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/operations/SqlShowToOperationConverterTest.java 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 3b855812a798b5..d769d3a82132c8 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 @@ -30,6 +30,7 @@ import java.util.List; import java.util.Objects; +/** Abstract class for SHOW sql call. */ public abstract class SqlShowCall extends SqlCall { private final String preposition; private final SqlIdentifier sqlIdentifier; diff --git a/flink-table/flink-table-api-java/src/main/java/org/apache/flink/table/operations/AbstractShowOperation.java b/flink-table/flink-table-api-java/src/main/java/org/apache/flink/table/operations/AbstractShowOperation.java index 9a4984e317ebb2..0f9f69c81db340 100644 --- a/flink-table/flink-table-api-java/src/main/java/org/apache/flink/table/operations/AbstractShowOperation.java +++ b/flink-table/flink-table-api-java/src/main/java/org/apache/flink/table/operations/AbstractShowOperation.java @@ -38,12 +38,14 @@ */ @Internal public abstract class AbstractShowOperation implements ShowOperation { - protected final String catalogName; - protected final @Nullable String preposition; - protected final @Nullable ShowLikeOperator likeOp; + private final @Nullable String catalogName; + private final @Nullable String preposition; + private final @Nullable ShowLikeOperator likeOp; public AbstractShowOperation( - String catalogName, @Nullable String preposition, @Nullable ShowLikeOperator likeOp) { + @Nullable String catalogName, + @Nullable String preposition, + @Nullable ShowLikeOperator likeOp) { this.catalogName = catalogName; this.preposition = preposition; this.likeOp = likeOp; @@ -55,6 +57,18 @@ public AbstractShowOperation( protected abstract String getColumnName(); + public String getCatalogName() { + return catalogName; + } + + public ShowLikeOperator getLikeOp() { + return likeOp; + } + + public String getPreposition() { + return preposition; + } + @Override public TableResultInternal execute(Context ctx) { final Collection views = retrieveDataForTableResult(ctx); diff --git a/flink-table/flink-table-api-java/src/main/java/org/apache/flink/table/operations/ShowColumnsOperation.java b/flink-table/flink-table-api-java/src/main/java/org/apache/flink/table/operations/ShowColumnsOperation.java index 979a2c00de3e19..8d12437a89727f 100644 --- a/flink-table/flink-table-api-java/src/main/java/org/apache/flink/table/operations/ShowColumnsOperation.java +++ b/flink-table/flink-table-api-java/src/main/java/org/apache/flink/table/operations/ShowColumnsOperation.java @@ -83,6 +83,7 @@ public TableResultInternal execute(Context ctx) { ResolvedSchema schema = result.get().getResolvedSchema(); Object[][] rows = generateTableColumnsRows(schema); + ShowLikeOperator likeOp = getLikeOp(); if (likeOp != null) { rows = Arrays.stream(rows) diff --git a/flink-table/flink-table-api-java/src/main/java/org/apache/flink/table/operations/ShowDatabasesOperation.java b/flink-table/flink-table-api-java/src/main/java/org/apache/flink/table/operations/ShowDatabasesOperation.java index 80bbf6cb774be0..7819ec7f8ad84d 100644 --- a/flink-table/flink-table-api-java/src/main/java/org/apache/flink/table/operations/ShowDatabasesOperation.java +++ b/flink-table/flink-table-api-java/src/main/java/org/apache/flink/table/operations/ShowDatabasesOperation.java @@ -38,22 +38,25 @@ public class ShowDatabasesOperation extends AbstractShowOperation { public ShowDatabasesOperation( - String catalogName, @Nullable String preposition, @Nullable ShowLikeOperator likeOp) { + @Nullable String catalogName, + @Nullable String preposition, + @Nullable ShowLikeOperator likeOp) { super(catalogName, preposition, likeOp); } - public ShowDatabasesOperation(String catalogName, ShowLikeOperator likeOp) { + public ShowDatabasesOperation(@Nullable String catalogName, @Nullable ShowLikeOperator likeOp) { this(catalogName, null, likeOp); } - public ShowDatabasesOperation(String catalogName) { + public ShowDatabasesOperation(@Nullable String catalogName) { this(catalogName, null, null); } @Override protected Collection retrieveDataForTableResult(Context ctx) { final CatalogManager catalogManager = ctx.getCatalogManager(); - return catalogManager.getCatalogOrThrowException(catalogName).listDatabases(); + final String qualifiedCatalogName = catalogManager.qualifyCatalog(getCatalogName()); + return catalogManager.getCatalogOrThrowException(qualifiedCatalogName).listDatabases(); } @Override diff --git a/flink-table/flink-table-api-java/src/main/java/org/apache/flink/table/operations/ShowFunctionsOperation.java b/flink-table/flink-table-api-java/src/main/java/org/apache/flink/table/operations/ShowFunctionsOperation.java index 697432efc1c9db..a8cc592d9a89cb 100644 --- a/flink-table/flink-table-api-java/src/main/java/org/apache/flink/table/operations/ShowFunctionsOperation.java +++ b/flink-table/flink-table-api-java/src/main/java/org/apache/flink/table/operations/ShowFunctionsOperation.java @@ -57,7 +57,7 @@ public enum FunctionScope { private final FunctionScope functionScope; private final @Nullable String databaseName; - public ShowFunctionsOperation(String catalogName, String databaseName) { + public ShowFunctionsOperation(@Nullable String catalogName, @Nullable String databaseName) { // "SHOW FUNCTIONS" default is ALL scope this(FunctionScope.ALL, catalogName, databaseName, null); } @@ -73,8 +73,8 @@ public ShowFunctionsOperation( public ShowFunctionsOperation( FunctionScope functionScope, @Nullable String preposition, - String catalogName, - String databaseName, + @Nullable String catalogName, + @Nullable String databaseName, @Nullable ShowLikeOperator likeOp) { super(catalogName, preposition, likeOp); this.functionScope = functionScope; @@ -83,6 +83,8 @@ public ShowFunctionsOperation( @Override protected Collection retrieveDataForTableResult(Context ctx) { + final String preposition = getPreposition(); + final String catalogName = getCatalogName(); switch (functionScope) { case USER: if (preposition == null) { @@ -105,6 +107,14 @@ protected Collection retrieveDataForTableResult(Context ctx) { } } + public String getDatabaseName() { + return databaseName; + } + + public FunctionScope getFunctionScope() { + return functionScope; + } + @Override protected String getOperationName() { return functionScope == FunctionScope.ALL ? "SHOW FUNCTIONS" : "SHOW USER FUNCTIONS"; diff --git a/flink-table/flink-table-api-java/src/main/java/org/apache/flink/table/operations/ShowProceduresOperation.java b/flink-table/flink-table-api-java/src/main/java/org/apache/flink/table/operations/ShowProceduresOperation.java index 56d56d1f45b951..7307c159d74f77 100644 --- a/flink-table/flink-table-api-java/src/main/java/org/apache/flink/table/operations/ShowProceduresOperation.java +++ b/flink-table/flink-table-api-java/src/main/java/org/apache/flink/table/operations/ShowProceduresOperation.java @@ -41,11 +41,11 @@ @Internal public class ShowProceduresOperation extends AbstractShowOperation { - private final String databaseName; + private final @Nullable String databaseName; public ShowProceduresOperation( - String catalogName, - String databaseName, + @Nullable String catalogName, + @Nullable String databaseName, @Nullable String preposition, @Nullable ShowLikeOperator likeOp) { super(catalogName, preposition, likeOp); @@ -53,29 +53,40 @@ public ShowProceduresOperation( } public ShowProceduresOperation( - String catalogName, String databaseName, @Nullable ShowLikeOperator likeOp) { + @Nullable String catalogName, + @Nullable String databaseName, + @Nullable ShowLikeOperator likeOp) { this(catalogName, databaseName, null, likeOp); } @Override protected Collection retrieveDataForTableResult(Context ctx) { final CatalogManager catalogManager = ctx.getCatalogManager(); + final String qualifiedCatalogName = catalogManager.qualifyCatalog(getCatalogName()); + final String qualifiedDatabaseName = catalogManager.qualifyDatabase(databaseName); try { - if (preposition == null) { + if (getPreposition() == null) { // it's to show current_catalog.current_database - return catalogManager.getCatalogOrError(catalogName).listProcedures(databaseName); + return catalogManager + .getCatalogOrError(qualifiedCatalogName) + .listProcedures(qualifiedDatabaseName); } else { - Catalog catalog = catalogManager.getCatalogOrThrowException(catalogName); - return catalog.listProcedures(databaseName); + Catalog catalog = catalogManager.getCatalogOrThrowException(qualifiedCatalogName); + return catalog.listProcedures(qualifiedDatabaseName); } } catch (DatabaseNotExistException e) { throw new TableException( String.format( "Fail to show procedures because the Database `%s` to show from/in does not exist in Catalog `%s`.", - databaseName, catalogName)); + qualifiedDatabaseName, qualifiedCatalogName), + e); } } + public String getDatabaseName() { + return databaseName; + } + @Override protected String getOperationName() { return "SHOW PROCEDURES"; diff --git a/flink-table/flink-table-api-java/src/main/java/org/apache/flink/table/operations/ShowTablesOperation.java b/flink-table/flink-table-api-java/src/main/java/org/apache/flink/table/operations/ShowTablesOperation.java index 348c9df6c21127..b40b43ad7219e4 100644 --- a/flink-table/flink-table-api-java/src/main/java/org/apache/flink/table/operations/ShowTablesOperation.java +++ b/flink-table/flink-table-api-java/src/main/java/org/apache/flink/table/operations/ShowTablesOperation.java @@ -39,11 +39,11 @@ @Internal public class ShowTablesOperation extends AbstractShowOperation { - private final String databaseName; + private final @Nullable String databaseName; public ShowTablesOperation( - String catalogName, - String databaseName, + @Nullable String catalogName, + @Nullable String databaseName, @Nullable String preposition, @Nullable ShowLikeOperator likeOp) { super(catalogName, preposition, likeOp); @@ -51,31 +51,40 @@ public ShowTablesOperation( } public ShowTablesOperation( - String catalogName, String databaseName, @Nullable ShowLikeOperator likeOp) { + @Nullable String catalogName, + @Nullable String databaseName, + @Nullable ShowLikeOperator likeOp) { this(catalogName, databaseName, null, likeOp); } - public ShowTablesOperation(String catalogName, String databaseName) { + public ShowTablesOperation(@Nullable String catalogName, @Nullable String databaseName) { this(catalogName, databaseName, null); } @Override protected Set retrieveDataForTableResult(Context ctx) { final CatalogManager catalogManager = ctx.getCatalogManager(); - if (preposition == null) { + final String qualifiedCatalogName = catalogManager.qualifyCatalog(getCatalogName()); + final String qualifiedDatabaseName = catalogManager.qualifyDatabase(databaseName); + if (getPreposition() == null) { return catalogManager.listTables(); } else { - Catalog catalog = catalogManager.getCatalogOrThrowException(catalogName); - if (catalog.databaseExists(databaseName)) { - return catalogManager.listTables(catalogName, databaseName); + Catalog catalog = catalogManager.getCatalogOrThrowException(qualifiedCatalogName); + if (catalog.databaseExists(qualifiedDatabaseName)) { + return catalogManager.listTables(qualifiedCatalogName, qualifiedDatabaseName); } else { throw new ValidationException( String.format( - "Database '%s'.'%s' doesn't exist.", catalogName, databaseName)); + "Database '%s'.'%s' doesn't exist.", + qualifiedCatalogName, qualifiedDatabaseName)); } } } + public String getDatabaseName() { + return databaseName; + } + @Override protected String getOperationName() { return "SHOW TABLES"; diff --git a/flink-table/flink-table-api-java/src/main/java/org/apache/flink/table/operations/ShowViewsOperation.java b/flink-table/flink-table-api-java/src/main/java/org/apache/flink/table/operations/ShowViewsOperation.java index 180cea511e7d94..3555545b311f86 100644 --- a/flink-table/flink-table-api-java/src/main/java/org/apache/flink/table/operations/ShowViewsOperation.java +++ b/flink-table/flink-table-api-java/src/main/java/org/apache/flink/table/operations/ShowViewsOperation.java @@ -39,11 +39,11 @@ @Internal public class ShowViewsOperation extends AbstractShowOperation { - private final String databaseName; + private final @Nullable String databaseName; public ShowViewsOperation( - String catalogName, - String databaseName, + @Nullable String catalogName, + @Nullable String databaseName, @Nullable String preposition, @Nullable ShowLikeOperator likeOp) { super(catalogName, preposition, likeOp); @@ -51,11 +51,13 @@ public ShowViewsOperation( } public ShowViewsOperation( - String catalogName, String databaseName, @Nullable ShowLikeOperator likeOp) { + @Nullable String catalogName, + @Nullable String databaseName, + @Nullable ShowLikeOperator likeOp) { this(catalogName, databaseName, null, likeOp); } - public ShowViewsOperation(String catalogName, String databaseName) { + public ShowViewsOperation(@Nullable String catalogName, @Nullable String databaseName) { this(catalogName, databaseName, null); } @@ -66,20 +68,27 @@ protected String getOperationName() { protected Set retrieveDataForTableResult(Context ctx) { final CatalogManager catalogManager = ctx.getCatalogManager(); - if (preposition == null) { + final String qualifiedCatalogName = catalogManager.qualifyCatalog(getCatalogName()); + final String qualifiedDatabaseName = catalogManager.qualifyDatabase(databaseName); + if (getPreposition() == null) { return catalogManager.listViews(); } else { - Catalog catalog = catalogManager.getCatalogOrThrowException(catalogName); - if (catalog.databaseExists(databaseName)) { - return catalogManager.listViews(catalogName, databaseName); + Catalog catalog = catalogManager.getCatalogOrThrowException(qualifiedCatalogName); + if (catalog.databaseExists(qualifiedDatabaseName)) { + return catalogManager.listViews(qualifiedCatalogName, qualifiedDatabaseName); } else { throw new ValidationException( String.format( - "Database '%s'.'%s' doesn't exist.", catalogName, databaseName)); + "Database '%s'.'%s' doesn't exist.", + qualifiedCatalogName, qualifiedDatabaseName)); } } } + public String getDatabaseName() { + return databaseName; + } + @Override protected String getColumnName() { return "view name"; diff --git a/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/operations/converters/AbstractSqlShowConverter.java b/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/operations/converters/AbstractSqlShowConverter.java index 80b5d4d36136f3..b4e97bfea3f9e0 100644 --- a/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/operations/converters/AbstractSqlShowConverter.java +++ b/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/operations/converters/AbstractSqlShowConverter.java @@ -29,6 +29,7 @@ import java.util.List; +/** An abstract class for SHOW converters. */ public abstract class AbstractSqlShowConverter implements SqlNodeConverter { @@ -38,13 +39,8 @@ protected Operation convertShowOperation(T sqlShowCall, ConvertContext context) final CatalogManager catalogManager = context.getCatalogManager(); final String currentCatalogName = catalogManager.getCurrentCatalog(); final String currentDatabaseName = catalogManager.getCurrentDatabase(); - if (skipQualifyingDefaultCatalogAndDatabase()) { - return getOperationWithoutPrep( - currentCatalogName, currentDatabaseName, sqlShowCall, likeOp); - } - final String catalogName = catalogManager.qualifyCatalog(currentCatalogName); - final String databaseName = catalogManager.qualifyDatabase(currentDatabaseName); - return getOperationWithoutPrep(catalogName, databaseName, sqlShowCall, likeOp); + return getOperationWithoutPrep( + sqlShowCall, currentCatalogName, currentDatabaseName, likeOp); } final List sqlIdentifierNameList = sqlShowCall.getSqlIdentifierNameList(); if (sqlIdentifierNameList.size() > 2) { @@ -64,14 +60,8 @@ protected Operation convertShowOperation(T sqlShowCall, ConvertContext context) sqlIdentifierNameList.size() == 1 ? sqlIdentifierNameList.get(0) : sqlIdentifierNameList.get(1); - final String qualifiedCatalogName = catalogManager.qualifyCatalog(catalogName); - final String qualifiedDatabaseName = catalogManager.qualifyDatabase(databaseName); return getOperation( - sqlShowCall, - qualifiedCatalogName, - qualifiedDatabaseName, - sqlShowCall.getPreposition(), - likeOp); + sqlShowCall, catalogName, databaseName, sqlShowCall.getPreposition(), likeOp); } public ShowLikeOperator getLikeOp(SqlShowCall sqlShowCall) { @@ -81,22 +71,18 @@ public ShowLikeOperator getLikeOp(SqlShowCall sqlShowCall) { } public abstract Operation getOperationWithoutPrep( - String catalogName, - String databaseName, T sqlShowCall, + @Nullable String catalogName, + @Nullable String databaseName, @Nullable ShowLikeOperator likeOp); public abstract Operation getOperation( T sqlShowCall, - String catalogName, - String databaseName, + @Nullable String catalogName, + @Nullable String databaseName, @Nullable String prep, @Nullable ShowLikeOperator likeOp); @Override public abstract Operation convertSqlNode(T node, ConvertContext context); - - protected boolean skipQualifyingDefaultCatalogAndDatabase() { - return false; - } } diff --git a/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/operations/converters/SqlShowDatabasesConverter.java b/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/operations/converters/SqlShowDatabasesConverter.java index 47c1ec9a781b32..577d4b73bff9b0 100644 --- a/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/operations/converters/SqlShowDatabasesConverter.java +++ b/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/operations/converters/SqlShowDatabasesConverter.java @@ -37,8 +37,7 @@ public Operation convertSqlNode(SqlShowDatabases sqlShowDatabases, ConvertContex if (sqlShowDatabases.getPreposition() == null) { final CatalogManager catalogManager = context.getCatalogManager(); final String currentCatalogName = catalogManager.getCurrentCatalog(); - final String qualifiedCatalogName = catalogManager.qualifyCatalog(currentCatalogName); - return new ShowDatabasesOperation(qualifiedCatalogName, likeOp); + return new ShowDatabasesOperation(currentCatalogName, likeOp); } else { return new ShowDatabasesOperation( sqlShowDatabases.getCatalogName(), sqlShowDatabases.getPreposition(), likeOp); diff --git a/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/operations/converters/SqlShowFunctionsConverter.java b/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/operations/converters/SqlShowFunctionsConverter.java index 38a67992230b79..d220eea4bba640 100644 --- a/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/operations/converters/SqlShowFunctionsConverter.java +++ b/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/operations/converters/SqlShowFunctionsConverter.java @@ -24,15 +24,17 @@ import org.apache.flink.table.operations.ShowFunctionsOperation.FunctionScope; import org.apache.flink.table.operations.utils.ShowLikeOperator; +import javax.annotation.Nullable; + /** A converter for {@link SqlShowFunctions}. */ public class SqlShowFunctionsConverter extends AbstractSqlShowConverter { @Override public Operation getOperationWithoutPrep( - String catalogName, - String databaseName, SqlShowFunctions sqlShowFunctions, - ShowLikeOperator likeOp) { + @Nullable String catalogName, + @Nullable String databaseName, + @Nullable ShowLikeOperator likeOp) { final FunctionScope functionScope = getFunctionScope(sqlShowFunctions); return new ShowFunctionsOperation(functionScope, catalogName, databaseName, likeOp); } @@ -40,10 +42,10 @@ public Operation getOperationWithoutPrep( @Override public Operation getOperation( SqlShowFunctions sqlShowFunctions, - String catalogName, - String databaseName, + @Nullable String catalogName, + @Nullable String databaseName, String prep, - ShowLikeOperator likeOp) { + @Nullable ShowLikeOperator likeOp) { final FunctionScope functionScope = getFunctionScope(sqlShowFunctions); return new ShowFunctionsOperation(functionScope, prep, catalogName, databaseName, likeOp); } @@ -56,11 +58,4 @@ public Operation convertSqlNode(SqlShowFunctions sqlShowFunctions, ConvertContex private static FunctionScope getFunctionScope(SqlShowFunctions sqlShowFunctions) { return sqlShowFunctions.requireUser() ? FunctionScope.USER : FunctionScope.ALL; } - - @Override - protected boolean skipQualifyingDefaultCatalogAndDatabase() { - // It should be supported to list functions with unset catalog - // for more info FLINK-33093 - return true; - } } diff --git a/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/operations/converters/SqlShowProcedureConverter.java b/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/operations/converters/SqlShowProcedureConverter.java index 1be21057cf7c54..c8c6102b3500a6 100644 --- a/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/operations/converters/SqlShowProcedureConverter.java +++ b/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/operations/converters/SqlShowProcedureConverter.java @@ -23,25 +23,27 @@ import org.apache.flink.table.operations.ShowProceduresOperation; import org.apache.flink.table.operations.utils.ShowLikeOperator; +import javax.annotation.Nullable; + /** A converter for {@link SqlShowProcedures}. */ public class SqlShowProcedureConverter extends AbstractSqlShowConverter { @Override public Operation getOperationWithoutPrep( - String catalogName, - String databaseName, SqlShowProcedures sqlShowCall, - ShowLikeOperator likeOp) { + @Nullable String catalogName, + @Nullable String databaseName, + @Nullable ShowLikeOperator likeOp) { return new ShowProceduresOperation(catalogName, databaseName, likeOp); } @Override public Operation getOperation( SqlShowProcedures sqlShowCall, - String catalogName, - String databaseName, + @Nullable String catalogName, + @Nullable String databaseName, String prep, - ShowLikeOperator likeOp) { + @Nullable ShowLikeOperator likeOp) { return new ShowProceduresOperation(catalogName, databaseName, prep, likeOp); } diff --git a/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/operations/converters/SqlShowTablesConverter.java b/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/operations/converters/SqlShowTablesConverter.java index fb97902d722846..d252b5130852fc 100644 --- a/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/operations/converters/SqlShowTablesConverter.java +++ b/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/operations/converters/SqlShowTablesConverter.java @@ -23,23 +23,25 @@ import org.apache.flink.table.operations.ShowTablesOperation; import org.apache.flink.table.operations.utils.ShowLikeOperator; +import javax.annotation.Nullable; + public class SqlShowTablesConverter extends AbstractSqlShowConverter { @Override public Operation getOperationWithoutPrep( - String catalogName, - String databaseName, SqlShowTables sqlShowCall, - ShowLikeOperator likeOp) { + @Nullable String catalogName, + @Nullable String databaseName, + @Nullable ShowLikeOperator likeOp) { return new ShowTablesOperation(catalogName, databaseName, likeOp); } @Override public Operation getOperation( SqlShowTables sqlShowCall, - String catalogName, - String databaseName, + @Nullable String catalogName, + @Nullable String databaseName, String prep, - ShowLikeOperator likeOp) { + @Nullable ShowLikeOperator likeOp) { return new ShowTablesOperation(catalogName, databaseName, prep, likeOp); } diff --git a/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/operations/converters/SqlShowViewsConverter.java b/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/operations/converters/SqlShowViewsConverter.java index 67c3fed5fb06b1..b2f89a9a7371cf 100644 --- a/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/operations/converters/SqlShowViewsConverter.java +++ b/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/operations/converters/SqlShowViewsConverter.java @@ -23,23 +23,25 @@ import org.apache.flink.table.operations.ShowViewsOperation; import org.apache.flink.table.operations.utils.ShowLikeOperator; +import javax.annotation.Nullable; + public class SqlShowViewsConverter extends AbstractSqlShowConverter { @Override public Operation getOperationWithoutPrep( - String catalogName, - String databaseName, SqlShowViews sqlShowCall, - ShowLikeOperator likeOp) { + @Nullable String catalogName, + @Nullable String databaseName, + @Nullable ShowLikeOperator likeOp) { return new ShowViewsOperation(catalogName, databaseName, likeOp); } @Override public Operation getOperation( SqlShowViews sqlShowCall, - String catalogName, - String databaseName, + @Nullable String catalogName, + @Nullable String databaseName, String prep, - ShowLikeOperator likeOp) { + @Nullable ShowLikeOperator likeOp) { return new ShowViewsOperation(catalogName, databaseName, prep, likeOp); } diff --git a/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/operations/SqlShowToOperationConverterTest.java b/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/operations/SqlShowToOperationConverterTest.java new file mode 100644 index 00000000000000..14fdb23b93a48c --- /dev/null +++ b/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/operations/SqlShowToOperationConverterTest.java @@ -0,0 +1,43 @@ +package org.apache.flink.table.planner.operations; + +import org.apache.flink.table.catalog.exceptions.DatabaseNotExistException; +import org.apache.flink.table.catalog.exceptions.TableAlreadyExistException; +import org.apache.flink.table.catalog.exceptions.TableNotExistException; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +public class SqlShowToOperationConverterTest extends SqlNodeToOperationConversionTestBase { + + @BeforeEach + public void before() throws TableAlreadyExistException, DatabaseNotExistException { + // Do nothing + // No need to create schema, tables and etc. since the test executes for unset catalog and + // database + } + + @AfterEach + public void after() throws TableNotExistException { + // Do nothing + } + + @ParameterizedTest + @ValueSource(strings = {"SHOW TABLES", "SHOW VIEWS", "SHOW FUNCTIONS", "SHOW PROCEDURES"}) + void testParseShowFunctionForUnsetCatalog(String sql) { + catalogManager.setCurrentCatalog(null); + // No exception should be thrown during parsing. + // Validation exception should be thrown while execution. + parse(sql); + } + + @ParameterizedTest + @ValueSource(strings = {"SHOW TABLES", "SHOW VIEWS", "SHOW FUNCTIONS", "SHOW PROCEDURES"}) + void testParseShowFunctionForUnsetDatabase(String sql) { + catalogManager.setCurrentDatabase(null); + // No exception should be thrown during parsing. + // Validation exception should be thrown while execution. + parse(sql); + } +}