toddmeng-db commented on code in PR #3241:
URL: https://github.com/apache/arrow-adbc/pull/3241#discussion_r2261888507


##########
csharp/src/Drivers/Apache/Hive2/HiveServer2Statement.cs:
##########
@@ -739,81 +750,91 @@ protected virtual async Task<QueryResult> 
GetColumnsExtendedAsync(CancellationTo
             // For FK lookup, we need to pass in the current 
catalog/schema/table as the foreign table
             var fkResult = await 
GetCrossReferenceAsForeignTableAsync(cancellationToken);
 
-            // 2. Read all batches into memory
-            List<RecordBatch> columnsBatches;
-            int totalRows;
-            Schema columnsSchema;
-            StringArray? columnNames = null;
-            int colNameIndex = -1;
-
-            // Extract column data
-            using (var stream = columnsResult.Stream)
+            try
             {
-                colNameIndex = stream.Schema.GetFieldIndex("COLUMN_NAME");
-                if (colNameIndex < 0)
+                // 2. Read all batches into memory
+                List<RecordBatch> columnsBatches;
+                int totalRows;
+                Schema columnsSchema;
+                StringArray? columnNames = null;
+                int colNameIndex = -1;
+
+                // Extract column data
+                using (var stream = columnsResult.Stream)
                 {
-                    // TODO: Add log or throw
-                    return columnsResult; // Can't match without column names
-                }
+                    colNameIndex = stream.Schema.GetFieldIndex("COLUMN_NAME");
+                    if (colNameIndex < 0)
+                    {
+                        // TODO: Add log or throw
+                        return columnsResult; // Can't match without column 
names
+                    }
 
-                var batchResult = await ReadAllBatchesAsync(stream, 
cancellationToken);
-                columnsBatches = batchResult.Batches;
-                columnsSchema = batchResult.Schema;
-                totalRows = batchResult.TotalRows;
+                    var batchResult = await ReadAllBatchesAsync(stream, 
cancellationToken);
+                    columnsBatches = batchResult.Batches;
+                    columnsSchema = batchResult.Schema;
+                    totalRows = batchResult.TotalRows;
 
-                if (columnsBatches.Count == 0)
-                {
-                    // Return empty result with complete schema
-                    return CreateEmptyExtendedColumnsResult(columnsSchema);
+                    if (columnsBatches.Count == 0)
+                    {
+                        // Return empty result with complete schema
+                        return CreateEmptyExtendedColumnsResult(columnsSchema);
+                    }
+
+                    // Create column names array from all batches using 
ArrayDataConcatenator.Concatenate
+                    List<ArrayData> columnNameArrayDataList = 
columnsBatches.Select(batch =>
+                        batch.Column(colNameIndex).Data).ToList();
+                    ArrayData? concatenatedColumnNames = 
ArrayDataConcatenator.Concatenate(columnNameArrayDataList);
+                    columnNames = 
(StringArray)ArrowArrayFactory.BuildArray(concatenatedColumnNames!);
                 }
 
-                // Create column names array from all batches using 
ArrayDataConcatenator.Concatenate
-                List<ArrayData> columnNameArrayDataList = 
columnsBatches.Select(batch =>
-                    batch.Column(colNameIndex).Data).ToList();
-                ArrayData? concatenatedColumnNames = 
ArrayDataConcatenator.Concatenate(columnNameArrayDataList);
-                columnNames = 
(StringArray)ArrowArrayFactory.BuildArray(concatenatedColumnNames!);
-            }
+                // 3. Create combined schema and prepare data
+                var allFields = new List<Field>(columnsSchema.FieldsList);
+                var combinedData = new List<IArrowArray>();
 
-            // 3. Create combined schema and prepare data
-            var allFields = new List<Field>(columnsSchema.FieldsList);
-            var combinedData = new List<IArrowArray>();
+                // 4. Add all columns data by combining all batches
+                for (int colIdx = 0; colIdx < columnsSchema.FieldsList.Count; 
colIdx++)
+                {
+                    if (columnsBatches.Count == 0)
+                        continue;
 
-            // 4. Add all columns data by combining all batches
-            for (int colIdx = 0; colIdx < columnsSchema.FieldsList.Count; 
colIdx++)
-            {
-                if (columnsBatches.Count == 0)
-                    continue;
+                    var field = columnsSchema.GetFieldByIndex(colIdx);
 
-                var field = columnsSchema.GetFieldByIndex(colIdx);
+                    // Collect arrays for this column from all batches
+                    var columnArrays = new List<IArrowArray>();
+                    foreach (var batch in columnsBatches)
+                    {
+                        columnArrays.Add(batch.Column(colIdx));
+                    }
 
-                // Collect arrays for this column from all batches
-                var columnArrays = new List<IArrowArray>();
-                foreach (var batch in columnsBatches)
-                {
-                    columnArrays.Add(batch.Column(colIdx));
+                    List<ArrayData> arrayDataList = columnArrays.Select(arr => 
arr.Data).ToList();
+                    ArrayData? concatenatedData = 
ArrayDataConcatenator.Concatenate(arrayDataList);
+                    IArrowArray array = 
ArrowArrayFactory.BuildArray(concatenatedData);
+                    combinedData.Add(array);
                 }
 
-                List<ArrayData> arrayDataList = columnArrays.Select(arr => 
arr.Data).ToList();
-                ArrayData? concatenatedData = 
ArrayDataConcatenator.Concatenate(arrayDataList);
-                IArrowArray array = 
ArrowArrayFactory.BuildArray(concatenatedData);
-                combinedData.Add(array);
-            }
-
-            // 5. Process PK and FK data using helper methods with selected 
fields
-            await ProcessRelationshipDataSafe(pkResult, PrimaryKeyPrefix, 
"COLUMN_NAME",
-                PrimaryKeyFields, // Selected PK fields
-                columnNames, totalRows,
-                allFields, combinedData, cancellationToken);
+                // 5. Process PK and FK data using helper methods with 
selected fields
+                await ProcessRelationshipDataSafe(pkResult, PrimaryKeyPrefix, 
"COLUMN_NAME",
+                    PrimaryKeyFields, // Selected PK fields
+                    columnNames, totalRows,
+                    allFields, combinedData, cancellationToken);
 
-            await ProcessRelationshipDataSafe(fkResult, ForeignKeyPrefix, 
"FKCOLUMN_NAME",
-                ForeignKeyFields, // Selected FK fields
-                columnNames, totalRows,
-                allFields, combinedData, cancellationToken);
+                await ProcessRelationshipDataSafe(fkResult, ForeignKeyPrefix, 
"FKCOLUMN_NAME",
+                    ForeignKeyFields, // Selected FK fields
+                    columnNames, totalRows,
+                    allFields, combinedData, cancellationToken);
 
-            // 6. Return the combined result
-            var combinedSchema = new Schema(allFields, columnsSchema.Metadata);
+                // 6. Return the combined result
+                var combinedSchema = new Schema(allFields, 
columnsSchema.Metadata);
 
-            return new QueryResult(totalRows, new 
HiveServer2Connection.HiveInfoArrowStream(combinedSchema, combinedData));
+                return new QueryResult(totalRows, new 
HiveServer2Connection.HiveInfoArrowStream(combinedSchema, combinedData));
+            }
+            finally
+            {
+                // Dispose internal query results to ensure proper resource 
cleanup
+                columnsResult.Stream?.Dispose();

Review Comment:
   I wonder if we will consider awaiting on the results further down this 
function, though?



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: github-unsubscr...@arrow.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org

Reply via email to