From 3113481995e5336fec32cd37292b10eff91a49d5 Mon Sep 17 00:00:00 2001 From: gamewizzzz Date: Thu, 25 Jul 2024 13:51:33 -0500 Subject: [PATCH] Modified capitalization in metadata queries (#1896) (#1921) ## Why make this change? - Resolves #1896 ## What is this change? - These changes impact API builder startup. The query output has not been modified, but certain field references are capitalized. - The proper case is used to avoid "field not found" and "key field not found" errors when the database collation is case-sensitive. ## How was this tested? - [x] Integration Tests - Ran locally; about 5 tests failed, but it was the same ones that failed before modifications - [ ] Unit Tests ## Sample Request(s) - N/A --------- Co-authored-by: Sean Leonard Co-authored-by: Aniruddh Munde Co-authored-by: RubenCerna2079 <32799214+RubenCerna2079@users.noreply.github.com> Co-authored-by: Ruben Cerna --- src/Core/Resolvers/DWSqlQueryBuilder.cs | 8 ++++---- src/Core/Resolvers/MsSqlQueryBuilder.cs | 8 ++++---- src/Core/Resolvers/MySqlQueryBuilder.cs | 4 ++-- src/Core/Resolvers/PostgresQueryBuilder.cs | 2 +- .../Services/MetadataProviders/SqlMetadataProvider.cs | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/Core/Resolvers/DWSqlQueryBuilder.cs b/src/Core/Resolvers/DWSqlQueryBuilder.cs index cb0159154b..e1768a97df 100644 --- a/src/Core/Resolvers/DWSqlQueryBuilder.cs +++ b/src/Core/Resolvers/DWSqlQueryBuilder.cs @@ -324,10 +324,10 @@ public string BuildStoredProcedureResultDetailsQuery(string databaseObjectName) public string BuildQueryToGetReadOnlyColumns(string schemaParamName, string tableParamName) { // For 'timestamp' columns sc.is_computed = 0. - string query = "SELECT ifsc.column_name from sys.columns as sc INNER JOIN INFORMATION_SCHEMA.COLUMNS as ifsc " + - "ON (sc.is_computed = 1 or ifsc.data_type = 'timestamp') " + - $"AND sc.object_id = object_id({schemaParamName}+'.'+{tableParamName}) and ifsc.table_name = {tableParamName} " + - $"AND ifsc.table_schema = {schemaParamName} and ifsc.column_name = sc.name;"; + string query = "SELECT ifsc.COLUMN_NAME from sys.columns as sc INNER JOIN INFORMATION_SCHEMA.COLUMNS as ifsc " + + "ON (sc.is_computed = 1 or ifsc.DATA_TYPE = 'timestamp') " + + $"AND sc.object_id = object_id({schemaParamName}+'.'+{tableParamName}) AND ifsc.TABLE_SCHEMA = {schemaParamName} " + + $"AND ifsc.TABLE_NAME = {tableParamName} AND ifsc.COLUMN_NAME = sc.name;"; return query; } diff --git a/src/Core/Resolvers/MsSqlQueryBuilder.cs b/src/Core/Resolvers/MsSqlQueryBuilder.cs index 493b7bc51d..43e7fd775f 100644 --- a/src/Core/Resolvers/MsSqlQueryBuilder.cs +++ b/src/Core/Resolvers/MsSqlQueryBuilder.cs @@ -509,10 +509,10 @@ public string BuildStoredProcedureResultDetailsQuery(string databaseObjectName) public string BuildQueryToGetReadOnlyColumns(string schemaParamName, string tableParamName) { // For 'timestamp' columns sc.is_computed = 0. - string query = "SELECT ifsc.column_name from sys.columns as sc INNER JOIN information_schema.columns as ifsc " + - "ON (sc.is_computed = 1 or ifsc.data_type = 'timestamp') " + - $"AND sc.object_id = object_id({schemaParamName}+'.'+{tableParamName}) and ifsc.table_name = {tableParamName} " + - $"AND ifsc.table_schema = {schemaParamName} and ifsc.column_name = sc.name;"; + string query = "SELECT ifsc.COLUMN_NAME from sys.columns as sc INNER JOIN INFORMATION_SCHEMA.COLUMNS as ifsc " + + "ON (sc.is_computed = 1 or ifsc.DATA_TYPE = 'timestamp') " + + $"AND sc.object_id = object_id({schemaParamName}+'.'+{tableParamName}) AND ifsc.TABLE_SCHEMA = {schemaParamName} " + + $"AND ifsc.TABLE_NAME = {tableParamName} AND ifsc.COLUMN_NAME = sc.name;"; return query; } diff --git a/src/Core/Resolvers/MySqlQueryBuilder.cs b/src/Core/Resolvers/MySqlQueryBuilder.cs index 3893000ff9..96f4444a26 100644 --- a/src/Core/Resolvers/MySqlQueryBuilder.cs +++ b/src/Core/Resolvers/MySqlQueryBuilder.cs @@ -356,8 +356,8 @@ private static string GetMySQLDefaultValue(ColumnDefinition column) /// public string BuildQueryToGetReadOnlyColumns(string schemaParamName, string tableParamName) { - string query = "select column_name as column_name from information_schema.columns " + - $"where table_schema = {schemaParamName} and table_name = {tableParamName} and generation_expression != '';"; + string query = "select COLUMN_NAME as COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS " + + $"where TABLE_SCHEMA = {schemaParamName} and TABLE_NAME = {tableParamName} and GENERATION_EXPRESSION != '';"; return query; } diff --git a/src/Core/Resolvers/PostgresQueryBuilder.cs b/src/Core/Resolvers/PostgresQueryBuilder.cs index c779252cfe..ebb77d4487 100644 --- a/src/Core/Resolvers/PostgresQueryBuilder.cs +++ b/src/Core/Resolvers/PostgresQueryBuilder.cs @@ -228,7 +228,7 @@ public string BuildStoredProcedureResultDetailsQuery(string databaseObjectName) /// public string BuildQueryToGetReadOnlyColumns(string schemaParamName, string tableParamName) { - string query = "SELECT attname AS column_name FROM pg_attribute " + + string query = $"SELECT attname AS {QuoteIdentifier("COLUMN_NAME")} FROM pg_attribute " + $"WHERE attrelid = ({schemaParamName} || '.' || {tableParamName})::regclass AND attgenerated = 's';"; return query; } diff --git a/src/Core/Services/MetadataProviders/SqlMetadataProvider.cs b/src/Core/Services/MetadataProviders/SqlMetadataProvider.cs index 839ac05785..1e6e61edf0 100644 --- a/src/Core/Services/MetadataProviders/SqlMetadataProvider.cs +++ b/src/Core/Services/MetadataProviders/SqlMetadataProvider.cs @@ -1841,7 +1841,7 @@ private async Task> foreach (DbResultSetRow readOnlyFieldRowWithProperties in readOnlyFieldRowsWithProperties.Rows) { Dictionary readOnlyFieldInfo = readOnlyFieldRowWithProperties.Columns; - string fieldName = (string)readOnlyFieldInfo["column_name"]!; + string fieldName = (string)readOnlyFieldInfo["COLUMN_NAME"]!; readOnlyFields.Add(fieldName); }