From dbfcf4ad619d34203afdd150f4da0de247ae1228 Mon Sep 17 00:00:00 2001 From: Monica Gupta Date: Tue, 20 Oct 2020 13:53:34 -0700 Subject: [PATCH] Fix for queries with comments separated by new lines (#1101) * Fix for queries with comments separated by new lines * Mimic Kusto behaviour for comments ran as query * extra check * address comment Co-authored-by: Monica Gupta --- .../DataSource/KustoClient.cs | 56 ++++++++++++------- 1 file changed, 37 insertions(+), 19 deletions(-) diff --git a/src/Microsoft.Kusto.ServiceLayer/DataSource/KustoClient.cs b/src/Microsoft.Kusto.ServiceLayer/DataSource/KustoClient.cs index e7f3001e..f8956650 100644 --- a/src/Microsoft.Kusto.ServiceLayer/DataSource/KustoClient.cs +++ b/src/Microsoft.Kusto.ServiceLayer/DataSource/KustoClient.cs @@ -146,10 +146,7 @@ namespace Microsoft.Kusto.ServiceLayer.DataSource return kcsb; } - public IDataReader ExecuteQuery(string query, CancellationToken cancellationToken, string databaseName = null, int retryCount = 1) - { - ValidationUtils.IsArgumentNotNullOrWhiteSpace(query, nameof(query)); - + private ClientRequestProperties GetCLientRequestProperties(CancellationToken cancellationToken){ var clientRequestProperties = new ClientRequestProperties { ClientRequestId = Guid.NewGuid().ToString() @@ -157,32 +154,53 @@ namespace Microsoft.Kusto.ServiceLayer.DataSource clientRequestProperties.SetOption(ClientRequestProperties.OptionNoTruncation, true); cancellationToken.Register(() => CancelQuery(clientRequestProperties.ClientRequestId)); + return clientRequestProperties; + } + + public IDataReader ExecuteQuery(string query, CancellationToken cancellationToken, string databaseName = null, int retryCount = 1) + { + ValidationUtils.IsArgumentNotNullOrWhiteSpace(query, nameof(query)); + var script = CodeScript.From(query, GlobalState.Default); IDataReader[] origReaders = new IDataReader[script.Blocks.Count]; try { + var numOfQueries = 0; Parallel.ForEach(script.Blocks, (codeBlock, state, index) => { var minimalQuery = codeBlock.Service.GetMinimalText(MinimalTextKind.RemoveLeadingWhitespaceAndComments); - IDataReader origReader; - - if(minimalQuery.StartsWith(".") && !minimalQuery.StartsWith(".show")){ - origReader = _kustoAdminProvider.ExecuteControlCommand( - KustoQueryUtils.IsClusterLevelQuery(minimalQuery) ? "" : databaseName, - minimalQuery, - clientRequestProperties); - } - else{ - origReader = _kustoQueryProvider.ExecuteQuery( - KustoQueryUtils.IsClusterLevelQuery(minimalQuery) ? "" : databaseName, - minimalQuery, - clientRequestProperties); - } + if(!string.IsNullOrEmpty(minimalQuery)){ // Query is empty in case of comments + IDataReader origReader; + var clientRequestProperties = GetCLientRequestProperties(cancellationToken); - origReaders[index] = origReader; + if(minimalQuery.StartsWith(".") && !minimalQuery.StartsWith(".show")){ + origReader = _kustoAdminProvider.ExecuteControlCommand( + KustoQueryUtils.IsClusterLevelQuery(minimalQuery) ? "" : databaseName, + minimalQuery, + clientRequestProperties); + } + else{ + origReader = _kustoQueryProvider.ExecuteQuery( + KustoQueryUtils.IsClusterLevelQuery(minimalQuery) ? "" : databaseName, + minimalQuery, + clientRequestProperties); + } + + origReaders[index] = origReader; + numOfQueries++; + } }); + + if (numOfQueries == 0 && origReaders.Length > 0) // Covers the scenario when user tries to run comments. + { + var clientRequestProperties = GetCLientRequestProperties(cancellationToken); + origReaders[0] = _kustoQueryProvider.ExecuteQuery( + KustoQueryUtils.IsClusterLevelQuery(query) ? "" : databaseName, + query, + clientRequestProperties); + } return new KustoResultsReader(origReaders); }