internal TryCatch <PartitionedQueryExecutionInfoInternal> TryGetPartitionedQueryExecutionInfoInternal( string querySpecJsonString, PartitionKeyDefinition partitionKeyDefinition, bool requireFormattableOrderByQuery, bool isContinuationExpected, bool allowNonValueAggregateQuery, bool hasLogicalPartitionKey, bool allowDCount, bool useSystemPrefix) { if (querySpecJsonString == null || partitionKeyDefinition == null) { return(TryCatch <PartitionedQueryExecutionInfoInternal> .FromResult(DefaultInfoInternal)); } List <string> paths = new List <string>(partitionKeyDefinition.Paths); List <IReadOnlyList <string> > pathPartsList = new List <IReadOnlyList <string> >(paths.Count); uint[] partsLengths = new uint[paths.Count]; int allPartsLength = 0; for (int i = 0; i < paths.Count; i++) { IReadOnlyList <string> pathParts = PathParser.GetPathParts(paths[i]); partsLengths[i] = (uint)pathParts.Count; pathPartsList.Add(pathParts); allPartsLength += pathParts.Count; } string[] allParts = new string[allPartsLength]; int allPartsIndex = 0; foreach (IReadOnlyList <string> pathParts in pathPartsList) { foreach (string part in pathParts) { allParts[allPartsIndex++] = part; } } PartitionKind partitionKind = partitionKeyDefinition.Kind; GeospatialType defaultGeopatialType = GeospatialType.Geography; this.Initialize(); Span <byte> buffer = stackalloc byte[QueryPartitionProvider.InitialBufferSize]; uint errorCode; uint serializedQueryExecutionInfoResultLength; unsafe { ServiceInteropWrapper.PartitionKeyRangesApiOptions partitionKeyRangesApiOptions = new ServiceInteropWrapper.PartitionKeyRangesApiOptions() { bAllowDCount = Convert.ToInt32(allowDCount), bAllowNonValueAggregateQuery = Convert.ToInt32(allowNonValueAggregateQuery), bHasLogicalPartitionKey = Convert.ToInt32(hasLogicalPartitionKey), bIsContinuationExpected = Convert.ToInt32(isContinuationExpected), bRequireFormattableOrderByQuery = Convert.ToInt32(requireFormattableOrderByQuery), bUseSystemPrefix = Convert.ToInt32(useSystemPrefix), eGeospatialType = Convert.ToInt32(defaultGeopatialType), ePartitionKind = Convert.ToInt32(partitionKind) }; fixed(byte *bytePtr = buffer) { errorCode = ServiceInteropWrapper.GetPartitionKeyRangesFromQuery3( this.serviceProvider, querySpecJsonString, partitionKeyRangesApiOptions, allParts, partsLengths, (uint)partitionKeyDefinition.Paths.Count, new IntPtr(bytePtr), (uint)buffer.Length, out serializedQueryExecutionInfoResultLength); if (errorCode == DISP_E_BUFFERTOOSMALL) { // Allocate on stack for smaller arrays, otherwise use heap. buffer = serializedQueryExecutionInfoResultLength < 4096 ? stackalloc byte[(int)serializedQueryExecutionInfoResultLength] : new byte[serializedQueryExecutionInfoResultLength]; fixed(byte *bytePtr2 = buffer) { errorCode = ServiceInteropWrapper.GetPartitionKeyRangesFromQuery3( this.serviceProvider, querySpecJsonString, partitionKeyRangesApiOptions, allParts, partsLengths, (uint)partitionKeyDefinition.Paths.Count, new IntPtr(bytePtr2), (uint)buffer.Length, out serializedQueryExecutionInfoResultLength); } } } } string serializedQueryExecutionInfo = Encoding.UTF8.GetString(buffer.Slice(0, (int)serializedQueryExecutionInfoResultLength)); Exception exception = Marshal.GetExceptionForHR((int)errorCode); if (exception != null) { QueryPartitionProviderException queryPartitionProviderException; if (string.IsNullOrEmpty(serializedQueryExecutionInfo)) { queryPartitionProviderException = new UnexpectedQueryPartitionProviderException( "Query service interop parsing hit an unexpected exception", exception); } else { queryPartitionProviderException = new ExpectedQueryPartitionProviderException( serializedQueryExecutionInfo, exception); } return(TryCatch <PartitionedQueryExecutionInfoInternal> .FromException( queryPartitionProviderException)); } PartitionedQueryExecutionInfoInternal queryInfoInternal = JsonConvert.DeserializeObject <PartitionedQueryExecutionInfoInternal>( serializedQueryExecutionInfo, new JsonSerializerSettings { DateParseHandling = DateParseHandling.None, MaxDepth = 64, // https://github.com/advisories/GHSA-5crp-9r3c-p9vr }); return(TryCatch <PartitionedQueryExecutionInfoInternal> .FromResult(queryInfoInternal)); }
internal TryCatch <PartitionedQueryExecutionInfoInternal> TryGetPartitionedQueryExecutionInfoInternal( SqlQuerySpec querySpec, PartitionKeyDefinition partitionKeyDefinition, bool requireFormattableOrderByQuery, bool isContinuationExpected, bool allowNonValueAggregateQuery, bool hasLogicalPartitionKey) { if (querySpec == null || partitionKeyDefinition == null) { return(TryCatch <PartitionedQueryExecutionInfoInternal> .FromResult(DefaultInfoInternal)); } string queryText = JsonConvert.SerializeObject(querySpec); List <string> paths = new List <string>(partitionKeyDefinition.Paths); List <string[]> pathParts = new List <string[]>(); paths.ForEach(path => { pathParts.Add(PathParser.GetPathParts(path).ToArray()); }); string[] allParts = pathParts.SelectMany(parts => parts).ToArray(); uint[] partsLengths = pathParts.Select(parts => (uint)parts.Length).ToArray(); PartitionKind partitionKind = partitionKeyDefinition.Kind; this.Initialize(); byte[] buffer = new byte[InitialBufferSize]; uint errorCode; uint serializedQueryExecutionInfoResultLength; unsafe { fixed(byte *bytePtr = buffer) { errorCode = ServiceInteropWrapper.GetPartitionKeyRangesFromQuery( this.serviceProvider, queryText, requireFormattableOrderByQuery, isContinuationExpected, allowNonValueAggregateQuery, hasLogicalPartitionKey, allParts, partsLengths, (uint)partitionKeyDefinition.Paths.Count, partitionKind, new IntPtr(bytePtr), (uint)buffer.Length, out serializedQueryExecutionInfoResultLength); if (errorCode == DISP_E_BUFFERTOOSMALL) { buffer = new byte[serializedQueryExecutionInfoResultLength]; fixed(byte *bytePtr2 = buffer) { errorCode = ServiceInteropWrapper.GetPartitionKeyRangesFromQuery( this.serviceProvider, queryText, requireFormattableOrderByQuery, isContinuationExpected, allowNonValueAggregateQuery, hasLogicalPartitionKey, // has logical partition key allParts, partsLengths, (uint)partitionKeyDefinition.Paths.Count, partitionKind, new IntPtr(bytePtr2), (uint)buffer.Length, out serializedQueryExecutionInfoResultLength); } } } } string serializedQueryExecutionInfo = Encoding.UTF8.GetString(buffer, 0, (int)serializedQueryExecutionInfoResultLength); Exception exception = Marshal.GetExceptionForHR((int)errorCode); if (exception != null) { QueryPartitionProviderException queryPartitionProviderException; if (string.IsNullOrEmpty(serializedQueryExecutionInfo)) { queryPartitionProviderException = new UnexpectedQueryPartitionProviderException( "Query service interop parsing hit an unexpected exception", exception); } else { queryPartitionProviderException = new ExpectedQueryPartitionProviderException( serializedQueryExecutionInfo, exception); } return(TryCatch <PartitionedQueryExecutionInfoInternal> .FromException( queryPartitionProviderException)); } PartitionedQueryExecutionInfoInternal queryInfoInternal = JsonConvert.DeserializeObject <PartitionedQueryExecutionInfoInternal>( serializedQueryExecutionInfo, new JsonSerializerSettings { DateParseHandling = DateParseHandling.None }); return(TryCatch <PartitionedQueryExecutionInfoInternal> .FromResult(queryInfoInternal)); }
public override CosmosException Visit(ExpectedQueryPartitionProviderException expectedQueryPartitionProviderException) { return(new BadRequestException( $"{nameof(BadRequestException)} due to {nameof(ExpectedQueryPartitionProviderException)}", expectedQueryPartitionProviderException)); }
public abstract TResult Visit(ExpectedQueryPartitionProviderException expectedQueryPartitionProviderException);
public override CosmosException Visit(ExpectedQueryPartitionProviderException expectedQueryPartitionProviderException) => CosmosExceptionFactory.CreateBadRequestException( message: expectedQueryPartitionProviderException.Message, stackTrace: expectedQueryPartitionProviderException.StackTrace, innerException: expectedQueryPartitionProviderException);
internal TryCatch <PartitionedQueryExecutionInfoInternal> TryGetPartitionedQueryExecutionInfoInternal( SqlQuerySpec querySpec, PartitionKeyDefinition partitionKeyDefinition, bool requireFormattableOrderByQuery, bool isContinuationExpected, bool allowNonValueAggregateQuery, bool hasLogicalPartitionKey) { if (querySpec == null || partitionKeyDefinition == null) { return(TryCatch <PartitionedQueryExecutionInfoInternal> .FromResult(DefaultInfoInternal)); } string queryText = JsonConvert.SerializeObject(querySpec); List <string> paths = new List <string>(partitionKeyDefinition.Paths); List <IReadOnlyList <string> > pathPartsList = new List <IReadOnlyList <string> >(paths.Count); uint[] partsLengths = new uint[paths.Count]; int allPartsLength = 0; for (int i = 0; i < paths.Count; i++) { IReadOnlyList <string> pathParts = PathParser.GetPathParts(paths[i]); partsLengths[i] = (uint)pathParts.Count; pathPartsList.Add(pathParts); allPartsLength += pathParts.Count; } string[] allParts = new string[allPartsLength]; int allPartsIndex = 0; foreach (IReadOnlyList <string> pathParts in pathPartsList) { foreach (string part in pathParts) { allParts[allPartsIndex++] = part; } } PartitionKind partitionKind = partitionKeyDefinition.Kind; this.Initialize(); Span <byte> buffer = stackalloc byte[QueryPartitionProvider.InitialBufferSize]; uint errorCode; uint serializedQueryExecutionInfoResultLength; unsafe { fixed(byte *bytePtr = buffer) { errorCode = ServiceInteropWrapper.GetPartitionKeyRangesFromQuery( this.serviceProvider, queryText, requireFormattableOrderByQuery, isContinuationExpected, allowNonValueAggregateQuery, hasLogicalPartitionKey, allParts, partsLengths, (uint)partitionKeyDefinition.Paths.Count, partitionKind, new IntPtr(bytePtr), (uint)buffer.Length, out serializedQueryExecutionInfoResultLength); if (errorCode == DISP_E_BUFFERTOOSMALL) { // Allocate on stack for smaller arrays, otherwise use heap. buffer = serializedQueryExecutionInfoResultLength < 4096 ? stackalloc byte[(int)serializedQueryExecutionInfoResultLength] : new byte[serializedQueryExecutionInfoResultLength]; fixed(byte *bytePtr2 = buffer) { errorCode = ServiceInteropWrapper.GetPartitionKeyRangesFromQuery( this.serviceProvider, queryText, requireFormattableOrderByQuery, isContinuationExpected, allowNonValueAggregateQuery, hasLogicalPartitionKey, // has logical partition key allParts, partsLengths, (uint)partitionKeyDefinition.Paths.Count, partitionKind, new IntPtr(bytePtr2), (uint)buffer.Length, out serializedQueryExecutionInfoResultLength); } } } } string serializedQueryExecutionInfo = Encoding.UTF8.GetString(buffer.Slice(0, (int)serializedQueryExecutionInfoResultLength)); Exception exception = Marshal.GetExceptionForHR((int)errorCode); if (exception != null) { QueryPartitionProviderException queryPartitionProviderException; if (string.IsNullOrEmpty(serializedQueryExecutionInfo)) { queryPartitionProviderException = new UnexpectedQueryPartitionProviderException( "Query service interop parsing hit an unexpected exception", exception); } else { queryPartitionProviderException = new ExpectedQueryPartitionProviderException( serializedQueryExecutionInfo, exception); } return(TryCatch <PartitionedQueryExecutionInfoInternal> .FromException( queryPartitionProviderException)); } PartitionedQueryExecutionInfoInternal queryInfoInternal = JsonConvert.DeserializeObject <PartitionedQueryExecutionInfoInternal>( serializedQueryExecutionInfo, new JsonSerializerSettings { DateParseHandling = DateParseHandling.None }); return(TryCatch <PartitionedQueryExecutionInfoInternal> .FromResult(queryInfoInternal)); }