diff --git a/src/Core/Resolvers/DWSqlQueryBuilder.cs b/src/Core/Resolvers/DWSqlQueryBuilder.cs index 7710b3fdce..5215deae18 100644 --- a/src/Core/Resolvers/DWSqlQueryBuilder.cs +++ b/src/Core/Resolvers/DWSqlQueryBuilder.cs @@ -432,5 +432,11 @@ private string BuildAggregationColumns(GroupByMetadata metadata) { return string.Join(", ", metadata.Aggregations.Select(aggregation => Build(aggregation.Column, useAlias: true))); } + + public string QuoteTableNameAsDBConnectionParam(string param) + { + // Table names in DWSql should not be quoted when used as DB Connection Params. + return param; + } } } diff --git a/src/Core/Resolvers/IQueryBuilder.cs b/src/Core/Resolvers/IQueryBuilder.cs index f86dd26d2e..3a14e472cd 100644 --- a/src/Core/Resolvers/IQueryBuilder.cs +++ b/src/Core/Resolvers/IQueryBuilder.cs @@ -84,5 +84,11 @@ public interface IQueryBuilder /// Adds database specific quotes to string identifier /// public string QuoteIdentifier(string identifier); + + /// + /// Adds database specific quotes to the table name when used as part of a + /// DB Connection Param. + /// + public string QuoteTableNameAsDBConnectionParam(string param); } } diff --git a/src/Core/Resolvers/MsSqlQueryBuilder.cs b/src/Core/Resolvers/MsSqlQueryBuilder.cs index 34f38b0eaf..40f201387f 100644 --- a/src/Core/Resolvers/MsSqlQueryBuilder.cs +++ b/src/Core/Resolvers/MsSqlQueryBuilder.cs @@ -594,5 +594,11 @@ public string BuildFetchEnabledTriggersQuery() return query; } + + public string QuoteTableNameAsDBConnectionParam(string param) + { + // Table names in MSSQL should not be quoted when used as DB Connection Params. + return param; + } } } diff --git a/src/Core/Resolvers/MySqlQueryBuilder.cs b/src/Core/Resolvers/MySqlQueryBuilder.cs index 2727bd4b9d..e8300973a4 100644 --- a/src/Core/Resolvers/MySqlQueryBuilder.cs +++ b/src/Core/Resolvers/MySqlQueryBuilder.cs @@ -367,5 +367,11 @@ public string BuildStoredProcedureResultDetailsQuery(string databaseObjectName) { throw new NotImplementedException(); } + + public string QuoteTableNameAsDBConnectionParam(string param) + { + // Table names in MySQL should not be quoted when used as DB Connection Params. + return param; + } } } diff --git a/src/Core/Resolvers/PostgresQueryBuilder.cs b/src/Core/Resolvers/PostgresQueryBuilder.cs index 73c9bc907f..244b1a45b8 100644 --- a/src/Core/Resolvers/PostgresQueryBuilder.cs +++ b/src/Core/Resolvers/PostgresQueryBuilder.cs @@ -241,5 +241,12 @@ public string BuildQueryToGetReadOnlyColumns(string schemaParamName, string tabl $"WHERE attrelid = ({schemaParamName} || '.' || {tableParamName})::regclass AND attgenerated = 's';"; return query; } + + public string QuoteTableNameAsDBConnectionParam(string param) + { + // PostreSQL uses same quoting for table name as DB Connection Param + // as when used directly in SQL text. + return QuoteIdentifier(param); + } } } diff --git a/src/Core/Services/MetadataProviders/SqlMetadataProvider.cs b/src/Core/Services/MetadataProviders/SqlMetadataProvider.cs index 1e6e61edf0..40af0182e3 100644 --- a/src/Core/Services/MetadataProviders/SqlMetadataProvider.cs +++ b/src/Core/Services/MetadataProviders/SqlMetadataProvider.cs @@ -1355,12 +1355,13 @@ private async Task PopulateSourceDefinitionAsync( private async Task PopulateColumnDefinitionsWithReadOnlyFlag(string tableName, string schemaOrDatabaseName, SourceDefinition sourceDefinition) { string schemaOrDatabaseParamName = $"{BaseQueryStructure.PARAM_NAME_PREFIX}param0"; + string quotedTableName = SqlQueryBuilder.QuoteTableNameAsDBConnectionParam(tableName); string tableParamName = $"{BaseQueryStructure.PARAM_NAME_PREFIX}param1"; string queryToGetReadOnlyColumns = SqlQueryBuilder.BuildQueryToGetReadOnlyColumns(schemaOrDatabaseParamName, tableParamName); Dictionary parameters = new() { { schemaOrDatabaseParamName, new(schemaOrDatabaseName, DbType.String) }, - { tableParamName, new(tableName, DbType.String) } + { tableParamName, new(quotedTableName, DbType.String) } }; List? readOnlyFields = await QueryExecutor.ExecuteQueryAsync(