11import 'dart:async' ;
22import 'dart:io' ;
33
4- import 'package:flutter/foundation.dart' ;
54import 'package:flutter/material.dart' as material;
65import 'package:flutter/services.dart' show LogicalKeyboardKey;
76import 'package:file_selector/file_selector.dart' ;
87import 'package:querya_desktop/core/actions/sql_editor_actions.dart' ;
98import 'package:querya_desktop/core/actions/sql_editor_command_bridge.dart' ;
109import 'package:querya_desktop/core/database/mysql_service.dart' ;
10+ import 'package:querya_desktop/core/database/result_row_string_convert.dart' ;
1111import 'package:querya_desktop/core/layout/vertical_split_pane.dart' ;
1212import 'package:querya_desktop/core/storage/app_settings.dart' ;
1313import 'package:querya_desktop/core/storage/local_db.dart' ;
@@ -18,7 +18,6 @@ import 'package:querya_desktop/features/main_screen/query_editor_tab.dart';
1818import 'package:querya_desktop/features/main_screen/results_tab.dart' ;
1919import 'package:querya_desktop/features/main_screen/sql_editor_chrome.dart' ;
2020import 'package:querya_desktop/features/main_screen/sql_query_history_dialog.dart' ;
21- import 'package:querya_desktop/features/mysql/mysql_result_utils.dart' ;
2221import 'package:querya_desktop/shared/widgets/widgets.dart' ;
2322
2423/// Ad-hoc SQL editor + results for MySQL / MariaDB.
@@ -192,7 +191,8 @@ class _MysqlSqlWorkspaceState extends material.State<MysqlSqlWorkspace> {
192191 cols.add (c.name.isNotEmpty ? c.name : 'col_${cols .length }' );
193192 }
194193
195- final rawRows = < List <Object ?>> [];
194+ // Convert while streaming — no Object? matrix + isolate double-copy (#421).
195+ final outRows = < List <String >> [];
196196 var n = 0 ;
197197 final cap = _resultMaxRows;
198198 var truncated = false ;
@@ -201,17 +201,18 @@ class _MysqlSqlWorkspaceState extends material.State<MysqlSqlWorkspace> {
201201 truncated = true ;
202202 break ;
203203 }
204- rawRows.add (
205- List .generate (row.numOfColumns, (i) => row.colAt (i)),
204+ outRows.add (
205+ List .generate (
206+ row.numOfColumns,
207+ (i) => resultCellToDisplayString (row.colAt (i)),
208+ ),
206209 );
207210 n++ ;
211+ if (n % kResultStringConvertYieldEvery == 0 ) {
212+ await Future <void >.delayed (Duration .zero);
213+ }
208214 }
209215
210- final job = MysqlResultConvertJob (rowValues: rawRows);
211- final outRows = rawRows.length > 500
212- ? await compute (convertMysqlResultRowsToStrings, job)
213- : convertMysqlResultRowsToStrings (job);
214-
215216 int ? affected;
216217 if (cols.isEmpty && outRows.isEmpty) {
217218 affected = _affectedInt (rs.affectedRows);
0 commit comments